forked from github/server
commit
e5218781d6
95 changed files with 2427 additions and 4083 deletions
.gitignoreCMakeLists.txt
res
scripts/tests
src
CMakeLists.txtbindings.cconvert.ccreport.cdonations.test.ceconomy.test.ceressea.cexparse.cexparse.hgive.test.cgmtool.cjsonconf.cjsonconf.test.c
kernel
CMakeLists.txtbuild.cbuild.test.cbuilding.cbuilding.hbuilding.test.cconfig.citem.citem.hmessages.cmessages.test.cpathfinder.cpathfinder.hrace.crace.hrace.test.cregion.cresources.crules.crules.hship.c
laws.claws.test.cmagic.cmagic.hmarket.test.cmonsters.cmonsters.test.cmove.test.corderfile.test.cpiracy.test.crenumber.test.creport.creports.cspells.cspells.test.cspells
spy.test.cstudy.test.ctests.ctriggers
util
CMakeLists.txtfilereader.cmessage.cmessage.hmessage.test.cnrmessage.cnrmessage.hstrings.ctranslation.cxml.cxml.h
volcano.test.cwormhole.test.cxmlreader.cxmlreader.h
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -42,3 +42,4 @@ tests/data/185.dat
|
||||||
/quicklist/
|
/quicklist/
|
||||||
/cutest/
|
/cutest/
|
||||||
/critbit/
|
/critbit/
|
||||||
|
*.mo
|
||||||
|
|
|
@ -50,7 +50,7 @@ else()
|
||||||
find_package (SQLite3 REQUIRED QUIET)
|
find_package (SQLite3 REQUIRED QUIET)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package (LibXml2 REQUIRED)
|
find_package(EXPAT REQUIRED)
|
||||||
find_package (ToLua REQUIRED)
|
find_package (ToLua REQUIRED)
|
||||||
if (TOLUA_FOUND)
|
if (TOLUA_FOUND)
|
||||||
if (${TOLUA_VERSION_STRING} VERSION_EQUAL "5.2")
|
if (${TOLUA_VERSION_STRING} VERSION_EQUAL "5.2")
|
||||||
|
@ -70,6 +70,7 @@ add_subdirectory (process)
|
||||||
add_subdirectory (src eressea)
|
add_subdirectory (src eressea)
|
||||||
|
|
||||||
install(DIRECTORY etc DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.txt")
|
install(DIRECTORY etc DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.txt")
|
||||||
|
install(DIRECTORY res conf DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.po")
|
||||||
install(DIRECTORY res conf DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.xml")
|
install(DIRECTORY res conf DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.xml")
|
||||||
install(DIRECTORY res conf DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.json")
|
install(DIRECTORY res conf DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.json")
|
||||||
install(DIRECTORY scripts DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.lua")
|
install(DIRECTORY scripts DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.lua")
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
<item weight="200" score="200">
|
<item weight="200" score="200">
|
||||||
<construction skill="mining" minskill="8"/>
|
<construction skill="mining" minskill="8"/>
|
||||||
</item>
|
</item>
|
||||||
<modifier building="mine" type="skill" value="1"/>
|
<modifier building="mine" type="skill" value="1"/>
|
||||||
<modifier type="require" building="mine"/>
|
<modifier type="require" building="mine"/>
|
||||||
</resource>
|
</resource>
|
||||||
|
|
||||||
<resource name="adamantiumaxe">
|
<resource name="adamantiumaxe">
|
||||||
|
|
|
@ -34,8 +34,8 @@
|
||||||
<item weight="0" score="6000"/>
|
<item weight="0" score="6000"/>
|
||||||
</resource>
|
</resource>
|
||||||
|
|
||||||
<resource name="presspass" cursed="yes">
|
<resource name="presspass">
|
||||||
<item weight="0" score="6000"/>
|
<item weight="0" score="6000" cursed="yes"/>
|
||||||
</resource>
|
</resource>
|
||||||
|
|
||||||
<resource name="aurafocus">
|
<resource name="aurafocus">
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -2,9 +2,9 @@
|
||||||
<eressea>
|
<eressea>
|
||||||
<resources>
|
<resources>
|
||||||
<resource name="laen" limited="yes" material="yes">
|
<resource name="laen" limited="yes" material="yes">
|
||||||
<item weight="200" score="100">
|
<item weight="200" score="100">
|
||||||
<construction skill="mining" minskill="7"/>
|
<construction skill="mining" minskill="7"/>
|
||||||
</item>
|
</item>
|
||||||
<modifier building="mine" type="skill" value="1"/>
|
<modifier building="mine" type="skill" value="1"/>
|
||||||
<modifier type="require" building="mine"/>
|
<modifier type="require" building="mine"/>
|
||||||
</resource>
|
</resource>
|
||||||
|
|
|
@ -192,7 +192,7 @@
|
||||||
|
|
||||||
<!-- end player races -->
|
<!-- end player races -->
|
||||||
|
|
||||||
<race name="kraken" maxaura="0" regaura="0" weight="500" capacity="540" speed="2.000000" hp="300" damage="2d10" unarmedattack="0" unarmeddefense="0" attackmodifier="7" defensemodifier="7" coastal="yes" swim="yes" teach="no" getitem="yes">
|
<race name="kraken" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="2.000000" hp="300" damage="2d10" unarmedattack="0" unarmeddefense="0" attackmodifier="7" defensemodifier="7" coastal="yes" swim="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -218,7 +218,7 @@
|
||||||
<attack type="4" damage="1d10"/>
|
<attack type="4" damage="1d10"/>
|
||||||
<attack type="4" damage="1d10"/>
|
<attack type="4" damage="1d10"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="giantturtle" maxaura="0" regaura="0" weight="1600" capacity="600" speed="1.0" hp="900" ac="7" damage="2d50" unarmedattack="0" unarmeddefense="0" attackmodifier="10" defensemodifier="5" coastal="yes" swim="yes" walk="yes" teach="no" getitem="yes">
|
<race name="giantturtle" maxaura="0.000000" regaura="0.000000" weight="1600" capacity="600" speed="1.0" hp="900" ac="7" damage="2d50" unarmedattack="0" unarmeddefense="0" attackmodifier="10" defensemodifier="5" coastal="yes" swim="yes" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -239,7 +239,7 @@
|
||||||
<skill name="cartmaking" modifier="-99"/>
|
<skill name="cartmaking" modifier="-99"/>
|
||||||
<attack type="4" damage="2d50"/>
|
<attack type="4" damage="2d50"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="dolphin" maxaura="0" regaura="0" weight="500" capacity="540" speed="2.000000" hp="24" damage="1d6" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="5" coastal="yes" swim="yes" teach="no" getitem="yes">
|
<race name="dolphin" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="2.000000" hp="24" damage="1d6" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="5" coastal="yes" swim="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -260,7 +260,7 @@
|
||||||
<skill name="cartmaking" modifier="-99"/>
|
<skill name="cartmaking" modifier="-99"/>
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="tiger" maxaura="0" regaura="0" weight="500" capacity="540" speed="1.0" hp="30" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="3" walk="yes" teach="no" getitem="yes">
|
<race name="tiger" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.0" hp="30" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="3" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -283,7 +283,7 @@
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="hellcat" magres="50" maxaura="0" regaura="0" weight="500" capacity="540" speed="1.0" hp="40" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="4" walk="yes" teach="no" getitem="yes" resistpierce="yes">
|
<race name="hellcat" magres="50" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.0" hp="40" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="4" walk="yes" teach="no" getitem="yes" resistpierce="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -306,7 +306,7 @@
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="owl" maxaura="0" regaura="0" weight="500" capacity="540" speed="1.0" hp="9" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="2" defensemodifier="4" fly="yes" walk="yes" teach="no" getitem="yes">
|
<race name="owl" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.0" hp="9" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="2" defensemodifier="4" fly="yes" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -328,7 +328,7 @@
|
||||||
<skill name="cartmaking" modifier="-99"/>
|
<skill name="cartmaking" modifier="-99"/>
|
||||||
<attack type="4" damage="1d4"/>
|
<attack type="4" damage="1d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="fairy" magres="80" maxaura="1" regaura="1.5" weight="200" capacity="540" speed="1.0" hp="6" damage="1d3" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="14" fly="yes" walk="yes" teach="no" getitem="yes" equipment="yes">
|
<race name="fairy" magres="80" maxaura="1.0" regaura="1.500000" weight="200" capacity="540" speed="1.0" hp="6" damage="1d3" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="14" fly="yes" walk="yes" teach="no" getitem="yes" equipment="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="magic" modifier="1"/>
|
<skill name="magic" modifier="1"/>
|
||||||
<skill name="riding" modifier="-1"/>
|
<skill name="riding" modifier="-1"/>
|
||||||
|
@ -354,7 +354,7 @@
|
||||||
<attack type="4" damage="1d3"/>
|
<attack type="4" damage="1d3"/>
|
||||||
<attack type="4" damage="1d3"/>
|
<attack type="4" damage="1d3"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="dreamcat" magres="50" maxaura="1" regaura="1" weight="500" capacity="540" speed="1.0" hp="10" damage="1d5" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="6" fly="yes" walk="yes" teach="no" getitem="yes" invinciblenonmagic="yes">
|
<race name="dreamcat" magres="50" maxaura="1.0" regaura="1.0" weight="500" capacity="540" speed="1.0" hp="10" damage="1d5" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="6" fly="yes" walk="yes" teach="no" getitem="yes" invinciblenonmagic="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="magic" modifier="1"/>
|
<skill name="magic" modifier="1"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
|
@ -376,7 +376,7 @@
|
||||||
<attack type="4" damage="1d5"/>
|
<attack type="4" damage="1d5"/>
|
||||||
<attack type="4" damage="1d5"/>
|
<attack type="4" damage="1d5"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="imp" magres="50" maxaura="1" regaura="1" weight="500" capacity="540" speed="1.0" hp="10" ac="1" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="4" fly="yes" walk="yes" teach="no" getitem="yes" equipment="yes">
|
<race name="imp" magres="50" maxaura="1.0" regaura="1.0" weight="500" capacity="540" speed="1.0" hp="10" ac="1" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="4" fly="yes" walk="yes" teach="no" getitem="yes" equipment="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -400,7 +400,7 @@
|
||||||
<attack type="1" damage="1d4"/>
|
<attack type="1" damage="1d4"/>
|
||||||
<attack type="6" spell="fiery_dragonbreath" level="3" />
|
<attack type="6" spell="fiery_dragonbreath" level="3" />
|
||||||
</race>
|
</race>
|
||||||
<race name="ghost" magres="80" maxaura="0.5" regaura="0.1" weight="500" capacity="540" speed="1.0" hp="30" ac="5" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="8" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" equipment="yes" invinciblenonmagic="yes">
|
<race name="ghost" magres="80" maxaura="0.500000" regaura="0.100000" weight="500" capacity="540" speed="1.0" hp="30" ac="5" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="8" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" equipment="yes" invinciblenonmagic="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -425,7 +425,7 @@
|
||||||
<attack type="2" damage="2d30"/>
|
<attack type="2" damage="2d30"/>
|
||||||
<attack type="3" damage="1d1"/>
|
<attack type="3" damage="1d1"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="wolf" maxaura="0" regaura="0" weight="500" capacity="540" speed="1.0" hp="25" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="3" scarepeasants="yes" walk="yes" teach="no" getitem="yes">
|
<race name="wolf" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.0" hp="25" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="3" scarepeasants="yes" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -471,7 +471,7 @@
|
||||||
<attack type="4" damage="3d12"/>
|
<attack type="4" damage="3d12"/>
|
||||||
<attack type="4" damage="2d4"/>
|
<attack type="4" damage="2d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="nymph" magres="90" maxaura="1" regaura="1.500000" weight="1000" capacity="540" speed="1.0" hp="15" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="1" walk="yes" teach="no" getitem="yes" equipment="yes">
|
<race name="nymph" magres="90" maxaura="1.0" regaura="1.500000" weight="1000" capacity="540" speed="1.0" hp="15" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="1" walk="yes" teach="no" getitem="yes" equipment="yes">
|
||||||
<ai splitsize="9999"/>
|
<ai splitsize="9999"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
<skill name="bow" modifier="2"/>
|
<skill name="bow" modifier="2"/>
|
||||||
|
@ -493,7 +493,7 @@
|
||||||
<attack type="1" damage="1d4"/>
|
<attack type="1" damage="1d4"/>
|
||||||
<attack type="2" damage="2d20"/>
|
<attack type="2" damage="2d20"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="songdragon" magres="99" maxaura="1" regaura="1" weight="1000" capacity="600" speed="1.500000" hp="40" ac="1" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="1" fly="yes" walk="yes" teach="no" getitem="yes">
|
<race name="songdragon" magres="99" maxaura="1.0" regaura="1.0" weight="1000" capacity="600" speed="1.500000" hp="40" ac="1" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="1" fly="yes" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="9999"/>
|
<ai splitsize="9999"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -520,7 +520,7 @@
|
||||||
<attack type="6" spell="fiery_dragonbreath" level="3" />
|
<attack type="6" spell="fiery_dragonbreath" level="3" />
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="rat" maxaura="0" regaura="0" weight="100" capacity="540" speed="1.0" hp="10" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="1" defensemodifier="1" walk="yes" teach="no" getitem="yes">
|
<race name="rat" maxaura="0.000000" regaura="0.000000" weight="100" capacity="540" speed="1.0" hp="10" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="1" defensemodifier="1" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="9999"/>
|
<ai splitsize="9999"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -543,7 +543,7 @@
|
||||||
<attack type="4" damage="1d4"/>
|
<attack type="4" damage="1d4"/>
|
||||||
<attack type="4" damage="1d4"/>
|
<attack type="4" damage="1d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="eagle" maxaura="0" regaura="0" weight="500" capacity="540" speed="1.500000" hp="15" damage="2d3" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="2" fly="yes" walk="yes" teach="no" getitem="yes">
|
<race name="eagle" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.500000" hp="15" damage="2d3" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="2" fly="yes" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="9999"/>
|
<ai splitsize="9999"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -565,7 +565,7 @@
|
||||||
<skill name="cartmaking" modifier="-99"/>
|
<skill name="cartmaking" modifier="-99"/>
|
||||||
<attack type="4" damage="2d3"/>
|
<attack type="4" damage="2d3"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="tunnelworm" magres="80" maxaura="0" regaura="0" weight="30000" capacity="10000" speed="1.0" hp="300" ac="6" damage="3d20" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="1" scarepeasants="yes" walk="yes" teach="no" getitem="yes">
|
<race name="tunnelworm" magres="80" maxaura="0.000000" regaura="0.000000" weight="30000" capacity="10000" speed="1.0" hp="300" ac="6" damage="3d20" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="1" scarepeasants="yes" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="99999"/>
|
<ai splitsize="99999"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="10"/>
|
<skill name="mining" modifier="10"/>
|
||||||
|
@ -589,15 +589,15 @@
|
||||||
<attack type="4" damage="3d20"/>
|
<attack type="4" damage="3d20"/>
|
||||||
<attack type="8" damage="1d10"/>
|
<attack type="8" damage="1d10"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="direwolf" maxaura="0" regaura="0" weight="500" capacity="540" speed="1.0" hp="20" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="1" walk="yes" teach="no" giveperson="yes">
|
<race name="direwolf" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.0" hp="20" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="1" walk="yes" teach="no" giveperson="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<attack type="4" damage="2d4"/>
|
<attack type="4" damage="2d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="peasant" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1.0" hp="20" damage="1d6" unarmedattack="0" unarmeddefense="0" cannotmove="yes" teach="no">
|
<race name="peasant" maxaura="1.0" regaura="1.0" weight="1000" capacity="540" speed="1.0" hp="20" damage="1d6" unarmedattack="0" unarmeddefense="0" cannotmove="yes" teach="no">
|
||||||
<ai splitsize="10000"/>
|
<ai splitsize="10000"/>
|
||||||
<attack type="1" damage="1d6"/>
|
<attack type="1" damage="1d6"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="braineater" magres="90" maxaura="1" regaura="1" weight="100" capacity="540" speed="1.0" hp="20" damage="0d0" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="10" scarepeasants="yes" fly="yes" walk="yes" teach="no" invinciblenonmagic="yes">
|
<race name="braineater" magres="90" maxaura="1.0" regaura="1.0" weight="100" capacity="540" speed="1.0" hp="20" damage="0d0" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="10" scarepeasants="yes" fly="yes" walk="yes" teach="no" invinciblenonmagic="yes">
|
||||||
<ai splitsize="500" killpeasants="yes" moverandom="yes" learn="yes"/>
|
<ai splitsize="500" killpeasants="yes" moverandom="yes" learn="yes"/>
|
||||||
<attack type="2" damage="3d15"/>
|
<attack type="2" damage="3d15"/>
|
||||||
<attack type="3" damage="1d1"/>
|
<attack type="3" damage="1d1"/>
|
||||||
|
@ -651,34 +651,34 @@
|
||||||
<skill name="stamina" modifier="-10"/>
|
<skill name="stamina" modifier="-10"/>
|
||||||
<attack type="4" damage="1d2"/>
|
<attack type="4" damage="1d2"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="mountainguard" unarmedguard="yes" magres="50" maxaura="1" regaura="0.500000" weight="10000" capacity="2000" speed="0.000000" hp="1000" ac="12" damage="2d40" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="8" cannotmove="yes" canlearn="no" teach="no" noweapons="yes">
|
<race name="mountainguard" unarmedguard="yes" magres="50" maxaura="1.0" regaura="0.500000" weight="10000" capacity="2000" speed="0.000000" hp="1000" ac="12" damage="2d40" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="8" cannotmove="yes" learn="no" teach="no" noweapons="yes">
|
||||||
<ai splitsize="1"/>
|
<ai splitsize="1"/>
|
||||||
<attack type="4" damage="2d40"/>
|
<attack type="4" damage="2d40"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="shadowmaster" cansail="no" cansteal="no" canlearn="no" magres="75" maxaura="1" regaura="2.000000" weight="500" capacity="540" speed="1.0" hp="150" ac="4" damage="2d5" unarmedattack="0" unarmeddefense="0" attackmodifier="11" defensemodifier="13" scarepeasants="yes" walk="yes" teach="no" desert="yes">
|
<race name="shadowmaster" cansail="no" cansteal="no" learn="no" magres="75" maxaura="1.0" regaura="2.000000" weight="500" capacity="540" speed="1.0" hp="150" ac="4" damage="2d5" unarmedattack="0" unarmeddefense="0" attackmodifier="11" defensemodifier="13" scarepeasants="yes" walk="yes" teach="no" desert="yes">
|
||||||
<ai splitsize="50" killpeasants="yes" moverandom="yes" learn="yes"/>
|
<ai splitsize="50" killpeasants="yes" moverandom="yes" learn="yes"/>
|
||||||
<attack type="4" damage="2d4"/>
|
<attack type="4" damage="2d4"/>
|
||||||
<attack type="2" damage="2d30"/>
|
<attack type="2" damage="2d30"/>
|
||||||
<attack type="3" damage="1d2"/>
|
<attack type="3" damage="1d2"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="shadowdemon" cansail="no" cansteal="no" canlearn="no" magres="75" maxaura="1" regaura="1" weight="500" capacity="540" speed="1.0" hp="50" ac="3" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="8" defensemodifier="11" scarepeasants="yes" walk="yes" teach="no" desert="yes" recruitethereal="yes">
|
<race name="shadowdemon" cansail="no" cansteal="no" learn="no" magres="75" maxaura="1.0" regaura="1.0" weight="500" capacity="540" speed="1.0" hp="50" ac="3" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="8" defensemodifier="11" scarepeasants="yes" walk="yes" teach="no" desert="yes" recruitethereal="yes">
|
||||||
<ai splitsize="1000" killpeasants="yes" moverandom="yes" learn="yes"/>
|
<ai splitsize="1000" killpeasants="yes" moverandom="yes" learn="yes"/>
|
||||||
<attack type="4" damage="2d3"/>
|
<attack type="4" damage="2d3"/>
|
||||||
<attack type="3" damage="1d1"/>
|
<attack type="3" damage="1d1"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="stonegolem" stonegolem="true" magres="25" maxaura="1" regaura="0.100000" weight="10000" capacity="2000" speed="1.0" hp="60" ac="4" damage="2d12+6" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="2" walk="yes" canlearn="no" teach="no">
|
<race name="stonegolem" stonegolem="true" magres="25" maxaura="1.0" regaura="0.100000" weight="10000" capacity="2000" speed="1.0" hp="60" ac="4" damage="2d12+6" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="2" walk="yes" learn="no" teach="no">
|
||||||
<ai splitsize="50"/>
|
<ai splitsize="50"/>
|
||||||
<skill name="building" modifier="14"/>
|
<skill name="building" modifier="14"/>
|
||||||
<skill name="roadwork" modifier="14"/>
|
<skill name="roadwork" modifier="14"/>
|
||||||
<attack type="4" damage="2d10+4"/>
|
<attack type="4" damage="2d10+4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="irongolem" irongolem="true" magres="25" maxaura="1" regaura="0.100000" weight="10000" capacity="2000" speed="1.0" hp="50" ac="2" damage="2d10+4" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="2" walk="yes" canlearn="no" teach="no">
|
<race name="irongolem" irongolem="true" magres="25" maxaura="1.0" regaura="0.100000" weight="10000" capacity="2000" speed="1.0" hp="50" ac="2" damage="2d10+4" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="2" walk="yes" learn="no" teach="no">
|
||||||
<ai splitsize="50"/>
|
<ai splitsize="50"/>
|
||||||
<skill name="armorer" modifier="14"/>
|
<skill name="armorer" modifier="14"/>
|
||||||
<skill name="weaponsmithing" modifier="14"/>
|
<skill name="weaponsmithing" modifier="14"/>
|
||||||
<attack type="4" damage="2d8+4"/>
|
<attack type="4" damage="2d8+4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="spell" maxaura="1" regaura="0.100000" weight="0" capacity="0" speed="0.000000" hp="1" damage="1d4" unarmedattack="-2" unarmeddefense="-2" canlearn="no" noheal="yes" noweapons="yes" illusionary="yes" invisible="yes" fly="yes" swim="yes" walk="yes">
|
<race name="spell" maxaura="1" regaura="0.100000" weight="0" capacity="0" speed="0.000000" hp="1" damage="1d4" unarmedattack="-2" unarmeddefense="-2" learn="no" noheal="yes" noweapons="yes" illusionary="yes" invisible="yes" fly="yes" swim="yes" walk="yes">
|
||||||
<ai splitsize="1"/>
|
<ai splitsize="1"/>
|
||||||
<attack type="1" damage="1d4"/>
|
<attack type="1" damage="1d4"/>
|
||||||
</race>
|
</race>
|
||||||
|
@ -687,14 +687,14 @@
|
||||||
<attack type="1" damage="1d4"/>
|
<attack type="1" damage="1d4"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="dracoid" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1.0" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" walk="yes" teach="no" giveperson="yes" getitem="yes" equipment="yes">
|
<race name="dracoid" maxaura="1.0" regaura="1.0" weight="1000" capacity="540" speed="1.0" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" walk="yes" teach="no" giveperson="yes" getitem="yes" equipment="yes">
|
||||||
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
<attack type="1" damage="1d5"/>
|
<attack type="1" damage="1d5"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="ent" magres="25" maxaura="1" regaura="0.500000" weight="5000" capacity="2500" speed="1.0" hp="50" ac="4" damage="2d4+12" unarmedattack="0" unarmeddefense="0" attackmodifier="9" defensemodifier="7" scarepeasants="yes" walk="yes" teach="no">
|
<race name="ent" magres="25" maxaura="1.0" regaura="0.500000" weight="5000" capacity="2500" speed="1.0" hp="50" ac="4" damage="2d4+12" unarmedattack="0" unarmeddefense="0" attackmodifier="9" defensemodifier="7" scarepeasants="yes" walk="yes" teach="no">
|
||||||
<ai splitsize="1000" moverandom="yes" learn="yes"/>
|
<ai splitsize="1000" moverandom="yes" learn="yes"/>
|
||||||
<attack type="4" damage="2d12"/>
|
<attack type="4" damage="2d12"/>
|
||||||
<attack type="4" damage="2d12"/>
|
<attack type="4" damage="2d12"/>
|
||||||
|
@ -703,14 +703,14 @@
|
||||||
<race name="undead" maxaura="1" regaura="1" weight="1000"
|
<race name="undead" maxaura="1" regaura="1" weight="1000"
|
||||||
capacity="540" speed="1.0" hp="20" damage="1d7" unarmedattack="0"
|
capacity="540" speed="1.0" hp="20" damage="1d7" unarmedattack="0"
|
||||||
unarmeddefense="0" attackmodifier="1" defensemodifier="1"
|
unarmeddefense="0" attackmodifier="1" defensemodifier="1"
|
||||||
scarepeasants="yes" walk="yes" canlearn="no" teach="no" noheal="yes"
|
scarepeasants="yes" walk="yes" learn="no" teach="no" noheal="yes"
|
||||||
undead="yes" equipment="yes" giveperson="yes">
|
undead="yes" equipment="yes" giveperson="yes">
|
||||||
<ai splitsize="20000" moverandom="yes"/>
|
<ai splitsize="20000" moverandom="yes"/>
|
||||||
<attack type="4" damage="1d7"/>
|
<attack type="4" damage="1d7"/>
|
||||||
<attack type="5"/>
|
<attack type="5"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="clone" magres="90" maxaura="0" regaura="0" weight="1000" capacity="540" speed="1.0" hp="40" damage="0d0" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" canlearn="no" teach="no" noheal="yes">
|
<race name="clone" magres="90" maxaura="0.000000" regaura="0.000000" weight="1000" capacity="540" speed="1.0" hp="40" damage="0d0" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" learn="no" teach="no" noheal="yes">
|
||||||
<ai splitsize="10000"/>
|
<ai splitsize="10000"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
|
@ -736,7 +736,7 @@
|
||||||
<attack type="1" damage="0d0"/>
|
<attack type="1" damage="0d0"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="ghast" magres="60" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1.0" hp="60" ac="2" damage="1d7" unarmedattack="6" unarmeddefense="6" attackmodifier="6" defensemodifier="6" scarepeasants="yes" walk="yes" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" giveperson="yes">
|
<race name="ghast" magres="60" maxaura="1.0" regaura="1.0" weight="1000" capacity="540" speed="1.0" hp="60" ac="2" damage="1d7" unarmedattack="6" unarmeddefense="6" attackmodifier="6" defensemodifier="6" scarepeasants="yes" walk="yes" learn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" giveperson="yes">
|
||||||
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
|
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="bow" modifier="1"/>
|
<skill name="bow" modifier="1"/>
|
||||||
|
@ -754,7 +754,7 @@
|
||||||
<attack type="2" damage="1d30"/>
|
<attack type="2" damage="1d30"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="ghoul" magres="30" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1.0" hp="30" ac="1" damage="1d7" unarmedattack="3" unarmeddefense="3" attackmodifier="3" defensemodifier="3" scarepeasants="yes" walk="yes" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" giveperson="yes">
|
<race name="ghoul" magres="30" maxaura="1.0" regaura="1.0" weight="1000" capacity="540" speed="1.0" hp="30" ac="1" damage="1d7" unarmedattack="3" unarmeddefense="3" attackmodifier="3" defensemodifier="3" scarepeasants="yes" walk="yes" learn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" giveperson="yes">
|
||||||
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
|
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="bow" modifier="1"/>
|
<skill name="bow" modifier="1"/>
|
||||||
|
@ -771,7 +771,7 @@
|
||||||
<attack type="2" damage="1d30"/>
|
<attack type="2" damage="1d30"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="juju" magres="50" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1.0" hp="80" ac="2" damage="1d7" unarmedattack="6" unarmeddefense="6" attackmodifier="8" defensemodifier="8" scarepeasants="yes" walk="yes" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistbash="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
<race name="juju" magres="50" maxaura="1.0" regaura="1.0" weight="1000" capacity="540" speed="1.0" hp="80" ac="2" damage="1d7" unarmedattack="6" unarmeddefense="6" attackmodifier="8" defensemodifier="8" scarepeasants="yes" walk="yes" learn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistbash="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
||||||
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
|
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="bow" modifier="1"/>
|
<skill name="bow" modifier="1"/>
|
||||||
|
@ -787,7 +787,7 @@
|
||||||
<attack type="3" damage="1d1"/>
|
<attack type="3" damage="1d1"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="zombie" magres="20" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1.0" hp="40" ac="1" damage="1d7" unarmedattack="2" unarmeddefense="2" attackmodifier="5" defensemodifier="5" scarepeasants="yes" walk="yes" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
<race name="zombie" magres="20" maxaura="1.0" regaura="1.0" weight="1000" capacity="540" speed="1.0" hp="40" ac="1" damage="1d7" unarmedattack="2" unarmeddefense="2" attackmodifier="5" defensemodifier="5" scarepeasants="yes" walk="yes" learn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
||||||
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
|
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="bow" modifier="1"/>
|
<skill name="bow" modifier="1"/>
|
||||||
|
@ -801,7 +801,7 @@
|
||||||
<attack type="1" damage="1d7"/>
|
<attack type="1" damage="1d7"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="skeletonlord" magres="30" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1.0" hp="60" ac="4" damage="1d7" unarmedattack="6" unarmeddefense="6" attackmodifier="8" defensemodifier="8" scarepeasants="yes" walk="yes" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
<race name="skeletonlord" magres="30" maxaura="1.0" regaura="1.0" weight="1000" capacity="540" speed="1.0" hp="60" ac="4" damage="1d7" unarmedattack="6" unarmeddefense="6" attackmodifier="8" defensemodifier="8" scarepeasants="yes" walk="yes" learn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
||||||
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
|
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="bow" modifier="1"/>
|
<skill name="bow" modifier="1"/>
|
||||||
|
@ -816,7 +816,7 @@
|
||||||
<attack type="1" damage="1d7"/>
|
<attack type="1" damage="1d7"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="skeleton" magres="10" maxaura="1" regaura="1" weight="500" capacity="540" speed="1.0" hp="20" ac="1" damage="1d7" unarmedattack="1" unarmeddefense="1" attackmodifier="6" defensemodifier="6" scarepeasants="yes" walk="yes" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
<race name="skeleton" magres="10" maxaura="1.0" regaura="1.0" weight="500" capacity="540" speed="1.0" hp="20" ac="1" damage="1d7" unarmedattack="1" unarmeddefense="1" attackmodifier="6" defensemodifier="6" scarepeasants="yes" walk="yes" learn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
||||||
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
|
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="bow" modifier="1"/>
|
<skill name="bow" modifier="1"/>
|
||||||
|
@ -830,12 +830,12 @@
|
||||||
<attack type="1" damage="1d7"/>
|
<attack type="1" damage="1d7"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="shadowknight" maxaura="0" regaura="0" weight="0" capacity="540" speed="1.0" hp="1" damage="1d1" unarmedattack="0" unarmeddefense="0" attackmodifier="1" defensemodifier="1" scarepeasants="yes" walk="yes" canlearn="no" teach="no" noblock="yes">
|
<race name="shadowknight" maxaura="0.000000" regaura="0.000000" weight="0" capacity="540" speed="1.0" hp="1" damage="1d1" unarmedattack="0" unarmeddefense="0" attackmodifier="1" defensemodifier="1" scarepeasants="yes" walk="yes" learn="no" teach="no" noblock="yes">
|
||||||
<ai splitsize="20000" moverandom="yes"/>
|
<ai splitsize="20000" moverandom="yes"/>
|
||||||
<attack type="1" damage="1d1"/>
|
<attack type="1" damage="1d1"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="seaserpent" magres="50" maxaura="1" regaura="1" weight="20000" capacity="5000" speed="1.0" hp="600" ac="3" damage="2d15" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="4" scarepeasants="yes" swim="yes" teach="no" getitem="yes" resistbash="yes">
|
<race name="seaserpent" magres="50" maxaura="1.0" regaura="1.0" weight="20000" capacity="5000" speed="1.0" hp="600" ac="3" damage="2d15" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="4" scarepeasants="yes" swim="yes" teach="no" getitem="yes" resistbash="yes">
|
||||||
<ai splitsize="6" killpeasants="yes" moverandom="yes" learn="yes" moveattack="yes"/>
|
<ai splitsize="6" killpeasants="yes" moverandom="yes" learn="yes" moveattack="yes"/>
|
||||||
<skill name="tactics" modifier="4"/>
|
<skill name="tactics" modifier="4"/>
|
||||||
<attack type="4" damage="1d30"/>
|
<attack type="4" damage="1d30"/>
|
||||||
|
|
190
res/eressea.dtd
Normal file
190
res/eressea.dtd
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<!-- DTD generated by XMLSpy v2018 rel. 2 (x64) (http://www.altova.com) -->
|
||||||
|
<!ELEMENT ai EMPTY>
|
||||||
|
<!ATTLIST ai
|
||||||
|
splitsize (1 | 1000 | 10000 | 2 | 2000 | 20000 | 50 | 500 | 5000 | 6 | 9999 | 99999) #REQUIRED
|
||||||
|
moverandom CDATA #FIXED "yes"
|
||||||
|
learn CDATA #FIXED "yes"
|
||||||
|
killpeasants CDATA #FIXED "yes"
|
||||||
|
moveattack CDATA #FIXED "yes"
|
||||||
|
>
|
||||||
|
<!ELEMENT set ((item+, ((skill+, item*) | callback | subset+)?) | (skill+, ((item+, subset?) | callback | subset | spell+)?) | callback)?>
|
||||||
|
<!ATTLIST set
|
||||||
|
name (fam_direwolf | fam_dreamcat | fam_eagle | fam_fairy | fam_ghost | fam_hellcat | fam_imp | fam_lynx | fam_nymph | fam_owl | fam_rat | fam_songdragon | fam_tiger | fam_tunnelworm | fam_unicorn | i_bow | i_chain | i_plate | i_rustyshield | i_spear | i_sword | new_dracoid | new_orc | rand_bow | rand_crossbow | rand_desert | rand_forest | rand_glacier | rand_herbalist | rand_highland | rand_mountain | rand_plain | rand_rider | rand_spear | rand_swamp | rand_sword | rand_villagers | rising_undead | seed_aquarian | seed_braineater | seed_cat | seed_demon | seed_dragon | seed_dwarf | seed_elf | seed_goblin | seed_halfling | seed_human | seed_insect | seed_orc | seed_seaserpent | seed_troll | spo_dragon | spo_seaserpent | spo_wyrm | spo_youngdragon) #REQUIRED
|
||||||
|
chance (0.25 | 0.33 | 0.34) #IMPLIED
|
||||||
|
>
|
||||||
|
<!ELEMENT item (weapon?)>
|
||||||
|
<!ATTLIST item
|
||||||
|
name (axe | balm | bow | cart | chainmail | crossbow | dragonblood | dragonhead | fairyboot | horse | incense | jewel | money | myrrh | nestwarmth | oil | plate | roi | rustychainmail | rustyshield | rustysword | seaserpenthead | silk | spear | spice | stone | sword | wagon) #IMPLIED
|
||||||
|
amount CDATA #IMPLIED
|
||||||
|
notlost CDATA #FIXED "yes"
|
||||||
|
weight (0 | 1 | 100) #IMPLIED
|
||||||
|
use CDATA #FIXED "yes"
|
||||||
|
cursed (true | yes) #IMPLIED
|
||||||
|
score CDATA #FIXED "0"
|
||||||
|
>
|
||||||
|
<!ELEMENT race ((ai, ((skill+, attack+, familiar*) | (param, skill+, attack, familiar+) | attack+)) | attack+)>
|
||||||
|
<!ATTLIST race
|
||||||
|
name (aquarian | braineater | cat | catdragon | clone | demon | direwolf | dolphin | dracoid | dragon | dreamcat | dwarf | eagle | elf | ent | fairy | ghast | ghost | ghoul | giantturtle | gnome | goblin | halfling | hellcat | human | imp | insect | irongolem | juju | kraken | lynx | mountainguard | museumghost | nymph | orc | owl | peasant | rat | seaserpent | shadowdemon | shadowdragon | shadowknight | shadowmaster | skeleton | skeletonlord | smurf | snotling | snowman | songdragon | special | spell | stonegolem | template | tiger | toad | troll | tunnelworm | undead | unicorn | wolf | wyrm | youngdragon | zombie) #REQUIRED
|
||||||
|
magres (-0.050000 | -5 | 10 | 100 | 15 | 20 | 25 | 30 | 5 | 50 | 60 | 70 | 75 | 80 | 90 | 95 | 99) #IMPLIED
|
||||||
|
maxaura (0.000000 | 0.500000 | 1.000000 | 1.500000) #IMPLIED
|
||||||
|
regaura (0.000000 | 0.100000 | 0.500000 | 1.000000 | 1.250000 | 1.500000 | 2.000000 | 3.000000) #IMPLIED
|
||||||
|
weight (0 | 100 | 1000 | 10000 | 1600 | 18000 | 200 | 2000 | 20000 | 30000 | 500 | 5000 | 600) #REQUIRED
|
||||||
|
capacity (0 | 1000 | 10000 | 100000 | 1000000 | 1080 | 200 | 2000 | 2500 | 440 | 5000 | 540 | 600) #REQUIRED
|
||||||
|
equipment (no | yes) #IMPLIED
|
||||||
|
speed (0.000000 | 1.000000 | 1.500000 | 10.000000 | 2.000000) #REQUIRED
|
||||||
|
hp (1 | 10 | 1000 | 15 | 150 | 16 | 18 | 20 | 24 | 25 | 2700 | 30 | 300 | 40 | 50 | 6 | 60 | 600 | 80 | 9 | 900) #REQUIRED
|
||||||
|
ac (1 | 10 | 12 | 2 | 3 | 4 | 5 | 6 | 7 | 8) #IMPLIED
|
||||||
|
damage CDATA #REQUIRED
|
||||||
|
unarmedattack (-2 | 0 | 1 | 10 | 2 | 3 | 6) #REQUIRED
|
||||||
|
unarmeddefense (-2 | 0 | 1 | 10 | 2 | 3 | 6) #REQUIRED
|
||||||
|
attackmodifier (1 | 10 | 11 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9) #IMPLIED
|
||||||
|
defensemodifier (1 | 10 | 11 | 12 | 13 | 14 | 2 | 3 | 4 | 5 | 50 | 6 | 7 | 8) #IMPLIED
|
||||||
|
fly (no | yes) #IMPLIED
|
||||||
|
walk (no | yes) #IMPLIED
|
||||||
|
canteach CDATA #FIXED "no"
|
||||||
|
getitem CDATA #FIXED "yes"
|
||||||
|
recruitcost (110 | 130 | 150 | 40 | 70 | 75 | 80 | 90) #IMPLIED
|
||||||
|
maintenance (0 | 10) #IMPLIED
|
||||||
|
playerrace (no | yes) #IMPLIED
|
||||||
|
giveperson CDATA #FIXED "yes"
|
||||||
|
giveunit CDATA #FIXED "yes"
|
||||||
|
coastal CDATA #FIXED "yes"
|
||||||
|
swim CDATA #FIXED "yes"
|
||||||
|
teach CDATA #FIXED "no"
|
||||||
|
resistpierce CDATA #FIXED "yes"
|
||||||
|
invinciblenonmagic CDATA #FIXED "yes"
|
||||||
|
scarepeasants CDATA #FIXED "yes"
|
||||||
|
unarmedguard CDATA #FIXED "yes"
|
||||||
|
cannotmove CDATA #FIXED "yes"
|
||||||
|
canlearn CDATA #FIXED "no"
|
||||||
|
noweapons CDATA #FIXED "yes"
|
||||||
|
cansail CDATA #FIXED "no"
|
||||||
|
cansteal CDATA #FIXED "no"
|
||||||
|
desert CDATA #FIXED "yes"
|
||||||
|
recruitethereal CDATA #FIXED "yes"
|
||||||
|
stonegolem CDATA #FIXED "true"
|
||||||
|
irongolem CDATA #FIXED "true"
|
||||||
|
noheal CDATA #FIXED "yes"
|
||||||
|
illusionary CDATA #FIXED "yes"
|
||||||
|
invisible CDATA #FIXED "yes"
|
||||||
|
shapeshift CDATA #FIXED "yes"
|
||||||
|
dragon CDATA #FIXED "yes"
|
||||||
|
resistbash CDATA #FIXED "yes"
|
||||||
|
undead CDATA #FIXED "yes"
|
||||||
|
shipspeed CDATA #FIXED "yes"
|
||||||
|
shapeshiftany CDATA #FIXED "yes"
|
||||||
|
recruitunlimited CDATA #FIXED "yes"
|
||||||
|
absorbpeasants CDATA #FIXED "yes"
|
||||||
|
resistcut CDATA #FIXED "yes"
|
||||||
|
noblock CDATA #FIXED "yes"
|
||||||
|
studyspeed CDATA #FIXED "-5"
|
||||||
|
>
|
||||||
|
<!ELEMENT text (#PCDATA)>
|
||||||
|
<!ATTLIST text
|
||||||
|
locale (de | en | fr) #REQUIRED
|
||||||
|
>
|
||||||
|
<!ELEMENT param EMPTY>
|
||||||
|
<!ATTLIST param
|
||||||
|
name (hunger.damage | migrants.formula | recruit_multi) #REQUIRED
|
||||||
|
value CDATA #REQUIRED
|
||||||
|
>
|
||||||
|
<!ELEMENT races (race+)>
|
||||||
|
<!ELEMENT skill EMPTY>
|
||||||
|
<!ATTLIST skill
|
||||||
|
name (alchemy | armorer | bow | building | cartmaking | catapult | crossbow | entertainment | espionage | forestry | herbalism | magic | melee | mining | perception | polearm | quarrying | riding | roadwork | sailing | shipcraft | stamina | stealth | tactics | taxation | trade | training | unarmed | weaponsmithing) #REQUIRED
|
||||||
|
level CDATA #IMPLIED
|
||||||
|
modifier (-1 | -10 | -2 | -3 | -99 | 1 | 10 | 12 | 14 | 2 | 20 | 3 | 4 | 5 | 8) #IMPLIED
|
||||||
|
>
|
||||||
|
<!ELEMENT spell (#PCDATA | resource)*>
|
||||||
|
<!ATTLIST spell
|
||||||
|
name CDATA #REQUIRED
|
||||||
|
level (1 | 12 | 2 | 3 | 4 | 5 | 6 | 7 | 8) #IMPLIED
|
||||||
|
ship CDATA #FIXED "true"
|
||||||
|
rank (1 | 2 | 3 | 4 | 5 | 7) #IMPLIED
|
||||||
|
variable CDATA #FIXED "true"
|
||||||
|
combat (1 | 2 | 3) #IMPLIED
|
||||||
|
parameters CDATA #IMPLIED
|
||||||
|
los CDATA #FIXED "true"
|
||||||
|
far CDATA #FIXED "true"
|
||||||
|
ocean CDATA #FIXED "true"
|
||||||
|
syntax (aura | buildingtype | direction | race | spellid) #IMPLIED
|
||||||
|
regiontarget (false | true) #IMPLIED
|
||||||
|
unittarget CDATA #FIXED "false"
|
||||||
|
buildingtarget CDATA #FIXED "true"
|
||||||
|
shiptarget CDATA #FIXED "true"
|
||||||
|
globaltarget CDATA #FIXED "true"
|
||||||
|
>
|
||||||
|
<!ELEMENT attack EMPTY>
|
||||||
|
<!ATTLIST attack
|
||||||
|
type (1 | 2 | 3 | 4 | 5 | 6 | 8) #REQUIRED
|
||||||
|
damage CDATA #IMPLIED
|
||||||
|
spell (aura_of_fear | drain_skills | fiery_dragonbreath | icy_dragonbreath | powerful_dragonbreath) #IMPLIED
|
||||||
|
level (12 | 3 | 6) #IMPLIED
|
||||||
|
>
|
||||||
|
<!ELEMENT damage EMPTY>
|
||||||
|
<!ATTLIST damage
|
||||||
|
type (footman | rider) #REQUIRED
|
||||||
|
value CDATA #FIXED "3d8+8"
|
||||||
|
>
|
||||||
|
<!ELEMENT spells (spell+)>
|
||||||
|
<!ELEMENT string (text+)>
|
||||||
|
<!ATTLIST string
|
||||||
|
name (adamantium | adamantium_p | adamantiumaxe | adamantiumaxe_p | adamantiumplate | adamantiumplate_p | almond | analysedream | aoc | aoc_p | apple | artacademy | aurapotion50 | aurapotion50_p | bagpipeoffear | bagpipeoffear_p | balloon | birthdaycake | birthdaycake_p | cookie | eyeofdragon | headache | jadee_dress | jadee_dress_p | jadee_ring | jadee_ring_p | lifepotion | newbie_info_cr | nut | pavilion | portal | ring | ring_of_levitation | ring_of_levitation_p | ring_p | rm_adamantium | seaserpenthead | seaserpenthead_p | seashell | seashell_p | snowball | snowman | snowman_p | stardust | temple | wente_dress | wente_dress_p | wente_ring | wente_ring_p | xmastree) #REQUIRED
|
||||||
|
>
|
||||||
|
<!ELEMENT subset (set+)>
|
||||||
|
<!ATTLIST subset
|
||||||
|
chance (0.2 | 0.3 | 0.4 | 0.6) #IMPLIED
|
||||||
|
>
|
||||||
|
<!ELEMENT weapon (damage+, modifier+)>
|
||||||
|
<!ATTLIST weapon
|
||||||
|
bash CDATA #FIXED "true"
|
||||||
|
missile CDATA #FIXED "true"
|
||||||
|
skill CDATA #FIXED "unarmed"
|
||||||
|
offmod CDATA #FIXED "0"
|
||||||
|
defmod CDATA #FIXED "0"
|
||||||
|
reload CDATA #FIXED "0"
|
||||||
|
magres CDATA #FIXED "0.0"
|
||||||
|
>
|
||||||
|
<!ELEMENT eressea (equipment+, buildings, resources, races, strings, spells)>
|
||||||
|
<!ELEMENT strings (namespace+, string+)>
|
||||||
|
<!ELEMENT building EMPTY>
|
||||||
|
<!ATTLIST building
|
||||||
|
name (artacademy | pavilion | portal | temple) #REQUIRED
|
||||||
|
maxsize (100 | 2 | 50) #REQUIRED
|
||||||
|
maxcapacity CDATA #FIXED "2"
|
||||||
|
nobuild CDATA #FIXED "yes"
|
||||||
|
nodestroy CDATA #FIXED "yes"
|
||||||
|
unique CDATA #FIXED "yes"
|
||||||
|
auraregen CDATA #FIXED "1.00"
|
||||||
|
>
|
||||||
|
<!ELEMENT callback EMPTY>
|
||||||
|
<!ATTLIST callback
|
||||||
|
name CDATA #FIXED "equip_newunits"
|
||||||
|
>
|
||||||
|
<!ELEMENT familiar EMPTY>
|
||||||
|
<!ATTLIST familiar
|
||||||
|
race (demon | dolphin | dreamcat | eagle | fairy | ghost | giantturtle | goblin | hellcat | imp | kraken | lynx | nymph | owl | rat | songdragon | tiger | tunnelworm | unicorn | wolf) #REQUIRED
|
||||||
|
default CDATA #FIXED "yes"
|
||||||
|
>
|
||||||
|
<!ELEMENT modifier EMPTY>
|
||||||
|
<!ATTLIST modifier
|
||||||
|
type (missile_target | skill) #REQUIRED
|
||||||
|
value (-90 | 100 | 2) #REQUIRED
|
||||||
|
races CDATA #FIXED "snowman"
|
||||||
|
>
|
||||||
|
<!ELEMENT resource (item?)>
|
||||||
|
<!ATTLIST resource
|
||||||
|
name (almond | aoc | aog | apple | aura | birthdaycake | cookie | dragonblood | dragonhead | eyeofdragon | h12 | h20 | h7 | hp | iron | jadee_dress | jadee_ring | laen | laensword | lebkuchenherz | lifepotion | lmsreward | log | mallorn | money | museumexitticket | museumticket | nut | oil | p10 | peasant | permaura | questkey1 | questkey2 | ring_of_levitation | seaserpenthead | seashell | snowball | snowglobe | snowman | stardust | stone | sword | toadslime | wente_dress | wente_ring | xmastree) #REQUIRED
|
||||||
|
appearance (amulet | key | ring | vial) #IMPLIED
|
||||||
|
amount (1 | 10 | 100 | 1000 | 12 | 140 | 15 | 150 | 16 | 18 | 2 | 20 | 200 | 24 | 25 | 250 | 28 | 3 | 30 | 3000 | 30000 | 35 | 350 | 4 | 40 | 4000 | 5 | 50 | 5000 | 6 | 600 | 7 | 8 | 80 | 800 | 90) #IMPLIED
|
||||||
|
cost (fixed | level) #IMPLIED
|
||||||
|
>
|
||||||
|
<!ELEMENT buildings (building+)>
|
||||||
|
<!ELEMENT equipment (set+)>
|
||||||
|
<!ELEMENT namespace (string+)>
|
||||||
|
<!ATTLIST namespace
|
||||||
|
name (describe | iteminfo | race | shipinfo | spell | spellinfo) #REQUIRED
|
||||||
|
>
|
||||||
|
<!ELEMENT resources (resource+)>
|
|
@ -11,9 +11,8 @@
|
||||||
<attack type="3" damage="2d6+2"/>
|
<attack type="3" damage="2d6+2"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
||||||
<race name="human" maxaura="1" regaura="1" recruitcost="75" maintenance="10" weight="1000" capacity="540" speed="1" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
|
<race name="human" maxaura="1.000000" regaura="1.000000" recruitcost="75" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes" migrants="yes">
|
||||||
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
||||||
<param name="migrants.formula" value="1"/>
|
|
||||||
<skill name="trade" modifier="1"/>
|
<skill name="trade" modifier="1"/>
|
||||||
<skill name="herbalism" modifier="-1"/>
|
<skill name="herbalism" modifier="-1"/>
|
||||||
<skill name="shipcraft" modifier="1"/>
|
<skill name="shipcraft" modifier="1"/>
|
||||||
|
@ -27,7 +26,7 @@
|
||||||
<familiar race="eagle"/>
|
<familiar race="eagle"/>
|
||||||
<familiar race="imp"/>
|
<familiar race="imp"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="kraken" maxaura="0" regaura="0" weight="500" capacity="540" speed="2" hp="300" damage="2d10" unarmedattack="0" unarmeddefense="0" attackmodifier="7" defensemodifier="7" coastal="yes" swim="yes" teach="no" getitem="yes">
|
<race name="kraken" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="2.000000" hp="300" damage="2d10" unarmedattack="0" unarmeddefense="0" attackmodifier="7" defensemodifier="7" coastal="yes" swim="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="perception" modifier="1"/>
|
<skill name="perception" modifier="1"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
|
@ -60,7 +59,7 @@
|
||||||
<attack type="4" damage="1d10"/>
|
<attack type="4" damage="1d10"/>
|
||||||
<attack type="4" damage="1d10"/>
|
<attack type="4" damage="1d10"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="giantturtle" maxaura="0" regaura="0" weight="1600" capacity="600" speed="1" hp="900" ac="7" damage="2d50" unarmedattack="0" unarmeddefense="0" attackmodifier="10" defensemodifier="5" coastal="yes" swim="yes" walk="yes" teach="no" getitem="yes">
|
<race name="giantturtle" maxaura="0.000000" regaura="0.000000" weight="1600" capacity="600" speed="1.000000" hp="900" ac="7" damage="2d50" unarmedattack="0" unarmeddefense="0" attackmodifier="10" defensemodifier="5" coastal="yes" swim="yes" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="perception" modifier="1"/>
|
<skill name="perception" modifier="1"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
|
@ -88,7 +87,7 @@
|
||||||
<skill name="taxation" modifier="-99"/>
|
<skill name="taxation" modifier="-99"/>
|
||||||
<attack type="4" damage="2d50"/>
|
<attack type="4" damage="2d50"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="dolphin" maxaura="0" regaura="0" weight="500" capacity="540" speed="2" hp="24" damage="1d6" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="5" coastal="yes" swim="yes" teach="no" getitem="yes">
|
<race name="dolphin" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="2.000000" hp="24" damage="1d6" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="5" coastal="yes" swim="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
|
@ -115,7 +114,7 @@
|
||||||
<skill name="taxation" modifier="-99"/>
|
<skill name="taxation" modifier="-99"/>
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="tiger" maxaura="0" regaura="0" weight="500" capacity="540" speed="1" hp="30" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="3" walk="yes" teach="no" getitem="yes">
|
<race name="tiger" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.000000" hp="30" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="3" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
|
@ -144,7 +143,7 @@
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="hellcat" magres="50" maxaura="0" regaura="0" weight="500" capacity="540" speed="1" hp="40" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="4" walk="yes" teach="no" getitem="yes" resistpierce="yes">
|
<race name="hellcat" magres="50" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.000000" hp="40" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="4" walk="yes" teach="no" getitem="yes" resistpierce="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="perception" modifier="1"/>
|
<skill name="perception" modifier="1"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
|
@ -173,7 +172,7 @@
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="owl" maxaura="0" regaura="0" weight="500" capacity="540" speed="1" hp="9" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="2" defensemodifier="4" fly="yes" walk="yes" teach="no" getitem="yes">
|
<race name="owl" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.000000" hp="9" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="2" defensemodifier="4" fly="yes" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="espionage" modifier="1"/>
|
<skill name="espionage" modifier="1"/>
|
||||||
<skill name="stealth" modifier="1"/>
|
<skill name="stealth" modifier="1"/>
|
||||||
|
@ -203,7 +202,7 @@
|
||||||
<skill name="taxation" modifier="-99"/>
|
<skill name="taxation" modifier="-99"/>
|
||||||
<attack type="4" damage="1d4"/>
|
<attack type="4" damage="1d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="fairy" magres="80" maxaura="1" regaura="1.5" weight="200" capacity="540" speed="1" hp="6" damage="1d3" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="14" fly="yes" walk="yes" teach="no" getitem="yes" equipment="yes">
|
<race name="fairy" magres="80" maxaura="1.000000" regaura="1.500000" weight="200" capacity="540" speed="1.000000" hp="6" damage="1d3" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="14" fly="yes" walk="yes" teach="no" getitem="yes" equipment="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="stealth" modifier="5"/>
|
<skill name="stealth" modifier="5"/>
|
||||||
<skill name="espionage" modifier="2"/>
|
<skill name="espionage" modifier="2"/>
|
||||||
|
@ -237,7 +236,7 @@
|
||||||
<attack type="4" damage="1d3"/>
|
<attack type="4" damage="1d3"/>
|
||||||
<attack type="4" damage="1d3"/>
|
<attack type="4" damage="1d3"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="dreamcat" magres="50" maxaura="1" regaura="1" weight="500" capacity="540" speed="1" hp="10" damage="1d5" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="6" fly="yes" walk="yes" teach="no" getitem="yes" invinciblenonmagic="yes">
|
<race name="dreamcat" magres="50" maxaura="1.000000" regaura="1.000000" weight="500" capacity="540" speed="1.000000" hp="10" damage="1d5" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="6" fly="yes" walk="yes" teach="no" getitem="yes" invinciblenonmagic="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="magic" modifier="1"/>
|
<skill name="magic" modifier="1"/>
|
||||||
<skill name="espionage" modifier="1"/>
|
<skill name="espionage" modifier="1"/>
|
||||||
|
@ -267,7 +266,7 @@
|
||||||
<attack type="4" damage="1d5"/>
|
<attack type="4" damage="1d5"/>
|
||||||
<attack type="4" damage="1d5"/>
|
<attack type="4" damage="1d5"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="imp" magres="50" maxaura="1" regaura="1" weight="500" capacity="540" speed="1" hp="10" ac="1" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="4" fly="yes" walk="yes" teach="no" getitem="yes" equipment="yes">
|
<race name="imp" magres="50" maxaura="1.000000" regaura="1.000000" weight="500" capacity="540" speed="1.000000" hp="10" ac="1" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="4" fly="yes" walk="yes" teach="no" getitem="yes" equipment="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
|
@ -299,7 +298,7 @@
|
||||||
<attack type="1" damage="1d4"/>
|
<attack type="1" damage="1d4"/>
|
||||||
<attack type="6" spell="fiery_dragonbreath" level="3" />
|
<attack type="6" spell="fiery_dragonbreath" level="3" />
|
||||||
</race>
|
</race>
|
||||||
<race name="ghost" magres="80" maxaura="0.5" regaura="0.1" weight="500" capacity="540" speed="1" hp="30" ac="5" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="8" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" equipment="yes" invinciblenonmagic="yes">
|
<race name="ghost" magres="80" maxaura="0.500000" regaura="0.100000" weight="500" capacity="540" speed="1.000000" hp="30" ac="5" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="5" defensemodifier="8" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" equipment="yes" invinciblenonmagic="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
|
@ -329,7 +328,7 @@
|
||||||
<attack type="2" damage="2d30"/>
|
<attack type="2" damage="2d30"/>
|
||||||
<attack type="3" damage="1d1"/>
|
<attack type="3" damage="1d1"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="wolf" maxaura="0" regaura="0" weight="500" capacity="540" speed="1" hp="25" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="3" scarepeasants="yes" walk="yes" teach="no" getitem="yes">
|
<race name="wolf" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.000000" hp="25" damage="2d6" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="3" scarepeasants="yes" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
|
@ -358,7 +357,7 @@
|
||||||
<attack type="4" damage="1d4"/>
|
<attack type="4" damage="1d4"/>
|
||||||
<attack type="4" damage="1d4"/>
|
<attack type="4" damage="1d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="unicorn" magres="90" maxaura="1.5" regaura="1.5" weight="5000" capacity="2000" speed="2" hp="40" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="4" walk="yes" teach="no" getitem="yes">
|
<race name="unicorn" magres="90" maxaura="1.500000" regaura="1.500000" weight="5000" capacity="2000" speed="2.000000" hp="40" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="4" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="9999"/>
|
<ai splitsize="9999"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
|
@ -388,7 +387,7 @@
|
||||||
<attack type="4" damage="3d12"/>
|
<attack type="4" damage="3d12"/>
|
||||||
<attack type="4" damage="2d4"/>
|
<attack type="4" damage="2d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="nymph" magres="90" maxaura="1" regaura="1.5" weight="1000" capacity="540" speed="1" hp="15" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="1" walk="yes" teach="no" getitem="yes" equipment="yes">
|
<race name="nymph" magres="90" maxaura="1.000000" regaura="1.500000" weight="1000" capacity="540" speed="1.000000" hp="15" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="1" walk="yes" teach="no" getitem="yes" equipment="yes">
|
||||||
<ai splitsize="9999"/>
|
<ai splitsize="9999"/>
|
||||||
<skill name="mining" modifier="-99"/>
|
<skill name="mining" modifier="-99"/>
|
||||||
<skill name="bow" modifier="2"/>
|
<skill name="bow" modifier="2"/>
|
||||||
|
@ -417,7 +416,7 @@
|
||||||
<attack type="1" damage="1d4"/>
|
<attack type="1" damage="1d4"/>
|
||||||
<attack type="2" damage="2d20"/>
|
<attack type="2" damage="2d20"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="songdragon" magres="99" maxaura="1" regaura="1" weight="1000" capacity="600" speed="1.5" hp="40" ac="1" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="1" fly="yes" walk="yes" teach="no" getitem="yes" unarmedguard="yes">
|
<race name="songdragon" magres="99" maxaura="1.000000" regaura="1.000000" weight="1000" capacity="600" speed="1.500000" hp="40" ac="1" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="1" fly="yes" walk="yes" teach="no" getitem="yes" unarmedguard="yes">
|
||||||
<ai splitsize="9999"/>
|
<ai splitsize="9999"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
|
@ -448,7 +447,7 @@
|
||||||
<attack type="4" damage="2d4"/>
|
<attack type="4" damage="2d4"/>
|
||||||
<attack type="6" spell="fiery_dragonbreath" level="3" />
|
<attack type="6" spell="fiery_dragonbreath" level="3" />
|
||||||
</race>
|
</race>
|
||||||
<race name="rat" maxaura="0" regaura="0" weight="100" capacity="540" speed="1" hp="10" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="1" defensemodifier="1" walk="yes" teach="no" getitem="yes">
|
<race name="rat" maxaura="0.000000" regaura="0.000000" weight="100" capacity="540" speed="1.000000" hp="10" damage="1d4" unarmedattack="0" unarmeddefense="0" attackmodifier="1" defensemodifier="1" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="9999"/>
|
<ai splitsize="9999"/>
|
||||||
<skill name="espionage" modifier="5"/>
|
<skill name="espionage" modifier="5"/>
|
||||||
<skill name="stealth" modifier="4"/>
|
<skill name="stealth" modifier="4"/>
|
||||||
|
@ -479,7 +478,7 @@
|
||||||
<attack type="4" damage="1d4"/>
|
<attack type="4" damage="1d4"/>
|
||||||
<attack type="4" damage="1d4"/>
|
<attack type="4" damage="1d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="eagle" maxaura="0" regaura="0" weight="500" capacity="540" speed="1.5" hp="15" damage="2d3" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="2" fly="yes" walk="yes" teach="no" getitem="yes">
|
<race name="eagle" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.500000" hp="15" damage="2d3" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="2" fly="yes" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="9999"/>
|
<ai splitsize="9999"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
|
@ -508,7 +507,7 @@
|
||||||
<skill name="taxation" modifier="-99"/>
|
<skill name="taxation" modifier="-99"/>
|
||||||
<attack type="4" damage="2d3"/>
|
<attack type="4" damage="2d3"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="tunnelworm" magres="80" maxaura="0" regaura="0" weight="30000" capacity="10000" speed="1" hp="300" ac="6" damage="3d20" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="1" scarepeasants="yes" walk="yes" teach="no" getitem="yes">
|
<race name="tunnelworm" magres="80" maxaura="0.000000" regaura="0.000000" weight="30000" capacity="10000" speed="1.000000" hp="300" ac="6" damage="3d20" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="1" scarepeasants="yes" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="99999"/>
|
<ai splitsize="99999"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
|
@ -540,7 +539,7 @@
|
||||||
<attack type="4" damage="3d20"/>
|
<attack type="4" damage="3d20"/>
|
||||||
<attack type="8" damage="1d10"/>
|
<attack type="8" damage="1d10"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="lynx" maxaura="0" regaura="0" weight="500" capacity="540" speed="1" hp="20" damage="2d3" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="5" walk="yes" teach="no" getitem="yes">
|
<race name="lynx" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.000000" hp="20" damage="2d3" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="5" walk="yes" teach="no" getitem="yes">
|
||||||
<ai splitsize="99999"/>
|
<ai splitsize="99999"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
|
@ -570,16 +569,16 @@
|
||||||
<skill name="taxation" modifier="-99"/>
|
<skill name="taxation" modifier="-99"/>
|
||||||
<attack type="4" damage="2d3"/>
|
<attack type="4" damage="2d3"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="direwolf" maxaura="0" regaura="0" weight="500" capacity="540" speed="1" hp="20" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="1" walk="yes" teach="no" giveperson="yes">
|
<race name="direwolf" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.000000" hp="20" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="1" walk="yes" teach="no" giveperson="yes">
|
||||||
<ai splitsize="5000"/>
|
<ai splitsize="5000"/>
|
||||||
<attack type="4" damage="2d4"/>
|
<attack type="4" damage="2d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="peasant" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1" hp="20" damage="1d6" unarmedattack="0" unarmeddefense="0" cannotmove="yes" teach="no">
|
<race name="peasant" maxaura="1.000000" regaura="1.000000" weight="1000" capacity="540" speed="1.000000" hp="20" damage="1d6" unarmedattack="0" unarmeddefense="0" cannotmove="yes" teach="no">
|
||||||
<ai splitsize="10000"/>
|
<ai splitsize="10000"/>
|
||||||
<attack type="1" damage="1d6"/>
|
<attack type="1" damage="1d6"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="braineater" magres="90" maxaura="1"
|
<race name="braineater" magres="90" maxaura="1.000000"
|
||||||
regaura="1" weight="100" capacity="540" speed="1" hp="20" damage="0d0" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="10" scarepeasants="yes" fly="yes" walk="yes" teach="no" invinciblenonmagic="yes">
|
regaura="1.000000" weight="100" capacity="540" speed="1.000000" hp="20" damage="0d0" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="10" scarepeasants="yes" fly="yes" walk="yes" teach="no" invinciblenonmagic="yes">
|
||||||
<ai splitsize="500" killpeasants="yes" moverandom="yes" learn="yes"/>
|
<ai splitsize="500" killpeasants="yes" moverandom="yes" learn="yes"/>
|
||||||
<attack type="2" damage="3d15"/>
|
<attack type="2" damage="3d15"/>
|
||||||
<attack type="3" damage="1d1"/>
|
<attack type="3" damage="1d1"/>
|
||||||
|
@ -649,34 +648,34 @@
|
||||||
<skill name="stamina" modifier="-10"/>
|
<skill name="stamina" modifier="-10"/>
|
||||||
<attack type="4" damage="1d2"/>
|
<attack type="4" damage="1d2"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="mountainguard" unarmedguard="yes" magres="50" maxaura="1" regaura="0.5" weight="10000" capacity="2000" speed="0" hp="1000" ac="12" damage="2d40" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="8" cannotmove="yes" canlearn="no" teach="no" noweapons="yes">
|
<race name="mountainguard" unarmedguard="yes" magres="50" maxaura="1.000000" regaura="0.500000" weight="10000" capacity="2000" speed="0.000000" hp="1000" ac="12" damage="2d40" unarmedattack="0" unarmeddefense="0" attackmodifier="6" defensemodifier="8" cannotmove="yes" learn="no" teach="no" noweapons="yes">
|
||||||
<ai splitsize="1"/>
|
<ai splitsize="1"/>
|
||||||
<attack type="4" damage="2d40"/>
|
<attack type="4" damage="2d40"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="shadowmaster" cansail="no" cansteal="no" canlearn="no" magres="75" maxaura="1" regaura="2" weight="500" capacity="540" speed="1" hp="150" ac="4" damage="2d5" unarmedattack="0" unarmeddefense="0" attackmodifier="11" defensemodifier="13" scarepeasants="yes" walk="yes" teach="no" desert="yes">
|
<race name="shadowmaster" cansail="no" cansteal="no" learn="no" magres="75" maxaura="1.000000" regaura="2.000000" weight="500" capacity="540" speed="1.000000" hp="150" ac="4" damage="2d5" unarmedattack="0" unarmeddefense="0" attackmodifier="11" defensemodifier="13" scarepeasants="yes" walk="yes" teach="no" desert="yes">
|
||||||
<ai splitsize="50" killpeasants="yes" moverandom="yes" learn="yes"/>
|
<ai splitsize="50" killpeasants="yes" moverandom="yes" learn="yes"/>
|
||||||
<attack type="4" damage="2d4"/>
|
<attack type="4" damage="2d4"/>
|
||||||
<attack type="2" damage="2d30"/>
|
<attack type="2" damage="2d30"/>
|
||||||
<attack type="3" damage="1d2"/>
|
<attack type="3" damage="1d2"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="shadowdemon" cansail="no" cansteal="no" canlearn="no" magres="75" maxaura="1" regaura="1" weight="500" capacity="540" speed="1" hp="50" ac="3" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="8" defensemodifier="11" scarepeasants="yes" walk="yes" teach="no" desert="yes" recruitethereal="yes">
|
<race name="shadowdemon" cansail="no" cansteal="no" learn="no" magres="75" maxaura="1.000000" regaura="1.000000" weight="500" capacity="540" speed="1.000000" hp="50" ac="3" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="8" defensemodifier="11" scarepeasants="yes" walk="yes" teach="no" desert="yes" recruitethereal="yes">
|
||||||
<ai splitsize="1000" killpeasants="yes" moverandom="yes" learn="yes"/>
|
<ai splitsize="1000" killpeasants="yes" moverandom="yes" learn="yes"/>
|
||||||
<attack type="4" damage="2d3"/>
|
<attack type="4" damage="2d3"/>
|
||||||
<attack type="3" damage="1d1"/>
|
<attack type="3" damage="1d1"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="stonegolem" stonegolem="true" magres="25" maxaura="1" regaura="0.100000" weight="10000" capacity="2000" speed="1" hp="60" ac="4" damage="2d12+6" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="2" walk="yes" canlearn="no" teach="no">
|
<race name="stonegolem" stonegolem="true" magres="25" maxaura="1.000000" regaura="0.100000" weight="10000" capacity="2000" speed="1.000000" hp="60" ac="4" damage="2d12+6" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="2" walk="yes" learn="no" teach="no">
|
||||||
<ai splitsize="50"/>
|
<ai splitsize="50"/>
|
||||||
<skill name="building" modifier="14"/>
|
<skill name="building" modifier="14"/>
|
||||||
<skill name="roadwork" modifier="14"/>
|
<skill name="roadwork" modifier="14"/>
|
||||||
<attack type="4" damage="2d10+4"/>
|
<attack type="4" damage="2d10+4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="irongolem" irongolem="true" magres="25" maxaura="1" regaura="0.100000" weight="10000" capacity="2000" speed="1" hp="50" ac="2" damage="2d10+4" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="2" walk="yes" canlearn="no" teach="no">
|
<race name="irongolem" irongolem="true" magres="25" maxaura="1.000000" regaura="0.100000" weight="10000" capacity="2000" speed="1.000000" hp="50" ac="2" damage="2d10+4" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="2" walk="yes" learn="no" teach="no">
|
||||||
<ai splitsize="50"/>
|
<ai splitsize="50"/>
|
||||||
<skill name="armorer" modifier="14"/>
|
<skill name="armorer" modifier="14"/>
|
||||||
<skill name="weaponsmithing" modifier="14"/>
|
<skill name="weaponsmithing" modifier="14"/>
|
||||||
<attack type="4" damage="2d8+4"/>
|
<attack type="4" damage="2d8+4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="spell" maxaura="1" regaura="0.100000" weight="0" capacity="0" speed="0" hp="1" damage="1d4" unarmedattack="-2" unarmeddefense="-2" canlearn="no" noheal="yes" noweapons="yes" illusionary="yes" invisible="yes" fly="yes" swim="yes" walk="yes">
|
<race name="spell" maxaura="1" regaura="0.100000" weight="0" capacity="0" speed="0" hp="1" damage="1d4" unarmedattack="-2" unarmeddefense="-2" learn="no" noheal="yes" noweapons="yes" illusionary="yes" invisible="yes" fly="yes" swim="yes" walk="yes">
|
||||||
<ai splitsize="1"/>
|
<ai splitsize="1"/>
|
||||||
<attack type="1" damage="1d4"/>
|
<attack type="1" damage="1d4"/>
|
||||||
</race>
|
</race>
|
||||||
|
@ -684,25 +683,25 @@
|
||||||
<ai splitsize="1"/>
|
<ai splitsize="1"/>
|
||||||
<attack type="1" damage="1d4"/>
|
<attack type="1" damage="1d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="dracoid" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" walk="yes" teach="no" giveperson="yes" getitem="yes" equipment="yes">
|
<race name="dracoid" maxaura="1.000000" regaura="1.000000" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" walk="yes" teach="no" giveperson="yes" getitem="yes" equipment="yes">
|
||||||
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
<attack type="4" damage="1d6"/>
|
<attack type="4" damage="1d6"/>
|
||||||
<attack type="1" damage="1d5"/>
|
<attack type="1" damage="1d5"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="catdragon" magres="90" maxaura="1" regaura="1" weight="20000" capacity="10000" speed="1" hp="20" damage="2d40" unarmedattack="0" unarmeddefense="0" defensemodifier="50" fly="yes" walk="yes" teach="no" shapeshift="yes" giveperson="yes" getitem="yes" dragon="yes">
|
<race name="catdragon" magres="90" maxaura="1.000000" regaura="1.000000" weight="20000" capacity="10000" speed="1.000000" hp="20" damage="2d40" unarmedattack="0" unarmeddefense="0" defensemodifier="50" fly="yes" walk="yes" teach="no" shapeshift="yes" giveperson="yes" getitem="yes" dragon="yes">
|
||||||
<ai splitsize="1"/>
|
<ai splitsize="1"/>
|
||||||
<attack type="4" damage="2d40"/>
|
<attack type="4" damage="2d40"/>
|
||||||
<attack type="4" damage="2d40"/>
|
<attack type="4" damage="2d40"/>
|
||||||
<attack type="4" damage="2d40"/>
|
<attack type="4" damage="2d40"/>
|
||||||
<attack type="4" damage="2d40"/>
|
<attack type="4" damage="2d40"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="ent" magres="25" maxaura="1" regaura="0.5" weight="5000" capacity="2500" speed="1" hp="50" ac="4" damage="2d4+12" unarmedattack="0" unarmeddefense="0" attackmodifier="9" defensemodifier="7" scarepeasants="yes" walk="yes" teach="no">
|
<race name="ent" magres="25" maxaura="1.000000" regaura="0.500000" weight="5000" capacity="2500" speed="1.000000" hp="50" ac="4" damage="2d4+12" unarmedattack="0" unarmeddefense="0" attackmodifier="9" defensemodifier="7" scarepeasants="yes" walk="yes" teach="no">
|
||||||
<ai splitsize="1000" moverandom="yes" learn="yes"/>
|
<ai splitsize="1000" moverandom="yes" learn="yes"/>
|
||||||
<attack type="4" damage="2d12"/>
|
<attack type="4" damage="2d12"/>
|
||||||
<attack type="4" damage="2d12"/>
|
<attack type="4" damage="2d12"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="wyrm" magres="90" maxaura="1" regaura="3" weight="18000" capacity="1000000" speed="1" hp="2700" ac="8" damage="2d60" unarmedattack="0" unarmeddefense="0" attackmodifier="10" defensemodifier="10" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" resistbash="yes" dragon="yes" unarmedguard="yes">
|
<race name="wyrm" magres="90" maxaura="1.000000" regaura="3.000000" weight="18000" capacity="1000000" speed="1.000000" hp="2700" ac="8" damage="2d60" unarmedattack="0" unarmeddefense="0" attackmodifier="10" defensemodifier="10" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" resistbash="yes" dragon="yes" unarmedguard="yes">
|
||||||
<ai splitsize="1" killpeasants="yes" learn="yes"/>
|
<ai splitsize="1" killpeasants="yes" learn="yes"/>
|
||||||
<skill name="magic" modifier="12"/>
|
<skill name="magic" modifier="12"/>
|
||||||
<skill name="tactics" modifier="12"/>
|
<skill name="tactics" modifier="12"/>
|
||||||
|
@ -712,7 +711,7 @@
|
||||||
<attack type="4" damage="5d30"/>
|
<attack type="4" damage="5d30"/>
|
||||||
<attack type="6" spell="powerful_dragonbreath" level="12" />
|
<attack type="6" spell="powerful_dragonbreath" level="12" />
|
||||||
</race>
|
</race>
|
||||||
<race name="dragon" magres="70" maxaura="1" regaura="2" weight="10000" capacity="1000000" speed="1.5" hp="900" ac="6" damage="2d30" unarmedattack="0" unarmeddefense="0" attackmodifier="7" defensemodifier="7" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" resistbash="yes" unarmedguard="yes" dragon="yes">
|
<race name="dragon" magres="70" maxaura="1.000000" regaura="2.000000" weight="10000" capacity="1000000" speed="1.500000" hp="900" ac="6" damage="2d30" unarmedattack="0" unarmeddefense="0" attackmodifier="7" defensemodifier="7" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" resistbash="yes" unarmedguard="yes" dragon="yes">
|
||||||
<ai splitsize="2" killpeasants="yes" learn="yes"/>
|
<ai splitsize="2" killpeasants="yes" learn="yes"/>
|
||||||
<skill name="magic" modifier="8"/>
|
<skill name="magic" modifier="8"/>
|
||||||
<skill name="tactics" modifier="8"/>
|
<skill name="tactics" modifier="8"/>
|
||||||
|
@ -722,7 +721,7 @@
|
||||||
<attack type="4" damage="3d30"/>
|
<attack type="4" damage="3d30"/>
|
||||||
<attack type="6" spell="icy_dragonbreath" level="6" />
|
<attack type="6" spell="icy_dragonbreath" level="6" />
|
||||||
</race>
|
</race>
|
||||||
<race name="youngdragon" magres="50" maxaura="1" regaura="1" weight="20000" capacity="10000" speed="1" hp="300" ac="4" damage="2d15" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="4" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" resistbash="yes" unarmedguard="yes">
|
<race name="youngdragon" magres="50" maxaura="1.000000" regaura="1.000000" weight="20000" capacity="10000" speed="1.000000" hp="300" ac="4" damage="2d15" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="4" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" resistbash="yes" unarmedguard="yes">
|
||||||
<ai splitsize="6" killpeasants="yes" learn="yes"/>
|
<ai splitsize="6" killpeasants="yes" learn="yes"/>
|
||||||
<skill name="magic" modifier="4"/>
|
<skill name="magic" modifier="4"/>
|
||||||
<skill name="tactics" modifier="4"/>
|
<skill name="tactics" modifier="4"/>
|
||||||
|
@ -733,7 +732,7 @@
|
||||||
<attack type="4" damage="1d30"/>
|
<attack type="4" damage="1d30"/>
|
||||||
<attack type="6" spell="fiery_dragonbreath" level="3" />
|
<attack type="6" spell="fiery_dragonbreath" level="3" />
|
||||||
</race>
|
</race>
|
||||||
<race name="undead" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1" hp="20" damage="1d7" unarmedattack="0" unarmeddefense="0" attackmodifier="1" defensemodifier="1" scarepeasants="yes" walk="yes" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" giveperson="yes">
|
<race name="undead" maxaura="1.000000" regaura="1.000000" weight="1000" capacity="540" speed="1.000000" hp="20" damage="1d7" unarmedattack="0" unarmeddefense="0" attackmodifier="1" defensemodifier="1" scarepeasants="yes" walk="yes" learn="no" teach="no" noheal="yes" undead="yes" equipment="yes" giveperson="yes">
|
||||||
<ai splitsize="20000" moverandom="yes"/>
|
<ai splitsize="20000" moverandom="yes"/>
|
||||||
<attack type="4" damage="1d7"/>
|
<attack type="4" damage="1d7"/>
|
||||||
<attack type="5"/>
|
<attack type="5"/>
|
||||||
|
@ -783,7 +782,7 @@
|
||||||
</race>
|
</race>
|
||||||
<race name="halfling" magres="5" maxaura="1" regaura="1" recruitcost="80" maintenance="10" weight="1000" capacity="540" speed="1" hp="18" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
|
<race name="halfling" magres="5" maxaura="1" regaura="1" recruitcost="80" maintenance="10" weight="1000" capacity="540" speed="1" hp="18" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
|
||||||
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
||||||
<param name="hunger.damage" value="1d14+14"/>
|
<param name="hunger_damage" value="1d14+14"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="mining" modifier="1"/>
|
<skill name="mining" modifier="1"/>
|
||||||
<skill name="bow" modifier="-1"/>
|
<skill name="bow" modifier="-1"/>
|
||||||
|
@ -925,7 +924,7 @@
|
||||||
<familiar race="rat"/>
|
<familiar race="rat"/>
|
||||||
<familiar race="imp"/>
|
<familiar race="imp"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="clone" magres="90" maxaura="0" regaura="0" weight="1000" capacity="540" speed="1" hp="40" damage="0d0" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" canlearn="no" teach="no" noheal="yes">
|
<race name="clone" magres="90" maxaura="0.000000" regaura="0.000000" weight="1000" capacity="540" speed="1.000000" hp="40" damage="0d0" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" learn="no" teach="no" noheal="yes">
|
||||||
<ai splitsize="10000"/>
|
<ai splitsize="10000"/>
|
||||||
<skill name="alchemy" modifier="-99"/>
|
<skill name="alchemy" modifier="-99"/>
|
||||||
<skill name="crossbow" modifier="-99"/>
|
<skill name="crossbow" modifier="-99"/>
|
||||||
|
@ -962,7 +961,7 @@
|
||||||
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
||||||
<attack type="1" damage="1d4"/>
|
<attack type="1" damage="1d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="gnome" magres="100" maxaura="0" regaura="0" weight="1000" capacity="540" speed="1" hp="50" damage="1d4" unarmedattack="10" unarmeddefense="10" attackmodifier="10" defensemodifier="10" walk="yes" teach="no">
|
<race name="gnome" magres="100" maxaura="0.000000" regaura="0.000000" weight="1000" capacity="540" speed="1.000000" hp="50" damage="1d4" unarmedattack="10" unarmeddefense="10" attackmodifier="10" defensemodifier="10" walk="yes" teach="no">
|
||||||
<ai splitsize="10000"/>
|
<ai splitsize="10000"/>
|
||||||
<skill name="tactics" modifier="1"/>
|
<skill name="tactics" modifier="1"/>
|
||||||
<skill name="perception" modifier="1"/>
|
<skill name="perception" modifier="1"/>
|
||||||
|
@ -970,7 +969,7 @@
|
||||||
<skill name="unarmed" modifier="1"/>
|
<skill name="unarmed" modifier="1"/>
|
||||||
<attack type="1" damage="1d4"/>
|
<attack type="1" damage="1d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="museumghost" magres="100" maxaura="0" regaura="0" weight="1000" capacity="540" speed="1" hp="50" damage="1d4" unarmedattack="10" unarmeddefense="10" attackmodifier="10" defensemodifier="10" walk="yes" teach="no">
|
<race name="museumghost" magres="100" maxaura="0.000000" regaura="0.000000" weight="1000" capacity="540" speed="1.000000" hp="50" damage="1d4" unarmedattack="10" unarmeddefense="10" attackmodifier="10" defensemodifier="10" walk="yes" teach="no">
|
||||||
<ai splitsize="10000"/>
|
<ai splitsize="10000"/>
|
||||||
<skill name="tactics" modifier="1"/>
|
<skill name="tactics" modifier="1"/>
|
||||||
<skill name="perception" modifier="1"/>
|
<skill name="perception" modifier="1"/>
|
||||||
|
@ -984,7 +983,7 @@
|
||||||
<attack type="2" damage="5d600"/>
|
<attack type="2" damage="5d600"/>
|
||||||
<attack type="1" damage="1d4"/>
|
<attack type="1" damage="1d4"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="ghast" magres="60" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1" hp="60" ac="2" damage="1d7" unarmedattack="6" unarmeddefense="6" attackmodifier="6" defensemodifier="6" scarepeasants="yes" walk="yes" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" giveperson="yes">
|
<race name="ghast" magres="60" maxaura="1.000000" regaura="1.000000" weight="1000" capacity="540" speed="1.000000" hp="60" ac="2" damage="1d7" unarmedattack="6" unarmeddefense="6" attackmodifier="6" defensemodifier="6" scarepeasants="yes" walk="yes" learn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" giveperson="yes">
|
||||||
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
|
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="bow" modifier="1"/>
|
<skill name="bow" modifier="1"/>
|
||||||
|
@ -1001,7 +1000,7 @@
|
||||||
<attack type="2" damage="1d30"/>
|
<attack type="2" damage="1d30"/>
|
||||||
<attack type="2" damage="1d30"/>
|
<attack type="2" damage="1d30"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="ghoul" magres="30" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1" hp="30" ac="1" damage="1d7" unarmedattack="3" unarmeddefense="3" attackmodifier="3" defensemodifier="3" scarepeasants="yes" walk="yes" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" giveperson="yes">
|
<race name="ghoul" magres="30" maxaura="1.000000" regaura="1.000000" weight="1000" capacity="540" speed="1.000000" hp="30" ac="1" damage="1d7" unarmedattack="3" unarmeddefense="3" attackmodifier="3" defensemodifier="3" scarepeasants="yes" walk="yes" learn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" giveperson="yes">
|
||||||
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
|
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="bow" modifier="1"/>
|
<skill name="bow" modifier="1"/>
|
||||||
|
@ -1017,7 +1016,7 @@
|
||||||
<attack type="3" damage="1d2"/>
|
<attack type="3" damage="1d2"/>
|
||||||
<attack type="2" damage="1d30"/>
|
<attack type="2" damage="1d30"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="juju" magres="50" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1" hp="80" ac="2" damage="1d7" unarmedattack="6" unarmeddefense="6" attackmodifier="8" defensemodifier="8" scarepeasants="yes" walk="yes" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistbash="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
<race name="juju" magres="50" maxaura="1.000000" regaura="1.000000" weight="1000" capacity="540" speed="1.000000" hp="80" ac="2" damage="1d7" unarmedattack="6" unarmeddefense="6" attackmodifier="8" defensemodifier="8" scarepeasants="yes" walk="yes" learn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistbash="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
||||||
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
|
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="bow" modifier="1"/>
|
<skill name="bow" modifier="1"/>
|
||||||
|
@ -1032,7 +1031,7 @@
|
||||||
<attack type="3" damage="1d1"/>
|
<attack type="3" damage="1d1"/>
|
||||||
<attack type="3" damage="1d1"/>
|
<attack type="3" damage="1d1"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="zombie" magres="20" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1" hp="40" ac="1" damage="1d7" unarmedattack="2" unarmeddefense="2" attackmodifier="5" defensemodifier="5" scarepeasants="yes" walk="yes" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
<race name="zombie" magres="20" maxaura="1.000000" regaura="1.000000" weight="1000" capacity="540" speed="1.000000" hp="40" ac="1" damage="1d7" unarmedattack="2" unarmeddefense="2" attackmodifier="5" defensemodifier="5" scarepeasants="yes" walk="yes" learn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
||||||
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
|
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="bow" modifier="1"/>
|
<skill name="bow" modifier="1"/>
|
||||||
|
@ -1045,7 +1044,7 @@
|
||||||
<skill name="unarmed" modifier="1"/>
|
<skill name="unarmed" modifier="1"/>
|
||||||
<attack type="1" damage="1d7"/>
|
<attack type="1" damage="1d7"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="skeletonlord" magres="30" maxaura="1" regaura="1" weight="1000" capacity="540" speed="1" hp="60" ac="4" damage="1d7" unarmedattack="6" unarmeddefense="6" attackmodifier="8" defensemodifier="8" scarepeasants="yes" walk="yes" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
<race name="skeletonlord" magres="30" maxaura="1.000000" regaura="1.000000" weight="1000" capacity="540" speed="1.000000" hp="60" ac="4" damage="1d7" unarmedattack="6" unarmeddefense="6" attackmodifier="8" defensemodifier="8" scarepeasants="yes" walk="yes" learn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
||||||
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
|
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="bow" modifier="1"/>
|
<skill name="bow" modifier="1"/>
|
||||||
|
@ -1059,7 +1058,7 @@
|
||||||
<attack type="1" damage="1d7"/>
|
<attack type="1" damage="1d7"/>
|
||||||
<attack type="1" damage="1d7"/>
|
<attack type="1" damage="1d7"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="skeleton" magres="10" maxaura="1" regaura="1" weight="500" capacity="540" speed="1" hp="20" ac="1" damage="1d7" unarmedattack="1" unarmeddefense="1" attackmodifier="6" defensemodifier="6" scarepeasants="yes" walk="yes" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
<race name="skeleton" magres="10" maxaura="1.000000" regaura="1.000000" weight="500" capacity="540" speed="1.000000" hp="20" ac="1" damage="1d7" unarmedattack="1" unarmeddefense="1" attackmodifier="6" defensemodifier="6" scarepeasants="yes" walk="yes" learn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes" giveperson="yes">
|
||||||
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
|
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="bow" modifier="1"/>
|
<skill name="bow" modifier="1"/>
|
||||||
|
@ -1072,11 +1071,11 @@
|
||||||
<skill name="unarmed" modifier="1"/>
|
<skill name="unarmed" modifier="1"/>
|
||||||
<attack type="1" damage="1d7"/>
|
<attack type="1" damage="1d7"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="shadowknight" maxaura="0" regaura="0" weight="0" capacity="540" speed="1" hp="1" damage="1d1" unarmedattack="0" unarmeddefense="0" attackmodifier="1" defensemodifier="1" scarepeasants="yes" walk="yes" canlearn="no" teach="no" noblock="yes">
|
<race name="shadowknight" maxaura="0.000000" regaura="0.000000" weight="0" capacity="540" speed="1.000000" hp="1" damage="1d1" unarmedattack="0" unarmeddefense="0" attackmodifier="1" defensemodifier="1" scarepeasants="yes" walk="yes" learn="no" teach="no" noblock="yes">
|
||||||
<ai splitsize="20000" moverandom="yes"/>
|
<ai splitsize="20000" moverandom="yes"/>
|
||||||
<attack type="1" damage="1d1"/>
|
<attack type="1" damage="1d1"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="seaserpent" magres="50" maxaura="1" regaura="1" weight="20000" capacity="5000" speed="1" hp="600" ac="3" damage="2d15" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="4" scarepeasants="yes" swim="yes" teach="no" getitem="yes" resistbash="yes" unarmedguard="yes">
|
<race name="seaserpent" magres="50" maxaura="1.000000" regaura="1.000000" weight="20000" capacity="5000" speed="1.000000" hp="600" ac="3" damage="2d15" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="4" scarepeasants="yes" swim="yes" teach="no" getitem="yes" resistbash="yes" unarmedguard="yes">
|
||||||
<ai splitsize="6" killpeasants="yes" moverandom="yes" learn="yes" moveattack="yes"/>
|
<ai splitsize="6" killpeasants="yes" moverandom="yes" learn="yes" moveattack="yes"/>
|
||||||
<skill name="tactics" modifier="4"/>
|
<skill name="tactics" modifier="4"/>
|
||||||
<attack type="4" damage="1d30"/>
|
<attack type="4" damage="1d30"/>
|
||||||
|
@ -1203,7 +1202,7 @@
|
||||||
<familiar race="wolf"/>
|
<familiar race="wolf"/>
|
||||||
<familiar race="demon"/>
|
<familiar race="demon"/>
|
||||||
</race>
|
</race>
|
||||||
<race name="shadowdragon" magres="95" maxaura="1" regaura="3" weight="100" capacity="100000" speed="1" hp="2700" ac="10" damage="2d60" unarmedattack="0" unarmeddefense="0" attackmodifier="10" defensemodifier="12" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" resistbash="yes">
|
<race name="shadowdragon" magres="95" maxaura="1.000000" regaura="3.000000" weight="100" capacity="100000" speed="1.000000" hp="2700" ac="10" damage="2d60" unarmedattack="0" unarmeddefense="0" attackmodifier="10" defensemodifier="12" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" resistbash="yes">
|
||||||
<ai splitsize="1" killpeasants="yes" learn="yes"/>
|
<ai splitsize="1" killpeasants="yes" learn="yes"/>
|
||||||
<skill name="tactics" modifier="20"/>
|
<skill name="tactics" modifier="20"/>
|
||||||
<skill name="perception" modifier="20"/>
|
<skill name="perception" modifier="20"/>
|
||||||
|
|
|
@ -6,7 +6,6 @@ attackmodifier="7" defensemodifier="7" scarepeasants="yes" fly="yes"
|
||||||
income="1000" walk="yes" teach="no" getitem="yes" resistbash="yes"
|
income="1000" walk="yes" teach="no" getitem="yes" resistbash="yes"
|
||||||
dragon="yes">
|
dragon="yes">
|
||||||
<ai splitsize="2" killpeasants="yes" learn="yes" scare="400"/>
|
<ai splitsize="2" killpeasants="yes" learn="yes" scare="400"/>
|
||||||
<function name="name" value="namedragon"/>
|
|
||||||
<skill name="magic" modifier="8"/>
|
<skill name="magic" modifier="8"/>
|
||||||
<skill name="tactics" modifier="8"/>
|
<skill name="tactics" modifier="8"/>
|
||||||
<attack type="4" damage="2d20"/>
|
<attack type="4" damage="2d20"/>
|
||||||
|
|
|
@ -7,7 +7,7 @@ speed="1.0" hp="16" damage="1d5" unarmedattack="-2" unarmeddefense="0"
|
||||||
playerrace="yes" walk="yes" giveperson="yes" giveunit="yes"
|
playerrace="yes" walk="yes" giveperson="yes" giveunit="yes"
|
||||||
getitem="yes" equipment="yes" healing="2.0">
|
getitem="yes" equipment="yes" healing="2.0">
|
||||||
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
||||||
<param name="hunger.damage" value="1d8+7"/>
|
<param name="hunger_damage" value="1d8+7"/>
|
||||||
<param name="other_race" value="demon"/>
|
<param name="other_race" value="demon"/>
|
||||||
<param name="recruit_multi" value="0.5"/>
|
<param name="recruit_multi" value="0.5"/>
|
||||||
<skill name="cartmaking" modifier="-1"/>
|
<skill name="cartmaking" modifier="-1"/>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" ?>
|
<?xml version="1.0" ?>
|
||||||
<race name="halfling" magres="5" maxaura="1.000000" regaura="1.000000" recruitcost="80" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="18" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
|
<race name="halfling" magres="5" maxaura="1.000000" regaura="1.000000" recruitcost="80" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="18" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
|
||||||
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
<ai splitsize="10000" moverandom="yes" learn="yes"/>
|
||||||
<param name="hunger.damage" value="1d14+14"/>
|
<param name="hunger_damage" value="1d14+14"/>
|
||||||
<skill name="crossbow" modifier="1"/>
|
<skill name="crossbow" modifier="1"/>
|
||||||
<skill name="mining" modifier="1"/>
|
<skill name="mining" modifier="1"/>
|
||||||
<skill name="bow" modifier="-1"/>
|
<skill name="bow" modifier="-1"/>
|
||||||
|
|
|
@ -7,7 +7,6 @@ damage="2d60" unarmedattack="0" unarmeddefense="0" attackmodifier="10"
|
||||||
defensemodifier="10" scarepeasants="yes" fly="yes" walk="yes"
|
defensemodifier="10" scarepeasants="yes" fly="yes" walk="yes"
|
||||||
teach="no" getitem="yes" resistbash="yes" dragon="yes" income="5000">
|
teach="no" getitem="yes" resistbash="yes" dragon="yes" income="5000">
|
||||||
<ai splitsize="1" killpeasants="yes" learn="yes" scare="1000"/>
|
<ai splitsize="1" killpeasants="yes" learn="yes" scare="1000"/>
|
||||||
<function name="name" value="namedragon"/>
|
|
||||||
<skill name="magic" modifier="12"/>
|
<skill name="magic" modifier="12"/>
|
||||||
<skill name="tactics" modifier="12"/>
|
<skill name="tactics" modifier="12"/>
|
||||||
<attack type="4" damage="3d20"/>
|
<attack type="4" damage="3d20"/>
|
||||||
|
|
|
@ -6,7 +6,6 @@ damage="2d15" unarmedattack="0" unarmeddefense="0" attackmodifier="4"
|
||||||
defensemodifier="4" scarepeasants="yes" fly="yes" walk="yes"
|
defensemodifier="4" scarepeasants="yes" fly="yes" walk="yes"
|
||||||
teach="no" getitem="yes" resistbash="yes" dragon="yes" income="150">
|
teach="no" getitem="yes" resistbash="yes" dragon="yes" income="150">
|
||||||
<ai splitsize="6" killpeasants="yes" learn="yes" scare="160"/>
|
<ai splitsize="6" killpeasants="yes" learn="yes" scare="160"/>
|
||||||
<function name="name" value="namedragon"/>
|
|
||||||
<skill name="magic" modifier="4"/>
|
<skill name="magic" modifier="4"/>
|
||||||
<skill name="tactics" modifier="4"/>
|
<skill name="tactics" modifier="4"/>
|
||||||
<attack type="4" damage="1d30"/>
|
<attack type="4" damage="1d30"/>
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: \n"
|
||||||
|
"POT-Creation-Date: \n"
|
||||||
|
"PO-Revision-Date: \n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"X-Generator: Poedit 2.0.7\n"
|
||||||
|
|
||||||
msgid "homestone_effect"
|
msgid "homestone_effect"
|
||||||
msgstr "\"Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde in die Mauern von $building($building).\""
|
msgstr "\"Mit einem Ritual bindet $unit($mage) die magischen Kräfte der Erde in die Mauern von $building($building).\""
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: \n"
|
||||||
|
"POT-Creation-Date: \n"
|
||||||
|
"PO-Revision-Date: \n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Language: en\n"
|
||||||
|
"X-Generator: Poedit 2.0.7\n"
|
||||||
|
|
||||||
msgid "homestone_effect"
|
msgid "homestone_effect"
|
||||||
msgstr "\"A magic ritual by $unit($mage) binds magic energies to the walls of $building($building).\""
|
msgstr "\"A magic ritual by $unit($mage) binds magic energies to the walls of $building($building).\""
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: \n"
|
||||||
|
"POT-Creation-Date: \n"
|
||||||
|
"PO-Revision-Date: \n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"X-Generator: Poedit 2.0.7\n"
|
||||||
|
|
||||||
msgid "catamaran_a"
|
msgid "catamaran_a"
|
||||||
msgstr "ein Katamaran"
|
msgstr "ein Katamaran"
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: \n"
|
||||||
|
"POT-Creation-Date: \n"
|
||||||
|
"PO-Revision-Date: \n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Language: en\n"
|
||||||
|
"X-Generator: Poedit 2.0.7\n"
|
||||||
|
|
||||||
msgid "catamaran_a"
|
msgid "catamaran_a"
|
||||||
msgstr "a catamaran"
|
msgstr "a catamaran"
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: \n"
|
||||||
|
"POT-Creation-Date: \n"
|
||||||
|
"PO-Revision-Date: \n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"X-Generator: Poedit 2.0.7\n"
|
||||||
|
|
||||||
msgid "rustychainmail"
|
msgid "rustychainmail"
|
||||||
msgstr "Rostiges Kettenhemd"
|
msgstr "Rostiges Kettenhemd"
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: \n"
|
||||||
|
"POT-Creation-Date: \n"
|
||||||
|
"PO-Revision-Date: \n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Language: en\n"
|
||||||
|
"X-Generator: Poedit 2.0.7\n"
|
||||||
|
|
||||||
msgid "rustychainmail"
|
msgid "rustychainmail"
|
||||||
msgstr "rustychainmail"
|
msgstr "rustychainmail"
|
||||||
|
|
||||||
|
|
|
@ -154,7 +154,7 @@ end
|
||||||
|
|
||||||
function test_pure()
|
function test_pure()
|
||||||
local r = region.create(0, 0, "plain")
|
local r = region.create(0, 0, "plain")
|
||||||
assert_not_equal(nil, r)
|
assert_not_nil(r)
|
||||||
assert_equal(r, get_region(0, 0))
|
assert_equal(r, get_region(0, 0))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -169,21 +169,21 @@ function test_read_write()
|
||||||
assert_equal(r.terrain, "plain")
|
assert_equal(r.terrain, "plain")
|
||||||
result = eressea.write_game("test.dat")
|
result = eressea.write_game("test.dat")
|
||||||
assert_equal(result, 0)
|
assert_equal(result, 0)
|
||||||
assert_not_equal(get_region(0, 0), nil)
|
assert_not_nil(get_region(0, 0))
|
||||||
assert_not_equal(get_faction(fno), nil)
|
assert_not_nil(get_faction(fno))
|
||||||
assert_not_equal(get_unit(uno), nil)
|
assert_not_nil(get_unit(uno))
|
||||||
r = nil
|
r = nil
|
||||||
f = nil
|
f = nil
|
||||||
u = nil
|
u = nil
|
||||||
eressea.free_game()
|
eressea.free_game()
|
||||||
assert_equal(get_region(0, 0), nil)
|
assert_nil(get_region(0, 0))
|
||||||
assert_equal(nil, get_faction(fno))
|
assert_nil(get_faction(fno))
|
||||||
assert_equal(nil, get_unit(uno))
|
assert_nil(get_unit(uno))
|
||||||
result = eressea.read_game("test.dat")
|
result = eressea.read_game("test.dat")
|
||||||
assert_equal(0, result)
|
assert_equal(0, result)
|
||||||
assert_not_equal(nil, get_region(0, 0))
|
assert_not_nil(get_region(0, 0))
|
||||||
assert_not_equal(nil, get_faction(fno))
|
assert_not_nil(get_faction(fno))
|
||||||
assert_not_equal(nil, get_unit(uno))
|
assert_not_nil(get_unit(uno))
|
||||||
end
|
end
|
||||||
|
|
||||||
function test_descriptions()
|
function test_descriptions()
|
||||||
|
@ -237,7 +237,7 @@ function test_gmtool()
|
||||||
selections=selections+1
|
selections=selections+1
|
||||||
end
|
end
|
||||||
assert_equal(2, selections)
|
assert_equal(2, selections)
|
||||||
assert_equal(nil, gmtool.get_cursor())
|
assert_nil(gmtool.get_cursor())
|
||||||
|
|
||||||
gmtool.close()
|
gmtool.close()
|
||||||
end
|
end
|
||||||
|
@ -567,7 +567,7 @@ function test_coordinate_translation()
|
||||||
local pe = plane.create(1, -8761, 3620, 23, 23) -- eternath
|
local pe = plane.create(1, -8761, 3620, 23, 23) -- eternath
|
||||||
local r = region.create(1000, 1000, "plain")
|
local r = region.create(1000, 1000, "plain")
|
||||||
local f = create_faction('human')
|
local f = create_faction('human')
|
||||||
assert_not_equal(nil, r)
|
assert_not_nil(r)
|
||||||
assert_equal(r.x, 1000)
|
assert_equal(r.x, 1000)
|
||||||
assert_equal(r.y, 1000)
|
assert_equal(r.y, 1000)
|
||||||
local nx, ny = plane.normalize(pl, r.x, r.y)
|
local nx, ny = plane.normalize(pl, r.x, r.y)
|
||||||
|
@ -633,8 +633,8 @@ end
|
||||||
-- segfault above
|
-- segfault above
|
||||||
|
|
||||||
function test_config()
|
function test_config()
|
||||||
assert_not_equal(nil, config.basepath)
|
assert_not_nil(config.basepath)
|
||||||
assert_not_equal(nil, config.locales)
|
assert_not_nil(config.locales)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function _test_create_laen()
|
local function _test_create_laen()
|
||||||
|
@ -826,9 +826,9 @@ function test_swim_and_die()
|
||||||
process_orders()
|
process_orders()
|
||||||
r.terrain = "ocean"
|
r.terrain = "ocean"
|
||||||
u = get_unit(uid)
|
u = get_unit(uid)
|
||||||
assert_not_equal(get_unit(uid), nil)
|
assert_not_nil(get_unit(uid))
|
||||||
process_orders()
|
process_orders()
|
||||||
assert_equal(get_unit(uid), nil)
|
assert_nil(get_unit(uid))
|
||||||
end
|
end
|
||||||
|
|
||||||
function test_ride_with_horse()
|
function test_ride_with_horse()
|
||||||
|
|
|
@ -13,6 +13,7 @@ function setup()
|
||||||
end
|
end
|
||||||
|
|
||||||
function test_water_of_life()
|
function test_water_of_life()
|
||||||
|
eressea.settings.set("rules.grow.formula", 0) -- no tree growth
|
||||||
local r = region.create(0, 0, "plain")
|
local r = region.create(0, 0, "plain")
|
||||||
r:set_flag(1, false) -- no mallorn
|
r:set_flag(1, false) -- no mallorn
|
||||||
local f = faction.create("human")
|
local f = faction.create("human")
|
||||||
|
|
|
@ -101,14 +101,14 @@ function test_build_boat_low_skill()
|
||||||
u:add_item("log", 10)
|
u:add_item("log", 10)
|
||||||
u:add_order("MACHE BOOT")
|
u:add_order("MACHE BOOT")
|
||||||
process_orders()
|
process_orders()
|
||||||
assert_not_equal(nil, u.ship)
|
assert_not_nil(u.ship)
|
||||||
assert_equal(4, u.ship.size)
|
assert_equal(4, u.ship.size)
|
||||||
assert_equal(6, u:get_item('log'))
|
assert_equal(6, u:get_item('log'))
|
||||||
end
|
end
|
||||||
|
|
||||||
function test_build_boat_high_skill()
|
function test_build_boat_high_skill()
|
||||||
local r = region.create(0, 0, "plain")
|
local r = region.create(0, 0, "plain")
|
||||||
local f = faction.create("human", "build@example.com")
|
local f = faction.create("human", "skillz@example.com")
|
||||||
local u = unit.create(f, r, 1)
|
local u = unit.create(f, r, 1)
|
||||||
u:set_skill("shipcraft", 5) -- humans get +1
|
u:set_skill("shipcraft", 5) -- humans get +1
|
||||||
u:add_item("log", 10)
|
u:add_item("log", 10)
|
||||||
|
|
|
@ -6,7 +6,7 @@ function setup()
|
||||||
eressea.free_game()
|
eressea.free_game()
|
||||||
conf = [[{
|
conf = [[{
|
||||||
"races": {
|
"races": {
|
||||||
"human" : {}
|
"human" : { "flags" : [ "player" ] }
|
||||||
},
|
},
|
||||||
"terrains" : {
|
"terrains" : {
|
||||||
"plain": { "flags" : [ "land", "walk", "sail" ] }
|
"plain": { "flags" : [ "land", "walk", "sail" ] }
|
||||||
|
@ -61,7 +61,7 @@ end
|
||||||
|
|
||||||
function test_make_temp()
|
function test_make_temp()
|
||||||
local r = region.create(0, 0, "plain")
|
local r = region.create(0, 0, "plain")
|
||||||
local f1 = faction.create("human", "owner@eressea.de", "de")
|
local f1 = faction.create("human", "temp@eressea.de", "de")
|
||||||
local u1 = unit.create(f1, r, 10)
|
local u1 = unit.create(f1, r, 10)
|
||||||
local u, u2
|
local u, u2
|
||||||
|
|
||||||
|
|
|
@ -111,6 +111,7 @@ set (ERESSEA_SRC
|
||||||
report.c
|
report.c
|
||||||
steal.c
|
steal.c
|
||||||
economy.c
|
economy.c
|
||||||
|
exparse.c
|
||||||
give.c
|
give.c
|
||||||
items.c
|
items.c
|
||||||
laws.c
|
laws.c
|
||||||
|
@ -127,7 +128,6 @@ set (ERESSEA_SRC
|
||||||
travelthru.c
|
travelthru.c
|
||||||
monsters.c
|
monsters.c
|
||||||
wormhole.c
|
wormhole.c
|
||||||
xmlreader.c
|
|
||||||
${SPELLS_SRC}
|
${SPELLS_SRC}
|
||||||
${RACES_SRC}
|
${RACES_SRC}
|
||||||
${ITEMS_SRC}
|
${ITEMS_SRC}
|
||||||
|
@ -182,15 +182,6 @@ target_link_libraries(eressea
|
||||||
${INIPARSER_LIBRARIES}
|
${INIPARSER_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
add_executable(convert convert.c)
|
|
||||||
target_link_libraries(convert
|
|
||||||
game
|
|
||||||
${LUA_MATH_LIBRARY}
|
|
||||||
${STORAGE_LIBRARIES}
|
|
||||||
${CLIBS_LIBRARIES}
|
|
||||||
${INIPARSER_LIBRARIES}
|
|
||||||
)
|
|
||||||
|
|
||||||
set(TESTS_SRC
|
set(TESTS_SRC
|
||||||
test_eressea.c
|
test_eressea.c
|
||||||
tests.c
|
tests.c
|
||||||
|
@ -230,7 +221,6 @@ set(TESTS_SRC
|
||||||
volcano.test.c
|
volcano.test.c
|
||||||
vortex.test.c
|
vortex.test.c
|
||||||
wormhole.test.c
|
wormhole.test.c
|
||||||
# xmlreader.test.c
|
|
||||||
spells/flyingship.test.c
|
spells/flyingship.test.c
|
||||||
spells/magicresistance.test.c
|
spells/magicresistance.test.c
|
||||||
triggers/shock.test.c
|
triggers/shock.test.c
|
||||||
|
@ -280,18 +270,15 @@ endif(HAVE_STRDUP)
|
||||||
if (HAVE_LIBBSD)
|
if (HAVE_LIBBSD)
|
||||||
target_link_libraries(test_eressea bsd)
|
target_link_libraries(test_eressea bsd)
|
||||||
target_link_libraries(eressea bsd)
|
target_link_libraries(eressea bsd)
|
||||||
target_link_libraries(convert bsd)
|
|
||||||
endif (HAVE_LIBBSD)
|
endif (HAVE_LIBBSD)
|
||||||
|
|
||||||
if (SQLITE3_FOUND)
|
if (SQLITE3_FOUND)
|
||||||
include_directories (${SQLITE3_INCLUDE_DIR})
|
include_directories (${SQLITE3_INCLUDE_DIR})
|
||||||
target_link_libraries(eressea ${SQLITE3_LIBRARIES})
|
target_link_libraries(eressea ${SQLITE3_LIBRARIES})
|
||||||
target_link_libraries(convert ${SQLITE3_LIBRARIES})
|
|
||||||
target_link_libraries(test_eressea ${SQLITE3_LIBRARIES})
|
target_link_libraries(test_eressea ${SQLITE3_LIBRARIES})
|
||||||
add_definitions(-DUSE_SQLITE)
|
add_definitions(-DUSE_SQLITE)
|
||||||
elseif (DB_FOUND)
|
elseif (DB_FOUND)
|
||||||
include_directories (${DB_INCLUDE_DIR})
|
include_directories (${DB_INCLUDE_DIR})
|
||||||
target_link_libraries(convert ${DB_LIBRARIES})
|
|
||||||
target_link_libraries(eressea ${DB_LIBRARIES})
|
target_link_libraries(eressea ${DB_LIBRARIES})
|
||||||
target_link_libraries(test_eressea ${DB_LIBRARIES})
|
target_link_libraries(test_eressea ${DB_LIBRARIES})
|
||||||
add_definitions(-DUSE_DB)
|
add_definitions(-DUSE_DB)
|
||||||
|
@ -309,9 +296,8 @@ target_link_libraries(eressea ${CURSES_LIBRARIES})
|
||||||
add_definitions(-DUSE_CURSES)
|
add_definitions(-DUSE_CURSES)
|
||||||
endif(CURSES_FOUND)
|
endif(CURSES_FOUND)
|
||||||
|
|
||||||
if (LIBXML2_FOUND)
|
if (EXPAT_FOUND)
|
||||||
include_directories (${LIBXML2_INCLUDE_DIR})
|
include_directories (${EXPAT_INCLUDE_DIRS})
|
||||||
target_link_libraries(eressea ${LIBXML2_LIBRARIES})
|
target_link_libraries(eressea ${EXPAT_LIBRARIES})
|
||||||
target_link_libraries(convert ${LIBXML2_LIBRARIES})
|
target_link_libraries(test_eressea ${EXPAT_LIBRARIES})
|
||||||
target_link_libraries(test_eressea ${LIBXML2_LIBRARIES})
|
endif (EXPAT_FOUND)
|
||||||
endif (LIBXML2_FOUND)
|
|
||||||
|
|
|
@ -59,7 +59,6 @@
|
||||||
#include <util/nrmessage.h>
|
#include <util/nrmessage.h>
|
||||||
#include <util/rand.h>
|
#include <util/rand.h>
|
||||||
#include <util/rng.h>
|
#include <util/rng.h>
|
||||||
#include <util/xml.h>
|
|
||||||
|
|
||||||
#include <selist.h>
|
#include <selist.h>
|
||||||
#include <storage.h>
|
#include <storage.h>
|
||||||
|
@ -833,33 +832,12 @@ static int tolua_get_spells(lua_State * L)
|
||||||
return tolua_selist_push(L, "spell_list", "spell", spells);
|
return tolua_selist_push(L, "spell_list", "spell", spells);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int init_data(const char *filename)
|
|
||||||
{
|
|
||||||
int l;
|
|
||||||
l = read_xml(filename);
|
|
||||||
reset_locales();
|
|
||||||
if (l) {
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
if (turn <= 0) {
|
|
||||||
turn = first_turn();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tolua_equip_newunits(lua_State * L) {
|
static int tolua_equip_newunits(lua_State * L) {
|
||||||
unit *u = (unit *)tolua_tousertype(L, 1, 0);
|
unit *u = (unit *)tolua_tousertype(L, 1, 0);
|
||||||
equip_newunits(u);
|
equip_newunits(u);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tolua_read_xml(lua_State * L)
|
|
||||||
{
|
|
||||||
const char *filename = tolua_tostring(L, 1, "config.xml");
|
|
||||||
lua_pushinteger(L, init_data(filename));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tolua_report_unit(lua_State * L)
|
static int tolua_report_unit(lua_State * L)
|
||||||
{
|
{
|
||||||
char buffer[512];
|
char buffer[512];
|
||||||
|
@ -1029,7 +1007,6 @@ int tolua_bindings_open(lua_State * L, const dictionary *inifile)
|
||||||
tolua_function(L, TOLUA_CAST "set_key", tolua_setkey);
|
tolua_function(L, TOLUA_CAST "set_key", tolua_setkey);
|
||||||
tolua_function(L, TOLUA_CAST "translate", &tolua_translate);
|
tolua_function(L, TOLUA_CAST "translate", &tolua_translate);
|
||||||
tolua_function(L, TOLUA_CAST "spells", tolua_get_spells);
|
tolua_function(L, TOLUA_CAST "spells", tolua_get_spells);
|
||||||
tolua_function(L, TOLUA_CAST "read_xml", tolua_read_xml);
|
|
||||||
tolua_function(L, TOLUA_CAST "equip_newunits", tolua_equip_newunits);
|
tolua_function(L, TOLUA_CAST "equip_newunits", tolua_equip_newunits);
|
||||||
} tolua_endmodule(L);
|
} tolua_endmodule(L);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
#include <platform.h>
|
|
||||||
|
|
||||||
|
|
||||||
#include "xmlreader.h"
|
|
||||||
#include <util/xml.h>
|
|
||||||
#include <kernel/race.h>
|
|
||||||
#include <kernel/rules.h>
|
|
||||||
#include <races/races.h>
|
|
||||||
|
|
||||||
#include <storage.h>
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
static int usage(void) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
const char *mode;
|
|
||||||
|
|
||||||
register_races();
|
|
||||||
register_xmlreader();
|
|
||||||
if (argc < 2) return usage();
|
|
||||||
mode = argv[1];
|
|
||||||
if (strcmp(mode, "rules")==0) {
|
|
||||||
const char *xmlfile;
|
|
||||||
if (argc < 4) return usage();
|
|
||||||
xmlfile = argv[2];
|
|
||||||
read_xml(xmlfile);
|
|
||||||
write_rules("rules.dat");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (strcmp(mode, "po")==0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return usage();
|
|
||||||
}
|
|
|
@ -519,7 +519,7 @@ static void report_crtypes(FILE * F, const struct locale *lang)
|
||||||
fputc('\"', F);
|
fputc('\"', F);
|
||||||
fputs(str_escape(nrt_string(kmt->mtype, lang), buffer, sizeof(buffer)), F);
|
fputs(str_escape(nrt_string(kmt->mtype, lang), buffer, sizeof(buffer)), F);
|
||||||
fputs("\";text\n", F);
|
fputs("\";text\n", F);
|
||||||
fprintf(F, "\"%s\";section\n", nrt_section(kmt->mtype));
|
fprintf(F, "\"%s\";section\n", kmt->mtype->section);
|
||||||
}
|
}
|
||||||
while (mtypehash[i]) {
|
while (mtypehash[i]) {
|
||||||
kmt = mtypehash[i];
|
kmt = mtypehash[i];
|
||||||
|
|
|
@ -13,7 +13,7 @@ static void test_add_donation(CuTest *tc) {
|
||||||
region *r;
|
region *r;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("donation", "from:faction", "to:faction", "amount:int", MT_NEW_END));
|
mt_create_va(mt_new("donation", NULL), "from:faction", "to:faction", "amount:int", MT_NEW_END);
|
||||||
r = test_create_region(0, 0, NULL);
|
r = test_create_region(0, 0, NULL);
|
||||||
f1 = test_create_faction(NULL);
|
f1 = test_create_faction(NULL);
|
||||||
f2 = test_create_faction(NULL);
|
f2 = test_create_faction(NULL);
|
||||||
|
|
|
@ -143,10 +143,10 @@ static struct unit *create_recruiter(void) {
|
||||||
|
|
||||||
static void setup_production(void) {
|
static void setup_production(void) {
|
||||||
init_resources();
|
init_resources();
|
||||||
mt_register(mt_new_va("produce", "unit:unit", "region:region", "amount:int", "wanted:int", "resource:resource", MT_NEW_END));
|
mt_create_va(mt_new("produce", NULL), "unit:unit", "region:region", "amount:int", "wanted:int", "resource:resource", MT_NEW_END);
|
||||||
mt_register(mt_new_va("income", "unit:unit", "region:region", "amount:int", "wanted:int", "mode:int", MT_NEW_END));
|
mt_create_va(mt_new("income", NULL), "unit:unit", "region:region", "amount:int", "wanted:int", "mode:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("buy", "unit:unit", "money:int", MT_NEW_END));
|
mt_create_va(mt_new("buy", NULL), "unit:unit", "money:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("buyamount", "unit:unit", "amount:int", "resource:resource", MT_NEW_END));
|
mt_create_va(mt_new("buyamount", NULL), "unit:unit", "amount:int", "resource:resource", MT_NEW_END);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_heroes_dont_recruit(CuTest * tc) {
|
static void test_heroes_dont_recruit(CuTest * tc) {
|
||||||
|
@ -378,11 +378,11 @@ static void test_tax_cmd(CuTest *tc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setup_economy(void) {
|
static void setup_economy(void) {
|
||||||
mt_register(mt_new_va("recruit", "unit:unit", "region:region", "amount:int", "want:int", MT_NEW_END));
|
mt_create_va(mt_new("recruit", NULL), "unit:unit", "region:region", "amount:int", "want:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("maintenance", "unit:unit", "building:building", MT_NEW_END));
|
mt_create_va(mt_new("maintenance", NULL), "unit:unit", "building:building", MT_NEW_END);
|
||||||
mt_register(mt_new_va("maintenancefail", "unit:unit", "building:building", MT_NEW_END));
|
mt_create_va(mt_new("maintenancefail", NULL), "unit:unit", "building:building", MT_NEW_END);
|
||||||
mt_register(mt_new_va("maintenance_nowork", "building:building", MT_NEW_END));
|
mt_create_va(mt_new("maintenance_nowork", NULL), "building:building", MT_NEW_END);
|
||||||
mt_register(mt_new_va("maintenance_noowner", "building:building", MT_NEW_END));
|
mt_create_va(mt_new("maintenance_noowner", NULL), "building:building", MT_NEW_END);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
#include "spells.h"
|
#include "spells.h"
|
||||||
#include "vortex.h"
|
#include "vortex.h"
|
||||||
#include "wormhole.h"
|
#include "wormhole.h"
|
||||||
#include "xmlreader.h"
|
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -54,9 +53,9 @@ void game_done(void)
|
||||||
free_config();
|
free_config();
|
||||||
free_special_directions();
|
free_special_directions();
|
||||||
free_locales();
|
free_locales();
|
||||||
|
#endif
|
||||||
kernel_done();
|
kernel_done();
|
||||||
dblib_close();
|
dblib_close();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void game_init(void)
|
void game_init(void)
|
||||||
|
@ -80,7 +79,6 @@ void game_init(void)
|
||||||
|
|
||||||
register_weapons();
|
register_weapons();
|
||||||
register_xerewards();
|
register_xerewards();
|
||||||
register_xmlreader();
|
|
||||||
register_attributes();
|
register_attributes();
|
||||||
register_gmcmd();
|
register_gmcmd();
|
||||||
|
|
||||||
|
|
1552
src/exparse.c
Normal file
1552
src/exparse.c
Normal file
File diff suppressed because it is too large
Load diff
3
src/exparse.h
Normal file
3
src/exparse.h
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
int exparse_readfile(const char * filename);
|
|
@ -54,24 +54,24 @@ static void setup_give(struct give *env) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* success messages: */
|
/* success messages: */
|
||||||
mt_register(mt_new_va("receive_person", "unit:unit", "target:unit", "amount:int", MT_NEW_END));
|
mt_create_va(mt_new("receive_person", NULL), "unit:unit", "target:unit", "amount:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("give_person", "unit:unit", "target:unit", "amount:int", MT_NEW_END));
|
mt_create_va(mt_new("give_person", NULL), "unit:unit", "target:unit", "amount:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("give_person_peasants", "unit:unit", "amount:int", MT_NEW_END));
|
mt_create_va(mt_new("give_person_peasants", NULL), "unit:unit", "amount:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("give_person_ocean", "unit:unit", "amount:int", MT_NEW_END));
|
mt_create_va(mt_new("give_person_ocean", NULL), "unit:unit", "amount:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("receive", "unit:unit", "target:unit", "resource:resource", "amount:int", MT_NEW_END));
|
mt_create_va(mt_new("receive", NULL), "unit:unit", "target:unit", "resource:resource", "amount:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("give", "unit:unit", "target:unit", "resource:resource", "amount:int", MT_NEW_END));
|
mt_create_va(mt_new("give", NULL), "unit:unit", "target:unit", "resource:resource", "amount:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("give_peasants", "unit:unit", "resource:resource", "amount:int", MT_NEW_END));
|
mt_create_va(mt_new("give_peasants", NULL), "unit:unit", "resource:resource", "amount:int", MT_NEW_END);
|
||||||
/* error messages: */
|
/* error messages: */
|
||||||
mt_register(mt_new_va("too_many_units_in_faction", "unit:unit", "region:region", "command:order", "allowed:int", MT_NEW_END));
|
mt_create_va(mt_new("too_many_units_in_faction", NULL), "unit:unit", "region:region", "command:order", "allowed:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("too_many_units_in_alliance", "unit:unit", "region:region", "command:order", "allowed:int", MT_NEW_END));
|
mt_create_va(mt_new("too_many_units_in_alliance", NULL), "unit:unit", "region:region", "command:order", "allowed:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("feedback_no_contact", "unit:unit", "region:region", "command:order", "target:unit", MT_NEW_END));
|
mt_create_va(mt_new("feedback_no_contact", NULL), "unit:unit", "region:region", "command:order", "target:unit", MT_NEW_END);
|
||||||
mt_register(mt_new_va("feedback_give_forbidden", "unit:unit", "region:region", "command:order", MT_NEW_END));
|
mt_create_va(mt_new("feedback_give_forbidden", NULL), "unit:unit", "region:region", "command:order", MT_NEW_END);
|
||||||
mt_register(mt_new_va("peasants_give_invalid", "unit:unit", "region:region", "command:order", MT_NEW_END));
|
mt_create_va(mt_new("peasants_give_invalid", NULL), "unit:unit", "region:region", "command:order", MT_NEW_END);
|
||||||
mt_register(mt_new_va("giverestriction", "unit:unit", "region:region", "command:order", "turns:int", MT_NEW_END));
|
mt_create_va(mt_new("giverestriction", NULL), "unit:unit", "region:region", "command:order", "turns:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("error_unit_size", "unit:unit", "region:region", "command:order", "maxsize:int", MT_NEW_END));
|
mt_create_va(mt_new("error_unit_size", NULL), "unit:unit", "region:region", "command:order", "maxsize:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("nogive_reserved", "unit:unit", "region:region", "command:order", "resource:resource", "reservation:int", MT_NEW_END));
|
mt_create_va(mt_new("nogive_reserved", NULL), "unit:unit", "region:region", "command:order", "resource:resource", "reservation:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("race_notake", "unit:unit", "region:region", "command:order", "race:race", MT_NEW_END));
|
mt_create_va(mt_new("race_notake", NULL), "unit:unit", "region:region", "command:order", "race:race", MT_NEW_END);
|
||||||
mt_register(mt_new_va("race_noregroup", "unit:unit", "region:region", "command:order", "race:race", MT_NEW_END));
|
mt_create_va(mt_new("race_noregroup", NULL), "unit:unit", "region:region", "command:order", "race:race", MT_NEW_END);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_give_unit(CuTest * tc) {
|
static void test_give_unit(CuTest * tc) {
|
||||||
|
|
|
@ -55,7 +55,6 @@
|
||||||
#include "listbox.h"
|
#include "listbox.h"
|
||||||
#include "wormhole.h"
|
#include "wormhole.h"
|
||||||
#include "teleport.h"
|
#include "teleport.h"
|
||||||
#include "xmlreader.h"
|
|
||||||
|
|
||||||
#include <storage.h>
|
#include <storage.h>
|
||||||
#include <lua.h>
|
#include <lua.h>
|
||||||
|
|
|
@ -39,7 +39,6 @@ without prior permission by the authors of Eressea.
|
||||||
#include "util/path.h"
|
#include "util/path.h"
|
||||||
#include "util/pofile.h"
|
#include "util/pofile.h"
|
||||||
#include "util/strings.h"
|
#include "util/strings.h"
|
||||||
#include "util/xml.h"
|
|
||||||
|
|
||||||
/* game modules */
|
/* game modules */
|
||||||
#include "direction.h"
|
#include "direction.h"
|
||||||
|
@ -47,6 +46,7 @@ without prior permission by the authors of Eressea.
|
||||||
#include "move.h"
|
#include "move.h"
|
||||||
#include "prefix.h"
|
#include "prefix.h"
|
||||||
#include "skill.h"
|
#include "skill.h"
|
||||||
|
#include "exparse.h"
|
||||||
|
|
||||||
/* external libraries */
|
/* external libraries */
|
||||||
#include <cJSON.h>
|
#include <cJSON.h>
|
||||||
|
@ -478,17 +478,16 @@ static void json_ship(cJSON *json, ship_type *st) {
|
||||||
static void json_race(cJSON *json, race *rc) {
|
static void json_race(cJSON *json, race *rc) {
|
||||||
cJSON *child;
|
cJSON *child;
|
||||||
const char *flags[] = {
|
const char *flags[] = {
|
||||||
"npc", "killpeasants", "scarepeasants",
|
"player", "killpeasants", "scarepeasants",
|
||||||
"nosteal", "moverandom", "cannotmove",
|
"nosteal", "moverandom", "cannotmove",
|
||||||
"learn", "fly", "swim", "walk", "nolearn",
|
"learn", "fly", "swim", "walk", "nolearn",
|
||||||
"noteach", "horse", "desert",
|
"noteach", "horse", "desert",
|
||||||
"illusionary", "absorbpeasants", "noheal",
|
"illusionary", "absorbpeasants", "noheal",
|
||||||
"noweapons", "shapeshift", "", "undead", "dragon",
|
"noweapons", "shapeshift", "", "undead", "dragon",
|
||||||
"coastal", "", "cansail", 0
|
"coastal", "", "cansail", NULL
|
||||||
};
|
};
|
||||||
const char *ecflags[] = {
|
const char *ecflags[] = {
|
||||||
"", "keepitem", "giveperson",
|
"giveperson", "giveunit", "getitem", NULL
|
||||||
"giveunit", "getitem", 0
|
|
||||||
};
|
};
|
||||||
if (json->type != cJSON_Object) {
|
if (json->type != cJSON_Object) {
|
||||||
log_error("race %s is not a json object: %d", json->string, json->type);
|
log_error("race %s is not a json object: %d", json->string, json->type);
|
||||||
|
@ -1014,8 +1013,9 @@ static int include_json(const char *uri) {
|
||||||
static int include_xml(const char *uri) {
|
static int include_xml(const char *uri) {
|
||||||
char name[PATH_MAX];
|
char name[PATH_MAX];
|
||||||
const char *filename = uri_to_file(uri, name, sizeof(name));
|
const char *filename = uri_to_file(uri, name, sizeof(name));
|
||||||
int err = read_xml(filename);
|
int err;
|
||||||
if (err < 0) {
|
err = exparse_readfile(filename);
|
||||||
|
if (err != 0) {
|
||||||
log_error("could not parse XML from %s", uri);
|
log_error("could not parse XML from %s", uri);
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
|
@ -1048,7 +1048,7 @@ static int include_po(const char *uri) {
|
||||||
if (lang) {
|
if (lang) {
|
||||||
int err = pofile_read(filename, add_po_string, lang);
|
int err = pofile_read(filename, add_po_string, lang);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
log_error("could not parse XML from %s", uri);
|
log_error("could not parse translations from %s", uri);
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ static void check_flag(CuTest *tc, const char *name, int flag) {
|
||||||
|
|
||||||
static void test_flags(CuTest *tc) {
|
static void test_flags(CuTest *tc) {
|
||||||
test_setup();
|
test_setup();
|
||||||
check_flag(tc, "npc", RCF_NPC);
|
check_flag(tc, "player", RCF_PLAYABLE);
|
||||||
check_flag(tc, "scarepeasants", RCF_SCAREPEASANTS);
|
check_flag(tc, "scarepeasants", RCF_SCAREPEASANTS);
|
||||||
check_flag(tc, "nosteal", RCF_NOSTEAL);
|
check_flag(tc, "nosteal", RCF_NOSTEAL);
|
||||||
check_flag(tc, "noheal", RCF_NOHEAL);
|
check_flag(tc, "noheal", RCF_NOHEAL);
|
||||||
|
@ -181,7 +181,7 @@ static void test_races(CuTest * tc)
|
||||||
"\"income\" : 30,"
|
"\"income\" : 30,"
|
||||||
"\"hp\" : 5,"
|
"\"hp\" : 5,"
|
||||||
"\"ac\" : 6,"
|
"\"ac\" : 6,"
|
||||||
"\"flags\" : [ \"npc\", \"walk\", \"undead\" ]"
|
"\"flags\" : [ \"player\", \"walk\", \"undead\" ]"
|
||||||
"}}}";
|
"}}}";
|
||||||
cJSON *json = cJSON_Parse(data);
|
cJSON *json = cJSON_Parse(data);
|
||||||
const struct race *rc;
|
const struct race *rc;
|
||||||
|
@ -195,7 +195,7 @@ static void test_races(CuTest * tc)
|
||||||
CuAssertPtrNotNull(tc, races);
|
CuAssertPtrNotNull(tc, races);
|
||||||
rc = rc_find("orc");
|
rc = rc_find("orc");
|
||||||
CuAssertPtrNotNull(tc, rc);
|
CuAssertPtrNotNull(tc, rc);
|
||||||
CuAssertIntEquals(tc, RCF_NPC | RCF_WALK | RCF_UNDEAD, rc->flags);
|
CuAssertIntEquals(tc, RCF_PLAYABLE | RCF_WALK | RCF_UNDEAD, rc->flags);
|
||||||
CuAssertStrEquals(tc, "1d4", rc->def_damage);
|
CuAssertStrEquals(tc, "1d4", rc->def_damage);
|
||||||
CuAssertTrue(tc, frac_equal(frac_one, rc->magres));
|
CuAssertTrue(tc, frac_equal(frac_one, rc->magres));
|
||||||
CuAssertIntEquals(tc, 200, rc->maxaura);
|
CuAssertIntEquals(tc, 200, rc->maxaura);
|
||||||
|
|
|
@ -69,7 +69,6 @@ pool.c
|
||||||
race.c
|
race.c
|
||||||
region.c
|
region.c
|
||||||
resources.c
|
resources.c
|
||||||
rules.c
|
|
||||||
save.c
|
save.c
|
||||||
ship.c
|
ship.c
|
||||||
skills.c
|
skills.c
|
||||||
|
|
|
@ -60,7 +60,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include <util/log.h>
|
#include <util/log.h>
|
||||||
#include <util/parser.h>
|
#include <util/parser.h>
|
||||||
#include <util/resolve.h>
|
#include <util/resolve.h>
|
||||||
#include <util/xml.h>
|
|
||||||
|
|
||||||
/* from libc */
|
/* from libc */
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
|
@ -253,7 +253,7 @@ static void test_build_destroy_road(CuTest *tc)
|
||||||
message *m;
|
message *m;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("destroy_road", "unit:unit", "from:region", "to:region", MT_NEW_END));
|
mt_create_va(mt_new("destroy_road", NULL), "unit:unit", "from:region", "to:region", MT_NEW_END);
|
||||||
r2 = test_create_region(1, 0, 0);
|
r2 = test_create_region(1, 0, 0);
|
||||||
r = test_create_region(0, 0, NULL);
|
r = test_create_region(0, 0, NULL);
|
||||||
rsetroad(r, D_EAST, 100);
|
rsetroad(r, D_EAST, 100);
|
||||||
|
|
|
@ -144,6 +144,7 @@ building_type *bt_get_or_create(const char *name)
|
||||||
if (btype == NULL) {
|
if (btype == NULL) {
|
||||||
btype = calloc(sizeof(building_type), 1);
|
btype = calloc(sizeof(building_type), 1);
|
||||||
btype->_name = str_strdup(name);
|
btype->_name = str_strdup(name);
|
||||||
|
btype->flags = BTF_DEFAULT;
|
||||||
btype->auraregen = 1.0;
|
btype->auraregen = 1.0;
|
||||||
btype->maxsize = -1;
|
btype->maxsize = -1;
|
||||||
btype->capacity = 1;
|
btype->capacity = 1;
|
||||||
|
|
|
@ -48,11 +48,13 @@ extern "C" {
|
||||||
#define BTF_NOBUILD 0x02 /* special, can't be built */
|
#define BTF_NOBUILD 0x02 /* special, can't be built */
|
||||||
#define BTF_UNIQUE 0x04 /* only one per struct region (harbour) */
|
#define BTF_UNIQUE 0x04 /* only one per struct region (harbour) */
|
||||||
#define BTF_DECAY 0x08 /* decays when not occupied */
|
#define BTF_DECAY 0x08 /* decays when not occupied */
|
||||||
#define BTF_DYNAMIC 0x10 /* dynamic type, needs bt_write */
|
#define BTF_MAGIC 0x10 /* magical effect */
|
||||||
#define BTF_MAGIC 0x40 /* magical effect */
|
#define BTF_NAMECHANGE 0x20 /* name and description can be changed more than once */
|
||||||
|
#define BTF_FORTIFICATION 0x40 /* building_protection, safe from monsters */
|
||||||
#define BTF_ONEPERTURN 0x80 /* one one sizepoint can be added per turn */
|
#define BTF_ONEPERTURN 0x80 /* one one sizepoint can be added per turn */
|
||||||
#define BTF_NAMECHANGE 0x100 /* name and description can be changed more than once */
|
#define BTF_DYNAMIC 0x100 /* dynamic type, needs bt_write */
|
||||||
#define BTF_FORTIFICATION 0x200 /* building_protection, safe from monsters */
|
|
||||||
|
#define BTF_DEFAULT (BTF_NAMECHANGE)
|
||||||
|
|
||||||
typedef struct building_stage {
|
typedef struct building_stage {
|
||||||
/* construction of this building stage: */
|
/* construction of this building stage: */
|
||||||
|
|
|
@ -305,7 +305,7 @@ static void test_btype_defaults(CuTest *tc) {
|
||||||
CuAssertIntEquals(tc, 0, btype->magres.sa[0]);
|
CuAssertIntEquals(tc, 0, btype->magres.sa[0]);
|
||||||
CuAssertIntEquals(tc, 0, btype->magresbonus);
|
CuAssertIntEquals(tc, 0, btype->magresbonus);
|
||||||
CuAssertIntEquals(tc, 0, btype->fumblebonus);
|
CuAssertIntEquals(tc, 0, btype->fumblebonus);
|
||||||
CuAssertIntEquals(tc, 0, btype->flags);
|
CuAssertIntEquals(tc, BTF_DEFAULT, btype->flags);
|
||||||
test_teardown();
|
test_teardown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -66,16 +66,11 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include <util/strings.h>
|
#include <util/strings.h>
|
||||||
#include <util/translation.h>
|
#include <util/translation.h>
|
||||||
#include <util/umlaut.h>
|
#include <util/umlaut.h>
|
||||||
#include <util/xml.h>
|
|
||||||
|
|
||||||
#include "donations.h"
|
#include "donations.h"
|
||||||
#include "guard.h"
|
#include "guard.h"
|
||||||
#include "prefix.h"
|
#include "prefix.h"
|
||||||
|
|
||||||
/* libxml includes */
|
|
||||||
#include <libxml/tree.h>
|
|
||||||
#include <libxml/xpath.h>
|
|
||||||
|
|
||||||
/* external libraries */
|
/* external libraries */
|
||||||
#include <iniparser.h>
|
#include <iniparser.h>
|
||||||
#include <critbit.h>
|
#include <critbit.h>
|
||||||
|
@ -559,7 +554,6 @@ void kernel_done(void)
|
||||||
/* calling this function releases memory assigned to static variables, etc.
|
/* calling this function releases memory assigned to static variables, etc.
|
||||||
* calling it is optional, e.g. a release server will most likely not do it.
|
* calling it is optional, e.g. a release server will most likely not do it.
|
||||||
*/
|
*/
|
||||||
xml_done();
|
|
||||||
attrib_done();
|
attrib_done();
|
||||||
item_done();
|
item_done();
|
||||||
message_done();
|
message_done();
|
||||||
|
@ -567,6 +561,7 @@ void kernel_done(void)
|
||||||
curses_done();
|
curses_done();
|
||||||
crmessage_done();
|
crmessage_done();
|
||||||
translation_done();
|
translation_done();
|
||||||
|
mt_clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rule_stealth_other(void)
|
bool rule_stealth_other(void)
|
||||||
|
|
|
@ -243,17 +243,16 @@ item_type *it_find(const char *zname)
|
||||||
}
|
}
|
||||||
|
|
||||||
item_type *it_get_or_create(resource_type *rtype) {
|
item_type *it_get_or_create(resource_type *rtype) {
|
||||||
item_type * itype;
|
|
||||||
assert(rtype);
|
assert(rtype);
|
||||||
itype = it_find(rtype->_name);
|
if (!rtype->itype) {
|
||||||
if (!itype) {
|
item_type * itype;
|
||||||
itype = (item_type *)calloc(sizeof(item_type), 1);
|
itype = (item_type *)calloc(sizeof(item_type), 1);
|
||||||
|
itype->rtype = rtype;
|
||||||
|
rtype->uchange = res_changeitem;
|
||||||
|
rtype->itype = itype;
|
||||||
|
rtype->flags |= RTF_ITEM;
|
||||||
}
|
}
|
||||||
itype->rtype = rtype;
|
return rtype->itype;
|
||||||
rtype->uchange = res_changeitem;
|
|
||||||
rtype->itype = itype;
|
|
||||||
rtype->flags |= RTF_ITEM;
|
|
||||||
return itype;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lt_register(luxury_type * ltype)
|
static void lt_register(luxury_type * ltype)
|
||||||
|
@ -291,7 +290,7 @@ weapon_type *new_weapontype(item_type * itype,
|
||||||
wtype->damage[1] = str_strdup(damage[1]);
|
wtype->damage[1] = str_strdup(damage[1]);
|
||||||
}
|
}
|
||||||
wtype->defmod = defmod;
|
wtype->defmod = defmod;
|
||||||
wtype->flags |= wflags;
|
wtype->flags = wflags;
|
||||||
wtype->itype = itype;
|
wtype->itype = itype;
|
||||||
wtype->magres = magres;
|
wtype->magres = magres;
|
||||||
wtype->offmod = offmod;
|
wtype->offmod = offmod;
|
||||||
|
@ -892,7 +891,11 @@ static void free_itype(item_type *itype) {
|
||||||
free(itype);
|
free(itype);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_wtype(weapon_type *wtype) {
|
void free_atype(armor_type *atype) {
|
||||||
|
free(atype);
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_wtype(weapon_type *wtype) {
|
||||||
assert(wtype);
|
assert(wtype);
|
||||||
free(wtype->damage[0]);
|
free(wtype->damage[0]);
|
||||||
free(wtype->damage[1]);
|
free(wtype->damage[1]);
|
||||||
|
@ -907,7 +910,9 @@ void free_rtype(resource_type *rtype) {
|
||||||
if (rtype->itype) {
|
if (rtype->itype) {
|
||||||
free_itype(rtype->itype);
|
free_itype(rtype->itype);
|
||||||
}
|
}
|
||||||
free(rtype->atype);
|
if (rtype->atype) {
|
||||||
|
free_atype(rtype->atype);
|
||||||
|
}
|
||||||
free(rtype->modifiers);
|
free(rtype->modifiers);
|
||||||
free(rtype->raw);
|
free(rtype->raw);
|
||||||
free(rtype->_name);
|
free(rtype->_name);
|
||||||
|
|
|
@ -40,6 +40,7 @@ extern "C" {
|
||||||
struct gamedata;
|
struct gamedata;
|
||||||
struct rawmaterial_type;
|
struct rawmaterial_type;
|
||||||
struct resource_mod;
|
struct resource_mod;
|
||||||
|
struct weapon_type;
|
||||||
|
|
||||||
typedef struct item {
|
typedef struct item {
|
||||||
struct item *next;
|
struct item *next;
|
||||||
|
@ -66,9 +67,12 @@ extern "C" {
|
||||||
|
|
||||||
void item_done(void);
|
void item_done(void);
|
||||||
|
|
||||||
|
typedef bool(*wtype_attack)(const struct troop *,
|
||||||
|
const struct weapon_type *, int *);
|
||||||
typedef int(*rtype_uchange) (struct unit * user,
|
typedef int(*rtype_uchange) (struct unit * user,
|
||||||
const struct resource_type * rtype, int delta);
|
const struct resource_type * rtype, int delta);
|
||||||
typedef char *(*rtype_name) (const struct resource_type * rtype, int flags);
|
typedef char *(*rtype_name) (const struct resource_type * rtype, int flags);
|
||||||
|
|
||||||
typedef struct resource_type {
|
typedef struct resource_type {
|
||||||
/* --- constants --- */
|
/* --- constants --- */
|
||||||
char *_name; /* wie es hei<65>t */
|
char *_name; /* wie es hei<65>t */
|
||||||
|
@ -159,9 +163,9 @@ extern "C" {
|
||||||
const item_type *itype;
|
const item_type *itype;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
double penalty;
|
double penalty;
|
||||||
|
double projectile; /* chance, dass ein projektil abprallt */
|
||||||
variant magres;
|
variant magres;
|
||||||
int prot;
|
int prot;
|
||||||
float projectile; /* chance, dass ein projektil abprallt */
|
|
||||||
} armor_type;
|
} armor_type;
|
||||||
|
|
||||||
#define WTF_NONE 0x00
|
#define WTF_NONE 0x00
|
||||||
|
@ -224,9 +228,10 @@ extern "C" {
|
||||||
weapon_type *new_weapontype(item_type * itype, int wflags,
|
weapon_type *new_weapontype(item_type * itype, int wflags,
|
||||||
variant magres, const char *damage[], int offmod, int defmod, int reload,
|
variant magres, const char *damage[], int offmod, int defmod, int reload,
|
||||||
skill_t sk);
|
skill_t sk);
|
||||||
|
void free_wtype(struct weapon_type *wtype);
|
||||||
armor_type *new_armortype(item_type * itype, double penalty,
|
armor_type *new_armortype(item_type * itype, double penalty,
|
||||||
variant magres, int prot, unsigned int flags);
|
variant magres, int prot, unsigned int flags);
|
||||||
|
void free_atype(struct armor_type *wtype);
|
||||||
/* these constants are used with get_resourcetype.
|
/* these constants are used with get_resourcetype.
|
||||||
* The order of the enum is not important for stored data.
|
* The order of the enum is not important for stored data.
|
||||||
* The resourcenames array must be updated to match.
|
* The resourcenames array must be updated to match.
|
||||||
|
|
|
@ -82,8 +82,8 @@ struct message *msg_feedback(const struct unit *u, struct order *ord,
|
||||||
if (!mtype) {
|
if (!mtype) {
|
||||||
log_warning("trying to create message of unknown type \"%s\"\n", name);
|
log_warning("trying to create message of unknown type \"%s\"\n", name);
|
||||||
if (!mt_find("missing_feedback")) {
|
if (!mt_find("missing_feedback")) {
|
||||||
mt_register(mt_new_va("missing_feedback", "unit:unit",
|
mt_create_va(mt_new("missing_feedback", NULL), "unit:unit",
|
||||||
"region:region", "command:order", "name:string", MT_NEW_END));
|
"region:region", "command:order", "name:string", MT_NEW_END);
|
||||||
}
|
}
|
||||||
return msg_message("missing_feedback", "name unit region command",
|
return msg_message("missing_feedback", "name unit region command",
|
||||||
name, u, u->region, ord);
|
name, u, u->region, ord);
|
||||||
|
@ -153,7 +153,7 @@ static message *missing_message(const char *name) {
|
||||||
log_warning("trying to create undefined message of type \"%s\"\n", name);
|
log_warning("trying to create undefined message of type \"%s\"\n", name);
|
||||||
if (strcmp(name, "missing_message") != 0) {
|
if (strcmp(name, "missing_message") != 0) {
|
||||||
if (!mt_find("missing_message")) {
|
if (!mt_find("missing_message")) {
|
||||||
mt_register(mt_new_va("missing_message", "name:string", MT_NEW_END));
|
mt_create_va(mt_new("missing_message", NULL), "name:string", MT_NEW_END);
|
||||||
}
|
}
|
||||||
return msg_message("missing_message", "name", name);
|
return msg_message("missing_message", "name", name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,10 +22,10 @@ void test_missing_message(CuTest *tc) {
|
||||||
|
|
||||||
void test_message(CuTest *tc) {
|
void test_message(CuTest *tc) {
|
||||||
message *msg;
|
message *msg;
|
||||||
message_type *mtype = mt_new("custom", NULL);
|
message_type *mtype;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mtype);
|
mtype = mt_create(mt_new("custom", NULL), NULL, 0);
|
||||||
CuAssertPtrEquals(tc, mtype, (void *)mt_find("custom"));
|
CuAssertPtrEquals(tc, mtype, (void *)mt_find("custom"));
|
||||||
CuAssertIntEquals(tc, 0, mtype->nparameters);
|
CuAssertIntEquals(tc, 0, mtype->nparameters);
|
||||||
CuAssertPtrEquals(tc, NULL, (void *)mtype->pnames);
|
CuAssertPtrEquals(tc, NULL, (void *)mtype->pnames);
|
||||||
|
@ -47,11 +47,11 @@ void test_message(CuTest *tc) {
|
||||||
static void test_merge_split(CuTest *tc) {
|
static void test_merge_split(CuTest *tc) {
|
||||||
message_list *mlist = 0, *append = 0;
|
message_list *mlist = 0, *append = 0;
|
||||||
struct mlist **split; /* TODO: why is this a double asterisk? */
|
struct mlist **split; /* TODO: why is this a double asterisk? */
|
||||||
message_type *mtype = mt_new("custom", NULL);
|
message_type *mtype;
|
||||||
message *msg;
|
message *msg;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mtype);
|
mtype = mt_create(mt_new("custom", NULL), NULL, 0);
|
||||||
add_message(&mlist, msg = msg_message(mtype->name, ""));
|
add_message(&mlist, msg = msg_message(mtype->name, ""));
|
||||||
msg_release(msg);
|
msg_release(msg);
|
||||||
add_message(&append, msg = msg_message(mtype->name, ""));
|
add_message(&append, msg = msg_message(mtype->name, ""));
|
||||||
|
|
|
@ -95,12 +95,12 @@ static void free_nodes(node * root)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct selist *regions_in_range(struct region *start, int maxdist,
|
struct selist *regions_in_range(struct region *handle_start, int maxdist,
|
||||||
bool(*allowed) (const struct region *, const struct region *))
|
bool(*allowed) (const struct region *, const struct region *))
|
||||||
{
|
{
|
||||||
selist * rlist = NULL;
|
selist * rlist = NULL;
|
||||||
node *root = new_node(start, 0, NULL);
|
node *root = new_node(handle_start, 0, NULL);
|
||||||
node **end = &root->next;
|
node **handle_end = &root->next;
|
||||||
node *n = root;
|
node *n = root;
|
||||||
|
|
||||||
while (n != NULL) {
|
while (n != NULL) {
|
||||||
|
@ -125,8 +125,8 @@ struct selist *regions_in_range(struct region *start, int maxdist,
|
||||||
/* make sure we don't go here again, and put the region into the set for
|
/* make sure we don't go here again, and put the region into the set for
|
||||||
further BFS'ing */
|
further BFS'ing */
|
||||||
fset(rn, RF_MARK);
|
fset(rn, RF_MARK);
|
||||||
*end = new_node(rn, depth, n);
|
*handle_end = new_node(rn, depth, n);
|
||||||
end = &(*end)->next;
|
handle_end = &(*handle_end)->next;
|
||||||
}
|
}
|
||||||
n = n->next;
|
n = n->next;
|
||||||
}
|
}
|
||||||
|
@ -135,17 +135,17 @@ struct selist *regions_in_range(struct region *start, int maxdist,
|
||||||
return rlist;
|
return rlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
static region **internal_path_find(region * start, const region * target,
|
static region **internal_path_find(region * handle_start, const region * target,
|
||||||
int maxlen, bool(*allowed) (const region *, const region *))
|
int maxlen, bool(*allowed) (const region *, const region *))
|
||||||
{
|
{
|
||||||
static region *path[MAXDEPTH + 2]; /* STATIC_RETURN: used for return, not across calls */
|
static region *path[MAXDEPTH + 2]; /* STATIC_RETURN: used for return, not across calls */
|
||||||
direction_t d;
|
direction_t d;
|
||||||
node *root = new_node(start, 0, NULL);
|
node *root = new_node(handle_start, 0, NULL);
|
||||||
node **end = &root->next;
|
node **handle_end = &root->next;
|
||||||
node *n = root;
|
node *n = root;
|
||||||
bool found = false;
|
bool found = false;
|
||||||
assert(maxlen <= MAXDEPTH);
|
assert(maxlen <= MAXDEPTH);
|
||||||
fset(start, RF_MARK);
|
fset(handle_start, RF_MARK);
|
||||||
|
|
||||||
while (n != NULL) {
|
while (n != NULL) {
|
||||||
region *r = n->r;
|
region *r = n->r;
|
||||||
|
@ -173,8 +173,8 @@ static region **internal_path_find(region * start, const region * target,
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fset(rn, RF_MARK);
|
fset(rn, RF_MARK);
|
||||||
*end = new_node(rn, depth, n);
|
*handle_end = new_node(rn, depth, n);
|
||||||
end = &(*end)->next;
|
handle_end = &(*handle_end)->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (found)
|
if (found)
|
||||||
|
@ -188,22 +188,22 @@ static region **internal_path_find(region * start, const region * target,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
path_exists(region * start, const region * target, int maxlen,
|
path_exists(region * handle_start, const region * target, int maxlen,
|
||||||
bool(*allowed) (const region *, const region *))
|
bool(*allowed) (const region *, const region *))
|
||||||
{
|
{
|
||||||
assert((!fval(start, RF_MARK) && !fval(target, RF_MARK))
|
assert((!fval(handle_start, RF_MARK) && !fval(target, RF_MARK))
|
||||||
|| !"Some Algorithm did not clear its RF_MARKs!");
|
|| !"Some Algorithm did not clear its RF_MARKs!");
|
||||||
if (start == target)
|
if (handle_start == target)
|
||||||
return true;
|
return true;
|
||||||
if (internal_path_find(start, target, maxlen, allowed) != NULL)
|
if (internal_path_find(handle_start, target, maxlen, allowed) != NULL)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
region **path_find(region * start, const region * target, int maxlen,
|
region **path_find(region * handle_start, const region * target, int maxlen,
|
||||||
bool(*allowed) (const region *, const region *))
|
bool(*allowed) (const region *, const region *))
|
||||||
{
|
{
|
||||||
assert((!fval(start, RF_MARK) && !fval(target, RF_MARK))
|
assert((!fval(handle_start, RF_MARK) && !fval(target, RF_MARK))
|
||||||
|| !"Did you call path_init()?");
|
|| !"Did you call path_init()?");
|
||||||
return internal_path_find(start, target, maxlen, allowed);
|
return internal_path_find(handle_start, target, maxlen, allowed);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,10 +22,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern struct region **path_find(struct region *start,
|
extern struct region **path_find(struct region *handle_start,
|
||||||
const struct region *target, int maxlen,
|
const struct region *target, int maxlen,
|
||||||
bool(*allowed) (const struct region *, const struct region *));
|
bool(*allowed) (const struct region *, const struct region *));
|
||||||
extern bool path_exists(struct region *start, const struct region *target,
|
extern bool path_exists(struct region *handle_start, const struct region *target,
|
||||||
int maxlen, bool(*allowed) (const struct region *,
|
int maxlen, bool(*allowed) (const struct region *,
|
||||||
const struct region *));
|
const struct region *));
|
||||||
extern bool allowed_swim(const struct region *src,
|
extern bool allowed_swim(const struct region *src,
|
||||||
|
|
|
@ -310,7 +310,7 @@ static race *rc_find_i(const char *name)
|
||||||
for (i = 0; rc_depr[i]; i += 2) {
|
for (i = 0; rc_depr[i]; i += 2) {
|
||||||
if (strcmp(name, rc_depr[i]) == 0) {
|
if (strcmp(name, rc_depr[i]) == 0) {
|
||||||
rc = rc_find_i(rc_depr[i + 1]);
|
rc = rc_find_i(rc_depr[i + 1]);
|
||||||
log_warning("a reference was made to the retired race '%s', returning '%s'.", name, rc->_name);
|
log_info("a reference was made to the retired race '%s', returning '%s'.", name, rc->_name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -356,6 +356,7 @@ race *rc_create(const char *zName)
|
||||||
|
|
||||||
rc->magres.sa[1] = 1;
|
rc->magres.sa[1] = 1;
|
||||||
rc->hitpoints = 1;
|
rc->hitpoints = 1;
|
||||||
|
rc->flags = RCF_DEFAULT;
|
||||||
rc->weight = PERSON_WEIGHT;
|
rc->weight = PERSON_WEIGHT;
|
||||||
rc->capacity = 540;
|
rc->capacity = 540;
|
||||||
rc->income = 20;
|
rc->income = 20;
|
||||||
|
@ -453,6 +454,12 @@ int rc_herb_trade(const struct race *rc)
|
||||||
return 500;
|
return 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_study_speed(race *rc, skill_t sk, int modifier) {
|
||||||
|
if (!rc->study_speed)
|
||||||
|
rc->study_speed = calloc(1, MAXSKILLS);
|
||||||
|
rc->study_speed[sk] = (char)modifier;
|
||||||
|
}
|
||||||
|
|
||||||
const race *rc_otherrace(const race *rc)
|
const race *rc_otherrace(const race *rc)
|
||||||
{
|
{
|
||||||
variant *v = rc_getoption(rc, RCO_OTHER);
|
variant *v = rc_getoption(rc, RCO_OTHER);
|
||||||
|
@ -468,18 +475,13 @@ void rc_set_param(struct race *rc, const char *key, const char *value) {
|
||||||
if (strcmp(key, "recruit_multi") == 0) {
|
if (strcmp(key, "recruit_multi") == 0) {
|
||||||
rc->recruit_multi = atof(value);
|
rc->recruit_multi = atof(value);
|
||||||
}
|
}
|
||||||
else if (strcmp(key, "migrants.formula") == 0) {
|
|
||||||
if (value[0] == '1') {
|
|
||||||
rc->flags |= RCF_MIGRANTS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (strcmp(key, "other_race")==0) {
|
else if (strcmp(key, "other_race")==0) {
|
||||||
rc_setoption(rc, RCO_OTHER, value);
|
rc_setoption(rc, RCO_OTHER, value);
|
||||||
}
|
}
|
||||||
else if (strcmp(key, "ai.scare")==0) {
|
else if (strcmp(key, "scare")==0) {
|
||||||
rc_setoption(rc, RCO_SCARE, value);
|
rc_setoption(rc, RCO_SCARE, value);
|
||||||
}
|
}
|
||||||
else if (strcmp(key, "hunger.damage")==0) {
|
else if (strcmp(key, "hunger_damage")==0) {
|
||||||
rc_setoption(rc, RCO_HUNGER, value);
|
rc_setoption(rc, RCO_HUNGER, value);
|
||||||
}
|
}
|
||||||
else if (strcmp(key, "armor.stamina")==0) {
|
else if (strcmp(key, "armor.stamina")==0) {
|
||||||
|
|
|
@ -129,7 +129,7 @@ extern "C" {
|
||||||
int weight;
|
int weight;
|
||||||
int capacity;
|
int capacity;
|
||||||
int income;
|
int income;
|
||||||
float speed;
|
double speed;
|
||||||
int hitpoints;
|
int hitpoints;
|
||||||
char *def_damage;
|
char *def_damage;
|
||||||
int armor;
|
int armor;
|
||||||
|
@ -202,7 +202,7 @@ extern "C" {
|
||||||
int rc_get_mask(char *list);
|
int rc_get_mask(char *list);
|
||||||
|
|
||||||
/* Flags. Do not reorder these without changing json_race() in jsonconf.c */
|
/* Flags. Do not reorder these without changing json_race() in jsonconf.c */
|
||||||
#define RCF_NPC (1<<0) /* cannot be the race for a player faction (and other limits?) */
|
#define RCF_PLAYABLE (1<<0) /* cannot be the race for a player faction (and other limits?) */
|
||||||
#define RCF_KILLPEASANTS (1<<1) /* a monster that eats peasants */
|
#define RCF_KILLPEASANTS (1<<1) /* a monster that eats peasants */
|
||||||
#define RCF_SCAREPEASANTS (1<<2) /* a monster that scares peasants out of the hex */
|
#define RCF_SCAREPEASANTS (1<<2) /* a monster that scares peasants out of the hex */
|
||||||
#define RCF_NOSTEAL (1<<3) /* this race has high stealth, but is not allowed to steal */
|
#define RCF_NOSTEAL (1<<3) /* this race has high stealth, but is not allowed to steal */
|
||||||
|
@ -229,18 +229,20 @@ extern "C" {
|
||||||
#define RCF_CANSAIL (1<<24) /* Einheit darf Schiffe betreten */
|
#define RCF_CANSAIL (1<<24) /* Einheit darf Schiffe betreten */
|
||||||
#define RCF_INVISIBLE (1<<25) /* not visible in any report */
|
#define RCF_INVISIBLE (1<<25) /* not visible in any report */
|
||||||
#define RCF_SHIPSPEED (1<<26) /* race gets +1 on shipspeed */
|
#define RCF_SHIPSPEED (1<<26) /* race gets +1 on shipspeed */
|
||||||
#define RCF_MIGRANTS (1<<27) /* may have migrant units (human bonus) */
|
#define RCF_ATTACK_MOVED (1<<27) /* may attack if it has moved */
|
||||||
#define RCF_FAMILIAR (1<<28) /* may be a familiar */
|
#define RCF_MIGRANTS (1<<28) /* may have migrant units (human bonus) */
|
||||||
#define RCF_ATTACK_MOVED (1<<29) /* may attack if it has moved */
|
#define RCF_FAMILIAR (1<<29) /* may be a familiar */
|
||||||
|
|
||||||
|
#define RCF_DEFAULT RCF_CANSAIL
|
||||||
|
|
||||||
/* Economic flags */
|
/* Economic flags */
|
||||||
#define ECF_GIVEPERSON (1<<2) /* <20>bergibt Personen */
|
#define ECF_GIVEPERSON (1<<0) /* <20>bergibt Personen */
|
||||||
#define ECF_GIVEUNIT (1<<3) /* Einheiten an andere Partei <20>bergeben */
|
#define ECF_GIVEUNIT (1<<1) /* Einheiten an andere Partei <20>bergeben */
|
||||||
#define ECF_GETITEM (1<<4) /* nimmt Gegenst<73>nde an */
|
#define ECF_GETITEM (1<<2) /* nimmt Gegenst<73>nde an */
|
||||||
#define ECF_REC_ETHEREAL (1<<7) /* Rekrutiert aus dem Nichts */
|
#define ECF_REC_ETHEREAL (1<<3) /* Rekrutiert aus dem Nichts */
|
||||||
#define ECF_REC_UNLIMITED (1<<8) /* Rekrutiert ohne Limit */
|
#define ECF_REC_UNLIMITED (1<<4) /* Rekrutiert ohne Limit */
|
||||||
#define ECF_STONEGOLEM (1<<9) /* race gets stonegolem properties */
|
#define ECF_STONEGOLEM (1<<5) /* race gets stonegolem properties */
|
||||||
#define ECF_IRONGOLEM (1<<10) /* race gets irongolem properties */
|
#define ECF_IRONGOLEM (1<<6) /* race gets irongolem properties */
|
||||||
|
|
||||||
/* Battle-Flags */
|
/* Battle-Flags */
|
||||||
#define BF_EQUIPMENT (1<<0) /* Kann Ausr<73>stung benutzen */
|
#define BF_EQUIPMENT (1<<0) /* Kann Ausr<73>stung benutzen */
|
||||||
|
@ -254,7 +256,7 @@ extern "C" {
|
||||||
const char *racename(const struct locale *lang, const struct unit *u,
|
const char *racename(const struct locale *lang, const struct unit *u,
|
||||||
const race * rc);
|
const race * rc);
|
||||||
|
|
||||||
#define playerrace(rc) (!((rc)->flags & RCF_NPC))
|
#define playerrace(rc) ((rc)->flags & RCF_PLAYABLE)
|
||||||
#define dragonrace(rc) ((rc)->flags & RCF_DRAGON)
|
#define dragonrace(rc) ((rc)->flags & RCF_DRAGON)
|
||||||
#define humanoidrace(rc) (((rc)->flags & RCF_UNDEAD) || (rc)==get_race(RC_DRACOID) || playerrace(rc))
|
#define humanoidrace(rc) (((rc)->flags & RCF_UNDEAD) || (rc)==get_race(RC_DRACOID) || playerrace(rc))
|
||||||
#define illusionaryrace(rc) ((rc)->flags & RCF_ILLUSIONARY)
|
#define illusionaryrace(rc) ((rc)->flags & RCF_ILLUSIONARY)
|
||||||
|
@ -271,6 +273,7 @@ extern "C" {
|
||||||
const char *raceprefix(const struct unit *u);
|
const char *raceprefix(const struct unit *u);
|
||||||
void register_race_function(race_func, const char *);
|
void register_race_function(race_func, const char *);
|
||||||
|
|
||||||
|
void set_study_speed(struct race *rc, skill_t sk, int modifier);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -50,7 +50,7 @@ static void test_rc_defaults(CuTest *tc) {
|
||||||
CuAssertDblEquals(tc, 1.0, rc->recruit_multi, 0.0);
|
CuAssertDblEquals(tc, 1.0, rc->recruit_multi, 0.0);
|
||||||
CuAssertDblEquals(tc, 1.0, rc->regaura, 0.0);
|
CuAssertDblEquals(tc, 1.0, rc->regaura, 0.0);
|
||||||
CuAssertDblEquals(tc, 1.0, rc->speed, 0.0);
|
CuAssertDblEquals(tc, 1.0, rc->speed, 0.0);
|
||||||
CuAssertIntEquals(tc, 0, rc->flags);
|
CuAssertIntEquals(tc, RCF_DEFAULT, rc->flags);
|
||||||
CuAssertIntEquals(tc, 0, rc->recruitcost);
|
CuAssertIntEquals(tc, 0, rc->recruitcost);
|
||||||
CuAssertIntEquals(tc, 0, rc->maintenance);
|
CuAssertIntEquals(tc, 0, rc->maintenance);
|
||||||
CuAssertIntEquals(tc, 540, rc->capacity);
|
CuAssertIntEquals(tc, 540, rc->capacity);
|
||||||
|
@ -112,12 +112,11 @@ static void test_rc_set_param(CuTest *tc) {
|
||||||
CuAssertPtrEquals(tc, NULL, rc->options);
|
CuAssertPtrEquals(tc, NULL, rc->options);
|
||||||
rc_set_param(rc, "recruit_multi", "0.5");
|
rc_set_param(rc, "recruit_multi", "0.5");
|
||||||
CuAssertDblEquals(tc, 0.5, rc->recruit_multi, 0.0);
|
CuAssertDblEquals(tc, 0.5, rc->recruit_multi, 0.0);
|
||||||
rc_set_param(rc, "migrants.formula", "1");
|
rc->flags |= RCF_MIGRANTS;
|
||||||
CuAssertIntEquals(tc, RCF_MIGRANTS, rc->flags&RCF_MIGRANTS);
|
|
||||||
CuAssertIntEquals(tc, MIGRANTS_LOG10, rc_migrants_formula(rc));
|
CuAssertIntEquals(tc, MIGRANTS_LOG10, rc_migrants_formula(rc));
|
||||||
rc_set_param(rc, "ai.scare", "400");
|
rc_set_param(rc, "scare", "400");
|
||||||
CuAssertIntEquals(tc, 400, rc_scare(rc));
|
CuAssertIntEquals(tc, 400, rc_scare(rc));
|
||||||
rc_set_param(rc, "hunger.damage", "1d10+12");
|
rc_set_param(rc, "hunger_damage", "1d10+12");
|
||||||
CuAssertStrEquals(tc, "1d10+12", rc_hungerdamage(rc));
|
CuAssertStrEquals(tc, "1d10+12", rc_hungerdamage(rc));
|
||||||
test_teardown();
|
test_teardown();
|
||||||
}
|
}
|
||||||
|
|
|
@ -971,16 +971,16 @@ static char *makename(void)
|
||||||
size_t nk, ne, nv, ns;
|
size_t nk, ne, nv, ns;
|
||||||
static char name[16];
|
static char name[16];
|
||||||
const char *kons = "bcdfghklmnprstvwz",
|
const char *kons = "bcdfghklmnprstvwz",
|
||||||
*start = "bcdgtskpvfr",
|
*handle_start = "bcdgtskpvfr",
|
||||||
*end = "nlrdst",
|
*handle_end = "nlrdst",
|
||||||
*vowels = "aaaaaaaaaaaeeeeeeeeeeeeiiiiiiiiiiioooooooooooouuuuuuuuuuyy";
|
*vowels = "aaaaaaaaaaaeeeeeeeeeeeeiiiiiiiiiiioooooooooooouuuuuuuuuuyy";
|
||||||
|
|
||||||
/* const char * vowels_latin1 = "aaaaaaaaaàâeeeeeeeeeéèêiiiiiiiiiíîoooooooooóòôuuuuuuuuuúyy"; */
|
/* const char * vowels_latin1 = "aaaaaaaaaàâeeeeeeeeeéèêiiiiiiiiiíîoooooooooóòôuuuuuuuuuúyy"; */
|
||||||
|
|
||||||
nk = strlen(kons);
|
nk = strlen(kons);
|
||||||
ne = strlen(end);
|
ne = strlen(handle_end);
|
||||||
nv = strlen(vowels);
|
nv = strlen(vowels);
|
||||||
ns = strlen(start);
|
ns = strlen(handle_start);
|
||||||
|
|
||||||
for (s = rng_int() % 3 + 2; s > 0; s--) {
|
for (s = rng_int() % 3 + 2; s > 0; s--) {
|
||||||
int v;
|
int v;
|
||||||
|
@ -991,7 +991,7 @@ static char *makename(void)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
k = rng_int() % (int)ns;
|
k = rng_int() % (int)ns;
|
||||||
name[p] = start[k];
|
name[p] = handle_start[k];
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
v = rng_int() % (int)nv;
|
v = rng_int() % (int)nv;
|
||||||
|
@ -999,7 +999,7 @@ static char *makename(void)
|
||||||
p++;
|
p++;
|
||||||
if (rng_int() % 3 == 2 || s == 1) {
|
if (rng_int() % 3 == 2 || s == 1) {
|
||||||
e = rng_int() % (int)ne;
|
e = rng_int() % (int)ne;
|
||||||
name[p] = end[e];
|
name[p] = handle_end[e];
|
||||||
p++;
|
p++;
|
||||||
x = 1;
|
x = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,15 +180,15 @@ struct rawmaterial_type *rmt_create(struct resource_type *rtype)
|
||||||
{
|
{
|
||||||
rawmaterial_type *rmtype;
|
rawmaterial_type *rmtype;
|
||||||
|
|
||||||
assert(!rtype->raw);
|
if (!rtype->raw) {
|
||||||
assert(!rtype->itype || rtype->itype->construction);
|
rmtype = rtype->raw = malloc(sizeof(rawmaterial_type));
|
||||||
rmtype = rtype->raw = malloc(sizeof(rawmaterial_type));
|
rmtype->rtype = rtype;
|
||||||
rmtype->rtype = rtype;
|
rmtype->terraform = terraform_default;
|
||||||
rmtype->terraform = terraform_default;
|
rmtype->update = NULL;
|
||||||
rmtype->update = NULL;
|
rmtype->use = use_default;
|
||||||
rmtype->use = use_default;
|
rmtype->visible = visible_default;
|
||||||
rmtype->visible = visible_default;
|
}
|
||||||
return rmtype;
|
return rtype->raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
int limit_resource(const struct region *r, const resource_type *rtype)
|
int limit_resource(const struct region *r, const resource_type *rtype)
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
#include <platform.h>
|
|
||||||
#include "rules.h"
|
|
||||||
|
|
||||||
int write_rules(const char *filename) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int read_rules(const char *filename)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
int read_rules(const char *filename);
|
|
||||||
int write_rules(const char * filename);
|
|
||||||
|
|
|
@ -42,7 +42,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include <util/log.h>
|
#include <util/log.h>
|
||||||
#include <util/strings.h>
|
#include <util/strings.h>
|
||||||
#include <util/umlaut.h>
|
#include <util/umlaut.h>
|
||||||
#include <util/xml.h>
|
|
||||||
|
|
||||||
#include <storage.h>
|
#include <storage.h>
|
||||||
#include <selist.h>
|
#include <selist.h>
|
||||||
|
|
|
@ -4099,11 +4099,11 @@ static void reset_game(void)
|
||||||
|
|
||||||
void turn_begin(void)
|
void turn_begin(void)
|
||||||
{
|
{
|
||||||
int start = first_turn();
|
int handle_start = first_turn();
|
||||||
assert(turn >= 0);
|
assert(turn >= 0);
|
||||||
if (turn < start) {
|
if (turn < handle_start) {
|
||||||
/* this should only happen during tests */
|
/* this should only happen during tests */
|
||||||
turn = start;
|
turn = handle_start;
|
||||||
}
|
}
|
||||||
++turn;
|
++turn;
|
||||||
reset_game();
|
reset_game();
|
||||||
|
|
|
@ -258,7 +258,7 @@ static void test_force_leave_buildings(CuTest *tc) {
|
||||||
building * b;
|
building * b;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("force_leave_building", "unit:unit", "owner:unit", "building:building", MT_NEW_END));
|
mt_create_va(mt_new("force_leave_building", NULL), "unit:unit", "owner:unit", "building:building", MT_NEW_END);
|
||||||
r = test_create_region(0, 0, test_create_terrain("plain", LAND_REGION));
|
r = test_create_region(0, 0, test_create_terrain("plain", LAND_REGION));
|
||||||
u1 = test_create_unit(test_create_faction(NULL), r);
|
u1 = test_create_unit(test_create_faction(NULL), r);
|
||||||
u2 = test_create_unit(u1->faction, r);
|
u2 = test_create_unit(u1->faction, r);
|
||||||
|
@ -288,7 +288,7 @@ static void test_force_leave_ships(CuTest *tc) {
|
||||||
ship *sh;
|
ship *sh;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("force_leave_ship", "unit:unit", "owner:unit", "ship:ship", MT_NEW_END));
|
mt_create_va(mt_new("force_leave_ship", NULL), "unit:unit", "owner:unit", "ship:ship", MT_NEW_END);
|
||||||
r = test_create_region(0, 0, test_create_terrain("plain", LAND_REGION));
|
r = test_create_region(0, 0, test_create_terrain("plain", LAND_REGION));
|
||||||
u1 = test_create_unit(test_create_faction(NULL), r);
|
u1 = test_create_unit(test_create_faction(NULL), r);
|
||||||
u2 = test_create_unit(test_create_faction(NULL), r);
|
u2 = test_create_unit(test_create_faction(NULL), r);
|
||||||
|
@ -876,7 +876,7 @@ static void test_luck_message(CuTest *tc) {
|
||||||
attrib *a;
|
attrib *a;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("peasantluck_success", "births:int", MT_NEW_END));
|
mt_create_va(mt_new("peasantluck_success", NULL), "births:int", MT_NEW_END);
|
||||||
setup_terrains(tc);
|
setup_terrains(tc);
|
||||||
r = test_create_region(0, 0, NULL);
|
r = test_create_region(0, 0, NULL);
|
||||||
rsetpeasants(r, 1);
|
rsetpeasants(r, 1);
|
||||||
|
@ -901,8 +901,8 @@ static unit * setup_name_cmd(void) {
|
||||||
faction *f;
|
faction *f;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("renamed_building_seen", "renamer:unit", "region:region", "building:building", MT_NEW_END));
|
mt_create_va(mt_new("renamed_building_seen", NULL), "renamer:unit", "region:region", "building:building", MT_NEW_END);
|
||||||
mt_register(mt_new_va("renamed_building_notseen", "region:region", "building:building", MT_NEW_END));
|
mt_create_va(mt_new("renamed_building_notseen", NULL), "region:region", "building:building", MT_NEW_END);
|
||||||
f = test_create_faction(NULL);
|
f = test_create_faction(NULL);
|
||||||
return test_create_unit(f, test_create_region(0, 0, NULL));
|
return test_create_unit(f, test_create_region(0, 0, NULL));
|
||||||
}
|
}
|
||||||
|
@ -1301,9 +1301,9 @@ static void test_ally_cmd(CuTest *tc) {
|
||||||
static void test_nmr_warnings(CuTest *tc) {
|
static void test_nmr_warnings(CuTest *tc) {
|
||||||
faction *f1, *f2;
|
faction *f1, *f2;
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("nmr_warning", MT_NEW_END));
|
mt_create_va(mt_new("nmr_warning", NULL), MT_NEW_END);
|
||||||
mt_register(mt_new_va("nmr_warning_final", MT_NEW_END));
|
mt_create_va(mt_new("nmr_warning_final", NULL), MT_NEW_END);
|
||||||
mt_register(mt_new_va("warn_dropout", "faction:faction", "turn:int", MT_NEW_END));
|
mt_create_va(mt_new("warn_dropout", NULL), "faction:faction", "turn:int", MT_NEW_END);
|
||||||
config_set("nmr.timeout", "3");
|
config_set("nmr.timeout", "3");
|
||||||
f1 = test_create_faction(NULL);
|
f1 = test_create_faction(NULL);
|
||||||
f2 = test_create_faction(NULL);
|
f2 = test_create_faction(NULL);
|
||||||
|
@ -1325,9 +1325,9 @@ static unit * setup_mail_cmd(void) {
|
||||||
faction *f;
|
faction *f;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("regionmessage", "region:region", "sender:unit", "string:string", MT_NEW_END));
|
mt_create_va(mt_new("regionmessage", NULL), "region:region", "sender:unit", "string:string", MT_NEW_END);
|
||||||
mt_register(mt_new_va("unitmessage", "region:region", "sender:unit", "string:string", "unit:unit", MT_NEW_END));
|
mt_create_va(mt_new("unitmessage", NULL), "region:region", "sender:unit", "string:string", "unit:unit", MT_NEW_END);
|
||||||
mt_register(mt_new_va("mail_result", "message:string", "unit:unit", MT_NEW_END));
|
mt_create_va(mt_new("mail_result", NULL), "message:string", "unit:unit", MT_NEW_END);
|
||||||
f = test_create_faction(NULL);
|
f = test_create_faction(NULL);
|
||||||
return test_create_unit(f, test_create_region(0, 0, NULL));
|
return test_create_unit(f, test_create_region(0, 0, NULL));
|
||||||
}
|
}
|
||||||
|
@ -1444,7 +1444,7 @@ static void test_show_without_item(CuTest *tc)
|
||||||
struct locale *loc;
|
struct locale *loc;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("displayitem", "weight:int", "item:resource", "description:string", MT_NEW_END));
|
mt_create_va(mt_new("displayitem", NULL), "weight:int", "item:resource", "description:string", MT_NEW_END);
|
||||||
|
|
||||||
loc = get_or_create_locale("de");
|
loc = get_or_create_locale("de");
|
||||||
locale_setstring(loc, parameters[P_ANY], "ALLE");
|
locale_setstring(loc, parameters[P_ANY], "ALLE");
|
||||||
|
@ -1489,7 +1489,7 @@ static void test_show_race(CuTest *tc) {
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
|
|
||||||
mt_register(mt_new_va("msg_event", "string:string", MT_NEW_END));
|
mt_create_va(mt_new("msg_event", NULL), "string:string", MT_NEW_END);
|
||||||
test_create_race("human");
|
test_create_race("human");
|
||||||
rc = test_create_race("elf");
|
rc = test_create_race("elf");
|
||||||
|
|
||||||
|
@ -1529,8 +1529,8 @@ static void test_show_both(CuTest *tc) {
|
||||||
message * msg;
|
message * msg;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("msg_event", "string:string", MT_NEW_END));
|
mt_create_va(mt_new("msg_event", NULL), "string:string", MT_NEW_END);
|
||||||
mt_register(mt_new_va("displayitem", "weight:int", "item:resource", "description:string", MT_NEW_END));
|
mt_create_va(mt_new("displayitem", NULL), "weight:int", "item:resource", "description:string", MT_NEW_END);
|
||||||
rc = test_create_race("elf");
|
rc = test_create_race("elf");
|
||||||
test_create_itemtype("elvenhorse");
|
test_create_itemtype("elvenhorse");
|
||||||
|
|
||||||
|
|
|
@ -2068,11 +2068,11 @@ void free_castorder(struct castorder *co)
|
||||||
void add_castorder(spellrank * cll, castorder * co)
|
void add_castorder(spellrank * cll, castorder * co)
|
||||||
{
|
{
|
||||||
if (cll->begin == NULL) {
|
if (cll->begin == NULL) {
|
||||||
cll->end = &cll->begin;
|
cll->handle_end = &cll->begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
*cll->end = co;
|
*cll->handle_end = co;
|
||||||
cll->end = &co->next;
|
cll->handle_end = &co->next;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
40
src/magic.h
40
src/magic.h
|
@ -154,28 +154,28 @@ extern "C" {
|
||||||
#define FARCASTING (1<<0) /* ZAUBER [struct region x y] */
|
#define FARCASTING (1<<0) /* ZAUBER [struct region x y] */
|
||||||
#define SPELLLEVEL (1<<1) /* ZAUBER [STUFE x] */
|
#define SPELLLEVEL (1<<1) /* ZAUBER [STUFE x] */
|
||||||
|
|
||||||
/* ID's können zu drei unterschiedlichen Entitäten gehören: Einheiten,
|
#define OCEANCASTABLE (1<<2) /* Können auch nicht-Meermenschen auf
|
||||||
* Gebäuden und Schiffen. */
|
hoher See zaubern */
|
||||||
#define UNITSPELL (1<<2) /* ZAUBER .. <Einheit-Nr> [<Einheit-Nr> ..] */
|
#define ONSHIPCAST (1<<3) /* kann auch auf von Land ablegenden
|
||||||
#define SHIPSPELL (1<<3) /* ZAUBER .. <Schiff-Nr> [<Schiff-Nr> ..] */
|
Schiffen stehend gezaubert werden */
|
||||||
#define BUILDINGSPELL (1<<4) /* ZAUBER .. <Gebaeude-Nr> [<Gebaeude-Nr> ..] */
|
#define TESTCANSEE (1<<4) /* alle Zielunits auf cansee prüfen */
|
||||||
#define REGIONSPELL (1<<5) /* wirkt auf struct region */
|
|
||||||
|
|
||||||
#define PRECOMBATSPELL (1<<7) /* PRÄKAMPFZAUBER .. */
|
/* ID's können zu drei unterschiedlichen Entitäten gehören: Einheiten,
|
||||||
#define COMBATSPELL (1<<8) /* KAMPFZAUBER .. */
|
* Gebäuden und Schiffen. */
|
||||||
#define POSTCOMBATSPELL (1<<9) /* POSTKAMPFZAUBER .. */
|
#define UNITSPELL (1<<5) /* ZAUBER .. <Einheit-Nr> [<Einheit-Nr> ..] */
|
||||||
|
#define SHIPSPELL (1<<6) /* ZAUBER .. <Schiff-Nr> [<Schiff-Nr> ..] */
|
||||||
|
#define BUILDINGSPELL (1<<7) /* ZAUBER .. <Gebaeude-Nr> [<Gebaeude-Nr> ..] */
|
||||||
|
#define REGIONSPELL (1<<8) /* wirkt auf struct region */
|
||||||
|
#define GLOBALTARGET (1<<9) /* Ziel kann ausserhalb der region sein */
|
||||||
|
|
||||||
|
#define PRECOMBATSPELL (1<<10) /* PRÄKAMPFZAUBER .. */
|
||||||
|
#define COMBATSPELL (1<<11) /* KAMPFZAUBER .. */
|
||||||
|
#define POSTCOMBATSPELL (1<<12) /* POSTKAMPFZAUBER .. */
|
||||||
#define ISCOMBATSPELL (PRECOMBATSPELL|COMBATSPELL|POSTCOMBATSPELL)
|
#define ISCOMBATSPELL (PRECOMBATSPELL|COMBATSPELL|POSTCOMBATSPELL)
|
||||||
|
|
||||||
#define OCEANCASTABLE (1<<10) /* Können auch nicht-Meermenschen auf
|
|
||||||
hoher See zaubern */
|
#define TESTRESISTANCE (1<<13) /* Zielobjekte auf Magieresistenz prüfen. not used in XML? */
|
||||||
#define ONSHIPCAST (1<<11) /* kann auch auf von Land ablegenden
|
#define NOTFAMILIARCAST (1<<14) /* not used by XML? */
|
||||||
Schiffen stehend gezaubert werden */
|
|
||||||
/* */
|
|
||||||
#define NOTFAMILIARCAST (1<<12)
|
|
||||||
#define TESTRESISTANCE (1<<13) /* alle Zielobjekte (u, s, b, r) auf
|
|
||||||
Magieresistenz prüfen */
|
|
||||||
#define GLOBALTARGET (1<<14) /* Ziel muss in der target_region sein */
|
|
||||||
#define TESTCANSEE (1<<15) /* alle Zielunits auf cansee prüfen */
|
|
||||||
#define ANYTARGET (UNITSPELL|REGIONSPELL|BUILDINGSPELL|SHIPSPELL) /* wirkt auf alle objekttypen (unit, ship, building, region) */
|
#define ANYTARGET (UNITSPELL|REGIONSPELL|BUILDINGSPELL|SHIPSPELL) /* wirkt auf alle objekttypen (unit, ship, building, region) */
|
||||||
|
|
||||||
/* Flag Spruchkostenberechnung: */
|
/* Flag Spruchkostenberechnung: */
|
||||||
|
@ -272,7 +272,7 @@ extern "C" {
|
||||||
|
|
||||||
typedef struct spellrank {
|
typedef struct spellrank {
|
||||||
struct castorder *begin;
|
struct castorder *begin;
|
||||||
struct castorder **end;
|
struct castorder **handle_end;
|
||||||
} spellrank;
|
} spellrank;
|
||||||
|
|
||||||
struct castorder *create_castorder(struct castorder * co, struct unit *caster,
|
struct castorder *create_castorder(struct castorder * co, struct unit *caster,
|
||||||
|
|
|
@ -33,7 +33,7 @@ static void test_market_curse(CuTest * tc)
|
||||||
building_type *btype;
|
building_type *btype;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("buyamount", "unit:unit", "amount:int", "resource:resource", MT_NEW_END));
|
mt_create_va(mt_new("buyamount", NULL), "unit:unit", "amount:int", "resource:resource", MT_NEW_END);
|
||||||
|
|
||||||
htype = test_create_itemtype("herb");
|
htype = test_create_itemtype("herb");
|
||||||
htype->flags |= ITF_HERB;
|
htype->flags |= ITF_HERB;
|
||||||
|
|
|
@ -848,15 +848,15 @@ static double chaosfactor(region * r)
|
||||||
return fval(r, RF_CHAOTIC) ? ((double)(1 + get_chaoscount(r)) / 1000.0) : 0.0;
|
return fval(r, RF_CHAOTIC) ? ((double)(1 + get_chaoscount(r)) / 1000.0) : 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nrand(int start, int sub)
|
static int nrand(int handle_start, int sub)
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (rng_int() % 100 < start)
|
if (rng_int() % 100 < handle_start)
|
||||||
res++;
|
res++;
|
||||||
start -= sub;
|
handle_start -= sub;
|
||||||
} while (start > 0);
|
} while (handle_start > 0);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,16 +51,21 @@ static void create_monsters(unit **up, unit **um) {
|
||||||
region *r;
|
region *r;
|
||||||
faction *fp, *fm;
|
faction *fp, *fm;
|
||||||
|
|
||||||
mt_register(mt_new_va("dragon_growl", "dragon:unit", "number:int", "target:region", "growl:string", MT_NEW_END));
|
mt_create_va(mt_new("dragon_growl", NULL),
|
||||||
|
"dragon:unit", "number:int", "target:region", "growl:string", MT_NEW_END);
|
||||||
test_create_horse();
|
test_create_horse();
|
||||||
default_locale = test_create_locale();
|
default_locale = test_create_locale();
|
||||||
fp = test_create_faction(NULL);
|
fp = test_create_faction(NULL);
|
||||||
|
|
||||||
fm = get_or_create_monsters();
|
fm = get_or_create_monsters();
|
||||||
|
fset(fm, FFL_NOIDLEOUT);
|
||||||
|
assert(fval(fm, FFL_NPC));
|
||||||
|
assert(fval(fm, FFL_NOIDLEOUT));
|
||||||
|
|
||||||
assert(rc_find(fm->race->_name));
|
assert(rc_find(fm->race->_name));
|
||||||
rc = rc_get_or_create(fm->race->_name);
|
rc = rc_get_or_create(fm->race->_name);
|
||||||
fset(rc, RCF_UNARMEDGUARD|RCF_NPC|RCF_DRAGON);
|
fset(rc, RCF_UNARMEDGUARD|RCF_DRAGON);
|
||||||
fset(fm, FFL_NOIDLEOUT);
|
assert(!fval(fm->race, RCF_PLAYABLE));
|
||||||
assert(fval(fm, FFL_NPC) && fval(fm->race, RCF_UNARMEDGUARD) && fval(fm->race, RCF_NPC) && fval(fm, FFL_NOIDLEOUT));
|
|
||||||
|
|
||||||
test_create_region(-1, 0, test_create_terrain("ocean", SEA_REGION | SWIM_INTO | FLY_INTO));
|
test_create_region(-1, 0, test_create_terrain("ocean", SEA_REGION | SWIM_INTO | FLY_INTO));
|
||||||
test_create_region(1, 0, 0);
|
test_create_region(1, 0, 0);
|
||||||
|
@ -219,8 +224,6 @@ static void test_dragon_moves(CuTest * tc)
|
||||||
plan_monsters(m->faction);
|
plan_monsters(m->faction);
|
||||||
CuAssertPtrNotNull(tc, find_order("move east", m));
|
CuAssertPtrNotNull(tc, find_order("move east", m));
|
||||||
|
|
||||||
mt_register(mt_new_va("dragon_growl", "dragon:unit", "number:int", "target:region", "growl:string", MT_NEW_END));
|
|
||||||
|
|
||||||
random_growl(m, findregion(1, 0), 3);
|
random_growl(m, findregion(1, 0), 3);
|
||||||
|
|
||||||
msg = test_get_last_message(r->msgs);
|
msg = test_get_last_message(r->msgs);
|
||||||
|
@ -261,12 +264,12 @@ static void test_spawn_seaserpent(CuTest *tc) {
|
||||||
race *rc;
|
race *rc;
|
||||||
test_setup();
|
test_setup();
|
||||||
rc = test_create_race("seaserpent");
|
rc = test_create_race("seaserpent");
|
||||||
rc->flags |= RCF_NPC;
|
rc->flags &= ~RCF_PLAYABLE;
|
||||||
r = test_create_region(0, 0, NULL);
|
r = test_create_region(0, 0, NULL);
|
||||||
f = test_create_faction(NULL);
|
f = test_create_faction(NULL);
|
||||||
u = spawn_seaserpent(r, f);
|
u = spawn_seaserpent(r, f);
|
||||||
CuAssertPtrNotNull(tc, u);
|
CuAssertPtrNotNull(tc, u);
|
||||||
CuAssertPtrEquals(tc, 0, u->_name);
|
CuAssertPtrEquals(tc, NULL, u->_name);
|
||||||
test_teardown();
|
test_teardown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,8 +28,10 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
static void setup_move(void) {
|
static void setup_move(void) {
|
||||||
mt_register(mt_new_va("travel", "unit:unit", "start:region", "end:region", "mode:int", "regions:regions", MT_NEW_END));
|
mt_create_va(mt_new("travel", NULL),
|
||||||
mt_register(mt_new_va("moveblocked", "unit:unit", "direction:int", MT_NEW_END));
|
"unit:unit", "start:region", "end:region", "mode:int", "regions:regions", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("moveblocked", NULL),
|
||||||
|
"unit:unit", "direction:int", MT_NEW_END);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_ship_not_allowed_in_coast(CuTest * tc)
|
static void test_ship_not_allowed_in_coast(CuTest * tc)
|
||||||
|
@ -285,9 +287,12 @@ void setup_drift (struct drift_fixture *fix) {
|
||||||
u_set_ship(fix->u, fix->sh = test_create_ship(fix->u->region, fix->st_boat));
|
u_set_ship(fix->u, fix->sh = test_create_ship(fix->u->region, fix->st_boat));
|
||||||
assert(fix->sh);
|
assert(fix->sh);
|
||||||
|
|
||||||
mt_register(mt_new_va("ship_drift", "ship:ship", "dir:int", MT_NEW_END));
|
mt_create_va(mt_new("ship_drift", NULL),
|
||||||
mt_register(mt_new_va("shipsink", "ship:ship", MT_NEW_END));
|
"ship:ship", "dir:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("massive_overload", "ship:ship", MT_NEW_END));
|
mt_create_va(mt_new("shipsink", NULL),
|
||||||
|
"ship:ship", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("massive_overload", NULL),
|
||||||
|
"ship:ship", MT_NEW_END);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_ship_no_overload(CuTest *tc) {
|
static void test_ship_no_overload(CuTest *tc) {
|
||||||
|
@ -482,7 +487,8 @@ static void test_follow_ship_msg(CuTest * tc) {
|
||||||
td->dir = D_NORTHWEST;
|
td->dir = D_NORTHWEST;
|
||||||
td->age = 2;
|
td->age = 2;
|
||||||
|
|
||||||
mt_register(mt_new_va("error18", "unit:unit", "region:region", "command:order", MT_NEW_END));
|
mt_create_va(mt_new("error18", NULL),
|
||||||
|
"unit:unit", "region:region", "command:order", MT_NEW_END);
|
||||||
|
|
||||||
init_order_depr(ord);
|
init_order_depr(ord);
|
||||||
getstrtoken();
|
getstrtoken();
|
||||||
|
|
|
@ -64,7 +64,7 @@ static void test_faction_password_bad(CuTest *tc) {
|
||||||
const char *orders[] = { "ERESSEA 1 password", NULL };
|
const char *orders[] = { "ERESSEA 1 password", NULL };
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("wrongpasswd", "password:string", MT_NEW_END));
|
mt_create_va(mt_new("wrongpasswd", NULL), "password:string", MT_NEW_END);
|
||||||
|
|
||||||
f = test_create_faction(NULL);
|
f = test_create_faction(NULL);
|
||||||
renumber_faction(f, 1);
|
renumber_faction(f, 1);
|
||||||
|
|
|
@ -30,12 +30,18 @@ static void setup_piracy(void) {
|
||||||
st_boat = test_create_shiptype("boat");
|
st_boat = test_create_shiptype("boat");
|
||||||
st_boat->cargo = 1000;
|
st_boat->cargo = 1000;
|
||||||
|
|
||||||
mt_register(mt_new_va("piratenovictim", "ship:ship", "unit:unit", "region:region", MT_NEW_END));
|
mt_create_va(mt_new("piratenovictim", NULL),
|
||||||
mt_register(mt_new_va("piratesawvictim", "ship:ship", "unit:unit", "region:region", "dir:int", MT_NEW_END));
|
"ship:ship", "unit:unit", "region:region", MT_NEW_END);
|
||||||
mt_register(mt_new_va("shipsail", "ship:ship", "from:region", "to:region", MT_NEW_END));
|
mt_create_va(mt_new("piratesawvictim", NULL),
|
||||||
mt_register(mt_new_va("shipfly", "ship:ship", "from:region", "to:region", MT_NEW_END));
|
"ship:ship", "unit:unit", "region:region", "dir:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("shipnoshore", "ship:ship", "region:region", MT_NEW_END));
|
mt_create_va(mt_new("shipsail", NULL),
|
||||||
mt_register(mt_new_va("travel", "unit:unit", "start:region", "end:region", "mode:int", "regions:regions", MT_NEW_END));
|
"ship:ship", "from:region", "to:region", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("shipfly", NULL),
|
||||||
|
"ship:ship", "from:region", "to:region", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("shipnoshore", NULL),
|
||||||
|
"ship:ship", "region:region", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("travel", NULL),
|
||||||
|
"unit:unit", "start:region", "end:region", "mode:int", "regions:regions", MT_NEW_END);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setup_pirate(unit **pirate, int p_r_flags, int p_rc_flags, const char *p_shiptype,
|
static void setup_pirate(unit **pirate, int p_r_flags, int p_rc_flags, const char *p_shiptype,
|
||||||
|
|
|
@ -38,7 +38,7 @@ static void test_renumber_faction_duplicate(CuTest *tc) {
|
||||||
const struct locale *lang;
|
const struct locale *lang;
|
||||||
|
|
||||||
test_setup_ex(tc);
|
test_setup_ex(tc);
|
||||||
mt_register(mt_new_va("renumber_inuse", "id:int", MT_NEW_END));
|
mt_create_va(mt_new("renumber_inuse", NULL), "id:int", MT_NEW_END);
|
||||||
f2 = test_create_faction(NULL);
|
f2 = test_create_faction(NULL);
|
||||||
u = test_create_unit(f = test_create_faction(NULL), test_create_region(0, 0, NULL));
|
u = test_create_unit(f = test_create_faction(NULL), test_create_region(0, 0, NULL));
|
||||||
no = f->no;
|
no = f->no;
|
||||||
|
|
49
src/report.c
49
src/report.c
|
@ -169,7 +169,7 @@ paragraph(struct stream *out, const char *str, ptrdiff_t indent, int hanging_ind
|
||||||
char marker)
|
char marker)
|
||||||
{
|
{
|
||||||
size_t length = REPORTWIDTH;
|
size_t length = REPORTWIDTH;
|
||||||
const char *end, *begin, *mark = 0;
|
const char *handle_end, *begin, *mark = 0;
|
||||||
|
|
||||||
if (!str) return;
|
if (!str) return;
|
||||||
/* find out if there's a mark + indent already encoded in the string. */
|
/* find out if there's a mark + indent already encoded in the string. */
|
||||||
|
@ -188,7 +188,7 @@ paragraph(struct stream *out, const char *str, ptrdiff_t indent, int hanging_ind
|
||||||
else {
|
else {
|
||||||
mark = ▮
|
mark = ▮
|
||||||
}
|
}
|
||||||
begin = end = str;
|
begin = handle_end = str;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
const char *last_space = begin;
|
const char *last_space = begin;
|
||||||
|
@ -205,25 +205,25 @@ paragraph(struct stream *out, const char *str, ptrdiff_t indent, int hanging_ind
|
||||||
else {
|
else {
|
||||||
write_spaces(out, indent + hanging_indent);
|
write_spaces(out, indent + hanging_indent);
|
||||||
}
|
}
|
||||||
while (*end && end <= begin + length - indent) {
|
while (*handle_end && handle_end <= begin + length - indent) {
|
||||||
if (*end == ' ') {
|
if (*handle_end == ' ') {
|
||||||
last_space = end;
|
last_space = handle_end;
|
||||||
}
|
}
|
||||||
++end;
|
++handle_end;
|
||||||
}
|
}
|
||||||
if (*end == 0)
|
if (*handle_end == 0)
|
||||||
last_space = end;
|
last_space = handle_end;
|
||||||
if (last_space == begin) {
|
if (last_space == begin) {
|
||||||
/* there was no space in this line. clip it */
|
/* there was no space in this line. clip it */
|
||||||
last_space = end;
|
last_space = handle_end;
|
||||||
}
|
}
|
||||||
swrite(begin, sizeof(char), last_space - begin, out);
|
swrite(begin, sizeof(char), last_space - begin, out);
|
||||||
begin = last_space;
|
begin = last_space;
|
||||||
while (*begin == ' ') {
|
while (*begin == ' ') {
|
||||||
++begin;
|
++begin;
|
||||||
}
|
}
|
||||||
if (begin > end)
|
if (begin > handle_end)
|
||||||
begin = end;
|
begin = handle_end;
|
||||||
sputs("", out);
|
sputs("", out);
|
||||||
} while (*begin);
|
} while (*begin);
|
||||||
}
|
}
|
||||||
|
@ -714,16 +714,17 @@ static void
|
||||||
rp_messages(struct stream *out, message_list * msgs, faction * viewer, int indent,
|
rp_messages(struct stream *out, message_list * msgs, faction * viewer, int indent,
|
||||||
bool categorized)
|
bool categorized)
|
||||||
{
|
{
|
||||||
nrsection *section;
|
int i;
|
||||||
|
if (!msgs) {
|
||||||
if (!msgs)
|
|
||||||
return;
|
return;
|
||||||
for (section = sections; section; section = section->next) {
|
}
|
||||||
|
for (i = 0; i != MAXSECTIONS && sections[i]; ++i) {
|
||||||
|
const char * section = sections[i];
|
||||||
int k = 0;
|
int k = 0;
|
||||||
struct mlist *m = msgs->begin;
|
struct mlist *m = msgs->begin;
|
||||||
while (m) {
|
while (m) {
|
||||||
/* messagetype * mt = m->type; */
|
/* messagetype * mt = m->type; */
|
||||||
if (!categorized || strcmp(nrt_section(m->msg->type), section->name) == 0) {
|
if (!categorized || strcmp(m->msg->type->section, section) == 0) {
|
||||||
char lbuf[8192];
|
char lbuf[8192];
|
||||||
|
|
||||||
if (!k && categorized) {
|
if (!k && categorized) {
|
||||||
|
@ -731,14 +732,14 @@ rp_messages(struct stream *out, message_list * msgs, faction * viewer, int inden
|
||||||
char cat_identifier[24];
|
char cat_identifier[24];
|
||||||
|
|
||||||
newline(out);
|
newline(out);
|
||||||
sprintf(cat_identifier, "section_%s", section->name);
|
sprintf(cat_identifier, "section_%s", section);
|
||||||
section_title = LOC(viewer->locale, cat_identifier);
|
section_title = LOC(viewer->locale, cat_identifier);
|
||||||
if (section_title) {
|
if (section_title) {
|
||||||
centre(out, section_title, true);
|
centre(out, section_title, true);
|
||||||
newline(out);
|
newline(out);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
log_error("no title defined for section %s in locale %s", section->name, locale_name(viewer->locale));
|
log_error("no title defined for section %s in locale %s", section, locale_name(viewer->locale));
|
||||||
}
|
}
|
||||||
k = 1;
|
k = 1;
|
||||||
}
|
}
|
||||||
|
@ -1930,7 +1931,7 @@ static void nr_paragraph(struct stream *out, message * m, faction * f)
|
||||||
|
|
||||||
typedef struct cb_data {
|
typedef struct cb_data {
|
||||||
struct stream *out;
|
struct stream *out;
|
||||||
char *start, *writep;
|
char *handle_start, *writep;
|
||||||
size_t size;
|
size_t size;
|
||||||
const faction *f;
|
const faction *f;
|
||||||
int maxtravel, counter;
|
int maxtravel, counter;
|
||||||
|
@ -1939,7 +1940,7 @@ typedef struct cb_data {
|
||||||
static void init_cb(cb_data *data, struct stream *out, char *buffer, size_t size, const faction *f) {
|
static void init_cb(cb_data *data, struct stream *out, char *buffer, size_t size, const faction *f) {
|
||||||
data->out = out;
|
data->out = out;
|
||||||
data->writep = buffer;
|
data->writep = buffer;
|
||||||
data->start = buffer;
|
data->handle_start = buffer;
|
||||||
data->size = size;
|
data->size = size;
|
||||||
data->f = f;
|
data->f = f;
|
||||||
data->maxtravel = 0;
|
data->maxtravel = 0;
|
||||||
|
@ -1956,7 +1957,7 @@ static void cb_write_travelthru(region *r, unit *u, void *cbdata) {
|
||||||
if (travelthru_cansee(r, f, u)) {
|
if (travelthru_cansee(r, f, u)) {
|
||||||
++data->counter;
|
++data->counter;
|
||||||
do {
|
do {
|
||||||
size_t len, size = data->size - (data->writep - data->start);
|
size_t len, size = data->size - (data->writep - data->handle_start);
|
||||||
const char *str;
|
const char *str;
|
||||||
char *writep = data->writep;
|
char *writep = data->writep;
|
||||||
|
|
||||||
|
@ -1991,13 +1992,13 @@ static void cb_write_travelthru(region *r, unit *u, void *cbdata) {
|
||||||
if (len >= size || data->counter == data->maxtravel) {
|
if (len >= size || data->counter == data->maxtravel) {
|
||||||
/* buffer is full */
|
/* buffer is full */
|
||||||
*writep = 0;
|
*writep = 0;
|
||||||
paragraph(data->out, data->start, 0, 0, 0);
|
paragraph(data->out, data->handle_start, 0, 0, 0);
|
||||||
data->writep = data->start;
|
data->writep = data->handle_start;
|
||||||
if (data->counter == data->maxtravel) {
|
if (data->counter == data->maxtravel) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (data->writep == data->start);
|
} while (data->writep == data->handle_start);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2243,7 +2243,7 @@ static void eval_regions(struct opstack **stack, const void *userdata)
|
||||||
{ /* order -> string */
|
{ /* order -> string */
|
||||||
const faction *report = (const faction *)userdata;
|
const faction *report = (const faction *)userdata;
|
||||||
int i = opop(stack).i;
|
int i = opop(stack).i;
|
||||||
int end, begin = opop(stack).i;
|
int handle_end, begin = opop(stack).i;
|
||||||
const arg_regions *aregs = (const arg_regions *)opop(stack).v;
|
const arg_regions *aregs = (const arg_regions *)opop(stack).v;
|
||||||
char buf[256];
|
char buf[256];
|
||||||
size_t size = sizeof(buf) - 1;
|
size_t size = sizeof(buf) - 1;
|
||||||
|
@ -2251,19 +2251,19 @@ static void eval_regions(struct opstack **stack, const void *userdata)
|
||||||
char *bufp = buf;
|
char *bufp = buf;
|
||||||
|
|
||||||
if (aregs == NULL) {
|
if (aregs == NULL) {
|
||||||
end = begin;
|
handle_end = begin;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (i >= 0)
|
if (i >= 0)
|
||||||
end = begin + i;
|
handle_end = begin + i;
|
||||||
else
|
else
|
||||||
end = aregs->nregions + i;
|
handle_end = aregs->nregions + i;
|
||||||
}
|
}
|
||||||
for (i = begin; i < end; ++i) {
|
for (i = begin; i < handle_end; ++i) {
|
||||||
const char *rname = (const char *)regionname(aregs->regions[i], report);
|
const char *rname = (const char *)regionname(aregs->regions[i], report);
|
||||||
bufp = STRLCPY(bufp, rname, size);
|
bufp = STRLCPY(bufp, rname, size);
|
||||||
|
|
||||||
if (i + 1 < end && size > 2) {
|
if (i + 1 < handle_end && size > 2) {
|
||||||
strcat(bufp, ", ");
|
strcat(bufp, ", ");
|
||||||
bufp += 2;
|
bufp += 2;
|
||||||
size -= 2;
|
size -= 2;
|
||||||
|
@ -2296,9 +2296,9 @@ static void eval_trail(struct opstack **stack, const void *userdata)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (aregs != NULL) {
|
if (aregs != NULL) {
|
||||||
int i, end = 0, begin = 0;
|
int i, handle_end = 0, begin = 0;
|
||||||
end = aregs->nregions;
|
handle_end = aregs->nregions;
|
||||||
for (i = begin; i < end; ++i) {
|
for (i = begin; i < handle_end; ++i) {
|
||||||
region *r = aregs->regions[i];
|
region *r = aregs->regions[i];
|
||||||
const char *trail = trailinto(r, lang);
|
const char *trail = trailinto(r, lang);
|
||||||
const char *rn = f_regionid_s(r, report);
|
const char *rn = f_regionid_s(r, report);
|
||||||
|
@ -2306,10 +2306,10 @@ static void eval_trail(struct opstack **stack, const void *userdata)
|
||||||
if (wrptr(&bufp, &size, snprintf(bufp, size, trail, rn)) != 0)
|
if (wrptr(&bufp, &size, snprintf(bufp, size, trail, rn)) != 0)
|
||||||
WARN_STATIC_BUFFER();
|
WARN_STATIC_BUFFER();
|
||||||
|
|
||||||
if (i + 2 < end) {
|
if (i + 2 < handle_end) {
|
||||||
bufp = STRLCPY(bufp, ", ", size);
|
bufp = STRLCPY(bufp, ", ", size);
|
||||||
}
|
}
|
||||||
else if (i + 1 < end) {
|
else if (i + 1 < handle_end) {
|
||||||
bufp = STRLCPY(bufp, LOC(lang, "list_and"), size);
|
bufp = STRLCPY(bufp, LOC(lang, "list_and"), size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
#include "randenc.h"
|
#include "randenc.h"
|
||||||
#include "monsters.h"
|
#include "monsters.h"
|
||||||
#include "teleport.h"
|
#include "teleport.h"
|
||||||
#include "xmlreader.h"
|
|
||||||
|
|
||||||
/* triggers includes */
|
/* triggers includes */
|
||||||
#include <triggers/changefaction.h>
|
#include <triggers/changefaction.h>
|
||||||
|
|
|
@ -130,8 +130,10 @@ static void test_view_reality(CuTest *tc) {
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
setup_spells();
|
setup_spells();
|
||||||
mt_register(mt_new_va("spell_astral_only", "unit:unit", "region:region", "command:order", MT_NEW_END));
|
mt_create_va(mt_new("spell_astral_only", NULL),
|
||||||
mt_register(mt_new_va("viewreality_effect", "unit:unit", MT_NEW_END));
|
"unit:unit", "region:region", "command:order", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("viewreality_effect", NULL),
|
||||||
|
"unit:unit", MT_NEW_END);
|
||||||
r = test_create_region(0, 0, NULL);
|
r = test_create_region(0, 0, NULL);
|
||||||
ra = test_create_region(real2tp(r->x), real2tp(r->y), NULL);
|
ra = test_create_region(real2tp(r->x), real2tp(r->y), NULL);
|
||||||
ra->_plane = get_astralplane();
|
ra->_plane = get_astralplane();
|
||||||
|
|
|
@ -29,7 +29,8 @@ static void test_flyingship(CuTest * tc)
|
||||||
ship *sh1, *sh2;
|
ship *sh1, *sh2;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("flying_ship_result", "mage:unit", "ship:ship", MT_NEW_END));
|
mt_create_va(mt_new("flying_ship_result", NULL),
|
||||||
|
"mage:unit", "ship:ship", MT_NEW_END);
|
||||||
|
|
||||||
par.param = &par_data_ptr;
|
par.param = &par_data_ptr;
|
||||||
par_data.typ = SPP_SHIP;
|
par_data.typ = SPP_SHIP;
|
||||||
|
|
|
@ -29,7 +29,8 @@ static void test_magicresistance_unit(CuTest *tc) {
|
||||||
curse *c;
|
curse *c;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("magicresistance_unit", "unit:unit", "id:int", MT_NEW_END));
|
mt_create_va(mt_new("magicresistance_unit", NULL),
|
||||||
|
"unit:unit", "id:int", MT_NEW_END);
|
||||||
r = test_create_plain(0, 0);
|
r = test_create_plain(0, 0);
|
||||||
f1 = test_create_faction(NULL);
|
f1 = test_create_faction(NULL);
|
||||||
u1 = test_create_unit(f1, r);
|
u1 = test_create_unit(f1, r);
|
||||||
|
@ -57,7 +58,8 @@ static void test_magicresistance_building(CuTest *tc) {
|
||||||
curse *c;
|
curse *c;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("magicresistance_building", "building:building", "id:int", MT_NEW_END));
|
mt_create_va(mt_new("magicresistance_building", NULL),
|
||||||
|
"building:building", "id:int", MT_NEW_END);
|
||||||
r = test_create_plain(0, 0);
|
r = test_create_plain(0, 0);
|
||||||
f1 = test_create_faction(NULL);
|
f1 = test_create_faction(NULL);
|
||||||
u1 = test_create_unit(f1, r);
|
u1 = test_create_unit(f1, r);
|
||||||
|
|
|
@ -232,7 +232,7 @@ static message *cinfo_sparkle(const void *obj, objtype_t typ, const curse * c,
|
||||||
"sparkle_18",
|
"sparkle_18",
|
||||||
NULL, /* end draig */
|
NULL, /* end draig */
|
||||||
};
|
};
|
||||||
int m, begin = 0, end = 0;
|
int m, begin = 0, handle_end = 0;
|
||||||
unit *u;
|
unit *u;
|
||||||
UNUSED_ARG(typ);
|
UNUSED_ARG(typ);
|
||||||
|
|
||||||
|
@ -243,18 +243,18 @@ static message *cinfo_sparkle(const void *obj, objtype_t typ, const curse * c,
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for (m = 0; m != c->magician->faction->magiegebiet; ++m) {
|
for (m = 0; m != c->magician->faction->magiegebiet; ++m) {
|
||||||
while (effects[end] != NULL)
|
while (effects[handle_end] != NULL)
|
||||||
++end;
|
++handle_end;
|
||||||
begin = end + 1;
|
begin = handle_end + 1;
|
||||||
end = begin;
|
handle_end = begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (effects[end] != NULL)
|
while (effects[handle_end] != NULL)
|
||||||
++end;
|
++handle_end;
|
||||||
if (end == begin)
|
if (handle_end == begin)
|
||||||
return NULL;
|
return NULL;
|
||||||
else {
|
else {
|
||||||
int index = begin + curse_geteffect_int(c) % (end - begin);
|
int index = begin + curse_geteffect_int(c) % (handle_end - begin);
|
||||||
return msg_message(mkname("curseinfo", effects[index]), "unit id", u,
|
return msg_message(mkname("curseinfo", effects[index]), "unit id", u,
|
||||||
c->no);
|
c->no);
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,19 +33,32 @@ typedef struct {
|
||||||
} spy_fixture;
|
} spy_fixture;
|
||||||
|
|
||||||
static void setup_spy(spy_fixture *fix) {
|
static void setup_spy(spy_fixture *fix) {
|
||||||
mt_register(mt_new_va("spyreport", "spy:unit", "target:unit", "status:int", MT_NEW_END));
|
mt_create_va(mt_new("spyreport", NULL),
|
||||||
mt_register(mt_new_va("spyreport_mage", "spy:unit", "target:unit", "type:int", MT_NEW_END));
|
"spy:unit", "target:unit", "status:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("spyreport_faction", "spy:unit", "target:unit", "faction:faction", MT_NEW_END));
|
mt_create_va(mt_new("spyreport_mage", NULL),
|
||||||
mt_register(mt_new_va("spyreport_skills", "spy:unit", "target:unit", "skills:string", MT_NEW_END));
|
"spy:unit", "target:unit", "type:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("spyreport_items", "spy:unit", "target:unit", "items:items", MT_NEW_END));
|
mt_create_va(mt_new("spyreport_faction", NULL),
|
||||||
mt_register(mt_new_va("destroy_ship_0", "unit:unit", "ship:ship", MT_NEW_END));
|
"spy:unit", "target:unit", "faction:faction", MT_NEW_END);
|
||||||
mt_register(mt_new_va("destroy_ship_1", "unit:unit", "ship:ship", MT_NEW_END));
|
mt_create_va(mt_new("spyreport_skills", NULL),
|
||||||
mt_register(mt_new_va("destroy_ship_2", "unit:unit", "ship:ship", MT_NEW_END));
|
"spy:unit", "target:unit", "skills:string", MT_NEW_END);
|
||||||
mt_register(mt_new_va("destroy_ship_3", "ship:ship", MT_NEW_END));
|
mt_create_va(mt_new("spyreport_items", NULL),
|
||||||
mt_register(mt_new_va("destroy_ship_4", "ship:ship", MT_NEW_END));
|
"spy:unit", "target:unit", "items:items", MT_NEW_END);
|
||||||
mt_register(mt_new_va("sink_msg", "ship:ship", "region:region", MT_NEW_END));
|
mt_create_va(mt_new("destroy_ship_0", NULL),
|
||||||
mt_register(mt_new_va("sink_lost_msg", "unit:unit", "region:region", "dead:int", MT_NEW_END));
|
"unit:unit", "ship:ship", MT_NEW_END);
|
||||||
mt_register(mt_new_va("sink_saved_msg", "unit:unit", "region:region", MT_NEW_END));
|
mt_create_va(mt_new("destroy_ship_1", NULL),
|
||||||
|
"unit:unit", "ship:ship", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("destroy_ship_2", NULL),
|
||||||
|
"unit:unit", "ship:ship", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("destroy_ship_3", NULL),
|
||||||
|
"ship:ship", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("destroy_ship_4", NULL),
|
||||||
|
"ship:ship", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("sink_msg", NULL),
|
||||||
|
"ship:ship", "region:region", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("sink_lost_msg", NULL),
|
||||||
|
"unit:unit", "region:region", "dead:int", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("sink_saved_msg", NULL),
|
||||||
|
"unit:unit", "region:region", MT_NEW_END);
|
||||||
|
|
||||||
if (fix) {
|
if (fix) {
|
||||||
fix->r = test_create_region(0, 0, NULL);
|
fix->r = test_create_region(0, 0, NULL);
|
||||||
|
@ -196,7 +209,10 @@ static void test_setstealth_demon_bad(CuTest *tc) {
|
||||||
lang = test_create_locale();
|
lang = test_create_locale();
|
||||||
rc = test_create_race("demon");
|
rc = test_create_race("demon");
|
||||||
u = test_create_unit(test_create_faction(rc), test_create_region(0, 0, NULL));
|
u = test_create_unit(test_create_faction(rc), test_create_region(0, 0, NULL));
|
||||||
|
|
||||||
rc = test_create_race("smurf");
|
rc = test_create_race("smurf");
|
||||||
|
rc->flags &= ~RCF_PLAYABLE;
|
||||||
|
|
||||||
init_races(lang);
|
init_races(lang);
|
||||||
u->thisorder = create_order(K_SETSTEALTH, lang, racename(lang, u, rc));
|
u->thisorder = create_order(K_SETSTEALTH, lang, racename(lang, u, rc));
|
||||||
setstealth_cmd(u, u->thisorder);
|
setstealth_cmd(u, u->thisorder);
|
||||||
|
|
|
@ -58,9 +58,12 @@ typedef struct {
|
||||||
} study_fixture;
|
} study_fixture;
|
||||||
|
|
||||||
static void setup_study(void) {
|
static void setup_study(void) {
|
||||||
mt_register(mt_new_va("studycost", "unit:unit", "region:region", "cost:int", "skill:int", MT_NEW_END));
|
mt_create_va(mt_new("studycost", NULL),
|
||||||
mt_register(mt_new_va("teach_teacher", "teacher:unit", "student:unit", "skill:int", "level:int", MT_NEW_END));
|
"unit:unit", "region:region", "cost:int", "skill:int", MT_NEW_END);
|
||||||
mt_register(mt_new_va("teach_student", "teacher:unit", "student:unit", "skill:int", MT_NEW_END));
|
mt_create_va(mt_new("teach_teacher", NULL),
|
||||||
|
"teacher:unit", "student:unit", "skill:int", "level:int", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("teach_student", NULL),
|
||||||
|
"teacher:unit", "student:unit", "skill:int", MT_NEW_END);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setup_locale(struct locale *lang) {
|
static void setup_locale(struct locale *lang) {
|
||||||
|
@ -218,7 +221,8 @@ static void test_academy_building(CuTest *tc) {
|
||||||
message * msg;
|
message * msg;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("teach_asgood", "unit:unit", "region:region", "command:order", "student:unit", MT_NEW_END));
|
mt_create_va(mt_new("teach_asgood", NULL),
|
||||||
|
"unit:unit", "region:region", "command:order", "student:unit", MT_NEW_END);
|
||||||
|
|
||||||
random_source_inject_constant(0.0);
|
random_source_inject_constant(0.0);
|
||||||
init_resources();
|
init_resources();
|
||||||
|
@ -636,8 +640,10 @@ static void test_teach_message(CuTest *tc) {
|
||||||
teaching_info *teach;
|
teaching_info *teach;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("teach_teacher", "teacher:unit", "student:unit", "skill:int", "level:int", MT_NEW_END));
|
mt_create_va(mt_new("teach_teacher", NULL),
|
||||||
mt_register(mt_new_va("teach_student", "teacher:unit", "student:unit", "skill:int", MT_NEW_END));
|
"teacher:unit", "student:unit", "skill:int", "level:int", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("teach_student", NULL),
|
||||||
|
"teacher:unit", "student:unit", "skill:int", MT_NEW_END);
|
||||||
init_resources();
|
init_resources();
|
||||||
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
|
u = test_create_unit(test_create_faction(NULL), test_create_region(0, 0, NULL));
|
||||||
scale_number(u, 20);
|
scale_number(u, 20);
|
||||||
|
|
12
src/tests.c
12
src/tests.c
|
@ -59,7 +59,7 @@ struct race *test_create_race(const char *name)
|
||||||
rc->maintenance = 10;
|
rc->maintenance = 10;
|
||||||
rc->hitpoints = 20;
|
rc->hitpoints = 20;
|
||||||
rc->maxaura = 100;
|
rc->maxaura = 100;
|
||||||
rc->flags |= RCF_WALK;
|
rc->flags |= (RCF_WALK|RCF_PLAYABLE);
|
||||||
rc->ec_flags |= ECF_GETITEM;
|
rc->ec_flags |= ECF_GETITEM;
|
||||||
rc->battle_flags = BF_EQUIPMENT;
|
rc->battle_flags = BF_EQUIPMENT;
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -246,9 +246,12 @@ static void test_reset(void) {
|
||||||
}
|
}
|
||||||
random_source_reset();
|
random_source_reset();
|
||||||
|
|
||||||
mt_register(mt_new_va("changepasswd", "value:string", MT_NEW_END));
|
mt_create_va(mt_new("changepasswd", NULL),
|
||||||
mt_register(mt_new_va("starvation", "unit:unit", "region:region", "dead:int", "live:int", MT_NEW_END));
|
"value:string", MT_NEW_END);
|
||||||
mt_register(mt_new_va("malnourish", "unit:unit", "region:region", MT_NEW_END));
|
mt_create_va(mt_new("starvation", NULL),
|
||||||
|
"unit:unit", "region:region", "dead:int", "live:int", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("malnourish", NULL),
|
||||||
|
"unit:unit", "region:region", MT_NEW_END);
|
||||||
|
|
||||||
if (errno) {
|
if (errno) {
|
||||||
int error = errno;
|
int error = errno;
|
||||||
|
@ -354,7 +357,6 @@ building_type * test_create_buildingtype(const char * name)
|
||||||
{
|
{
|
||||||
construction *con;
|
construction *con;
|
||||||
building_type *btype = bt_get_or_create(name);
|
building_type *btype = bt_get_or_create(name);
|
||||||
btype->flags = BTF_NAMECHANGE;
|
|
||||||
if (btype->stages) {
|
if (btype->stages) {
|
||||||
con = btype->stages->construction;
|
con = btype->stages->construction;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -12,7 +12,8 @@
|
||||||
#include <CuTest.h>
|
#include <CuTest.h>
|
||||||
|
|
||||||
static void shock_setup(void) {
|
static void shock_setup(void) {
|
||||||
mt_register(mt_new_va("shock", "mage:unit", "reason:string", MT_NEW_END));
|
mt_create_va(mt_new("shock", NULL),
|
||||||
|
"mage:unit", "reason:string", MT_NEW_END);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_shock(CuTest *tc) {
|
static void test_shock(CuTest *tc) {
|
||||||
|
|
|
@ -28,7 +28,6 @@ log.test.c
|
||||||
umlaut.test.c
|
umlaut.test.c
|
||||||
unicode.test.c
|
unicode.test.c
|
||||||
variant.test.c
|
variant.test.c
|
||||||
# xml.test.c
|
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(_FILES
|
SET(_FILES
|
||||||
|
@ -59,7 +58,6 @@ translation.c
|
||||||
umlaut.c
|
umlaut.c
|
||||||
unicode.c
|
unicode.c
|
||||||
variant.c
|
variant.c
|
||||||
xml.c
|
|
||||||
)
|
)
|
||||||
|
|
||||||
FOREACH(_FILE ${_FILES})
|
FOREACH(_FILE ${_FILES})
|
||||||
|
|
|
@ -136,11 +136,11 @@ static const char *getbuf_latin1(FILE * F)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (c == CONTINUE_CHAR) {
|
else if (c == CONTINUE_CHAR) {
|
||||||
const char *end = ++bp;
|
const char *handle_end = ++bp;
|
||||||
while (*end && isspace(*(unsigned char *)end))
|
while (*handle_end && isspace(*(unsigned char *)handle_end))
|
||||||
++end; /* eatwhite */
|
++handle_end; /* eatwhite */
|
||||||
if (*end == '\0') {
|
if (*handle_end == '\0') {
|
||||||
bp = end;
|
bp = handle_end;
|
||||||
cont = true;
|
cont = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -303,11 +303,11 @@ static const char *getbuf_utf8(FILE * F)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (*bp == CONTINUE_CHAR) {
|
if (*bp == CONTINUE_CHAR) {
|
||||||
const char *end;
|
const char *handle_end;
|
||||||
eatwhite(bp + 1, &white);
|
eatwhite(bp + 1, &white);
|
||||||
end = bp + 1 + white;
|
handle_end = bp + 1 + white;
|
||||||
if (*end == '\0') {
|
if (*handle_end == '\0') {
|
||||||
bp = end;
|
bp = handle_end;
|
||||||
cont = true;
|
cont = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,35 +60,43 @@ arg_type *find_argtype(const char *name)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
message_type *mt_new(const char *name, const char *args[])
|
static unsigned int mt_id(const message_type * mtype)
|
||||||
{
|
{
|
||||||
int nparameters = 0;
|
unsigned int key = 0;
|
||||||
message_type *mtype;
|
size_t i = strlen(mtype->name);
|
||||||
|
|
||||||
assert(name != NULL);
|
while (i > 0) {
|
||||||
if (name == NULL) {
|
/* TODO: why not use str_hash? */
|
||||||
log_error("Trying to create message_type with name=0x0\n");
|
key = (mtype->name[--i] + key * 37);
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
if (args != NULL) {
|
return key % 0x7FFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MT_MAXHASH 1021
|
||||||
|
static selist *messagetypes[MT_MAXHASH];
|
||||||
|
|
||||||
|
static void mt_register(message_type * mtype) {
|
||||||
|
unsigned int hash = str_hash(mtype->name) % MT_MAXHASH;
|
||||||
|
selist **qlp = messagetypes + hash;
|
||||||
|
|
||||||
|
if (selist_set_insert(qlp, mtype, NULL)) {
|
||||||
|
mtype->key = mt_id(mtype);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
message_type *mt_create(message_type * mtype, const char *args[], int nparameters)
|
||||||
|
{
|
||||||
|
if (args != NULL && args[nparameters]) {
|
||||||
/* count the number of parameters */
|
/* count the number of parameters */
|
||||||
while (args[nparameters]) ++nparameters;
|
do {
|
||||||
|
++nparameters;
|
||||||
|
} while (args[nparameters]);
|
||||||
}
|
}
|
||||||
mtype = (message_type *)malloc(sizeof(message_type));
|
|
||||||
mtype->key = 0;
|
|
||||||
mtype->name = str_strdup(name);
|
|
||||||
mtype->nparameters = nparameters;
|
|
||||||
if (nparameters > 0) {
|
if (nparameters > 0) {
|
||||||
|
int i;
|
||||||
|
mtype->nparameters = nparameters;
|
||||||
mtype->pnames = (char **)malloc(sizeof(char *) * nparameters);
|
mtype->pnames = (char **)malloc(sizeof(char *) * nparameters);
|
||||||
mtype->types = (arg_type **)malloc(sizeof(arg_type *) * nparameters);
|
mtype->types = (arg_type **)malloc(sizeof(arg_type *) * nparameters);
|
||||||
}
|
|
||||||
else {
|
|
||||||
mtype->pnames = NULL;
|
|
||||||
mtype->types = NULL;
|
|
||||||
}
|
|
||||||
if (args != NULL) {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; args[i]; ++i) {
|
for (i = 0; args[i]; ++i) {
|
||||||
const char *x = args[i];
|
const char *x = args[i];
|
||||||
const char *spos = strchr(x, ':');
|
const char *spos = strchr(x, ':');
|
||||||
|
@ -110,16 +118,75 @@ message_type *mt_new(const char *name, const char *args[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mt_register(mtype);
|
||||||
return mtype;
|
return mtype;
|
||||||
}
|
}
|
||||||
|
|
||||||
message_type *mt_new_va(const char *name, ...)
|
char *sections[MAXSECTIONS];
|
||||||
|
|
||||||
|
const char *section_find(const char *name)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (name == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i != MAXSECTIONS && sections[i]; ++i) {
|
||||||
|
if (strcmp(sections[i], name) == 0) {
|
||||||
|
return sections[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *section_add(const char *name) {
|
||||||
|
int i;
|
||||||
|
if (name == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (i = 0; i != MAXSECTIONS && sections[i]; ++i) {
|
||||||
|
if (strcmp(sections[i], name) == 0) {
|
||||||
|
return sections[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert(i < MAXSECTIONS);
|
||||||
|
assert(sections[i] == NULL);
|
||||||
|
if (i + 1 < MAXSECTIONS) {
|
||||||
|
sections[i + 1] = NULL;
|
||||||
|
}
|
||||||
|
return sections[i] = str_strdup(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
message_type *mt_new(const char *name, const char *section)
|
||||||
|
{
|
||||||
|
message_type *mtype;
|
||||||
|
|
||||||
|
assert(name != NULL);
|
||||||
|
if (name == NULL) {
|
||||||
|
log_error("Trying to create message_type with name=0x0\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
mtype = (message_type *)malloc(sizeof(message_type));
|
||||||
|
mtype->key = 0;
|
||||||
|
mtype->name = str_strdup(name);
|
||||||
|
mtype->section = section_find(section);
|
||||||
|
if (!mtype->section) {
|
||||||
|
mtype->section = section_add(section);
|
||||||
|
}
|
||||||
|
mtype->nparameters = 0;
|
||||||
|
mtype->pnames = NULL;
|
||||||
|
mtype->types = NULL;
|
||||||
|
return mtype;
|
||||||
|
}
|
||||||
|
|
||||||
|
message_type *mt_create_va(message_type *mtype, ...)
|
||||||
{
|
{
|
||||||
const char *args[16];
|
const char *args[16];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
va_list marker;
|
va_list marker;
|
||||||
|
|
||||||
va_start(marker, name);
|
va_start(marker, mtype);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
const char *c = va_arg(marker, const char *);
|
const char *c = va_arg(marker, const char *);
|
||||||
args[i++] = c;
|
args[i++] = c;
|
||||||
|
@ -127,8 +194,8 @@ message_type *mt_new_va(const char *name, ...)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
va_end(marker);
|
va_end(marker);
|
||||||
args[i] = 0;
|
args[i] = NULL;
|
||||||
return mt_new(name, args);
|
return mt_create(mtype, args, i - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static variant copy_arg(const arg_type * atype, variant data)
|
static variant copy_arg(const arg_type * atype, variant data)
|
||||||
|
@ -168,9 +235,6 @@ message *msg_create(const struct message_type *mtype, variant args[])
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MT_MAXHASH 1021
|
|
||||||
static selist *messagetypes[MT_MAXHASH];
|
|
||||||
|
|
||||||
static void mt_free(void *val) {
|
static void mt_free(void *val) {
|
||||||
message_type *mtype = (message_type *)val;
|
message_type *mtype = (message_type *)val;
|
||||||
int i;
|
int i;
|
||||||
|
@ -191,6 +255,10 @@ void mt_clear(void) {
|
||||||
selist_free(ql);
|
selist_free(ql);
|
||||||
messagetypes[i] = 0;
|
messagetypes[i] = 0;
|
||||||
}
|
}
|
||||||
|
for (i = 0; i != MAXSECTIONS && sections[i]; ++i) {
|
||||||
|
free(sections[i]);
|
||||||
|
sections[i] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const message_type *mt_find(const char *name)
|
const message_type *mt_find(const char *name)
|
||||||
|
@ -208,29 +276,6 @@ const message_type *mt_find(const char *name)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int mt_id(const message_type * mtype)
|
|
||||||
{
|
|
||||||
unsigned int key = 0;
|
|
||||||
size_t i = strlen(mtype->name);
|
|
||||||
|
|
||||||
while (i > 0) {
|
|
||||||
/* TODO: why not use str_hash? */
|
|
||||||
key = (mtype->name[--i] + key * 37);
|
|
||||||
}
|
|
||||||
return key % 0x7FFFFFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
const message_type *mt_register(message_type * type)
|
|
||||||
{
|
|
||||||
unsigned int hash = str_hash(type->name) % MT_MAXHASH;
|
|
||||||
selist **qlp = messagetypes + hash;
|
|
||||||
|
|
||||||
if (selist_set_insert(qlp, type, NULL)) {
|
|
||||||
type->key = mt_id(type);
|
|
||||||
}
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
void msg_free(message * msg)
|
void msg_free(message * msg)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -265,3 +310,4 @@ void message_done(void) {
|
||||||
free(at);
|
free(at);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,12 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MSG_MAXARGS 8
|
||||||
|
#define MT_NEW_END ((const char *)0)
|
||||||
|
#define MAXSECTIONS 16
|
||||||
|
|
||||||
|
extern char *sections[MAXSECTIONS];
|
||||||
|
|
||||||
typedef struct arg_type {
|
typedef struct arg_type {
|
||||||
struct arg_type *next;
|
struct arg_type *next;
|
||||||
variant_type vtype;
|
variant_type vtype;
|
||||||
|
@ -29,6 +35,7 @@ extern "C" {
|
||||||
typedef struct message_type {
|
typedef struct message_type {
|
||||||
unsigned int key;
|
unsigned int key;
|
||||||
char *name;
|
char *name;
|
||||||
|
const char *section;
|
||||||
int nparameters;
|
int nparameters;
|
||||||
char **pnames;
|
char **pnames;
|
||||||
struct arg_type ** types;
|
struct arg_type ** types;
|
||||||
|
@ -43,11 +50,6 @@ extern "C" {
|
||||||
void message_done(void);
|
void message_done(void);
|
||||||
|
|
||||||
void mt_clear(void);
|
void mt_clear(void);
|
||||||
struct message_type *mt_new(const char *name, const char *args[]);
|
|
||||||
struct message_type *mt_new_va(const char *name, ...);
|
|
||||||
#define MT_NEW_END ((const char *)0)
|
|
||||||
/* mt_new("simple_sentence", "subject:string", "predicate:string",
|
|
||||||
* "object:string", "lang:locale", MT_NEW_END); */
|
|
||||||
|
|
||||||
struct message *msg_create(const struct message_type *type,
|
struct message *msg_create(const struct message_type *type,
|
||||||
variant args[]);
|
variant args[]);
|
||||||
|
@ -59,8 +61,10 @@ extern "C" {
|
||||||
|
|
||||||
const char *mt_name(const struct message_type *mtype);
|
const char *mt_name(const struct message_type *mtype);
|
||||||
|
|
||||||
|
struct message_type *mt_new(const char *name, const char *section);
|
||||||
/** message_type registry (optional): **/
|
/** message_type registry (optional): **/
|
||||||
const struct message_type *mt_register(struct message_type *);
|
struct message_type *mt_create(struct message_type *, const char *args[], int nargs);
|
||||||
|
struct message_type *mt_create_va(struct message_type *, ...);
|
||||||
const struct message_type *mt_find(const char *);
|
const struct message_type *mt_find(const char *);
|
||||||
|
|
||||||
void register_argtype(const char *name, void(*free_arg) (variant),
|
void register_argtype(const char *name, void(*free_arg) (variant),
|
||||||
|
|
|
@ -8,8 +8,7 @@ static void test_mt_new(CuTest *tc)
|
||||||
{
|
{
|
||||||
message_type *mt;
|
message_type *mt;
|
||||||
test_setup();
|
test_setup();
|
||||||
mt = mt_new_va("test", "name:string", "number:int", MT_NEW_END);
|
mt = mt_create_va(mt_new("test", NULL), "name:string", "number:int", MT_NEW_END);
|
||||||
mt_register(mt);
|
|
||||||
CuAssertPtrNotNull(tc, mt);
|
CuAssertPtrNotNull(tc, mt);
|
||||||
CuAssertStrEquals(tc, "test", mt->name);
|
CuAssertStrEquals(tc, "test", mt->name);
|
||||||
CuAssertIntEquals(tc, 2, mt->nparameters);
|
CuAssertIntEquals(tc, 2, mt->nparameters);
|
||||||
|
|
|
@ -27,10 +27,9 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
typedef struct nrmessage_type {
|
typedef struct nrmessage_type {
|
||||||
const struct message_type *mtype;
|
const struct message_type *mtype;
|
||||||
char *vars;
|
char *vars;
|
||||||
struct nrmessage_type *next;
|
struct nrmessage_type *next;
|
||||||
const char *section;
|
|
||||||
} nrmessage_type;
|
} nrmessage_type;
|
||||||
|
|
||||||
#define NRT_MAXHASH 1021
|
#define NRT_MAXHASH 1021
|
||||||
|
@ -66,41 +65,8 @@ static nrmessage_type *nrt_find(const struct message_type * mtype)
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
nrsection *sections;
|
|
||||||
|
|
||||||
const nrsection *section_find(const char *name)
|
|
||||||
{
|
|
||||||
nrsection **mcp = §ions;
|
|
||||||
if (name == NULL)
|
|
||||||
return NULL;
|
|
||||||
for (; *mcp; mcp = &(*mcp)->next) {
|
|
||||||
nrsection *mc = *mcp;
|
|
||||||
if (!strcmp(mc->name, name))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return *mcp;
|
|
||||||
}
|
|
||||||
|
|
||||||
const nrsection *section_add(const char *name)
|
|
||||||
{
|
|
||||||
nrsection **mcp = §ions;
|
|
||||||
if (name == NULL)
|
|
||||||
return NULL;
|
|
||||||
for (; *mcp; mcp = &(*mcp)->next) {
|
|
||||||
nrsection *mc = *mcp;
|
|
||||||
if (!strcmp(mc->name, name))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!*mcp) {
|
|
||||||
nrsection *mc = calloc(sizeof(nrsection), 1);
|
|
||||||
mc->name = str_strdup(name);
|
|
||||||
*mcp = mc;
|
|
||||||
}
|
|
||||||
return *mcp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
nrt_register(const struct message_type *mtype, const char *section)
|
nrt_register(const struct message_type *mtype)
|
||||||
{
|
{
|
||||||
unsigned int hash = mtype->key % NRT_MAXHASH;
|
unsigned int hash = mtype->key % NRT_MAXHASH;
|
||||||
nrmessage_type *nrt = nrtypes[hash];
|
nrmessage_type *nrt = nrtypes[hash];
|
||||||
|
@ -118,15 +84,6 @@ nrt_register(const struct message_type *mtype, const char *section)
|
||||||
nrt = malloc(sizeof(nrmessage_type));
|
nrt = malloc(sizeof(nrmessage_type));
|
||||||
nrt->mtype = mtype;
|
nrt->mtype = mtype;
|
||||||
nrt->next = nrtypes[hash];
|
nrt->next = nrtypes[hash];
|
||||||
if (section) {
|
|
||||||
const nrsection *s = section_find(section);
|
|
||||||
if (s == NULL) {
|
|
||||||
s = section_add(section);
|
|
||||||
}
|
|
||||||
nrt->section = s->name;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
nrt->section = NULL;
|
|
||||||
nrtypes[hash] = nrt;
|
nrtypes[hash] = nrt;
|
||||||
*c = '\0';
|
*c = '\0';
|
||||||
for (i = 0; i != mtype->nparameters; ++i) {
|
for (i = 0; i != mtype->nparameters; ++i) {
|
||||||
|
@ -159,12 +116,6 @@ size_t size, const void *userdata)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *nrt_section(const struct message_type * mtype)
|
|
||||||
{
|
|
||||||
nrmessage_type *nrt = nrt_find(mtype);
|
|
||||||
return nrt ? nrt->section : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_nrmesssages(void) {
|
void free_nrmesssages(void) {
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i != NRT_MAXHASH; ++i) {
|
for (i = 0; i != NRT_MAXHASH; ++i) {
|
||||||
|
|
|
@ -25,19 +25,11 @@ extern "C" {
|
||||||
struct message_type;
|
struct message_type;
|
||||||
struct nrmessage_type;
|
struct nrmessage_type;
|
||||||
|
|
||||||
typedef struct nrsection {
|
|
||||||
char *name;
|
|
||||||
struct nrsection *next;
|
|
||||||
} nrsection;
|
|
||||||
|
|
||||||
extern nrsection *sections;
|
|
||||||
|
|
||||||
void free_nrmesssages(void);
|
void free_nrmesssages(void);
|
||||||
|
|
||||||
void nrt_register(const struct message_type *mtype, const char *section);
|
void nrt_register(const struct message_type *mtype);
|
||||||
const char *nrt_string(const struct message_type *mtype,
|
const char *nrt_string(const struct message_type *mtype,
|
||||||
const struct locale *lang);
|
const struct locale *lang);
|
||||||
const char *nrt_section(const struct message_type *mtype);
|
|
||||||
|
|
||||||
size_t nr_render(const struct message *msg, const struct locale *lang,
|
size_t nr_render(const struct message *msg, const struct locale *lang,
|
||||||
char *buffer, size_t size, const void *userdata);
|
char *buffer, size_t size, const void *userdata);
|
||||||
|
|
|
@ -157,13 +157,13 @@ int str_hash(const char *s)
|
||||||
const char *str_escape(const char *str, char *buffer,
|
const char *str_escape(const char *str, char *buffer,
|
||||||
size_t len)
|
size_t len)
|
||||||
{
|
{
|
||||||
const char *start = strchr(str, '\"');
|
const char *handle_start = strchr(str, '\"');
|
||||||
if (!start) start = strchr(str, '\\');
|
if (!handle_start) handle_start = strchr(str, '\\');
|
||||||
assert(buffer);
|
assert(buffer);
|
||||||
if (start) {
|
if (handle_start) {
|
||||||
const char *p;
|
const char *p;
|
||||||
char *o;
|
char *o;
|
||||||
size_t skip = start - str;
|
size_t skip = handle_start - str;
|
||||||
|
|
||||||
if (skip > len) {
|
if (skip > len) {
|
||||||
skip = len;
|
skip = len;
|
||||||
|
@ -218,6 +218,7 @@ unsigned int wang_hash(unsigned int a)
|
||||||
}
|
}
|
||||||
|
|
||||||
char *str_strdup(const char *s) {
|
char *str_strdup(const char *s) {
|
||||||
|
if (s == NULL) return NULL;
|
||||||
#ifdef HAVE_STRDUP
|
#ifdef HAVE_STRDUP
|
||||||
return strdup(s);
|
return strdup(s);
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
|
|
|
@ -77,7 +77,7 @@ void opstack_push(opstack ** stackp, variant data)
|
||||||
#define BBUFSIZE 0x10000
|
#define BBUFSIZE 0x10000
|
||||||
static struct {
|
static struct {
|
||||||
char *begin;
|
char *begin;
|
||||||
char *end;
|
char *handle_end;
|
||||||
char *last;
|
char *last;
|
||||||
char *current;
|
char *current;
|
||||||
} buffer;
|
} buffer;
|
||||||
|
@ -88,9 +88,9 @@ char *balloc(size_t size)
|
||||||
if (!init) {
|
if (!init) {
|
||||||
init = 1;
|
init = 1;
|
||||||
buffer.current = buffer.begin = malloc(BBUFSIZE * sizeof(char));
|
buffer.current = buffer.begin = malloc(BBUFSIZE * sizeof(char));
|
||||||
buffer.end = buffer.begin + BBUFSIZE;
|
buffer.handle_end = buffer.begin + BBUFSIZE;
|
||||||
}
|
}
|
||||||
assert(buffer.current + size <= buffer.end || !"balloc is out of memory");
|
assert(buffer.current + size <= buffer.handle_end || !"balloc is out of memory");
|
||||||
buffer.last = buffer.current;
|
buffer.last = buffer.current;
|
||||||
buffer.current += size;
|
buffer.current += size;
|
||||||
return buffer.last;
|
return buffer.last;
|
||||||
|
|
131
src/util/xml.c
131
src/util/xml.c
|
@ -1,131 +0,0 @@
|
||||||
/*
|
|
||||||
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
|
||||||
| | Enno Rehling <enno@eressea.de>
|
|
||||||
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
|
||||||
| (c) 1998 - 2003 | Henning Peters <faroul@beyond.kn-bremen.de>
|
|
||||||
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
|
|
||||||
+-------------------+ Stefan Reich <reich@halbling.de>
|
|
||||||
|
|
||||||
This program may not be used, modified or distributed
|
|
||||||
without prior permission by the authors of Eressea.
|
|
||||||
*/
|
|
||||||
#include <platform.h>
|
|
||||||
#include "xml.h"
|
|
||||||
|
|
||||||
/* util includes */
|
|
||||||
#include "log.h"
|
|
||||||
#include "assert.h"
|
|
||||||
|
|
||||||
#include <libxml/catalog.h>
|
|
||||||
#include <libxml/xmlstring.h>
|
|
||||||
|
|
||||||
/* libc includes */
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
int xml_ivalue(xmlNodePtr node, const char *name, int dflt)
|
|
||||||
{
|
|
||||||
int i = dflt;
|
|
||||||
xmlChar *propValue = xmlGetProp(node, BAD_CAST name);
|
|
||||||
if (propValue != NULL) {
|
|
||||||
i = atoi((const char *)propValue);
|
|
||||||
xmlFree(propValue);
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool xml_bvalue(xmlNodePtr node, const char *name, bool dflt)
|
|
||||||
{
|
|
||||||
bool result = dflt;
|
|
||||||
xmlChar *propValue = xmlGetProp(node, BAD_CAST name);
|
|
||||||
if (propValue != NULL) {
|
|
||||||
if (strcmp((const char *)propValue, "no") == 0)
|
|
||||||
result = false;
|
|
||||||
else if (strcmp((const char *)propValue, "yes") == 0)
|
|
||||||
result = true;
|
|
||||||
else if (strcmp((const char *)propValue, "false") == 0)
|
|
||||||
result = false;
|
|
||||||
else if (strcmp((const char *)propValue, "true") == 0)
|
|
||||||
result = true;
|
|
||||||
else if (strcmp((const char *)propValue, "1") == 0) {
|
|
||||||
log_warning("bool value is '1': %s::%s\n", node->name, name);
|
|
||||||
result = true;
|
|
||||||
}
|
|
||||||
else if (strcmp((const char *)propValue, "0") == 0) {
|
|
||||||
log_warning("bool value is '0': %s::%s\n", node->name, name);
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
xmlFree(propValue);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
double xml_fvalue(xmlNodePtr node, const char *name, double dflt)
|
|
||||||
{
|
|
||||||
double result = dflt;
|
|
||||||
xmlChar *propValue = xmlGetProp(node, BAD_CAST name);
|
|
||||||
if (propValue != NULL) {
|
|
||||||
result = atof((const char *)propValue);
|
|
||||||
xmlFree(propValue);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* new xml functions */
|
|
||||||
/* libxml includes */
|
|
||||||
#include <libxml/tree.h>
|
|
||||||
#include <libxml/parser.h>
|
|
||||||
|
|
||||||
typedef struct xml_reader {
|
|
||||||
struct xml_reader *next;
|
|
||||||
xml_callback callback;
|
|
||||||
} xml_reader;
|
|
||||||
|
|
||||||
static xml_reader *xmlReaders;
|
|
||||||
|
|
||||||
void xml_done(void) {
|
|
||||||
xml_reader ** xrp = &xmlReaders;
|
|
||||||
while (*xrp) {
|
|
||||||
xml_reader *xr = *xrp;
|
|
||||||
*xrp = xr->next;
|
|
||||||
free(xr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void xml_register_callback(xml_callback callback)
|
|
||||||
{
|
|
||||||
xml_reader *reader = (xml_reader *)malloc(sizeof(xml_reader));
|
|
||||||
xml_reader **insert = &xmlReaders;
|
|
||||||
assert_alloc(reader);
|
|
||||||
reader->callback = callback;
|
|
||||||
reader->next = NULL;
|
|
||||||
|
|
||||||
while (*insert)
|
|
||||||
insert = &(*insert)->next;
|
|
||||||
*insert = reader;
|
|
||||||
}
|
|
||||||
|
|
||||||
int read_xml(const char *filename)
|
|
||||||
{
|
|
||||||
xml_reader *reader = xmlReaders;
|
|
||||||
xmlDocPtr doc;
|
|
||||||
int results = 0;
|
|
||||||
|
|
||||||
doc = xmlReadFile(filename, NULL, XML_PARSE_NONET | XML_PARSE_PEDANTIC | XML_PARSE_COMPACT);
|
|
||||||
if (doc == NULL) {
|
|
||||||
log_error("could not open '%s'\n", filename);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
while (reader != NULL) {
|
|
||||||
int i = reader->callback(doc);
|
|
||||||
if (i < 0) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
results += i;
|
|
||||||
reader = reader->next;
|
|
||||||
}
|
|
||||||
xmlFreeDoc(doc);
|
|
||||||
return (results > 0) ? 0 : -1;
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
|
||||||
| | Enno Rehling <enno@eressea.de>
|
|
||||||
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
|
||||||
| (c) 1998 - 2003 | Henning Peters <faroul@beyond.kn-bremen.de>
|
|
||||||
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
|
|
||||||
+-------------------+ Stefan Reich <reich@halbling.de>
|
|
||||||
|
|
||||||
This program may not be used, modified or distributed
|
|
||||||
without prior permission by the authors of Eressea.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef H_UTIL_XML
|
|
||||||
#define H_UTIL_XML
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* new xml functions: */
|
|
||||||
#include <libxml/tree.h>
|
|
||||||
|
|
||||||
|
|
||||||
typedef int (*xml_callback) (xmlDocPtr);
|
|
||||||
|
|
||||||
void xml_register_callback(xml_callback callback);
|
|
||||||
double xml_fvalue(xmlNodePtr node, const char *name, double dflt);
|
|
||||||
int xml_ivalue(xmlNodePtr node, const char *name, int dflt);
|
|
||||||
bool xml_bvalue(xmlNodePtr node, const char *name, bool dflt);
|
|
||||||
|
|
||||||
void xml_done(void);
|
|
||||||
int read_xml(const char *filename);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
|
@ -20,7 +20,8 @@ static void test_volcano_update(CuTest *tc) {
|
||||||
const struct terrain_type *t_volcano, *t_active;
|
const struct terrain_type *t_volcano, *t_active;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("volcanostopsmoke", "region:region", MT_NEW_END));
|
mt_create_va(mt_new("volcanostopsmoke", NULL),
|
||||||
|
"region:region", MT_NEW_END);
|
||||||
t_volcano = test_create_terrain("volcano", LAND_REGION);
|
t_volcano = test_create_terrain("volcano", LAND_REGION);
|
||||||
t_active = test_create_terrain("activevolcano", LAND_REGION);
|
t_active = test_create_terrain("activevolcano", LAND_REGION);
|
||||||
r = test_create_region(0, 0, t_active);
|
r = test_create_region(0, 0, t_active);
|
||||||
|
@ -42,9 +43,12 @@ static void test_volcano_outbreak(CuTest *tc) {
|
||||||
const struct terrain_type *t_volcano, *t_active;
|
const struct terrain_type *t_volcano, *t_active;
|
||||||
|
|
||||||
test_setup();
|
test_setup();
|
||||||
mt_register(mt_new_va("volcanooutbreak", "regionv:region", "regionn:region", MT_NEW_END));
|
mt_create_va(mt_new("volcanooutbreak", NULL),
|
||||||
mt_register(mt_new_va("volcanooutbreaknn", "region:region", MT_NEW_END));
|
"regionv:region", "regionn:region", MT_NEW_END);
|
||||||
mt_register(mt_new_va("volcano_dead", "unit:unit", "region:region", "dead:int", MT_NEW_END));
|
mt_create_va(mt_new("volcanooutbreaknn", NULL),
|
||||||
|
"region:region", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("volcano_dead", NULL),
|
||||||
|
"unit:unit", "region:region", "dead:int", MT_NEW_END);
|
||||||
t_volcano = test_create_terrain("volcano", LAND_REGION);
|
t_volcano = test_create_terrain("volcano", LAND_REGION);
|
||||||
t_active = test_create_terrain("activevolcano", LAND_REGION);
|
t_active = test_create_terrain("activevolcano", LAND_REGION);
|
||||||
r = test_create_region(0, 0, t_active);
|
r = test_create_region(0, 0, t_active);
|
||||||
|
|
|
@ -19,10 +19,14 @@ void sort_wormhole_regions(selist *rlist, region **match, int count);
|
||||||
void make_wormholes(region **match, int count, const building_type *bt_wormhole);
|
void make_wormholes(region **match, int count, const building_type *bt_wormhole);
|
||||||
|
|
||||||
static void setup_wormholes(void) {
|
static void setup_wormholes(void) {
|
||||||
mt_register(mt_new_va("wormhole_appear", "region:region", MT_NEW_END));
|
mt_create_va(mt_new("wormhole_appear", NULL),
|
||||||
mt_register(mt_new_va("wormhole_dissolve", "region:region", MT_NEW_END));
|
"region:region", MT_NEW_END);
|
||||||
mt_register(mt_new_va("wormhole_exit", "unit:unit", "region:region", MT_NEW_END));
|
mt_create_va(mt_new("wormhole_dissolve", NULL),
|
||||||
mt_register(mt_new_va("wormhole_requirements", "unit:unit", "region:region", MT_NEW_END));
|
"region:region", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("wormhole_exit", NULL),
|
||||||
|
"unit:unit", "region:region", MT_NEW_END);
|
||||||
|
mt_create_va(mt_new("wormhole_requirements", NULL),
|
||||||
|
"unit:unit", "region:region", MT_NEW_END);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_make_wormholes(CuTest *tc) {
|
static void test_make_wormholes(CuTest *tc) {
|
||||||
|
|
1361
src/xmlreader.c
1361
src/xmlreader.c
File diff suppressed because it is too large
Load diff
|
@ -1,28 +0,0 @@
|
||||||
/*
|
|
||||||
+-------------------+
|
|
||||||
| | Enno Rehling <enno@eressea.de>
|
|
||||||
| Eressea PBEM host | Christian Schlittchen <corwin@amber.kn-bremen.de>
|
|
||||||
| (c) 1998 - 2007 | Katja Zedel <katze@felidae.kn-bremen.de>
|
|
||||||
| | Henning Peters <faroul@beyond.kn-bremen.de>
|
|
||||||
+-------------------+
|
|
||||||
|
|
||||||
This program may not be used, modified or distributed
|
|
||||||
without prior permission by the authors of Eressea.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef H_KRNL_XMLREADER_H
|
|
||||||
#define H_KRNL_XMLREADER_H
|
|
||||||
|
|
||||||
struct spell;
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
extern void register_xmlreader(void);
|
|
||||||
|
|
||||||
/* game-specific callbacks */
|
|
||||||
extern void(*set_spelldata_cb) (struct spell * sp);
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
Loading…
Add table
Reference in a new issue