Switch main documentation to English, German translation now in de.po (#287)

Armin Burgmeier 2010-08-22 15:13:17 +02:00
parent 3390e0b3bc
commit df1abcd978
568 changed files with 40290 additions and 46965 deletions

View File

@ -37,10 +37,11 @@ intermediate
*.pyc
docs/online
docs/chm
docs/sdk-en
docs/sdk-de
docs/sdk/content.xml
docs/*.mo
docs/doku.pot
docs/Functions.txt
# Visual studio files
deps/

View File

@ -1,6 +1,6 @@
# Notable targets:
# all (default): German and English onlinedocs
# online-de: only German onlinedocs, which can be partially updated
# online-en: only English onlinedocs, which can be partially updated
# Enwickler.chm: the German offline doc
# use with make Entwickler.chm HHC = /path/to/hhc
@ -33,7 +33,7 @@ xmlfiles := $(sort $(shell find sdk -name '.*' -prune -o -name 'content.xml' -pr
htmlfiles := $(addsuffix .html, $(basename $(xmlfiles)))
# The translated files and directories
sdk-en-dirs := $(subst sdk, sdk-en, $(sdk-dirs))
sdk-de-dirs := $(subst sdk, sdk-de, $(sdk-dirs))
# For openclonk.org
online-sdk-files := $(foreach lang, en de, $(addprefix online/$(lang)/, $(htmlfiles) sdk/content.html))
@ -43,13 +43,13 @@ online-extra-files := $(foreach lang, en de, $(addprefix online/$(lang)/, $(extr
# For Entwickler.chm
chm-dirs := $(foreach lang, en de, $(addprefix chm/$(lang)/, . $(sdk-dirs) images))
.PHONY: all online-de chm install check clean
.PHONY: all online-en chm install check clean
all: $(online-dirs) $(sdk-en-dirs) $(online-extra-files) $(online-sdk-files)
all: $(online-dirs) $(sdk-de-dirs) $(online-extra-files) $(online-sdk-files)
online-de: $(addprefix online/de/, $(sdk-dirs) images $(htmlfiles) sdk/content.html $(extra-files))
online-en: $(addprefix online/en/, $(sdk-dirs) images $(htmlfiles) sdk/content.html $(extra-files))
chm: $(chm-dirs) chm/de/Entwickler.chm chm/en/Developer.chm
chm: $(chm-dirs) chm/en/Developer.chm chm/de/Entwickler.chm
install: all
$(MKDIR_P) $(prefix)
@ -60,22 +60,22 @@ check:
clean:
rm -f *.mo Entwickler.chm Developer.chm doku.pot
rm -rf online sdk-en chm
rm -rf online sdk-de chm
chm/de/Output.hhp chm/de/Output.hhk chm/en/Output.hhp chm/en/Output.hhk: sdk/content.xml
chm/en/Output.hhp chm/en/Output.hhk chm/de/Output.hhp chm/de/Output.hhk: sdk/content.xml
#update timestamp
touch $@
sdk/content.xml: $(xmlfiles) chm/de/. chm/en/. build_chm_files.py experimental.py \
sdk/content.xml.in Template.hhk Template.en.hhk Template.hhp Template.en.hhp en.mo
sdk/content.xml: $(xmlfiles) chm/en/. chm/de/. build_chm_files.py experimental.py \
sdk/content.xml.in Template.hhk Template.de.hhk Template.hhp Template.de.hhp de.mo
@echo generate chm files
@python build_chm_files.py $(xmlfiles)
$(sdk-en-dirs) $(online-dirs) $(chm-dirs):
$(sdk-de-dirs) $(online-dirs) $(chm-dirs):
mkdir -p $@
doku.pot: $(xmlfiles) extra-strings.xml xml2po.py clonk.py
doku.pot: $(xmlfiles) extra-strings.xml sdk/content.xml.in xml2po.py clonk.py
@echo extract strings to $@
@python xml2po.py -e -m clonk -o $@ $(xmlfiles) extra-strings.xml
@python xml2po.py -e -m clonk -o $@ $(xmlfiles) extra-strings.xml sdk/content.xml.in
%.po: doku.pot
@echo update $@
@ -85,9 +85,9 @@ doku.pot: $(xmlfiles) extra-strings.xml xml2po.py clonk.py
@echo compile $@
@msgfmt --statistics -o $@ $<
sdk-en/%.xml: sdk/%.xml en.mo xml2po.py clonk.py
sdk-de/%.xml: sdk/%.xml de.mo xml2po.py clonk.py
@echo generate $@
@python xml2po.py -e -m clonk -t en.mo -o $@ $<
@python xml2po.py -e -m clonk -t de.mo -o $@ $<
define run-xslt
@echo generate $@
@ -95,14 +95,14 @@ define run-xslt
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)
chm/de/Output.hhc: stylesheet=hhc.xsl
online/en/sdk/%.html: sdk/%.xml $(stylesheet) ; $(run-xslt)
online/de/sdk/%.html: sdk-de/%.xml $(stylesheet) ; $(run-xslt)
chm/en/sdk/%.html: sdk/%.xml $(stylesheet) ; $(run-xslt)
chm/de/sdk/%.html: sdk-de/%.xml $(stylesheet) ; $(run-xslt)
chm/en/Output.hhc: stylesheet=hhc.xsl
chm/de/Output.hhc: sdk/content.xml hhc.xsl ; $(run-xslt)
chm/en/Output.hhc: sdk-en/content.xml hhc.xsl ; $(run-xslt)
chm/de/Output.hhc: stylesheet=hhc.xsl
chm/en/Output.hhc: sdk/content.xml hhc.xsl ; $(run-xslt)
chm/de/Output.hhc: sdk-de/content.xml hhc.xsl ; $(run-xslt)
$(filter online/en/%, $(online-extra-files)): online/en/%: %
$(CP) $< $@
@ -113,8 +113,7 @@ $(addprefix chm/en/, $(extra-files-chm)): chm/en/%: %
$(addprefix chm/de/, $(extra-files-chm)): chm/de/%: %
$(CP) $< $@
chm/de/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)" $<
chm/en/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)" $<
chm/de/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)" $<

View File

@ -21,8 +21,8 @@
<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="Name" value="Benannte Variablen">
<param name="Name" value="Benannte Variablen">
<param name="Local" value="sdk\script\NamedVar.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
@ -51,81 +51,81 @@
<param name="Local" value="sdk\definition\defcore.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Directives">
<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="Developer Mode">
<param name="Name" value="Clonk Developer Mode">
<param name="Name" value="Entwicklermodus">
<param name="Name" value="Clonk Entwicklermodus">
<param name="Local" value="sdk\index.html">
<param name="Name" value="The Engine in Developer Mode">
<param name="Name" value="Die Engine im Entwicklermodus">
<param name="Local" value="sdk\console.html">
<param name="Name" value="Command line options">
<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="The for loop">
<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="Dynamic Map Generator">
<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="Materials">
<param name="Name" value="Material Definitions">
<param name="Name" value="Material">
<param name="Name" value="Materialdefinitionen">
<param name="Local" value="sdk\material\index.html">
<param name="Name" value="Material Definitions (C4M)">
<param name="Name" value="Materialdefinitionen (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="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="Map Generator">
<param name="Name" value="Dynamic Map Generator">
<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="Object Definitions">
<param name="Name" value="Definitions">
<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="Object Categories">
<param name="Name" value="Object Categories">
<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="Objekt Scripts">
<param name="Name" value="Objekt Scripts">
<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="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="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="Particles">
<param name="Name" value="Particles">
<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="Procedures (ActMap)">
<param name="Name" value="Procedures">
<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">
@ -135,36 +135,36 @@
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Script">
<param name="Name" value="Scenario Scripts">
<param name="Name" value="Szenarioscripte">
<param name="Local" value="sdk\scenario\script.html">
<param name="Name" value="Object Scripts">
<param name="Name" value="Objektscripte">
<param name="Local" value="sdk\definition\script.html">
<param name="Name" value="C4Script Documentation">
<param name="Name" value="C4Script Dokumentation">
<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="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="Scenarios">
<param name="Name" value="Scenarios">
<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="Scenario Scripts">
<param name="Name" value="Scenario Scripts">
<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="Typechecking">
<param name="Name" value="Data Types">
<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="Variables">
<param name="Name" value="Named Variables">
<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">
@ -173,48 +173,48 @@
<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="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="Script players">
<param name="Name" value="Script players">
<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="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>
<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>

View File

@ -1,40 +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]
[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]

View File

@ -21,8 +21,8 @@
<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="Name" value="Named Variables">
<param name="Name" value="Named Variables">
<param name="Local" value="sdk\script\NamedVar.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
@ -51,81 +51,81 @@
<param name="Local" value="sdk\definition\defcore.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Direktiven">
<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="Entwicklermodus">
<param name="Name" value="Clonk Entwicklermodus">
<param name="Name" value="Developer Mode">
<param name="Name" value="Clonk Developer Mode">
<param name="Local" value="sdk\index.html">
<param name="Name" value="Die Engine im Entwicklermodus">
<param name="Name" value="The Engine in Developer Mode">
<param name="Local" value="sdk\console.html">
<param name="Name" value="Kommandozeilenparameter">
<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="Die For-Schleife">
<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="Der dynamische Kartengenerator">
<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="Material">
<param name="Name" value="Materialdefinitionen">
<param name="Name" value="Materials">
<param name="Name" value="Material Definitions">
<param name="Local" value="sdk\material\index.html">
<param name="Name" value="Materialdefinitionen (C4M)">
<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="Landschaftsgenerator">
<param name="Name" value="Der dynamische Kartengenerator">
<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="Kartengenerator">
<param name="Name" value="Der dynamische Kartengenerator">
<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="Objektdefinitionen">
<param name="Name" value="Objektdefinitionen">
<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="Objektkategorien">
<param name="Name" value="Objektkategorien">
<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="Objektscripte">
<param name="Name" value="Objektscripte">
<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="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="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="Partikel">
<param name="Name" value="Partikel">
<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="Procedure (ActMap)">
<param name="Name" value="Prozeduren">
<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">
@ -135,36 +135,36 @@
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Script">
<param name="Name" value="Szenarioscripte">
<param name="Name" value="Scenario Scripts">
<param name="Local" value="sdk\scenario\script.html">
<param name="Name" value="Objektscripte">
<param name="Name" value="Object Scripts">
<param name="Local" value="sdk\definition\script.html">
<param name="Name" value="C4Script Dokumentation">
<param name="Name" value="C4Script Documentation">
<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="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="Szenarien">
<param name="Name" value="Szenarien">
<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="Szenarioscripte">
<param name="Name" value="Szenarioscripte">
<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="Typpr&uuml;fung">
<param name="Name" value="Datentypen">
<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="Variablen">
<param name="Name" value="Benannte Variablen">
<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">
@ -173,48 +173,48 @@
<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="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="Scriptspieler">
<param name="Name" value="Scriptspieler">
<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="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>
<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

@ -1,40 +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]
[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]

View File

@ -215,7 +215,7 @@ if 0:
reader.parse(filename)
experimental.Result()
mofile = open("en.mo", "rb")
mofile = open("de.mo", "rb")
gt = gettext.GNUTranslations(mofile)
#_ = lambda s: s.encode('iso-8859-1')
@ -242,8 +242,8 @@ for line in fin:
f.close()
fin.close()
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 f, fin in ((file("chm/en/Output.hhp", "w"), file("Template.hhp", "r")),
(file("chm/de/Output.hhp", "w"), file("Template.de.hhp", "r"))):
for line in fin:
if line.find("[INFOTYPES]") != -1:
for filename in sys.argv[1:]:
@ -253,8 +253,8 @@ for f, fin in ((file("chm/de/Output.hhp", "w"), file("Template.hhp", "r")),
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 f, fin in ((file("chm/en/Output.hhk", "w"), file("Template.hhk", "r")),
(file("chm/de/Output.hhk", "w"), file("Template.de.hhk", "r"))):
for line in fin:
if line.find("</UL>") != -1:
for title, filename in parser.files.iteritems():

View File

@ -39,13 +39,16 @@
<!ELEMENT caption (#PCDATA)>
<!ATTLIST caption
id ID #IMPLIED>
<!ELEMENT row (#PCDATA | col)*>
<!ELEMENT row (#PCDATA | col | literal_col)*>
<!ATTLIST row
id ID #IMPLIED>
<!ELEMENT rowh (#PCDATA | col)*>
<!ELEMENT rowh (#PCDATA | col | literal_col)*>
<!ELEMENT col (#PCDATA | %text;)*>
<!ATTLIST col
colspan CDATA #IMPLIED>
<!ELEMENT literal_col (#PCDATA | %text;)*>
<!ATTLIST literal_col
colspan CDATA #IMPLIED>
<!ELEMENT bitmask (#PCDATA)>
<!ELEMENT ul (#PCDATA | li)*>

View File

@ -15,7 +15,7 @@ class clonkXmlMode:
return ['code']
_stuff = ['funclink', 'version', 'extversion', 'rtype', 'author', 'date',
'type', 'code', 'code/i', 'code/b', 'name', 'func/title']
'type', 'code', 'code/i', 'code/b', 'name', 'func/title', 'literal_col']
def _delete_stuff(self, node, msg):
#print "looking at " + str(node.name)
if node and node.children:

View File

@ -335,7 +335,7 @@
<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">
<xsl:for-each select="col|literal_col">
<td><xsl:apply-templates select="@colspan|node()"/></td>
</xsl:for-each>
</tr>
@ -372,7 +372,7 @@
<xsl:template match="rowh">
<thead><tr>
<xsl:apply-templates select="@id" />
<xsl:for-each select="col">
<xsl:for-each select="col|literal_col">
<th><xsl:apply-templates select="@colspan|node()"/></th>
</xsl:for-each>
</tr></thead>

19183
docs/de.po 100644

File diff suppressed because it is too large Load Diff

29845
docs/en.po

File diff suppressed because it is too large Load Diff

View File

@ -2,5 +2,5 @@
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<doc>
<!-- Zum markieren von veralteten Funktionen im Inhaltsverzeichnis -->
<text>erweitert</text>
</doc>
<text>extended</text>
</doc>

View File

@ -1,76 +1,130 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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 (Windows) 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>
<title>Command Line Parameters</title>
<h id="cmdline">Command Line Parameters</h>
<text>The installation directory of Clonk contains various executable program files. Usually programs are started with a double click or from a start menu without additional parameters. When starting programs from a command line shell or script file (batch file), additional command line parameters can be specified.</text>
<part>
<h id="Clonk">Clonk.exe (Windows) clonk (Linux) Clonk (Mac)</h>
<text>The engine. The main program of the game. Without startup parameters, the game starts in fullscreen (player mode) and shows the startup menu. The following command line parameters are recognized:</text>
<dl>
<dt id="console">/console</dt>
<dd>
<text>Starts in console mode (also called developer mode or windowed mode). In console mode, scenarios can be edited and saved. The game will also start in console mode if a scenario (*.c4s) and no /fullscreen is specified.</text>
</dd>
<dt id="fullscreen">/fullscreen</dt>
<dd>
<text>Starts in fullscreen mode (also called player mode). If no scenario and no direct join adress is given, the startup menu is shown.</text>
</dd>
<dt id="config">/config:Filename</dt>
<dd>
<text>Loads and saves the configuration from the specified file instead of the default configuration file or the Windows registry.</text>
</dd>
<dt id="record">/record</dt>
<dd>
<text>The round is recorded.</text>
</dd>
<dt id="network">/network, /nonetwork</dt>
<dd>
<text>Activates or deactivates network mode.</text>
</dd>
<dt id="signup">/signup, /nosignup</dt>
<dd>
<text>Activates or deactivates online signup of the game as public internet game. This value is stored in the configuration.</text>
</dd>
<dd>
<text>/signup implies /network. /nosignup implies /noleague.</text>
</dd>
<dt id="league">/league, /noleague</dt>
<dd>
<text>Activates or deactivates online signup of the game as league game. This value is stored in the configuration.</text>
</dd>
<dd>
<text>/league implies /network and /signup.</text>
</dd>
<dt id="runtimejoin">/runtimejoin, /noruntimejoin</dt>
<dd>
<text>Activates or deactivates runtime join. This setting will be stored in the configuration.</text>
</dd>
<dt id="regjoinonly">/regjoinonly</dt>
<dd>
<text>Prevents any unregistered client from joining games hosted on this computer (<em>always</em> active in dedicated server engines).</text>
</dd>
<dt id="ncrw">/faircrew, /trainedcrew</dt>
<dd>
<text>Activates or deactivates fair crew. With fair crew, all clonks start with the same physical properties. With trained crew, clonks start with their individually stored, trained physical value. This value is stored in the configuration.</text>
</dd>
<dt id="lobby">/lobby[:time]</dt>
<dd>
<text>Activates the lobby before a network game is started. The lobby is the waiting- and chat screen. The lobby is on by default for all network games. Implies /network. If you specify a time (e.g. /lobby:120) the lobby will start with a countdown, automatically launching the game after (in this case) 120 seconds.</text>
</dd>
<dt id="observe">/observe</dt>
<dd>
<text>For network games: The client joins as observer (without players). Implies /network.</text>
</dd>
<dt id="Join">/join:&lt;<em>Address</em>&gt;</dt>
<dd>
<text>Searches for a network game on the specified address and joins it. No local scenario (*.c4s) should be specified. Implies /network.</text>
</dd>
<dt id="clonkp">clonk://&lt;<em>Address</em>&gt;/</dt>
<dd>
<text>Same as /join if an address is specified. If "update" is specified as an address, this will cause the engine to perform an update check instead.</text>
</dd>
<dt id="tcpport">/tcpport:&lt;<em>Port Number</em>&gt;</dt>
<dd>
<text>Sets the TCP port number for client connections in network games. This setting will be stored in the configuration. If -1 is specified, TCP is disabled and all connections are created using UDP.</text>
</dd>
<dt id="udpport">/udpport:&lt;<em>Port Number</em>&gt;</dt>
<dd>
<text>Sets the UDP port number for client connections in network games. This setting will be stored in the configuration. If -1 is specified, UDP is disabled and all connections are created using TCP.</text>
</dd>
<dt id="pass">/pass:&lt;<em>Password</em>&gt;</dt>
<dd>
<text>For network hosts: sets the join password to the specified value. If &lt;<em>Password</em>&gt; is left empty, no password is set.</text>
</dd>
<dt id="comment">/comment:&lt;<em>Comment</em>&gt;</dt>
<dd>
<text>For network hosts: sets the network game comment. This setting will be stored in the configuration.</text>
</dd>
<dt id="update">/update</dt>
<dd>
<text>Performs an update check at program start.</text>
</dd>
<dt id="recdump">/recdump:&lt;<em>Filename</em>&gt;</dt>
<dd>
<text>Only for replay of recorded games: Before the replay is started, all replay data (player controls) are dumped into a file called &lt;<em>File name</em>&gt; in the Clonk folder. If the file name extension is .txt, the controls will be dumped in text mode, otherwise binary. The replay file must be specified separately as a scenario file (e.g. Clonk.exe Records.c4f\Record001.c4s /recdump:CtrlRec.txt).</text>
</dd>
<dt id="startup">/startup:&lt;<em>Name</em>&gt;</dt>
<dd>
<text>Only for fullscreen startup menu: Instead of the main menu, one of the submenus is shown directly. Possible values for &lt;<em>Name</em>&gt; are <em>main</em> (Main menu), <em>scen</em> (Scenario selection), <em>netscen</em> (Scenario selection for a new network game), <em>net</em> (Network/Internet game list), <em>options</em> (Options menu) und <em>plrsel</em> (Player selection).</text>
</dd>
<dt id="c4s">*.c4s</dt>
<dd>
<text>If a scenario is specified (File extension .c4s), it will be started directly.</text>
</dd>
<dt id="c4d">*.c4d</dt>
<dd>
<text>If the started scenario does not specify any required definitions (File extension .c4d), and no definitions are supplied in the registry, definitions can be specified via command line.</text>
</dd>
<dt id="c4p">*.c4p</dt>
<dd>
<text>Player files (File extension .c4p) can be specified in the command line. If no player files are given, the registry values are used. By specifying a non-existant player (like doesnotexist.c4p), the game can be started without players (e.g. in order to just edit landscapes in developer mode).</text>
</dd>
<dt id="c4u">*.c4u</dt>
<dd>
<text>If the filename of an update package (extension .c4u) is passed to the engine, then the program will attempt to apply that update package to the local installation.</text>
</dd>
</dl>
</part>
<part>
<h id="Editor">Editor.exe (Windows only)</h>
<text>The editor for accessing group files and developing of game extensions. The editor does not have any command line parameters.</text>
</part>
<part>
<h id="C4Group">c4group.exe (Windows) c4group (Linux) c4group (Mac)</h>
<text>This command line program is used for processing group files. A list of command line options is available by starting the program without parameters via command line (<i>not</i> by double clicking).</text>
</part>
<author>Sven2</author><date>2007-02</date>
</doc>

View File

@ -1,64 +1,36 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>The engine in developer mode</title>
<h id="DieEngineimEntwicklermodus">Engine</h>
<part>
<text>In developer mode, scenarios may be edited in running or paused game mode and saved to disk afterwards.</text>
<h id="Bearbeitungsmodus">Edit mode:</h>
<text><img src="../images/icon_em_play.gif" width="16" height="16"/> Play: Mouse control works only for the first viewport of a player who has mouse control activated. Keyboard control for all players is accepted in any viewport.</text>
<text><img src="../images/icon_em_edit.gif" width="16" height="16"/>Edit objects: Objects may be edited and moved around by mouse. Additional editing options are available by right-clicking on objects in a viewport.In order to create new objects, object definitions (c4d) may be drag &amp; dropped from the menu system or an Explorer window into a viewport of the engine. Objects may be put into other objects by dragging them onto the target object while holding down the control key.</text>
<text><img src="../images/icon_em_brush.gif" width="16" height="16"/>Draw: Landscape drawing tools may be configured by right-clicking in a viewport and selecting 'tools'.</text>
<h id="Landschaftsmodus">Landscape mode:</h>
<text><img src="../images/icon_em_dynamic.gif" width="16" height="16"/>Dynamic: Scenarios that have a dynamic landscape generally have a very small file size. But since a new landscape is generated whenever the scenario is started, landscape settings of scenarios edited in developer mode should not contain any random values. Dynamic landscapes cannot be edited. It is not possible to revert static or exact landscapes to dynamic mode.</text>
<text><img src="../images/icon_em_static.gif" width="16" height="16"/>Static: Medium file-size. The landscape is zoomed down and saved in coarse blocks only, and will be regenerated rougly when loaded. Static landscapes should be edited in paused game mode, because any runtime changes (e.g. digging clonks, explosions, moved liquids) will be visible while editing, but they won't be saved. This can lead to an inaccurate map.</text>
<text><img src="../images/icon_em_exact.gif" width="16" height="16"/>Exact: Extremely high level of detail and file size: The landscape is saved as-is at pixel level of detail.</text>
<h id="Landschaftswerkzeug">Landscape editing tool:</h>
<text><img src="../images/icon_em_brush.gif" width="16" height="16"/>Brush (size adjustable).</text>
<text><img src="../images/icon_em_line.gif" width="16" height="16"/>Line (size adjustable).</text>
<text><img src="../images/icon_em_rect.gif" width="16" height="16"/>Filled rect.</text>
<text><img src="../images/icon_em_eyedrop.gif" width="16" height="16"/>Eye-dropper: Acquires material, texture and background (sky or tunnel) of the landscape at the place you click on in the viewport. Textures can be determined in static landscape mode only.</text>
<text><img src="../images/icon_em_fill.gif" width="16" height="16"/>Material-filler (strength adjustable; works in exact maps only).</text>
<h id="Materialhintergrund">Material background:</h>
<text><img src="../images/icon_em_sky.gif" width="16" height="16"/> If dug free or removed by explosions, sky will appear behind the drawn material.</text>
<text><img src="../images/icon_em_tunnel.gif" width="16" height="16"/> If dug free or removed by explosions, tunnel will appear behind the drawn material.</text>
<h id="Tastaturbelegung">Keyboard shortcuts:</h>
<text>In active viewport:</text>
<text>Scroll lock: Enable/disable scroll bars in current viewport</text>
<text>Break/Pause: Pause or continue game</text>
<text>Space: Cycle through editing modes</text>
<text>Ctrl-W, Ctrl-M, Ctrl-T, Ctrl-I, +/- : Change settings in landscape drawing mode</text>
</part>
<author>Sven2</author><date>2002-04</date>
<author>matthes</author><date>2004-06</date>
</doc>

View File

@ -2,7 +2,7 @@
<!-- <!DOCTYPE doc SYSTEM "../clonk.dtd"> -->
<?xml-stylesheet type="text/xsl" href="../clonk.xsl"?>
<doc>
<title>Inhalt</title>
<title>Contents</title>
<script>
<![CDATA[
// Javascript aus mwForum, www.mwforum.org
@ -52,28 +52,28 @@
]]>
</script>
<h>Inhalt</h>
<h>Contents</h>
<part>
<ul class="contents">
<li>
<img id='tgl1' class='collapseimg' src='../images/bullet_folder_open.gif' alt='-' onclick='tb(1)' ondblclick='ta(1)' />
Entwicklermodus
Developer mode
<ul id='brn1'>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="index.html">Einleitung</a></li>
<a href="index.html">Introduction</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="console.html">Engine</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="cmdline.html">Kommandozeilenparameter</a></li>
<a href="cmdline.html">Command Line Parameters</a></li>
</ul>
</li>
<li>
<img id='tgl2' class='collapseimg' src='../images/bullet_folder_open.gif' alt='-' onclick='tb(2)' ondblclick='ta(2)' />
<a href="files.html">Spieldaten</a>
<a href="files.html">Game content</a>
<ul id='brn2'>
<li>
<img id='tgl3' class='collapseimg' src='../images/bullet_folder.gif' alt='-' onclick='tb(3)' ondblclick='ta(3)' />
<a href="definition/index.html">Objektdefinitionen</a>
<a href="definition/index.html">Object Definitions</a>
<ul id='brn3' class='invisi'>
<li>
<img id='tgl4' class='collapseimg' src='../images/bullet_folder.gif' alt='-' onclick='tb(4)' ondblclick='ta(4)' />
@ -88,7 +88,7 @@
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="definition/lineconnect.html">LineConnect</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="definition/cnat.html">CNAT - Contact Attatchment</a></li>
<a href="definition/cnat.html">CNAT - Contact Attachment</a></li>
</ul>
</li>
<li>
@ -96,41 +96,41 @@
<a href="definition/actmap.html">ActMap</a>
<ul id='brn5' class='invisi'>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="definition/procedures.html">Prozeduren</a></li>
<a href="definition/procedures.html">Procedures</a></li>
</ul>
</li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="definition/script.html">Scripte</a></li>
<a href="definition/script.html">Scripts</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="particle/index.html">Partikel</a></li>
<a href="particle/index.html">Particles</a></li>
</ul>
</li>
<li>
<img id='tgl6' class='collapseimg' src='../images/bullet_folder.gif' alt='-' onclick='tb(6)' ondblclick='ta(6)' />
<a href="scenario/index.html">Szenarien</a>
<a href="scenario/index.html">Scenarios</a>
<ul id='brn6' class='invisi'>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="scenario/scenario.html">Szenario</a></li>
<a href="scenario/scenario.html">Scenario</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="scenario/MapCreatorS2.html">Kartengenerator</a></li>
<a href="scenario/MapCreatorS2.html">Map Generator</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="scenario/script.html">Scripte</a></li>
<a href="scenario/script.html">Scripts</a></li>
</ul>
</li>
<li>
<img id='tgl7' class='collapseimg' src='../images/bullet_folder.gif' alt='-' onclick='tb(7)' ondblclick='ta(7)' />
<a href="material/index.html">Materialien</a>
<a href="material/index.html">Materials</a>
<ul id='brn7' class='invisi'>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="material/c4m.html">Definition</a></li>
<a href="material/c4m.html">Definitions</a></li>
</ul>
</li>
<li>
<img id='tgl8' class='collapseimg' src='../images/bullet_folder.gif' alt='-' onclick='tb(8)' ondblclick='ta(8)' />
Sprachanpassung
Internationalization
<ul id='brn8' class='invisi'>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="lang.html">Sprachanpassung</a></li>
<a href="lang.html">Internationalization</a></li>
</ul>
</li>
</ul>
@ -140,9 +140,9 @@
<a href="script/index.html">Script</a>
<ul id='brn9'>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="script/Funcs.html">Funktionen</a></li>
<a href="script/Funcs.html">Functions</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="script/FuncCall.html">Funktionsaufruf</a></li>
<a href="script/FuncCall.html">Function Call</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="script/Strict.html">#strict</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
@ -152,15 +152,15 @@
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="script/for.html">for</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="script/NamedVar.html">Benannte Variablen</a></li>
<a href="script/NamedVar.html">Named Variables</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="script/operatoren.html">Operatoren</a></li>
<a href="script/operatoren.html">Operators</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="script/Typechecks.html">Datentypen</a></li>
<a href="script/Typechecks.html">Data Types</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="script/Effects.html">Effekte</a></li>
<a href="script/Effects.html">Effects</a></li>
<li><img src='../images/bullet_sheet.gif' alt='-' />
<a href="script/ScriptPlayers.html">Scriptspieler</a></li>
<a href="script/ScriptPlayers.html">Script Players</a></li>
<!-- Insert Functions here -->
</ul>
</li>

View File

@ -1,156 +1,141 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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. Parameter sind letzte Animationsphase, letztes ActionTarget und ActionTarget2.</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>
<row>
<col>Animation</col>
<col>Zeichenfolge</col>
<col>Ab OC. Bestimmt die auszuführende Animation im Mesh des Objekts. Funktioniert nur wenn ein solches vorhanden ist. Wenn gegeben werden Facet, FacetBase, FacetTopFace und FacetTargetStretch ignoriert. Die Length mal Delay verschiedenen Animationsphasen werden linear auf die Länge der Animation abgebildet. Wenn Delay 0 ist wird nur Length verwendet und die Animation spielt nicht automatisch. Siehe <emlink href="definition/animations.html">Animationen</emlink> für weitergehende Dokumentation zu Animationen.</col>
</row>
</table>
</text>
<author>Sven2</author><date>April 2002</date>
<author>matthes</author><date>Juni 2004</date>
<title>ActMap.txt</title>
<h id="ActMap">ActMap</h>
<text>The ActMap.txt-component describes possible actions (i.e., activities like walking and scaling for clonks; or opening/closing doors of buildings), of an object. The animation phases of each activity are placed as adjacent images in the Graphics.png (and/or Overlay.png/Graphics.bmp). These animations are being referenced using image coordinates in the ActMap.txt. Animations may be started by script (see <emlink href="script/fn/SetAction.html">SetAction</emlink>) or directly by the engine. Some activities - especially those of clonks and animals - use an engine-intrenal <emlink href="definition/procedures.html">procedure</emlink>, which controls the movement of an object while such an activity is set.</text>
<text>
<table>
<caption id="BeliebigvieleSektionenAction">Any number of sections [Action]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<literal_col>Name</literal_col>
<col>String (max. 30 chars)</col>
<col>Name of the activity. See <emlink href="script/fn/SetAction.html">SetAction</emlink>().</col>
</row>
<row>
<literal_col>Procedure</literal_col>
<col>String (max. 30 chars)</col>
<col>Internal standard procedure. See <emlink href="definition/procedures.html">Procedures</emlink>.</col>
</row>
<row>
<literal_col>Directions</literal_col>
<col>Integer</col>
<col>Number of animation directions. Animation directions are arranged vertically in Graphics.png.</col>
</row>
<row>
<literal_col>FlipDir</literal_col>
<col>Integer</col>
<col>If nonzero, this value specifies the first animation phase that is produced by mirroring one of the previous animation directions. If this value is 1, graphics of direction 1 (DIR_Right) will be drawn as a horizontally mirrored graphics of direction 0 (DIR_Left) (see clonks). If it is 7, any directions n &gt;= 7 will be drawn using the mirrored graphics of directions 6 - n, i.e. higher direction values will be drawn using the mirrored graphics in reverse orders (cf. banner in the knights pack).</col>
</row>
<row>
<literal_col>Length</literal_col>
<col>Integer</col>
<col>Number of animation phases for this activity (arranged horizontally in Graphics.png)</col>
</row>
<row>
<literal_col>Reverse</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the animation phases will be shown in reverse order.</col>
</row>
<row>
<literal_col>Delay</literal_col>
<col>Integer</col>
<col>Time difference in frames (ticks) between two animation phases.</col>
</row>
<row>
<literal_col>Attach</literal_col>
<col>Integer</col>
<col>Attachment to surfaces: <emlink href="definition/cnat.html">CNAT Value</emlink>, e.g. value 8 if the object should attach to the floor like a walking clonk does; or 4 for attachment to the ceiling like a hangling clonk. Only evaluated if the procedure is NONE.</col>
</row>
<row>
<literal_col>Facet</literal_col>
<col>6 integers</col>
<col>Animation graphics: Target rectangle from Graphics.png relative to upper left corner of unrotated object shape.</col>
</row>
<row>
<literal_col>FacetBase</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the default facet (i.e., the facet shown if the object has no action) will be drawn behind the action facet.</col>
</row>
<row>
<literal_col>FacetTopFace</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the TopFace (see <emlink href="definition/defcore.html">DefCore.txt</emlink>) will be drawn using the animated facet.</col>
</row>
<row>
<literal_col>FacetTargetStretch</literal_col>
<col>Boolean</col>
<col>0 or 1. If 1, the graphics will be stretched down towards the upper border of the ActionTarget. Used e.g. for the elevator line.</col>
</row>
<row>
<literal_col>NextAction</literal_col>
<col>String (max. 30 chars)</col>
<col>Next action being set after the current one has reached its end.</col>
</row>
<row>
<literal_col>NoOtherAction</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, no other action can be set after this one (used e.g. for death or destruction).</col>
</row>
<row>
<literal_col>StartCall</literal_col>
<col>String (max. 30 chars)</col>
<col>Object script function which is called when the activity is started.</col>
</row>
<row>
<literal_col>EndCall</literal_col>
<col>String (max. 30 chars)</col>
<col>Called when an activity reaches the end of its animation.</col>
</row>
<row>
<literal_col>PhaseCall</literal_col>
<col>String (max. 30 chars)</col>
<col>Called whenever the animation phase changes.</col>
</row>
<row>
<literal_col>AbortCall</literal_col>
<col>String (max. 30 chars)</col>
<col>Called if an activity is being replaced by another before its regular end; i.e. not by a transition through NextAction. Parameters are the previous animation phase, previous ActionTarget and previous ActionTarget2.</col>
</row>
<row>
<literal_col>InLiquidAction</literal_col>
<col>String (max. 30 chars)</col>
<col>Action to be set if the object plunges into water.</col>
</row>
<row>
<literal_col>Sound</literal_col>
<col>String (max. 30 chars)</col>
<col>Permanent sound being played during this action.</col>
</row>
<row>
<literal_col>ObjectDisabled</literal_col>
<col>Integer</col>
<col>0 or 1. Restricted control of the object during this action.</col>
</row>
<row>
<literal_col>DigFree</literal_col>
<col>Integer</col>
<col>Area that is dug free during this action. If 1, the area covered by the object shape is freed (like the elevator case); otherwise, the value is taken as the radius of a circular area (like a digging Clonk).</col>
</row>
<row>
<literal_col>EnergyUsage</literal_col>
<col>Integer</col>
<col>Energy required for this action. Normal machines should use about 500.</col>
</row>
<row>
<literal_col>Animation</literal_col>
<col>String</col>
<col>Since OC. Specifies the animation to be played in the mesh of the object. Works only if the object uses a mesh for its graphics. If given all of Facet, FacetBase, FacetTopFace and FacetTargetStretch are ignored. The Length times Delay possible animation phases are mapped linearly on the animation length. If Delay equals 0 only Length will be used and the animation does not play automatically. See <emlink href="definition/animations.html">Animationen</emlink> for further documentation on animations.</col>
</row>
</table>
</text>
<author>Sven2</author><date>2002-04</date>
<author>matthes</author><date>2004-06</date>
</doc>

View File

@ -1,72 +1,70 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE doc
SYSTEM '../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Animationen</title>
<h id="Animations">Animationen</h>
<part>
<text>Eine der ab OC neuen Möglichkeiten, 3D-Modelle als Objektgrafik zu verwenden (siehe <emlink href="definition/meshes.html">Meshes</emlink>), ist es, einzelne Animationen miteinander zu kombinieren. So kann zum Beispiel der Clonk leicht während des Laufens oder Springens einen Gegenstand werfen oder flüssig Übergänge zwischen einzelnen Animationen darstellen.</text>
<text>Jedes Objekt hat dazu einen sogenannten "Animation-Stack". Dieser besteht aus beliebig vielen Einträgen mit eindeutiger Priorität, die im folgenden Slots genannt werden. Slots mit höherer Priorität überschreiben Slots mit niedriger Priorität, dies gilt jedoch nur für Bones die von der Animation des höheren Slots überhaupt betroffen sind. Um obiges Beispiel aufzugreifen kann somit also die Werf-Animation eine höhere Priorität als der Lauf- oder Spring-Animation eingeräumt werden, so dass die Armbewegung der Werfanimation die der anderen Animation überschreibt. Da die Werfanimation aber keine Beinbewegung beschreibt wird diese vom Laufen oder Springen übernommen.</text>
<text>Bleibt noch zu klären, wie die Animationen in den einzelnen Slots zustande kommen. Ein Slot kann entweder eine einzelne Animation sein, oder eine Interpolation zwischen zwei anderen Animationen (von denen eine oder beide wieder Interpolationen zweier anderer Animationen sein können). Wird eine solche Interpolation verwendet, so kann zusätzlich eine Gewichtung angegeben werden, das heißt wie sehr die jeweils beiden Animationen zur Gesamtanimation beitragen. Eine Gewichtung von 0 bedeutet, dass nur die erste Animation beiträgt (als ob die zweite gar nicht vorhaden wäre), und eine Gewichtung von 1000 bedeutet, dass nur die zweite Animation beiträgt. Werte dazwischen bewirken einen Übergang zwischen den Animationen. Um erneut auf das Beispiel von oben zurückzukommen: Wenn der Clonk zum Zeitpunkt des Werfens steht, dann aber beginnt loszulaufen bevor die Wurfanimation fertig ist, so liegt es nahe, zu der Stehen-Animation noch eine Laufen-Animation hinzuzufügen, die mit der Zeit immer mehr gewichtet wird bis die Gewichtung 1000 erreicht und der Übergang zum Laufen somit beendet ist. Da die Wurf-Animation in einem anderen Slot stattfindet ist sie von dem Übergang nicht betroffen und wird ganz normal abgespielt.</text>
<text>Folgende Grafik veranschaulicht das Konzept anhand des gewählten Beispiels:</text>
<text><img src="../../images/AnimationStack.png" width="600" height="188"/></text>
<text>Zuerst werden die Animationen "Walk" und "Stand" kombiniert. Das Ergebnis dieser Kombination wird als Animation für Slot 5 verwendet, die einzelne Animation "Throw" hingegen für Slot 10. Da 10 größer als 5 ist überschreibt Throw das Ergebnis der Kombination in Slot 5 (für von "Throw" betroffene Bones). Das Ergebnis davon wird dann schlussendlich auf dem Bildschirm angezeigt.</text>
<h id="Play">Abspielen von Animationen</h>
<text>Der Animation Stack kann durch Scriptfunktionen beeinflusst, das heißt Animationen hinzugefügt oder gelöscht werden. Dazu wird jedem Beitrag (im folgenden Knoten genannt) zu einer Animation - das heißt jede Animation selbst, aber auch jede Kombination von zwei anderen Animationen - eine eindeutige Nummer, die Animationsnummer, zugeordnet. Beim Einfügen einer Animation entstehen nun ein oder zwei neue Knoten (ein Animationsknoten wenn der betreffende Slot leer ist, oder ein Animations- und ein Kombinationsknoten wenn der betroffende Slot bereits Knoten enthält).</text>
<text>Beide Knotentypen haben unterschiedliche Eigenschaften, für Animationsknoten spielt die aktuelle Animationsposition eine Rolle und für Kombinationsknoten die aktuelle Gewichtung. Beide Werte müssen je nach Art der Animation mehr oder weniger oft geändert werden. Hierbei gibt es mehrere Möglichkeiten: Simple Animationen sollen einfach mit der Zeit fortlaufen, andere (zum Beispiel die Laufanimation des Clonks) hängen von der Geschwindigkeit oder der Richtung eines Objekts ab, von der Mausposition (Zielanimationen) oder von der Windgeschwindigkeit (Windrad).</text>
<text>Um sowohl einfache Animationen ohne viel Scriptaufwand abspielen zu können, zum anderen aber auch komplexe Kombinationen zu ermöglichen gibt es sogenannte Animations-Wertquellen (AVPs, von engl. Animation Value Provider). Sie legen fest, wie die gerade zu verwendende Animationsposition oder das Interpolationsgewicht zu bestimmen sind. An die Scriptfunktion <funclink>PlayAnimation</funclink>, die eine neue Animation startet, werden zwei solcher AVPs für Position und Gewicht übergeben. Mit <funclink>SetAnimationPosition</funclink> und <funclink>SetAnimationWeight</funclink> können die beiden im Nachhinein geändert werden.</text>
<text>Folgende AVPs stehen zur Auswahl:</text>
<text><table>
<caption id="AVP">Verfügbare Wertquellen</caption>
<rowh>
<col>Funktion</col>
<col>Kurzbeschreibung</col>
</rowh>
<row>
<col><funclink>Anim_Const</funclink></col>
<col>Ein vorher festgelegter konstanter Wert wird verwendet. Dies ist nützlich wenn sich der Wert nicht ändern soll, oder sich keiner der anderen AVPs eignet, wenn jeden Frame ein neuer AVP diesen Typs mit einem anderen Wert gesetzt wird.</col>
</row>
<row>
<col><funclink>Anim_Linear</funclink></col>
<col>Linear mit der Zeit zu- oder abnehmend. Auch dieser AVP kann verwendet werden wenn sich sonst keiner anbietet, aber es zu aufwendig ist die neue Position jeden Frame auszurechnen. In dem Fall kann die Animation bis zur nächsten genauen Positionsbestimmung fortlaufen.</col>
</row>
<row>
<col><funclink>Anim_X</funclink></col>
<col>Linear mit der X-Position. Bewegung des Objekts nach Links spielt die Animation in die entgegengesetzte Richtung ab. Kann verwendet werden falls die Animation eines Objekts synchron zu seiner horizontalen Bewegung stattfinden soll.</col>
</row>
<row>
<col><funclink>Anim_Y</funclink></col>
<col>Linear mit der Y-Position. Bewegung des Objekts nach Oben spielt die Animation in die entgegengesetzte Richtung ab. Kann verwendet werden falls die Animation eines Objekts synchron zu seiner vertikalen Bewegung stattfinden soll.</col>
</row>
<row>
<col><funclink>Anim_AbsX</funclink></col>
<col>Linear mit der X-Position, allerdings spielt die Animation immer in die gleiche Richtung, egal ob sich das Objekt nach rechts oder nach links bewegt.</col>
</row>
<row>
<col><funclink>Anim_AbsY</funclink></col>
<col>Linear mit der Y-Position, allerdings spielt die Animation immer in die gleiche Richtung, egal ob sich das Objekt nach oben oder nach unten bewegt.</col>
</row>
<row>
<col><funclink>Anim_XDir</funclink></col>
<col>Proportional zur X-Geschwindigkeit eines Objekts.</col>
</row>
<row>
<col><funclink>Anim_YDir</funclink></col>
<col>Proportional zur Y-Geschwindigkeit eines Objekts.</col>
</row>
<row>
<col><funclink>Anim_Action</funclink></col>
<col>Proportional zur Phase der aktuell ausgeführten Aktivität.</col>
</row>
<!-- TODO: There are some more, but I am not convinced they are actually useful -->
</table></text>
<text>Für Beispiele zu den einzelnen AVPs siehe die Dokumentation zu den entsprechenden Scriptfunktion.</text>
<h id="ActMap">Animationen der ActMap</h>
<text>Einzelnen Aktivitäten in der <emlink href="definition/actmap.html">ActMap</emlink> kann eine Animation zugeordnet werden. Diese Animationen werden immer in Slot 0 abgespielt. Das bedeutet unter anderem, dass in Slot 0 höchstens eine Animation abgespielt wird, es gibt keine Kombinationen. Es ist auch nicht möglich, diese durch Scriptfunktionen wie <funclink>StopAnimation</funclink> oder <funclink>SetAnimationPosition</funclink> zu beeinflussen. Es ist jedoch sehr wohl möglich, Eigenschaften von ActMap-Animationen abzufragen, zum Beispiel mit <funclink>GetAnimationPosition</funclink>. Es existieren auch negative Slotnummern, sodass man eigene Animationen eine geringere Priorität als ActMap-Animationen zuweisen kann.</text>
</part>
<author>Clonk-Karl</author><date>Januar 2010</date>
<title>Animations</title>
<h id="Animations">Animations</h>
<part>
<text>One of the new possibilities in OC to use 3D models as an object's graphics (see <emlink href="definition/meshes.html">meshes</emlink>) is to combine individual animations. This way the Clonk can easily throw an object while running or jumping, or there can be smooth transitions between single animations.</text>
<text>Every object has a so-called animation stack. It consists of an arbitrary number of entries with a unique priority, called slots. Slots with higher priority overwrite slots with lower priority, however this is only true for bones affected by one of the animations in the higher priority slot. To expand on the example above the throwing animation should be assigned a higher priority then the walking animation so that the movement of the Clonk's arms is taken from the throwing, not from the walking or jumping animation. However since there is no leg movement in the throwing animation the clonk continues to run or jump, respectively.</text>
<text>What still needs to be clarified is how the animations in the individual slots are determined. A slot can either be a single animation or an interpolation between two other animations (one or both of which can again be interpolations of two animations). If such an interpolation is used then additionally a weight value can be set which specifies how much the two animations contribute to the final interpolated animation. A weight of 0 means that only the first animation contributes (as if the second one would not be present) whereas a weight of 1000 means that only the second animation contributes. Values inbetween lead to a transition between the two animations. Again referring to the above example: If the Clonk is standing at the time it throws but then starts to move before the throwing animation has finished then it is suggestive to add a walking animation to the standing animation which gets more and more weight over time until the weight has reached the value of 1000 and the transition to walking has finished. Since the throwing animation is played in a different slot it is not affected by the transition and is played normally.</text>
<text>The following picture illustrates the concept based on the chosen example:</text>
<text><img src="../../images/AnimationStack.png" height="188" width="600" /></text>
<text>First the two animations "Walk" and "Stand" are combined. The result of this combination is used as the animation for slot 5 whereas the single "Throw" animation is used for Slot 10. Since 10 is greater than 5 Throw overwrites the result of the combination in slot 5 (for bones affected by "Throw"). The result of that will be eventually displayed on the screen.</text>
<h id="Play">Animation playing</h>
<text>The animation stack can be influenced by script functions, i.e. animations can be added or removed. For this purpose every contributes to an animation (called node), that is every animation itself but also every combination node of two other animations, is assigned a unique number, called the animation number. When inserting or removing an animation one or two new nodes are created (an animation node if the slot in question is empty or both an animation and a combination node if there are already nodes in the slot).</text>
<text>Both types of nodes have different properties. For animation nodes the current position of the animation is relevant, and for combination nodes it is the current weight. Both values need to be changed more or less frequently depending on the kind of animation. There are multiple possibilities: Simple animations should just play with time, others (such as the walking animation of the Clonk) could depend on the velocity of the object, the current mouse position (aiming animations) or the wind velocity (windmill).</text>
<text>To both allow playing simple animations without much scripting effort but also keep the possibility to make rather complex combinations the concept of so-called animation value providers (AVPs) has been introduced. They specify how to determine the current animation position or the interpolation weight. Two such AVPs need to be given as parameters to the script function which starts a new animation, <funclink>PlayAnimation</funclink>, one for the animation position and one for its weight. <funclink>SetAnimationPosition</funclink> and <funclink>SetAnimationWeight</funclink> can be used to modify the AVPs later.</text>
<text>The following AVPs are available:</text>
<text>
<table>
<caption id="AVP">Available value providers</caption>
<rowh>
<col>Function</col>
<col>Brief description</col>
</rowh>
<row>
<col><funclink>Anim_Const</funclink></col>
<col>A previously defined constant value is used. This is useful if the value should not change, or if none of the other AVPs is appropriate in which case each frame a new AVP of this type with a different value can be set.</col>
</row>
<row>
<col><funclink>Anim_Linear</funclink></col>
<col>Increasing or decreasing linearly with time. This AVP can also be used if none of the others is appropriate but when it is too expensitve to compute the new position each frame. In that case the animation can be played with constant speed until the next exact position is computed.</col>
</row>
<row>
<col><funclink>Anim_X</funclink></col>
<col>Linear with X position. When the object moves to the left the animation plays backwards. Can be used if the animation of an object should be synchronized to its horizontal movement.</col>
</row>
<row>
<col><funclink>Anim_Y</funclink></col>
<col>Linear with Y position. When the object moves upwards the animation plays backwards. Can be used if the animation of an object should be synchronized to its vertical movement.</col>
</row>
<row>
<col><funclink>Anim_AbsX</funclink></col>
<col>Linear with X position. However, the animation is always played in the same direction, not taking into account whether the object moves left or right.</col>
</row>
<row>
<col><funclink>Anim_AbsY</funclink></col>
<col>Linear with Y position. However, the animation is always played in the same direction, not taking into account whether the object moves upwards or downwards.</col>
</row>
<row>
<col><funclink>Anim_XDir</funclink></col>
<col>Proportional to the horizontal speed of the object.</col>
</row>
<row>
<col><funclink>Anim_YDir</funclink></col>
<col>Proportional to the vertical speed of the object.</col>
</row>
<row>
<col><funclink>Anim_Action</funclink></col>
<col>Proportional to the phase of the currently executed action.</col>
</row>
</table>
</text>
<text>For examples to the individual AVPs see the documentation of their respective script functions.</text>
<h id="ActMap">ActMap animations</h>
<text>Individual activities specified in the <emlink href="definition/actmap.html">ActMap</emlink> can be assigned an animation. These animations are always played in slot 0. This means that, amongst others, at most one animation can be played in slot 0, animations cannot be combined. Also it is not possible to modify these animations via script functions such as <funclink>StopAnimation</funclink> or <funclink>SetAnimationPosition</funclink>. However it is allowed to query properties of ActMap animations, such as with <funclink>GetAnimationPosition</funclink>. Negative slot numbers do also exist so that own animations can be assigned a smaller priority than ActMap animations.</text>
</part>
<author>Clonk-Karl</author><date>2010-01</date>
</doc>

View File

@ -1,95 +1,98 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE doc
SYSTEM '../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Objektkategorien</title>
<h id="Objektkategorien">Objektkategorien</h>
<part>
<text>Die Kategorie eines Objekts legt Teile seines Verhaltens fest. Sie wird für eine Definition durch den Eintrag Category in der DefCore.txt festgelegt. Dabei können verschiedene Kategorien mit einem binären oder-Operator kombiniert werden.</text>
<text>
<table>
<rowh><col>Kategorie</col><col>Beschreibung</col></rowh>
<row>
<col>C4D_StaticBack</col>
<col>Unbewegliches Hintergrundobjekt.</col>
</row>
<row>
<col>C4D_Structure</col>
<col>Gebäude.</col>
</row>
<row>
<col>C4D_Vehicle</col>
<col>Fahrzeug.</col>
</row>
<row>
<col>C4D_Living</col>
<col>Lebewesen.</col>
</row>
<row>
<col>C4D_Object</col>
<col>Gegenstand.</col>
</row>
<row>
<col>C4D_Goal</col>
<col>Spielziel.</col>
</row>
<row>
<col>C4D_Environment</col>
<col>Umweltsteuerungsobjekt.</col>
</row>
<row>
<col>C4D_TradeLiving</col>
<col>Verkaufbares Lebewesen.</col>
</row>
<row>
<col>C4D_Magic</col>
<col>Zauber.</col>
</row>
<row>
<col></col>
<col>Reserviert; wird intern benutzt.</col>
</row>
<row>
<col>C4D_Rule</col>
<col>Spielregel.</col>
</row>
<row>
<col>C4D_Background</col>
<col>Objekt ist hinter der Landschaft.</col>
</row>
<row>
<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>C4D_MouseSelect</col>
<col>Objekt mit der Maus anwählbar, MouseSelection(int player)-Callback im Objekt.</col>
</row>
<row>
<col>C4D_Foreground</col>
<col>Objekt ist im Vordergrund, also vor globalen Partikeln.</col>
</row>
<row>
<col>C4D_MouseIgnore</col>
<col>Objekt ist nicht mit der Maus anwählbar.</col>
</row>
<row>
<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>
</table>
</text>
<h id="Beispiel">Beispiel</h>
<text>
<examples>
<example>
<code>Category=C4D_StaticBack|C4D_Rule</code>
<text>Kategorie für eine Regel.</text>
</example>
</examples>
</text>
</part>
<author>Sven2</author><date>Mai 2006</date>
<author>Newton &amp; Günther</author><date>Januar 2005</date>
<title>Object Categories</title>
<h id="Objektkategorien">Object Categories</h>
<part>
<text>An object's category specifies parts of its behavior. For a definition it is set by the Category entry in the DefCore.txt file. Multiple categories can be combined using the binary OR operator.</text>
<text>
<table>
<rowh>
<col>Category</col>
<col>Description</col>
</rowh>
<row>
<col>C4D_StaticBack</col>
<col>Immovable background object.</col>
</row>
<row>
<col>C4D_Structure</col>
<col>Building.</col>
</row>
<row>
<col>C4D_Vehicle</col>
<col>Vehicle.</col>
</row>
<row>
<col>C4D_Living</col>
<col>A living being.</col>
</row>
<row>
<col>C4D_Object</col>
<col>A smaller item.</col>
</row>
<row>
<col>C4D_Goal</col>
<col>Game goal.</col>
</row>
<row>
<col>C4D_Environment</col>
<col>Environmental control object.</col>
</row>
<row>
<col>C4D_TradeLiving</col>
<col>A living being that can be sold at the home base.</col>
</row>
<row>
<col>C4D_Magic</col>
<col>A magic spell.</col>
</row>
<row>
<col></col>
<col>Reserved, used internally.</col>
</row>
<row>
<col>C4D_Rule</col>
<col>Rule control object.</col>
</row>
<row>
<col>C4D_Background</col>
<col>Object is behind the landscape.</col>
</row>
<row>
<col>C4D_Parallax</col>
<col>Object moves parallax according to Local 0 and 1. For more information see <funclink>C4D_Parallax</funclink>.</col>
</row>
<row>
<col>C4D_MouseSelect</col>
<col>Object can be clicked with the mouse, causing a MouseSelection(int player) callback in the object.</col>
</row>
<row>
<col>C4D_Foreground</col>
<col>Object is always in the foreground, even before global particles.</col>
</row>
<row>
<col>C4D_MouseIgnore</col>
<col>Object cannot be selected with the mouse.</col>
</row>
<row>
<col>C4D_IgnoreFoW</col>
<col>Object is drawn above fog of war. Useful for creating status displays or gui elements using objects. From CR.</col>
</row>
</table>
</text>
<h id="Beispiel">Example</h>
<text>
<examples>
<example>
<code>Category=C4D_StaticBack|C4D_Rule</code>
<text>Category for a rule.</text>
</example>
</examples>
</text>
</part>
<author>Sven2</author><date>2006-05</date>
<author>Newton &amp; Günther</author><date>2005-01</date>
</doc>

View File

@ -1,38 +1,65 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>CNAT - Contact Attachment</title>
<h id="CNAT">CNAT - Contact Attachment</h>
<text>In multiple places the engine uses ContactAttachment values (a bitmask) to manage the orientation of objects and processes. For example, a vertex of an object can have the CNAT bit <em>left</em>. If that object has <emlink href="definition/defcore.html">ContactCalls</emlink> activated, the engine calls on every contact of that vertex with the landscape the object script function <em>ContactLeft</em>. CNAT values are composed of the following bits:</text>
<text>
<table>
<rowh>
<col>Bit</col>
<col>Value</col>
<col>CNAT</col>
<col>Description</col>
</rowh>
<row>
<col>0</col>
<col>1</col>
<col>CNAT_Left</col>
<col>Direction: Left</col>
</row>
<row>
<col>1</col>
<col>2</col>
<col>CNAT_Right</col>
<col>Direction: Right</col>
</row>
<row>
<col>2</col>
<col>4</col>
<col>CNAT_Top</col>
<col>Direction: Up</col>
</row>
<row>
<col>3</col>
<col>8</col>
<col>CNAT_Bottom</col>
<col>Direction: Down</col>
</row>
<row>
<col>4</col>
<col>16</col>
<col>CNAT_Center</col>
<col>Direction: Center (not for attachment)</col>
</row>
<row>
<col>5</col>
<col>32</col>
<col>CNAT_MultiAttach</col>
<col>Special flag: new attachment behaviour for objects with the same direction value at several vertices (from version 4.95.4).</col>
</row>
<row>
<col>6</col>
<col>64</col>
<col>CNAT_NoCollision</col>
<col>Extra flag: non-colliding vertex (from version 4.95.4)</col>
</row>
<bitmask>CNAT</bitmask>
</table>
</text>
<author>Sven2</author><date>2002-04</date>
<author>Newton &amp; Günther</author><date>2005-01</date>
<author>Matthes</author><date>2005-08</date>
</doc>

View File

@ -1,255 +1,529 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>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>
<title>DefCore.txt</title>
<h id="DefCoretxt">DefCore</h>
<part>
<text>The component DefCore.txt defines the basic characteristics of an object. This includes the object category (whether it is a building or a living being), graphics, entrance and collection areas, value, mass, and so on. Here also the object id is defined which is used to identify the object type in script calls or other components. Every object definition must have a unique object id. Also see <emlink href="definition/index.html#ObjektundEntwicklerIdentifikation">object and developer identification</emlink>.</text>
<text>
<table>
<caption id="SektionDefCore">Section [DefCore]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<literal_col>id</literal_col>
<col>definition id</col>
<col>Id of the object.</col>
</row>
<row>
<literal_col>Version</literal_col>
<col>3 Integers</col>
<col>Minimal engine version required by the object. Should be always the current engine version at the time of the last change.</col>
</row>
<row>
<literal_col>Name</literal_col>
<col>String (max. 30 chars)</col>
<col>Name of the object. Will be overwritten by the applicable one in the Names.txt.</col>
</row>
<row>
<literal_col>Category</literal_col>
<col>Integer</col>
<col>Category of the object. Also see <emlink href="definition/category.html">object categories</emlink>.</col>
</row>
<row>
<literal_col>MaxUserSelect</literal_col>
<col>Integer</col>
<col>Maximal allowed count when placed in the menu system.</col>
</row>
<row>
<literal_col>TimerCall</literal_col>
<col>String (max. 30 chars)</col>
<col>Regularly called timer function in the <emlink href="definition/script.html">object script</emlink>.</col>
</row>
<row>
<literal_col>Timer</literal_col>
<col>Integer</col>
<col>Time interval between TimerCalls in frames. Default is 35.</col>
</row>
<row>
<literal_col>ContactCalls</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, Contactcalls are called in the object script.</col>
</row>
<row>
<literal_col>Width</literal_col>
<col>Integer</col>
<col>Width of the object.</col>
</row>
<row>
<literal_col>Height</literal_col>
<col>Integer</col>
<col>Height of the object.</col>
</row>
<row>
<literal_col>Offset</literal_col>
<col>2 Integer</col>
<col>Coordinate offset of the top left corner to the object center.</col>
</row>
<row>
<literal_col>Value</literal_col>
<col>Integer</col>
<col>Value of the object in money points.</col>
</row>
<row>
<literal_col>Mass</literal_col>
<col>Integer</col>
<col>Weight of the object. Rock 10, clonk 50, hut 1000, castle 10000.</col>
</row>
<row>
<literal_col>Components</literal_col>
<col>ID list</col>
<col>Elements from which the object is composed. Uncompleted or half grown objects will only have the respective fraction of the components.</col>
</row>
<row>
<literal_col>SolidMask</literal_col>
<col>6 integers</col>
<col>Solid areas of the object. Target rectangle from the source graphics onto the object.</col>
</row>
<row>
<literal_col>TopFace</literal_col>
<col>6 integers</col>
<col>Covering layer of the object graphics. Target rectangle from the source graphics onto the object.</col>
</row>
<row>
<literal_col>Picture</literal_col>
<col>4 integers</col>
<col>Representative image of the object. Rectangle from the source graphics.</col>
</row>
<row>
<literal_col>Vertices</literal_col>
<col>Integer</col>
<col>Number of vertices of the object. 1 to 30.</col>
</row>
<row>
<literal_col>VertexX</literal_col>
<col>up to 30 integers</col>
<col>List of horizontal vertex coordinates of the object. See <emlink href="definition/vertices.html">vertices</emlink>.</col>
</row>
<row>
<literal_col>VertexY</literal_col>
<col>up to 30 integers</col>
<col>List of vertical coordinates of the object vertices.</col>
</row>
<row>
<literal_col>VertexCNAT</literal_col>
<col>up to 30 integers</col>
<col>List of direction indicators of the object vertices. See <emlink href="definition/cnat.html">CNAT</emlink>.</col>
</row>
<row>
<literal_col>VertexFriction</literal_col>
<col>up to 30 integers</col>
<col>List of friction values of the object vertices, each 1 to 100.</col>
</row>
<row>
<literal_col>Entrance</literal_col>
<col>4 integers</col>
<col>Position of the entrance region relative to the object centre.</col>
</row>
<row>
<literal_col>Collection</literal_col>
<col>4 integers</col>
<col>Position of the intake region relative to the object centre.</col>
</row>
<row>
<literal_col>FireTop</literal_col>
<col>Integer</col>
<col>Flame distance to the object's bottom line.</col>
</row>
<row>
<literal_col>Placement</literal_col>
<col>Integer</col>
<col>Placement: 0 land surface, 1 in liquid, 2 in mid-air.</col>
</row>
<row>
<literal_col>Exclusive</literal_col>
<col>Integer</col>
<col>0 or 1. Determines whether the object blocks objects behind it.</col>
</row>
<row>
<literal_col>ContactIncinerate</literal_col>
<col>Integer</col>
<col>Probability of incineration by contact: 0 none, or 1 (high) to 5 (low).</col>
</row>
<row>
<literal_col>BlastIncinerate</literal_col>
<col>Integer</col>
<col>Incineration by explosion: 0 none, otherwise the damage level of incineration.</col>
</row>
<row>
<literal_col>BurnTo</literal_col>
<col>C4ID</col>
<col>Definition change upon incineration.</col>
</row>
<row>
<literal_col>Base</literal_col>
<col>Integer</col>
<col>0 or 1. Determines whether the building can be a home base.</col>
</row>
<row>
<literal_col>Line</literal_col>
<col>Integer</col>
<col>1 energy line, 2 source pipe, 3 drain pipe.</col>
</row>
<row>
<literal_col>LineConnect</literal_col>
<col>Integer</col>
<col>Connection behaviour for lines. See <emlink href="definition/lineconnect.html">LineConnect</emlink>.</col>
</row>
<row>
<literal_col>Prey</literal_col>
<col>Integer</col>
<col>0 or 1. Determines whether the object is prey for certain animals.</col>
</row>
<row>
<literal_col>Edible</literal_col>
<col>Integer</col>
<col>0 or 1. Determines whether the object is edible.</col>
</row>
<row>
<literal_col>CrewMember</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the object is added to the player's crew upon purchase. Objects created using CreateObject have to be added to a player's crew manually using <emlink href="script/fn/MakeCrewMember">MakeCrewMember</emlink>.</col>
</row>
<row>
<literal_col>Growth</literal_col>
<col>Integer</col>
<col>Growth of the object. Trees 1-4, living beings 15.</col>
</row>
<row>
<literal_col>Rebuy</literal_col>
<col>Integer</col>
<col>0 or 1. Determines whether the object can be bought back after selling it.</col>
</row>
<row>
<literal_col>Construction</literal_col>
<col>Integer</col>
<col>0 or 1. Determines whether the object can be built.</col>
</row>
<row>
<literal_col>ConstructTo</literal_col>
<col>C4ID</col>
<col>Definition change upon building.</col>
</row>
<row>
<literal_col>Grab</literal_col>
<col>Integer</col>
<col>0 no grabbing, 1 grab and push, 2 grab only.</col>
</row>
<row>
<literal_col>GrabPutGet</literal_col>
<col>Integer</col>
<col>Bit mask: bit 0 (value 1) putting possible, bit 1 (value 2) getting possible.</col>
</row>
<row>
<literal_col>Collectible</literal_col>
<col>Integer</col>
<col>0 or 1. Determines whether the object can be collected.</col>
</row>
<row>
<literal_col>Rotate</literal_col>
<col>Integer</col>
<col>0 no rotation, 1 full rotation, 2-360 limited rotation.</col>
</row>
<row>
<literal_col>Chop</literal_col>
<col>Integer</col>
<col>0 or 1. Determines whether the object can be chopped.</col>
</row>
<row>
<literal_col>Float</literal_col>
<col>Integer</col>
<col>Floatation in liquids: 0 no floatation, otherwise floatation height above the object center.</col>
</row>
<row>
<literal_col>ContainBlast</literal_col>
<col>Integer</col>
<col>0 or 1. Determines whether explosions in the object's contents affect other objects outside.</col>
</row>
<row>
<literal_col>ColorByOwner</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the specified sections of the object's graphcis are colored by the player color.</col>
</row>
<row>
<literal_col>ColorByMaterial</literal_col>
<col>String (max. 15)</col>
<col>The object is colored by the color of the specified material.</col>
</row>
<row>
<literal_col>HorizontalFix</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the object can only move vertically.</col>
</row>
<row>
<literal_col>BorderBound</literal_col>
<col>Integer</col>
<col>Bit mask: bit 0 (value 1) stop at the sides, bit 1 (value 2) stop at the top, bit 2 (value 4) stop at the bottom.</col>
</row>
<row>
<literal_col>UprightAttach</literal_col>
<col>Integer</col>
<col>If not 0, the unrotated object attaches to solid areas (attachment directions 8-10).</col>
</row>
<row>
<literal_col>StretchGrowth</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the uncomplete object (see <emlink href="script/fn/GetCon.html">GetCon</emlink>) is scaled, not sliced from the bottom like a construction site.</col>
</row>
<row>
<literal_col>Basement</literal_col>
<col>Integer</col>
<col>0 no basement, 1 normal basement, other values reserved.</col>
</row>
<row>
<literal_col>NoBurnDecay</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the object does not decompose if burning.</col>
</row>
<row>
<literal_col>IncompleteActivity</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the object can have activities set even if it's not complete.</col>
</row>
<row>
<literal_col>Oversize</literal_col>
<col>Integer</col>
<col>0 or 1. The object can be scaled over 100% using DoCon.</col>
</row>
<row>
<literal_col>AttractLightning</literal_col>
<col>Integer</col>
<col>0 or 1. The object attracts lightning.</col>
</row>
<row>
<literal_col>Fragile</literal_col>
<col>Integer</col>
<col>0 or 1. The object should not be thrown.</col>
</row>
<row>
<literal_col>NoPushEnter</literal_col>
<col>Integer</col>
<col>0 or 1. The object can not be pushed into another object's entrance (e.g. elevator case).</col>
</row>
<row>
<literal_col>VehicleControl</literal_col>
<col>Integer</col>
<col>Bit mask: bit 0 (value 1) object can be controlled by grabbing from the outside and/or bit 1 (value 2) from the inside. With active VehicleControl, clonk orders (commands) are also passed to the grabbed object as ControlCommand calls and can be processed and/or overloaded by the controlled object's script. See <emlink href="definition/script.html#ControlFunktionen">Control-Funktionen</emlink>.</col>
</row>
<row>
<literal_col>Pathfinder</literal_col>
<col>Integer</col>
<col>1 - 10. Determines search depth of the pathfinder algorithm (default 1). Warning: higher values may slow down the game. By setting this value you can also enable non-CrewMember objects to use pathfinding when executing commands.</col>
</row>
<row>
<literal_col>NoComponentMass</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the object's contents is not added to the object's total mass. This can be used to prevent small container objects from turning into killer throwing items.</col>
</row>
<row>
<literal_col>NoStabilize</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the object will not straighten itself to 0° if within a certain upright range.</col>
</row>
<row>
<literal_col>ClosedContainer</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, clonks inside this object can not lighten the Fog of War outside.</col>
</row>
<row>
<literal_col>SilentCommands</literal_col>
<col>Integer</col>
<col>0 or 1. Can be used to prevent failure messages caused by failed commands.</col>
</row>
<row>
<literal_col>NoBurnDamage</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the object does not take damage when burning.</col>
</row>
<row>
<literal_col>TemporaryCrew</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the object is not stored in the permanent crew of a player.</col>
</row>
<row>
<literal_col>SmokeRate</literal_col>
<col>Integer</col>
<col>0 to 200: determines the amount of smoke caused by the burning object. 0 for no smoke, 100 is default. If other than 0, the object will always generate maximum smoke when traveling at high velocity (e.g. a fire arrow).</col>
</row>
<row>
<literal_col>BlitMode</literal_col>
<col>Integer</col>
<col>0 or 1. Value 1 for addtive drawing.</col>
</row>
<row>
<literal_col>NoBreath</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the object does not need oxygen, even if it's a living being.</col>
</row>
<row>
<literal_col>ConSizeOff</literal_col>
<col>Integer</col>
<col>Values grater than 0 are deducted from the top of necessary construction space.</col>
</row>
<row>
<literal_col>NoSell</literal_col>
<col>Integer</col>
<col>0 or 1. If 1 the object can not be sold.</col>
</row>
<row>
<literal_col>NoGet</literal_col>
<col>Integer</col>
<col>0 or 1. If 1 the object can not be taken from containers by a clonk.</col>
</row>
<row>
<literal_col>NoFight</literal_col>
<col>Integer</col>
<col>0 or 1. If 1 the object will never enter into a fight with other living beings.</col>
</row>
<row>
<literal_col>LiftTop</literal_col>
<col>Integer</col>
<col>If an object with Action procedure "<emlink href="definition/procedures.html">LIFT</emlink>" lifts its target to this value above object center the function LiftTop is called in the object script.</col>
</row>
<row>
<literal_col>RotatedEntrance</literal_col>
<col>Integer</col>
<col>0 entrance is open if the object is upright only; 1 entrance is always open; 2-360 entrance is open within the specified object rotation in degrees. From 4.95.4.</col>
</row>
<row>
<literal_col>MoveToRange</literal_col>
<col>Integer</col>
<col>Maximum range at which the waypoint of a movement command can be touched for a successful hit. Default value 5. From 4.95.4.</col>
</row>
<row>
<literal_col>NoTransferZones</literal_col>
<col>Integer</col>
<col>0 or 1. If 1 the object's pathfinding will ignore any transfer zones. From 4.95.4.</col>
</row>
<row>
<literal_col>AutoContextMenu</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the building's context menu will open automatically upon entry. From 4.9.7.7.</col>
</row>
</table>
</text>
<text>
<table>
<caption id="SektionPhysical">Section [Physical]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<literal_col>Energy</literal_col>
<col>Integer</col>
<col>0-100000. Maximum energy (electric or life).</col>
</row>
<row>
<literal_col>Breath</literal_col>
<col>Integer</col>
<col>0-100000. Maximum breath.</col>
</row>
<row>
<literal_col>Walk</literal_col>
<col>Integer</col>
<col>0-100000. Walking speed.</col>
</row>
<row>
<literal_col>Jump</literal_col>
<col>Integer</col>
<col>0-100000. Jump force.</col>
</row>
<row>
<literal_col>Scale</literal_col>
<col>Integer</col>
<col>0-100000. Scaling speed.</col>
</row>
<row>
<literal_col>Hangle</literal_col>
<col>Integer</col>
<col>0-100000. Hangling speed.</col>
</row>
<row>
<literal_col>Dig</literal_col>
<col>Integer</col>
<col>0-100000. Digging speed.</col>
</row>
<row>
<literal_col>Swim</literal_col>
<col>Integer</col>
<col>0-100000. Swimming speed.</col>
</row>
<row>
<literal_col>Throw</literal_col>
<col>Integer</col>
<col>0-100000. Throwing force.</col>
</row>
<row>
<literal_col>Push</literal_col>
<col>Integer</col>
<col>0-100000. Push power.</col>
</row>
<row>
<literal_col>Fight</literal_col>
<col>Integer</col>
<col>0-100000. Fight power.</col>
</row>
<row>
<literal_col>Magic</literal_col>
<col>Integer</col>
<col>0-100000. Maximal magic energy.</col>
</row>
<row>
<literal_col>Float</literal_col>
<col>Integer</col>
<col>0-100. Flight speed.</col>
</row>
<row>
<literal_col>CanScale</literal_col>
<col>Integer</col>
<col>0 or 1. Scale.</col>
</row>
<row>
<literal_col>CanHangle</literal_col>
<col>Integer</col>
<col>0 or 1. Brachiation.</col>
</row>
<row>
<literal_col>CanDig</literal_col>
<col>Integer</col>
<col>0 or 1. Dig.</col>
</row>
<row>
<literal_col>CanConstruct</literal_col>
<col>Integer</col>
<col>0 or 1. Construct. If greater than 1, percentage construction speed. (100 normal, 50 half, etc.)</col>
</row>
<row>
<literal_col>CorrosionResist</literal_col>
<col>Integer</col>
<col>0 or 1. Determines wether the object resists acid.</col>
</row>
<row>
<literal_col>BreatheWater</literal_col>
<col>Integer</col>
<col>0 object breathes air, 1 object breathes water.</col>
</row>
</table>
</text>
<h>Note:</h>
<text>When a crew member is created, it gets an own physical section in it's Objectinfo (c4i). In there, the individual changes to the physicals (for example because of training) are saved and restored when an object enters a player's crew. The physical section of the defcore is only used for new crew members and normal objects.</text>
</part>
<author>Sven2</author><date>2002-04</date>
</doc>

View File

@ -1,76 +1,96 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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="Graphicsmesh"><img src="../../images/icon_ogre_mesh.gif" width="16" height="16" /><emlink href="definition/meshes.html">Graphics.mesh</emlink></dt>
<dd><text>Ab OC kann statt einer Grafik im BMP- oder PNG-Format auch ein 3D-Modell verwendet werden. Dieses muss im OGRE-Format vorliegen. Für die meisten 3D-Programme existieren entsprechende Exporter. Alle Dateien die von dem Mesh benötigt werden (insb. Materialskripte, Texturen und Skelette) müssen ebenfalls im Objekt vorhanden sein.</text></dd>
<dt id="Graphicsskeleton"><img src="../../images/icon_ogre_mesh.gif" width="16" height="16" />*.skeleton</dt>
<dd><text>Skeleton-Dateien enthalten Bones und Animationen für ein 3D-Modell. Sie werden in der Regel vom Exporter generiert wenn Bones und/oder Animationen verwendet werden.</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="MaterialScripts"><img src="../../images/icon_ogre_mesh.gif" width="16" height="16" /><emlink href="definition/meshes.html#MaterialScripts">*.material</emlink></dt>
<dd><text>OGRE Materialskripte sind einfache Textdateien die Informationen über das Material eines 3D-Modells beinhalten. Jedem Modell ist ein Material zugeordnet, das sein Erscheinen festlegt. In der Regel werden diese Skripte auch vom Exporter generiert, sie können aber für zusätzliche Effekte auch einfach mit einem Texteditor nachträglich bearbeitet werden.</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>
<title>Object Definitions</title>
<h id="Objektdefinitionen">Object Definitions</h>
<part>
<text>Object definitions are used for all game objects in clonk: fire monsters, the wooden hut, and the clonk himself. An object definition is a group file composed from the following components:</text>
<h id="ObjektdefinitionsKomponentenC4D">Object Definition Components (c4d)</h>
<dl>
<dt><img height="16" src="../../images/icon_text.gif" width="16"/><emlink href="definition/defcore.html">DefCore.txt</emlink></dt>
<dd>
<text>Object properties.</text>
</dd>
<dt><img height="16" src="../../images/icon_text.gif" width="16"/><emlink href="definition/actmap.html">ActMap.txt</emlink></dt>
<dd>
<text>Table for activities.</text>
</dd>
<dt id="Graphicspng"><img height="16" src="../../images/icon_image.gif" width="16"/>Graphics.png</dt>
<dd>
<text>Graphics of the object. Base graphics, animation phases and a picture for display in menus are stored in a 32 bit picture with transparency channel (PNG format, 32 bit RGBA color, non interlaced).</text>
</dd>
<dt id="Overlaypng"><img height="16" src="../../images/icon_image.gif" width="16"/>Overlay.png</dt>
<dd>
<text>The part of the object's graphics which is to be colored in the player color (see ColorByOwner in DefCore.txt) can also be defined using a separate graphics file. In this way you can also use the color blue in the object's graphics for effects other than player color and antialiasing of the player color sections becomes possible. In Overlay.png gray scales should be used instead of blue color.</text>
</dd>
<dt id="Graphicsbmp"><img height="16" src="../../images/icon_image.gif" width="16"/>Graphics.bmp</dt>
<dd>
<text>The bmp format for graphics elements is obsolete but still supported. In a 256 color bitmap (8 bit) only the predefined colors 15 through 103 of the fixed Clonk color palette may be used.</text>
</dd>
<dt id="Graphicsmesh"><img height="16" src="../../images/icon_ogre_mesh.gif" width="16"/><emlink href="definition/meshes.html">Graphics.mesh</emlink></dt>
<dd>
<text>Since OC a 3D model can be used as an object's graphics instead of a bitmap in BMP or PNG format. It needs to be provided in OGRE format. There are exporters for most 3D modeling tools. All files that are required by the mesh (especially material scripts, textures and skeletons) need also to be present in the object.</text>
</dd>
<dt id="Graphicsskeleton"><img height="16" src="../../images/icon_ogre_mesh.gif" width="16"/>*.skeleton</dt>
<dd>
<text>Skeleton files contain bones and animations for a 3D model. They are usually created by the exporter if bones and/or animations are used for the mesh.</text>
</dd>
<dt id="Graphicsex"><img height="16" src="../../images/icon_image.gif" width="16"/>Graphics*.png/Overlay*.png/Graphics*.bmp</dt>
<dd>
<text>Objects can also contain alternative sets of graphics which can be selected ingame using the script command <emlink href="script/fn/SetGraphics.html">SetGraphics</emlink>(). The name corresponds to the file name portion following "Graphics". The matching overlay is automatically selected. For more information see <emlink href="script/fn/SetGraphics.html">SetGraphics</emlink>().</text>
</dd>
<dt id="Titlepng"><img height="16" src="../../images/icon_image.gif" width="16"/>Title.png/Title.bmp</dt>
<dd>
<text>Object definitions can contain an additional title image (as scenarios do). This will be displayed in the menu system instead of the picture section of the object definition. Recommended size: 150x150 pixels, as long as your image is actually worth it.</text>
</dd>
<dt id="MaterialScripts"><img height="16" src="../../images/icon_ogre_mesh.gif" width="16"/><emlink href="definition/meshes.html#MaterialScripts">*.material</emlink></dt>
<dd>
<text>OGRE material scripts are simple text files which contain information about the material of a 3D model. Each model is assigned a material which specifies how it is rendered. Normally these scripts are being generated by the exporter, but they can also be hand-edited afterwards (using a text editor) to apply additional effects.</text>
</dd>
<dt id="ScriptcScript__c"><img height="16" src="../../images/icon_text.gif" width="16"/><emlink href="definition/script.html">Script.c</emlink></dt>
<dd>
<text>The object script. See <emlink href="script/index.html">script documentation</emlink> and <emlink href="lang.html">localization</emlink>.</text>
</dd>
<dt id="Namestxt"><img height="16" src="../../images/icon_text.gif" width="16"/>Names.txt</dt>
<dd>
<text>Multilingual name table (see Title.txt in scenarios).</text>
</dd>
<dt id="Desc__txt"><img height="16" src="../../images/icon_text.gif" width="16"/>Desc*.txt</dt>
<dd>
<text>Short description. For multilingual descriptions see scenario descriptions.</text>
</dd>
<dt id="Ranktxt"><img height="16" src="../../images/icon_text.gif" width="16"/>Rank.txt/Rank*.txt</dt>
<dd>
<text>For object definitions defining a clonk type you can specify custom rank names for this clonk type here. The rank names will then also replace rank names of existing crew members of this type. The file should contain a simple text list of names of maximum 30 characters each. For an example see the knight in the Knights pack. By using the approriate language codes you can create language dependent sets of rank names.</text>
</dd>
<dt id="Rankbmppng"><img height="16" src="../../images/icon_image.gif" width="16"/>Rank.png/Rank.bmp</dt>
<dd>
<text>You can also define custom rank symbols for clonk types which are then displayed in the game instead of the standard symbols from Graphics.c4g. A rank symbol should always be square and there should be enough many symbols for all ranks. For ranks exceeding the last symbol, the list is repeated from the front and a star is added to the symbol.</text>
</dd>
<dt id="wav"><img height="16" src="../../images/icon_sound.gif" width="16"/>*.wav</dt>
<dd>
<text>Object local sounds. As these are always loaded and not dynamically unloaded as are scenario sounds you should use these sparingly and with small sound files only.</text>
</dd>
<dt id="c4d"><img height="16" src="../../images/icon_object_definition.gif" width="16"/>*.c4d</dt>
<dd>
<text>The engine will also search all valid c4d subdirectories for additional object definitions. Object definitions should be grouped by category.</text>
</dd>
<dt id="Infotxt"><img height="16" src="../../images/icon_text.gif" width="16"/>Info.txt</dt>
<dd>
<text>This component is not processed by the engine. Here the author can store additional information he wants to share with other developers.</text>
</dd>
<dt id="Authortxt"><img height="16" src="../../images/icon_text.gif" width="16"/>Author.txt</dt>
<dd>
<text>Should contain the name of the author in format "Firstname Lastname (Nick)" and is used to maintain the name of the original author, if the group file is edited by another developer at a later point in time. The name stored here is only displayed, however, if the group was edited by RedWolf Design. This feature is mainly used for contest scenarios.</text>
</dd>
</dl>
<h id="ObjektundEntwicklerIdentifikation">Object Identification</h>
<text>Object definitions are identified by an id which consists of four characters (e.g. C4ID). Original objects use four characters: ABCD or ABC1.</text>
<text>Local object definitions which are only available in one scenario should use the id format _ABC.</text>
<text>Object definitions created by community players but publicly released should use the format AB3C of which the first two characters should identify the object and the second two (one digit and one character) should identify the developer. This is to avoid id conflicts with other developers.</text>
</part>
<author>Sven2</author><date>2002-04</date>
<author>matthes</author><date>2004-06</date>
</doc>

View File

@ -1,36 +1,76 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
</table>
</text>
<author>Sven2</author><date>April 2002</date>
<author>Newton</author><date>Januar 2005</date>
<author>Günther</author><date>Juli 2006</date>
<title>LineConnect</title>
<h id="LineConnect">LineConnect</h>
<text>The LineConnect attribute is a bitmask and determines which lines can be connected to an object and what the object conducts.</text>
<text>
<table>
<rowh>
<col>Bit</col>
<col>Value</col>
<col>Name</col>
<col>Description</col>
</rowh>
<row>
<col>0</col>
<col>1</col>
<col>C4D_PowerInput</col>
<col>The end of an energy line can be connected.</col>
</row>
<row>
<col>1</col>
<col>2</col>
<col>C4D_PowerOutput</col>
<col>The start of an energy line can be connected.</col>
</row>
<row>
<col>2</col>
<col>4</col>
<col>C4D_LiquidInput</col>
<col>The end of a pipe can be connected.</col>
</row>
<row>
<col>3</col>
<col>8</col>
<col>C4D_LiquidOutput</col>
<col>The beginning of a pipe can be connected.</col>
</row>
<row>
<col>4</col>
<col>16</col>
<col>C4D_PowerGenerator</col>
<col>The object is a power generator.</col>
</row>
<row>
<col>5</col>
<col>32</col>
<col>C4D_PowerConsumer</col>
<col>The object is an energy consumer.</col>
</row>
<row>
<col>6</col>
<col>64</col>
<col>C4D_LiquidPump</col>
<col>The object is a pump.</col>
</row>
<row>
<col>7</col>
<col>128</col>
<col></col>
<col>Reserved, unused.</col>
</row>
<row>
<col>8</col>
<col>256</col>
<col>C4D_EnergyHolder</col>
<col>The object does not loose energy by itself, even if it is not alive or a base.</col>
</row>
</table>
</text>
<author>Sven2</author><date>2002-04</date>
<author>Newton</author><date>2005-01</date>
<author>Günther</author><date>2006-07</date>
</doc>

View File

@ -1,55 +1,38 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE doc
SYSTEM '../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Meshes</title>
<h id="Meshes">Meshes</h>
<part>
<text>Ab OC ist es möglich, direkt 3D-Modelle (Meshes) als Grafik für Objekte zu verwenden. Dazu müssen sie im OGRE-Format vorliegen. Für gängige Modellierungstools gibt es entsprechende Exporter, eine Liste befindet sich auf dem <a href="http://www.ogre3d.org/wiki/index.php/Exporters">OGRE Wiki</a>. Es werden sowohl das OGRE-Binär-Format (*.mesh) als auch das OGRE-XML-Format (*.mesh.xml) unterstützt, jedoch wird empfohlen wann immer möglich das Binärformat zu verwenden, da es eine kleinere Dateigröße hat und schneller von der Engine geladen werden kann. Das Tool <a href="http://www.ogre3d.org/wiki/index.php/OgreXmlConverter">OgreXMLConverter</a> kann zwischen beiden Formaten umwandeln.</text>
<text>Der Exporter erzeugt in der Regel eine Mesh-Datei (*.mesh oder *.mesh.xml), falls das Mesh Bones enthält eine Skelett-Datei (*.skeleton oder *.skeleton.xml), ein Materialskript (*.material) und eventuell verwendete Texturen. Um das Mesh für ein Clonk-Objekt zu verwenden müssen alle erzeugten Dateien in die <emlink href="definition/index.html">Objektdefinition</emlink> (*.c4d) kopiert werden und die Mesh-Datei muss in Graphics.mesh bzw. Graphics.mesh.xml umbenannt werden. Texturen werden im PNG-, JPG- und BMP-Format unterstützt.</text>
<text>Das Mesh wird nicht automatisch auf die Größe des Shapes (d.h. die Width- und Height-Werte aus der <emlink href="definition/defcore.html">DefCore.txt</emlink>) skaliert. Stattdessen entspricht eine Einheit im Modellierungstool ein Pixel in Clonk. Dies erleichtert die Größenverhältnisse zwischen verschiedenen Meshes einzuhalten, was insbesondere beim Aneinanderhängen von Meshes (siehe unten) hilfreich ist. Auch auf das Koordinatensystem ist acht zu geben: Die X-Achse im Mesh-Koordinatensystem zeigt in Clonk nach vorne, die Y-Achse nach rechts und die Z-Achse nach oben.</text>
<h id="MaterialScripts">Materialskripte</h>
<text>Alle Materialskripte (*.material-Dateien) werden von der Engine geladen bevor das eigentliche Mesh geladen wird. Dabei handelt es sich um einfache Textdateien die Materialeigenschaften (Farben für verschiedene Lichter, Texturen, etc.) bestimmen die dann von Meshes verwenden werden können. Jedem Material ist ein Name zugeordnet der in der Regel im Modellierungstool bestimmt werden kann. Dabei sollte darauf geachtet werden, dass dieser möglichst eindeutig ist (also zum Beispiel den Objektnamen enthält), da alle geladenen Materialien direkt von jedem Mesh verwendet werden können und es ansonsten leicht zu Namenskonflikten kommen kann.</text>
<text>Materialskripte können auch von Hand erstellt oder nachbearbeitet werden. Das Format wird im <a href="http://www.ogre3d.org/docs/manual/manual_14.html">OGRE-Handbuch</a> beschrieben. Es werden jedoch (noch) nicht alle dort beschriebenen Features von Clonk unterstützt: Insbesondere Pixel-, Vertex- und Geometrie-Shader können derzeit nicht verwendet werden. Auch die Verwendung von LOD (Level of Detail) ist noch nicht möglich. Für das Feld colour_op_ex in Textureinheiten kann für source1 oder source2 zusätzlich noch der Wert src_player_colour angegeben werden was der Spielerfarbe des Besitzers entspricht. Auf diese Weise ist es möglich, Objekte (teilweise) mit ihrer Spielerfarbe einzufärben.</text>
<text>Zur Laufzeit kann das Materialskript auch mit der C4Script-Funktion <funclink>SetMeshMaterial</funclink> geändert werden.</text>
<h id="Animations">Animationen</h>
<text>Wei bei Bitmap-basierten Grafiken kann ein Objekt während einer Aktivität eine Animation abspielen. Dazu muss zuerst ein Rig für das Modell erstellt und anschließend die Animation erzeugt werden. Beim Export wird sie in der *.skeleton (bzw. *.skeleton.xml im OGRE-XML-Format) gespeichert. Um sie während einer Aktivität abzuspielen muss das Animation-Feld in der <emlink href="definition/actmap.html">ActMap</emlink> gesetzt sein. Die Facet-Felder werden bei Mesh-Grafiken ignoriert.</text>
<text>Per Script ist es auch möglich, mehrere Animationen gleichzeitig abzuspielen bzw. Übergänge zwischen Animationen zu machen. Um mehr darüber zu erfahren siehe <emlink href="definition/animations.html">Animationen</emlink>.</text>
<h id="Attachment">Aneinanderhängen von Meshes</h>
<text>Meshes können aneinandergehängt werden, sodass sie sich immer miteinander bewegen. Auf diese Weise kann der Clonk zum Beispiel Sachen tragen oder mit dem Bogen Zielen. Um zwei Meshes zu verbinden gibt es die C4Script-Funktion <funclink>AttachMesh</funclink>, um sie wieder zu lösen kann <funclink>DetachMesh</funclink> verwendet werden. Beim Anhängen wird dabei jeweils ein Bone von den beiden Meshes angegeben. Das angehängte Mesh wird dann so positioniert, dass sein Bone immer die gleiche Position und Orientierung hat wie der Bone mit dem es verbunden wird.</text>
<text>Dabei ist jedoch darauf zu achten, dass lediglich die Meshes, also die Grafiken der Objekte, verbunden werden. Die wirkliche Position des angehängten Objekts (also was die Funktionen <funclink>GetX</funclink> und <funclink>GetY</funclink> zurückgeben oder den Bereich in dem das Objekt von <funclink>Find_AtPoint</funclink>, <funclink>Find_InRect</funclink> oder <funclink>Find_AtRect</funclink> gefunden wird) ändert sich <em>nicht</em>.</text>
<h id="Picture">Repräsentativgrafik</h>
<text>Wird ein Mesh verwendet so bleibt der Picture-Eintrag aus der <emlink href="definition/defcore.html">DefCore.txt</emlink> ohne Wirkung. Stattdessen wird eine perspektivische Projektion des Meshes verwendet. Die Kamera befindet sich dabei vor dem Mesh in einer geeigneten Entfernung so dass das Mesh vollständig erfasst wird.</text>
<text>Die Position und Ausrichtung des Meshes relativ zur Kamera kann mit der "PictureTransformation"-Eigenschaft geändert werden. So kann es gedreht, versetzt und vergrößert dargestellt werden. Der Eigenschaft sollte ein Array mit 12 Integer-Einträgen zugewiesen werden, die eine 3x4-Matrix bilden. Die ersten vier Werte bilden die erste Zeile, die nächsten vier die zweite und die letzten vier Werte die dritte Zeile. Mit Hilfe der Skriptfunktionen <funclink>Trans_Identity</funclink>, <funclink>Trans_Translate</funclink>, <funclink>Trans_Rotate</funclink>, <funclink>Trans_Scale</funclink> und <funclink>Trans_Mul</funclink> lassen sich diese Matrizen sehr bequem generieren.</text>
<text>Wie bei <funclink>SetObjDrawTransform</funclink> werden die einzelnen Matrixelemente in Promille (1000 = 100%) angegeben, da es in Clonk keine Fließkommazahlen gibt.</text>
<text>Als Beispiel hier die Transformation für die Werkzeughütte:</text>
<code><funclink>SetProperty</funclink>("PictureTransformation", <funclink>Trans_Mul</funclink>(<funclink>Trans_Translate</funclink>(0,0,7000), <funclink>Trans_Rotate</funclink>(-20,1,0,0), <funclink>Trans_Rotate</funclink>(30,0,1,0)), def);</code>
<text>Zuerst wird die Werkzeughütte um 30 Grad gegen den Uhrzeigersinn um die Y-Achse gedreht, danach um 20 Grad im Uhrzeigersinn um die X-Achse. Anschließend wird sie noch um 7 Einheiten in positive Z-Richtung verschoben sodass sie näher an der Kamera ist.</text>
<h id="Transformation">MeshTransformation</h>
<text>Genauso wie die Eigenschaft "PictureTransformation" das Erscheinungsbild der Repräsentativgrafik ändert gibt es auch die Eigenschaft "MeshTransformation", die auf die normale Grafik im Spiel wirkt. Dies wirkt sich sehr ähnlich wie <funclink>SetObjDrawTransform</funclink> aus, jedoch gibt es einige Unterschiede:</text>
<ul>
<li>Mit der "MeshTransformation"-Eigenschaft kann auch die Z-Koordinate beeinflusst werden. Das Mesh kann also zum Beispiel um die X- oder Y-Achse gedreht werden.</li>
<li><funclink>SetObjDrawTransform</funclink> wird auch nach der Beleuchtung angewandt. Die transformierten Koordinaten haben also keinen Einfluss auf die Beleuchtung mehr. Wird das Mesh zum Beispiel von unten beleuchtet und wird es dann mit <funclink>SetObjDrawTransform</funclink> auf den Kopf gestellt, so bleibt die Beleuchtung an der gleichen Stelle auf dem Mesh, wird also mitgedreht. Bei der "MeshTransformation"-Eigenschaft wird die Beleuchtung jedoch hinterher gemacht, sodass das Mesh immer von unten beleuchtet wird, egal wie es ausgerichtet ist.</li>
<li>Sind sowohl "MeshTransformation" als auch <funclink>SetObjDrawTransform</funclink> gesetzt, so wird zuerst die "MeshTransformation" auf das Mesh angewandt und dann <funclink>SetObjDrawTransform</funclink>.</li>
</ul>
</part>
<author>Clonk-Karl</author><date>April 2010</date>
<title>Meshes</title>
<h id="Meshes">Meshes</h>
<part>
<text>Since OC it is possible to directly use 3D models (meshes) as object graphics. To do so they need to be in OGRE format. For most modeling tools there exist exporter tools, a list can be found on the <a href="http://www.ogre3d.org/wiki/index.php/Exporters">OGRE Wiki</a>. Both the OGRE binary format (*.mesh) and the OGRE XML format(*.mesh.xml) are supported, however it is recommended to always use the binary format whenever possible since it is smaller in size and can be loaded more quickly by the engine. The tool <a href="http://www.ogre3d.org/wiki/index.php/OgreXmlConverter">OgreXMLConverter</a> can convert between the two formats.</text>
<text>The exporter normally creates a mesh file (*.mesh or *.mesh.xml), a skeleton file (*.skeleton or *.skeleton.xml) if the mesh contains bones, a material script (*.material) and potentially used textures. To use the mesh as a Clonk object all generated files need to be copied into the <emlink href="definition/index.html">object definition</emlink> and the mesh file needs to be renamed to Graphics.mesh or Graphics.mesh.xml, respectively. Textures are supported in PNG, JPG and BMP format.</text>
<text>The mesh is not automatically scaled to the shape (i.e. the width and height values specified in <emlink href="definition/defcore.html">DefCore.txt</emlink>) of the object. Instead one unit in the modeling tool corresponds to one pixel in Clonk. This simplifies using the same magnitude of object sizes for all objects which is especially helpful for attaching meshes (see below). Also pay attention to the coordinate frame: The X axis in the mesh coordinate frame points out of the screen in Clonk, the Y axis points to the right and the Z axis points upwards.</text>
<h id="MaterialScripts">Material scripts</h>
<text>All material scripts (*.material files) are loaded by the engine before the mesh in the same directory is loaded. Material scripts are simple text files which specify the material properties (material colors, textures, etc.) that can be used by meshes. Each material is assigned a name that can normally be specified in the modeling tool. It should be taken care that names are unique (for example by prefixing all material names with the object name of the object they are supposed to be used with) since all loaded materials can directly be used by any mesh so otherwise they could be naming conflicts.</text>
<text>Material scripts can also be crafted or edited by hand. The format is described in the <a href="http://www.ogre3d.org/docs/manual/manual_14.html">OGRE manual</a>. However not all of the features described there are supported (yet): Especially pixel, vertex and geometry shaders cannot be used. Also usage of LOD (Level of Detail) is not yet possible. For the source1 and source2 fields in the colour_op_ex field in texture units the additional value src_player_colour can be specified to refer to the player color of the object's owner. This can be used to colorize objects (partly) by the player color.</text>
<text>At runtime the material script can be changed using the C4Script function <funclink>SetMeshMaterial</funclink>.</text>
<h id="Animations">Animations</h>
<text>As for bitmap based graphics an object can play an animation while executing an action. To do so first a rig for the model and then an animation needs to be created. When exporting it is saved in the *.skeleton (or *.skeleton.xml for the OGRE XML format) file. To play it during an action the Animation field of the action needs to be set in the <emlink href="definition/actmap.html">ActMap</emlink>. The Facet fields are ignored for mesh graphics.</text>
<text>It is also possible, via script, to play multiple animations at the same time or to specify transitions between animations. To learn more about this possibility see <emlink href="definition/animations.html">Animations</emlink>.</text>
<h id="Attachment">Attachment of meshs</h>
<text>Meshes can be attached to each other so that they always move together. This allows the clonk to carry objects or to aim with the bow. To attach two meshes the C4Script function <funclink>AttachMesh</funclink> can be used, or <funclink>DetachMesh</funclink> to detach them again. When attaching a bone of both meshes needs to be specified. The attached mesh is then aligned so that its bone has always the same position and orientation as the one to which it is attached.</text>
<text>However it needs to be taken care of the fact that only the meshes, that is the graphics of the objects, are attached. The real position of the attached object (so what is returned by the functions <funclink>GetX</funclink> and <funclink>GetY</funclink> or the area in which the object is found by the functions <funclink>Find_AtPoint</funclink>, <funclink>Find_InRect</funclink> oder <funclink>Find_AtRect</funclink>) is <em>not</em> affected.</text>
<h id="Picture">Picture graphics.</h>
<text>If an object uses a mesh then the Picture entry of the <emlink href="definition/defcore.html">DefCore.txt</emlink> remains without effect. Instead a perspective projection of the mesh will be used. The camera will be placed in the front of the object at a distance so that the mesh is totally covered.</text>
<text>The position and orientation of the mesh with respect to the camera can be changed by making use of the "PictureTransformation" property. This way it can be shown displaced, rotated or scaled. The property should be assigned an array with 12 integer entries which make up a 3x4 matrix. The first four values specify the first row, the next four values specify the second row and the last four entries specify the third one. Those matrices can be conveniently created using the script functions <funclink>Trans_Identity</funclink>, <funclink>Trans_Translate</funclink>, <funclink>Trans_Rotate</funclink>, <funclink>Trans_Scale</funclink> and <funclink>Trans_Mul</funclink>.</text>
<text>As with <funclink>SetObjDrawTransform</funclink> the individual matrix elements are specified in per thousand (1000 = 100%) since there are no floating point numbers in Clonk.</text>
<text>As an example we show the transformation of the tool workshop:</text>
<code><funclink>SetProperty</funclink>(&quot;PictureTransformation&quot;, <funclink>Trans_Mul</funclink>(<funclink>Trans_Translate</funclink>(0,0,7000), <funclink>Trans_Rotate</funclink>(-20,1,0,0), <funclink>Trans_Rotate</funclink>(30,0,1,0)), def);</code>
<text>First the workshop is rotated by 30 degrees counter-clockwise around the Y axis, then by 20 degrees clockwise around the X axis. Finally it is moved 7 units in positive Z direction so that it is nearer to the camera.</text>
<h id="Transformation">MeshTransformation</h>
<text>The same way the "PictureTransformation" property affects the presentation of the picture graphics the "MeshTransformation" property is applied for ingame graphics. The results are very similar to what can be done with <funclink>SetObjDrawTransform</funclink>, however there are a few subtle differences:</text>
<ul>
<li>With the "MeshTransformation" property the Z coordinate can be influenced. So for example the mesh can be rotated around the X or Y axis.</li>
<li><funclink>SetObjDrawTransform</funclink> is applied after lighting. The transformed coordinates have no influence on the lighting anymore. So for example if the mesh is illuminated from below and then is turned upside down by <funclink>SetObjDrawTransform</funclink> then the illuminated spot is at the same position on the mesh, that is it is also rotated. When using the "MeshTransformation" property however the lighting is applied after the transformation so that the mesh is always illuminated from below, no matter how it is oriented.</li>
<li>If both "MeshTransformation" and <funclink>SetObjDrawTransform</funclink> are set then first the "MeshTransformation" is applied to the mesh and then <funclink>SetObjDrawTransform</funclink>.</li>
</ul>
</part>
<author>Clonk-Karl</author><date>2010-04</date>
</doc>

View File

@ -1,62 +1,19 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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;
<title>Object character flags</title>
<h id="ocf">Object Character Flags</h>
<text>Object Character Flags are attributes of an object, which are computed from some <emlink href="definition/defcore.html">DefCore</emlink> entries and the current state of the object in the landscape. They are automatically updated by the engine.</text>
<text>All OCF are stored in a 32 bit wide bitmask. They can be tested with a simple bitwise "and". For example:</text>
<code>if (<funclink>GetOCF</funclink>(objekt) &amp; <funclink>OCF_Living</funclink>)
<funclink>Log</funclink>(&quot;Das Objekt ist ein Lebewesen.&quot;);</code> <text>The most common application for OCF are FindObject loops:</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>
<funclink>SetR</funclink>(180, obj);</code> <text>This script turns all rotatable objects upside down.</text>
<h id="ocf_fns">OCF Constants</h>
<text>The following OCFs are defined in C4Script:</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>2002-05</date>
</doc>

View File

@ -1,142 +1,135 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>Procedures</title>
<h id="Prozeduren">Procedures</h>
<text>For object activity the engine offers various standard procedures which perform typical physcial behaviour. In procedure WALK, for instance, the activity automatically changes to "Jump" if the ground under the feet is lost.</text>
<text>
<table>
<rowh>
<col>Procedure</col>
<col>Description</col>
<col>Behaviour</col>
<col>CNAT</col>
</rowh>
<row>
<col>NONE</col>
<col>No procedure</col>
<col>Only gravitational effects or attachment as specified in the <emlink href="definition/actmap.html">activity</emlink>.</col>
<col>[Action] Attach</col>
</row>
<row>
<col>WALK</col>
<col>Walking</col>
<col>According to <emlink href="definition/defcore.html#SektionPhysical">physical</emlink> Walk and current <emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_Bottom</col>
</row>
<row>
<col>FLIGHT</col>
<col>Free fall</col>
<col>Only gravitational effects</col>
<col>CNAT_None</col>
</row>
<row>
<col>KNEEL</col>
<col>Getting up</col>
<col>Behaviour according to <emlink href="definition/actmap.html">activity</emlink>.</col>
<col>CNAT_Bottom</col>
</row>
<row>
<col>SCALE</col>
<col>Scaling a wall</col>
<col>According to <emlink href="definition/defcore.html#SektionPhysical">physical</emlink> Scale and current <emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_Left/Right</col>
</row>
<row>
<col>HANGLE</col>
<col>Climbing on the ceiling</col>
<col>According to <emlink href="definition/defcore.html#SektionPhysical">physical</emlink> Hangle and current <emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_Top</col>
</row>
<row>
<col>DIG</col>
<col>Dig</col>
<col>According to <emlink href="definition/defcore.html#SektionPhysical">physical</emlink> Dig and current <emlink href="script/fn/SetComDir.html">ComDir</emlink>. With <emlink href="script/fn/SetActionData.html">Data</emlink>=1 material chunks are dug free.</col>
<col>CNAT_None</col>
</row>
<row>
<col>SWIM</col>
<col>Swimming</col>
<col>According to <emlink href="definition/defcore.html#SektionPhysical">physical</emlink> Swim and current <emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_None</col>
</row>
<row>
<col>THROW</col>
<col>Throw</col>
<col>Behaviour according to <emlink href="definition/actmap.html">activity</emlink>.</col>
<col>CNAT_Bottom</col>
</row>
<row>
<col>BRIDGE</col>
<col>Bridge building</col>
<col>According to <emlink href="script/fn/SetComDir.html">ComDir</emlink>. Bridge material is a material number in <emlink href="script/fn/SetActionData.html">Data</emlink>.</col>
<col>CNAT_Bottom</col>
</row>
<row>
<col>BUILD</col>
<col>Building</col>
<col>Builds the <emlink href="script/fn/SetAction.html">target object</emlink>.</col>
<col>CNAT_Bottom</col>
</row>
<row>
<col>PUSH</col>
<col>Pushing</col>
<col>Pushes the <emlink href="script/fn/SetAction.html">target object </emlink> according to <emlink href="definition/defcore.html#SektionPhysical">physical</emlink> Push and <emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_Bottom</col>
</row>
<row>
<col>CHOP</col>
<col>Tree felling</col>
<col>Chops the <emlink href="script/fn/SetAction.html">target object </emlink> according to <emlink href="definition/defcore.html#SektionPhysical">physical</emlink> Chop.</col>
<col>CNAT_Bottom</col>
</row>
<row>
<col>LIFT</col>
<col>Lifting</col>
<col>Lifts the <emlink href="script/fn/SetAction.html">target object</emlink> according to <emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_None</col>
</row>
<row>
<col>FLOAT</col>
<col>Floating in mid-air</col>
<col>According to <emlink href="definition/defcore.html#SektionPhysical">physical</emlink> Float and current <emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_None</col>
</row>
<row>
<col>ATTACH</col>
<col>Attachment to another object</col>
<col>Adjusts object position at vertex a to the position of vertex b of the <emlink href="script/fn/SetAction.html">target object</emlink>. a and b are the two low bytes of <emlink href="script/fn/SetActionData.html">ActionData</emlink> (see <emlink href="script/fn/SetActionData.html">SetActionData</emlink> for an example).</col>
<col>CNAT_None</col>
</row>
<row>
<col>FIGHT</col>
<col>Fighting</col>
<col>Fight against <emlink href="script/fn/SetAction.html">target object</emlink> according to <emlink href="definition/defcore.html#SektionPhysical">Fight physical</emlink>.</col>
<col>CNAT_Bottom</col>
</row>
<row>
<col>CONNECT</col>
<col>Line connections</col>
<col>Only <emlink href="definition/lineconnect.html">line objects</emlink>. Connects <emlink href="script/fn/SetAction.html">target object 1</emlink> and <emlink href="script/fn/SetAction.html">target object 2</emlink>.</col>
<col>CNAT_None</col>
</row>
<row>
<col>PULL</col>
<col>Pulling</col>
<col>Pulls the <emlink href="script/fn/SetAction.html">target object</emlink> according to <emlink href="definition/defcore.html#SektionPhysical">physical</emlink> Push and <emlink href="script/fn/SetComDir.html">ComDir</emlink>.</col>
<col>CNAT_Bottom</col>
</row>
</table>
</text>
<text>Procedures are hardcoded in the engine and are from older times in which is was not yet possible to implement the same functionality in script. Most procedures represent highly complex behaviour which is useful only for clonks.</text>
<author>Sven2</author><date>2002-04</date>
</doc>

View File

@ -1,260 +1,370 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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()
<title>Object Scripts</title>
<h id="Objektscripte">Object Scripts</h>
<part>
<text>Object scripts control the complex behaviour of an object. For details on scripting see the <emlink href="script/index.html">C4Script</emlink> documentation.</text>
<h>Creation</h>
<text>For every object, the engine calls the function <a href="#Initialize">Initialize</a> in the object script when it is created and completed.</text>
<code>func Initialize()
{
<emlink href="script/fn/CreateContents.html">CreateContents</emlink>(Rock);
<emlink href="script/fn/return.html">return</emlink>(1);
}
</code>
<text>An object with this script will be given a rock right after it has been created. The Initialize function is called only when the object has reached full size (a building only when its construction has been completed and a living being only when it is fully grown).</text>
<h>TimerCall</h>
<text>Each object definition can define a timer call in its <emlink href="definition/defcore.html">DefCore</emlink>. The TimerCall is a function which will be called at regular intervals. The DefCore entry Timer determines the rate of calls. If no rate is specifed, the default value is 35 frames (roughly once per second).</text>
<h>ActMap.txt</h>
<text>An active object can also define activity script calls in its <emlink href="definition/actmap.html">ActMap</emlink>. The defined StartCall is made whenever an action begins (or repeats), an EndCall is made at the end of each activity. PhaseCall is called at each animation phase step and should only be used for very short animations. The call frequency of PhaseCalls is determined by the speed of the animation.</text>
<h>#include</h>
<text>An object script can also include the functionality of another script.</text>
<code>#include Clonk</code>
<text>At this position the complete script of the specified object definition (that of the clonk, in this case) is inserted. Obviously, the included definition must be valid and loaded. Declared functions can be overloaded by functions of the same name that occur later in the script. Also see <funclink>inherited</funclink>().</text>
<h id="Zugangsberechtigung">Access Control</h>
<text>
You can specify an access declaration for functions in object scripts:
<table>
<row>
<col>public</col>
<col>may be called by the object itself, by the engine, or by other objects</col>
</row>
<row>
<col>protected</col>
<col>may only be called by the object itself or by the engine</col>
</row>
<row>
<col>private</col>
<col>may only be called by the object itself</col>
</row>
</table>
A special case: the callbacks TimerCall, StartCall, PhaseCall, and EndCall will work even if the function called was declared private (for downwards compatibility reasons) but the functions for all other engine calls (see below) must be declared protected or public.
</text>
<text>Functions with no special declaration are public. If you are unsure or don't care, leave your functions public.</text>
<h id="ObjektCallsderEngine">Object calls made by the engine</h>
<text>
The engine calls the following functions is objects at the given time.
<table>
<rowh>
<col>Function</col>
<col>Parameter</col>
<col>Description</col>
</rowh>
<row id="Initialize">
<literal_col>Initialize</literal_col>
<col></col>
<col>When the object is completed (<emlink href="script/fn/GetCon.html">Con</emlink> >= 100).</col>
</row>
<row id="Completion">
<literal_col>Completion</literal_col>
<col></col>
<col>Obsolete. Same as Initialze.</col>
</row>
<row id="Construction">
<literal_col>Construction</literal_col>
<col>object by_object</col>
<col>When the object is created. The parameter is a pointer to the object the script of which has created this object. Also see <emlink href="script/fn/Construction.html">Construction</emlink></col>
</row>
<row id="Destruction">
<literal_col>Destruction</literal_col>
<col></col>
<col>When the object is removed.</col>
</row>
<row id="Hit">
<literal_col>Hit</literal_col>
<col></col>
<col>When the object collides with the landscape or is collected at high velocity (&gt;=15).</col>
</row>
<row id="Hit2">
<literal_col>Hit2</literal_col>
<col></col>
<col>Like Hit, with speeds &gt;= 20 (see <emlink href="script/fn/OCF_HitSpeed2.html">OCF_HitSpeed2</emlink>).</col>
</row>
<row id="Hit3">
<literal_col>Hit3</literal_col>
<col></col>
<col>Like Hit, with speeds &gt;= 60 (see <emlink href="script/fn/OCF_HitSpeed3.html">OCF_HitSpeed3</emlink>).</col>
</row>
<row id="Grab">
<literal_col>Grab</literal_col>
<col>object target, bool grab</col>
<col>When the object grabs or lets go of another object.</col>
</row>
<row id="Grabbed">
<literal_col>Grabbed</literal_col>
<col>object by_object, bool grab</col>
<col>When the object is grabbed or let go by another object. Since 4.9.8.4.</col>
</row>
<row id="Get">
<literal_col>Get</literal_col>
<col>object target</col>
<col>When the object takes another object from a container.</col>
</row>
<row id="Put">
<literal_col>Put</literal_col>
<col></col>
<col>When the object puts another object into a container.</col>
</row>
<row id="Damage">
<literal_col>Damage</literal_col>
<col>int change, int by_player</col>
<col>When the object is damage.</col>
</row>
<row id="DeepBreath">
<literal_col>DeepBreath</literal_col>
<col></col>
<col>When a living being surfaces after having used up more than half of its breath.</col>
</row>
<row id="Incineration">
<literal_col>Incineration</literal_col>
<col>int by_player</col>
<col>When the object is incinerated. Notice: with objects changing their definition via BurnTo, this call is made to the burned version!</col>
</row>
<row id="IncinerationEx">
<literal_col>IncinerationEx</literal_col>
<col>int by_player</col>
<col>When the object is incinerated in and immediately extinguished by a surrounding liquid. Otherwise as Incineration. From CE.</col>
</row>
<row id="Death">
<literal_col>Death</literal_col>
<col></col>
<col>When a living being dies.</col>
</row>
<row id="Activate">
<literal_col>Activate</literal_col>
<col>object by_object</col>
<col>Activation by double dig. Only applies to collected items or directly controlled crew objects. Called after internal handling of the double dig command has been completed (e.g. chopping of trees etc.)</col>
</row>
<row id="Contact_">
<literal_col>Contact_</literal_col>
<col></col>
<col>When the object collides with the landscape. See <emlink href="definition/cnat.html">CNAT - Contact Attachment</emlink>.</col>
</row>
<row id="Control_">
<literal_col>Control_</literal_col>
<col>object by_object</col>
<col>When the object is controlled from the outside. See <a href="#Control-Funktionen">Control Functions</a>.</col>
</row>
<row id="Contained_">
<literal_col>Contained_</literal_col>
<col>object by_object</col>
<col>When the object is controlled from the inside. See <a href="#Control-Funktionen">Control Functions</a>.</col>
</row>
<row id="ControlCommand">
<literal_col>ControlCommand</literal_col>
<col>string command, object target, int x, int y, object target2, int data, object command_object</col>
<col>When the object has received a command to be independently executed. See <a href="#Control-Funktionen">Control functions</a>.</col>
</row>
<row id="ControlCommandFinished">
<literal_col>ControlCommandFinished</literal_col>
<col>string command, object target, int x, int y, object target2, any Data</col>
<col>When the object has completed a command or execution of a command has failed.</col>
</row>
<row id="ControlTransfer">
<literal_col>ControlTransfer</literal_col>
<col>object obj, int x, int y</col>
<col>When an object (obj) using the internal pathfinding algorithm is trying to pass the transfer zone of this object on its way to point x/y. The transfer function can then help the object along by giving special script commands and returning true. Also see <emlink href="script/fn/SetTransferZone.html">SetTransferZone</emlink>().</col>
</row>
<row id="UpdateTransferZone">
<literal_col>UpdateTransferZone</literal_col>
<col></col>
<col>When an object is loaded from a savegame or network synchronization is performed. Objects with a transfer zone should reset the zone in this call. Also see <emlink href="script/fn/SetTransferZone.html">SetTransferZone</emlink>().</col>
</row>
<row id="MenuQueryCancel">
<literal_col>MenuQueryCancel</literal_col>
<col>int selection, object menu_object</col>
<col>When the player wants to close a user defined object menu. Return value true will keep the menu open.</col>
</row>
<row id="IsFulfilled">
<literal_col>IsFulfilled</literal_col>
<col></col>
<col>Only in game goal objects. A return value true indicates that this goal is fulfilled.</col>
</row>
<row id="ControlContents">
<literal_col>ControlContents</literal_col>
<col>id target</col>
<col>When a new inventory object is selected. See <a href="#Control-Funktionen">Control Functions</a>.</col>
</row>
<row id="Selection">
<literal_col>Selection</literal_col>
<col>object container</col>
<col>When the object is selected in an inventory change. If you are processing this event, the function should play its own selection sound.</col>
</row>
<row id="CatchBlow">
<literal_col>CatchBlow</literal_col>
<col>int level, object by</col>
<col>When the object is hit or punched by another object.</col>
</row>
<row id="QueryCatchBlow">
<literal_col>QueryCatchBlow</literal_col>
<col>object by</col>
<col>Called before the object is hit or punched by another object. By returning true, QueryCatchBlow can reject physical blows.</col>
</row>
<row id="LineBreak">
<literal_col>LineBreak</literal_col>
<col>int cause</col>
<col>When a line object is broken. cause: 0 by movement, 1 because of a missing or incomplete target object.</col>
</row>
<row id="BuildNeedsMaterial">
<literal_col>BuildNeedsMaterial</literal_col>
<col>id material_definition, int amount</col>
<col>When the object is building another object and building material is required. The parameters are the type and amount of the first needed material. If this function returns true, no material message is displayed above the object.</col>
</row>
<row id="AttachTargetLost">
<literal_col>AttachTargetLost</literal_col>
<col></col>
<col>When the object is in an ATTACH action and has lost its action target. At this time, the object's action has already been reset.</col>
</row>
<row id="CrewSelection">
<literal_col>CrewSelection</literal_col>
<col>bool deselect, bool cursor_only</col>
<col>When crew selection is changed. cursor_only specifies whether only that crew member has been selected which is also the cursor.</col>
</row>
<row id="GetObject2Drop">
<literal_col>GetObject2Drop</literal_col>
<col>object for_collection_of_object</col>
<col>Called to determine the least needed inventory object when a clonk tries to collect a new object and his inventory is full. The function should return the object to be dropped to gain space, or 0 if none.</col>
</row>
<row id="OnMenuSelection">
<literal_col>OnMenuSelection</literal_col>
<col>int index, object menu_object</col>
<col>When an object menu entry is selected.</col>
</row>
<row id="CalcValue">
<literal_col>CalcValue</literal_col>
<col>object in_base, int for_player</col>
<col>Calculates the value of an object. Also see <emlink href="script/fn/GetValue.html">GetValue</emlink>().</col>
</row>
<row id="CalcDefValue">
<literal_col>CalcDefValue</literal_col>
<col>object in_base, int for_player</col>
<col>Calculates the value of an object type available to buy. Also see <emlink href="script/fn/GetValue.html">GetValue</emlink>().</col>
</row>
<row id="CalcBuyValue">
<literal_col>CalcBuyValue</literal_col>
<col>id item, int value</col>
<col>Returns the buying price of the object type.</col>
</row>
<row id="CalcSellValue">
<literal_col>CalcSellValue</literal_col>
<col>object obj, int object_value</col>
<col>Returns the selling price of the object type.</col>
</row>
<row id="LiftTop">
<literal_col>LiftTop</literal_col>
<col></col>
<col>When an object with LIFT action lifts its action target to the height specified in its DefCore or above.</col>
</row>
<row id="Stuck">
<literal_col>Stuck</literal_col>
<col></col>
<col>When the action target of the object's PUSH or LIFT action is stuck.</col>
</row>
<row id="GrabLost">
<literal_col>GrabLost</literal_col>
<col></col>
<col>When the action target of the object's PUSH or PULL action is lost.</col>
</row>
<row id="Collection">
<literal_col>Collection</literal_col>
<col>object obj, bool put</col>
<col>When the object has collected another object (obj) (by ingame collection or grabbing and getting).</col>
</row>
<row id="Collection2">
<literal_col>Collection2</literal_col>
<col>object obj</col>
<col>When the object has collected another object (obj) (in all cases, even in script controlled collection or entering).</col>
</row>
<row id="Departure">
<literal_col>Departure</literal_col>
<col>object container</col>
<col>When this object has left another object (container).</col>
</row>
<row id="Ejection">
<literal_col>Ejection</literal_col>
<col>object obj</col>
<col>When another object (obj) has left the contents of this object (also see script command Exit).</col>
</row>
<row id="Entrance">
<literal_col>Entrance</literal_col>
<col>object container</col>
<col>When the object has entered another object (container).</col>
</row>
<row id="ActivateEntrance">
<literal_col>ActivateEntrance</literal_col>
<col>object by_object</col>
<col>When another object is trying to enter this object through the entrance.</col>
</row>
<row id="RejectCollect">
<literal_col>RejectCollect</literal_col>
<col>id def, object obj</col>
<col>Called before Collection. If RejectCollect returns true, the collection of the other object is prevented.</col>
</row>
<row id="RejectEntrance">
<literal_col>RejectEntrance</literal_col>
<col>object into_object</col>
<col>Called before Entrance. If RejectEntrance returns true, then entrance of the other object is prevented.</col>
</row>
<row id="InitializePlayer">
<literal_col>InitializePlayer</literal_col>
<col>int player</col>
<col>Called in game goals, rules, or environment objects after the joining of a new player and before the corresponding call in the scenario script.</col>
</row>
<row id="SellTo">
<literal_col>SellTo</literal_col>
<col>int by_player</col>
<col>When the object is sold. Should return 0 or the id of the object type which is actually added to the player's homebase material.</col>
</row>
<row id="Sale">
<literal_col>Sale</literal_col>
<col>int by_player</col>
<col>When the object is sold.</col>
</row>
<row id="Purchase">
<literal_col>Purchase</literal_col>
<col>int by_player, object buy_object</col>
<col>When the object is bought.</col>
</row>
<row id="Recruitment">
<literal_col>Recruitment</literal_col>
<col>int player</col>
<col>When the objet is added to the crew of a player.</col>
</row>
<row id="RejectTeamSwitch">
<literal_col>RejectTeamSwitch</literal_col>
<col>int player, int new_team</col>
<col>Callback in game goal, rule, and environment objects and in the scenario script. If RejectTeamSwitch returns true, the team switch of a player can be prevented (see <funclink>SetPlayerTeam</funclink>). From 4.9.6.0 CR.</col>
</row>
<row id="OnTeamSwitch">
<literal_col>OnTeamSwitch</literal_col>
<col>int player, int new_team, int old_team</col>
<col>Callback in game goal, rule, and environment objects and in the scenario script. Called when a player has successfully switch from old_team to new_team (see <funclink>SetPlayerTeam</funclink>). Since 4.9.6.0 CR.</col>
</row>
</table>
<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 Clonk</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 by_object</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 target, bool grab</col>
<col>Wenn das Objekt ein anderes Objekt anfasst oder loslässt.</col></row>
<row id="Grabbed"><col>Grabbed</col><col>object by_object, bool grab</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 target</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 change, int by_player</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 by_player</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 by_player</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 by_object</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 by_object</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 by_object</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 command, object target, int x, int y, object target2, int data, object command_object</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 command, object target, int x, int y, object target2, any 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 obj, int x, int y</col>
<col>Wenn ein durch die Wegfindungsroutine gesteuertes Objekt (obj) die Transferzone dieses
Objekts zum Zielpunkt x/y 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 selection, object menu_object</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 target</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 container</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 level, object by</col>
<col>Wenn das Objekt von einem anderen Objekt geschlagen oder getroffen wird.</col></row>
<row id="QueryCatchBlow"><col>QueryCatchBlow</col><col>object by</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 cause</col>
<col>Wenn ein Leitungsobjekt unterbrochen wird. cause: 0 durch Bewegung, 1 durch fehlendes oder unvollständiges Zielobjekt.</col></row>
<row id="BuildNeedsMaterial"><col>BuildNeedsMaterial</col><col>id material_definition, int amount</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 deselect, bool cursor_only</col>
<col>Bei Änderung der Crewauswahl. cursor_only gibt an, ob nur das Mannschaftsmitglied angewählt wurde, welches den Cursor hat.</col></row>
<row id="GetObject2Drop"><col>GetObject2Drop</col><col>object for_collection_of_object</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 index, object menu_object</col>
<col>Wenn ein Menueintrag ausgewählt wurde.</col></row>
<row id="CalcValue"><col>CalcValue</col><col>object in_base, int for_player</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 in_base, int for_player</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 item, int value</col>
<col>Rückgabewert ist Einkaufspreis des Objekttyps.</col></row>
<row id="CalcSellValue"><col>CalcSellValue</col><col>object obj, int object_value</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 obj, bool put</col>
<col>Wenn das Objekt ein anderes Objekt (obj) aufgenommen hat (nur durch einsammeln oder anfassen und ablegen).</col></row>
<row id="Collection2"><col>Collection2</col><col>object obj</col>
<col>Wenn das Objekt ein anderes Objekt (obj) aufgenommen hat (immer, auch durch Scriptbefehl
Enter) </col></row>
<row id="Departure"><col>Departure</col><col>object container</col>
<col>Wenn das Objekt ein anderes Objekt (container) verlassen hat.</col></row>
<row id="Ejection"><col>Ejection</col><col>object obj</col>
<col>Wenn ein Objekt (obj) dieses Objekt verlassen hat (auch durch Scriptbefehl
Exit).</col></row>
<row id="Entrance"><col>Entrance</col><col>object container</col>
<col>Wenn das Objekt ein anderes Objekt (container) betreten hat.</col></row>
<row id="ActivateEntrance"><col>ActivateEntrance</col><col>object by_object</col>
<col>Wenn ein anderes Objekt versucht, das Objekt durch Entrance zu betreten.</col></row>
<row id="RejectCollect"><col>RejectCollect</col><col>id def, object obj</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 into_object</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 player</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 by_player</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 by_player</col>
<col>Wenn das Objekt verkauft wird. Ab CE.</col></row>
<row id="Purchase"><col>Purchase</col><col>int by_player, object buy_object</col>
<col>Wenn das Objekt gekauft wird. Ab CE.</col></row>
<row id="Recruitment"><col>Recruitment</col><col>int player</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 player, int new_team</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 player, int new_team, int old_team</col>
<col>Aufruf in Spielziel, -regel und Umweltobjekten und dem Szenarioscript. Wenn ein Spieler erfolgreich von old_team zu new_team 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()
</text>
<h id="Control-Funktionen">Control Functions</h>
<text>At every player command (left, right, up, down dig, throw, special) the engine calls the corresponding control function in the script of the currently controlled object of the player. If the function is defined and returns true, the internal handling of the player command is skipped. If the function is not defined or returns false, internal processing is done.</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 command, object target, int x, int y, object target2, int data, object command_object)
<text>If a clonk with this script is carrying a spear and the player hits the throw button, the clonk performs a special throw action. In this case, however, the command is not passed to the other selected clonks as usual. If the clonk does not carry a spear, the function returns 0 and the regular throwing action is performed.</text>
<text>Control functions are also transferred to grabbed (indirectly controlled) objects.</text>
<text>Single and double clicks: for each player command the engine will first call the simple variant of the control function (e.g. ControlDown) and then the more specific variant (i.e. ControlDownSingle or ControlDownDouble). When overloading control functions you should pay attention to catch the correct variant to overload.</text>
<text>ContainedControl: if a directly controlled object is contained in another object (container) the basic commands down (exit), throw (put), up (buy at base), dig (sell at base) are evaluated internally first. Then the command is passed to the container for special handling there. Exception: the commands ControlSpecial, ControlSpecial2, and ControlWheepUp/Down are only direct commands and are not passed to the container.</text>
<text>ControlCommnd: the engine also performs <a href="#ObjektCallsderEngine">object calls</a> for independently executed commands which have been given directly by the player (i.e. by mouse control).</text>
<code>func ControlCommand(string command, object target, int x, int y, object target2, int data, object command_object)
{
// Ein Kommando mit Zielobjekt
<emlink href="script/fn/if.html">if</emlink> (target)
<emlink href="script/fn/Message.html">Message</emlink>(&quot;Befehl: %s Ziel: %s Koordinaten: %d/%d&quot;, command, target->GetName(), x, y);
<emlink href="script/fn/Message.html">Message</emlink>(&quot;Befehl: %s Ziel: %s Koordinaten: %d/%d&quot;, command, target-&gt;GetName(), x, y);
// Ein Kommando ohne Zielobjekt
else
<emlink href="script/fn/Message.html">Message</emlink>(&quot;Befehl: %s Koordinaten: %d/%d&quot;, command, x, y);
@ -262,52 +372,23 @@ gegeben wurden (z.B. durch Maussteuerung).</text>
<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. "command_object" 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 caller)
<text>By returning true the command can be intercepted and internal handling can be prevented. "command_object" is always the object receiving the command, even if the call was transferred by a contained object (see VehicleControl in <emlink href="definition/defcore.html">DefCore</emlink>). The script command <emlink href="script/fn/SetCommand.html">SetCommand</emlink> does not cause ControlCommand calls.</text>
<text>ControlCommand calls are also transferred to grabbed objects or objects controlled from the inside if these have the VehicleControl flag set. This transferred call is made after the ControlCommand call to the clonk, but before internal handling. So the vehicle, too, has the opportunity to intercept and overload the command.</text>
<text>ControlWheelUp and ControlWheelDown are generated by the mouse wheel (and only when not in an object menu). If they are not overloaded, they will cause ShiftContents commands. That in return could be intercepted in ControlContents.</text>
<text>ControlContents is called when an inventory change is made by direct mouse click, mouse wheel rotation, or a ShiftContents script command (e.g. in ControlSpecial or ControlSpecial2). Here you can perform special actions such as the arming of weapons or custom inventory sounds. If the function is intercepted with a return value true, the inventory change is prevented. Otherwise, the first object with the given id moves to the front of the inventory and a Selection call is made to the newly selected object. If the latter call is not overloaded, the sound effect "Grab" is played for the container object.</text>
<h id="Context-Funktionen">Context Functions</h>
<text>Context functions (Context_ in object scripts) are displayed as entries in the context menu of the object. When calling a context function, the engine will pass a pointer to the calling object as the first parameter (with crew members this is always the object itself). Context functions should always have a valid function description and be declared pubic.</text>
<code>public func ContextConstruction(object caller)
{
[Bauauftrag|Image=CXCN|Condition=HasKnowledge]
SetCommand(this, "Construct");
SetCommand(this, &quot;Construct&quot;);
return true;
}
</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>
<text>If the condition field is used, the context function is only displayed as a menu entry if the script function defined by the condition field (in this case HasKnowledge) is found in the object's script and returns true. The menu object is passed as the first parameter to the condition function.</text>
</part>
<author>sulai</author><date>2003-11</date>
<author>Sven2</author><date>2004-02</date>
<author>matthes</author><date>2004-07</date>
<author>Clonkonaut</author><date>2008-04</date>
</doc>

View File

@ -1,23 +1,10 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>Vertices</title>
<h id="Vertices">Vertices</h>
<text>Vertices are the collision points of an object. The outer shape of the object should be rougly marked by vertices. In most cases, four to five vertices are sufficient. Vertex coordinates are relative to the object center.<br/><br/>At these points it is checked whether the object has collided with solid material in the landscape. If an object collides with the landscape, it is slowed down, rotated and/or deviated into another direction. If a vertex gets covered by solid material teh object will be stuck. The friction value of a vertex determines how easily the object will slide at that corner.<br/><br/>If a vertex contains a direction indication (see <emlink href="definition/cnat.html">CNAT - ContactAttachment</emlink>) and ContactCalls are specified, the corresponding contact functions are called in the object script. In this way, an object might react to hitting a wall on the left, the ground at the bottom, etc.<br/><br/>If the object has a SolidMask you should take care that each vertex has at least one pixel of space from the solid area, else the object will be stuck in itself.</text>
<author>Sven2</author><date>2002-04</date>
</doc>

View File

@ -1,39 +1,35 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>Game Data</title>
<h id="Spieldaten">Game Data</h>
<text>The game data of clonk is stored in compressed group files which each contain one component or further group files.</text>
<dl>
<dt id="Spielerdateienc4p"><img height="16" src="../images/icon_player.gif" width="16"/>Player Files (c4p)</dt>
<dd>
<text>Player files contain personal settings, gained score and information about the crew. It may also contain a portrait file.</text>
</dd>
<dt id="Szenarienc4s"><img height="16" src="../images/icon_scenario.gif" width="16"/><emlink href="scenario/index.html">Scenarios (c4s)</emlink></dt>
<dd>
<text>Scenario files consist of an information core and additional components, such as a landscape, title image, description texts, sky graphics, a script, local object definitions, etc.</text>
</dd>
<dt id="Objektdefinitionenc4d"><img height="16" src="../images/icon_object_definition.gif" width="16"/><emlink href="definition/index.html">Object Definitions (c4d)</emlink></dt>
<dd>
<text>Object definitions contain an information core, graphic elements, action tables, script, and descriptive text. Also, <emlink href="particle/index.html">particles</emlink> are stored in object definition folders.</text>
</dd>
<dt id="Rundenordnerc4f"><img height="16" src="../images/icon_scenario_folder.gif" width="16"/><emlink href="folder/index.html">Scenario Folders (c4f)</emlink></dt>
<dd>
<text>Scenarios are grouped in scenario folders.</text>
</dd>
<dt id="Systemdatenc4g"><img height="16" src="../images/icon_system.gif" width="16"/>System Data (c4g)</dt>
<dd>
<text>Graphics, sound, and music of the original game are grouped in these folders and should not be modified.</text>
<text>Using the menu system, group files can be edited and/or converted to normal directories. Group file components can then be edited using common applications for text or graphics editing. Menu system and game engine can both load packed group files or unpacked directories directly.</text>
<text>Unpacking group files greatly increases speed while editing large or deeply nested groups.</text>
</dd>
</dl>
<author>Sven2</author><date>2002-04</date>
<author>matthes</author><date>2004-06</date>
</doc>

View File

@ -1,150 +1,164 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>FolderMap.txt</title>
<h id="FolderMaptxt">FolderMap.txt</h>
<part>
<text>From CR, scenario folders can also contain graphical folder maps for the selection of scenarios. These will be displayed only in the fullscreen menu, not in the editor. See the Western pack for samples.</text>
<text>
<table>
<caption id="SektionFolderMap">Section [FolderMap]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<col>ScenInfoArea</col>
<col>4 integers</col>
<col>Coordinates (x, y, width, height) of the frame displaying the scenario's description.</col>
</row>
<row>
<col>MinResX</col>
<col>Integer</col>
<col>If the current screen resolution width is less than this value, the folder map is not displayed and classic scenario selection is used. This is useful if your graphical map is high resolution and might turn out unuseable in lower resolutions.</col>
</row>
<row>
<col>MinResY</col>
<col>Integer</col>
<col>Minimum screen height (see MinResY).</col>
</row>
<row>
<col>FullscreenBG</col>
<col>Integer</col>
<col>If not 0, the background image is stretched to full screen size. Notice that button controls may still only be placed in the inner area of the map.</col>
</row>
</table>
</text>
<text>
<table>
<caption id="SektionAccessGfx">Any number of sections [AccessGfx]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<col>Access</col>
<col>String</col>
<col>If the player has gained the specified MissionAccess password, the graphical element specified in this section is displayed. This can be used to give access to certain scenarios only after other scenarios have been completed. See <funclink>GainMissionAccess</funclink>.</col>
</row>
<row>
<col>OverlayImage</col>
<col>String</col>
<col>Filename of the image to be displayed. The file should be available in the scenario folder.</col>
</row>
<row>
<col>Area</col>
<col>4 integers</col>
<col>Screen area in which to display the image. The coordinates are relative to the <emlink href="#background">background image</emlink>.</col>
</row>
</table>
</text>
<text>
<table>
<caption id="SektionScenario">Any number of sections [Scenario]</caption>
<rowh>
<literal_col>Value</literal_col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<literal_col>File</literal_col>
<col>String</col>
<col>Scenario file (including .c4s extension) to be started by this section. You should create a [Scenario] section for each scenario in the scenario folder. Only those scenario sections are displayed for which MissionAccess (see <funclink>GainMissionAccess</funclink>) is displayed.</col>
</row>
<row>
<literal_col>BaseImage</literal_col>
<col>String</col>
<col>Image to be displayed if the scenario is not selected. The image file should be available in the scenario folder.</col>
</row>
<row>
<literal_col>OverlayImage</literal_col>
<col>String</col>
<col>Image to be displayed if the scenario is selected or hovered over with the mouse. The image file should be available in the scenario folder.</col>
</row>
<row>
<literal_col>Area</literal_col>
<col>4 integers</col>
<col>Screen area in which to display the selection button. The coordinates are relative to the <emlink href="#background">background image</emlink>.</col>
</row>
<row>
<literal_col>Title</literal_col>
<col>String</col>
<col>Text to be displayed on the selection button. If no localization is needed, you can also integrate the text directly into the base image or overlay image. If you specify the string TITLE, the localized title is loaded from the corresponding scenario.</col>
</row>
<row>
<literal_col>TitleFontSize</literal_col>
<col>Integer</col>
<col>Font size of the title. Relative to the unstretched background image.</col>
</row>
<row>
<literal_col>TitleColorInactive</literal_col>
<col>Integer</col>
<col>DWORD color value of the unselect button title.</col>
</row>
<row>
<literal_col>TitleColorActive</literal_col>
<col>Integer</col>
<col>DWORD color value of the unselect button title.</col>
</row>
<row>
<literal_col>TitleOffX</literal_col>
<col>Integer</col>
<col>Horizontal offset of the left aligned or centered position of the title from the left edge of the selection button.</col>
</row>
<row>
<literal_col>TitleOffY</literal_col>
<col>Integer</col>
<col>Vertical offset of the title from the upper edge of the selection button.</col>
</row>
<row>
<literal_col>TitleAlign</literal_col>
<col>Integer</col>
<col>Text alignment: 0 left, 1 centered, 2 right aligned.</col>
</row>
<row>
<literal_col>TitleUseBookFont</literal_col>
<col>Boolean</col>
<col>0 or 1. If 0, the regular in-game font is used. If 1, the shadow-less font of the fullscreen menu is used.</col>
</row>
</table>
</text>
<h id="order">Element Order</h>
<text>AccessGfx images drawn under the scenario selection buttons. Selection buttons appear in the order in which they are specified in the file. Thus you should specifiy sections in a meaningful order, from left to right and top to bottom as this will affect the tab stepping sequence when controlling the dialog with the keyboard or gamepad. Also, you should take care not to overlap any buttons.</text>
<h id="background">Background image</h>
<text>If the scenario folder contains a folder map, an image file of name FolderMap.png/.jpg/.jpeg/.bmp is expected. The recommended size of this image depends on the screen resolution of the end user:</text>
<text>
<table>
<rowh>
<col>Resolution</col>
<col>Size of the folder map.</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>The image is always stretched to the full available screen area. All coordinates given for section elements are relative to the unstretched background image.</text>
<h id="devel">Useful Hints</h>
<text>For testing purposes a folder map can be loaded from an unpacked scenario folder and reloaded an runtime using F5. If the classic scenario selection appears instead of the folder map, an error has occured in the folder map declaration, such as missing image files. With debug mode activated, there will also be an error message in Clonk.log.</text>
</part>
<author>Sven2</author><date>2006-09</date>
</doc>

View File

@ -1,64 +1,75 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>Scenario Folder</title>
<h id="Folders">Scenario Folder</h>
<part>
<text>Scenario folders are used to group a number of scenarios. Scenario folders are displayed with a book icon in the startup screen which can then be opened to list contained scenarios.</text>
<h id="Components">Scenario Components (c4s)</h>
<dl>
<dt id="c4s"><img height="16" src="../../images/icon_scenario.gif" width="16"/><emlink href="scenario/index.html">*.c4s</emlink></dt>
<dd>
<text>Scenario folders can contain any number of scenarios.</text>
</dd>
<dt id="c4f"><img height="16" src="../../images/icon_scenario_folder.gif" width="16"/>*.c4f</dt>
<dd>
<text>Scenario folders can also contain other scenario folders.</text>
</dd>
<dt id="Title"><img height="16" src="../../images/icon_image.gif" width="16"/>Title.png/Title.bmp</dt>
<dd>
<text>The title picture of the scenario folder in png format. Size: 200x150 pixel. The older bmp format with 256 colors is still supported as well.</text>
</dd>
<dt id="Iconbmp"><img height="16" src="../../images/icon_image.gif" width="16"/>Icon.bmp/Icon.png</dt>
<dd>
<text>The icon of a scenario folder which is to be displayed instead of the book icon. BMP format (obsolete): 16x16 pixels, color RGB 255 0 255 (purple) is transparent. PNG format: 24x24 pixels, alpha channel is used for transparency.</text>
</dd>
<dt id="Desc__rtf"><img height="16" src="../../images/icon_text.gif" width="16"/>Desc*.rtf</dt>
<dd>
<text>The description text of the scenario in rich text format (rtf). '__' is to be replaced by the two digit language code, e.g. DE for German and US for American English. Multiple descriptions for several languages can be contained in a scenario file of which the game will automatically load the one appropriate for the configured language.</text>
<text>The font of the description text is set internally on display. The character size in the file should be 10pt for headings and 8pt for text. Images or other rtf tags are ignored.</text>
<text>It is recommended to edit this file using a small scale rtf editor such as WordPad.exe in Windows and not a full-blown word processor such as Word as these will stuff kilobytes of unneeded extra information into the rtf file.</text>
</dd>
<dt id="Titletxt"><img height="16" src="../../images/icon_text.gif" width="16"/>Title.txt</dt>
<dd>
<text>By default, the title of a scenario is set when renaming the scenario in the menu system and stored in section [Head] of Scenario.txt. The file name of the scenario group file may differ. For language dependent titles you should create a Title.txt component with the appropriate contents:</text>
<code>DE:Meine Rundensammlung
US:My scenario collection</code> <text>Important: No quotation marks and special characters should be used.</text>
</dd>
<dt id="FolderMaptxt"><img height="16" src="../../images/icon_text.gif" width="16"/><emlink href="folder/foldermap.html">FolderMap.txt</emlink></dt>
<dd>
<text>From CR, scenario folders can also contain graphical folder maps for the selection of scenarios.</text>
</dd>
<dt id="Loader"><img height="16" src="../../images/icon_image.gif" width="16"/>Loader*.png/Loader*.bmp</dt>
<dd>
<text>Scenario folders can contain local loader screens. Also see <emlink href="scenario/index.html">scenarios</emlink>. The <emlink href="scenario/index.html#UeberladungenC4S">overloading rules</emlink> apply.</text>
</dd>
<dt id="Materialc4g"><img height="16" src="../../images/icon_system.gif" width="16"/><emlink href="material/index.html">Material.c4g</emlink></dt>
<dd>
<text>Scenario folders can contain local material definitions. Also see <emlink href="scenario/index.html#Materialc4g">scenarios</emlink>. The <emlink href="scenario/index.html#UeberladungenC4S">overloading rules</emlink> apply.</text>
</dd>
<dt id="Graphicsc4g"><img height="16" src="../../images/icon_system.gif" width="16"/>Graphics.c4g</dt>
<dd>
<text>Scenario folders can overload individual entries of the global Graphics.c4g group. See <emlink href="#UeberladungenC4S">overloading rules</emlink>.</text>
</dd>
<dt id="Musicc4g"><img height="16" src="../../images/icon_system.gif" width="16"/>Music.c4g</dt>
<dd>
<text>Scenario folders can contain local music files. Also see <emlink href="scenario/index.html#Musicc4g">scenarios</emlink>. The <emlink href="scenario/index.html#UeberladungenC4S">overloading rules</emlink> apply.</text>
</dd>
<dt id="c4d"><img height="16" src="../../images/icon_object_definition.gif" width="16"/><emlink href="definition/index.html">*.c4d</emlink></dt>
<dd>
<text>Scenario folders can contain object definitions, which will then be available in all scenarios contained in the folder.Also see <emlink href="scenario/index.html#c4d">scenarios</emlink>. The <emlink href="scenario/index.html#UeberladungenC4S">overloading rules</emlink> apply.</text>
</dd>
<dt id="Infotxt"><img height="16" src="../../images/icon_text.gif" width="16"/>Info.txt</dt>
<dd>
<text>Here an author can store additional information about the development of his scenario, his email address, or other information he wants to share with other developers.</text>
</dd>
<dt id="Authortxt"><img height="16" src="../../images/icon_text.gif" width="16"/>Author.txt</dt>
<dd>
<text>Should contain the name of the author in format "Firstname Lastname (Nick)" and is used to maintain the name of the original author, if the scenario group file is edited by another developer at a later point in time. The name stored here is only displayed, however, if the scenario was edited by RedWolf Design. This feature is mainly used for contest scenarios.</text>
</dd>
</dl>
</part>
<author>Sven2</author><date>2006-09</date>
</doc>

View File

@ -1,17 +1,15 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>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">Hinweise</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>
<title>Developer Mode</title>
<h>Clonk Developer Mode</h>
<img src="../images/cpem.gif" height="52" id="cpem" width="52" />
<text>The Clonk developer mode grants full access to all game content in Clonk: scenarios, object definitions, player files, and additional group files. Existing data can be modified and new elements can be created.</text>
<text>Self created game content can be publicly released and made available to other players. However, all content should be thoroughly tested and free of bugs before publishing.</text>
<h id="Nutzungsbedingungen">Terms of use</h>
<text>Use the developer mode at your own risk. No support can be given by RedWolf Design. The developer mode is available to registered players only.</text>
<text>Through improper use you can not only destroy all the fun in the game, but also make the whole game unplayable. In order to successfully use the developer mode, basic programming and graphics skills as well as general computer expertise are required. Those who are unsure should leave their hands off it!</text>
<text>Anybody using the advanced editing features should do so with great care and responsibility and try to produce useful extensions to the game, thus serving the whole community.</text>
</doc>

View File

@ -1,103 +1,55 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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
<title>Localization</title>
<h>Localization</h>
<part>
<text>It is possible to support multiple languages in Clonk objects and scenarios. To do this, certain components can be loaded language dependantly.</text>
<h>Adaptable Elements</h>
<dl>
<dt id="Titletxt"><img height="16" src="../images/icon_text.gif" width="16"/>Title.txt</dt>
<dd>
<text>The <emlink href="scenario/index.html#Titletxt">Title.txt</emlink> component can be used in scenarios and object folders to define the title for each language.</text>
<text>Each line has a language abbreviation bevore the title. For example:</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)
</code> <text>In external language packs the Title*.txt should be at the corresponding directory position (whereas * is replaced with the used language abbreviation), which can contain the title for that language. Here is an example for a TitleFR.txt:</text>
<code>FR:Les wipfes moerderesque attaquent</code> <text>If an entry for the choosen language is present, the Title entry from the <emlink href="scenario/scenario.html#SektionHead">Scenario.txt</emlink> is replaced by the corresponding name.</text>
<text>Important: No quotation marks and special characters should be used.</text>
</dd>
<dt id="Namestxt"><img height="16" src="../images/icon_text.gif" width="16"/>Names.txt</dt>
<dd>
<text>With the <emlink href="definition/index.html#Namestxt">Names.txt</emlink> component the name of an object can be translated. It works the same way as a Title.txt.</text>
<text>If there is an entry for the chosen language, the Name entry from the <emlink href="definition/defcore.html#SektionDefCore">DefCore.txt</emlink> is overwritten.</text>
</dd>
<dt id="Desctxt"><img height="16" src="../images/icon_text.gif" width="16"/>Desc*.txt / Desc*.rtf</dt>
<dd>
<text>To customize the description of an <emlink href="definition/index.html#Desc__txt">object definition</emlink> or a <emlink href="scenario/index.html#Desc__rtf">scenario</emlink> language dependant, a Desc*.txt/.rtf in the definition and scenario respectively has to be present. (The * is a placeholder for the language abbreviation)</text>
</dd>
<dt id="Sciptc"><img height="16" src="../images/icon_text.gif" width="16"/>Script.c, Teams.txt</dt>
<dd>
<text>In order to insert language-dependant tests into scripts, so-called string tables are used. Instead of the text, only references to it should be inserted into the script. The references are searched in the string table, which should be placed in the same folder as the referencing script and named StringTbl*.txt (where * must be substituted by the language code).</text>
<text>The reference in the script is composed of a name for the string (string-ID), surrounded by dollar signs ("$"). <br/> For example:</text>
<code>protected func Activate(pCaller)
{
[$DescActivate$]
pCaller-><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
pCaller-&gt;<emlink href="script/fn/Message.html">Message</emlink>(&quot;$MsgYourPosition$ %d / %d&quot;, <emlink href="script/fn/GetX.html">GetX</emlink>(pCaller), <emlink href="script/fn/GetX.html">GetY</emlink>(pCaller));
}</code> <text>In this case, two strings with the names "DescActivate" and "MsgYourPosition" are being inserted.</text>
<text>An appropriate StringTblDE.txt (for German language) could look like the following:</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
MsgYourPosition=Deine Position ist:</code> <text>In this object the Activate function has the description "Position bestimmen". Executing it yields a message "Deine Position ist: 252 / 352". The string table also contains two comments starting with a '#'-sign. Those are ignored.</text>
<text>For the sake of completeness, here is a suitable 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>
MsgYourPosition=Your position is:</code> <text>This would yield the message "Your position is: 252 / 352", if English language were selected.</text>
</dd>
</dl>
</part>
<author>PeterW</author><date>2002-04</date>
<author>matthes</author><date>2004-04</date>
</doc>

View File

@ -1,333 +1,447 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>x, y</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>landscape_x, landscape_y</col><col>Integer</col><col>Position in der Landschaft, auf die das Material trifft.</col></row>
<row><col>5,6</col><col>xdir, ydir</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>pxs_material</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>landscape_material</col><col>Integer</col><col>Materialnummer des festen Materials.</col></row>
<row><col>9</col><col>event</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>
<title>Material Definitions (c4m)</title>
<h id="c4m">Material Definitions (c4m)</h>
<part>
<text>Material definitions determine looks and behaviour of landscape materials.</text>
<text>
<table>
<caption id="SektionMaterial">Section [Material]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<col>Name</col>
<col>String (max. 15)</col>
<col>Name of material.</col>
</row>
<row>
<col>Color</col>
<col>3 x 3 integers</col>
<col>The three component colors of the material as RGB RGB RGB (each 0-255).</col>
</row>
<row>
<col>ColorAnimation</col>
<col>Integer</col>
<col>0 oder 1. Color animation.</col>
</row>
<row>
<col>Shape</col>
<col>Integer</col>
<col>Shape of surface: 0 smooth, 1 smooth on top, 2 semi rough, 3 rough.</col>
</row>
<row>
<col>Density</col>
<col>Integer</col>
<col>Density: 50 solid, 25 liquid (other values not allowed).</col>
</row>
<row>
<col>Friction</col>
<col>Integer</col>
<col>0-100. Friction.</col>
</row>
<row>
<col>DigFree</col>
<col>Integer</col>
<col>0 oder 1. Determines wether the material can be dug into.</col>
</row>
<row>
<col>BlastFree</col>
<col>Integer</col>
<col>0 oder 1. Determines whether the material can be blasted away.</col>
</row>
<row>
<col>Blast2Object</col>
<col>definition id</col>
<col>Type of objects created by blasting this material.</col>
</row>
<row>
<col>Dig2Object</col>
<col>definition id</col>
<col>Type of objects dug out from this material.</col>
</row>
<row>
<col>Dig2ObjectRatio</col>
<col>Integer</col>
<col>ca. 100-500. Mass ratio when digging out objects.</col>
</row>
<row>
<col>Dig2ObjectRequest</col>
<col>Integer</col>
<col>0 or 1. If 1, objects are only dug out on request.</col>
</row>
<row>
<col>Blast2ObjectRatio</col>
<col>Integer</col>
<col>ca. 100-500. Mass ratio when blasting free objects.</col>
</row>
<row>
<col>Blast2PXSRatio</col>
<col>Integer</col>
<col>Mass ratio when material pixels are blasted free.</col>
</row>
<row>
<col>Instable</col>
<col>Integer</col>
<col>0 oder 1. Stability.</col>
</row>
<row>
<col>MaxAirSpeed</col>
<col>Integer</col>
<col>ca. 10-100. Maximum falling speed.</col>
</row>
<row>
<col>MaxSlide</col>
<col>Integer</col>
<col>Maximum side offset when sliding.</col>
</row>
<row>
<col>WindDrift</col>
<col>Integer</col>
<col>Horizontal drift by wind.</col>
</row>
<row>
<col>Inflammable</col>
<col>Integer</col>
<col>Inflammability.</col>
</row>
<row>
<col>Incindiary</col>
<col>Integer</col>
<col>This material incinerates objects.</col>
</row>
<row>
<col>Corrode</col>
<col>Integer</col>
<col>This material corrodes other materials.</col>
</row>
<row>
<col>Corrosive</col>
<col>Integer</col>
<col>This material can be corroded.</col>
</row>
<row>
<col>Extinguisher</col>
<col>Integer</col>
<col>This material will extinguish burning objects.</col>
</row>
<row>
<col>Soil</col>
<col>Integer</col>
<col>Plants grow on this material.</col>
</row>
<row>
<col>TempConvStrength</col>
<col>Integer</col>
<col>Strength of temperature conversion.</col>
</row>
<row>
<col>BlastShiftTo</col>
<col>String (max. 15)</col>
<col>Material changes into another material when blasted.</col>
</row>
<row>
<col>InMatConvert</col>
<col>String (max. 15)</col>
<col>Entering this material the material will change into...</col>
</row>
<row>
<col>InMatConvertTo</col>
<col>String (max. 15)</col>
<col>...this material...</col>
</row>
<row>
<col>InMatConvertDepth</col>
<col>Integer</col>
<col>...when at the given depth.</col>
</row>
<row>
<col>AboveTempConvert</col>
<col>Integer</col>
<col>Above this temperature the material will change into...</col>
</row>
<row>
<col>AboveTempConvertTo</col>
<col>String (max. 15)</col>
<col>...this material.</col>
</row>
<row>
<col>AboveTempConvertDir</col>
<col>Integer</col>
<col>Direction of temperature conversion: 0 bottom up, 1 top down</col>
</row>
<row>
<col>BelowTempConvert</col>
<col>Integer</col>
<col>Below this temperature the material will change into...</col>
</row>
<row>
<col>BelowTempConvertTo</col>
<col>String (max. 15)</col>
<col>...this material.</col>
</row>
<row>
<col>BelowTempConvertDir</col>
<col>Integer</col>
<col>Direction of temperature conversion: 0 bottom up, 1 top down</col>
</row>
<row>
<col>Alpha</col>
<col>6 integers</col>
<col>Transparency of the three material colors.</col>
</row>
<row>
<col>Placement</col>
<col>Integer</col>
<col>0-100. This Value is used for lighting of the landscape and is usually determined automatically from the other material values.</col>
</row>
<row>
<col>TextureOverlay</col>
<col>String (max. 15)</col>
<col>Standard texture for this material used by the landscape generator.</col>
</row>
<row>
<col>OverlayType</col>
<col>Integer</col>
<col>Bit mask for texture calculation on this material. Bit 0 (1): exact (no zoom), bit 1 (2): no texture, bit 2 (4): extra large zoom, bit 3 (8): calculate texture based on gray scale.</col>
</row>
<row>
<col>PXSGfx</col>
<col>String (max. 30 chars)</col>
<col>Graphics used for loose material pixels. This graphic should be available as material texture.</col>
</row>
<row>
<col>PXSGfxRt</col>
<col>4 integers</col>
<col>Target rectangle for the graphics of loose material pixels. Additional phases on the right and below the specified rectangle will be used. The rectangle should always start in the top left corner and use the complete texture size.</col>
</row>
</table>
</text>
</part>
<part>
<h>User defined reaction</h>
<text>In addition to default reactions, every material can define custom reactions which are executed when the material passes another material as a free pixel (e.g. precipitation or particles after explosios) or by material movement (e.g. when a lake floods a tunnel).</text>
<text>
<table>
<caption id="SektionReaction">In the .c4m-file: Any number of sections [Reaction]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<literal_col>Type</literal_col>
<col>String</col>
<col>Type of reaction that should happen. See <emlink href="material/c4m.html#ReactTypes">Table</emlink>.</col>
</row>
<row>
<literal_col>TargetSpec</literal_col>
<col>String</col>
<col>Target material, with which the loose material reacts. See <emlink href="material/c4m.html#TargetSpecs">material specifications</emlink>.</col>
</row>
<row>
<literal_col>ScriptFunc</literal_col>
<col>String</col>
<col>Reaction type script only: Name of the script function, which determines the behaviour.</col>
</row>
<row>
<literal_col>ExecMask</literal_col>
<col>Integer</col>
<col>Bitmask, determining in which situation the reaction is to be executed. Bit indices are the <emlink href="material/c4m.html#ReactEvents">reaction events</emlink>. Default value -1 for all events.</col>
</row>
<row>
<literal_col>Reverse</literal_col>
<col>Boolean</col>
<col>Usually, the reaction defines what happens when loose material of the definition, in which the reaction is defined, hits solid material of the type specified in TargetSpec. If Reverse is set, this definition is swapped.</col>
</row>
<row>
<literal_col>InverseSpec</literal_col>
<col>Boolean</col>
<col>If true, the reaction will be defined for all other materials (including "Sky"), which do not fulfill the condition in TargetSpec.</col>
</row>
<row>
<literal_col>CheckSlide</literal_col>
<col>Boolean</col>
<col>If true, the standard behaviour (Bouncing off the ground and sliding according to MaxSlide) will be executed before the call is done.</col>
</row>
<row>
<literal_col>Depth</literal_col>
<col>Integer</col>
<col>Reaction type Convert only: Depth in target material required for conversion.</col>
</row>
<row>
<literal_col>ConvertMat</literal_col>
<col>String</col>
<col>Reaction type Convert only: Material, into which the loose material is converted. If sky is specified, the material will vanish.</col>
</row>
<row>
<literal_col>CorrosionRate</literal_col>
<col>Integer</col>
<col>Reaction type Corrode only: Chance of corrosion.</col>
</row>
</table>
</text>
<text>
<table>
<caption id="ReactEvents">Reaction events</caption>
<rowh>
<col>Name</col>
<col>Value</col>
<col>Event</col>
</rowh>
<row>
<col>MEE_PXSPos</col>
<col>0</col>
<col>Check before each movement frame of a loose material pixel against its background material</col>
</row>
<row>
<col>MEE_PXSMove</col>
<col>1</col>
<col>Check against each pixel that a loose material pixel passes during its movemvent</col>
</row>
<row>
<col>MEE_MassMove</col>
<col>2</col>
<col>During larger material movements (e.g. when a lake is flooded into a tunnel): Check of the moving material against the material over which it's moving</col>
</row>
</table>
</text>
<text>
<table>
<caption id="ReactTypes">Reaction types</caption>
<rowh>
<col>Name</col>
<col>Behaviour</col>
</rowh>
<row>
<col>Script</col>
<col>For each collision, the script function specified in ScriptFunc is called.</col>
</row>
<row>
<col>Convert</col>
<col>The material is converted into another. Comparable to the behaviour of snow in water.</col>
</row>
<row>
<col>Poof</col>
<col>Both the loose and the solid material are removed. Additionally, there's a 1:3 chance of creating a small smoke cloud, and a 1:3 chance that the sound "Pshshsh" is played. Comparable to the behaviour of water in lava.</col>
</row>
<row>
<col>Corrode</col>
<col>The loose material corrodes the target material at the chance CorrosionRate, and vanishes itself if it does so. If corrosion is performed, a small smoke cloud is created at a chance of 1:5, and the sound "Corrode" is played at a chance of 1:20. Comparable with the behaviour of acid on earth.</col>
</row>
<row>
<col>Insert</col>
<col>The loose material is inserted as solid material. Comparable to the behaviour of any material that hits a material of equal or higher density.</col>
</row>
</table>
</text>
<text>
<table>
<caption id="TargetSpecs">Material specifications</caption>
<rowh>
<col>Name</col>
<col>Materials</col>
</rowh>
<row>
<col>Material name</col>
<col>If the specification equals the name of an existing material, this material will be used.</col>
</row>
<row>
<col>All</col>
<col>All materials, including "Sky"</col>
</row>
<row>
<col>Solid</col>
<col>All solid materials</col>
</row>
<row>
<col>SemiSolid</col>
<col>All solid and liquid materials</col>
</row>
<row>
<col>Background</col>
<col>All background materials, including "Sky"</col>
</row>
<row>
<col>Sky</col>
<col>The background material.</col>
</row>
<row>
<col>Incindiary</col>
<col>All materials to be incinerated.</col>
</row>
<row>
<col>Extinguisher</col>
<col>All extinguishing materials.</col>
</row>
<row>
<col>Inflammable</col>
<col>All flammable materials.</col>
</row>
<row>
<col>Corrosive</col>
<col>All materials which can be corroded.</col>
</row>
<row>
<col>Corrode</col>
<col>All corrosive materials.</col>
</row>
</table>
</text>
<h>Reaction type 'Script'</h>
<text>
This resource-intensive method can be used to define the material behaviour freely. The script function should be defined globally and have the following parameters:
<table>
<rowh>
<col>Parameter number(s)</col>
<col>Name(s)</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<col>1,2</col>
<col>x, y</col>
<col>Integer</col>
<col>Position of the loose material. The parameters may be modified in order to move the material pixel.</col>
</row>
<row>
<col>3,4</col>
<col>landscape_x, landscape_y</col>
<col>Integer</col>
<col>Position in the landscape, on which the material hits.</col>
</row>
<row>
<col>5,6</col>
<col>xdir, ydir</col>
<col>Integer</col>
<col>Speed (in 1/100px) of the movement of the material. May be modified in order to change the material speed. Not for MassMover.</col>
</row>
<row>
<col>7</col>
<col>pxs_material</col>
<col>Integer</col>
<col>Material number of the loose material. Useful if the same reaction function is used for multiple materials</col>
</row>
<row>
<col>8</col>
<col>landscape_material</col>
<col>Integer</col>
<col>Material number of the solid material.</col>
</row>
<row>
<col>9</col>
<col>event</col>
<col>Integer</col>
<col>See <emlink href="material/c4m.html#ReactEvents">Reaction events</emlink>.</col>
</row>
</table>
The return value of the function should be either 1 for removal or 0 for keeping the loose material.
</text>
</part>
<author>Sven2</author><date>2006-12</date>
</doc>

View File

@ -1,50 +1,52 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>Material Definitions</title>
<h id="Materialdefinitionen">Material Definitions</h>
<part>
<text>Using material definitions you can specify looks and behaviour of the landscape materials.</text>
<h id="MaterialdefinitionsKomponentenMaterialc4g">Material Definition Components (Material.c4g)</h>
<dl>
<dt id="TexMaptxt"><img height="16" src="../../images/icon_text.gif" width="16"/>TexMap.txt</dt>
<dd>
<text>Lookup table for color indices in static and dynamic landscapes. Colors 0-127 are matched to a material-texture-reference. Colors 128-255 are matched to the same list of references only these are marked 'underground'.</text>
<text>The engine will draw materials with a higher index above those with a lower index so that, e.g. using the standard table, rough chunks of earth will overlap water which has a smooth border. Mineral resources have an even higher index so that their rough border overlaps the earth and not the other way around. This is also the reason why there might be differing numbers of total pixels of a given material drawn than you might expect just from calculating the square sizes of the unzoomed map materials.</text>
<text>If a custom map fails with the message 'texture n undefined' you should define the specified texture in the TexMap. You should always use a paint program capable of editing indexed color palettes without modifying the palette (MS Paint is not suited for this).</text>
</dd>
<dt id="c4m"><img height="16" src="../../images/icon_material.gif" width="16"/><emlink href="material/c4m.html">*.c4m</emlink></dt>
<dd>
<text>The engine will accept up to 125 material definitions at a time. C4M files a simple text files. The materials Vehicle, Tunnel, Water, Snow, Granite, Sand, and Earth must always be available.</text>
</dd>
<dt id="bmp"><img height="16" src="../../images/icon_image.gif" width="16"/>*.png/*.bmp</dt>
<dd>
<text>There can be any number of textures in PNG or uncompressed Windows BMP format (with 256 colors) in any material group. Width and height of each bitmap must be powers of 2 (that is 16, 32, 64, 128, 256, etc.) With the old BMP format only the first three colors of the texture bitmap may be used as to these the three material colors are applied.</text>
</dd>
</dl>
<h id="MaterialTexturReferenzen">Material-Texture-References</h>
<text>At numerous places in scenario definitions materials are specified with additional information on texture and amounts.</text>
<text>
<table>
<row>
<col>Simple material specification (using the default texture):</col>
<col><code>Earth</code></col>
</row>
<row>
<col>Material using an specified texture:</col>
<col><code>Earth-Rough</code></col>
</row>
<row>
<col>Material and texture with specified amount:</col>
<col><code>Gold-Rough=100</code></col>
</row>
<row>
<col>Multiple material definitions:</col>
<col><code>Earth-Smooth=10; Rock-Rough=5; Gold=2</code></col>
</row>
</table>
</text>
</part>
<author>Sven2</author><date>2002-04</date>
<author>matthes</author><date>2004-04</date>
</doc>

View File

@ -1,219 +1,223 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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 FadeDelay. Wenn das Partikel vollends ausgefadet ist, verschwindet es.</col>
</row>
<row>
<col>FadeDelay</col>
<col>Integer</col>
<col>Default ist 1.</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>
<title>Particle</title>
<h id="Partikel">Particle</h>
<part>
<text>Particles are lightweight objects which are not synchronized in a network game. This means that on the one hand you can create huge amounts of particles without slowing down the game too much but on the other hand there are only limited options for control of particle behaviour. If the particles are not sufficient for a given effect you have in mind, you can always use true objects instead.</text>
<text>If a particle is defined in a c4d group, any object definition located in the same group is ignored. This used to be a way to allow loading of placeholder options in the old graphics system which didn't support particles.</text>
<text>Particles are not stored in savegames and are designed for temporary visual effects only.</text>
<h id="PartikelKomponentenC4D">Particle Components (c4d)</h>
<dl>
<dt><img height="16" src="../../images/icon_text.gif" width="16"/>Particle.txt</dt>
<dd>
<text>Particle properties.</text>
</dd>
<dt id="Graphicspng"><img height="16" src="../../images/icon_image.gif" width="16"/>Graphics.png</dt>
<dd>
<text>Particle graphics.</text>
<text>The particle definition can also contain the known components of <emlink href="definition/index.html">object definitions</emlink> for describing the particle (e.g. Title.png, DescDE/US.txt, etc.)</text>
</dd>
</dl>
<h id="Particletxt">Particle.txt</h>
<text>This component contains the properties of the particle - as <emlink href="definition/defcore.html">DefCore.txt</emlink> does for <emlink href="definition/index.html">object definitions</emlink>.</text>
<text>
<table>
<caption id="SektionDefCore">Section [Particle]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<col>Name</col>
<col>String (max. 30 chars)</col>
<col>Name of the particle definition. This name is also used to refer to this particle type in scripts. For multi-language display in the menu system you should use the Names.txt component.</col>
</row>
<row>
<col>MaxCount</col>
<col>Integer</col>
<col>Maximum number of instances of this particle type. See <a href="#maxcount">instance control</a>.</col>
</row>
<row>
<col>MinLifetime</col>
<col>Integer</col>
<col>Only for smoke particles: lower limit for the lifetime, which ranges from MinLifetime to MaxLifetime.</col>
</row>
<row>
<col>MaxLifetime</col>
<col>Integer</col>
<col>Only for smoke particles: upper limit for the lifetime, which ranges from MinLifetime to MaxLifetime.</col>
</row>
<row>
<col>InitFn</col>
<col>String (max. 30 chars)</col>
<col>Identifier for the function used to initialize the particle. For valid functions see section <a href="#funcs">particle functions</a>.</col>
</row>
<row>
<col>ExecFn</col>
<col>String (max. 30 chars)</col>
<col>Identifier for the function used to execute the particle each frame. For valid functions see section <a href="#funcs">particle functions</a>.</col>
</row>
<row>
<col>DrawFn</col>
<col>String (max. 30 chars)</col>
<col>Identifier for the function used to draw the particle. For valid functions see section <a href="#drawfuncs">drawing functions</a>.</col>
</row>
<row>
<col>CollisionFn</col>
<col>String (max. 30 chars)</col>
<col>Identifier for the function called upon collision with the landscape. Also see <a href="#collision">collision checking</a>.</col>
</row>
<row>
<col>Face</col>
<col>6 integers</col>
<col>Target rectangle for the graphics within Graphics.png. See <a href="#face">particle graphics</a>.</col>
</row>
<row>
<col>YOff</col>
<col>Integer</col>
<col>Upper spatial limit for the particle. At this limit the particles will be deleted as if the landscape would end here. Only StdExec.</col>
</row>
<row>
<col>Delay</col>
<col>Integer</col>
<col>Delay between two animation phases. If Delay = 0 one randomly chosen phase is permanently displayed.</col>
</row>
<row>
<col>Repeats</col>
<col>Integer</col>
<col>Number of animation runs until the particle is destroyed.</col>
</row>
<row>
<col>Reverse</col>
<col>Integer</col>
<col>0 or 1. If 1 every seconds animation is played backwards.</col>
</row>
<row>
<col>FadeOutLen</col>
<col>Integer</col>
<col>If specified, this number of animation phases is truncated from the end and reserved for a death animation which is displayed after all repetitions of the standard animation.</col>
</row>
<row>
<col>FadeOutDelay</col>
<col>Integer</col>
<col>Delay between two animation phases of the death animation.</col>
</row>
<row>
<col>RByV</col>
<col>Integer</col>
<col>0 to 3. 0 for no particle rotation. If 1 the particle will be aligned to its direction of travel; the particle's up-side will be in front. If 2 the speed parameters only determine rotation; the particle will not move. If 3 a random rotation is applied (from 4.9.8.0).</col>
</row>
<row>
<col>GravityAcc</col>
<col>Integer</col>
<col>Effects of gravity. At 0 the particle is not affected by gravity, at 100 it is fully affected. Negative values are also possible.</col>
</row>
<row>
<col>WindDrift</col>
<col>Integer</col>
<col>Horizontal drift by wind. Same as the material property of the same name. Since CR 4.9.8.4.</col>
</row>
<row>
<col>VertexCount</col>
<col>Integer</col>
<col>0 or 1. If 1, <a href="#collision">collision detection</a> is done.</col>
</row>
<row>
<col>VertexY</col>
<col>Integer</col>
<col>Y offset of the collision checking point in percent. Also see <a href="#collision">collision detection</a>.</col>
</row>
<row>
<col>Additive</col>
<col>Integer</col>
<col>0 or 1. If 1, the particle is drawn additively.</col>
</row>
<row>
<col>AlphaFade</col>
<col>Integer</col>
<col>0 to 40. Rate of fade out per FadeDelay. A fully faded particle is removed.</col>
</row>
<row>
<col>FadeDelay</col>
<col>Integer</col>
<col>The default is 1.</col>
</row>
<row>
<col>Parallaxity</col>
<col>2 Integer</col>
<col>Parallaxity in x and y directions. 0 is locked with the viewport; 100 is default (locked with the landscape).</col>
</row>
<row>
<col>Attach</col>
<col>Integer</col>
<col>0 or 1. If 1 the particle is moving relative to its target object's position. From CE 4.95.4.</col>
</row>
</table>
</text>
<h id="attributes">Properties</h>
<text>Each particle has a position (x, y), horizontal and vertical impulse (xdir and ydir), life time (life), and two extra parameters (a and b). These are initialized by script and then processed by the <a href="#funcs">particle functions</a>. For more information see <a href="#funcs">particle functions</a> and <a href="#drawfuncs">drawing functions</a>.</text>
<h id="face">Graphics</h>
<text>The coordinates for the source rectangle within Graphics.png of a particle are comparable to the Face entry in an object's <emlink href="definition/actmap.html">ActMap.txt</emlink>. The coordinates only specify the first animation phase. All following animation phases should be located on the right (with smoke also below) of the initial phase. The animation length is then automatically determined from the image size. For the drawing offset you should usually specify half the particle size. An offset 0/0 would cause the particle graphics to be drawn below actual particle position.</text>
<text>If Delay = 0, a random animation phase is chosen on startup and maintained. The particle will exist until is falls out of the landscape.</text>
<h id="maxcount">Particle Amounts</h>
<text>For each particle type a maximum count is defined which is then also adjusted by the configuration setting for effect levels in the graphics options. As soon as half of the maximum amount of particles is created, new particles are only created based on random selected and the closer you get to the maximum value, the smaller the chance of new particle generation. This ensures a smooth approach to the actual limit.</text>
<h id="collision">Collision Detection</h>
<text>Particles can collide with the landscape. This is not very exact, however. Fast moving particles might pass through very thin layers of solid materials. If you need more precision, you should use objects instead.</text>
<text>Collision detection is only done in StdExec (i.e. not with smoke particles). For valid functions see <a href="#funcs">particle functions</a>. Collision detection is done at the particle center and only if VertexCount is specified. The point of detection can be shifted using VertexY. The specified values are in percent of the particle size, meaning VertexY=100 would check at the bottom of the particle. The visual size specified in Face doesn't affect this.</text>
<h id="funcs">Particle Functions</h>
<text>The behaviour of particles can be controlled by predefined particle functions. These are executed for initialization, then at each fram, and in case of <a href="#collision">collision</a> with the landscape.</text>
<dl>
<dt id="stdexec">StdExec</dt>
<dd>
<text>Standard function ExecFn for almost all particle types. The particle runs through an animation defined by Face, Delay, Repeats, Reverse, FadeOutLen, and FadeOutDelay and is then destroyed. The extra parameter defines the size of the particle in 1/10 pixels. b defines color modulation; if b = 0 no modulation is applied. aa as well as b are not modified by this function and will preserve the <a href="#control">initial</a> values. Also, the particle moves according to xdir and ydir while ydir is affected by gravity if GravityAcc is enabled.</text>
</dd>
<dt id="stdinit">StdInit</dt>
<dd>
<text>Standard function for InitFn to be used with StdExec.</text>
</dd>
<dt id="bounce">Bounce</dt>
<dd>
<text>Collision function: the particle will bounce back into the exact opposite direction.</text>
</dd>
<dt id="bouncey">BounceY</dt>
<dd>
<text>Collision function: the particle will bounce back vertically.</text>
</dd>
<dt id="stop">Stop</dt>
<dd>
<text>Collision function: the particle will stop.</text>
</dd>
<dt id="die">Die</dt>
<dd>
<text>Collision function: the particle will be destroyed.</text>
</dd>
<dt id="smokeexec">SmokeExec</dt>
<dd>
<text>Hard coded processing function for smoke particles. a is puff size; b is color modulation. Smoke graphics must be defined in 4 x 4 animation phases in Graphics.png of which the one on the lower right is used only rarely. The other animation phases are used evenly. Smoke always rises continuously until it collides with the landscape. If the life time has passed, the smoke particle fades out until it is deleted.</text>
</dd>
<dt id="smokeinit">SmokeInit</dt>
<dd>
<text>Hard coded initialization function for smoke to be used in conjunction with SmokeExec.</text>
</dd>
</dl>
<h id="drawfuncs">Drawing Functions</h>
<text>Functions that can be assigned to DrawFn.</text>
<dl>
<dt id="drawstd">Std</dt>
<dd>
<text>Standard function for most particles except smoke. The particle is drawn at position x/y with size a/5 x a/5 and color modulated with b.</text>
</dd>
<dt id="drawsmoke">Smoke</dt>
<dd>
<text>Drawing function for smoke.</text>
</dd>
</dl>
<h id="control">Control</h>
<text>External control of particles is very limited and only allows creation, global offset, and global removal. This is necessary as particles are not synchronized on computers throughout a network game and any deviation in particle handling would cause sync loss. Particles are created using <funclink>CreateParticle</funclink>.</text>
</part>
<author>Sven2</author><date>2002-04</date>
</doc>

View File

@ -1,207 +1,225 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE doc
SYSTEM '../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../clonk.xsl"?>
<doc>
<title>Spielersteuerung</title>
<h id="Controls">Spielersteuerung</h>
<part>
<text>Ab OC erlaubt die Engine, Steuerungskommandos fuer Spieler komplett frei zu definieren. Eigene Tastaturkommandos koennen hinzugefuegt oder veraendert werden. Alle unterstuetzten Eingabegeraete wie Maus, Tastatur und Gamepads koennen frei belegt werden und Kommandos koennen aus beliebigen Tastenkombinationen oder Sequenzen bestehen.</text>
<h id="ControlFiles">PlayerControls.txt</h>
<text>Alle Steuerungsbefehle, die ein Spieler an das Spiel geben kann, werden in der Datei PlayerControls.txt definiert. Die Standardtasten sowie deren Standardbelegung fuer verschiedene Eingabegeraete befinden sich in der globalen Definitionsdatei in der System.c4g. Objektdefinitionen und Szenarien koennen weitere Tasten in ihrer lokalen System.c4g hinzufuegen oder die Parameter vorhandener Steuerkommandos ueberladen**.</text>
<text>Zusaetzliche Dateien PlayerControls.txt koennen in Sprachpaketen abgelegt werden, um die Standardbelegungen der Tasten bei verschiedenen, geladenen Sprachen an die Tastaturen des jeweiligen Landes anzupassen**.</text>
<title>Player controls</title>
<h id="Controls">Player controls</h>
<part>
<text>Since OC the engine allows to define control commands completely arbitrarily. Own keyboard commands can be added and modified. All supported input devices such as mouse, keyboard and gamepads can be mapped freely and commands can consist of any key combinations or sequences.</text>
<h id="ControlFiles">PlayerControls.txt</h>
<text>All control commands which a player can send to the game are defined in the file PlayerControls.txt. The standard keys as well as their standard mapping for various input devices are contained in the global definition file in the Systems.c4g folder. Object definitions and scenarios can add more keys or overload the parameters of existing commands in their local Systems.c4g folder**.</text>
<text>Additional PlayerControls.txt files can be put in language packages to adapt the standard key mappings of different loaded languages to the keyboard of their respective country**.</text>
<part>
<h id="ControlDefs">Section [ControlDefs]</h>
<text>
Definition of possible player commands. Not valid in language packages. Subordinated to this section:
<text>
<table>
<caption id="ControlDef">Any number of sections [ControlDef]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<literal_col>Identifier</literal_col>
<col>String (max. 96 chars)</col>
<col>Internally used name for identification of the command. The command is referenced by that name in standard mappings and it is predefined in script as CON_Name. The name should therefore be a valid identifier in script, i.e. only consist of letters, numbers and _. Especially there should be no space characters or German umlauts. To avoid conflicts the same rules as for object IDs apply for definitions local to a certain scenario or object.</col>
</row>
<row>
<literal_col>GUIName</literal_col>
<col>String</col>
<col>Name which is shown to the player in the control configuration dialog and in control tooltips. Localized strings from the corresponding string table can be used ($Name$).</col>
</row>
<row>
<literal_col>GUIDesc</literal_col>
<col>String</col>
<col>Informative description which is displayed to the player in the control configuration dialog. Lokalisierte Zeichenketten koennen aus dem zugehoerigen StringTable refeenziert werden ($Name$).</col>
</row>
<row>
<literal_col>Global</literal_col>
<col>Boolean</col>
<col>If true this is a global definition, i.e. not assigned to a particular player. See <emlink href="playercontrols.xml#Globals">Global definitions</emlink>.</col>
</row>
<row>
<literal_col>Hold</literal_col>
<col>Boolean</col>
<col>If true this command is interpreted as a held command. Such a command remembers whether the control key is pressed and generates another scripting event when it is released. See <emlink href="playercontrols.xml#Hold">Held keys</emlink>.</col>
</row>
<row>
<literal_col>RepeatDelay</literal_col>
<col>Integer</col>
<col>Only valid if <em>Hold</em> is true. If greater than 0 then this key generates additional scripting events while pressed every that many number of frames. See <emlink href="playercontrols.xml#Repeat">Key repeats</emlink>.</col>
</row>
<row>
<literal_col>InitialRepeatDelay</literal_col>
<col>Integer</col>
<col>If specified then the delay of the first key repeat event can be changed. See <emlink href="playercontrols.xml#Repeat">Key repeats</emlink>.</col>
</row>
<row>
<literal_col>DefaultDisabled</literal_col>
<col>Boolean</col>
<col>If true then the command is deactivated in the normal case and needs to be activated by script first. This is useful for commands that are only required in special situations. See <emlink href="playercontrols.xml#Deactivate">Deactivated commands</emlink>.</col>
</row>
<row>
<literal_col>ExtraData</literal_col>
<col>C4ID</col>
<col>Optional ID that is passed to the script function. See <emlink href="playercontrols.xml#ExtraData">ExtraData</emlink>.</col>
</row>
<row>
<literal_col>SendCursorPos</literal_col>
<col>Boolean</col>
<col>If true then the GUI mouse position at the time of triggering the command will be sent as a separate CON_CursorPos command. If the mouse is not activated then the cursor position in GUI coordinates is transmitted.</col>
</row>
<row>
<literal_col>Action</literal_col>
<col>String</col>
<col>
Action to be executed for this command. Possible values:
<text>
<table>
<rowh>
<col>Value</col>
<col>Description</col>
</rowh>
<row>
<literal_col>None</literal_col>
<col>No action.</col>
</row>
<row>
<literal_col>Script</literal_col>
<col>Execution of the script function <em>PlayerControl</em>. See <emlink href="playercontrols.xml#Script">Script callbacks</emlink>. (Default value)</col>
</row>
<row>
<literal_col>Menu</literal_col>
<col>Open the player menu (asynchronous command).</col>
</row>
<row>
<literal_col>MenuOK</literal_col>
<col>Confirmation of the selected item in the player menu (asynchronous command).</col>
</row>
<row>
<literal_col>MenuCancel</literal_col>
<col>Close the player menu (asynchronous command).</col>
</row>
<row>
<literal_col>MenuLeft / MenuUp / MenuRight / MenuDown</literal_col>
<col>Navigation in the player menu (asynchronous command).</col>
</row>
</table>
</text>
<part>
<h id="ControlDefs">Sektion [ControlDefs]</h>
<text>Definition der moeglichen Spielerkommandos. Nicht gueltig in Sprachpaketen. Dieser Sektion untergeordnet:
<text><table>
<caption id="ControlDef">Beliebig viele Sektionen [ControlDef]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Identifier</col>
<col>Zeichenfolge (Max. 96 Zeichen)</col>
<col>Intern benutzter Name zur Identifikation des Kommandos. Das Kommando wird unter diesem Namen in Standardbelegungen referenziert und im Script als CON_Name-Konstante vordefiniert. Der Name sollte folglich im Script gueltig sein, d.h. nur aus Buchstaben, Zahlen sowie _ bestehen. Insbesondere sollten keine Leerzeichen oder deutsche Umlaute verwendet werden. Zur Vermeidung von Konflikten gelten in szenarienlokalen sowie Objektpaketlokalen Definitionen dieselben Benennungsregeln wie zur Vergabe von Objekt-IDs.</col>
</row>
<row>
<col>GUIName</col>
<col>Zeichenfolge</col>
<col>Name, der dem Spieler im Steuerungskonfigurationsdialog sowie in den Steuerungstooltips angezeigt wird. Lokalisierte Zeichenketten koennen aus dem zugehoerigen StringTable refeenziert werden ($Name$).</col>
</row>
<row>
<col>GUIDesc</col>
<col>Zeichenfolge</col>
<col>Erlaeuternde Beschreibung, die dem Spieler im Steuerungskonfigurationsdialog angezeigt wird. Lokalisierte Zeichenketten koennen aus dem zugehoerigen StringTable refeenziert werden ($Name$).</col>
</row>
<row>
<col>Global</col>
<col>Boolean</col>
<col>Wenn wahr, ist dies eine globale, d.h. keinem Spieler zugeordnete Definition. Siehe <emlink href="playercontrols.xml#Globals">Globale Definitionen</emlink>.</col>
</row>
<row>
<col>Hold</col>
<col>Boolean</col>
<col>Wenn wahr, wird das Kommando als ein gehaltenes Kommando interpretiert. Ein solches Kommando speichert, ob die Steuerungstaste gedrueckt ist und generiert beim Loslassen ein zusaetzliches Scriptereignis. Siehe <emlink href="playercontrols.xml#Hold">Gehaltene Tasten</emlink>.</col>
</row>
<row>
<col>RepeatDelay</col>
<col>Integer</col>
<col>Nur gueltig wenn <em>Hold</em> wahr. Wenn groesser 0, generiert die Taste im gehaltenen Zustand im angegebenen Abstand (in Frames) weitere Scriptereignisse. Siehe <emlink href="playercontrols.xml#Repeat">Tastenwiederholungen</emlink>.</col>
</row>
<row>
<col>InitialRepeatDelay</col>
<col>Integer</col>
<col>Wenn angegeben, kann die Wartezeit fuer das erste Tastenwiederholungsereignis geaendert werden. Siehe <emlink href="playercontrols.xml#Repeat">Tastenwiederholungen</emlink>.</col>
</row>
<row>
<col>DefaultDisabled</col>
<col>Boolean</col>
<col>Wenn wahr, ist das Kommando im Normalfall deaktiviert und muss erst per Script aktiviert werden. Nuetzlich fuer Kommandos, die nur in sehr speziellen Situationen benoetigt werden. Siehe <emlink href="playercontrols.xml#Deactivate">Deaktivierte Kommandos</emlink>.</col>
</row>
<row>
<col>ExtraData</col>
<col>C4ID</col>
<col>Optionale ID, die an die Scriptfunktion uebergeben wird. Siehe <emlink href="playercontrols.xml#ExtraData">ExtraData</emlink>.</col>
</row>
<row>
<col>SendCursorPos</col>
<col>Boolean</col>
<col>Wenn wahr, wird mit dem Kommando die GUI-Mausposition zum Zeitpunkt des Ausloesens des Kommandos als separates CON_CursorPos-Kommando gesendet. Ist keine Maus aktiviert, wird die Cursorposition in GUI-Koordinaten uebertragen.</col>
</row>
<row>
<col>Action</col>
<col>Zeichenfolge</col>
<col>Auszufuehrende Aktion bei diesem Kommando. Moegliche Werte:
<text><table>
<rowh>
<col>Wert</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>None</col>
<col>Keine Aktion.</col>
</row>
<row>
<col>Script (Standardwert)</col>
<col>Ausfuehrung des Scriptbefehls <em>PlayerControl</em>. Siehe <emlink href="playercontrols.xml#Script">Script-Callbacks</emlink>.</col>
</row>
<row>
<col>Menu</col>
<col>Oeffnen des Spielermenues (asynchrones Kommando).</col>
</row>
<row>
<col>MenuOK</col>
<col>Bestaetigen des ausgewaehlten Elementes im Spielermenue (asynchrones Kommando).</col>
</row>
<row>
<col>MenuCancel</col>
<col>Schliessen des Spielermenues (asynchrones Kommando).</col>
</row>
<row>
<col>MenuLeft / MenuUp / MenuRight / MenuDown</col>
<col>Navigation im Spielermenu (asynchrones Kommando).</col>
</row></table></text>
</col>
</row></table></text></text>
</col>
</row>
</table>
</text>
<h id="ControlSets">Sektion [ControlSets]</h>
<text>Definition von Standard-Steuerungsbelegungen.
<text><table>
<caption id="ControlSet">Beliebig viele Sektionen [ControlSet]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Name</col>
<col>Zeichenfolge</col>
<col>Interner Name zur Identifikation gleicher Steuerungsbelegungen. Die Namen der Standardbelegungen sind <em>Keyboard1</em>, <em>Keyboard1Classic</em>, <em>Keyboard2</em>, <em>Keyboard2Classic</em>, <em>Gamepad</em>. Ueber Platzhalter (*) koennen Tasten direkt in mehreren Belegungen definiert werden**.</col>
</row></table>
</text>
<h id="ControlSets">Section [ControlSets]</h>
<text>
Definition of standard control mappings.
<text>
<table>
<caption id="ControlSet">Any number of sections [ControlSet]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<literal_col>Name</literal_col>
<col>String</col>
<col>Internal name for identification of otherwise equal control mappings. The names of the standard mappings are <em>Keyboard1</em>, <em>Keyboard1Classic</em>, <em>Keyboard2</em>, <em>Keyboard2Classic</em>, <em>Gamepad</em>. By using placeholders (*) keys can directly be defined in multiple mappings**.</col>
</row>
</table>
<text>
<table>
<caption id="Assignment">Any number of sections [Assignment]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<literal_col>Key</literal_col>
<col>String</col>
<col>Specifies the key(s) of this mapping or a reference to another mapping. See <emlink href="playercontrols.xml#Keys">Key mappings</emlink>.</col>
</row>
<row>
<literal_col>ComboIsSequence</literal_col>
<col>Boolean</col>
<col>If true then multiple keys are taken as a sequence, i.e. they need to be pressed one after the other instead of all at the same time. See <emlink href="playercontrols.xml#Keys">Key mappings</emlink>.</col>
</row>
<row>
<literal_col>Control</literal_col>
<col>String</col>
<col>Command that is combined with this mapping. The name should be equivalent to the <em>Identifier</em> of a command defined in a <emlink href="playercontrols.xml#ControlDef">[ControlDef]</emlink>.</col>
</row>
<row>
<literal_col>Priority</literal_col>
<col>Integer</col>
<col>Priority of the mapping. If more than once mapping is using the same keys then the key with the highest priority is executed first until a command is treated as handled.</col>
</row>
<row>
<literal_col>TriggerMode</literal_col>
<col>bitmask</col>
<col>
Trigger mode of this mapping. Bitmask based on the following values:
<text>
<table>
<rowh>
<col>Value</col>
<col>Description</col>
</rowh>
<row>
<col>Default value</col>
<col>No particular action.</col>
</row>
<row>
<literal_col>Hold</literal_col>
<col>The key changes the state of the command linked to to be held even if the key itself is pressed only shortly. Only valid if the <em>Hold</em> attribute is set for the command. This state remains until a corresponding mapping with trigger mode <em>Release</em> is being pressed. See <emlink href="playercontrols.xml#Hold">Held keys</emlink>.</col>
</row>
<row>
<literal_col>Release</literal_col>
<col>The key removes the held state. A key can have both Hold and Release set to toggle between the two states. See <emlink href="playercontrols.xml#Hold">Held keys</emlink>.</col>
</row>
<row>
<literal_col>AlwaysUnhandled</literal_col>
<col>The key press is always passed to the mapping with the next lowest priority, independent of whether the previous command was executed successfully or not.</col>
</row>
<row>
<literal_col>ToggleUnhandled</literal_col>
<col>The keypress is passed to the mapping with the next lower priority only if the previous command was executed successfully. This can be used to define macros. **</col>
</row>
<row>
<literal_col>OverrideAssignments</literal_col>
<col>The assignment overwrites all other assignments for the same control with the same press/release trigger mode.</col>
</row>
</table>
</text>
<text><table>
<caption id="Assignment">Beliebig viele Sektionen [Assignment]</caption>
<rowh>
<col>Wert</col>
<col>Datentyp</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Key</col>
<col>Zeichenfolge</col>
<col>Taste(n) dieser Belegung oder Referenz auf eine andere Belegung. Siehe <emlink href="playercontrols.xml#Keys">Tastenbelegungen</emlink>.</col>
</row>
<row>
<col>ComboIsSequence</col>
<col>Boolean</col>
<col>Wenn wahr, werden mehrfache Tasten als Sequenz interpretiert. Das heisst, sie muessen nacheinander statt gleichzeitig gedrueckt werden. Siehe <emlink href="playercontrols.xml#Keys">Tastenbelegungen</emlink>.</col>
</row>
<row>
<col>Control</col>
<col>Zeichenfolge</col>
<col>Kommando, das mit dieser Belegung verknuepft wird. Der Name sollte dem <em>Identifier</em> eines in einer <emlink href="playercontrols.xml#ControlDef">[ControlDef]</emlink> definierten Kommandos entsprechen.</col>
</row>
<row>
<col>Priority</col>
<col>Integer</col>
<col>Prioritaet der Belegung. Nutzen mehrere Belegungen die gleichen Tasten, so wird zunaechst die Taste mit der hoeheren Prioritaet ausgefuehrt, bis ein Kommando als behandelt gilt.</col>
</row>
<row>
<col>TriggerMode</col>
<col>Bitmaske</col>
<col>Ausloesmodus dieser Belegung. Bitmaske aus folgenden Werten:
<text><table>
<rowh>
<col>Wert</col>
<col>Beschreibung</col>
</rowh>
<row>
<col>Default (Standardwert)</col>
<col>Keine besondere Aktion.</col>
</row>
<row>
<col>Hold</col>
<col>Die Taste versetzt das verlinkte Kommando in den gedrueckten Zustand, selbst wenn die Taste selbst nur angeschlagen wird. Nur gueltig, wenn das Kommando das <em>Hold</em>-Attribut gesetzt hat. Dieser Zustand bleibt erhalten, bis eine entsprechende Belegung mit Ausloesemodus <em>Release</em> gedrueckt wird. Siehe <emlink href="playercontrols.xml#Hold">Gehaltene Tasten</emlink>.</col>
</row>
<row>
<col>Release</col>
<col>Die Taste entfernt den gedrueckten Zustand. Eine Taste kann auch sowohl Hold als auch Release setzen, um zwischen den Zustaenden hin und her zu schalten. Siehe <emlink href="playercontrols.xml#Hold">Gehaltene Tasten</emlink>.</col>
</row>
<row>
<col>AlwaysUnhandled</col>
<col>Der Tastendruck wird immer an die Belegung mit der naechstniedrigen Prioritaet weitergereicht, unabhaengig davon, ob das vorherige Kommando erfolgreich ausgefuehrt wurde.</col>
</row>
<row>
<col>ToggleUnhandled</col>
<col>Der Tastendruck wird genau dann an die Belegung mit der naechstniedrigen Prioritaet weitergereicht, wenn das vorherige Kommando erfolgreich ausgefuehrt wurde. Hiermit lassen sich Makros definieren. **</col>
</row>
<row>
<col>OverrideAssignments</col>
<col>Die Zuweisung ueberschreibt alle weiteren Zuweisungen zum gleichen Control mit gleichem Press/Release-Triggermodus.</col>
</row></table></text>
</col>
</row></table></text>
</col>
</row>
</table>
</text>
</text>
</text></text>
</part>
<h id="Script">Script-Callbacks</h>
<text>Zum Initialisieren der Spielersteuerung wird für jeden gesteuerten Spieler die Funktion InitializePlayerControl aufgerufen. Dieser Aufruf erfolgt gegebenenfalls einige Frames verspätet nach InitializePlayer, da die Initialisierung der Steuerung im Netzwerk übertragen werden muss. Beim Fortsetzen von Spielständen wird InitializePlayerControl wiederholt aufgerufen. Die gewählte Steuerung kann sich hier von der ursprünglichen Steuerung unterscheiden. Gleiches gilt, falls der Spieler mitten im Spiel die Steuerung wechselt.</text>
<code>global func InitializePlayerControl(int player, string control_name, bool has_keyboard, bool has_mouse, bool has_gamepad)
</text>
</part>
<h id="Script">Script callbacks</h>
<text>To initialize the player control the script function InitializePlayerControl is called for each player. This call might be delayed by a few frames with respect to InitializePlayer since the initialization of the control needs to be transmitted in the network. When continuing savegames InitalizePlayerControl will be called again. The chosen control might be different from the original one. The same can happen if a player chooses to change its controls during the game.</text>
<code>global func InitializePlayerControl(int player, string control_name, bool has_keyboard, bool has_mouse, bool has_gamepad)
{
// Hier bietet sich die Möglichkeit, spezielle Kontrollelemente wie ein Gamepad-Zielkreuz zu erzeugen
// oder zu zerstören, falls die Kontrolle vom Gamepad weggeschaltet wurde
// Hier bietet sich die Möglichkeit, spezielle Kontrollelemente wie ein Gamepad-Zielkreuz zu erzeugen
// oder zu zerstören, falls die Kontrolle vom Gamepad weggeschaltet wurde
return true;
}</code>
<text>Die meisten Kommandos (abgesehen von asyrnchronen Kommandos im Spielermenue), rufen eine globale Scriptfunktion auf:</text>
<code>global func PlayerControl(int player, int control, C4ID control_extra, int x, int y, int strength, bool repeated, bool release)</code>
<text>Fuer eine Erlaeuterung der Parameter siehe <funclink>PlayerControl</funclink>. Die Funktion erhaelt unter anderem den aufrufenden Spieler in player, sowie das ausgefuehrte Kommando in iControl.</text>
<text>Fuer ein einfaches Beispiel sei in der globalen <em>PlayerControls.txt</em> folgendes Kommando definiert:</text>
<code>[ControlDefs]
<text>most commands (except for asynchronous commands in the player menu) call a global script function:</text>
<code>global func PlayerControl(int player, int control, C4ID control_extra, int x, int y, int strength, bool repeated, bool release)</code>
<text>For an explanation of the parameters see <funclink>PlayerControl</funclink>. Amongst others, the function receives the calling player in player as well as the command to be executed in control.</text>
<text>As a simple example let's assume that in the global <em>PlayerControls.txt</em> the following command has been defined:</text>
<code>[ControlDefs]
[ControlDef]
Identifier=Jump
GUIName=Jump
@ -217,8 +235,8 @@
Key=W
Control=Jump
Priority=50</code>
<text>Dies definiert eine Sprungtaste und die zugehoerige Standardbelegung auf der Tastatur fuer den ersten Spieler. Dazu folgendes Script zur Behandlung:</text>
<code>global func PlayerControl(int player, int control, C4ID control_extra, int x, int y, int strength, bool repeated, bool release)
<text>This defines a Jump key and the corresponding standard mapping on the keyboard for the first player. The following script is used to handle the control:</text>
<code>global func PlayerControl(int player, int control, C4ID control_extra, int x, int y, int strength, bool repeated, bool release)
{
// Welches Kommando wurde ausgeloest?
// Die Konstante CON_Jump wurde automatisch durch die Definition in PlayerControls.txt angelegt
@ -226,7 +244,7 @@
{
// Sprungtaste gedrueckt. Der vom Spieler ausgewaehlte Clonk soll springen
var player_clonk = GetCursor(player);
if (player_clonk &amp;&amp; player_clonk->Jump())
if (player_clonk &amp;&amp; player_clonk-&gt;Jump())
{
// Das Kommando wurde erfolgreich abgearbeitet
return true;;
@ -235,27 +253,26 @@
// Unbekanntes Kommando
return false;
}</code>
<h id="ExtraData">ExtraData</h>
<text>Da nicht jede Objektdefinition die globale PlayerControl-Funktion ueberladen kann, gibt es das ExtraData-Feld zum Verteilen von Kommandos. Zum Beispiel fuer folgende Definition:</text>
<code>[ControlDefs]
<h id="ExtraData">ExtraData</h>
<text>Since not every object definition is able to overload the global PlayerControl function the ExtraData field can be used to distribute commands. As an example consider the following definition:</text>
<code>[ControlDefs]
[ControlDef]
Identifier=Dig
GUIName=Dig
GUIDesc=Going underground
ExtraData=Shovel</code>
<text>Dabei sei Shovel die ID eines Schaufelobjektes. Im globalen Script kann zum Beispiel folgende, allgemeine Behandlung fuer unbekannte Kommandos stehen:</text>
<code>global func PlayerControl(int player, int control, C4ID control_extra, int x, int y, int strength, bool repeated, bool release)
<text>Let shovel be the ID of a shovel object. In the global script there could be the following, generic handling for unknown commands, for example:</text>
<code>global func PlayerControl(int player, int control, C4ID control_extra, int x, int y, int strength, bool repeated, bool release)
{
// Behandlung bekannter Befehle
// [...]
// Befehl mit eigener Behandlung
if (control_extra) return control_extra->PlayerControl(player, control, x, y, strength, repeat, release);
if (control_extra) return control_extra-&gt;PlayerControl(player, control, x, y, strength, repeat, release);
// Unbekanntes Kommando
return false;
}</code>
<text>Und im Script der Schaufel:</text>
<code>func PlayerControl(int player, int control, int x, int y, int strength, bool repeated, bool release)
<text>And in the script of the shovel:</text>
<code>func PlayerControl(int player, int control, int x, int y, int strength, bool repeated, bool release)
{
// Behandlung bekannter Befehle
// Grabkommando direkt an die Schaufel
@ -263,31 +280,32 @@
{
// Nur, wenn ein Clonk ausgewaehlt ist, der graben kann
var player_clonk = GetCursor(player);
if (player_clonk &amp;&amp; player_clonk->HasShovel())
if (player_clonk &amp;&amp; player_clonk-&gt;HasShovel())
{
return player_clonk->StartDig();
return player_clonk-&gt;StartDig();
}
}
// Unbekanntes Kommando
return false;
}</code>
<h id="Hold">Gehaltene Tasten</h>
<text>Wird fuer ein Kommando das <em>Hold</em>-Flag gesetzt, so speichert die Engine den gegenwaertigen Tastenzustand fuer diese Taste. Solche Tasten haben einige Besonderheiten:</text>
<text><ul>
<li>Sie generieren auch beim Loslassen <funclink>PlayerControl</funclink>-Aufrufe mit gesetztem <em>Release</em>-Flag im Script.</li>
<li>Belegungen koennen mit den <em>Hold</em>/<em>Release</em>-Flags dauerhafte Tastendruecke emulieren.</li>
<li><emlink href="playercontrols.xml#Repeat">Tastenwiederholungen</emlink> werden erzeugt.</li>
<li>Der Haltezustand der Taste kann mit <funclink>GetPlayerControlState</funclink> im Script abgefragt werden.</li>
</ul></text>
<text>Bestes Beispiel hierfuer ist ein Richtungskommando:</text>
<code> [ControlDef]
<h id="Hold">Held keys</h>
<text>If the <em>Hold</em> flag is set for a command then the engines saves the current key state for that key. These kind of keys have a few specialties:</text>
<text>
<ul>
<li>When released they also generate <funclink>PlayerControl</funclink> calls in the script with the <em>Release</em> flag set.</li>
<li>Mappings can emulate permanent key presses using the <em>Hold</em>/<em>Release</em> flags.</li>
<li><emlink href="playercontrols.xml#Repeat">Key repeats</emlink> are generated.</li>
<li>The held state of the key can be queried in the script via <funclink>GetPlayerControlState</funclink>.</li>
</ul>
</text>
<text>A good example for this functionality is a directional command:</text>
<code> [ControlDef]
Identifier=Left
GUIName=Left
GUIDesc=Walk left
Hold=1</code>
<text>Im Script wird die Richtung dann auf den Clonk uebertragen:</text>
<code>global func PlayerControl(int player, int control, C4ID control_extra, int x, int y, int strength, bool repeated, bool release)
<text>In the script the direction is transferred to the Clonk:</text>
<code>global func PlayerControl(int player, int control, C4ID control_extra, int x, int y, int strength, bool repeated, bool release)
{
if (control == CON_Left) return UpdateControlDir(player);
// ...
@ -302,15 +320,15 @@ global func UpdateControlDir(int player)
// Clonkrichtung aktualisieren
var new_comdir = COMD_Stop;
if (GetPlayerControlState(player, CON_Left)) new_comdir = COMD_Left;
player_clonk->SetComDir(new_comdir);
player_clonk-&gt;SetComDir(new_comdir);
// Kommando behandelt
return true;;
}
// Kommando behandelt
return false;
}</code>
<text>Um klassisches Steuerungsverhalten zu erreichen, kann eine Tastenbelegung den <em>Hold</em>-Zustand emulieren:</text>
<code> [Assignment]
<text>To achieve the behaviour of classic controls a mapping can emulate the <em>Hold</em> state:</text>
<code> [Assignment]
Key=A
Control=Left
TriggerMode=Hold
@ -319,27 +337,26 @@ global func UpdateControlDir(int player)
Key=S
Control=Left
TriggerMode=Release | AlwaysUnhandled</code>
<h id="Globals">Globale Definitionen</h>
<text>...</text>
<h id="Repeat">Tastenwiederholungen</h>
<text>Hat ein Kommando ein <em>RepeatDelay</em> definiert, so werden wiederholte Kommandos beim Halten der Taste erzeugt. Zum Beispiel fuer ein Wurkommando:</text>
<code> [ControlDef]
<h id="Globals">Global definitions</h>
<text>...</text>
<h id="Repeat">Key repeats</h>
<text>If a command has <em>RepeatDelay</em> defined then repeated commands are generated while the key is pressed. For example for a throwing command:</text>
<code> [ControlDef]
Identifier=Throw
GUIName=Throw
GUIDesc=Get rid of your selected inventory
Hold=1
RepeatDelay=5
InitialRepeatDelay=35</code>
<text>Im Beispiel koennte man die Wurftaste nach einmal Druecken auch halten. Das Wurfkommando wuerde dann nach 35 Frames (ca. eine Sekunde) halten alle 5 Frames automatisch wiederholt.</text>
<text>Wiederholungen werden nur erzeugt, wenn das Kommando ebenfalls das <em>Hold</em>-Flag gesetzt hat.</text>
<h id="Deactivate">Deaktivierte Kommandos**</h>
<text>...</text>
<h id="Keys">Tastenbelegungen</h>
<text>...</text>
<h id="Priority">Prioritaeten</h>
<text>...</text>
</part>
<text><em>** - noch nicht implementiert</em></text>
<author>Sven2</author><date>Juni 2009</date>
<text>In the example one could keep the key pressed after having it pressed for the first time. The Throw command then would be sent every 5 seconds automatically after an initial delay of 35 frames (about one second).</text>
<text>Repeats are only generated when the command also has the <em>Hold</em> flag set.</text>
<h id="Deactivate">Deactivated commands**</h>
<text>...</text>
<h id="Keys">Keyboard shortcuts</h>
<text>...</text>
<h id="Priority">Priorities</h>
<text>...</text>
</part>
<text><em>** - not yet implemented</em></text>
<author>Sven2</author><date>2009-06</date>
</doc>

View File

@ -1,88 +1,78 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>Blender clonk</title>
<h id="Blenderclonk">Blender clonk</h>
<part>
<text>This tutorial explains how to use the clonk model for Blender.</text>
<h id="WichtigeDateien">Important files:</h>
<text><img src="../images/DownloadBlender.jpg" height="50" width="95" /></text>
<text>Of course we need Blender! Without Blender we cannot do anything. So if you do not have Blender yet then download and install it from <a href="http://www.blender.org">www.blender.org</a>.</text>
<text>Blender installed? Great, so let's continue...</text>
<text>
The main file is <strong>Clonk.blend</strong>. It contains the armature object (skeleton of the Clonk) and the scripts. To create the graphics <strong>Anigrab.exe</strong> is required which should be in the same directory as the .blend file. Also, to be able to execute the scripts, a python installation is required. It can be downloaded from <a href="http://www.python.org/">www.python.org</a>. Then there are four important <strong>subfolders</strong>:
<ul>
<li>In the folder <strong>Actions</strong> all animations needed for the individual clonks are stored as .anim files.</li>
<li>The folder <strong>Clonk</strong> contains .mesh files which contain the meshes of the individual Clonks. In the corresponding .act files the sequence of actions is contained, in the same order as they should appear in the final Graphics.png output.</li>
<li>The <strong>Tools</strong> folder contains tools for the animations. These are the tools that the clonk can use for various animations such as shovel or hammer.</li>
<li>Finally the generated Graphics.png files are stored in the <strong>Graphics</strong> folder.</li>
</ul>
<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>
</text>
<h id="ClonkLaden">Loading the Clonk:</h>
<text>To launch the Render clonk the Clonk.blend file needs to be opened. In the lower right corner the Script GUI becomes visible (user interface of the scripts).</text>
<text>Using <strong>"Load Clonk"</strong> a Clonk can be loaded from the Clonks subfolder. The button next to it <img src="../images/DropDown.png" width="10" height="12"/> allows to quickly choose a Clonk via a menu.</text>
<text><strong>"Import Mesh"</strong> assists in importing a Clonk (see the Import section).</text>
<h id="Hauptmenu">Main menu</h>
<text><img src="../images/MainMenu.png" height="221" width="169" /></text>
<text>
In the main menu there are the following buttons:
<ul>
<li><strong>Action:</strong> allows to edit various settings for the action.</li>
<li><strong>Clonk:</strong> the action list of the Clonk can be edited in this section.</li>
<li><strong>Save/Load:</strong> actions and tools can be saved and loaded from here.</li>
<li><strong>Render:</strong> allows to Render the Clonk.</li>
<li><strong>Exit:</strong> return back to the previous menu to load another clonk.<br /><strong>Attention:</strong> the Clonk will not be saved, any unsaved changes will be lost!</li>
</ul>
Additionally there is a text entry which allows to specify the path to the temp directory.
</text>
<h id="Action">Action</h>
<text><img src="../images/ActionMenu.png" height="221" width="169" /></text>
<text>By using the drowdown menu at the top various <strong>Actions</strong> can be chosen. If the armature object is selected the keyframes of the individual bones appear in the action window. In the fields below the <strong>Length</strong> of the action can be specified, i.e. the number of frames of the action, as well as the <strong>Width (X)</strong> and the <strong>Height (Y)</strong> of the individual frame graphics. Additionally up to two <strong>Tools</strong> to be used by the clonk during the action can be specified. They are mapped to the bones <strong>'Tool1'</strong> or <strong>'Tool2'</strong>, respectively.</text>
<text><strong>Rename</strong> allows to rename the action. <strong>New</strong> creates a new action, either one containing the keyframes of the old action or one that does not. The lower button can be used to <strong>save</strong> the action. This should always be done when keyframes or other settings of the action have been changed. The action is then saved in the Actions subfolder.</text>
<h id="Clonk">Clonk</h>
<text><img src="../images/ClonkMenu.png" height="280" width="177" /></text>
<text>The list of the Clonk's actions is shown here. If more than one column are displayed then the columns to the right contain actions which originate from the actions contained in the column to the left of it. Since often there is not enough space to show all actions the window can be made fullscreen by clicking on <img src="../images/ButtonFullScreen.png" width="52" height="17"/>. Another click on this button restores the original window size again.</text>
<text>To modify the list one can click on an action and then select another one instead. <strong>REMOVE</strong> removes the action from the list. <strong>INSERT</strong> inserts a new action above the selected one. Actions with a U in front of them are not yet contained in the list. The separated at the lower end of the list contains the action that is used for the <strong>Picture graphics</strong> of the Clonk.</text>
<text>Below the <strong>BaseZoom</strong> can be modified. This is the zoom setting of the camera and is required if a mesh is too big and needs to be displayed smaller, or vice versa. Normally this setting is not needed however. The bottommost button <strong>saves</strong> the action list and the mesh of the clonk.</text>
<text><strong>Attention:</strong> the Clonks must always consist of a <strong>single</strong> mesh only! If there are two meshes then they can be combined via Ctrl+J.</text>
<text>Also the Clonk always needs to be saved using the script interface instead of the normal save functionality of Blender. However some exotic settings will not be exported this way. So if, after loading, a certain modifier or a certain texture setting is not activated then it is because this feature is not supported.</text>
<h id="SaveLoad">Save/Load</h>
<text><img src="../images/SaveMenu.png" height="221" width="169" /></text>
<text>Here actions and tools can be loaded. In the beginning of loading the clonk only the actions and tools the clonk actually needs are loaded. If more actions from other clonks are needed then they can be loaded using this window. A click on the button allows to select the <strong>Action/Tool</strong> with the menu system. A click on <img src="../images/DropDown.png" width="10" height="12"/> directly shows a dropdown menu with a list to be selected from.</text>
<text>This menu is also used for saving. An <strong>action</strong>, a <strong>tool</strong> or the <strong>Clonk</strong> can be saved. Actions and Clonks can also be saved in the other submenu (Action or Clonk, respectively). Tools can only be saved here.</text>
<text>The bottommost text entry can be used to change the <strong>Clonk name</strong>. For example if you have loaded and edited the default Clonk then you can rename it before saving so that the original Clonk is not overwritten.</text>
<text><strong>Attention</strong>: the normal saving functionality of Blender can NOT be used to save the Clonk. Please always use the script GUI (the window in the lower right corner).</text>
<h id="Render">Render</h>
<text><img src="../images/Render.png" height="71" width="78" /></text>
<text>By clicking on the render button a menu appears. It allows to choose various <strong>actions</strong> which should be rendered separately. By choosing <strong>-All-</strong> the whole clonk is rendered.</text>
<text>In another submenu one can choose whether to render with or without overlay. <strong>Both</strong> makes Blender render both Graphics.png and Overlay.png. <strong>Graphics/Overlay</strong> only creates one of the two. Both can be rendered into the same graphics by choosing <strong>Full</strong>. This allows to have a better look at the rendering output.</text>
<text>When rendering every frame is stored in the temp directory. All of them are combined to the final graphics using <strong>anigrab</strong>. It is stored in the output folder /Graphics/Clonk name/Graphics.png. The action are placed into the graphics in the same order as they appear in the list. The width of the graphics is chosen by the widest action. If multiple actions fit side-by-side then they will be put into the graphics that way. Finally the <strong>Picture</strong> is stored at some free space or at the end of the graphics. To be able to generate the ActMap of the Clonk conveniently the positions of the actions are stored in another file in the output folder.</text>
<text>If only a <strong>single action</strong> is rendered then it is still tried to create the whole graphics. So there should be rendered frames of the other animations in the temp directory. This allows to not always having to re-render all actions if only a single action has changed. However in the beginning the whole Graphics need to be rendered so that all frames of all actions are present in the temp directory.</text>
<h id="Anmerkung">Remark</h>
<text>Generally all materials that start with <strong>Overlay*</strong> are not rendered for <strong>Graphics</strong>. For <strong>Overlay</strong> only the materials starting with Overlay* are rendered. When choosing <strong>Full</strong> both are rendered. Additionally the color of the material OverlayColor is changed from white to blue when choosing Full.</text>
<text>The <strong>Face</strong> material is textured using the <strong>'Face'</strong> texture in normal animations and is skinned using the <strong>'Face2'</strong> texture for the picture. This is required since the high resolution face would be smeared out in the small animations, so a more coarse texture needs to be used.</text>
<h id="Tools">Tools</h>
<text>Tools are the <strong>utilities</strong> of the clonk which it can use for various animations. The tools of the standard Clonk are shovel, axe, hammer and bottle. For the knight various weapons can be chosen additionally.</text>
<text>To create a new tool first a <strong>matching mesh</strong> needs to be created. It is important that the tool only consists of a <strong>single mesh</strong>. If a mesh has been modeled then it still needs to be positioned correctly no that when used it is correctly attached to the bone. To do so the best way is to set the 'Empty' action for the armature object (or another animation which does not use a tool). Now, above the clonk's head, there are both tool bones at the same position. Now the mesh needs to be aligned so that the point at which the Clonk is to touch the mesh needs to be exactly at the bone position. Ideally, check the result from various perspectives in the end.</text>
<text>Eventually the new tool should have a matching name. The <strong>object name</strong> and the <strong>mesh name</strong> should be identical.</text>
<text><img src="../images/NewTool.png" width="200" height="67"/><br/> Now the tool can be saved via <strong>Save/Load</strong> and <strong>'Save Tool'</strong>. Select the tool from the mesh list which appears. The tool will be saved at /Tools/toolname.mesh.</text>
<h id="Importieren">Import</h>
<text>To import a clonk first Clonk.blend needs to be loaded. Now we need the Clonk mesh to import. This can be loaded from the old file via <strong>File-&gt;Append or Link</strong>. Select the file in the menu that appears, then go to objects and select the object which contains the Clonk. It is important that the loaded Clonk only consists of a single mesh! If it consists or more than one then both need to be selected (shift+right-click) and combined (Ctrl+J). Finally the new mesh needs to be renamed to the name of the Clonk.</text>
<text><img src="../images/NewClonk.png" height="67" width="200" /></text>
<text>Again object name and mesh name should be identical. Then the selected mesh can be imported via a click on <strong>'Import Mesh'</strong>. In the Clonk submenu the action of the Clonk can be adapted and the Clonk be saved. Now it can be used the same way as the other Clonks.</text>
</part>
<author>Randrian</author><date>2008-05</date>
</doc>

View File

@ -1,56 +1,56 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>Renderclonk Examples</title>
<h id="Blenderclonk">Renderclonk Examples</h>
<part>
<text>Those who do not know about modeling with Blender should first do a generic blender tutorial.</text>
<text>To do so please follow one of the beginner's tutorials on <a href="http://www.blender.org/education-help/tutorials/">http://www.blender.org/education-help/tutorials/</a>.</text>
<text>There are also Blender tutorials on the Clonk Center, e.g. <a href="http://www.cc.striver.net/texts.php?action=sh&amp;id=53">a flint</a>, <a href="http://www.cc.striver.net/texts.php?action=sh&amp;id=60">a construction kit</a> oder <a href="http://www.cc.striver.net/texts.php?action=sh&amp;id=134">a sword</a>. They are in German language however.</text>
</part>
<h id="ClonkWerden">Farmer Humpe wants to become a clonk.</h>
<text>The goal of this tutorial is to create a Farmer clonk. So let's start up Blender and open the script. Since the farmer is supposed to be based on the normal Clonk the first thing we do is to load the Clonk model. In the scripting window click on <strong>LoadClonk</strong> or <img src="../images/DropDown.png" width="10" height="12"/> and select Clonk.mesh (or Clonk, respectively). Now the Clonk is loaded and we find ourselves in the main menu. Next, we rename the Clonk to Farmer so that we don't overwrite the original Clonk. To do so we click on <strong>Save/Load</strong> and change Clonk to Farmer in the <strong>Clonk Name</strong> field. Now the Farmer can be saved by another click to <strong>Save Clonk</strong>.</text>
<text>Great, so we have already created a new Clonk. The Farmer!</text>
<h id="Hut">Farmer Seeks Hat</h>
<text>To be able to see a difference between Farmer and Clonk the Farmer should look different of course. So let's give him a hat.</text>
<text><img src="../images/Hut.png" height="238" width="257" /></text>
<text>First an appropriate hat needs to be modeled. This should not be a problem when making use of one of the Blender tutorials mentioned above.</text>
<text>Initially the hat is an individual mesh. To be able to be stored together with the Clonk it needs to be connected to the Clonk mesh. To do so first switch to ObjectMode (maybe switching from the EditMode using Tab) and right-click the hat mesh, then right-click the Clonk mesh while pressing the Shift key. Now the hat has a dark border and the Clonk has a bright one. Pressing Ctrl+J connects the two meshes.</text>
<text>To move the hat together with the Clonk's head it needs to obtain an appropriate VertexGroup. Click on <img src="../images/Button.png" width="21" height="21"/>, then on the left click on the symbol next to the text entry. From the drop-down menu choose 'Head' (referring to the head bone, i.e. the bone which controls the head). Afterwards switch to Edit mode using Tab, select all vertices of the hat (it doesn't matter if a few head vertices are selected as well) and assign them to the Vertex group by clicking on Assign.</text>
<text><img src="../images/Vertexgroup.png" height="130" width="499" /></text>
<text>In the scripting window the Farmer can be saved including its head by choosing <strong>Clonk</strong>, then <strong>Save Farmer</strong>.</text>
<h id="Hose">Humpe wants to have pants</h>
<text>As a next step Farmer Humpe wants to have his own pants since the unit jumpsuit of the Clonks can not be used for agricultural purposes. So we need brown leather pants.</text>
<text>The first thing we need is a new material group. So, at <img src="../images/Button.png" width="21" height="21"/> in the area to the right hand side of the vertex groups, click 'New'. Then click on <img src="../images/Button2.png" width="21" height="21"/> and assign a name for the new material, such as 'Leather'. Choose a brownish shade using the color selector. Now the material needs to be assigned to the corresponding parts of the Clonk. In EditMode select the vertices which shall make up the pants, then in <img src="../images/Button.png" width="21" height="21"/> click on Assign.</text>
<text><img src="../images/Trousers.png" height="250" width="443" /></text>
<text>Now that Humpe wears his pants it's time to save the mesh again.</text>
<h id="Mistgabel">A pitchfork for Mr. Humpp</h>
<text>A farmer without a pitchfork is not a real farmer!</text>
<text><img src="../images/Pitchfork.png" height="292" width="258" /></text>
<text>First the pitchfork needs to be modeled. The mesh as well as the object should be assigned the name 'Pitchfork'. Afterwards the mesh should be aligned so that the point at which the Clonk touches the pitchfork is exactly on the Tool1 bone of the armature object (see picture). Then save the pitchfork using the 'Save Tool' button in the 'Save/Load' menu. In the popup menu choose the 'Pitchfork' entry.</text>
<text>Now of course Humpe should carry the pitchfork when walking. We are going to use the 'WalkStaff' action as a basis for this. To load it go to 'Save/Load' and choose the 'Load Action' entry, then choose 'WalkStaff'. In the 'Actions' submenu choose the 'WalkStaff' action, then click on 'New' to create a new action. Call it 'WalkPitchfork' and answer yes when asked whether to copy the keyframes. This results in a new action called Pitchfork using the keyframes from the WalkStaff action. The last thing to do is to choose the pitchfork as Tool1 so that it uses the pitchfork instead of the staff. Click on 'Save WalkPitchfork' to save the new action.</text>
<text>To make the rendering use the new action instead of the old Walk animation we need to switch it in the action list of the clonk. Go to 'Clonk' and enlarge the window by clicking on <img src="../images/ButtonFullScreen.png" width="52" height="17"/>. Then change 'Walk' to 'WalkPitchfork'.</text>
<text>Now we can do the same for the Jump action. We load 'JumpStaff' and use it to create the new JumpPitchfork action, then assign Pitchfork as Tool1. Don't forget to set the length of the jump animation to 8 instead of 16 frames. Eventually replace Jump by JumpPitchfork in the action list.</text>
<text>Now Humpe happily walks and jumps around carrying his pitchfork! Time to save.</text>
<text>Finally farmer Humpe can be rendered and enjoy being a Clonk:</text>
<text><img src="../images/Humpe.png" height="320" width="256" /></text>
<part>
<h id="Aufstand">Farmer uprising! Humpe fights</h>
<text>But this is not enough! Humpe also wants to use his pitchfork for fighting.</text>
<text>So fighting animations need to be created. However since one cannot use the pitchfork to strike the same way as with a sword we cannot simple replace the sword by a pitchfork in the sword fighting animation. This means we need to create a new animation from scratch.</text>
<text>To do so we switch to the Action submenu, click New and choose 'PitchforkStrike' as the new name. When asked whether to copy the keyframes we say 'No' this time. The animation length is set to 8 and the width to 24. The height we leave at 20. Now select the armature object and switch to 'Pose Mode'.</text>
<text>First switch to Frame 1. The frame number is shown in the bottom-left corner of the 3D window, or as a green line in the animation window respectively (see picture). So either click at the position of Frame 1 in the animation window or navigate to Frame 1 using the arrow keys. Having arrived at the first frame we can bend the Clonk's bones to how he is supposed to look like at the beginning of the strike animation. The camera should look at the clonk somewhat displaced from the front since this is the case for most animations.</text>
<text>Bones at their final positions need to be taken over to the keyframe list by pressing the 'i' key and choosing 'LocRot'. When the pose is finished and all bone positions are saved as keyframes we can continue. In frame 5 the Clonk should be at the backmost position when striking out (intermediate frames are computed automatically by Blender). Then in frame 7 the Clonk should be stabbing directly towards his enemy. The 9. frame should be the same as the first so that the Clonk returns into his initial position. So we press 'b' to select all keyframes of the first frame by drawing a selection rectangle in the action window. Using Shift+D they are duplicated and moved to frame 9. Why frame 9 when we only have 8 frames, you might ask. We don't need the first frame twice in the animation, the additional frame is just so that the eighth frame is computed as a transition from the seventh to the first frame by Blender.</text>
<text>A click on 'Save StrikePitchfork' makes sure the new action is saved.</text>
<text><img src="../images/StrikeAction.png" height="372" width="637" /></text>
<text>Now we need another animation in which Humpe is in fighting position with his pitchfork (when two clonks stand opposed to each other when fighting). In this case a copy of SwordFight is good. So let's load SwordFight via 'Save/Load' and 'Load Action'. In the 'Action' submenu create a copy of the action with 'New'. The length needs to be set to 4 and the width to 24. Tool1 is again chosen to be our pitchfork.</text>
<text>However now we can see that the Clonk is holding the pitchfork too high up. So in 'Pose Mode' lower the Tool1 bone a bit and insert a keyframe with 'i' and 'LocRot'. Do the same for frames 1, 3 and 5, then save with 'Save PitchforkFight'.</text>
<text>Eventually the two actions need to be added to the action list of the Clonk. To do so click on the empty field below Drink and choose 'PitchforkFight'. Then click again in the next empty field which gets created below 'PitchforkFight' and choose 'PitchforkStrike'.</text>
<text>Clicking on 'Save Farmer' saves what we have done.</text>
<text>Finally our little Farmer is finished. Both Graphics.png and Overlay.png are created in the Graphics/Farmer subfolder when clicking on 'Render', then 'All', then 'Both'. They can be used to add the graphics into the game.</text>
<text><img src="../images/Full.png" height="320" width="256" /></text>
</part>
<author>Randrian</author><date>2008-05</date>
</doc>

View File

@ -1,185 +1,190 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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](x, y, iAlpha, iBeta)</code>
<text>Als Rückgabewert wird 0 (= kein Material) oder 1 (= Material) erwartet. x und y 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;
<title>Map Generator</title>
<h id="Kartengenerator">Map Generator</h>
<part>
<text>Besides simple dynamic maps defined in Scenario.txt there is also a powerful dynamic map generator for highly complex yet fully random maps.</text>
<text>This generator works with nested layers that can be combined using various operators and to which a material value and various attributes can be assigned to describe their resulting shape. The map generator will generate a map using these layers. The map is then later zoomed to the landscape as a static map would be.</text>
<text>The structure of maps, layers, and attributes is stored in the component Landscape.txt in the scenario.</text>
<h id="Syntax">Syntax</h>
<text>The language describing this structure works with objects, attributes, and operators and is case sensitive. Objects are defined as follows:</text>
<code>Objekttyp [Name] { Attribute };</code>
<text>The name is optional. Current objects types are map, overlay, and point (for the poly algorithm). If an object is known it can later be used for another instance which is defined with:</text>
<code>Name { Attribute };</code>
<text>Here, the previously defined object 'Name' is copied and optionally extended by the given attributes. If no additional attributes are defined, the brackets can be omitted.</text>
<text>General attribute syntax is:</text>
<code>Attribut=Wert;</code>
<text>Attributes can be defined in any order within the object. They can optionally have % or px as unit and can be specified as single value or range of values (val1 - val2). In case of a duplicate assignment the last value is evaluated.</text>
<text>In addition to attributes there can be nested sub-objects which can be combined using operators:</text>
<code>Objekt1 Operator Objekt2;</code>
<text>Operator statements can have any length and control the combination of layers. Operators are: | (OR), &amp; (AND), ^ (XOR).</text>
<text>You will find several examples in the Dynamic Worlds folder.</text>
<h id="Attributes">Attributes</h>
<part>
<h id="Attr_overlay">Layers (overlay)</h>
<text>The following attributes are defined:</text>
<text>
<table>
<rowh>
<col>Attribute</col>
<col>Type</col>
<col>Description</col>
</rowh>
<row>
<col>mat</col>
<col>Material</col>
<col>Material. The material must be defined in the active Material.c4g. Default is Sky.</col>
</row>
<row>
<col>tex</col>
<col>Texture</col>
<col>Texture. The material-texture combination should be defined in the active TexMap.</col>
</row>
<row>
<col>x, y, wdt, hgt</col>
<col>Integer</col>
<col>Size of the specified layer as a percentage of the layer above.</col>
</row>
<row>
<col>algo</col>
<col>Algorithm</col>
<col>Area fill type. For a list of available fill types see <a href="#Algos">fill algorhythms</a>.</col>
</row>
<row>
<col>zoomX, zoomY</col>
<col>Integer</col>
<col>Specifies the scale applied to the fill pattern. -100 to +99.</col>
</row>
<row>
<col>ox, oy</col>
<col>Integer</col>
<col>Offset to the fill pattern in percent. You can use this e.g. to shift a sine curve.</col>
</row>
<row>
<col>a, b</col>
<col>Integer</col>
<col>Additional parameters for the fill pattern.</col>
</row>
<row>
<col>turbulence</col>
<col>Integer</col>
<col>10 to 10,000; layer deformation</col>
</row>
<row>
<col>rotate</col>
<col>Integer</col>
<col>-180 to +180; rotation of the layer.</col>
</row>
<row>
<col>invert</col>
<col>Boolean</col>
<col>0 or 1; if 1 the layer filling is inverted.</col>
</row>
<row>
<col>seed</col>
<col>Integer</col>
<col>Random seed for layer generation. Each seed will create a unique random layer.</col>
</row>
<row>
<col>loosebounds</col>
<col>Boolean</col>
<col>Determines whether the area limits are also affected by rotate, turbulence, ox, and oy.</col>
</row>
<row>
<col>mask</col>
<col>Boolean</col>
<col>0 or 1; if 1 the layer is never drawn. This does not affect sub-layers.</col>
</row>
<row>
<col>grp</col>
<col>b</col>
<col>0 or 1; if 1 the layer is considered set if the local algorithm or the algorithm of one of the sub-layers returns true. If an operator follows, the layer itself is not drawn.</col>
</row>
<row>
<col>sub</col>
<col>Boolean</col>
<col>0 or 1; if 1 the material is considered underground (default)</col>
</row>
<row>
<col>lambda</col>
<col>Integer</col>
<col>0 to 20; additional turbulence iterations</col>
</row>
</table>
</text>
<h id="Attr_map">Maps</h>
<text>Maps generally can have the same attributes as layers. However, only mat, tex, and sub are really useful for maps and determine the background filling.</text>
</part>
<h id="Algos">Fill Algorithms</h>
<text>To decide whether a point on a map hits a given layer, it is first transformed (zoom, turbulence, rotate, ox/oy) and then processed in the layer's algorithm. Also it is checked against the mask boundaries (x, y, wdt, hgt). This is usually done before, but with loosebounds after the transformation.</text>
<dl>
<dt id="Algo_solid">solid</dt>
<dd>
<text>Default algorithm. Always true.</text>
</dd>
<dt id="Algo_random">random</dt>
<dd>
<text>Random points. The parameter specifies probability. The higher a, the less likely the point is set.</text>
</dd>
<dt id="Algo_checker">checker</dt>
<dd>
<text>Alternating boxes of size 10 (at normal zoom).</text>
</dd>
<dt id="Algo_bozo">bozo</dt>
<dd>
<text>Specks. Parameter a can be used to reduce speck size.</text>
</dd>
<dt id="Algo_sin">sin</dt>
<dd>
<text>Horizontal sine curve. In standard zoom the amplitude is 10, the period 20 pixels.</text>
</dd>
<dt id="Algo_boxes">boxes</dt>
<dd>
<text>Orderly boxes. Parameter a defines block size, b the distance of block centers.</text>
</dd>
<dt id="Algo_rndchecker">rndchecker</dt>
<dd>
<text>As checker, but not in alternating but in random order.</text>
</dd>
<dt id="Algo_lines">lines</dt>
<dd>
<text>Vertical lines. Parameter a defines line width, b defines distance between lines.</text>
</dd>
<dt id="Algo_border">border</dt>
<dd>
<text>Draws an inner border in the parent layer (or the whole operator chain respectively). a and b are the horizontal and vertical border width. Because the superior layer needs to be accessed for calculation, it cannot be defined as a group (grp).</text>
</dd>
<dt id="Algo_mandel">mandel</dt>
<dd>
<text>Draws the Mandel fractal into the target area. Parameter a specifies iteration depth (default 1000). With no zoom, the complete "Apfelmännchen" is drawn (corresponding to -2-2i to 2+2i).</text>
</dd>
<dt id="Algo_rndall">rndall</dt>
<dd>
<text>The complete area is filled, or not filled, with probability a (in percent). Using this algorithm you could for example specify multiple maps as sub maps of a mask=1 layer and one of these maps would be randomly chosen.</text>
</dd>
<dt id="Algo_script">script</dt>
<dd>
<text>This algorithm is defined via a <emlink href="scenario/script.html">scenario script</emlink> function of the following form:</text>
<code>func ScriptAlgo[Overlay-Name](x, y, iAlpha, iBeta)</code> <text>The script function's return value should be 0 (no material) or 1 (material). x and y are the pixel coordinates for which the function is called. iAlpha and iBeta correspond to parameters a and b.</text>
<text>If the layer has no name, the function "ScriptAlgo" is used.</text>
</dd>
<dt id="Algo_poly">poly</dt>
<dd>
<text>Returns true for pixels within the specified polygon. Points are specifed using</text>
<code>point { x=&lt;X-Koordinate des Eckpunkts&gt;&lt;Einheit&gt;; y=&lt;Y-Koordinate&gt;&gt;&lt;Einheit&gt;; };</code> <text>Example:</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>
};</code> </dd>
</dl>
<h id="Operators">Operators</h>
<text>Multiple layers can be combined using operators. This are evaluated from top to bottom and only the bottom most result of the chain is drawn. In a group (grp) the child layers are taken into the calculation but not actually drawn. Operators are | (OR), &amp; (AND), ^ (XOR).</text>
</part>
<author>Sven2</author><date>2001-07</date>
</doc>

View File

@ -1,116 +1,116 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>Teams.txt</title>
<h id="Scenariotxt">Teams.txt</h>
<text>Via the Teams.txt component you can specify in which way groups of players play with or against together in multiplayer melees. From 4.9.6.0 CR.</text>
<text>
<table>
<caption id="SektionTeams">Section [Teams]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
<col>Default value</col>
</rowh>
<row>
<col>Active</col>
<col>Integer</col>
<col>0 or 1. If 0, no teams exist and it is assumed that no teams can be formed at runtime. This also means that no hostility options will be available in the player menu.</col>
<col>1</col>
</row>
<row>
<col>AllowHostilityChange</col>
<col>Integer</col>
<col>0 or 1. If 1, players can declare hostility or alliance at runtime.</col>
<col>0 if Teams.txt is present. 1 if Teams.txt is not present but the melee rule is active.</col>
</row>
<row>
<col>AllowTeamSwitch</col>
<col>Integer</col>
<col>0 or 1. If 1, players can choose a different team at runtime.</col>
<col>0</col>
</row>
<row>
<col>AutoGenerateTeams</col>
<col>Integer</col>
<col>0 or 1. If 1, players can declare hostility or alliance at runtime.</col>
<col>0 is there are team sections present. 1 if there are none.</col>
</row>
<row>
<col>TeamDistribution</col>
<col>Identifier</col>
<col>Player distribution to the teams. Possible values are: Free (free choice), Host (the host chooses during lobby), Random (random distribution) or RandomInv (random distribution, but not displayed during lobby).</col>
<col>Free</col>
</row>
<row>
<col>TeamColors</col>
<col>Integer</col>
<col>0 or 1. If 1, all players of a team are assigned the same color.</col>
<col>0</col>
</row>
<row>
<col>MaxScriptPlayers</col>
<col>Integer</col>
<col>Maximum number of script players which the host can activate in the lobby of network games. This includes script players that have already joined.</col>
<col>0</col>
</row>
<row>
<col>ScriptPlayerNames</col>
<col>String</col>
<col>A list of names separated by "|" which are assigned to script players joinging in the lobby. If no list of names is provided, all script players are called "Computer".</col>
<col>Computer</col>
</row>
</table>
</text>
<text>
<table>
<caption id="SektionTeam">Any number of sections [Team]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
<col>Default value</col>
</rowh>
<row>
<col>id</col>
<col>Integer</col>
<col>Identifier: a unique number greater than 0 which can be used to identify a team in scenario scripts. Usually you can simply use ascending numerical values as team identifiers.</col>
<col>Must be specified!</col>
</row>
<row>
<col>Name</col>
<col>String (max. 30 chars)</col>
<col>Team name. You can also specify localized strings such as $TeamRight$. See <emlink href="lang.html#Teamstxt">Localization</emlink>.</col>
<col></col>
</row>
<row>
<col>PlrStartIndex</col>
<col>Integer</col>
<col>If not 0, all members of this team use the corresponding [PlayerX] section in <emlink href="scenario/scenario.html#SektionenPlayer1Player2Player3Player4">Scenario.txt</emlink> for starting conditions. If 0, starting conditions are assigned automatically and independent of team membership.</col>
<col>0</col>
</row>
<row>
<col>Color</col>
<col>Integer</col>
<col>32 bit RGB value of the team color. The team color is used instead of the player color if TeamColors is set.</col>
<col>0</col>
</row>
<row>
<col>IconSpec</col>
<col>String</col>
<col>Specifies a team icon for runtime joins or non-network games.</col>
<col></col>
</row>
<row>
<col>MaxPlayer</col>
<col>Integer</col>
<col>Maximum number of players who may join this team. 0 for infinite.</col>
<col>0</col>
</row>
</table>
</text>
<author>Sven2</author><date>2006-06</date>
</doc>

View File

@ -1,29 +1,62 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>Homebase Functionality</title>
<h id="BaseFunc">Homebase Functionality</h>
<text>This option (a DWord bit mask) determines the functionality of base buildings in a scenario. The base building is the one with the flag.</text>
<text>
<table>
<rowh>
<col>Bit</col>
<col>Value</col>
<col>BaseFunctionality</col>
<col>Description</col>
</rowh>
<row>
<col>0</col>
<col>1</col>
<col>BASEFUNC_AutoSellContents</col>
<col>Lorries are automatically emptied and any gold in the base building or in contained objects is automatically sold.</col>
</row>
<row>
<col>1</col>
<col>2</col>
<col>BASEFUNC_RegenerateEnergy</col>
<col>Allied clonks can recharge life energy at the base.</col>
</row>
<row>
<col>2</col>
<col>4</col>
<col>BASEFUNC_Buy</col>
<col>Objects can be bought in the base.</col>
</row>
<row>
<col>3</col>
<col>8</col>
<col>BASEFUNC_Sell</col>
<col>Objects can be sold at the base.</col>
</row>
<row>
<col>4</col>
<col>16</col>
<col>BASEFUNC_RejectEntrance</col>
<col>The entrance is blocked for hostile clonks.</col>
</row>
<row>
<col>5</col>
<col>32</col>
<col>BASEFUNC_Extinguish</col>
<col>Clonks are extinguished in the base building.</col>
</row>
<row>
<col>1-16</col>
<col>65536</col>
<col>BASEFUNC_Default</col>
<col>All bits set: the default behaviour.</col>
</row>
</table>
</text>
<author>Sven2</author><date>2006-03</date>
</doc>

View File

@ -1,97 +1,116 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>Scenarios</title>
<h id="Szenarien">Scenarios</h>
<part>
<text>Scenarios are the playing worlds which the player can select and start from the menu. With their components the scenario designer can adjust freely everything from the landscape, the goals and rules, the available objects and materials to the look in the menu.</text>
<h id="SzenarioKomponentenC4S">Scenario Components (c4s)</h>
<dl>
<dt id="Szenariotxt"><img height="16" src="../../images/icon_text.gif" width="16"/><emlink href="scenario/scenario.html">Scenario.txt</emlink></dt>
<dd>
<text>Contains most scenario settings.</text>
</dd>
<dt id="Teamstxt"><img height="16" src="../../images/icon_text.gif" width="16"/><emlink href="scenario/Teams.html">Teams.txt</emlink></dt>
<dd>
<text>Contains the Teamsettings for multiplayer scenarios. Since 4.9.6.0 CR.</text>
</dd>
<dt id="Title"><img height="16" src="../../images/icon_image.gif" width="16"/>Title.png/Title.bmp</dt>
<dd>
<text>The title picture of the scenario in png format. Size: 200x150 pixel. The older bmp format with 256 colors is still supported as well.</text>
</dd>
<dt id="Iconbmp"><img height="16" src="../../images/icon_image.gif" width="16"/>Icon.bmp</dt>
<dd>
<text>The icon of the scenario in the menu. Windows bmp with 256 colors, 16x16 pixel, RGB 255,0,255 is treated as transparent.</text>
</dd>
<dt id="Loader"><img height="16" src="../../images/icon_image.gif" width="16"/>Loader*.png/Loader*.bmp</dt>
<dd>
<text>Loader screen to be displayed while the scenario is loading. If multiple files are present (Loader1.png, Loader2.png, Loader3.png...), one is selected randomly. You can optionally specify which loader to use in Scenario.txt. Loader image files located in parent scenario folders are also used.</text>
</dd>
<dt id="Sky"><img height="16" src="../../images/icon_image.gif" width="16"/>Sky.png/Sky.bmp</dt>
<dd>
<text>The sky background image. Sky graphics should either be tileable or match the exact landscape size. Notice that you cannot know the exact landscape size with dynamic maps which may increase with the number of participants.</text>
</dd>
<dt id="Desc__rtf"><img height="16" src="../../images/icon_text.gif" width="16"/>Desc*.rtf</dt>
<dd>
<text>The description text of the scenario in rich text format (rtf). '__' is to be replaced by the two digit language code, e.g. DE for German and US for American English. Multiple descriptions for several languages can be contained in a scenario file of which the game will automatically load the one appropriate for the configured language.</text>
<text>The font of the description text is set internally on display. The character size in the file should be 10pt for headings and 8pt for text. Images or other rtf tags are ignored.</text>
<text>It is recommended to edit this file using a small scale rtf editor such as WordPad.exe in Windows and not a full-blown word processor such as Word as these will stuff kilobytes of unneeded extra information into the rtf file.</text>
</dd>
<dt id="Titletxt"><img height="16" src="../../images/icon_text.gif" width="16"/>Title.txt</dt>
<dd>
<text>By default, the title of a scenario is set when renaming the scenario in the menu system and stored in section [Head] of Scenario.txt. The file name of the scenario group file may differ. For language dependent titles you should create a Title.txt component with the appropriate contents:</text>
<code>DE:Angriff der Killerwipfe
US:Attack of the Killer Wipfs</code> <text>Important: No quotation marks and special characters should be used.</text>
</dd>
<dt id="Scriptc"><img height="16" src="../../images/icon_text.gif" width="16"/><emlink href="scenario/script.html">Script.c</emlink></dt>
<dd>
<text>The scenario script.</text>
</dd>
<dt id="Landscapebmp"><img height="16" src="../../images/icon_image.gif" width="16"/>Landscape.bmp</dt>
<dd>
<text>Static landscapes are stretched by factor MapZoom defined in Scenario.txt to the size of the actual landscape in the game. The colors used in Landscape.bmp correspond to materials and textures as defined in <emlink href="material/index.html#TexMaptxt">TexMap.txt</emlink>.</text>
<text>Exact landscapes represent the actual in-game landscape saved to a bitmap file. The bitmap color indices (128-191 and 192-255, 3 colors per material) correspond directly to the material pixels used in the scenario. The current material list is stored in MatMap.txt.</text>
</dd>
<dt id="Landscapepng"><img height="16" src="../../images/icon_image.gif" width="16"/>Landscape.png</dt>
<dd>
<text>Full size map for exact landscapes. This is mainly used in savegames to store the exact terrain including transparent materials and their texture. Exact landscapes consume an extreme amount of memory and should not be used for regularly distributed scenarios.</text>
</dd>
<dt id="Landscapetxt"><img height="16" src="../../images/icon_text.gif" width="16"/><emlink href="scenario/MapCreatorS2.html">Landscape.txt</emlink></dt>
<dd>
<text>Advanced scenario designers can use this component to define highly complex, fully random generated dynamic landscapes. This does require certain mathematical skill and some patience, however.</text>
</dd>
<dt id="MatMaptxt"><img height="16" src="../../images/icon_text.gif" width="16"/>MatMap.txt</dt>
<dd>
<text>Stores the material table used in this scenario. The materials listed here are used by the exact landscape and have to be available in the loaded Material.c4g group.</text>
</dd>
<dt id="Objectstxt"><img height="16" src="../../images/icon_text.gif" width="16"/>Objects.txt</dt>
<dd>
<text>This component is generated by the engine and stores runtime object data of a savegame.</text>
</dd>
<dt id="Materialc4g"><img height="16" src="../../images/icon_system.gif" width="16"/><emlink href="material/index.html">Material.c4g</emlink></dt>
<dd>
<text>Scenarios can contain local material definition groups. See <a href="#UeberladungenC4S">overloading rules</a>.</text>
</dd>
<dt id="Graphicsc4g"><img height="16" src="../../images/icon_system.gif" width="16"/>Graphics.c4g</dt>
<dd>
<text>Scenarios can overload individual entries of the global Graphics.c4g group. See <a href="#UeberladungenC4S">overloading rules</a>.</text>
</dd>
<dt id="wav"><img height="16" src="../../images/icon_sound.gif" width="16"/>*.wav</dt>
<dd>
<text>Scenarios can contain any number of sound files. These can be played back by script during the game. Scenario local sounds are loaded dynamically on demand which might cause delays with large scenario files.</text>
</dd>
<dt id="mid"><img height="16" src="../../images/icon_music.gif" width="16"/>*.mid/*.ogg</dt>
<dd>
<text>If the scenario contains music files, these can be played back during the game in random order. Also see script command <emlink href="script/fn/Music.html">Music</emlink>().</text>
</dd>
<dt id="Musicc4g"><img height="16" src="../../images/icon_system.gif" width="16"/>Music.c4g</dt>
<dd>
<text>Local music files can also be combines in a local music group.</text>
</dd>
<dt id="c4d"><img height="16" src="../../images/icon_object_definition.gif" width="16"/><emlink href="definition/index.html">*.c4d</emlink></dt>
<dd>
<text>Scenarios can contain local object definitions which are then available in that scenario only.</text>
<text>The engine will also search all parent folders (c4f) of the scenario for additional local object definitions. In this way, a scenario folder can contain object definitions which are then available in all its contents scenarios.</text>
</dd>
<dt id="Namestxt"><img height="16" src="../../images/icon_text.gif" width="16"/>Names.txt</dt>
<dd>
<text>These names are used for clonks created in this scenario.</text>
</dd>
<dt id="Infotxt"><img height="16" src="../../images/icon_text.gif" width="16"/>Info.txt</dt>
<dd>
<text>Here an author can store additional information about the development of his scenario, his email address, or other information he wants to share with other developers.</text>
</dd>
<dt id="Authortxt"><img height="16" src="../../images/icon_text.gif" width="16"/>Author.txt</dt>
<dd>
<text>Should contain the name of the author in format "Firstname Lastname (Nick)" and is used to maintain the name of the original author, if the scenario group file is edited by another developer at a later point in time. The name stored here is only displayed, however, if the scenario was edited by RedWolf Design. This feature is mainly used for contest scenarios.</text>
</dd>
</dl>
<h id="UeberladungenC4S">Overloading Rules</h>
<text>Various system components (graphics, loader screens, materials, music, or objects) can be overloaded in scenarios. In doing this, parent scenario folders (c4f) are searched. Also, components located in child groups will always overload the same components located in parent groups.</text>
</part>
<author>Sven2</author><date>2002-04</date>
<author>matthes</author><date>2004-06</date>
</doc>

View File

@ -1,444 +1,442 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>MinPlayer</col>
<col>Integer</col>
<col>Minimale Anzahl der Spieler.</col>
</row>
<row>
<col>MaxPlayer</col>
<col>Integer</col>
<col>Maximale Anzahl der Spieler.</col>
</row>
<row>
<col>MaxPlayerLeague</col>
<col>Integer</col>
<col>Maximale Anzahl der Spieler für die Liga. Default ist MaxPlayerLeague = MaxPlayer.</col>
</row>
<row>
<col>Loader</col>
<col>Zeichenfolge</col>
<col>Dateiname (ohne Dateiendung) des Gewünschten Ladebildschirms.</col>
</row>
<row>
<col>Font</col>
<col>Zeichenfolge</col>
<col>Name der Schriftart die für dieses Szenario anstatt der Default-Schriftart benutzt werden soll. </col>
</row>
<row>
<col>Difficulty</col>
<col>Integer</col>
<col>Schwierigkeitsgrad des Szenarios. Szenarien in einem Ordner werden nach aufsteigender Schwierigkeit sortiert, ansonsten nach dem Alphabet.</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>ForcedFairCrew</col>
<col>Integer</col>
<col>0 oder 1. Bei 1 wird für dieses Szenario immer eine faire Crew verwendet.</col>
</row>
<row>
<col>FairCrewStrength</col>
<col>Integer</col>
<col>Stärke der fairen Crew.</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>
</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>
</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>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="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>
<author>Newton</author><date>Februar 2010</date>
<title>Scenario.txt</title>
<h id="Scenariotxt">Scenario.txt</h>
<text>In Scenario.txt you can define basic scenario settings including simple dynamic maps, player presets and starting material, game goals, weather conditions etc. Most of these settings can also be made in the scenario properties of the menu system. For more complex settings and mission sequences you will have to write a <emlink href="scenario/script.html">script</emlink>.</text>
<text>Some of the values require four numbers which specify mean, deviation, minimum and maximum. The value which is actually used is computed by <code>BoundBy(mean+Random(2*deviation+1)-deviation,minimum,maximum);</code>.</text>
<text>
<table>
<caption id="SektionHead">Section [Head]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<col>Icon</col>
<col>Integer</col>
<col>Default icon for the scenario. See the scenario options in the menu system.</col>
</row>
<row>
<col>Title</col>
<col>String (max 512)</col>
<col>Title for the scenario. Entries in Title.txt will override this value.</col>
</row>
<row>
<col>Version</col>
<col>4 integers</col>
<col>Engine version required by the scenario.</col>
</row>
<row>
<col>MinPlayer</col>
<col>Integer</col>
<col>Minimum player count</col>
</row>
<row>
<col>MaxPlayer</col>
<col>Integer</col>
<col>Maximum player count</col>
</row>
<row>
<col>MaxPlayerLeague</col>
<col>Integer</col>
<col>Maximum players for the league, default is MaxPlayerLeague = MaxPlayer.</col>
</row>
<row>
<col>Loaders</col>
<col>String</col>
<col>File name (without extension) of the desired loader screen.</col>
</row>
<row>
<col>Font</col>
<col>String</col>
<col>Name of the font to be used for this scenario (replacing the default font).</col>
</row>
<row>
<col>Difficulty</col>
<col>Integer</col>
<col>Difficulty of the scenario. Scenarios in a folder are sorted ascendingly by difficulty if specified or by the alphabet otherwise.</col>
</row>
<row>
<col>NoInitialize</col>
<col>Integer</col>
<col>0 or 1. If 1, basic startup objects as defined in Scenario.txt (player material and buildings, animals, vegetation) are not placed. This flag is automatically set in savegaes and is used to avoid duplication by repeated scenario initialization. The flag ignores among others the values Buildings, Vehicles, Material, Vegetation, InEarth, and Animals.</col>
</row>
<row>
<col>MissionAccess</col>
<col>String</col>
<col>The scenario will only load if the player gained this password in another scenario. See script function <funclink>GainMissionAccess</funclink>().</col>
</row>
<row>
<col>ForcedFairCrew</col>
<col>Integer</col>
<col>0 or 1. If 1, fair crew is always used in this scenario.</col>
</row>
<row>
<col>FairCrewStrength</col>
<col>Integer</col>
<col>Strength of the fair crew.</col>
</row>
<row>
<col>Film</col>
<col>Integer</col>
<col>0 or 1 und only valid for records. If 1, the view always follows the first player and all player controls are invisible.</col>
</row>
</table>
</text>
<text>
<table>
<caption id="SektionGame">Section [Game]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<col>Rules</col>
<col>ID list</col>
<col>Game rules.</col>
</row>
<row>
<col>Goals</col>
<col>ID list</col>
<col>Game goals.</col>
</row>
<row>
<col>ValueOverloads</col>
<col>ID list</col>
<col>List of definitions for which the values should be overridden. The amount will be the new value.</col>
</row>
<row>
<col>FoWColor</col>
<col>DWORD</col>
<col>Color of the fog of war</col>
</row>
</table>
</text>
<text>
<table>
<caption id="SektionenPlayer1Player2Player3Player4">Sections [Player1] [Player2] [Player3] [Player4]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<literal_col>Wealth</literal_col>
<col>4 integers</col>
<col>Seed capital.</col>
</row>
<row>
<literal_col>Position</literal_col>
<col>2 Integer</col>
<col>Start position as coordinates for the un-zoomed landscape. Both -1: Random position.</col>
</row>
<row>
<literal_col>Crew</literal_col>
<col>ID list</col>
<col>Type and count of initial crew members.</col>
</row>
<row>
<literal_col>Buildings</literal_col>
<col>ID list</col>
<col>Buildings available at game start.</col>
</row>
<row>
<literal_col>Vehicles</literal_col>
<col>ID list</col>
<col>Vehicles available at game start.</col>
</row>
<row>
<literal_col>Material</literal_col>
<col>ID list</col>
<col>Materials available at game start</col>
</row>
<row>
<literal_col>Knowledge</literal_col>
<col>ID list</col>
<col>Objects the player should initially be able to create.</col>
</row>
<row>
<literal_col>HomeBaseMaterial</literal_col>
<col>ID list</col>
<col>Materials available to buy at game start.</col>
</row>
<row>
<literal_col>HomeBaseProduction</literal_col>
<col>ID list</col>
<col>Additional supply of materials to buy.</col>
</row>
<row>
<literal_col>Magic</literal_col>
<col>ID list</col>
<col>Available spells. If the list is empty, all spells are available (backwards compatibility).</col>
</row>
</table>
</text>
<text>
<table>
<caption id="SektionLandscape">Section [Landscape]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<literal_col>Vegetation</literal_col>
<col>ID list</col>
<col>Vegetation types and ratio.</col>
</row>
<row>
<literal_col>VegetationLevel</literal_col>
<col>4 integers</col>
<col>0-100. Vegetation amount.</col>
</row>
<row>
<literal_col>InEarth</literal_col>
<col>ID list</col>
<col>Types and proportionate shares of buried objects.</col>
</row>
<row>
<literal_col>InEarthLevel</literal_col>
<col>4 integers</col>
<col>0-100. Amount of buried objects.</col>
</row>
<row>
<literal_col>Sky</literal_col>
<col>String</col>
<col>Sky texture from Graphics.c4g (without filename extension)</col>
</row>
<row>
<literal_col>SkyFade</literal_col>
<col>6 integers</col>
<col>Sky color gradient (RGB to RGB). Values 0-255. With all values 0, the default blue background will be used.</col>
</row>
<row>
<literal_col>BottomOpen</literal_col>
<col>Integer</col>
<col>0 or 1. Determines wether the bottom of the game world should be open.</col>
</row>
<row>
<literal_col>TopOpen</literal_col>
<col>Integer</col>
<col>0 or 1. Determines wether the top of the game world should be open.</col>
</row>
<row>
<literal_col>LeftOpen</literal_col>
<col>Integer</col>
<col>Height until which the left side of the game world is open.</col>
</row>
<row>
<literal_col>RightOpen</literal_col>
<col>Integer</col>
<col>Height until which the right side of the game world is open.</col>
</row>
<row>
<literal_col>AutoScanSideOpen</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, LeftOpen and RightOpen will be set automatically depending on the landscape at game start.</col>
</row>
<row>
<literal_col>MapWidth</literal_col>
<col>4 integers</col>
<col>Base width of the dynamic map.</col>
</row>
<row>
<literal_col>MapHeight</literal_col>
<col>4 integers</col>
<col>Base height of the dynamic map.</col>
</row>
<row>
<literal_col>MapZoom</literal_col>
<col>4 integers</col>
<col>Factor for zooming the map to the real game world. Default is 10.</col>
</row>
<row>
<literal_col>Amplitude</literal_col>
<col>4 integers</col>
<col>0-100 with tolerance. Hill height for dynamic maps.</col>
</row>
<row>
<literal_col>Phase</literal_col>
<col>4 integers</col>
<col>0-100 with tolerance. Hill offset for dynamic maps.</col>
</row>
<row>
<literal_col>Period</literal_col>
<col>4 integers</col>
<col>0-100 with tolerance. Hill interval for dynamic maps.</col>
</row>
<row>
<literal_col>Random</literal_col>
<col>4 integers</col>
<col>0-100 with tolerance. Random deviance for dynamic maps.</col>
</row>
<row>
<literal_col>Material</literal_col>
<col>String</col>
<col>Material-texture definition of the base material for dynamic maps.</col>
</row>
<row>
<literal_col>Liquid</literal_col>
<col>String</col>
<col>Material-texture definition of the liquid material for dynamic maps.</col>
</row>
<row>
<literal_col>LiquidLevel</literal_col>
<col>4 integers</col>
<col>0-100 with tolerance. Liquid level for dynamic maps.</col>
</row>
<row>
<literal_col>MapPlayerExtend</literal_col>
<col>Integer</col>
<col>0 or 1. Determines wether the dynamic map will be extended for every player activated at game start.</col>
</row>
<row>
<literal_col>Layers</literal_col>
<col>Material list</col>
<col>Additional material layers in earth for dynamic maps.</col>
</row>
<row>
<literal_col>ExactLandscape</literal_col>
<col>1 Integer</col>
<col>0 or 1. Specifies wether the Landscape.bmp is an actual game landscape.</col>
</row>
<row>
<literal_col>Gravity</literal_col>
<col>4 integers</col>
<col>10-200: Gravity. Default 100.</col>
</row>
<row>
<literal_col>NoScan</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, some ingame landscape checks will be turned of, such as freezing, melting or material counting.</col>
</row>
<row>
<literal_col>KeepMapCreator</literal_col>
<col>Integer</col>
<col>0 or 1. If 1, the internal MapCreater won't unload after game start, so functions like <funclink>DrawDefMap</funclink> still work.</col>
</row>
<row>
<literal_col>SkyScrollMode</literal_col>
<col>Integer</col>
<col>0 to 2. 0: Static sky, 1: The sky moves with the wind, 2: The sky is drawn half-parallax.</col>
</row>
<row>
<literal_col>FoWRes</literal_col>
<col>Integer</col>
<col>Granularity of the Fog of War. Default: 64. Warning: smaller values will improve the looks of the FoW but will also severely increase processing times.</col>
</row>
</table>
</text>
<text>
<table>
<caption id="SektionAnimals">Section [Animals]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<col>Animals</col>
<col>ID list</col>
<col>Freewheeling creatures.</col>
</row>
<row>
<col>Nest</col>
<col>ID list</col>
<col>Buried nests.</col>
</row>
</table>
</text>
<text>
<table>
<caption id="SektionWeather">Section [Weather]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<col>Climate</col>
<col>4 integers</col>
<col>0-100 with tolerance. Average temperature. 0 warm, 100 cold.</col>
</row>
<row>
<col>StartSeason</col>
<col>4 integers</col>
<col>0-100 with tolerance. Season at game start.</col>
</row>
<row>
<col>YearSpeed</col>
<col>4 integers</col>
<col>0-100 with tolerance. Speed of season change.</col>
</row>
<row>
<col>Rain</col>
<col>4 integers</col>
<col>0-100 with tolerance. Precipitation amount.</col>
</row>
<row>
<col>Wind</col>
<col>4 integers</col>
<col>-100-100 with tolerance. Wind direction and strength.</col>
</row>
<row>
<col>Precipitation</col>
<col>String</col>
<col>Simple material definition precipitation.</col>
</row>
<row>
<col>NoGamma</col>
<col>Integer</col>
<col>0 or 1. If 1, the current season won't cause a small global color change.</col>
</row>
</table>
</text>
<text>
<table>
<caption id="SektionEnvironment">Section [Environment]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<literal_col>Objects</literal_col>
<col>ID list</col>
<col>Environment control objects that are placed at game start.</col>
</row>
</table>
</text>
<text>
<table>
<caption id="SektionDefinitions">Section [Definitions]</caption>
<rowh>
<col>Value</col>
<col>Data type</col>
<col>Description</col>
</rowh>
<row>
<col>LocalOnly</col>
<col>Integer</col>
<col>If LocalOnly is 1, only definitions local to the scenario file will be load.</col>
</row>
<row>
<col>Definition1 to 9</col>
<col>String(s)</col>
<col>With Definition<em>x</em> entries you can specify which object definition packs (c4d) are to be loaded with this scenario. The specified files must be available in the Clonk directory. If files are specified here, manual pack selection in the menu system is disabled.</col>
</row>
<row>
<col>SkipDefs</col>
<col>ID list</col>
<col>List of object definitions (C4IDs) which are not to be loaded with this scenario. This can be used to prevent researching certain object types in the game.</col>
</row>
</table>
</text>
<author>Sven2</author><date>2002-04</date>
<author>Newton</author><date>2010-02</date>
</doc>

View File

@ -1,53 +1,43 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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()
<title>Scenario Scripts</title>
<h id="SzenarioScripte">Scenario Scripts</h>
<part>
<text>Scenario scripts can control a general mission sequence or define specific features such as rejoins or special player placement. For documentation of the scripting language see <emlink href="script/index.html">C4Script</emlink>.</text>
<h id="Callbacks">Callbacks in Scenario Scripts</h>
<text>At the start of each round, before the players have joined, the engine calls the function "Initialize" in the scenario script, if defined. Within this function a scenario can perform special object placement or start the scenario scripting sequence.</text>
<code>func Initialize()
{
<funclink>Log</funclink>("Hallo");
<funclink>Log</funclink>(&quot;Hallo&quot;);
<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()
<text>Sequential scripting: at the start of a round the internal script counter is set to 0. If sequential scripting has been started with ScriptGo, the counter is increased by one every ten frames and the corresponding script function is called in the scenario script, if defined.</text>
<code>func Script26()
{
<funclink>Log</funclink>("Diese Funktion wird nach 260 Frames ausgeführt.");
<funclink>Log</funclink>(&quot;Diese Funktion wird nach 260 Frames ausgeführt.&quot;);
}</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(player)
<text>The script counter can also be manually adjusted using <funclink>goto</funclink>() to jump to certain counter positions.</text>
<text>After joining a new player the engine calls the function InitializePlayer in the scenario script for that player. This function is called after the basic player objects as defined in Scenario.txt have been placed, so a preliminary starting position has been selected and the player's crew and starting material and buildings are present. In this function, you can now perform more special initial placement.</text>
<code>func InitializePlayer(player)
{
// Eine Meldung für diesen Spieler
<funclink>Log</funclink>( "Spieler Nr. %d ist beigetreten", player );
<funclink>Sound</funclink>("Ding");
// Eine Meldung für diesen Spieler
<funclink>Log</funclink>( &quot;Spieler Nr. %d ist beigetreten&quot;, player );
<funclink>Sound</funclink>(&quot;Ding&quot;);
// 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>(player));
}</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()
<text>When a player leaves a round, the function RemovePlayer is called.</text>
<text>If a round is ended through the game i.e. by player elimination, fulfillment of all goals as defined in Scenario.txt <emlink href="scenario/scenario.html#SektionGame">section [Game]</emlink>), or by the script command GameOver, the engine will call the function OnGameOver in the scenario script. This will not be called if the round was aborted.</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));
<funclink>Sound</funclink>(&quot;Trumpet&quot;);
// Hier bietet sich die Möglichkeit für spezielle Rundenauswertung in der Log-Datei Clonk4.log
<funclink>Log</funclink>(&quot;Vermögen von Spieler 1: %d&quot;, <funclink>GetWealth</funclink>(0));
}</code>
</part>
<author>Sven2</author><date>April 2002</date>
</part>
<author>Sven2</author><date>2002-04</date>
</doc>

View File

@ -1,27 +1,20 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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>
<title>#appendto</title>
<h>#appendto</h>
<part>
<text>By using #appendto you can avoid various object definition overloads.</text>
<h id="Syntax">Declaration</h>
<code>#appendto [id]</code>
<text>A script can append itself to one or multiple existing scripts using the <code>#appendto</code> directive. Functions of the same name will overload functions in the target script. The original overloaded functions can still be called using <emlink href="script/fn/inherited.html">inherited</emlink>. #included scripts are not appended with #append, but #appended scripts are included by #include.</text>
<code>#appendto *</code>
<text>Appending to <code>*</code> will append this script to all definitions.</text>
<text>A script can contain multiple #appendto directives. It is always compiled with the original script. This is of interest whenever local variables or functions from the appended script are used.</text>
</part>
<author>Sven2</author><date>2002-04</date>
<author>matthes</author><date>2004-06</date>
<author>Günther</author><date>2006-01</date>
</doc>

View File

@ -1,29 +1,29 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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++)
<title>Break / Continue</title>
<h id="BreakContinue">Break / Continue</h>
<part>
<text>The keywords <code>break</code> and <code>continue</code> are used for manual control of loops:</text>
<text>
<ul>
<li><code>break</code> ends the enclosing loop. Execution is continued after the end of the loop.</li>
<li><code>continue</code> ends the current loop execution and continues with the next loop item from the beginning of the loop.</li>
</ul>
</text>
<h>Example:</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);
<funclink>Log</funclink>(&quot;Zahl: %d&quot;, i);
if(i &gt; 6) break;
if(i &gt; 2) continue;
Log(&quot;Zahl: %d (2. Ausgabe)&quot;, i);
}
Log("Endwert: %d",i);</code>
<h>Ausgabe:</h>
<code>Zahl: 0
Log(&quot;Endwert: %d&quot;,i);</code>
<h>Output:</h>
<code>Zahl: 0
Zahl: 0 (2.Ausgabe)
Zahl: 1
Zahl: 1 (2.Ausgabe)
@ -35,13 +35,10 @@ 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>
<text>This loops counts the variable <code>i</code> from 0 to 10.</text>
<text>If the first three loop executions (i from 0 to 2) the value is displayed twice.</text>
<text>From value 3 on <code>continue</code> is called after the first output. This will skip the current loop execution. The output is made only once.</text>
<text>If value 7 is reached, <code>break</code> is called. <code>break</code> will, as opposed to <code>continue</code>, not only skip current loop execution but will break out of the whole loop. You can notice by seeing that the value of <code>i</code> is 7 at the end, not 11.</text>
</part>
<author>Peter</author><date>2001-07</date>
</doc>

View File

@ -1,18 +1,16 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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 */
<title>Effects</title>
<h>Effects</h>
<part>
<text>Any number of effects can be attached to an object. Effects can perform various tasks, thus eliminating the need for helper objects. This is especially of interest for magic spells that act with a given duration. Effects are available from CE on.</text>
<h id="Intro">Introduction</h>
<text>Effects are, roughly put, dynamic timers that can be attached to objects. Effects themselves have no visible or acoustic representation - for this you would use objects or particles instead - effects are pure scripting helpers. They also offer a general interface that can be used to resolve conflicts of temporary status changes made to objects by other objects at the same time.</text>
<text>Here an example of implementing an invisibility spell without effects:</text>
<code>/* Unsichtbarkeitszauber ohne Effektsystem */
@ -25,14 +23,14 @@ public func Activate(caster, caster2)
{
// Zauberer ermitteln
if (caster2) caster = caster2; target = caster;
// Magie kann man hören, ganz klar ;)
Sound("Magic*");
// Magie kann man hören, ganz klar ;)
Sound(&quot;Magic*&quot;);
// Vorherige Sichtbarkeit des Zauberers speichern
old_visibility = GetVisibility(caster);
old_modulation = GetClrModulation(caster);
// Zauberer unsichtbar machen
SetVisibility(VIS_Owner | VIS_Allies | VIS_God, caster);
// Halbdurchsichtig bläulich für den Besitzer und Verbündete
// Halbdurchsichtig bläulich für den Besitzer und Verbündete
SetClrModulation(ModulateColor(old_modulation, RGBa(127,127,255,127)), caster);
// Timer starten: 30 Sekunden unsichtbar
remaining_time = 30;
@ -40,7 +38,7 @@ public func Activate(caster, caster2)
protected func TimerCall()
{
// Zeit zählen
// Zeit zählen
if (remaining_time--) return true;
// Fertig; Objekt entfernen
return(RemoveObject());
@ -53,14 +51,11 @@ protected func Destruction()
SetVisibility(old_visibility, target);
return true;
}</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 */
<text>The magic spell object exists until the spell has ended and then makes the clonk visible again. Also, if the spell object is deleted for other reasons (e.g. a scenario section change), the clonk is made visible in the Destruction callback (if this wasn't so, the clonk would remain invisible for ever). Also there is a Timer (defined in the DefCore) called every second. Notice you couldn't just have a single timer call to mark the end of the spell because timer intervals are marked in the engine beginning with the start of the round and you wouldn't know at what point within an engine timer interval the spell would start.</text>
<text>However, there are some problems with this implementation: for example, the magician can not cast a second invisibility spell while he's already invisible - the second spell would have practically no effect, because the end of the first spell would make the clonk visible again. The spell script would have to do some special handling for this case - but not only for multiple invisibility spells, but also for any other spell or script that might affect visibility or coloration of the clonk. Even if this spell would remember the previous value e.g. for coloration it could not handle a situation in which other scripts change the color of their own in the middle of the spell. The same problems occur when multiple scripts modify temporary clonk physcials such as jumping, walking speed, fight strength or visibility range, energy, magic energy etc. Using effects, these conflicts can be avoided.</text>
<h id="Usage">Application</h>
<text>Effects are created using <funclink>AddEffect</funclink> and removed with <funclink>RemoveEffect</funclink>. If an effect was successfully created, the callback Fx*Start is made (* is replaced with the effect name). Depending on the parameters, there can also be an Fx*Timer call for continuous activity such as casting sparks, adjusting energy etc. Finally, when the effect is deleted, the callback Fx*Stop is made. Now, the invisibility spell implemented using effects:</text>
<code>/* Unsichtbarkeitszauber mit Effektsystem */
@ -72,10 +67,10 @@ public func Activate(caster, caster2)
{
// Zauberer ermitteln
if (caster2) caster = caster2;
// Magie kann man hören, ganz klar ;)
Sound("Magic*");
// Magie kann man hören, ganz klar ;)
Sound(&quot;Magic*&quot;);
// Effekt starten
AddEffect("InvisPSpell", caster, 200, 1111, 0, GetID());
AddEffect(&quot;InvisPSpell&quot;, caster, 200, 1111, 0, GetID());
// Fertig - das Zauberobjekt wird nun nicht mehr gebraucht
return(RemoveObject());
}
@ -87,7 +82,7 @@ protected func FxInvisPSpellStart(target, num)
var old_mod = EffectVar(1, target, num) = GetClrModulation(target);
// Zauberer unsichtbar machen
SetVisibility(VIS_Owner() | VIS_Allies() | VIS_God(), target);
// Halbdurchsichtig bläulich für den Besitzer und Verbündete
// Halbdurchsichtig bläulich für den Besitzer und Verbündete
SetClrModulation(ModulateColor(old_mod, RGBa(127,127,255,127)), target);
// Fertig
return true;
@ -101,23 +96,18 @@ protected func FxInvisPSpellStop(target, num)
// Fertig
return true;
}</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(target, num)
<text>In this case, the magic spell object only starts the effect, then deletes itself immediately. The engine ensures that there are no conflicts with multiple effects modifying the visibility: effects are stored in a stack which ensures that effects are always removed in the opposite order of their addition. For this, there are a couple of extra Start and Stop calls to be made which are explained in detail later.</text>
<text>This effects does not have a timer function. It does, however, define a timer interval of 1111 which will invoke the standard timer function after 1111 frames which will delete the effect. Alternatively, you could define a timer function as such:</text>
<code>protected func FxInvisPSpellTimer(target, num)
{
// Rückgabewert -1 bedeutet, dass der Effekt gelöscht wird
// 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 */
<text>To store the previous status of the target object, special storage space in <funclink>EffectVar</funclink>() is used. This is necessary because in this case the effect callbacks to not have any object script context. So you cannot access any object local variables in the effect callbacks - remember that the magic spell object which has created the effect is already deleted. If you require an object context in the effect callbacks you can specify one in <funclink>AddEffect</funclink>(). In that case, effect callbacks would be in object local context and the effect would automatically be deleted if the target object is destroyed.</text>
<h id="Priorities">Priorities</h>
<text>When creating an effect you always specify a priority value which determines the effect order. The engine ensures that effects with lower priority are added before effects with a higher priority - even if this means deleting an existing effect of higher priority. So if one effect colors the clonk green and another colors the clonk red, the result will be that of the effect with higher priority. If two effects have the same priority, the order is undefined. However, it is guaranteed that effects added later always notify the Fx*Effect callback of the same priority.</text>
<text>In the case of the red and green color, one effect could also determine the previous coloring and then mix a result using ModulateColor. But priorities also have another function: an effect of higher priority can prevent the addition of other effects of lower priority. This is done through the Fx*Effect callback. If any existing effect reacts to this callback with the return value -1, the new effect is not added (the same applies to the Start callback of the effect itself). Here an example:</text>
<code>/* Feuerimmunitätszauber */
@ -125,17 +115,17 @@ public func Activate(caster, caster2)
{
// Zauberer ermitteln
if (caster2) caster = caster2;
// Magie kann man hören, ganz klar ;)
Sound("Magic*");
// Magie kann man hören, ganz klar ;)
Sound(&quot;Magic*&quot;);
// Effekt starten
AddEffect("BanBurnPSpell", caster, 180, 1111, 0, GetID());
AddEffect(&quot;BanBurnPSpell&quot;, caster, 180, 1111, 0, GetID());
// Fertig - das Zauberobjekt wird nun nicht mehr gebraucht
return(RemoveObject());
}
protected func FxBanBurnPSpellStart(target, num, temporary)
{
// Beim Start des Effektes: Clonk löschen, wenn er brennt
// Beim Start des Effektes: Clonk löschen, wenn er brennt
if (!temporary) Extinguish(target);
return true;
}
@ -143,70 +133,100 @@ protected func FxBanBurnPSpellStart(target, num, temporary)
protected func FxBanBurnPSpellEffect(new_name, target, num, new_num, var1, var2, var3)
{
// Feuer abblocken
if (WildcardMatch(new_name, "*Fire*")) return -1;
if (WildcardMatch(new_name, &quot;*Fire*&quot;)) 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>[...]
<text>This effect makes the clonk fire-proof for 30 seconds. The effect is implemented without any Timer or Stop callbacks as the complete functionality is achieved by simply blocking other effects which might have "Fire" as part of their name. This especially applies to the engine internal fire which has exactly the name "Fire". Of course, you could still add a Timer callback for graphic effects so the player can see that his clonk is immune. Also, you could create special visual effects when preventing incineration in FxBanBurnPSpellEffect. For the like:</text>
<code>[...]
protected func FxBanBurnPSpellEffect(new_name, target, num, new_num, var1, var2, var3)
{
// Nur Feuer behandeln
if (!WildcardMatch(new_name, "*Fire*")) return();
if (!WildcardMatch(new_name, &quot;*Fire*&quot;)) return();
// Beim Feuer haben die drei Extraparameter normalerweise folgende Bedeutung:
// var1: caused_by - Spieler, der für das Feuer verantwortlich ist
// var1: caused_by - Spieler, der für das Feuer verantwortlich ist
// var2: blasted - bool: Ob das Feuer durch eine Explosion zustande kam
// var3: burning_object - Objekt: Anzündendes Objekt
// Anzündendes Objekt löschen
// var3: burning_object - 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 reason-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 */
<text>This would even delete all burning objects which would otherwise incinerate the target object. The type check for var3 avoids possible conflicts with other "Fire" effects that might have differing parameters. Obviously, conflict situations like this should be avoided at all cost.</text>
<text>The following table contains general guidelines for priorities in effects of the original pack:</text>
<text>
<table>
<rowh>
<col>Effect</col>
<col>Priority</col>
</rowh>
<row>
<col>Short special effects</col>
<col>300-350</col>
</row>
<row>
<col>Effects which cannot be banned</col>
<col>250-300</col>
</row>
<row>
<col>Magic ban spell</col>
<col>200-250</col>
</row>
<row>
<col>Permanent magic ban spell</col>
<col>180-200</col>
</row>
<row>
<col>Short term, benevolent magic effects</col>
<col>150-180</col>
</row>
<row>
<col>Short term, malevolent magic effects</col>
<col>120-150</col>
</row>
<row>
<col>Normal Effects</col>
<col>100-120</col>
</row>
<row>
<col>Fire as used by the engine</col>
<col>100</col>
</row>
<row>
<col>Permanent magic effects</col>
<col>50-100</col>
</row>
<row>
<col>Permanent other effects</col>
<col>20-50</col>
</row>
<row>
<col>Internal effects, data storage etc.</col>
<col>1</col>
</row>
</table>
</text>
<text>Generally, effect priorities should be chosen by dependency: if one effect should prevent another it needs a higher priority to do this (even if it is a permanent effect). Short term effects should have a higher priority than long term effects so that short term changes in the object are visible on top of long term effects.</text>
<text>The engine internal fire is of priority 100. So a magic fire which also uses the properties of the engine fire should have a slightly higher priority and should call the respective FxFire* functions within its callbacks. For proper functioning all effect callback (i.e. Start, Timer, and Stop) should be forwarded as each might depend on the action of the others. If this is not possible in your case, you should reimplement the complete fire functionality by script.</text>
<text>Effects with priority 1 are a special case: Other effects are never temporarily removed for them and they are never temporarily removed themselves.</text>
<h id="SpecAddRemove">Special Add/Remove Calls</h>
<text>For the engine to ensure that effects are always removed in opposite order, it might in some cases be necessary to temporarily remove and later re-add existing effects. In these situations, the scripter should obviously take care to remove any object changes and reapply them after re-adding so that other effects will behave accordingly.</text>
<text>Effects are also removed when the target object is deleted or dies - the cause for the removal is passed in the reason parameter to the Remove function of the effect. This can be used e.g. to reanimate a clonk immediately upon his death:</text>
<code>/* Wiederbelebungszauber */
// EffectVars: 0 - Anzahl der zusätzlichen Wiederbelebungen
// EffectVars: 0 - Anzahl der zusätzlichen Wiederbelebungen
public func Activate(caster, caster2)
{
// Zauberer ermitteln
if (caster2) caster = caster2;
// Magie kann man hören, ganz klar ;)
Sound("Magic*");
// Magie kann man hören, ganz klar ;)
Sound(&quot;Magic*&quot;);
// Effekt starten
AddEffect("ReincarnationPSpell", caster, 180, 0, 0, GetID());
AddEffect(&quot;ReincarnationPSpell&quot;, caster, 180, 0, 0, GetID());
// Fertig - das Zauberobjekt wird nun nicht mehr gebraucht
return(RemoveObject());
}
@ -214,7 +234,7 @@ public func Activate(caster, caster2)
protected func FxReincarnationPSpellStart(target, num, temporary)
{
// Nur beim ersten Start: Meldung
if (!temporary) target->Message("%s bekommt|ein Extraleben", GetName(target));
if (!temporary) target-&gt;Message(&quot;%s bekommt|ein Extraleben&quot;, GetName(target));
return true;
}
@ -229,31 +249,28 @@ protected func FxReincarnationPSpellStop(target, num, reason, temporary)
// Energie geben
DoEnergy(100, target);
// Nachricht
Sound("Magic*", 0, target);
target->Message("%s|wurde wiederbelebt.", GetName(target));
Sound(&quot;Magic*&quot;, 0, target);
target-&gt;Message(&quot;%s|wurde wiederbelebt.&quot;, GetName(target));
// Effekt wirkt nur einmal: Entfernen
return true;
}</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 */
<text>This effect reanimates the clonk as many times as he has cast the reanimation spell.</text>
<h id="GlobalEffects">Global Effects</h>
<text>Global effects are effects that are not bound to any target object. With global effects, too, priorities are observed and temporary Add/Remove calls might be necessary to ensure order. Simply imagine all global effects are attached to an imaginary object. Global effects are accessed whenever you specify 0 for the target object.</text>
<text>This can be used to make changes to gravity, sky color, etc. Here's an example for a spell that temporarily reduces gravity and then resets the original value:</text>
<code>/* Gravitationszauber */
// EffectVars: 0 - Vorherige Gravitation
// 1 - Änderung durch den Zauber
// 1 - Änderung durch den Zauber
public func Activate(caster, caster2)
{
// Magie kann man hören, ganz klar ;)
Sound("Magic*");
// Magie kann man hören, ganz klar ;)
Sound(&quot;Magic*&quot;);
// Effekt global starten
AddEffect("GravChangeUSpell", 0, 150, 37, 0, GetID(), -10);
AddEffect(&quot;GravChangeUSpell&quot;, 0, 150, 37, 0, GetID(), -10);
// Fertig - das Zauberobjekt wird nun nicht mehr gebraucht
RemoveObject();
return true;
@ -264,11 +281,11 @@ protected func FxGravChangeUSpellStart(target, num, temporary, change)
// Anderen Gravitationseffekt suchen
if (!temporary)
{
var iOtherEffect = GetEffect("GravChangeUSpell", target);
if (iOtherEffect == num) iOtherEffect = GetEffect("GravChangeUSpell", target, 1);
var iOtherEffect = GetEffect(&quot;GravChangeUSpell&quot;, target);
if (iOtherEffect == num) iOtherEffect = GetEffect(&quot;GravChangeUSpell&quot;, target, 1);
if (iOtherEffect)
{
// Gravitationsänderung auf diesen Effekt aufrechnen
// Gravitationsänderung auf diesen Effekt aufrechnen
EffectVar(1, target, iOtherEffect) += change;
SetGravity(GetGravity() + change);
// Selbst entfernen
@ -277,10 +294,10 @@ protected func FxGravChangeUSpellStart(target, num, temporary, change)
}
// Vorherige Gravitation sichern
var iOldGrav = EffectVar(0, target, num) = GetGravity();
// Für nichttemporäre Aufrufe wird change übergeben, und auf den Änderungswert aufgerechnet
// Für nichttemporäre Aufrufe wird change übergeben, und auf den Änderungswert aufgerechnet
if (change) EffectVar(1, target, num) += change;
// Gravitationsänderung setzen
// Die Änderung kann in temporären Aufrufen auch ungleich change sein
// Gravitationsänderung setzen
// Die Änderung kann in temporären Aufrufen auch ungleich change sein
SetGravity(iOldGrav + EffectVar(1, target, num));
// Fertig
return true;
@ -306,87 +323,75 @@ protected func FxGravChangeUSpellStop(target, num)
// Effekt entfernen
return true;
}</code>
<text>target 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>[...]
<text>target will be 0 in all these effect calls. You should still pass this parameter to calls such as <funclink>EffectVar</funclink>() for then it is also possible to attach effects to the magician or perhaps a magic tower. In this case, gravity would automatically be reset as soon as the magician dies or the magic tower is destroyed.</text>
<h id="AddEffects">Adding Effects</h>
<text>In the previous example, several gravitational effects were combined so that the gravity change lasts longer if the spell is casted multiple times. Adding these effects cannot be done in the Effect callback because the gravitation effect might always be prevented by another effect with higher priority (e.g. a no-spells-whatsoever-effect). Through the special Fx*Add callback you can achieve the desired result more easily, or at least in a more structured fashion.</text>
<code>[...]
protected func FxGravChangeUSpellEffect(new_name, target, num)
{
// Falls der neu hinzugefügte Effekt auch eine Gravitationsänderung ist, Interesse am Übernehmen anmelden
if (new_name eq "GravChangeUSpell") return (-3);
// Falls der neu hinzugefügte Effekt auch eine Gravitationsänderung ist, Interesse am Übernehmen anmelden
if (new_name eq &quot;GravChangeUSpell&quot;) return (-3);
// Ansonsten ignorieren
return();
}
protected func FxGravChangeUSpellAdd(target, num, new_name, target, new_timer, change)
{
// Aufruf erfolgt, wenn der Effekt übernommen werden konnte
// Gravitationsänderung auf diesen Effekt aufrechnen
// Aufruf erfolgt, wenn der Effekt übernommen werden konnte
// Gravitationsänderung auf diesen Effekt aufrechnen
EffectVar(1, target, num) += change;
SetGravity(GetGravity() + change);
// Fertig
return true;
}</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 true; } // Feuer is heiß
<text>Returning -3 in the Fx*Effect callback will cause the Fx*Add callback to be invoked for the new effect. In this case the new effect is not actually created and the function AddEffect will return the effect number of the effect which has taken on the consequences of the new effect instead. As opposed to the method above this has the advantage that the return value can now be used to determine whether the effect has been created at all.</text>
<h id="UserCallbacks">User Defined Properties</h>
<text>Effects can be easily classified by name. In this way, e.g. all magic spell effects can easily be found through the respective wildcard string. If, however, you want to create user-defined properties which also apply to existing effects you can do this by defining additional effect functions:</text>
<code>global func FxFireIsHot() { return true; } // Feuer is heiß
// Funktion, die alle heißen Effekte vom Zielobjekt entfernt
// Funktion, die alle heißen Effekte vom Zielobjekt entfernt
global func RemoveAllHotEffects(target)
{
// Lokaler Aufruf
if (!target) target=this();
// Alle Effekte durchsuchen und die heißen entfernen
// Alle Effekte durchsuchen und die heißen entfernen
var effect_num, i;
while (effect_num = GetEffect("*", target, i++))
if (EffectCall(target, effect_num, "IsHot"))
while (effect_num = GetEffect(&quot;*&quot;, target, i++))
if (EffectCall(target, effect_num, &quot;IsHot&quot;))
RemoveEffect(0, target, effect_num);
}</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 */
<text>Using <funclink>EffectCall</funclink>() you can of course also call functions in the effect, e.g. to extend certain effects.</text>
<h id="BlendFx">Blind Effects</h>
<text>Sometimes effects only need to be created in order to produce the respective callbacks in other effects - for example with magic spells which don't have any animation or long term effects but which nonetheless might be blocked by other effects. Example for the earthquake spell:</text>
<code>/* Erdbebenzauber */
public func Activate(object caster, object caster2)
{
Sound("Magic1");
// Effekt prüfen
Sound(&quot;Magic1&quot;);
// Effekt prüfen
var result;
if (result = CheckEffect("EarthquakeNSpell", 0, 150)) return(result!=-1 &amp;&amp; RemoveObject());
// Effekt ausführen
if (result = CheckEffect(&quot;EarthquakeNSpell&quot;, 0, 150)) return(result!=-1 &amp;&amp; RemoveObject());
// Effekt ausführen
if (GetDir(caster)==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
<text>The return value of <funclink>CheckEffect</funclink>() is -1 if the effect was rejected and a positive value or -2 if the effect was accepted. In both cases the effect itself should not be executed, but in the latter case the Activate function may signal success by returning 1.</text>
<h id="Ext">Extended Possibilities</h>
<text>As every effect has its own data storage, effects are also a way of attaching external data to objects without having to change the object definition for that. Also, simple calls can be delayed, e.g. for one frame after destruction of the object as is done at one place in the Knights pack:</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);
// Globaler Temporäreffekt, wenn nicht schon vorhanden
if (!GetEffect(&quot;IntCPW2CastleChange&quot;))
AddEffect(&quot;IntCPW2CastleChange&quot;, 0, 1, 2, 0, CPW2);
return true;
}
@ -394,22 +399,19 @@ protected func FxIntCPW2CastleChangeStop()
{
// Alle BurgTeile benachrichtigen
for(var obj in FindObjects(Find_OCF(OCF_Fullcon), Find_NoContainer())
obj->~CastleChange();
obj-&gt;~CastleChange();
// Fertig
return true;
}</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 */
<text>For this application, the effect name should start with "Int" (especially if working with global callbacks) followed by the id of the object to avoid any kind of name conflict with other effects.</text>
<text>Also, certain action can be taken at the death of an object without having to modify that object's definition. A scenario script might contain:</text>
<code>/* Szenarioscript */
protected func Initialize()
{
// Alle Wipfe manipulieren
for(var obj in FindObjects(Find_ID(WIPF), Find_OCF(OCF_Alive)))
AddEffect("ExplodeOnDeathCurse", obj, 20);
AddEffect(&quot;ExplodeOnDeathCurse&quot;, obj, 20);
}
global func FxExplodeOnDeathCurseStop(target, num, reason)
@ -418,145 +420,208 @@ global func FxExplodeOnDeathCurseStop(target, num, reason)
if (reason == 4) Explode(20, target);
return true;
}</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 target, int num, int temporary, any var1, any var2, any var3, any var4);</code></text>
<text>Wird beim Start des Effektes aufgerufen. target gibt das Zielobjekt des Effektes an, und num 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 temporary 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 temporary 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 target, int num, int reason, bool temporary);</code></text>
<text>Aufruf, wenn der Effekt temporär oder permanent entfernt wird. target ist wieder das Effekt-Zielobjekt und num der Effektindex in der Effekteliste des Objekts.</text>
<text>reason gibt den Grund für das Entfernen des Effektes an, und kann einer der folgenden Werte sein:</text>
<text><table>
<rowh><col>reason</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. temporary 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 target, int num, int time);</code></text>
<text>Periodischer Timer-Aufruf, wenn bei der Effekterzeugung ein Timer-Intervall angegeben wurde. target und num spezifizieren auch hier Zielobjekt und Effekt.</text>
<text>time 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 new_name, object target, int num, int new_num, any var1, any var2, any var3, any var4);</code></text>
<text>Aufruf an alle Effekte mit höherer Priorität, wenn ein neuer Effekt zu demselben Objekt (target) hinzugefügt werden soll. new_name gibt den Namen des neuen Effektes an; num den Effektindex des Effektes, bei dem angefragt wird, und new_num 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 new_num-Parameter kann aber verwendet werden, um mit <funclink>EffectCall</funclink>() Informationen über den Effekt abzufragen. Bei Aufrufen durch die <funclink>CheckEffect</funclink>()-Funktion ist new_num 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 target, int num, string new_name, int new_timer, any var1, any var2, any var3, any var4);</code></text>
<text>Aufruf an einen übernehmenden Effekt, wenn dieser zuvor auf einen Fx*Effect-Callback hin -2 oder -3 zurückgegeben hat. num gibt die Nummer des Effektes an, zu dem hinzugefügt wird; target das Zielobjekt (0 bei globalen Effekten).</text>
<text>new_timer 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 target, int num, int damage, int cause);</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. cause gibt den geänderten Wert und den Grund an:</text>
<text><table>
<rowh><col>Scriptkonstante</col><col>cause</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 "cause &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>
<text>All wipfs present at the beginning of the scenario will explode on death!</text>
<h id="Naming">Naming</h>
<text>So that effects might properly recognize and manipulate each other you should stick to the following naming scheme ("*abc" means endings, "abc*" means prefixes, and "*abc*" means string parts which might occur anywhere in the name).</text>
<text>
<table>
<rowh>
<col>Name section</col>
<col>Meaning</col>
</rowh>
<row>
<col>*Spell</col>
<col>Magic effect</col>
</row>
<row>
<col>*PSpell</col>
<col>Benevolent magic effect</col>
</row>
<row>
<col>*NSpell</col>
<col>Malevolent magic effect</col>
</row>
<row>
<col>*USpell</col>
<col>Neutral magic effect</col>
</row>
<row>
<col>*Fire*</col>
<col>Fire effect - the function <funclink>Extinguish</funclink>() removes all effects of this name</col>
</row>
<row>
<col>*Curse*</col>
<col>Curse</col>
</row>
<row>
<col>*Ban*</col>
<col>Effect preventing other effects (e.g. fire proofness or immunity)</col>
</row>
<row>
<col>Int*</col>
<col>Internal effect (data storage etc.)</col>
</row>
<row>
<col>*Potion</col>
<col>Magic potion</col>
</row>
</table>
</text>
<text>Warning: as function names may not be more than 100 characters in length (and you will lose oversight eventually), you should not stuff too much information into the effect name. Effect names are case sensitive. Also, you should avoid using any of these identifiers in your effect names if your effect doesn't have anything to do with them.</text>
<h id="CBRef">Callback Reference</h>
<part>
<text>The following callbacks are made by the engine and should be implemented in your script according to necessity. * is to be replaced by your effect name.</text>
<h>Fx*Start</h>
<text><code>int Fx*Start (object target, int num, int temporary, any var1, any var2, any var3, any var4);</code></text>
<text>Called at the start of the effect. target is the target object of the effect. num is the effect index. These two parameters can be used to identify the effect, e.g. to manipulate corresponding variables in <funclink>EffectVar</funclink>().</text>
<text>In normal operation the parameter temporary is 0. It is 1 if the effect is re-added after having been temporarily removed and 2 if the effect was temporarily removed and is now to be deleted (in this case a Remove call will follow).</text>
<text>Values var1 to var4 are the additional parameters passed to <placeholder-1/>() and can be custom used.</text>
<text>If temporary is 0 and this callback returns -1 the effect is not created and the corrsponding <funclink>AddEffect</funclink>() call returns 0.</text>
<h>Fx*Stop</h>
<text><code>int Fx*Stop (object target, int num, int reason, bool temporary);</code></text>
<text>When the effect is temporarily or permanently removed. target again is the target object and num the index into the effects list of that object.</text>
<text>reason contains the cause of the removal and can be one of the following values:</text>
<text>
<table>
<rowh>
<col>reason</col>
<col>Meaning</col>
</rowh>
<row>
<col>0</col>
<col>Normal removal</col>
</row>
<row>
<col>1</col>
<col>Temporary removal (temporary is 1).</col>
</row>
<row>
<col>2</col>
<col>Not used</col>
</row>
<row>
<col>3</col>
<col>The target object has been deleted</col>
</row>
<row>
<col>4</col>
<col>The target object has died</col>
</row>
</table>
</text>
<text>The effect can prevent removal by returning -1. This will not help, however, in temporary removals or if the target object has been deleted.</text>
<h>Fx*Timer</h>
<text><code>int Fx*Timer (object target, int num, int time);</code></text>
<text>Periodic timer call, if a timer interval has been specified at effect creation. target and num as usual.</text>
<text>time specifies how long the effect has now been active. This might alternatively be determined using <funclink>GetEffect</funclink>().</text>
<text>If this function is not implemented or returns -1, the effect will be deleted after this call.</text>
<h>Fx*Effect</h>
<text><code>int Fx*Effect (string new_name, object target, int num, int new_num, any var1, any var2, any var3, any var4);</code></text>
<text>A call to all effects of higher priority if a new effect is to be added to the same target object. new_name is the name of the new effect; num is the index of the effect being called; and ew_num is the index of the new effect.</text>
<text>Warning: the new effect is not yet properly initialized and should not be manipulated in any way. Especially the priority field might not yet have been set. The new_num can however be used to request information via <funclink>EffectCall</funclink>(). In calls made by <funclink>CheckEffect</funclink>() new_num is always 0.</text>
<text>This function can return -1 to reject the new effect. As the new effect might also be rejected by other effects, this callback should not try to add effects or similar (see gravitation spell). Generally you should not try to manipulate any effects during this callback.</text>
<text>Return -2 or -3 to accept the new effect. As long as the new effect is not rejected by any other effect, the Fx*Add call is then made to the accepting effect, the new effect is not actually created, and the calling AddEffect function returns the effect index of the accepting effect. The return value -3 will also temporarily remove all higher prioriy effects just before the Fx*Add callback and re-add them later.</text>
<text>var1 bis var4 are the parameters passed to <funclink>AddEffect</funclink>()</text>
<h>Fx*Add</h>
<text><code>int Fx*Add (object target, int num, string new_name, int new_timer, any var1, any var2, any var3, any var4);</code></text>
<text>Callback to the accepting effect if that has returned -2 or -3 to a prior Fx*Effect call. num identifies the accepting effect to which the consequences of the new effect will be added; target is the target object (0 for global effects).</text>
<text>new_timer is the timer interval of the new effect; var1 to var4 are the parameters from AddEffect. Notice: in temporary calls, these parameters are not available - here they will be 0.</text>
<text>If -1 is returned, the accepting effect is deleted also. Logically, the calling AddEffect function will then return -2.</text>
<h>Fx*Damage</h>
<text><code>int Fx*Damage (object target, int num, int damage, int cause);</code></text>
<text>Every effect receives this callback whenever the energy or damage value of the target object is to change. If the function is defined, it should then return whether to allow the change.</text>
<text>This callback is made upon life energy changes in living beings and damage value changes in non-livings - but not vice versa. cause contains the value change and reason:</text>
<text>
<table>
<rowh>
<col>Script constant</col>
<col>cause</col>
<col>Meaning</col>
</rowh>
<row>
<col>FX_Call_DmgScript</col>
<col>0</col>
<col>Damage by script call <funclink>DoDamage</funclink>()</col>
</row>
<row>
<col>FX_Call_DmgBlast</col>
<col>1</col>
<col>Damage by explosion</col>
</row>
<row>
<col>FX_Call_DmgFire</col>
<col>2</col>
<col>Damage by fire</col>
</row>
<row>
<col>FX_Call_DmgChop</col>
<col>3</col>
<col>Damage by chopping (only trees)</col>
</row>
<row>
<col>FX_Call_EngScript</col>
<col>32</col>
<col>Energy value change by script call <funclink>DoEnergy</funclink>()</col>
</row>
<row>
<col>FX_Call_EngBlast</col>
<col>33</col>
<col>Energy loss by explosion</col>
</row>
<row>
<col>FX_Call_EngObjHit</col>
<col>34</col>
<col>Energy loss by object hit</col>
</row>
<row>
<col>FX_Call_EngFire</col>
<col>35</col>
<col>Energy loss by fire</col>
</row>
<row>
<col>FX_Call_EngBaseRefresh</col>
<col>36</col>
<col>Energy recharge at the home base</col>
</row>
<row>
<col>FX_Call_EngAsphyxiation</col>
<col>37</col>
<col>Energy loss by suffocation</col>
</row>
<row>
<col>FX_Call_EngCorrosion</col>
<col>38</col>
<col>Energy loss through acid</col>
</row>
<row>
<col>FX_Call_EngStruct</col>
<col>39</col>
<col>Energy loss of buildings (only "living" buildings)</col>
</row>
<row>
<col>FX_Call_EngGetPunched</col>
<col>40</col>
<col>Energy loss through clonk-to-clonk battle</col>
</row>
</table>
</text>
<text>Generally, the expression "cause &amp; 32" can be used to determine whether the energy or damage values were changed. Energy values are exact, meaning 100,000 is the full energy value of a normal clonk of rank 10 (C4MaxPhysical).</text>
<text>Using this callback, damage to an object can be prevented, lessened, or increased. You could deduct magic energy instead, transfer damage to other objects, or something similar.</text>
</part>
<h id="FnRef">Function Reference</h>
<text>There are the following functions for manipulation of effects:</text>
<text>
<ul>
<li><funclink>AddEffect</funclink>() - for effect creation</li>
<li><funclink>RemoveEffect</funclink>() - for effect removal</li>
<li><funclink>GetEffect</funclink>() - to request effect parameters</li>
<li><funclink>GetEffectCount</funclink>() - for effect counting</li>
<li><funclink>EffectCall</funclink>() - for user defined calls in effects</li>
<li><funclink>EffectVar</funclink>() - to request effect variables</li>
<li><funclink>ChangeEffect</funclink>() - to modify effect names and timers (e.g. for multi-stage effects)</li>
<li><funclink>CheckEffect</funclink>() - to cause effects callbacks without actually creating an effect</li>
</ul>
</text>
</part>
<author>Sven2</author><date>2004-03</date>
</doc>

View File

@ -1,107 +1,85 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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()
<title>Calling Script Functions</title>
<h>Calling Script Functions</h>
<part>
<text>By calling a script function you will execute that function's code. The calling script may pass parameter values to the function and receive a return value from the function.</text>
<h>Calling a local function</h>
<part>
<text>If the function to be called was declared in the same script as the calling script it this is considered a "local call". The function can be called directly by its function name only.</text>
<h>Example:</h>
<code>func TestFunktion()
{
<funclink>Log</funclink>("Die Test-Funktion wurde aufgerufen!");
<funclink>Log</funclink>(&quot;Die Test-Funktion wurde aufgerufen!&quot;);
}
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()
<text>When function Aufruf() is executed, it will also call the function TestFunktion() which will output a message to the log.</text>
</part>
<h>Calling a function in another object</h>
<part>
<text>To call a function in another object you have to specify that object first, then the function name.</text>
<h>Example:</h>
<text>Script Object A (ID AAAA):</text>
<code>func Activate()
{
<funclink>Log</funclink>("Activate wurde in Objekt A aufgerufen!");
<funclink>Log</funclink>(&quot;Activate wurde in Objekt A aufgerufen!&quot;);
<funclink>Explode</funclink>(20);
}</code>
<text>Script Objekt B:</text>
<code>func Activate()
<text>Script Object B:</text>
<code>func Activate()
{
var obj = <funclink>FindObject</funclink>(AAAA, -1, -1, -1, -1);
obj->Activate();
obj-&gt;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()
<text>The function Activate() in the script of object B will first search for the closest object of type A (definition ID AAAA) and store a pointer to this object in the variable "obj". Then the function Activate() is called in the script of object A. To do this we first specifiy the variable containing the pointer to the object, followed by an arrow operator, then the function name including the parameter list (no parameters in this case).</text>
<text>Calling Activate() in object B will cause the closest object of type A to be blown up. You may consider this a very primitive type of remote control. By the way, this script will cause an error if no object of type A can be found.</text>
<h>Remarks</h>
<text>You don't <i>have</i> to store the object pointer in a variable as done in this example. You could also continue calling the function directly on the search result as in this case:</text>
<code>func Activate()
{
<funclink>FindObject</funclink>(AAAA, -1, -1, -1, -1)->Activate();
<funclink>FindObject</funclink>(AAAA, -1, -1, -1, -1)-&gt;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()
<text>To make sure that an object function is called from a given definition script you can also specify the definition's ID just before the function name. In some cases this may be necessary to resolve ambiguities if functions of the same name override each other.</text>
<code>func Activate()
{
var obj = <funclink>FindObject</funclink>(AAAA, -1, -1, -1, -1);
obj->AAAA::Activate();
obj-&gt;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()
</part>
<h>Indirect call of script functions</h>
<part>
<text>In some cases you may want somebody else to call a script function that you have specified. The engine function <funclink>Call</funclink> can do such "indirect" calls. You simply pass the function name of the function to be called as string.</text>
<h>Example:</h>
<code>func TestFunktion()
{
<funclink>Log</funclink>("Die Test-Funktion wurde aufgerufen!");
<funclink>Log</funclink>(&quot;Die Test-Funktion wurde aufgerufen!&quot;);
}
func Aufruf()
{
<funclink>Call</funclink>("TestFunktion");
<funclink>Call</funclink>(&quot;TestFunktion&quot;);
}</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()
<text>Usually, indirect calls are a bit slower than direct calls, since they cannot be precompiled and the function will have to be searched by name at runtime.</text>
<text>On the other hand, with indirect calls you can "decide" at runtime which function to call as is done in the following example:</text>
<code>func TestFunktion()
{
<funclink>Call</funclink>(<funclink>Format</funclink>("Aufruf%d", <funclink>Random</funclink>(3)));
<funclink>Call</funclink>(<funclink>Format</funclink>(&quot;Aufruf%d&quot;, <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>
func Aufruf0() { <funclink>Log</funclink>(&quot;Die erste Funktion wurde aufgerufen!&quot;); }
func Aufruf1() { <funclink>Log</funclink>(&quot;Die zweite Funktion wurde aufgerufen!&quot;); }
func Aufruf2() { <funclink>Log</funclink>(&quot;Die dritte Funktion wurde aufgerufen!&quot;); }</code>
<text>In TestFunktion() a <em>random</em> function is called (using <funclink>Random</funclink> and <funclink>Format</funclink> one of the three strings "Aufruf1", "Aufruf2", and "Aufruf3" is randomly composed and passed to <code>Call</code>).</text>
<text>This process has to be done with indirect calls as only at runtime we can know which function is to be called.</text>
<text>There are also some other methods of indirect calls. See <funclink>ObjectCall</funclink> and <funclink>GameCall</funclink>. Also see <funclink>PrivateCall</funclink> and <funclink>ProtectedCall</funclink>. They allow for bypassing the <emlink href="script/Funcs.html#Aufrufb">calling permission</emlink> and only exist as indirect calls.</text>
</part>
</part>
<author>PeterW</author><date>2003-05</date>
</doc>

View File

@ -1,153 +1,119 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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()
<title>Functions</title>
<h>Functions</h>
<part>
<text>A script function represents a length of script code which can be called (or executed) from the engine or from other places in script. Basically, all scripting of a scenario or object is organized in functions.</text>
<h>Parameters and Return Values</h>
<text>Up to ten parameters can be passed in a function call. These are values which can then be used inside function execution. On completion, a function can pass a single value (the return value) back to the caller using the <funclink>return</funclink>() command.</text>
<h>Syntax</h>
<text>A simple function declaration could look like the following:</text>
<code>func MeineFunktion()
{
<funclink>Log</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>Log</funclink>("ZeigeZahl wurde mit dem Parameter %d aufgerufen!", zahl);
<funclink>Log</funclink>(&quot;Meine Funktion wurde aufgerufen!&quot;);
}</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)
<text>A function script is delimited by { } brackets. Preceding this script block is the <strong>function declaration</strong>. The declaration starts with "<code>func</code>", followed by the <strong>function name</strong> (here: "MeineFunktion"). In the ( ) brackets following the function name the <strong>function parameters</strong> can be declared (see below).</text>
<text>When calling this function the message "Meine Funktion wurde aufgerufen!" is displayed.</text>
<code>func ZeigeZahl(int zahl)
{
<funclink>Log</funclink>("Die Summe der ersten 4 Parameter ist %d.", zahl1 + zahl2 + zahl3 + zahl4);
<funclink>Log</funclink>(&quot;ZeigeZahl wurde mit dem Parameter %d aufgerufen!&quot;, zahl);
}</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 Clonk, id def, int anzahl, string msg)
<text>Here, a parameter with the name "zahl" of type "int" is declared. When this function is called with a parameter, "zahl" will contain the value passed. In this example, the passed value is displayed within a message.</text>
<text>A call to the function "ZeigeZahl" could look like the following:</text>
<code>ZeigeZahl(42)</code>
<text>Performing this call example will have the message "ZeigeZahl wurde mit dem Parameter 42 aufgerufen!" displayed.</text>
<text>In this example, multiple parameters are declared:</text>
<code>func ZeigeSumme(zahl1, zahl2, zahl3, zahl4)
{
<funclink>Log</funclink>(&quot;Die Summe der ersten 4 Parameter ist %d.&quot;, zahl1 + zahl2 + zahl3 + zahl4);
}</code>
<text>There are four parameters with the names "zahl1" through "zahl4", separated by comma.</text>
<text>The message displays the sum of the four values passed. The call</text>
<code>ZeigeSumme(1, 2, 3, 4);</code>
<text>will result in the message "Die Summe der ersten 4 Parameter ist 10.".</text>
<h id="parametertypen">Parameter Types</h>
<text>You can specify the data type that is to be accepted for a given parameter. To do this, simply write the desired <emlink href="script/Typechecks.html">type name</emlink> before the parameter name:</text>
<code>func TypParameterFunktion(object Clonk, id def, int anzahl, string msg)
{
<emlink href="for.html">for</emlink>(var i = 0; i &lt; anzahl; i++)
<funclink>CreateContents</funclink>(def, Clonk);
Clonk-><funclink>Message</funclink>(msg);
Clonk-&gt;<funclink>Message</funclink>(msg);
}</code>
<text>Diese Funktion gibt einem übergebenen Clonk (<code>Clonk</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, Clonk, "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);
<text>This functions creates a given number of a given type of objects inside the specified clonk and displays a variable message above his head. The function declaration ensures that only those values will be accepted that can be converted to the declared parameter types (see also <emlink href="script/Typechecks.html">type checking</emlink>).</text>
<text>Making a call such as <code>TypParameterFunktion(1, Clonk, "Text", 5)</code> would cause a type checking error.</text>
<h id="spezial">Default Parameters</h>
<text>Unlike in other programming languages you can always pass fewer parameters than are declared in a function declaration.</text>
<text>The following calls to above function are perfectly 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)
<text>In the first call, there are fewer parameters passed to the function than specified in the function declaration. The 'missing' parameters will simply contain the value 0.</text>
<text>If you leave out a parameter it will be the same as passing the value 0.</text>
<text>In the second call, on the other hand, there are <em>more</em> parameters passed than specified. These are simply not used during function execution. However, a function is still able to access these extra parameters even if they weren't declared in the function declaration: to do this, you can use the <funclink>Par</funclink>() function.</text>
<h>Return Values</h>
<part>
<text>Every script function can pass a return value back to the caller. This is done using the <funclink>return</funclink>() function.</text>
<h>Example:</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)
<text>Here the difference of the two passed parameters is calculated and the result is "returned". The calling script could now use this function to calculate the difference of any two numbers:</text>
<code>func ZeigeDifferenz(Zahl1, Zahl2)
{
<funclink>Log</funclink>("Die Differenz zwischen %d und %d beträgt %d!", Zahl1, Zahl2, Differenz(Zahl1, Zahl2));
<funclink>Log</funclink>(&quot;Die Differenz zwischen %d und %d beträgt %d!&quot;, 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()
<text>The call "ZeigeDifferenz(5, 2)" will produce the message "Die Differenz zwischen 5 und 2 beträgt 3!".</text>
</part>
<h id="Aufrufb">Permissions</h>
<part>
<text>A function can have one of three levels of "calling permission". This will determine from where the function may be called:</text>
<text>
<table>
<row>
<col><code>public</code></col>
<col>may be called from the engine or any other script (default)</col>
</row>
<row>
<col><code>protected</code></col>
<col>may only be called from the engine or from within the same object script</col>
</row>
<row>
<col><code>private</code></col>
<col>may only be called from the same object script</col>
</row>
</table>
</text>
<text>The calling permissions are expected before the <code>func</code> marker:</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, obj, count)
<text>Calling this function from another object script will cause an error.</text>
<h>Remark</h>
<text>As in some cases it may seem necessary to call a protected function from another object script, there is a workaround through the <funclink>PrivateCall</funclink> and <funclink>ProtectedCall</funclink> functions.</text>
</part>
<h>Global Functions</h>
<part>
<text>A function is declared globally by placing the "<code>global</code>" keyword before the <code>func</code> marker.</text>
<text>A <code>global</code> function can be called from any script. Its scope corresponds to that of the predefined engine functions. Global script functions can also be used to overload predefined engine functions in order to change their behaviour.</text>
<h>Example:</h>
<code>global func CreateContents(id, obj, count)
{
var obj;
<emlink href="for.html">for</emlink>(var i = 0; i &lt; count; i++)
obj = <funclink>inherited</funclink>(id, obj);
return(obj);
}</code>
<text>Definiert die Engine-Funktion <funclink>CreateContents</funclink> neu. Dabei wird sie um einen neuen Parameter count 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 number;
<text>This script redefines the engine function <funclink>CreateContents</funclink> while adding a new parameter declaration at the end of the parameter list which now allows to create multiple objects. Notice that <funclink>inherited</funclink> within this function refers to the overloaded engine function <funclink>CreateContents</funclink>.</text>
<h>Attention!</h>
<text>A global script function is executed with the context of the calling function. This means in particular that <funclink>this</funclink>() is the calling object (if the global function was called from an object local scope). Because of this, a global function may not use any object local variables or try to call any object local function. The following object script is illegal:</text>
<code>local number;
func ObjektFunktion()
{
<funclink>Log</funclink>("ObjectFunktion: local number hat den Wert %d!", number);
<funclink>Log</funclink>(&quot;ObjectFunktion: local number hat den Wert %d!&quot;, number);
}
global func GlobaleFunktion()
@ -155,17 +121,14 @@ global func GlobaleFunktion()
ObjectFunktion(); // Fehler!
number++; // 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 "number" 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)
<text>Both attempts to access the object local elements will fail. This is understandable because the globally declared function may have been called from any script, even from a scenario script or the script of another object. It will thus not know the declared variable or object function. As the calling context can't be safely known, the engine will throw an error.</text>
<text>Notice: to call an object local function from a different context, use the syntax "<code>this()-&gt;function(...)</code>". This will execute the function in the specified object's context and only cause an error if the function really isn't available.</text>
</part>
<h id="referenzen">References</h>
<text>In some cases, you don't want to pass the value of a variable as a parameter, but the "variable itself" so the function that is called can modify the original variable. This is done by passing a "reference" to the variable as parameter.</text>
<text>Let's say we want to write a function returning the position (coordinates) of a player's highest ranking clonk. This cannot be done with a single return value, as we need to return an x and a y coordinate.</text>
<text>By using references as parameters this can be achieved:</text>
<code>func GetHiRankPosition(int plr, &amp;x, &amp;y)
{
var oHiRank = <funclink>GetHiRank</funclink>(plr);
x = <funclink>GetX</funclink>(oHiRank);
@ -176,14 +139,11 @@ func Aufruf()
{
var hiRankX, hiRankY;
GetHiRankPosition(0, hiRankX, hiRankY);
<funclink>Log</funclink>("Die Position des HiRanks von Spieler 1 ist: %d/%d", hiRankX, hiRankY);
<funclink>Log</funclink>(&quot;Die Position des HiRanks von Spieler 1 ist: %d/%d&quot;, hiRankX, hiRankY);
}</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>hiRankX</code> und <code>hiRankY</code>). Man beachte, dass ein Aufruf wie "<code>GetHiRankPosition(0, hiRankX + 1, hiRankY)</code>" zu einem Typfehler führt, da "<code>hiRankX + 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>
<text><code>x</code> and <code>y</code> in <code>GetHiRankPosition</code> are <strong>references</strong>, meaning when the called function modifies these values, the original variables (<code>hiRankX</code> and <code>hiRankY</code>) will be modified and the calling code will have the modified values. Notice, however, that you <em>have</em> to specify true variables as parameters for references. You cannot make a call such as "<code>GetHiRankPosition(0, hiRankX + 1, hiRankY)</code>" as in this case "<code>iHiRankX + 1</code>" is not a variable but a numeric result.</text>
<text>Notice that in C4Script "<code>&amp;</code>" is a data type of its own. You may not specify an extra data type with it, such as in "<code>int &amp;x</code>".</text>
</part>
<author>PeterW</author><date>2002-07</date>
<author>matthes</author><date>2004-06</date>
</doc>

View File

@ -1,64 +1,63 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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 entry, string section, id definition); </li>
<li>GetActMapVal(string entry, string action, id definition); </li>
<li>GetObjectVal(string entry, string section, object obj); </li>
<li>GetObjectInfoCoreVal(string entry, string section, object obj); </li>
<li>GetScenarioVal(string entry, string section);</li>
<li>GetPlayerVal(string entry, string section, int player); </li>
<li>GetPlayerInfoCoreVal(string entry, string section, int player); </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 obj/definition 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>
<title>GetDefCoreVal, GetActMapVal, GetObjectVal, GetScenarioVal</title>
<h>GetDefCoreVal, GetActMapVal, GetObjectVal, GetScenarioVal</h>
<part>
<text>
<ul>
<li>GetDefCoreVal(string entry, string section, id definition);</li>
<li>GetActMapVal(string entry, string action, id definition);</li>
<li>GetObjectVal(string entry, string section, object obj);</li>
<li>GetObjectInfoCoreVal(string entry, string section, object obj);</li>
<li>GetScenarioVal(string entry, string section);</li>
<li>GetPlayerVal(string entry, string section, int player);</li>
<li>GetPlayerInfoCoreVal(string entry, string section, int player);</li>
</ul>
</text>
<text>This family of functions provide direct access to all properties of the respective object as stored in the definition files.</text>
<text>Each function corresponds to the following files:</text>
<text>
<table>
<rowh>
<col>Function</col>
<col>File</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 player files)</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>The property to be accessed is referenced through its name and section, if applicable (if no value is given for the section, all sections will be searched for the property). If a matching property was not found or does not correspond to a valid C4Script data type (e.g. ID lists) the result is 0.</text>
<text>If 0 is given for obj/definition in a call to GetObjectVal, the object or the definition of the object from which the call was made is used.</text>
<text>There is a number of additional wrapper functions located in System.c4g/GetXVal.c. These functions allow for easy access to various common Get*Val functions (e.g. <code>GetObjWidth()</code> for <code><i>GetObjectVal</i>("Width", 0, -obj-)</code>).</text>
</part>
<author>Peter</author><date>2001-11</date>
</doc>

View File

@ -1,49 +1,44 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" 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 object_count;
<title>Named Variables</title>
<h>Named Variables</h>
<part>
<text>Variables are placeholders for values stored in a script. A variable stores a value in one of several <emlink href="script/Typechecks.html">data types</emlink>.</text>
<text>There are three different scopes in which a variable can be declared. Variables are not visible outside their declared scope.</text>
<text>
<table>
<row>
<col>Keyword</col>
<col>Scope</col>
<col>Location</col>
</row>
<row>
<col><code>var</code></col>
<col>function local</col>
<col>Function</col>
</row>
<row>
<col><code>local</code></col>
<col>object local</col>
<col>Object Script</col>
</row>
<row>
<col><code>static</code></col>
<col>global</col>
<col>any script</col>
</row>
</table>
</text>
<text>Variables are declared using the following syntax:</text>
<code>{ var / local / static } name [= expr] [, name [= expr] ... ];</code>
<text>The variable's scope, followed by the variable's name.</text>
<text>Optionally, you can assign a value to the variable directly at declaration time. However, this is possible for function local (<code>var</code>) variables only. Without initialization variables always start with value 0.</text>
<text>Additional variable declarations may follow, separated by comma. The declaration must always be ended with a semicolon.</text>
<h>Example:</h>
<code>static object_count;
local time_to_live;
protected func Initialize()
@ -72,18 +67,16 @@ protected func Timer()
<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>
<h>Addendum:</h>
<text>
<ul>
<li>Object local variable declarations are also valid in #appendto or #include script extensions.</li>
<li>Using the functions <funclink>VarN</funclink>(), <funclink>LocalN</funclink>(), and <funclink>GlobalN</funclink>() you can access variables indirectly. Using <funclink>LocalN</funclink>() you can specifically access local variables in other objects.</li>
<li>If two variables of the same name but differing scope are valid at the same time, then the variable of the smaller scope will be used, meaning for example an object local variable will "cover up" a global variable within its own scope.</li>
<li>If the same variable is declared multiply, then still the variable will exist only once and no error is thrown. Multiple initializations are considered regular assignments and executed in order, respectively.</li>
<li>A <code>static</code> variable may also be used in object scripts (see example). If a <code>static</code> variable of the same name is defined in another script, the name will refer to the same variable.</li>
</ul>
</text>
</part>
<author>PeterW</author><date>her-long ago</date>
</doc>

View File

@ -1,29 +1,25 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE doc
SYSTEM '../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Scriptspieler</title>
<h>Scriptspieler</h>
<part>
<h id="Intro">Einleitung</h>
<text>Ab CR Build 265 ist es möglich, Spieler auch per Script beitreten zu lassen. Solche Spieler verhalten sich wie normale Spieler. Sie besitzen eine Crew, ein Konto, Heimatbasismaterial, ein Team, Baupläne, etc. Einziger Unterschied ist, dass sie von keinem Spieler gesteuert werden und auf keinem Rechner ein Sichtfenster für diese Spieler geöffnet wird.</text>
<text>Scriptspieler sind nützlich, um zum Beispiel KI-Gegner zu realisieren.</text>
<h id="Runtime">Beitritt zur Laufzeit</h>
<text>Fürs Erstellen einer KI zur Laufzeit - zum Beispiel als Gegner im Deathmatch - dient <funclink>CreateScriptPlayer</funclink>. Daraufhin erfolgt (unter Umständen verzögert, weil es sich um einen Spielerbeitritt handelt!) ein InitializePlayer-Aufruf für diesen Scriptspieler. Da der Aufruf verzögert ist, sollte die eigentliche KI-Initialisierung in diesem Aufruf passieren.</text>
<text>Dazu ein Beispiel:</text>
<code>/* Script einer aktivierten Spielregel namens "KI Erzeugen" */
<title>Script Player</title>
<h>Script Player</h>
<part>
<h id="Intro">Introduction</h>
<text>From CR 4.9.7.8 it is possible to create non-humans players by script. These players have all the properties of normal players. They have a crew, wealth, build knowledge, home base material, hostility, teams, etc. However, script players do not have a game view port and they can not be controlled by human users.</text>
<text>Script players can be used to create AI controlled opponent teams in special scenarios.</text>
<h id="Runtime">Runtime join</h>
<text>For creating an AI player at run time - e.g. a new deathmatch opponent - you can use <funclink>CreateScriptPlayer</funclink>. This call will be followed (possibly with a little delay) by a InitializePlayer callback for the new player.</text>
<text>Example:</text>
<code>/* Script einer aktivierten Spielregel namens &quot;KI Erzeugen&quot; */
public func Activate(int player)
{
// Der Spieler player hat die Spielregel ausgewählt. Erzeuge einen KI-Gegner!
<funclink>return</funclink>(<funclink>CreateScriptPlayer</funclink>("Computer", 0x7f7f7f));
// Der Spieler player hat die Spielregel ausgewählt. Erzeuge einen KI-Gegner!
<funclink>return</funclink>(<funclink>CreateScriptPlayer</funclink>(&quot;Computer&quot;, 0x7f7f7f));
}
protected func InitializePlayer(int player)
@ -33,31 +29,26 @@ protected func InitializePlayer(int player)
// Ist es ein Scriptspieler?
<funclink>if</funclink> (<funclink>GetPlayerType</funclink>(player) == C4PT_Script)
{
// Dann übernimm die Steuerung für alle Clonks!
// Dann übernimm die Steuerung für alle Clonks!
var crew_counter, crew;
<funclink>while</funclink> (crew = <funclink>GetCrew</funclink>(player, crew_counter++))
<funclink>AddEffect</funclink>("Int_EAI", crew, 1, 100, <funclink>this</funclink>());
<funclink>AddEffect</funclink>(&quot;Int_EAI&quot;, crew, 1, 100, <funclink>this</funclink>());
}
}
protected func FxInt_EAITimer(object crew, int num, int time)
{
// Nächsten Gegner angreifen
// Nächsten Gegner angreifen
var enemy = <funclink>FindObject</funclink>(<funclink>Find_Hostile</funclink>(<funclink>GetOwner</funclink>(crew)), <funclink>Find_OCF</funclink>(<funclink>OCF_Alive</funclink>), <funclink>Sort_Distance</funclink>());
<funclink>if</funclink> (enemy) <funclink>SetCommand</funclink>(crew, "Attack", enemy);
<funclink>if</funclink> (enemy) <funclink>SetCommand</funclink>(crew, &quot;Attack&quot;, enemy);
<funclink>return</funclink> FX_OK;
}
</code>
<text>Dieses Beispielscript für ein Regelobjekt erlaubt dem Spieler, zur Laufzeit KI-Gegner zu erstellen. Außerdem sorgt es dafür, dass alle Clonks dieses KI-Gegners angreifen. Achtung: Das Beispiel übernimmt die Kontrolle nur für alle Clonks, die der Spieler zu Spielbeginn nach Szenarienvorgaben erhalten hat. Wenn ein Szenarienscript zum Beispiel noch andere Clonks erstellen würde, würden diese nicht gesteuert.</text>
<text>Für Internetspiele kann man auch MaxScriptPlayers in der <emlink href="scenario/Teams.html">Teams.txt</emlink> auf einen Wert >0 setzen. Dann bekommt man in der Lobby die Option, Scriptspieler zu aktivieren. Diese Spieler treten auch wie gewöhnliche Spieler bei, und man sollte auch hier in InitializePlayer entsprechend das KI-Kontrollobjekt erstellen. Das obige Beispiel würde also auch sofort mit in der Lobby aktivierten KI-Spielern funktionieren.</text>
<h id="Preset">Beitritt als Vorgabe</h>
<text>Wenn ein Szenario schon von Anfang an einen Scriptspieler beinhalten soll - zum Beispiel weil Objekte in der Objects.txt in dessen Besitz sein sollen, oder weil in Initialize Objekte für diesen Spieler erzeugt werden, dann sollte man diesen wie in einem Savegame definieren. Also eine SavePlayerInfos.txt wie diese anlegen:</text>
<code>[PlayerInfoList]
<text>This script for a sample rule object allows the user to create AI opponents at runtime. Also, it will order all clonks of the AI players to attack. Notice: this sample script only handles those clonks automatically created through the scenario settings. Additional clonks placed by specialized scripting are not handled.</text>
<text>For internet games you can set MaxScriptPlayers in <emlink href="scenario/Teams.html">Teams.txt</emlink> to a value greater than 0. This will enable the option to have script players join in the game lobby.</text>
<h id="Preset">Default join</h>
<text>If scripted players should be present in the scenario right from the beginning (comparable to objects created via Objects.txt) then you should create them via the SavePlayerInfos.txt component:</text>
<code>[PlayerInfoList]
LastPlayerID=1
[Client]
@ -65,7 +56,7 @@ LastPlayerID=1
Flags=Initial
[Player]
Name="Aliens"
Name=&quot;Aliens&quot;
Flags=Joined
ID=1
Type=Script
@ -74,48 +65,41 @@ LastPlayerID=1
GameNumber=1
GameJoinFrame=0
</code>
<text>Dies führt eine Spieler-Wiederherstellung durch, analog zur Wiederherstellung nach einem Savegame. Es wird also kein InitializePlayer für diesen Spieler aufgerufen. Das Szenarienscript sollte in der Initialisierung die Crew für diesen Spieler erstellen, oder es sollte eine entsprechende Crew in der Objects.txt vorhanden sein. Ansonsten wird der Scriptspieler sofort zum Spielbeginn eliminiert.</text>
<text>Scriptspieler werden im Gegensatz zu regulären Spielern ebenfalls gespeichert, wenn man in der Konsole "Speichern als Szenario" wählt. Auf diese Weise kann man sich die richtige SavePlayerInfos.txt automatisch anlegen lassen. Dazu sollte einfach im Entwicklermodus manuell <funclink>CreateScriptPlayer</funclink> aufgerufen und dann Clonks für diesen Scriptspieler verteilt werden. Speichert man dann als Szenario, wird der Scriptspieler mitgespeichert und steht beim Starten wieder zur Verfügung.</text>
<h id="Specialized">Spezialisierte Spieler</h>
<text>Manchmal kann es sinnvoll sein, einen Scriptspieler erst zur Laufzeit zu erstellen aber trotzdem eine spezielle Initialisierung durchzuführen. Zum Beispiel sollte ein spezieller Alien-Gegner in einem Hazard-Deathmatch keine Hazardclonks erhalten.</text>
<text>Mit einem Parameter an <funclink>CreateScriptPlayer</funclink> lassen sich die szenarienspezifische Initialisierung, das heißt das Erzeugen des Startmaterials, das Setzen der Startparameter nach Vorgaben und auch alle InitializePlayer-Aufrufe unterbinden. Stattdessen erfolgt nur ein InitializeScriptPlayer-Definitionsaufruf in der angegebenen Definition. Dazu ein Beispiel:</text>
<code>/* Script einer aktivierten Spielregel namens "Aliens erzeugen" */
<text>This method effectively performs a player restore, similar to a regular player restore in a savegame resume. Consequently, no InitializePlayer is called for this player and no startup material or crew is created. A crew for this player should be created in the scenario script. Alternatively, a crew may be present in the Objects.txt. Otherwise, the script player will be eliminated shortly after game start.</text>
<text>Contrary to regular players, script players are saved if you perform "Save as scenario" in developer mode. This way, you can automatically generate the correct SavePlayerInfos.txt and an according crew in the Objects.txt of the scenario. In order to do this, simply execute <funclink>CreateScriptPlayer</funclink> from the console and create some Clonks for the newly created script player. Then save the game as scenario. The script player Clonks will automatically be restored with the correct owner and in the crew of the script player.</text>
<h id="Specialized">Specialized Players</h>
<text>Sometimes it can be desirable to create a script player at runtime, but still execute a specialized initialization instead of the default crew and base material creation. For example, a Hazard deathmatch scenario may provide a specialized alien enemy.</text>
<text>By passing a parameter to <funclink>CreateScriptPlayer</funclink>, scenario initialization can be prevented, i.e. no creation of start materials, no setting of player parameters such as homebase material by the according presets and no InitializePlayer-calls are done. Instead, a single CreateScriptPlayer-callback is done to the definition passed as idExtraData. Example:</text>
<code>/* Script einer aktivierten Spielregel namens &quot;Aliens erzeugen&quot; */
public func Activate(int player)
{
// Der Spieler player hat die Spielregel ausgewählt. Erzeuge einen Alien-Gegner!
<funclink>return</funclink>(<funclink>CreateScriptPlayer</funclink>("Aliens", 0x00ff00, 0, CSPF_FixedAttributes | CSPF_NoScenarioInit, GetID()));
// Der Spieler player hat die Spielregel ausgewählt. Erzeuge einen Alien-Gegner!
<funclink>return</funclink>(<funclink>CreateScriptPlayer</funclink>(&quot;Aliens&quot;, 0x00ff00, 0, CSPF_FixedAttributes | CSPF_NoScenarioInit, GetID()));
}
protected func InitializeScriptPlayer(int player, int idTeam)
{
// Ein Alienspieler ist beigetreten
// Da keine Szenarieninitialisierung durchgeführt wurde, muss in diesem Callback eine Crew für den Spieler erstellt werden
// Erstelle einen grünen Clonk - ein richtiges Szenario sollte natürlich echte Aliens mitbringen :)
// Da keine Szenarieninitialisierung durchgeführt wurde, muss in diesem Callback eine Crew für den Spieler erstellt werden
// Erstelle einen grünen Clonk - ein richtiges Szenario sollte natürlich echte Aliens mitbringen :)
var alien = CreateObject(Clonk, LandscapeWidth()/2, -1, player);
MakeCrewMember(alien, player);
SetClrModulation(0x7fff7f, alien);
// Und angreifen lassen
<funclink>AddEffect</funclink>("Int_EAI", alien, 1, 100, 0, GetID());
<funclink>AddEffect</funclink>(&quot;Int_EAI&quot;, alien, 1, 100, 0, GetID());
}
protected func FxInt_EAITimer(object crew, int num, int time)
{
// Nächsten Gegner angreifen
// Nächsten Gegner angreifen
var enemy = <funclink>FindObject</funclink>(<funclink>Find_Hostile</funclink>(<funclink>GetOwner</funclink>(crew)), <funclink>Find_OCF</funclink>(<funclink>OCF_Alive</funclink>), <funclink>Sort_Distance</funclink>());
<funclink>if</funclink> (enemy) <funclink>SetCommand</funclink>(crew, "Attack", enemy);
<funclink>if</funclink> (enemy) <funclink>SetCommand</funclink>(crew, &quot;Attack&quot;, enemy);
<funclink>return</funclink> FX_OK;
}
</code>
</part>
<author>Sven2</author><date>Dezember 2007</date>
</doc>
</part>
<author>Sven2</author><date>2007-12</date>
</doc>

View File

@ -1,80 +1,78 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE doc SYSTEM "../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE doc
SYSTEM '../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../clonk.xsl"?>
<doc>
<title>Datentypen</title>
<h>Datentypen</h>
<part>
<text>C4Script unterstützt die folgenden Datentypen für Variablen, Parameter und Rückgabewerte:</text>
<text><table>
<rowh>
<col>Typname</col>
<col>Voller Name</col>
<col>Variableninhalt</col>
<col>Beispiel</col>
</rowh>
<row>
<col><code>int</code></col>
<col>Integer</col>
<col>Eine ganze Zahl im Bereich von -2.147.483.648 bis +2.147.483.647.</col>
<col><code>42 </code></col>
</row>
<row>
<col><code>bool</code></col>
<col>Boolean</col>
<col>"wahr" (Wert <code>true</code>) oder "falsch" (Wert <code>false</code>). Wird von vielen Kontrollstrukturen wie <funclink>if</funclink> und <funclink>while</funclink> als Parameter erwartet.</col>
<col><code>true </code></col>
</row>
<row>
<col><code>id</code></col>
<col>Definitions-ID</col>
<col>ID einer Objektdefinition (siehe <emlink href="definition/index.html#ObjektundEntwicklerIdentifikation">Objektdefinitionen</emlink>). Wird sofort in eine Proplist umgewandelt.</col>
<col><code>Clonk </code></col>
</row>
<row>
<col><code>string</code></col>
<col>Zeichenkette</col>
<col>Ein beliebiger Text.</col>
<col><code>"Dies ist ein Text!" </code></col>
</row>
<row>
<col><code>array</code></col>
<col>Array</col>
<col>Ein Typ, der eine Reihe weiterer durchnummerierter Variablen enthält, deren Anzahl mit <funclink>GetLength</funclink> abgefragt werden kann, und die mit <code><em>array</em>[<em>index</em>]</code> abgerufen werden können. Ab CR.</col>
<col><code>[0,42,Clonk] </code></col>
</row>
<row>
<col><code>proplist</code></col>
<col>Objekt</col>
<col>Ein allgemeiner Objekttyp. Mit <funclink>GetProperty</funclink> und <funclink>SetProperty</funclink> können Eigenschaften abgefragt bzw. gesetzt werden.
Wenn die Eigenschaft <code>"Prototype"</code> gesetzt ist und eine nicht gesetzte Eigenschaft abgefragt wird, wird im Prototyp nachgeguckt.</col>
<col><code>{ foo = 0, "bar baz" = 42, Prototype = Clonk }</code></col>
</row>
<row>
<col><code>object</code></col>
<col>Spielobjekt</col>
<col>Verweis auf ein im Spiel existierendes Objekt. Hat keine direkte Darstellung. Siehe z.B. <funclink>FindObject</funclink>()</col>
<col>CreateObject(Clonk)</col>
</row>
</table></text>
<text>Außerdem gibt es noch zwei spezielle Typen:</text>
<text><ul>
<li><code>any</code>: Der Typ ist nicht bekannt oder egal. "0" hat immer diesen Typ.</li>
<li><code>&amp;</code>: Der Wert ist eine Referenz - z.B. auf eine Variable. Er verhält sich genau wie der Zielwert, kann aber gesetzt werden (z.B. mit dem Operator "<code>=</code>"). Siehe auch <emlink href="script/Funcs.html#referenzen">Referenzparameter</emlink>.</li>
</ul></text>
<h>Arrays</h>
<part>
<text>Arrays können entweder direkt durch <code>[<em>Ausdruck 1</em>, <em>Ausdruck 2</em>, ...]</code> oder <funclink>CreateArray</funclink>() erstellt werden. Sie werden bei Zugriff auf ein Element gegebenenfalls automatisch verlängert, jedoch ist es schneller, das Array gleich mit der benötigten Länge zu erstellen. Wird ein Array einer Variablen zugewiesen oder einer Funktion übergeben, bekommt diese Variable eine eigene Kopie des Arrays. Das eigentliche Kopieren wird aber erst ausgeführt, wenn es nötig ist. Wenn das Array einer Funktion zum Ändern übergeben werden soll, muss ein Referenzparameter verwendet werden.
</text>
<text>Zugriff auf ein Element <code>i</code> eines Arrays <code>a</code> erfolgt über <code>a[i]</code>. Dabei entspricht <code>i=0</code> dem ersten Element. Für negative Indizes wird vom Ende des Arrays gezählt, so dass <code>a[-1]</code> auf das letzte Element des Arrays zugreift.</text>
<text>Man kann eine Kopie eines Teilbereichs eines Arrays mit <code>a[i:j]</code> erzeugen. Das resultierende Array enthält alle Einträge, deren Indizes im halboffenen Intervall <code>[i,j)</code> liegen. Negative Indizes werden dabei wie beim Zugriff auf einzelne Elemente interpretiert. Beide Indizes sind optional und werden als <code>0</code> bzw. <code><funclink>GetLength</funclink>(a)</code> aufgefasst, falls sie nicht angegeben sind.</text>
<h>Beispiel 1</h>
<code>func ArraySum(array a)
<title>Data Types</title>
<h>Data Types</h>
<part>
<text>C4Script supports the following data types for variables, parameters, and return values:</text>
<text>
<table>
<rowh>
<col>Type Name</col>
<col>Full Name</col>
<col>Contents of Variable</col>
<col>Example</col>
</rowh>
<row>
<col><code>int</code></col>
<col>Integer</col>
<col>A whole number from -2.147.483.648 to +2.147.483.647.</col>
<col><code>42 </code></col>
</row>
<row>
<col><code>bool</code></col>
<col>Boolean</col>
<col>"true" (value <code>true</code>) or "false" (value <code>false</code>). Expected as parameter by many structures such as <funclink>if</funclink> and <funclink>while</funclink>.</col>
<col><code>true </code></col>
</row>
<row>
<col><code>id</code></col>
<col>definition id</col>
<col>ID of an object definition (see <emlink href="definition/index.html#ObjektundEntwicklerIdentifikation">Object Definitions</emlink>).Will be changed into a proplist immediately.</col>
<col><code>Clonk </code></col>
</row>
<row>
<col><code>string</code></col>
<col>String</col>
<col>Any text.</col>
<col><code>&quot;Dies ist ein Text!&quot; </code></col>
</row>
<row>
<col><code>array</code></col>
<col>Array</col>
<col>A type containing multiple variables, whose number can be enquired with <funclink>GetLength</funclink>, and which can be recalled with <code><em>array</em>[<em>index</em>]</code>. Since CR.</col>
<col><code>[0,42,Clonk] </code></col>
</row>
<row>
<col><code>proplist</code></col>
<col>Object</col>
<col>A general purpose object type. <funclink>GetProperty</funclink> and <funclink>SetProperty</funclink> can get respectively set properties. If the property <code>"Prototype"</code> is set, and a property that is not set is gotten, the prototype is asked.</col>
<col><code>{ foo = 0, &quot;bar baz&quot; = 42, Prototype = Clonk }</code></col>
</row>
<row>
<col><code>object</code></col>
<col>Ingame object</col>
<col>Reference to an existing object at runtime. No direct representation. See <funclink>FindObject</funclink>()</col>
<col>CreateObject(Clonk)</col>
</row>
</table>
</text>
<text>Additionally, there are two special types:</text>
<text>
<ul>
<li><code>any</code>: The type is unknown or does not make a difference. "0" always has this type.</li>
<li><code>&amp;</code>: The value is a reference, for example to a variable. It behaves exactly as the target value, but can be changed (for example with the operator "<code>=</code>"). See also <emlink href="script/Funcs.html#referenzen">Reference parameters</emlink>.</li>
</ul>
</text>
<h>Arrays</h>
<part>
<text>Arrays can be created directly with <code>[<em>expression 1</em>, <em>expression 2</em>, ...]</code> or indirectly with <funclink>CreateArray</funclink>(). They are automatically enlarged if necessary on element access, but it's faster to create them with the needed length from the start. If an array is stored in a variable or used as a parameter to a function, the new variable has it's own copy of the array. The actual copy is deferred if possible, though. If an array is passed to a function for modification, a reference has to be used.</text>
<text>Access to element <code>i</code> of array <code>a</code> is achieved through <code>a[i]</code>. <code>i=0</code> is the first element. Negative indices are counted from the end of the array, so that <code>a[-1]</code> refers to the last element of the array.</text>
<text>A range within an array can be copied with <code>a[i:j]</code>. The resulting array contains all elements with indices in the half-open interval <code>[i,j)</code>. Negative indices are treated as when accessing single elements. Both indices are optional and assumed as <code>0</code> and <code><funclink>GetLength</funclink>(a)</code> respectively if not given.</text>
<h>Example 1</h>
<code>func ArraySum(array a)
{
var l = <funclink>GetLength</funclink>(a);
var result = 0;
@ -84,106 +82,103 @@
}
return (result);
}</code>
<text>Diese Funktion summiert alle Elemente eines Arrays.</text>
<h>Beispiel 2</h>
<code>func RandomID()
<text>This function adds up all elements of an array.</text>
<h>Example 2</h>
<code>func RandomID()
{
var a = [Clonk, WIPF, BIRD, HUT1];
return (a[<funclink>Random</funclink>(4)]);
}</code>
<text>Diese Funktion wählt zufällig aus einer der vier ids aus und gibt diese zurück.</text>
<h>Beispiel 3</h>
<code>func DetonateNearest()
<text>This function randomly chooses one out of four ids and returns it.</text>
<h>Example 3</h>
<code>func DetonateNearest()
{
var a = <funclink>FindObjects</funclink>(<funclink>Find_ID</funclink>(Dynamite), <funclink>Sort_Distance</funclink>());
for (var dyna in a[:6])
{
dyna->DoExplode();
dyna-&gt;DoExplode();
}
}</code>
<text>Diese Funktion ruft <code>DoExplode()</code> auf die sechs naheliegendsten Dynamit-Objekte auf.</text>
</part>
<h>Konvertierung</h>
<text>Aus folgender Tabelle kann entnommen werden, welche Typen automatisch konvertiert werden und wo ein Fehler ausgelöst wird:</text>
<text><table>
<rowh>
<col>nach -&gt;</col>
<col><code>int</code></col>
<col><code>bool</code></col>
<col><code>object</code></col>
<col><code>string</code></col>
<col><code>array</code></col>
<col><code>proplist</code></col>
</rowh>
<row>
<col><code>int</code></col>
<col>OK</col>
<col>OK</col>
<col>wenn 0</col>
<col>wenn 0</col>
<col>wenn 0</col>
<col>wenn 0</col>
</row>
<row>
<col><code>bool</code></col>
<col>OK</col>
<col>OK</col>
<col>Error</col>
<col>Error</col>
<col>Error</col>
<col>Error</col>
</row>
<row>
<col><code>object</code></col>
<col>Error</col>
<col>OK</col>
<col>OK</col>
<col>Error</col>
<col>Error</col>
<col>OK</col>
</row>
<row>
<col><code>string</code></col>
<col>Error</col>
<col>OK</col>
<col>Error</col>
<col>OK</col>
<col>Error</col>
<col>Error</col>
</row>
<row>
<col><code>array</code></col>
<col>Error</col>
<col>OK</col>
<col>Error</col>
<col>Error</col>
<col>OK</col>
<col>Error</col>
</row>
<row>
<col><code>proplist</code></col>
<col>Error</col>
<col>OK</col>
<col>maybe</col>
<col>Error</col>
<col>Error</col>
<col>OK</col>
</row>
</table></text>
<h>Erklärung der Tabelle:</h>
<text><ul>
<li>Konvertierung nach bool ist generell erlaubt. Sie ergibt für jeden Wert außer 0 <code>true</code>.</li>
<li>Wenn ein Objekt in eine Proplist konvertiert wurde, kann es wieder in ein Objekt konvertiert werden. Ansonsten können Proplists nicht in Objekte konvertiert werden.</li>
<li>Eine <code>0</code> kann in alles andere konvertiert werden. Sie verhält sich dann wie <code>any</code></li>
</ul></text>
</part>
<author>Günther</author><date>2006-2010</date>
<author>PeterW</author><date>April 2006</date>
<text>This function calls <code>DoExplode()</code> on the six nearest Dynamite objects.</text>
</part>
<h>Conversion</h>
<text>Consult the following table to determine which types can be converted and which conversions might cause errors:</text>
<text>
<table>
<rowh>
<col>to -&gt;</col>
<col><code>int</code></col>
<col><code>bool</code></col>
<col><code>object</code></col>
<col><code>string</code></col>
<col><code>array</code></col>
<col><code>proplist</code></col>
</rowh>
<row>
<col><code>int</code></col>
<col>OK</col>
<col>OK</col>
<col>if 0</col>
<col>if 0</col>
<col>if 0</col>
<col>if 0</col>
</row>
<row>
<col><code>bool</code></col>
<col>OK</col>
<col>OK</col>
<col>Error</col>
<col>Error</col>
<col>Error</col>
<col>Error</col>
</row>
<row>
<col><code>object</code></col>
<col>Error</col>
<col>OK</col>
<col>OK</col>
<col>Error</col>
<col>Error</col>
<col>OK</col>
</row>
<row>
<col><code>string</code></col>
<col>Error</col>
<col>OK</col>
<col>Error</col>
<col>OK</col>
<col>Error</col>
<col>Error</col>
</row>
<row>
<col><code>array</code></col>
<col>Error</col>
<col>OK</col>
<col>Error</col>
<col>Error</col>
<col>OK</col>
<col>Error</col>
</row>
<row>
<col><code>proplist</code></col>
<col>Error</col>
<col>OK</col>
<col>maybe</col>
<col>Error</col>
<col>Error</col>
<col>OK</col>
</row>
</table>
</text>
<h>Additional information:</h>
<text>
<ul>
<li>Conversion to bool is generally allowed. All values except 0 are <code>true</code>.</li>
<li>If an object has been converted into a proplist then it can be converted back to an object. Otherwise proplists cannot be converted into objects.</li>
<li><code>0</code> can be converted into anything. In that case it behaves the same way as <code>any</code></li>
</ul>
</text>
</part>
<author>Günther</author><date>2010-03</date>
<author>PeterW</author><date>2006-04</date>
</doc>

View File

@ -1,24 +1,29 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Abs</title>
<category>Arithmetik</category>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int</rtype>
<params>
<param><type>int</type><name>value</name><desc>Wert, von dem der absolutwert gebildet werden soll</desc></param>
</params>
</syntax>
<desc>Bildet den Absolutwert (Betrag), entfernt also das Vorzeichen des ersten Parameters.</desc>
<examples>
<example>
<code><funclink>Log</funclink>("Aktuelle Fluggeschwindigkeit: %d Clonks/min", Abs(<funclink>GetXDir</funclink>(<funclink>FindObject</funclink>(BLMP))));</code>
<text>Gibt die Fluggeschwindigkeit eines Luftschiffes aus.</text>
</example>
</examples>
</func>
<author>Sven2</author><date>November 2001</date>
<func>
<title>Abs</title>
<category>Arithmetics</category>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int</rtype>
<params>
<param>
<type>int</type>
<name>value</name>
<desc>Absolute coordinate you want to convert to a relative coordinate.</desc>
</param>
</params>
</syntax>
<desc>Returns the absolute value of the given parameter, ignoring the sign of the value.</desc>
<examples>
<example>
<code><funclink>Log</funclink>(&quot;Aktuelle Fluggeschwindigkeit: %d Clonks/min&quot;, Abs(<funclink>GetXDir</funclink>(<funclink>FindObject</funclink>(BLMP))));</code>
<text>Prints the absolute velocity of a blimp.</text>
</example>
</examples>
</func>
<author>Sven2</author><date>2001-11</date>
</funcs>

View File

@ -1,33 +1,36 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>AbsX</title>
<category>Objekte</category>
<subcat>Position</subcat>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
<params>
<param><type>int</type><name>x</name><desc>X</desc></param>
</params>
</syntax>
<desc>Liefert das relative X in Bezug auf Objektmitte wenn von einem Objekt aufgerufen. Sonst liefert diese Funktion das übergebene X zurück</desc>
<examples>
<example>
<code><funclink>CreateObject</funclink>(WIPF, AbsX(100), AbsY(500), -1);</code>
<text>Erzeugt einen Wipf an der Position 100/500 auch wenn in einem Objektscript benutzt.</text>
</example>
</examples>
<related>
<funclink>AbsY</funclink>
<funclink>GetX</funclink>
<funclink>GetY</funclink>
<funclink>CreateObject</funclink>
</related>
</func>
<author>flgr</author><date>Januar 2002</date>
<func>
<title>AbsX</title>
<category>Objects</category>
<subcat>Position</subcat>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
<params>
<param>
<type>int</type>
<name>x</name>
<desc>X</desc>
</param>
</params>
</syntax>
<desc>If called from an object, this function returns the given X coordinate relative to the object's center. Otherwise, the original coordinate is returned.</desc>
<examples>
<example>
<code><funclink>CreateObject</funclink>(WIPF, AbsX(100), AbsY(500), -1);</code>
<text>Creates a wipf at position 100/500, even if called from an object script.</text>
</example>
</examples>
<related>
<funclink>AbsY</funclink>
<funclink>GetX</funclink>
<funclink>GetY</funclink>
<funclink>CreateObject</funclink>
</related>
</func>
<author>flgr</author><date>2002-01</date>
</funcs>

View File

@ -1,33 +1,36 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>AbsY</title>
<category>Objekte</category>
<subcat>Position</subcat>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
<params>
<param><type>int</type><name>y</name><desc>Y</desc></param>
</params>
</syntax>
<desc>Liefert das relative Y in Bezug auf Objektmitte wenn von einem Objekt aufgerufen. Sonst liefert diese Funktion das übergebene Y zurück</desc>
<examples>
<example>
<code><funclink>CreateObject</funclink>(WIPF, AbsX(100), AbsY(500), -1);</code>
<text>Erzeugt einen Wipf an der Position 100/500 auch wenn in einem Objektscript benutzt.</text>
</example>
</examples>
<related>
<funclink>AbsX</funclink>
<funclink>GetX</funclink>
<funclink>GetY</funclink>
<funclink>CreateObject</funclink>
</related>
</func>
<author>flgr</author><date>Januar 2002</date>
<func>
<title>AbsY</title>
<category>Objects</category>
<subcat>Position</subcat>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
<params>
<param>
<type>int</type>
<name>y</name>
<desc>Y</desc>
</param>
</params>
</syntax>
<desc>If called from an object, this function returns the given Y coordinate relative to the object's center. Otherwise, the original coordinate is returned.</desc>
<examples>
<example>
<code><funclink>CreateObject</funclink>(WIPF, AbsX(100), AbsY(500), -1);</code>
<text>Creates a wipf at position 100/500, even if called from an object script.</text>
</example>
</examples>
<related>
<funclink>AbsX</funclink>
<funclink>GetX</funclink>
<funclink>GetY</funclink>
<funclink>CreateObject</funclink>
</related>
</func>
<author>flgr</author><date>2002-01</date>
</funcs>

View File

@ -1,20 +1,20 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>ActIdle</title>
<category>Objekte</category><subcat>Aktivität</subcat>
<category>Objects</category>
<subcat>Activity</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>bool</rtype>
</syntax>
<desc>Prüft, ob das aufrufende Objekt eine Aktivität ausführt.</desc>
<syntax><rtype>bool</rtype></syntax>
<desc>Checks whether an object is currently performing the specified activity.</desc>
<examples>
<example>
<code>var hut = <funclink>FindObject</funclink>(HUT1);
<funclink>if</funclink>(hut->ActIdle()) hut-><funclink>Explode</funclink>(15);</code>
<text>Lässt die Bambushütte explodieren, wenn die Tür geschlossen ist</text>
<code>var hut = <funclink>FindObject</funclink>(HUT1);
<funclink>if</funclink>(hut-&gt;ActIdle()) hut-&gt;<funclink>Explode</funclink>(15);</code>
<text>Blows up the hut if the door is currently closed.</text>
</example>
</examples>
<related>
@ -22,5 +22,5 @@
<funclink>SetAction</funclink>
</related>
</func>
<author>jwk</author><date>April 2002</date>
<author>jwk</author><date>2002-04</date>
</funcs>

View File

@ -1,19 +1,24 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Activate</title>
<category>Callbacks</category>
<subcat>Objekte</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>bool</rtype>
<params>
<param><type>object</type><name>obj</name><desc>Mannschaftsmitglied, welches das Objekt aktiviert hat.</desc></param>
</params>
</syntax>
<desc>Wenn ein Spieler Doppelgraben drückt, wird zunächst "ControlDigDouble" im Clonk aufgerufen. Gibt dieses false zurück oder existiert nicht, und der Clonk läuft, schwimmt oder gräbt, wird im ersten Inhaltsobjekt Activate aufgerufen. Wenn dieses nicht existiert oder false zurückgibt, wird zuerst versucht, einen Baum zu fällen oder eine Leitung abzunehmen. Danach wird Activate im Clonk selbst aufgerufen.</desc>
</func>
<author>Günther</author><date>Juni 2005</date>
<func>
<title>Activate</title>
<category>Callbacks</category>
<subcat>Objects</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>bool</rtype>
<params>
<param>
<type>object</type>
<name>obj</name>
<desc>Crew member which has activated the object.</desc>
</param>
</params>
</syntax>
<desc>When a player hits 'double dig' on the keyboard, first "ControlDigDouble" is called in the clonk. If this is not defined or returns false and the clonk is currently walking, swimming, or digging, the function "Activate" is called in the first contents object. If this is not defined or returns false, the engine will look for a tree to fell or a line to disconnect. If no such thing occurs, "Activate" is called in the clonk.</desc>
</func>
<author>Günther</author><date>2005-06</date>
</funcs>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>AddCommand</title>
<category>Objekte</category>
<category>Objects</category>
<subcat>Commands</subcat>
<version>4.6.5.0 CP<extversion>4.9.1.0 GWE</extversion><extversion>4.9.5.0 CE</extversion></version>
<syntax>
@ -13,91 +14,109 @@
<param>
<type>string</type>
<name>command</name>
<desc>Kommandoname (als String). Siehe untere Tabelle </desc>
<desc>Command name (as string). See the table below.</desc>
</param>
<param>
<type>object</type>
<name>target</name>
<optional />
<desc>Zielobjekt für Aktion</desc>
<desc>target object for the command</desc>
</param>
<param>
<type>int</type>
<name>x</name>
<optional />
<desc>X-Zielkoordinate</desc>
<desc>X target coordinate</desc>
</param>
<param>
<type>int</type>
<name>y</name>
<optional />
<desc>Y-Zielkoordinate</desc>
<desc>Y target coordinate</desc>
</param>
<param>
<type>object</type>
<name>target2</name>
<optional />
<desc>zweites Zielobjekt</desc>
<desc>secondary target object</desc>
</param>
<param>
<type>int</type>
<name>delay</name>
<optional />
<desc>Zeit (in Ticks/Frames), bis das Kommando abgebrochen wird (es wird dann mit dem nachsten in der Kommandoliste fortgesetzt)</desc>
<desc>Time (in ticks or frames) until the command is automatically aborted. Execution will continue with the next command in the stack.</desc>
</param>
<param>
<type>any</type>
<name>Data</name>
<optional />
<desc>zusätzliche Daten zur Aktion</desc>
<desc>additional data for the command</desc>
</param>
<param>
<type>int</type>
<name>retries</name>
<optional />
<desc>Anzahl der Wiederholungen (wenn das Kommando fehlschlägt), bis das Kommando abgebrochen wird.</desc>
<desc>Number of retries if the command fails, until the command fails completely.</desc>
</param>
<param>
<type>int</type>
<name>base_mode</name>
<optional />
<desc>Bestimmt, wie beim Fehlschlag des Commands verfahren wird.<br/><br/>
<desc>
Determines the behaviour if the command fails.<br/><br/>
<table>
<rowh><col>base_mode</col> <col>Name</col> <col>Beschreibung</col>
<col>Fehlschlagsmeldung und CallFailed-Aufrufe</col> <col>Nächster Befehl</col></rowh>
<row><col>0</col> <col>C4CMD_SilentSub</col> <col>Stiller Unterbefehl</col>
<col>Nur wenn dies der letzte Befehl ist</col> <col>Schlägt fehl</col></row>
<row><col>3</col> <col>C4CMD_Sub</col> <col>Unterbefehl</col>
<col>Wenn der nächste Befehl keine Wiederholungen mehr hat oder dies der letzte Befehl ist</col> <col>Schlägt fehl</col></row>
<row><col>2</col> <col>C4CMD_SilentBase</col> <col>Stiller Basisbefehl</col>
<col>Nie</col> <col>Schlägt nicht fehl</col></row>
<row><col>1</col> <col>C4CMD_Base</col> <col>Basisbefehl</col>
<col>Immer</col> <col>Schlägt nicht fehl</col></row>
<rowh>
<col>base_mode</col>
<col>Name</col>
<col>Description</col>
<col>Failure messages and CallFailed calls</col>
<col>Next command</col>
</rowh>
<row>
<col>0</col>
<col>C4CMD_SilentSub</col>
<col>Silent command</col>
<col>Only if this is the last command</col>
<col>Fails</col>
</row>
<row>
<col>3</col>
<col>C4CMD_Sub</col>
<col>Command</col>
<col>If the next command has no retries left or this is the last command.</col>
<col>Fails</col>
</row>
<row>
<col>2</col>
<col>C4CMD_SilentBase</col>
<col>Silent base command</col>
<col>Never</col>
<col>Does not fail</col>
</row>
<row>
<col>1</col>
<col>C4CMD_Base</col>
<col>Base command</col>
<col>Always</col>
<col>Does not fail</col>
</row>
</table>
</desc>
</param>
</params>
</syntax>
<desc>Fügt ein Kommado in die Kommandoliste des aufrufenden Objekts hinzu (an den Anfang, siehe auch <funclink>AppendCommand</funclink>). D.h. es wird ein Kommando hinzugefügt, welches das Objekt vor anderen vorher gegebenen Kommandos auszuführen hat (war vorher kein Kommando gesetzt, so entspricht AddCommand <funclink>SetCommand</funclink>) <br />
Für Kommando-Beschreibungen siehe <funclink>SetCommand</funclink>
</desc>
<remark>
Mit AddCommand hinzugefügte Befehle werden nicht an gesteuerte Fahrzeuge weitergeleitet (siehe VehicleControl)
</remark>
<desc>Adds a command to the top of the command stack of an object (also see <funclink>AppendCommand</funclink>). This command will be executed first, then the object will continue with the existing commands. If the command stack is empty, AddCommand does the same as <funclink>SetCommand</funclink>.<br/>For the list of commands see <funclink>SetCommand</funclink>.</desc>
<remark>Commands added using AddCommand are not passed to controlled vehicles (see VehicleControl).</remark>
<examples>
<example>
<code>Timer:
var obj = <funclink>FindObject</funclink>(0, -20, -40, 40, 40, <funclink>OCF_CrewMember</funclink>();
if(obj)
if(obj-><funclink>GetComDir</funclink>() == <funclink>COMD_Right</funclink>())
obj-><funclink>AddCommand</funclink>("Jump");
if(obj-&gt;<funclink>GetComDir</funclink>() == <funclink>COMD_Right</funclink>())
obj-&gt;<funclink>AddCommand</funclink>(&quot;Jump&quot;);
return();</code>
<text>
Dieser Timer-Script bewirkt (aus einem Objekt aufgerufen, welches auf dem Boden liegt), dass jeder Clonk, der über das Objekt von links nach rechts hinübergeht, springt. Dazu wird erst ein Clonk (bzw. CrewMember) über dem Objekt gesucht. Wurde ein solcher gefunden, und läuft er im Moment nach rechts (ComDir), so wird dem Clonk das Kommando "Jump" hinzugefügt.
Das besondere an dem Script ist, dass die alte Befehlskette nicht angetastet wird; der Clonk wird nachdem er gesprungen hat seine Befehlskette weiter verarbeiten.<br />
Mithilfe dieses Script kann man einem Clonk z.B. beibringen, an einer bestimmten Stelle automatisch über einen Abgrund zu hüpfen.
</text>
<text>If called from an object on the ground, this timer script makes any clonk passing the object from left to right jump. To do this, crew member objects are searched above the object. If one is found and he is moving from left to right (ComDir), he is given a 'Jump' command. Notice that this does not affect the previously set commands of the clonk - after completing the jump command, the clonk will continue with his previous commands. Using this script, you could e.g. ensure that clonks will always jump a given gap in the landscape.</text>
</example>
</examples>
<related>
@ -107,6 +126,6 @@ Mithilfe dieses Script kann man einem Clonk z.B. beibringen, an einer bestimmten
<funclink>FinishCommand</funclink>
</related>
</func>
<author>PeterW</author><date>November 2001</date>
<author>Günther</author><date>Januar 2005</date>
<author>PeterW</author><date>2001-11</date>
<author>Günther</author><date>2005-01</date>
</funcs>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>AddEffect</title>
<category>Effekte</category>
<category>Effects</category>
<version>4.9.5.0 CE</version>
<syntax>
<rtype>int</rtype>
@ -12,70 +13,67 @@
<param>
<type>string</type>
<name>name</name>
<desc>Name des Effektes ohne vorangestelltes Fx.</desc>
<desc>Name of the effect without prepended 'Fx'.</desc>
</param>
<param>
<type>object</type>
<name>target</name>
<desc>Zielobjekt für den Effekt. Bei 0 wird der Effekt global erzeugt.</desc>
<desc>Target object for the effect. If 0, a global effect is created.</desc>
<optional />
</param>
<param>
<type>int</type>
<name>priority</name>
<desc>Priorität für den Effekt. Achtung: Die Priorität darf nicht 0 sein; ansonsten wird der Effekt nicht erzeugt!</desc>
<desc>Effect priority. Must be greater than zero.</desc>
</param>
<param>
<type>int</type>
<name>timer</name>
<optional />
<desc>Intervall, in dem Timer-Aufrufe getätigt werden. Bei 0 werden keine Timer-Aufrufe durchgeführt, und der Effekt bleibt permanent bis er durch anderwertige Aufrufe entfernt wird.</desc>
<desc>Interval for the timer calls. With 0, no timer calls are made and the effect stays on permanently until it is deleted by other calls.</desc>
</param>
<param>
<type>object</type>
<name>command_target</name>
<optional />
<desc>Befehlsziel. Wenn angegeben, werden alle Callbacks in diesem Objekt ausgeführt. Ansonsten finden diese Callbacks grundsätzlich ohne Objektkontext statt. Wenn das Befehlszielobjekt gelöscht wird, werden alle verbundenen Effekte ohne weitere Callbacks ebenfalls gelöscht. Falls das Befehlsziel seine Definition ändert, sollten verbundene Effekte mit <funclink>ChangeEffect</funclink> ihre Funktionen neu zuweisen lassen.</desc>
<desc>Command target. If specified, all callbacks are executed in this object. Otherwise the callbacks are made without any object context. If the command target object is deleted, all effects belonging to this object are deleted without any further callbacks. If the target object changes its definition, belonging effects should reassign their callback functions using <funclink>ChangeEffect</funclink>.</desc>
</param>
<param>
<type>id </type>
<name>command_target_id</name>
<optional />
<desc>Definition, in der bei nicht angegebenem Befehlsziel-Objekt Callbacks ausgeführt werden. Sind sowohl command_target als auch command_target_id 0, werden die Aufrufe global durchgeführt. Das heißt, die Fx*-Funktionen müssen als global deklariert sein, oder Enginefunktionen sein.</desc>
<desc>Definition in which callbacks are to be executed if no command target object is specified. If both command_target and command_target_id are 0, callbacks are made globally. For this, the Fx* must also be declared globally or they must be engine functions.</desc>
</param>
<param>
<type>any</type>
<name>var1</name>
<optional />
<desc>Erster Zusatzparameter, der an Fx*Start- und Fx*Effect-Callbacks übergeben wird</desc>
<desc>First extra parameter to be passed to Fx*Start and Fx*Effect callbacks.</desc>
</param>
<param>
<type>any</type>
<name>var2</name>
<optional />
<desc>Zweiter Zusatzparameter, der an Fx*Start- und Fx*Effect-Callbacks übergeben wird</desc>
<desc>Second extra parameter to be passed to Fx*Start and Fx*Effect callbacks.</desc>
</param>
<param>
<type>any</type>
<name>var3</name>
<optional />
<desc>Dritter Zusatzparameter, der an Fx*Start- und Fx*Effect-Callbacks übergeben wird</desc>
<desc>Third extra parameter to be passed to Fx*Start and Fx*Effect callbacks.</desc>
</param>
<param>
<type>any</type>
<name>var4</name>
<optional />
<desc>Vierter Zusatzparameter, der an Fx*Start- und Fx*Effect-Callbacks übergeben wird</desc>
<desc>Fourth extra parameter to be passed to Fx*Start and Fx*Effect callbacks.</desc>
</param>
</params>
</syntax>
<desc>Erzeugt einen Effekt. Rückgabewert ist der Effektindex bei Erfolg, oder 0 bei Fehlschlag (weil der Effekt beispielsweise abgelehnt wurde). Wenn der Effekt von einem anderen Effekt aufgenommen wurde, der sich in demselben Aufruf entfernt, wird -2 zurückgegeben.</desc>
<remark>Für Beispiele und weitere Hinweise siehe <emlink href="script/Effects.html">Effekte-Dokumentation</emlink>.</remark>
<desc>Creates an effect. Returns the effect index if successful or 0 if not (e.g. because the effect was rejected). If the effect was accepted by another effect which is deleting itself within the same call, the return value is -2.</desc>
<remark>For examples and more information see the <emlink href="script/Effects.html">effects documentation</emlink>.</remark>
<related>
<emlink href="script/Effects.html">Effekte-Dokumentation</emlink>
<emlink href="script/Effects.html">Effects Documentation</emlink>
<funclink>ChangeEffect</funclink>
<funclink>CheckEffect</funclink>
<funclink>GetEffectCount</funclink>
@ -85,5 +83,5 @@
<funclink>RemoveEffect</funclink>
</related>
</func>
<author>Sven2</author><date>März 2004</date>
<author>Sven2</author><date>2004-03</date>
</funcs>

View File

@ -1,78 +1,108 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>AddMenuItem</title>
<category>Objekte</category><subcat>Menü</subcat>
<version>4.6.5.0 CP<extversion>4.9.5.0 CE</extversion></version>
<syntax>
<rtype>int</rtype>
<params>
<param><type>string</type><name>caption</name><desc>Text des neuen Menüeintrags</desc></param>
<param><type>string</type><name>command</name><desc>Kommando, das bei Auswahl des Menüeintrags ausgeführt werden soll. Kann entweder ein Funktionsname oder ein Statement sein. Wenn ein Funktionsname angegeben wird, dann wird die Funktion in dem Objekt aufgerufen, welches bei <funclink>CreateMenu</funclink> als command_object übergeben wurde.</desc></param>
<param><type>id</type><name>symbol</name><desc>Die ID wird als Bild für den Menüeintrag verwendet. Der Name der Definition kann mit %s in caption verwendet werden. Außerdem wird die ID als erster Parameter an den Aufruf von command übergeben, sofern dieser nur ein Funktionsname ist.</desc></param>
<param><type>int</type><name>count</name><desc>Gewünschte Zahl, die neben dem Menüeintrag angezeigt werden soll (ähnlich der Mengenanzeige im Aktivieren-Menü)</desc></param>
<param><type>int</type><name>parameter</name><desc>Wird als 2. Parameter an die in command angegebene Funktion übergeben (siehe Anmerkung)</desc></param>
<param><type>string</type><name>info_caption</name><desc>Beschreibungstext des neuen Menüeintrags</desc></param>
<param><type>int</type><name>extra</name><desc>Zusatzparameter für das Verhalten des Menüeintrags.<br />
Untere 7 Bits (0-127): Menüsymbol.<br />
0: Normal<br />
1: Rangsymbol. Bei angegebenem symbol wird ggf. die Rank.png der Definition genutzt. count gibt die Ranghöhe an<br />
2: Picturefacet, das um XPar1-fache Picturebreite nach rechts verschoben ist. Damit lassen sich mehrere Menüsymbole innerhalb einer Definition unterbringen.<br />
3: XPar1 gibt ein Objekt an, dessen Picture-Grafik mit Rang gezeichnet wird. Hat das Objekt keine Infosektion (und dmait keinen Rang), so wird in Kontextmenüs dennoch ein entsprechender Leerraum gelassen. Ab CE.<br />
4: XPar1 gibt ein Objekt an, dessen Picture-Grafik gezeichnet wird. Ab CE.<br />
Bit 8 (128): XPar2 wird als Wertangabe benutzt, und überschreibt die Standardangabe (Wert der Definition symbol). Siehe auch extra von <funclink>CreateMenu</funclink></desc><optional/></param>
<param><type>any</type><name>XPar1</name><desc>Erster Zusatzparameter für extra.</desc><optional /></param>
<param><type>any</type><name>XPar2</name><desc>Zweiter Zusatzparameter für extra.</desc><optional /></param>
</params>
</syntax>
<desc>Fügt einen Menüeintrag hinzu.</desc>
<remark>Menüsymbole sollten optimalerweise die Größe 35x35 für normale Menüs, 16x16 für Kontextmenüs besitzen. Andernfalls wird unter Beibehaltung des Höhe/Breite-Verhältnisses so gestreckt, dass die längere Seite dieser Größe entspricht.</remark>
<remark>Wird als command-Parameter nur ein Funktionsname angegeben, werden folgende Parameter übergeben:
<code>symbol, parameter, bRight[, value]</code>
wobei bRight angibt, ob der Menueintrag mit [Special2] bzw. der rechten Maustaste ausgewählt wurde.
value wird nur übergeben, wenn das Bit 8 bei extra gesetzt wird und gibt den (überschriebenen) angezeigten Wert des ausgewählten Menüeintrags an.
</remark>
<examples>
<example>
<code>/* Wird bei Doppelklick auf Graben aufgerufen */
<func>
<title>AddMenuItem</title>
<category>Objects</category>
<subcat>Menu</subcat>
<version>4.6.5.0 CP<extversion>4.9.5.0 CE</extversion></version>
<syntax>
<rtype>int</rtype>
<params>
<param>
<type>string</type>
<name>caption</name>
<desc>Text of the new menu entry</desc>
</param>
<param>
<type>string</type>
<name>command</name>
<desc>Command to be executed when the menu item is selected. This can be either a function name or a statement. If a function name is given then the function will be called in the object which was given as command_object to <funclink>CreateMenu</funclink>.</desc>
</param>
<param>
<type>id</type>
<name>symbol</name>
<desc>The ID is used as a picture for the menu item. The name of the definition can be used in caption using %s. Also the ID is passed as the first parameter to the call to command in case it is a function name.</desc>
</param>
<param>
<type>int</type>
<name>count</name>
<desc>Numeric value to be displayed next to the menu entry (such as counts and amounts).</desc>
</param>
<param>
<type>int</type>
<name>parameter</name>
<desc>Second parameter to the function specified in command (see remark).</desc>
</param>
<param>
<type>string</type>
<name>info_caption</name>
<desc>Description text of the new menu entry.</desc>
</param>
<param>
<type>int</type>
<name>extra</name>
<desc>Extra parameter for special behaviour of the menu entry.<br/> Lower 7 bits (0-127): menu symbol.<br/> 0: normal<br/> 1: rank symbol. With symbol specified, the Rank.png component of that definition will be used. count indicates the rank<br/> 2: picture facet, shifted to the right by XPar1 times the facet width. This is used to include multiple menu symbols in a single definition.<br/> 3: XPar1 specifies an object to be drawn with the rank symbol. If the object has no info section (and thus no rank), there will be an empty entry in context menus. From CE.<br/> 4: XPar1 specifies an object to be drawn. From CE.<br/> Bit 8 (128): XPar2 is used as object value and overrides the normal object value. Also see extra in <funclink>CreateMenu</funclink></desc>
<optional />
</param>
<param>
<type>any</type>
<name>XPar1</name>
<desc>First additional parameter for extra.</desc>
<optional />
</param>
<param>
<type>any</type>
<name>XPar2</name>
<desc>Second additional parameter for extra.</desc>
<optional />
</param>
</params>
</syntax>
<desc>Adds a menu entry.</desc>
<remark>Custom menu symbols should best have square aspect ratio.</remark>
<remark>If a function name is specified for command, the following parameters are passed: <code>symbol, parameter, bRight[, value]</code> with bRight indicating whether the menu entry was selected with [Special2] or the right mouse button. value is passed only if bit 8 is set in extra and specifies the displayed (overridden) object value of the menu entry.</remark>
<examples>
<example>
<code>/* Wird bei Doppelklick auf Graben aufgerufen */
func Activate()
{
// Lokales Menü mit lokalen Kommandos erzeugen
// Lokales Menü mit lokalen Kommandos erzeugen
CreateMenu(GetID());
// Menüeinträge erzeugen
AddMenuItem("Hallo sagen", "SayHello", 0);
AddMenuItem("Zaubern", "DoMagic", 0);
AddMenuItem("Objekt erzeugen: %s", "CreateItem", Rock);
AddMenuItem("Objekt erzeugen: %s", "CreateItem", Firestone);
// Menüeinträge erzeugen
AddMenuItem(&quot;Hallo sagen&quot;, &quot;SayHello&quot;, 0);
AddMenuItem(&quot;Zaubern&quot;, &quot;DoMagic&quot;, 0);
AddMenuItem(&quot;Objekt erzeugen: %s&quot;, &quot;CreateItem&quot;, Rock);
AddMenuItem(&quot;Objekt erzeugen: %s&quot;, &quot;CreateItem&quot;, Firestone);
}
/* Diese Kommados werden vom Menü aufgerufen */
/* Diese Kommados werden vom Menü aufgerufen */
func SayHello()
{
Message("Hallo");
Message(&quot;Hallo&quot;);
}
func DoMagic()
{
Sound("Magic*");
CreateObject(MLGT,0,0)->~Activate(this);
Sound(&quot;Magic*&quot;);
CreateObject(MLGT,0,0)-&gt;~Activate(this);
}
func CreateItem(id item)
{
Sound("Magic*");
Sound(&quot;Magic*&quot;);
CreateContents(item);
}</code>
<text>Menü für einen Spezialclonk.</text>
</example>
</examples>
<related>
<funclink>CreateMenu</funclink>
<funclink>SelectMenuItem</funclink>
<funclink>CloseMenu</funclink>
</related>
</func>
<author>jwk</author><date>April 2002</date>
<text>Menu for a special clonk.</text>
</example>
</examples>
<related>
<funclink>CreateMenu</funclink>
<funclink>SelectMenuItem</funclink>
<funclink>CloseMenu</funclink>
</related>
</func>
<author>jwk</author><date>2002-04</date>
</funcs>

View File

@ -1,20 +1,28 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>AddMsgBoardCmd</title>
<category>Interface</category>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
<params>
<param><type>string</type><name>command</name><desc>Name des MessageBoard-Kommandos</desc></param>
<param><type>string</type><name>script</name><desc>Auszuführender Script</desc></param>
</params>
</syntax>
<desc>Erzeugt ein neues selbstdefiniertes Messageboard-Kommando. Dieses Kommando kann von jedem Spieler im Spiel durch Eingabe von "/[Kommandoname]" aufgerufen werden.
In dem Fall wird der angegebene Script ausgeführt. Im Script kann "%s" dafür verwendet werden, eventuell angegebene Parameter einzubinden.</desc>
</func>
<author>PeterW</author><date>Juni 2003</date>
<func>
<title>AddMsgBoardCmd</title>
<category>Interface</category>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
<params>
<param>
<type>string</type>
<name>command</name>
<desc>Name of messageboard command</desc>
</param>
<param>
<type>string</type>
<name>script</name>
<desc>Script to be executed</desc>
</param>
</params>
</syntax>
<desc>Creates a user-defined messageboard command. This command can be entered by any player using the syntax "/[command]" in the message board. This will execute the defined script. The script can use "%s" to incorporate parameters.</desc>
</func>
<author>PeterW</author><date>2003-06</date>
</funcs>

View File

@ -1,32 +1,42 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>AddVertex</title>
<category>Objekte</category><subcat>Vertices</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int</rtype>
<params>
<param><type>int</type><name>x</name><desc>X-Koordinate, von der Objektmitte aus gesehen.</desc></param>
<param><type>int</type><name>y</name><desc>Y-Koordinate, von der Objektmitte aus gesehen.</desc></param>
</params>
</syntax>
<desc>Fügt dem aufrufenden Objekt einen neuen Vertex hinzu.</desc>
<remark>Achtung: Bei jeder Vertexaktualisierung (also beispielsweise dann, wenn sich Fertigstellungswert oder Rotation eines Objekts ändern) werden alle Vertices wieder auf die Definitionswerte zurückgesetzt.</remark>
<examples>
<example>
<code><funclink>GetHiRank</funclink>(0)->AddVertex(50,0);</code>
<text>Lässt den Captain des ersten Spielers im Boden festhängen.</text>
</example>
</examples>
<related>
<funclink>GetVertex</funclink>
<funclink>SetVertex</funclink>
<funclink>GetVertexNum</funclink>
<funclink>RemoveVertex</funclink>
</related>
</func>
<author>jwk</author><date>April 2002</date>
<func>
<title>AddVertex</title>
<category>Objects</category>
<subcat>Vertices</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int</rtype>
<params>
<param>
<type>int</type>
<name>x</name>
<desc>X coordinate, relative to the object center</desc>
</param>
<param>
<type>int</type>
<name>y</name>
<desc>Y coordinate, relative to the object center</desc>
</param>
</params>
</syntax>
<desc>Adds a new vertex to an object.</desc>
<remark>Notice: with any vertex updated caused by stretching or rotation of the object (e.g. building or growth) the vertices will be reset to their original defined position unless a special vertex mode is selected.</remark>
<examples>
<example>
<code><funclink>GetHiRank</funclink>(0)-&gt;AddVertex(50,0);</code>
<text>Makes the captain of the first player stick to the ground.</text>
</example>
</examples>
<related>
<funclink>GetVertex</funclink>
<funclink>SetVertex</funclink>
<funclink>GetVertexNum</funclink>
<funclink>RemoveVertex</funclink>
</related>
</func>
<author>jwk</author><date>2002-04</date>
</funcs>

View File

@ -1,27 +1,49 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Angle</title>
<category>Arithmetik</category>
<category>Arithmetics</category>
<version>4.6.5.0 CP<extversion>4.9.5.0 CE</extversion></version>
<syntax>
<rtype>int</rtype>
<params>
<param><type>int</type><name>x1</name><desc>X-Koordinate des ersten Punktes</desc></param>
<param><type>int</type><name>y1</name><desc>Y-Koordinate des ersten Punktes</desc></param>
<param><type>int</type><name>x2</name><desc>X-Koordinate des zweiten Punktes</desc></param>
<param><type>int</type><name>y2</name><desc>Y-Koordinate des zweiten Punktes</desc></param>
<param><type>int</type><name>precision</name><desc>Gibt, wenn angegeben, den Winkel multipliziert mit precision zurück, um so genauere Winkel zu erhalten. Eine Präzision von 10 gibt also Werte zwischen 0 und 3600 zurück.</desc><optional/></param>
<param>
<type>int</type>
<name>x1</name>
<desc>X coordinate of the first point</desc>
</param>
<param>
<type>int</type>
<name>y1</name>
<desc>Y coordinate of the first point</desc>
</param>
<param>
<type>int</type>
<name>x2</name>
<desc>X coordinate of the second point</desc>
</param>
<param>
<type>int</type>
<name>y2</name>
<desc>Y coordinate of the second point</desc>
</param>
<param>
<type>int</type>
<name>precision</name>
<desc>Multiplied with the angle. For a higher precision while working with integers (whole numbers) you can specify a higher precision value. A precision of 10 will produce values from 0 to 3600.</desc>
<optional />
</param>
</params>
</syntax>
<desc>Liefert den Winkel, in dem sich der zweite Punkt vom ersten Punkt aus gesehen befindet. Der Winkel wird in Grad zurückgeliefert, 0° ist senkrecht oben. Alle Koordinaten sind global.</desc>
<desc>Returns the view angle from the first point to the second in degrees. 0° ist straight up. All coordinates global.</desc>
<examples>
<example>
<code><funclink>SetR</funclink>(Angle(<funclink>GetX</funclink>(<funclink>GetCursor</funclink>(0)), <funclink>GetY</funclink>(<funclink>GetCursor</funclink>(0)),
<code><funclink>SetR</funclink>(Angle(<funclink>GetX</funclink>(<funclink>GetCursor</funclink>(0)), <funclink>GetY</funclink>(<funclink>GetCursor</funclink>(0)),
<funclink>GetX</funclink>(<funclink>GetCursor</funclink>(1)), <funclink>GetY</funclink>(<funclink>GetCursor</funclink>(1)) ));</code>
<text>Das Objekt dreht sich, so dass es parallel zu der Gerade liegt, die durch die Mittelpunkte der ausgewählten Clonks von Spieler 1 und 2 geht.</text>
<text>The object rotates so it points from the clonk of player 1 to the clonk of player 2.</text>
</example>
</examples>
<related>
@ -29,6 +51,6 @@
<funclink>Sin</funclink>
</related>
</func>
<author>jwk</author><date>April 2002</date>
<author>Clonk-Karl</author><date>September 2004</date>
<author>jwk</author><date>2002-04</date>
<author>Clonk-Karl</author><date>2004-09</date>
</funcs>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Anim_AbsX</title>
<category>Animationen</category>
<category>Animations</category>
<version>4.10.0.0 OC</version>
<syntax>
<rtype>array</rtype>
@ -12,37 +13,33 @@
<param>
<type>int</type>
<name>position</name>
<desc>Startwert. Sollte innerhalb des von begin und end aufgespannten Intervalls liegen.</desc>
<desc>Start value. Should be inside the interval given by begin and end.</desc>
</param>
<param>
<type>int</type>
<name>begin</name>
<desc>Beginn des Intervalls.</desc>
<desc>Start of the interval.</desc>
</param>
<param>
<type>int</type>
<name>end</name>
<desc>Schluss des Intervalls. Wenn end größer als begin ist, so nimmt der Wert mit der Bewegung des Objekts zu, andernfalls nimmt er ab.</desc>
<desc>End of the interval. If end is greater than begin then the value increases with every movement of the object, otherwise it decreases.</desc>
</param>
<param>
<type>int</type>
<name>length</name>
<desc>Anzahl Pixel die in X-Richtung zurückgelegt werden müssen um die Animation von begin bis nach end durchzuspielen.</desc>
</param>
<desc>Number of pixels to be moved into X direction for the animation to be played from begin to end.</desc>
</param>
</params>
</syntax>
<desc>Der Wert hängt von der Bewegung des Objekts in X-Richtung ab. Jeder Pixel den sich das Objekt in X-Richtung bewegt erhöht den Wert etwas. Wenn end erreicht wurde wird der Wert wieder auf begin zurückgesetzt. Im Gegensatz zu <funclink>Anim_X</funclink> bewegt sich der Wert immer auf end zu, egal in welche Richtung sich das Objekt bewegt.</desc>
<remark>Siehe die <emlink href="definition/animations.html">Animations-Dokumentation</emlink> für eine Beschreibung des Animationssystems.</remark>
<desc>The value depends on the movement of the object into X direction. Every pixel the object moves into X direction increases the value a little bit. Once end has been reached the value is reset to begin. In contrast to <funclink>Anim_X</funclink> the value moves towards end not depending on whether the object moves to the left or to the right.</desc>
<remark>See the <emlink href="definition/animations.html">animation documentation</emlink> for further explanations of the animation system.</remark>
<examples>
<example>
<code><funclink>PlayAnimation</funclink>("Walk", 5, <funclink>Anim_AbsX</funclink>(0, 0, <funclink>GetAnimationLength</funclink>("Walk"), 20), <funclink>Anim_Const</funclink>(1000));</code>
<text>Spielt die Animation "Walk" in Slot 5 ab und überlagert dabei eventuelle andere Animationen in Slot 5. Die Animation wird dabei umso schneller abgespielt je schneller sich das Objekt in X-Richtung bewegt. Nachdem es 20 Pixel zurückgelegt hat ist die Animation einmal von vorne bis hinten durchgespielt worden und fängt wieder von vorne an.</text>
<code><funclink>PlayAnimation</funclink>(&quot;Walk&quot;, 5, <funclink>Anim_AbsX</funclink>(0, 0, <funclink>GetAnimationLength</funclink>(&quot;Walk&quot;), 20), <funclink>Anim_Const</funclink>(1000));</code>
<text>Plays the animation "Walk" in slot 5, superimposing any other potential animations in slot 5. The animation is played the faster the faster the object moves into X direction. Once it moved 20 pixels the animation has been played from begin to end and restarts at its beginning.</text>
</example>
</examples>
<related>
<funclink>PlayAnimation</funclink>
<funclink>SetAnimationPosition</funclink>
@ -57,5 +54,5 @@
<funclink>Anim_Action</funclink>
</related>
</func>
<author>Clonk-Karl</author><date>Januar 2010</date>
<author>Clonk-Karl</author><date>2010-01</date>
</funcs>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Anim_AbsY</title>
<category>Animationen</category>
<category>Animations</category>
<version>4.10.0.0 OC</version>
<syntax>
<rtype>array</rtype>
@ -12,37 +13,33 @@
<param>
<type>int</type>
<name>position</name>
<desc>Startwert. Sollte innerhalb des von begin und end aufgespannten Intervalls liegen.</desc>
<desc>Start value. Should be inside the interval given by begin and end.</desc>
</param>
<param>
<type>int</type>
<name>begin</name>
<desc>Beginn des Intervalls.</desc>
<desc>Start of the interval.</desc>
</param>
<param>
<type>int</type>
<name>end</name>
<desc>Schluss des Intervalls. Wenn end größer als begin ist, so nimmt der Wert mit der Bewegung des Objekts zu, andernfalls nimmt er ab.</desc>
<desc>End of the interval. If end is greater than begin then the value increases with every movement of the object, otherwise it decreases.</desc>
</param>
<param>
<type>int</type>
<name>length</name>
<desc>Anzahl Pixel die in Y-Richtung zurückgelegt werden müssen um die Animation von begin bis nach end durchzuspielen.</desc>
</param>
<desc>Number of pixels that need to be moved in Y direction for the animation to be played from begin to end.</desc>
</param>
</params>
</syntax>
<desc>Der Wert hängt von der Bewegung des Objekts in Y-Richtung ab. Jeder Pixel den sich das Objekt in Y-Richtung bewegt erhöht den Wert etwas. Wenn end erreicht wurde wird der Wert wieder auf begin zurückgesetzt. Im Gegensatz zu <funclink>Anim_Y</funclink> bewegt sich der Wert immer auf end zu, egal in welche Richtung sich das Objekt bewegt.</desc>
<remark>Siehe die <emlink href="definition/animations.html">Animations-Dokumentation</emlink> für eine Beschreibung des Animationssystems.</remark>
<desc>The value depends on the movement of the object into Y direction. Every pixel the object moves into Y direction increases the value a little bit. Once end is reached the value is reset to begin. In contrast to <funclink>Anim_Y</funclink> the value always moves towards end, not depending on whether the object moves upwards or downwards.</desc>
<remark>See the <emlink href="definition/animations.html">animation documentation</emlink> for further explanations of the animation system.</remark>
<examples>
<example>
<code><funclink>PlayAnimation</funclink>("Lift", 5, <funclink>Anim_AbsY</funclink>(0, 0, <funclink>GetAnimationLength</funclink>("Lift"), 25), <funclink>Anim_Const</funclink>(1000));</code>
<text>Spielt die Animation "Lift" in Slot 5 ab und überlagert dabei eventuelle andere Animationen in Slot 5. Die Animation wird dabei umso schneller abgespielt je schneller sich das Objekt in Y-Richtung bewegt. Nachdem es 25 Pixel zurückgelegt hat ist die Animation einmal von vorne bis hinten durchgespielt worden und fängt wieder von vorne an.</text>
<code><funclink>PlayAnimation</funclink>(&quot;Lift&quot;, 5, <funclink>Anim_AbsY</funclink>(0, 0, <funclink>GetAnimationLength</funclink>(&quot;Lift&quot;), 25), <funclink>Anim_Const</funclink>(1000));</code>
<text>Plays the animation "Lift" in slot 5 and superimposes any other potential animations played in slot 5. The animation is playdethe faster the faster the object moves into Y direction. After it moved 25 pixels the animation has been played from its beginning to its end and will be restarted.</text>
</example>
</examples>
<related>
<funclink>PlayAnimation</funclink>
<funclink>SetAnimationPosition</funclink>
@ -57,5 +54,5 @@
<funclink>Anim_Action</funclink>
</related>
</func>
<author>Clonk-Karl</author><date>Januar 2010</date>
<author>Clonk-Karl</author><date>2010-01</date>
</funcs>

View File

@ -1,28 +1,24 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Anim_Action</title>
<category>Animationen</category>
<category>Animations</category>
<version>4.10.0.0 OC</version>
<syntax>
<rtype>array</rtype>
<params>
</params>
<params />
</syntax>
<desc>Der Wert hängt von der Phase der aktuellen Action ab. Die Phase wird linear auf die von der Action zur Zeit abgespielte Animation abgebildet (siehe <emlink href="definition/actmap.html">ActMap</emlink>). Dies kann verwendet werden um Animationen synchron zur ActMap-Animation zu spielen.</desc>
<remark>Siehe die <emlink href="definition/animations.html">Animations-Dokumentation</emlink> für eine Beschreibung des Animationssystems.</remark>
<desc>The value depends on the phase of the current action. The phase is mapped linearily to the length of the animation the current action is playing. This can be used to play animations synchronized to the ActMap animation.</desc>
<remark>See the <emlink href="definition/animations.html">animation documentation</emlink> for further explanations of the animation system.</remark>
<examples>
<example>
<code><funclink>PlayAnimation</funclink>("Walk", 10, <funclink>Anim_Action</funclink>(), <funclink>Anim_Const</funclink>(1000));</code>
<text>Spielt die Animation "Walk" in Slot 10 synchron zur aktuellen Action ab.</text>
<code><funclink>PlayAnimation</funclink>(&quot;Walk&quot;, 10, <funclink>Anim_Action</funclink>(), <funclink>Anim_Const</funclink>(1000));</code>
<text>Plays the animation "Walk in slot 10 synchroned to the current action.</text>
</example>
</examples>
<related>
<funclink>PlayAnimation</funclink>
<funclink>SetAnimationPosition</funclink>
@ -37,5 +33,5 @@
<funclink>Anim_YDir</funclink>
</related>
</func>
<author>Clonk-Karl</author><date>Januar 2010</date>
<author>Clonk-Karl</author><date>2010-01</date>
</funcs>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Anim_Const</title>
<category>Animationen</category>
<category>Animations</category>
<version>4.10.0.0 OC</version>
<syntax>
<rtype>array</rtype>
@ -12,22 +13,18 @@
<param>
<type>int</type>
<name>value</name>
<desc>Zu verwendender Wert.</desc>
<desc>Value to use.</desc>
</param>
</params>
</syntax>
<desc>Wertangabe für <funclink>PlayAnimation</funclink>, <funclink>SetAnimationPosition</funclink> oder <funclink>SetAnimationWeight</funclink>: Über die komplette Zeitdauer der Animation wird der gegebene konstante Wert verwendet.</desc>
<remark>Siehe die <emlink href="definition/animations.html">Animations-Dokumentation</emlink> für eine Beschreibung des Animationssystems.</remark>
<desc>Value provider for <funclink>PlayAnimation</funclink>, <funclink>SetAnimationPosition</funclink> or <funclink>SetAnimationWeight</funclink>: For the whole animation the given constant value will be used.</desc>
<remark>See the <emlink href="definition/animations.html">animation documentation</emlink> for further explanations of the animation system.</remark>
<examples>
<example>
<code><funclink>PlayAnimation</funclink>("HangleStand", 5, <funclink>Anim_Linear</funclink>(0, 0, 2000, 100, ANIM_Loop), <funclink>Anim_Const</funclink>(1000));</code>
<text>Spielt die Animation "HangleStand" ab und verwendet dabei kontant den Wert 1000 als Gewicht (volles Gewicht). Die Position der Animation ist nicht konstant sondern verändert sich (linear) mit der Zeit, siehe <funclink>Anim_Linear</funclink>.</text>
<code><funclink>PlayAnimation</funclink>(&quot;HangleStand&quot;, 5, <funclink>Anim_Linear</funclink>(0, 0, 2000, 100, ANIM_Loop), <funclink>Anim_Const</funclink>(1000));</code>
<text>Plays the animation "HangleStand" and uses the value 1000 constantly for the animation's weight (full weight). The position of the animation is not contant but changes (linearily) with time, see <funclink>Anim_Linear</funclink>.</text>
</example>
</examples>
<related>
<funclink>PlayAnimation</funclink>
<funclink>SetAnimationPosition</funclink>
@ -42,5 +39,5 @@
<funclink>Anim_Action</funclink>
</related>
</func>
<author>Clonk-Karl</author><date>Januar 2010</date>
<author>Clonk-Karl</author><date>2010-01</date>
</funcs>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Anim_Linear</title>
<category>Animationen</category>
<category>Animations</category>
<version>4.10.0.0 OC</version>
<syntax>
<rtype>array</rtype>
@ -12,46 +13,38 @@
<param>
<type>int</type>
<name>position</name>
<desc>Startwert. Sollte innerhalb des von begin und end aufgespannten Intervalls liegen.</desc>
<desc>Start value. Should be inside the interval given by begin and end.</desc>
</param>
<param>
<type>int</type>
<name>begin</name>
<desc>Beginn des Intervalls.</desc>
<desc>Start of the interval.</desc>
</param>
<param>
<type>int</type>
<name>end</name>
<desc>Schluss des Intervalls. Wenn end größer als begin ist, so steigt der Wert mit der Zeit an, andernfalls nimmt er ab.</desc>
<desc>End of the interval. If end is larger than begin then the value increases linearily with time, otherwise it decreases.</desc>
</param>
<param>
<type>int</type>
<name>length</name>
<desc>Anzahl Frames die ein Durchspielen von begin bis end dauert.</desc>
</param>
<desc>Number of frames for the animation to be played from begin to end.</desc>
</param>
<param>
<type>int</type>
<name>on_ending</name>
<desc>Bestimmt, was nach dem Erreichen von end geschieht. Folgende Möglichkeiten existieren:
<table>
<rowh><col>Konstante</col><col>Wert</col><col>Beschreibung</col></rowh>
<row><col>ANIM_Loop</col><col>0</col><col>Der Wert wird nach dem Erreichen von end wieder auf begin gesetzt und der Durchgang beginnt von neuem.</col></row>
<row><col>ANIM_Hold</col><col>1</col><col>Nach Erreichen von end bleibt der Wert konstant auf end.</col></row>
<row><col>ANIM_Remove</col><col>2</col><col>Nach Erreichen von end wird die zugehörige Animation entfernt wie wenn zum entsprechenden Zeitpunkt <funclink>StopAnimation</funclink> aufgerufen würde. Bei Kombinationsknoten wird der Kindknoten mit der kleineren Gewichtung entfernt.</col></row>
</table>
</desc>
</param>
<desc>
Specifies what happens once end is reached. There are the following possibilities:
</desc>
</param>
</params>
</syntax>
<desc>Der Wert nimmt linear mit der Zeit (in Frames) zu oder ab (je nachdem ob end größer oder kleiner als begin ist). Anfangs beträgt der Wert position und läuft dann Richtung end. Ein Durchgang von begin bis nach end dauert length Frames. Wenn position von begin abweicht dann wird end bereits früher erreicht sein. on_ending bestimmt, was passiert, wenn das Ende erreicht ist.</desc>
<remark>Siehe die <emlink href="definition/animations.html">Animations-Dokumentation</emlink> für eine Beschreibung des Animationssystems.</remark>
<desc>The value increases or decreases (depending on whether end is smaller or larger than begin) linearily in time (in frames). Initially the value is set to position and it is moving towards end. One cycle from begin to end lasts for length frames. If position and begin are not the same then end will be reached earlier already. on_ending specifies what happens once the end is reached.</desc>
<remark>See the <emlink href="definition/animations.html">animation documentation</emlink> for further explanations of the animation system.</remark>
<examples>
<example>
<code>var start = 0;
var end = <funclink>GetAnimationLength</funclink>("Turn");
var end = <funclink>GetAnimationLength</funclink>(&quot;Turn&quot;);
if(<funclink>GetWind</funclink>() &lt; 0)
{
start = end;
@ -62,10 +55,9 @@ if(<funclink>GetWind</funclink>() != 0)
<funclink>SetAnimationPosition</funclink>(<funclink>GetRootAnimation</funclink>(5), <funclink>Anim_Linear</funclink>(<funclink>GetAnimationPosition</funclink>(<funclink>GetRootAnimation</funclink>(5)), start, end, 7200/<funclink>GetWind</funclink>(), ANIM_Loop));
else
<funclink>SetAnimationPosition</funclink>(<funclink>GetRootAnimation</funclink>(5), <funclink>Anim_Const</funclink>(<funclink>GetAnimationPosition</funclink>(<funclink>GetRootAnimation</funclink>(5))));</code>
<text>Setzt die Geschwindigkeit mit der die Animation im Slot 5 abgespielt wird abhängig von der Windgeschwindigkeit. Weht der Wind nach links so wird die Animation rückwärts abgespielt. Es wäre auch möglich die Position jeden Frame mit <funclink>Anim_Const</funclink> zu setzen, bei der Lösung mit <funclink>Anim_Linear</funclink> reicht es aber aus wenn die Funktion nur alle paar Frames aufgerufen wird, da sich das Windrad in der Zwischenzeit mit konstanter Geschwindigkeit weiter dreht (es wird also die Näherung gemacht, dass die Windgeschwindigkeit für kleine Zeitintervalle konstant ist).</text>
<text>Sets the speed with which the animation in slot 5 is played depending on the wind speed. If the wind blows to the left then the animation is played backwards. Another possibility would be to set the position each frame using <funclink>Anim_Const</funclink>, however with the solution using <funclink>Anim_Linear</funclink> it is enough to call the function every couple of frames since the windmill continues to turn with contstant speed between calls (in other words, it is assumed that the wind speed will not change much for small time intervals).</text>
</example>
</examples>
<related>
<funclink>PlayAnimation</funclink>
<funclink>SetAnimationPosition</funclink>
@ -80,5 +72,5 @@ else
<funclink>Anim_Action</funclink>
</related>
</func>
<author>Clonk-Karl</author><date>Januar 2010</date>
<author>Clonk-Karl</author><date>2010-01</date>
</funcs>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Anim_X</title>
<category>Animationen</category>
<category>Animations</category>
<version>4.10.0.0 OC</version>
<syntax>
<rtype>array</rtype>
@ -12,37 +13,33 @@
<param>
<type>int</type>
<name>position</name>
<desc>Startwert. Sollte innerhalb des von begin und end aufgespannten Intervalls liegen.</desc>
<desc>Start value. Should be inside the interval given by begin and end.</desc>
</param>
<param>
<type>int</type>
<name>begin</name>
<desc>Beginn des Intervalls.</desc>
<desc>Start of the interval.</desc>
</param>
<param>
<type>int</type>
<name>end</name>
<desc>Schluss des Intervalls. Wenn end größer als begin ist, so nimmt der Wert mit der Bewegung des Objekts in positiver X-Richtung zu, andernfalls nimmt er ab.</desc>
<desc>End of the interval. If end is chosen to be greater than begin then the value increases with movement into positive X direction, otherwise it decreases.</desc>
</param>
<param>
<type>int</type>
<name>length</name>
<desc>Anzahl Pixel die in X-Richtung zurückgelegt werden müssen um die Animation von begin bis nach end durchzuspielen.</desc>
</param>
<desc>Number of pixels to be moved into X direction for the animation to be played from begin to end.</desc>
</param>
</params>
</syntax>
<desc>Der Wert hängt von der Bewegung des Objekts in X-Richtung ab. Jeder Pixel den sich das Objekt in positiver X-Richtung bewegt erhöht den Wert etwas, und jeder Pixel in negative X-Richtung verringert ihn etwas. Wenn end erreicht wurde wird der Wert wieder auf begin zurückgesetzt, und wenn begin erreicht wurde wird er auf end gesetzt.</desc>
<remark>Siehe die <emlink href="definition/animations.html">Animations-Dokumentation</emlink> für eine Beschreibung des Animationssystems.</remark>
<desc>The value depends on the movement into X direction. Every pixel moved into positive X direction increases the value a little bit, and each pixel moved into negative X direction decreases it. If end was reached then the value is reset to begin and if begin was reached then the value is reset to end.</desc>
<remark>See the <emlink href="definition/animations.html">animation documentation</emlink> for further explanations of the animation system.</remark>
<examples>
<example>
<code><funclink>PlayAnimation</funclink>("Drive", 5, <funclink>Anim_X</funclink>(0, <funclink>GetAnimationLength</funclink>("Drive"), 0, 15), <funclink>Anim_Const</funclink>(1000));</code>
<text>Spielt die Animation "Drive" in Slot 5 ab und überlagert dabei eventuelle andere Animationen in Slot 5. Die Animation wird dabei umso schneller abgespielt je schneller sich das Objekt in X-Richtung bewegt. Nachdem es 15 Pixel zurückgelegt hat ist die Animation einmal von vorne bis hinten durchgespielt worden und fängt wieder von vorne an. Hier wird <funclink>Anim_X</funclink> anstelle von <funclink>Anim_AbsX</funclink> verwendet, da sich die Räder eines Fahrzeugs beim Rückwärtsfahren auch rückwärts drehen sollen.</text>
<code><funclink>PlayAnimation</funclink>(&quot;Drive&quot;, 5, <funclink>Anim_X</funclink>(0, <funclink>GetAnimationLength</funclink>(&quot;Drive&quot;), 0, 15), <funclink>Anim_Const</funclink>(1000));</code>
<text>Plays the animation "Drive" in slot 5 and superimposes any other potential animations in slot 5. The animation is played the faster the faster the object moves into X direction. Once the object moved 15 pixels the animation will have been played from begin to end and it restarts from the beginning. Here we use <funclink>Anim_X</funclink> instead of <funclink>Anim_AbsX</funclink> so that the wheels of a vehicle turn backwards when driving backwards.</text>
</example>
</examples>
<related>
<funclink>PlayAnimation</funclink>
<funclink>SetAnimationPosition</funclink>
@ -57,5 +54,5 @@
<funclink>Anim_Action</funclink>
</related>
</func>
<author>Clonk-Karl</author><date>Januar 2010</date>
<author>Clonk-Karl</author><date>2010-01</date>
</funcs>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Anim_XDir</title>
<category>Animationen</category>
<category>Animations</category>
<version>4.10.0.0 OC</version>
<syntax>
<rtype>array</rtype>
@ -12,32 +13,28 @@
<param>
<type>int</type>
<name>begin</name>
<desc>Beginn des Intervalls.</desc>
<desc>Start of the interval.</desc>
</param>
<param>
<type>int</type>
<name>end</name>
<desc>Schluss des Intervalls. Wenn end größer als begin ist, so nimmt der Wert mit größerer XDir zu, sonst nimmt er ab.</desc>
<desc>End of the interval. If end is greater than begin then the value increases with increases XDir, otherwise it decreases.</desc>
</param>
<param>
<type>int</type>
<name>max_dir</name>
<desc>Größter Wert der XDir der abgebildet soll. Noch größere Geschwindigkeiten führen zum gleichen Animationswert (end).</desc>
</param>
<desc>Largest value of XDir to be mapped. Even larger velocities lead to the same animation value (end).</desc>
</param>
</params>
</syntax>
<desc>Der Wert ist proportional zur X-Geschwindigkeit des Objekts. Die Geschwindigkeiten 0 bis max_dir werden linear auf den Wertebereich von begin bis end abgebildet.</desc>
<remark>Siehe die <emlink href="definition/animations.html">Animations-Dokumentation</emlink> für eine Beschreibung des Animationssystems.</remark>
<desc>The value is proportional to the object's velocity in X direction. The velocities from 0 to max_dir are mapped linearily to the interval from begin to end.</desc>
<remark>See the <emlink href="definition/animations.html">animation documentation</emlink> for further explanations of the animation system.</remark>
<examples>
<example>
<code><funclink>PlayAnimation</funclink>("ShowSpeed", 10, <funclink>Anim_XDir</funclink>(0, <funclink>GetAnimationLength</funclink>("ShowSpeed"), 100), <funclink>Anim_Const</funclink>(1000));</code>
<text>Spielt die Animation "ShowSpeed" in Slot 10 ab. Diese könnte eine Geschwindigkeitsanzeige in einem Fahrzeug darstellen.</text>
<code><funclink>PlayAnimation</funclink>(&quot;ShowSpeed&quot;, 10, <funclink>Anim_XDir</funclink>(0, <funclink>GetAnimationLength</funclink>(&quot;ShowSpeed&quot;), 100), <funclink>Anim_Const</funclink>(1000));</code>
<text>Plays the animation "ShowSpeed" in slot 10. This could be a tachoometer in a vehicle.</text>
</example>
</examples>
<related>
<funclink>PlayAnimation</funclink>
<funclink>SetAnimationPosition</funclink>
@ -52,5 +49,5 @@
<funclink>Anim_Action</funclink>
</related>
</func>
<author>Clonk-Karl</author><date>Januar 2010</date>
<author>Clonk-Karl</author><date>2010-01</date>
</funcs>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Anim_Y</title>
<category>Animationen</category>
<category>Animations</category>
<version>4.10.0.0 OC</version>
<syntax>
<rtype>array</rtype>
@ -12,37 +13,33 @@
<param>
<type>int</type>
<name>position</name>
<desc>Startwert. Sollte innerhalb des von begin und end aufgespannten Intervalls liegen.</desc>
<desc>Start value. Should be inside the interval given by begin and end.</desc>
</param>
<param>
<type>int</type>
<name>begin</name>
<desc>Beginn des Intervalls.</desc>
<desc>Start of the interval.</desc>
</param>
<param>
<type>int</type>
<name>end</name>
<desc>Schluss des Intervalls. Wenn end größer als begin ist, so nimmt der Wert mit Bewegung des Objekts in positiver Y-Richtung zu, andernfalls nimmt er ab.</desc>
<desc>End of the interval. If end is greater than begin then the value increases with movement into positive Y direction, otherwise it decreases in that case.</desc>
</param>
<param>
<type>int</type>
<name>length</name>
<desc>Anzahl Pixel die in Y-Richtung zurückgelegt werden müssen um die Animation von begin bis nach end durchzuspielen.</desc>
</param>
<desc>Number of pixels that need to be moved in Y direction for the animation to be played from begin to end.</desc>
</param>
</params>
</syntax>
<desc>Der Wert hängt von der Bewegung des Objekts in Y-Richtung ab. Jeder Pixel den sich das Objekt in positiver Y-Richtung bewegt erhöht den Wert etwas, und jeder Pixel in negative Y-Richtung verringert ihn etwas. Wenn end erreicht wurde wird der Wert wieder auf begin zurückgesetzt, und wenn begin erreicht wurde wird er auf end gesetzt.</desc>
<remark>Siehe die <emlink href="definition/animations.html">Animations-Dokumentation</emlink> für eine Beschreibung des Animationssystems.</remark>
<desc>The value depends on the movement of the object in Y direction. Each pixel the object moves into positive Y direction increases the value a little bit, and each pixel in negative Y direction decreases it. If end is reached then the value is reset to begin, and if begin is reached then the value is reset to end.</desc>
<remark>See the <emlink href="definition/animations.html">animation documentation</emlink> for further explanations of the animation system.</remark>
<examples>
<example>
<code><funclink>PlayAnimation</funclink>("Scale", 5, <funclink>Anim_Y</funclink>(0, <funclink>GetAnimationLength</funclink>("Scale"), 0, 15), <funclink>Anim_Const</funclink>(1000));</code>
<text>Spielt die Animation "Scale" in Slot 5 ab und überlagert dabei eventuelle andere Animationen in Slot 5. Die Animation wird dabei umso schneller abgespielt je schneller sich das Objekt in Y-Richtung bewegt. Nachdem es 15 Pixel zurückgelegt hat ist die Animation einmal von vorne bis hinten durchgespielt worden und fängt wieder von vorne an. Hier wird <funclink>Anim_Y</funclink> anstelle von <funclink>Anim_AbsY</funclink> verwendet, da beim Runterklettern die Animation in die andere Richtung abgespielt werden soll wie beim Raufklettern. begin wurde größer als end gewählt, da die Animation in bei Bewegung in negative Y-Richtung (Raufklettern) vorwärts und bei Bewegung in positive Y-Richtung (Herabklettern) rückwärts abgespielt werden soll.</text>
<code><funclink>PlayAnimation</funclink>(&quot;Scale&quot;, 5, <funclink>Anim_Y</funclink>(0, <funclink>GetAnimationLength</funclink>(&quot;Scale&quot;), 0, 15), <funclink>Anim_Const</funclink>(1000));</code>
<text>Plays the animation "Scale" in slot 5, superimposing any other potential animations in slot 5. The animation is being played the faster the faster the object moves into Y direction. After the object moved 15 pixels the animation has been played form start to end and restarts from the beginning. Here we use <funclink>Anim_Y</funclink> instead of <funclink>Anim_AbsY</funclink> so that the animation is played in the opposite direction if scaling downwards. begin was chosen to be greater than end so that the animation is played forwards for movement in negative Y direction (climbing upwards) and so that it is played backwards for movement in positive Y direction (climbing downwards).</text>
</example>
</examples>
<related>
<funclink>PlayAnimation</funclink>
<funclink>SetAnimationPosition</funclink>
@ -57,5 +54,5 @@
<funclink>Anim_Action</funclink>
</related>
</func>
<author>Clonk-Karl</author><date>Januar 2010</date>
<author>Clonk-Karl</author><date>2010-01</date>
</funcs>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Anim_YDir</title>
<category>Animationen</category>
<category>Animations</category>
<version>4.10.0.0 OC</version>
<syntax>
<rtype>array</rtype>
@ -12,32 +13,28 @@
<param>
<type>int</type>
<name>begin</name>
<desc>Beginn des Intervalls.</desc>
<desc>Start of the interval.</desc>
</param>
<param>
<type>int</type>
<name>end</name>
<desc>Schluss des Intervalls. Wenn end größer als begin ist, so nimmt der Wert mit größerer XDir zu, sonst nimmt er ab.</desc>
<desc>End of the interval. If end is greater than begin then the value increases with increases XDir, otherwise it decreases.</desc>
</param>
<param>
<type>int</type>
<name>max_dir</name>
<desc>Größter Wert der YDir der abgebildet soll. Noch größere Geschwindigkeiten führen zum gleichen Animationswert (end).</desc>
</param>
<desc>Highest value of the YDir to be mapped. All larger velocities lead to the same animation value (end).</desc>
</param>
</params>
</syntax>
<desc>Der Wert ist proportional zur Y-Geschwindigkeit des Objekts. Die Geschwindigkeiten 0 bis max_dir werden linear auf den Wertebereich von begin bis end abgebildet.</desc>
<remark>Siehe die <emlink href="definition/animations.html">Animations-Dokumentation</emlink> für eine Beschreibung des Animationssystems.</remark>
<desc>The value is proportional to the object's velocity in Y direction. The velocities 0 to max_dir are mapped linearly to the interval given by begin and end.</desc>
<remark>See the <emlink href="definition/animations.html">animation documentation</emlink> for further explanations of the animation system.</remark>
<examples>
<example>
<code><funclink>PlayAnimation</funclink>("ShowSpeed", 10, <funclink>Anim_YDir</funclink>(0, <funclink>GetAnimationLength</funclink>("ShowSpeed"), 100), <funclink>Anim_Const</funclink>(1000));</code>
<text>Spielt die Animation "ShowSpeed" in Slot 10 ab. Diese könnte eine Geschwindigkeitsanzeige in einem Aufzug darstellen.</text>
<code><funclink>PlayAnimation</funclink>(&quot;ShowSpeed&quot;, 10, <funclink>Anim_YDir</funclink>(0, <funclink>GetAnimationLength</funclink>(&quot;ShowSpeed&quot;), 100), <funclink>Anim_Const</funclink>(1000));</code>
<text>Plays the animation "ShowSpeed" in slot 10. This could be a velocity display in an elevator.</text>
</example>
</examples>
<related>
<funclink>PlayAnimation</funclink>
<funclink>SetAnimationPosition</funclink>
@ -52,5 +49,5 @@
<funclink>Anim_Action</funclink>
</related>
</func>
<author>Clonk-Karl</author><date>Januar 2010</date>
<author>Clonk-Karl</author><date>2010-01</date>
</funcs>

View File

@ -1,26 +1,26 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>AnyContainer</title>
<category>Objekte</category><subcat>Suche</subcat>
<version>4.6.5.0 CP</version>
<deprecated />
<syntax>
<rtype>int</rtype>
</syntax>
<desc>Wird an <funclink>FindObject</funclink>/<funclink>FindObjectOwner</funclink> übergeben, damit nur Objekte gefunden werden, die in einem anderen Objekt enthalten sind</desc>
<examples>
<example>
<code><funclink>Punch</funclink>(<funclink>FindObject</funclink>(WIPF, 0, 0, 0, 0, 0, 0, 0, AnyContainer()), 5);</code>
<text>Schlägt einen sich versteckenden Wipf.</text>
</example>
</examples>
<related>
<funclink>Find_AnyContainer</funclink>
<funclink>FindObject</funclink>
</related>
</func>
<author>jwk</author><date>April 2002</date>
<func>
<title>AnyContainer</title>
<category>Objects</category>
<subcat>Search</subcat>
<version>4.6.5.0 CP</version>
<deprecated />
<syntax><rtype>int</rtype></syntax>
<desc>Passed to <funclink>FindObject</funclink>/<funclink>FindObjectOwner</funclink> so only contained objects are found.</desc>
<examples>
<example>
<code><funclink>Punch</funclink>(<funclink>FindObject</funclink>(WIPF, 0, 0, 0, 0, 0, 0, 0, AnyContainer()), 5);</code>
<text>Hits a hiding wipf.</text>
</example>
</examples>
<related>
<funclink>Find_AnyContainer</funclink>
<funclink>FindObject</funclink>
</related>
</func>
<author>jwk</author><date>2002-04</date>
</funcs>

View File

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>AppendCommand</title>
<category>Objekte</category>
<category>Objects</category>
<subcat>Commands</subcat>
<version>4.6.5.0 CP<extversion>4.9.1.0 GWE</extversion></version>
<syntax>
@ -13,71 +14,65 @@
<param>
<type>string</type>
<name>command</name>
<desc>Kommandoname (als String). Siehe untere Tabelle </desc>
<desc>Command name (as string). See the table below.</desc>
</param>
<param>
<type>object</type>
<name>target</name>
<optional />
<desc>Zielobjekt für Aktion</desc>
<desc>target object for the command</desc>
</param>
<param>
<type>int</type>
<name>x</name>
<optional />
<desc>X-Zielkoordinate</desc>
<desc>X target coordinate</desc>
</param>
<param>
<type>int</type>
<name>y</name>
<optional />
<desc>Y-Zielkoordinate</desc>
<desc>Y target coordinate</desc>
</param>
<param>
<type>object</type>
<name>target2</name>
<optional />
<desc>zweites Zielobjekt</desc>
<desc>secondary target object</desc>
</param>
<param>
<type>int</type>
<name>delay</name>
<optional />
<desc>Zeit (in Ticks/Frames), bis das Kommando abgebrochen wird</desc>
<desc>Time (in ticks or frames) until the command is terminated.</desc>
</param>
<param>
<type>any</type>
<name>Data</name>
<optional />
<desc>zusätzliche Daten zur Aktion</desc>
<desc>additional data for the command</desc>
</param>
<param>
<type>int</type>
<name>retries</name>
<optional />
<desc>Anzahl der Wiederholungen (wenn das Kommando fehlschlägt), bis das Kommando abgebrochen wird.</desc>
<desc>Number of retries if the command fails, until the command fails completely.</desc>
</param>
<param>
<type>int</type>
<name>base_mode</name>
<optional />
<desc>Befehlsstapelmodus. Werte siehe <funclink>AddCommand</funclink>.</desc>
<desc>Command stack mode. See <funclink>AddCommand</funclink> for values.</desc>
</param>
</params>
</syntax>
<desc>Fügt ein Kommando der Kommandoliste des aufrufenden Objekts am Ende hinzu. Das Objekt wird also das zuerst gegebene Kommando ausführen und sich danach automatisch dem mit AppendCommand hinzugefügten widmen.<br />
Für Kommando-Beschreibungen siehe <funclink>SetCommand</funclink><br/>
Bemerkung: Mit AppendCommand hinzugefügte Befehle werden nicht an gesteuerte Fahrzeuge weitergeleitet (siehe VehicleControl)</desc>
<desc>Appends a command to the command stack of an object. The appended command will be executed after the current other commands.<br/>For command descriptions see <funclink>SetCommand</funclink><br/>Notice: commands set by AppendCommand are not transferred to controlled vehicles (see VehicleControl).</desc>
<examples>
<example>
<code>var base = <funclink>FindBase</funclink>();
<funclink>SetCommand</funclink>("MoveTo", base);
AppendCommand("Throw", nil, base-><funclink>GetX</funclink>(), base-><funclink>GetY</funclink>());</code>
<text>
Gibt dem Clonk den Befehl, zuerst zu der ersten (gefundenen) Basis zu laufen, und dann das erste Objekt, das er trägt, auf diese zu werfen.<br />
</text>
<funclink>SetCommand</funclink>(&quot;MoveTo&quot;, base);
AppendCommand(&quot;Throw&quot;, nil, base-&gt;<funclink>GetX</funclink>(), base-&gt;<funclink>GetY</funclink>());</code>
<text>Gives the clonk the command to go to the first found base and then throw the first carried object at the base.</text>
</example>
</examples>
<related>
@ -87,5 +82,5 @@ Gibt dem Clonk den Befehl, zuerst zu der ersten (gefundenen) Basis zu laufen, un
<funclink>FinishCommand</funclink>
</related>
</func>
<author>PeterW</author><date>November 2001</date>
<author>PeterW</author><date>2001-11</date>
</funcs>

View File

@ -1,23 +1,32 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>ArcCos</title>
<category>Arithmetik</category>
<category>Arithmetics</category>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
<params>
<param><type>int</type><name>value</name><desc>Länge der Ankathete</desc></param>
<param><type>int</type><name>radius</name><desc>Länge der Hypotenuse</desc></param>
<param>
<type>int</type>
<name>value</name>
<desc>Length of the adjacent leg</desc>
</param>
<param>
<type>int</type>
<name>radius</name>
<desc>Length of hypotenuse</desc>
</param>
</params>
</syntax>
<desc>Berechnet den Arcuscosinus von value/radius, also Result=arccos(value/radius). Dies entspricht cos(Result)=value/radius. Die Funktion wird benötigt, um Seitenverhältnisse zu einem Winkel umzurechnen. Für die meisten Fälle ist <funclink>Angle</funclink>() aber ausreichend und praktischer.</desc>
<desc>Calculates arc cosine of value/radius, or x = arccos(value/radius). This corresponds to cos(x) = value/radius. This function is used to calculate an angle from horizontal and vertical offsets. However, in most cases <funclink>Angle</funclink>() does what you need.</desc>
<examples>
<example>
<code><funclink>Log</funclink>("Zielwinkel: %d Grad", ArcCos(<funclink>Abs</funclink>(<funclink>GetX</funclink>(target)-<funclink>GetX</funclink>()), <funclink>ObjectDistance</funclink>(target)));</code>
<text>Gibt den Zielwinkel vom aufrufenden Objekt zu target aus.</text>
<code><funclink>Log</funclink>(&quot;Zielwinkel: %d Grad&quot;, ArcCos(<funclink>Abs</funclink>(<funclink>GetX</funclink>(target)-<funclink>GetX</funclink>()), <funclink>ObjectDistance</funclink>(target)));</code>
<text>Returns the target angle from the object to the target.</text>
</example>
</examples>
<related>
@ -26,5 +35,5 @@
<funclink>Cos</funclink>
</related>
</func>
<author>Sven2</author><date>November 2001</date>
<author>Sven2</author><date>2001-11</date>
</funcs>

View File

@ -1,30 +1,39 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>ArcSin</title>
<category>Arithmetik</category>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
<params>
<param><type>int</type><name>value</name><desc>Länge der Gegenkathete</desc></param>
<param><type>int</type><name>radius</name><desc>Länge der Hypotenuse</desc></param>
</params>
</syntax>
<desc>Berechnet den Arcussinus von value/radius, also Result=arcsin(value/radius). Dies entspricht Sin(Result)=value/radius. Die Funktion wird benötigt, um Seitenverhältnisse zu einem Winkel umzurechnen. Für die meisten Fälle ist <funclink>Angle</funclink>() aber ausreichend und praktischer.</desc>
<examples>
<example>
<code><funclink>Log</funclink>("Zielwinkel: %d Grad", ArcSin(<funclink>Abs</funclink>(<funclink>GetY</funclink>(target)-<funclink>GetY</funclink>()), <funclink>ObjectDistance</funclink>(target)));</code>
<text>Gibt den Zielwinkel vom aufrufenden Objekt zu target aus.</text>
</example>
</examples>
<related>
<funclink>Angle</funclink>
<funclink>ArcCos</funclink>
<funclink>Sin</funclink>
</related>
</func>
<author>Sven2</author><date>November 2001</date>
</funcs>
<func>
<title>ArcSin</title>
<category>Arithmetics</category>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
<params>
<param>
<type>int</type>
<name>value</name>
<desc>Length of the opposite leg</desc>
</param>
<param>
<type>int</type>
<name>radius</name>
<desc>Length of hypotenuse</desc>
</param>
</params>
</syntax>
<desc>Calculates arc sine of value/radius, or x = arcsin(value/radius). This corresponds to sin(x) = value/radius. This function is used to calculate an angle from horizontal and vertical offsets. However, in most cases <funclink>Angle</funclink>() does what you need.</desc>
<examples>
<example>
<code><funclink>Log</funclink>(&quot;Zielwinkel: %d Grad&quot;, ArcSin(<funclink>Abs</funclink>(<funclink>GetY</funclink>(target)-<funclink>GetY</funclink>()), <funclink>ObjectDistance</funclink>(target)));</code>
<text>Returns the target angle from the object to the target.</text>
</example>
</examples>
<related>
<funclink>Angle</funclink>
<funclink>ArcCos</funclink>
<funclink>Sin</funclink>
</related>
</func>
<author>Sven2</author><date>2001-11</date>
</funcs>

View File

@ -1,39 +1,57 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>AttachMesh</title>
<category>Objekte</category><subcat>Darstellung</subcat>
<version>4.10.0.0 OC</version>
<syntax>
<rtype>int</rtype>
<params>
<param><type>any</type><name>mesh</name><desc>ID oder Objekt des Meshes das angehängt werden soll.</desc></param>
<param><type>string</type><name>parent_bone</name><desc>Bone am Mesh des aufrufenden Objekts an dem das anzuhängende Mesh befestigt werden soll.</desc></param>
<param><type>string</type><name>child_bone</name><desc>Bone am Mesh des anzuhängenden Objekts mit dem es befestigt werden soll.</desc></param>
<param><type>array</type><name>transformation</name><desc>Transformation im Koordinatensystem des anzuhängenden Meshes, die auf selbiges angewandt wird. Das Array sollte 12 Integer-Einträge haben die eine 3x4-Matrix beschreiben wobei jeder Wert in Promille (1000 = 100%) angegeben ist. Die Matrizen können auch mit <funclink>Trans_Identity</funclink>, <funclink>Trans_Translate</funclink>, <funclink>Trans_Rotate</funclink> und <funclink>Trans_Scale</funclink> erzeugt und mit <funclink>Trans_Mul</funclink> kombiniert werden.</desc><optional /></param>
</params>
</syntax>
<desc>Befestigt ein Mesh an einem anderen. Wenn für <code>mesh</code> eine ID angegeben wird, so wird das Mesh der entsprechenden Definition verwendet. Wenn für <code>mesh</code> ein Objekt angegeben wird, so wird dessen aktuelles Mesh verwendet, inklusive aller Animationen oder weiterer angehängter Meshes. Dabei wird jedoch nur die Grafik angehangen, das Objekt selbst bleibt weiter an seiner gegenwärtigen Position. Der Rückgabewert ist eine Nummer mit Hilfe derer das Mesh mit <funclink>DetachMesh</funclink> wieder gelöst werden kann.</desc>
<remark>Wird für mesh ein Objekt angegeben, so wird die "MeshTransformation"-Eigenschaft nicht auf das angehängte Mesh angewandt. Stattdessen kann der Parameter <code>transformation</code> angegeben werden um das angehängte Mesh zu transformieren.</remark>
<examples>
<example>
<code><funclink>AttachMesh</funclink>(Bow, "pos_hand1", "main");</code>
<text>Gibt einem Clonk einen Bogen in die Hand wenn im Clonkscript ausgeführt. Der Bogen wird mit seinem Bone "main" an den Bone "pos_hand1" des Clonks gehängt.</text>
</example>
</examples>
<related>
<funclink>DetachMesh</funclink>
<funclink>SetAttachBones</funclink>
<funclink>SetAttachTransform</funclink>
<funclink>Trans_Identitiy</funclink>
<funclink>Trans_Translate</funclink>
<funclink>Trans_Rotate</funclink>
<funclink>Trans_Scale</funclink>
<funclink>Trans_Mul</funclink>
</related>
</func>
<author>Clonk-Karl</author><date>April 2010</date>
<func>
<title>AttachMesh</title>
<category>Objects</category>
<subcat>Display</subcat>
<version>4.10.0.0 OC</version>
<syntax>
<rtype>int</rtype>
<params>
<param>
<type>any</type>
<name>mesh</name>
<desc>ID or object of the mesh to be attached.</desc>
</param>
<param>
<type>string</type>
<name>parent_bone</name>
<desc>Bone of the calling object's mesh at which to fix the mesh to be attached.</desc>
</param>
<param>
<type>string</type>
<name>child_bone</name>
<desc>Bone of the object to be attached with which to fix it.</desc>
</param>
<param>
<type>array</type>
<name>transformation</name>
<desc>Transformation to be applied on the attached mesh in its own frame of reference. The array should consist of 12 integer entries which make up a 3x4 matrix in which each vaule is given in promille (1000 = 100%). These matrices can be created via <funclink>Trans_Identity</funclink>, <funclink>Trans_Translate</funclink>, <funclink>Trans_Rotate</funclink> and <funclink>Trans_Scale</funclink> or they can be combined via <funclink>Trans_Mul</funclink>.</desc>
<optional />
</param>
</params>
</syntax>
<desc>Attaches a mesh to another mesh. If <code>mesh</code> is an ID then the mesh of the corresponding definition is used. If <code>mesh</code> is an object then the current mesh of that object is used, including all its animations and attached meshes. However, in that case only the graphics will be attached - the object itself stays at its current position. The return value is a number that can be used to detach the mesh again via <funclink>DetachMesh</funclink>.</desc>
<remark>If an object is used for a mesh then the "MeshTransformation" property of teh attached mesh will not be applied. Instead the parameter <code>transformation</code> can be used to transform the attached mesh.</remark>
<examples>
<example>
<code><funclink>AttachMesh</funclink>(Bow, &quot;pos_hand1&quot;, &quot;main&quot;);</code>
<text>If executed in the context of a clonk this script makes him carry a bow. The bow will be attached with its Bone "main" to the bone "pos_hand1" of the clonk.</text>
</example>
</examples>
<related>
<funclink>DetachMesh</funclink>
<funclink>SetAttachBones</funclink>
<funclink>SetAttachTransform</funclink>
<funclink>Trans_Identitiy</funclink>
<funclink>Trans_Translate</funclink>
<funclink>Trans_Rotate</funclink>
<funclink>Trans_Scale</funclink>
<funclink>Trans_Mul</funclink>
</related>
</func>
<author>Clonk-Karl</author><date>2010-04</date>
</funcs>

View File

@ -1,34 +1,55 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>BlastObjects</title>
<category>Objekte</category>
<version>4.6.5.0 CP<extversion>4.9.6.0 CR</extversion></version>
<syntax>
<rtype>int</rtype>
<params>
<param><type>int</type><name>x</name><desc>X-Koordinate</desc></param>
<param><type>int</type><name>y</name><desc>Y-Koordinate</desc></param>
<param><type>int</type><name>level</name><desc>Stärke</desc></param>
<param><type>object</type><name>container</name><desc>Objekt, in dem die zu sprengenden Objekte enthalten sind.</desc></param>
<param><type>int</type><name>caused_by</name><desc>Spielernummer des Spielers, der der Verursacher des Schaden ist.</desc></param>
</params>
</syntax>
<desc>Fügt allen Objekten an angegebener Position Explosionsschaden zu. x und y sind immer globale Koordinaten. Wenn ein container angegeben ist, wird der Schaden nur den Objekten zugefügt, die in container enthalten sind. Explosionsschaden kann zur Entzündung führen oder auch Lebewesen wegschleudern. Bei lokalen Aufrufen gilt der Schaden als vom Controller des aufrufenden Objekts verursacht.</desc>
<examples>
<example>
<code>BlastObjects(<funclink>GetX</funclink>(), <funclink>GetY</funclink>(), 60, <funclink>this</funclink>());</code>
<text>Das aufrufende Objekt fügt enthaltenen Objekten Explosionsschaden der Stärke 60 zu.</text>
</example>
</examples>
<related>
<funclink>Explode</funclink>
<funclink>NoContainer</funclink>
<funclink>AnyContainer</funclink>
</related>
</func>
<author>jwk</author><date>April 2002</date>
<author>Clonkonaut</author><date>April 2008</date>
<func>
<title>BlastObjects</title>
<category>Objects</category>
<version>4.6.5.0 CP<extversion>4.9.6.0 CR</extversion></version>
<syntax>
<rtype>int</rtype>
<params>
<param>
<type>int</type>
<name>x</name>
<desc>X coordinate</desc>
</param>
<param>
<type>int</type>
<name>y</name>
<desc>Y coordinate</desc>
</param>
<param>
<type>int</type>
<name>level</name>
<desc>Strength.</desc>
</param>
<param>
<type>object</type>
<name>container</name>
<desc>Container of the objects to be blasted.</desc>
</param>
<param>
<type>int</type>
<name>caused_by</name>
<desc>Number of the player who has caused the damage</desc>
</param>
</params>
</syntax>
<desc>Applies explosion damage to all objects at the specified position. x and y are always global coordinates. If a container is specified, damage is only applied to objects contained in that container. Explosion damage can cause incineration or fling away living objects. In local calls, the controller of the calling object is considered to have caused the damage.</desc>
<examples>
<example>
<code>BlastObjects(<funclink>GetX</funclink>(), <funclink>GetY</funclink>(), 60, <funclink>this</funclink>());</code>
<text>The calling object causes explosion damage of level 60 to its contents.</text>
</example>
</examples>
<related>
<funclink>Explode</funclink>
<funclink>NoContainer</funclink>
<funclink>AnyContainer</funclink>
</related>
</func>
<author>jwk</author><date>2002-04</date>
<author>Clonkonaut</author><date>2008-04</date>
</funcs>

View File

@ -1,25 +1,38 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>BoundBy</title>
<category>Arithmetik</category>
<category>Arithmetics</category>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int</rtype>
<params>
<param><type>int</type><name>value</name><desc>Zu vergleichende Zahl</desc></param>
<param><type>int</type><name>lower_bound</name><desc>Untere Grenze</desc></param>
<param><type>int</type><name>upper_bound</name><desc>Obere Grenze</desc></param>
<param>
<type>int</type>
<name>value</name>
<desc>Value to be compared.</desc>
</param>
<param>
<type>int</type>
<name>lower_bound</name>
<desc>Lower limit.</desc>
</param>
<param>
<type>int</type>
<name>upper_bound</name>
<desc>Upper limit.</desc>
</param>
</params>
</syntax>
<desc>Gibt value zurück, wenn der Wert innerhalb der Grenzen liegt (value &gt;= lower_bound und value &lt;= upper_bound). Andernfalls wird die jeweils nächstliegende Grenze zurückgegeben.</desc>
<desc>Returns value if it is within the given boundaries (value &gt;= lower_bound and value &lt;= upper_bound). Otherwise returns the applicable limit.</desc>
<related>
<funclink>Inside</funclink>
<funclink>LessThan</funclink>
<funclink>GreaterThan</funclink>
</related>
</func>
<author>jwk</author><date>April 2002</date>
<author>jwk</author><date>2002-04</date>
</funcs>

View File

@ -1,26 +1,38 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Bubble</title>
<category>Umwelt</category><subcat>Effekte</subcat>
<category>Environment</category>
<subcat>Effects</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>bool</rtype>
<params>
<param><type>int</type><name>x</name><desc>X-Position der Luftblase. Offset bei lokalem Aufruf.</desc><optional /></param>
<param><type>int</type><name>y</name><desc>Y-Position der Luftblase. Offset bei lokalem Aufruf.</desc><optional /></param>
<param>
<type>int</type>
<name>x</name>
<desc>X position of the bubble. Offset in local calls.</desc>
<optional />
</param>
<param>
<type>int</type>
<name>y</name>
<desc>Y position of the bubble. Offset in local calls.</desc>
<optional />
</param>
</params>
</syntax>
<desc>Erzeugt eine Luftblase.</desc>
<remark>Die maximale Anzahl der Luftblasen auf dem Spielfeld richtet sich nach der Einstellung für Rauchentwicklung in den Optionen. Im Netzwerk und bei Aufnahmen/Wiedergaben ist dieser Wert immer 150.</remark>
<desc>Creates a bubble.</desc>
<remark>The maximum number of bubbles simultaneously present in a game depends on the smoke level configuration. In network games, this value is forced to 150.</remark>
<examples>
<example>
<code>Bubble();</code>
<text>Erzeugt eine Luftblase beim aufrufenden Objekt.</text>
<text>Creates a bubble at the calling object.</text>
</example>
</examples>
</func>
<author>Sven2</author><date>November 2001</date>
<author>Sven2</author><date>2001-11</date>
</funcs>

View File

@ -1,34 +1,58 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>Buy</title>
<category>Objekte</category><subcat>Erzeugung</subcat>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>object</rtype>
<params>
<param><type>id</type><name>buy_object</name><desc>ID des Objekttyps, der gekauft wird</desc></param>
<param><type>int</type><name>for_player</name><desc>Nummer des Spielers, dem das Objekt hinterher gehört</desc></param>
<param><type>int</type><name>pay_player</name><desc>Nummer des Spielers, der den Kauf bezahlt</desc></param>
<param><type>object</type><name>to_base</name><desc>Zielobjekt, in das das neu gekaufte Objekt hineinversetzt wird</desc><optional /></param>
<param><type>bool</type><name>show_errors</name><desc>Wenn ungleich Null, werden Fehlermeldugnen wie "Kaufen nicht möglich" aufgrund von Geldmangel angezeigt.</desc><optional /></param>
</params>
</syntax>
<desc>Kauft ein Objekt für for_player, und zieht pay_player Geld ab. Wenn dieser nicht genug Geld oder das Objekt nicht im Heimatbasismaterial hat, wird der Vorgang nicht ausgeführt.</desc>
<examples>
<example>
<code>Buy(Rock, 0, 0, <funclink>FindBase</funclink>(0), 1);</code>
<text>Kauft einen Stein in der Basis des ersten Spielers.</text>
</example>
</examples>
<related>
<funclink>Sell</funclink>
<funclink>GetWealth</funclink>
<funclink>GetBase</funclink>
<funclink>FindBase</funclink>
</related>
</func>
<author>Sven2</author><date>November 2001</date>
</funcs>
<func>
<title>Buy</title>
<category>Objects</category>
<subcat>Creation</subcat>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>object</rtype>
<params>
<param>
<type>id</type>
<name>buy_object</name>
<desc>Type of object to be bought.</desc>
</param>
<param>
<type>int</type>
<name>for_player</name>
<desc>Owner (player number) of the new object.</desc>
</param>
<param>
<type>int</type>
<name>pay_player</name>
<desc>Number of the player who pays for the object.</desc>
</param>
<param>
<type>object</type>
<name>to_base</name>
<desc>Target object in which the new object is placed.</desc>
<optional />
</param>
<param>
<type>bool</type>
<name>show_errors</name>
<desc>If not 0, failure messages such as "Buying not possible" are displayed, e.g. if there is not enough money.</desc>
<optional />
</param>
</params>
</syntax>
<desc>Buys an object for for_plr, deducting the wealth of pay_player. The function will fail if the paying player does not have enough money or the object is currently not available in the home base material.</desc>
<examples>
<example>
<code>Buy(Rock, 0, 0, <funclink>FindBase</funclink>(0), 1);</code>
<text>Buys a rock at the base of the first player.</text>
</example>
</examples>
<related>
<funclink>Sell</funclink>
<funclink>GetWealth</funclink>
<funclink>GetBase</funclink>
<funclink>FindBase</funclink>
</related>
</func>
<author>Sven2</author><date>2001-11</date>
</funcs>

View File

@ -1,20 +1,20 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4D_All</title>
<category>Objekte</category><subcat>Kategorie</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int</rtype>
</syntax>
<desc>Objektkategorie: Alle Kategorien</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
</related>
</func>
<author>Sven2</author><date>Januar 2002</date>
<func>
<title>C4D_All</title>
<category>Objects</category>
<subcat>Category</subcat>
<version>4.6.5.0 CP</version>
<syntax><rtype>int</rtype></syntax>
<desc>Object category: all categories.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
</related>
</func>
<author>Sven2</author><date>2002-01</date>
</funcs>

View File

@ -1,29 +1,29 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4D_Background</title>
<category>Objekte</category><subcat>Kategorie</subcat>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int </rtype>
</syntax>
<desc>Objektkategorie: Wird hinter der Landschaft gezeichnet. Nützlich beispielsweise für Effektobjekte wie Wolken oder Himmelskörper.</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<remark>Diese Kategorie funktioniert nicht im 8Bit-Grafiksystem.</remark>
<examples>
<example>
<code><funclink>SetCategory</funclink>(<funclink>GetCategory</funclink>() | C4D_Background());</code>
<text>Versetzt das aufrufende Objekt in den Hintergrund.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
<funclink>GetDefinition</funclink>
<funclink>C4D_Parallax</funclink>
</related>
</func>
<author>Sven2</author><date>Juni 2003</date>
</funcs>
<func>
<title>C4D_Background</title>
<category>Objects</category>
<subcat>Category</subcat>
<version>4.9.1.0 GWE</version>
<syntax><rtype>int </rtype></syntax>
<desc>Object category: object is drawn behind the landscape. Useful for effects like clouds or celestial bodies.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<remark>This category does not work in the old 8 bit graphics system.</remark>
<examples>
<example>
<code><funclink>SetCategory</funclink>(<funclink>GetCategory</funclink>() | C4D_Background());</code>
<text>Move the calling object into the background.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
<funclink>GetDefinition</funclink>
<funclink>C4D_Parallax</funclink>
</related>
</func>
<author>Sven2</author><date>2003-06</date>
</funcs>

View File

@ -1,23 +1,23 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4D_Goal</title>
<category>Objekte</category><subcat>Kategorie</subcat>
<category>Objects</category>
<subcat>Category</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int</rtype>
</syntax>
<desc>Objektkategorie: Spielziele</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<syntax><rtype>int</rtype></syntax>
<desc>Object category: game goal.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code>var obj;
<code>var obj;
while (obj=<funclink>FindObject</funclink>(0, 0,0,0,0, 0, 0,0, 0, obj))
if (<funclink>GetCategory</funclink>(obj) &amp; C4D_Goal)
<funclink>RemoveObject</funclink>(obj);</code>
<text>Entfernt alle Spielziele.</text>
<text>Removes all game goals.</text>
</example>
</examples>
<related>
@ -25,5 +25,5 @@ while (obj=<funclink>FindObject</funclink>(0, 0,0,0,0, 0, 0,0, 0, obj))
<funclink>SetCategory</funclink>
</related>
</func>
<author>Sven2</author><date>Januar 2002</date>
<author>Sven2</author><date>2002-01</date>
</funcs>

View File

@ -1,29 +1,29 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4D_Knowledge</title>
<category>Objekte</category><subcat>Kategorie</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int </rtype>
</syntax>
<desc>Objektkategorie: Bauplan.</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<examples>
<example>
<code><funclink>if</funclink>( <funclink>GetCategory</funclink>( 0, <funclink>GetHomebaseMaterial</funclink>( )) <emlink href="script/operatoren.html">&amp;</emlink> C4D_Knowledge()) <funclink>Log</funclink>("Spieler 1 kann etwas kaufen, was er auch erforschen oder bauen könnte.");</code>
<text>Mit einem bitweisen And kann man überprüfen, ob zwei Kategorien in mindestens einer Kategorie übereinstimmen.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
<funclink>GetHomebaseMaterial</funclink>
<funclink>GetPlrKnowledge</funclink>
<funclink>GetDefinition</funclink>
</related>
</func>
<author>Günther</author><date>Februar 2002</date>
<func>
<title>C4D_Knowledge</title>
<category>Objects</category>
<subcat>Category</subcat>
<version>4.6.5.0 CP</version>
<syntax><rtype>int </rtype></syntax>
<desc>Object category: construction plan.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code><funclink>if</funclink>( <funclink>GetCategory</funclink>( 0, <funclink>GetHomebaseMaterial</funclink>( )) <emlink href="script/operatoren.html">&amp;</emlink> C4D_Knowledge()) <funclink>Log</funclink>(&quot;Spieler 1 kann etwas kaufen, was er auch erforschen oder bauen könnte.&quot;);</code>
<text>Using bitwise AND you can check whether two objects correspond in at least one category.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
<funclink>GetHomebaseMaterial</funclink>
<funclink>GetPlrKnowledge</funclink>
<funclink>GetDefinition</funclink>
</related>
</func>
<author>Günther</author><date>2002-02</date>
</funcs>

View File

@ -1,29 +1,29 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4D_Living</title>
<category>Objekte</category><subcat>Kategorie</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int </rtype>
</syntax>
<desc>Objektkategorie: Lebewesen.</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<examples>
<example>
<code><funclink>GetPlrKnowledge</funclink>(0, 0, 0, C4D_Living( ));</code>
<text>Liefert das erste Lebewesen zurück, das der 1. Spieler bauen kann, also normalerweise 0.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
<funclink>GetHomebaseMaterial</funclink>
<funclink>GetPlrKnowledge</funclink>
<funclink>GetDefinition</funclink>
</related>
</func>
<author>Günther</author><date>Februar 2002</date>
</funcs>
<func>
<title>C4D_Living</title>
<category>Objects</category>
<subcat>Category</subcat>
<version>4.6.5.0 CP</version>
<syntax><rtype>int </rtype></syntax>
<desc>Object category: living being.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code><funclink>GetPlrKnowledge</funclink>(0, 0, 0, C4D_Living( ));</code>
<text>Returns the first type of living beings which can be built by player 1 - usually none.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
<funclink>GetHomebaseMaterial</funclink>
<funclink>GetPlrKnowledge</funclink>
<funclink>GetDefinition</funclink>
</related>
</func>
<author>Günther</author><date>2002-02</date>
</funcs>

View File

@ -1,29 +1,29 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4D_Object</title>
<category>Objekte</category><subcat>Kategorie</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int </rtype>
</syntax>
<desc>Objektkategorie: kleines Objekt.</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<examples>
<example>
<code><funclink>GetDefinition</funclink>(0, C4D_Object( ));</code>
<text>Liefert die id des ersten geladenen Objekts zurück. Ein ähnlicher Code wird vom Forschungslabor benutzt, um die erforschbaren Objekte aufzulisten.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
<funclink>GetHomebaseMaterial</funclink>
<funclink>GetPlrKnowledge</funclink>
<funclink>GetDefinition</funclink>
</related>
</func>
<author>Günther</author><date>Februar 2002</date>
</funcs>
<func>
<title>C4D_Object</title>
<category>Objects</category>
<subcat>Category</subcat>
<version>4.6.5.0 CP</version>
<syntax><rtype>int </rtype></syntax>
<desc>Object category: small item.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code><funclink>GetDefinition</funclink>(0, C4D_Object( ));</code>
<text>Returns the id of the first loaded definition. Similar scripting is used in the research lab to list researchable object.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
<funclink>GetHomebaseMaterial</funclink>
<funclink>GetPlrKnowledge</funclink>
<funclink>GetDefinition</funclink>
</related>
</func>
<author>Günther</author><date>2002-02</date>
</funcs>

View File

@ -1,35 +1,31 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4D_Parallax</title>
<category>Objekte</category><subcat>Kategorie</subcat>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int </rtype>
</syntax>
<desc>
Objektkategorie: Bewegt sich parallax zum Rest der Landschaft. Das bedeutet, dass sich die scheinbare Objektposition je nach Scrollposition des Viewports ändert. Damit können beispielsweise Objekte scheinbar in den Hintergrund geschoben, oder Statusanzeigen realisiert werden.<br />
Die parallaxe Verschiebung wird dabei prozentual zum Normalverhalten in den ersten beiden indizierten, lokalen Variablen (siehe <funclink>Local</funclink>()) des Objekts angegeben (Local(0) und Local(1) jeweils für die horizontale respektive vertikale Verschiebung). Das heißt, um das Normalverhalten zu erzielen, müssen diese Werte jeweils auf 100 gesetzt werden. Stehen sie auf 0, gleicht die Objektposition der Sichtfensterposition. Für Hintergrundparallaxität werden also gewöhnlich Werte zwischen 0 und 100 gewählt.<br />
Um Objekte direkt am Sichtfenster des Spielers zu positionieren, um so zum Beispiel Statusanzeigen zu realisieren, können Local(0) und Local(1) auf 0 gesetzt werden. Die Objektposition ist dann immer relativ zur oberen linken Ecke des Sichtfensters. Ab CR können für die Position solcher Objekte auch negative Werte angegeben werden: Diese werden dann jeweils vom rechten bzw. unteren Rand des Sichtfensters gerechnet. Auf diese Weise lassen sich Statusanzeigen auch am rechten oder unteren Rand der Sichtfenster platzieren.
</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<examples>
<example>
<code><funclink>SetCategory</funclink>(<funclink>GetCategory</funclink>() | C4D_Parallax() | <funclink>C4D_Background</funclink>());
<func>
<title>C4D_Parallax</title>
<category>Objects</category>
<subcat>Category</subcat>
<version>4.9.1.0 GWE</version>
<syntax><rtype>int </rtype></syntax>
<desc>Object category: the object moves parallax with respect to the landscape. This means that the apparent object position changes depending on the scroll position of the viewport. This can be used to have objects apparently moving in the far background or to create status overlays.<br/>Parallax deviation from the normal location is specified in percent and stored in the first two indexed, local variables (see <funclink>Local</funclink>) of the object (Local(0) for horizontal, Local(1) for vertical deviation). This means for normal location these two values should be 100. A value of 0 will lock the object to the viewport. For parallax background object use values between 0 and 100. From NET, object positions can also be negative values. Those objects will then be aligned with the right or bottom edge of the screen respectively.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code><funclink>SetCategory</funclink>(<funclink>GetCategory</funclink>() | C4D_Parallax() | <funclink>C4D_Background</funclink>());
<funclink>Local</funclink>()=50; <funclink>Local</funclink>(1)=100;
</code>
<text>Versetzt das aufrufende Objekt in den Hintergrund, und gibt ihm horizontale Parallaxität.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
<funclink>GetDefinition</funclink>
<funclink>C4D_Background</funclink>
<funclink>SetSkyParallax</funclink>
</related>
</func>
<author>Sven2</author><date>Juni 2003</date>
</funcs>
<text>Moves the calling object into the background and adds horizontal parallaxity.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
<funclink>GetDefinition</funclink>
<funclink>C4D_Background</funclink>
<funclink>SetSkyParallax</funclink>
</related>
</func>
<author>Sven2</author><date>2003-06</date>
</funcs>

View File

@ -1,27 +1,27 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4D_Rule</title>
<category>Objekte</category><subcat>Kategorie</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int</rtype>
</syntax>
<desc>Objektkategorie: Spielregeln</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<examples>
<example>
<code>for(var obj in <funclink>FindObjects</funclink>(<funclink>Find_Category</funclink>(C4D_Rule)))
<func>
<title>C4D_Rule</title>
<category>Objects</category>
<subcat>Category</subcat>
<version>4.6.5.0 CP</version>
<syntax><rtype>int</rtype></syntax>
<desc>Object category: rule object.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code>for(var obj in <funclink>FindObjects</funclink>(<funclink>Find_Category</funclink>(C4D_Rule)))
<funclink>RemoveObject</funclink>(obj);</code>
<text>Entfernt alle Spielregeln. :-)</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
</related>
</func>
<author>jwk</author><date>April 2002</date>
<text>Removes all rules. :-)</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
</related>
</func>
<author>jwk</author><date>2002-04</date>
</funcs>

View File

@ -1,26 +1,26 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4D_StaticBack</title>
<category>Objekte</category><subcat>Kategorie</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int </rtype>
</syntax>
<desc>Objektkategorie: Unbewegliche Hintergrundobjekte.</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<examples>
<example>
<code><funclink>SetCategory</funclink>(C4D_StaticBack, this);</code>
<text>Macht das Objekt zu einem Hintergrundsobjekt. Wird bei Burgteilen verwendet, damit davor gebaut werden kann.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
</related>
</func>
<author>jwk</author><date>April 2002</date>
<func>
<title>C4D_StaticBack</title>
<category>Objects</category>
<subcat>Category</subcat>
<version>4.6.5.0 CP</version>
<syntax><rtype>int </rtype></syntax>
<desc>Object category: immovable background object.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code><funclink>SetCategory</funclink>(C4D_StaticBack, this);</code>
<text>Makes the object into a background object. This is used with castle parts so after completion other objects can be built in front.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
</related>
</func>
<author>jwk</author><date>2002-04</date>
</funcs>

View File

@ -1,26 +1,26 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4D_Structure</title>
<category>Objekte</category><subcat>Kategorie</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int </rtype>
</syntax>
<desc>Objektkategorie: Gebäude.</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<examples>
<example>
<code><funclink>GetPlrKnowledge</funclink>(0, 0, 0, C4D_Structure);</code>
<text>Liefert das erste Gebäude zurück, das der 1. Spieler bauen kann.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
</related>
</func>
<author>jwk</author><date>April 2002</date>
<func>
<title>C4D_Structure</title>
<category>Objects</category>
<subcat>Category</subcat>
<version>4.6.5.0 CP</version>
<syntax><rtype>int </rtype></syntax>
<desc>Object category: building.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code><funclink>GetPlrKnowledge</funclink>(0, 0, 0, C4D_Structure);</code>
<text>Returns the first building type that the first player can build.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
</related>
</func>
<author>jwk</author><date>2002-04</date>
</funcs>

View File

@ -1,26 +1,26 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4D_Vehicle</title>
<category>Objekte</category><subcat>Kategorie</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>int </rtype>
</syntax>
<desc>Objektkategorie: Fahrzeug.</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<examples>
<example>
<code><funclink>GetPlrKnowledge</funclink>(0, 0, 0, C4D_Vehicle);</code>
<text>Liefert das erste Fahrzeug zurück, das der 1. Spieler bauen kann, z.B. BALN.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
</related>
</func>
<author>jwk</author><date>April 2002</date>
<func>
<title>C4D_Vehicle</title>
<category>Objects</category>
<subcat>Category</subcat>
<version>4.6.5.0 CP</version>
<syntax><rtype>int </rtype></syntax>
<desc>Object category: vehicle.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code><funclink>GetPlrKnowledge</funclink>(0, 0, 0, C4D_Vehicle);</code>
<text>Returns the first vehicle type that the first player can build.</text>
</example>
</examples>
<related>
<funclink>GetCategory</funclink>
<funclink>SetCategory</funclink>
</related>
</func>
<author>jwk</author><date>2002-04</date>
</funcs>

View File

@ -1,24 +1,30 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4Id</title>
<category>Script</category><subcat>Strings</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>id</rtype>
<params>
<param><type>string</type><name>id_string</name><desc>Der String, der in eine id umgewandelt werden soll.</desc></param>
</params>
</syntax>
<desc>Wandelt einen String in eine ID um.</desc>
<examples>
<example>
<code>C4Id("Rock")</code>
<text>Gibt die ID 'Rock' zurück.</text>
</example>
</examples>
</func>
<author>jwk</author><date>April 2002</date>
<func>
<title>C4Id</title>
<category>Script</category>
<subcat>Strings</subcat>
<version>4.6.5.0 CP</version>
<syntax>
<rtype>id</rtype>
<params>
<param>
<type>string</type>
<name>id_string</name>
<desc>String to be converted into an id.</desc>
</param>
</params>
</syntax>
<desc>Converts a string into an id.</desc>
<examples>
<example>
<code>C4Id(&quot;Rock&quot;)</code>
<text>Returns the id 'Rock'.</text>
</example>
</examples>
</func>
<author>jwk</author><date>2002-04</date>
</funcs>

View File

@ -1,25 +1,22 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4V_Any</title>
<category>Variablen</category>
<category>Variables</category>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
</syntax>
<desc>Datentyp: Unbekannter Datentyp.</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<syntax><rtype>int</rtype></syntax>
<desc>Data type: unknown data type.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code><funclink>if</funclink> (<funclink>GetType</funclink>(<funclink>Par</funclink>()) == C4V_Any) return();</code>
<text>Bricht die Funktion ab, wenn der Datentyp des ersten Parameters unbekannt ist.</text>
<text>Cancels the function if the data type of the first parameter is unknown.</text>
</example>
</examples>
<related>
<funclink>GetType</funclink>
</related>
<related><funclink>GetType</funclink></related>
</func>
<author>Sven2</author><date>April 2002</date>
<author>Sven2</author><date>2002-04</date>
</funcs>

View File

@ -1,25 +1,22 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4V_Array</title>
<category>Variablen</category>
<category>Variables</category>
<version>4.9.6.0 CR</version>
<syntax>
<rtype>int</rtype>
</syntax>
<desc>Datentyp: Array.</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<syntax><rtype>int</rtype></syntax>
<desc>Data type: array.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code><funclink>if</funclink> (<funclink>GetType</funclink>(x) != C4V_Array) x = <funclink>CreateArray</funclink>();</code>
<text>Speichert ein neues, leeres Array in x wenn es noch kein Array ist.</text>
<text>Saves a new, empty array in x if it is not already an array.</text>
</example>
</examples>
<related>
<funclink>GetType</funclink>
</related>
<related><funclink>GetType</funclink></related>
</func>
<author>Clonk-Karl</author><date>Dezember 2008</date>
<author>Clonk-Karl</author><date>2008-12</date>
</funcs>

View File

@ -1,25 +1,22 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4V_Bool</title>
<category>Variablen</category>
<category>Variables</category>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
</syntax>
<desc>Datentyp: Boolscher Wert (1 oder 0).</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<syntax><rtype>int</rtype></syntax>
<desc>Data type: boolean value (true or false).</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code><funclink>if</funclink> (<funclink>GetType</funclink>(x) == C4V_Bool) <funclink>Log</funclink>("x=%d", x);</code>
<text>Gibt x im Log aus, wenn es ein boolscher Wert ist.</text>
<code><funclink>if</funclink> (<funclink>GetType</funclink>(x) == C4V_Bool) <funclink>Log</funclink>(&quot;x=%d&quot;, x);</code>
<text>Writes x to the log if it is a boolean value.</text>
</example>
</examples>
<related>
<funclink>GetType</funclink>
</related>
<related><funclink>GetType</funclink></related>
</func>
<author>Sven2</author><date>April 2002</date>
<author>Sven2</author><date>2002-04</date>
</funcs>

View File

@ -1,25 +1,22 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4V_C4ID</title>
<category>Variablen</category>
<category>Variables</category>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
</syntax>
<desc>Datentyp: id.</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<syntax><rtype>int</rtype></syntax>
<desc>Data type: id.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code><funclink>if</funclink> (<funclink>GetType</funclink>(x) == C4V_C4ID) <funclink>Log</funclink>("x=%i", x);</code>
<text>Gibt x im Log aus, wenn es eine ID ist.</text>
<code><funclink>if</funclink> (<funclink>GetType</funclink>(x) == C4V_C4ID) <funclink>Log</funclink>(&quot;x=%i&quot;, x);</code>
<text>Writes x to the log if it is an id.</text>
</example>
</examples>
<related>
<funclink>GetType</funclink>
</related>
<related><funclink>GetType</funclink></related>
</func>
<author>Sven2</author><date>April 2002</date>
<author>Sven2</author><date>2002-04</date>
</funcs>

View File

@ -1,25 +1,22 @@
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!DOCTYPE funcs SYSTEM "../../../clonk.dtd">
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE funcs
SYSTEM '../../../clonk.dtd'>
<?xml-stylesheet type="text/xsl" href="../../../clonk.xsl"?>
<funcs>
<func>
<title>C4V_C4Object</title>
<category>Variablen</category>
<category>Variables</category>
<version>4.9.1.0 GWE</version>
<syntax>
<rtype>int</rtype>
</syntax>
<desc>Datentyp: Objektzeiger.</desc>
<remark>Dieser Wert ist als Engine-Konstante definiert. Die Funktionsklammern können daher optional weggelassen werden.</remark>
<syntax><rtype>int</rtype></syntax>
<desc>Data type: object pointer.</desc>
<remark>This value is also defined as a constant. Thus the parameter brackets can be omitted.</remark>
<examples>
<example>
<code><funclink>if</funclink> (x &amp;&amp; <funclink>GetType</funclink>(x)==C4V_C4Object) <funclink>Log</funclink>("x=%s", <funclink>GetName</funclink>(x));</code>
<text>Gibt den Namen von x im Log aus, wenn es ein Objekt ist.</text>
<code><funclink>if</funclink> (x &amp;&amp; <funclink>GetType</funclink>(x)==C4V_C4Object) <funclink>Log</funclink>(&quot;x=%s&quot;, <funclink>GetName</funclink>(x));</code>
<text>Writes the name of x to the log if it is an object.</text>
</example>
</examples>
<related>
<funclink>GetType</funclink>
</related>
<related><funclink>GetType</funclink></related>
</func>
<author>Sven2</author><date>April 2002</date>
<author>Sven2</author><date>2002-04</date>
</funcs>

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