Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Enno Rehling 2017-02-26 20:23:07 +01:00
commit 8246874907
365 changed files with 4819 additions and 5808 deletions

84
.gitignore vendored
View File

@ -1,40 +1,44 @@
.vscode/
*.orig
eressea.ini
Debug
Release
# SlickEdit
*.vtg
*.vpwhistu
# Microsoft Visual Studio build artefacts
src/Debug/
src/Release/
src/*.vcproj.*.user
Debug/
Release/
ipch/
*.ipch
*.ncb
*.opensdf
*.pdb
*.sdf
*.suo
*.user
*~
*.bak
bin/
build*/
*.log
*.log.*
tags
Thumbs.db
.gdb_history
*.cfg
*.cmd
tmp/
tests/config.lua
tests/reports/
tests/data/185.dat
tolua/
.vscode/
*.orig
eressea.ini
Debug
Release
# SlickEdit
*.vtg
*.vpwhistu
# Microsoft Visual Studio build artefacts
src/Debug/
src/Release/
src/*.vcproj.*.user
Debug/
Release/
ipch/
*.ipch
*.ncb
*.opensdf
*.pdb
*.sdf
*.suo
*.user
*~
*.bak
bin/
build*/
*.log
*.log.*
tags
Thumbs.db
.gdb_history
*.cfg
*.cmd
tmp/
tests/config.lua
tests/reports/
tests/data/185.dat
/quicklist/
/cutest/
/critbit/

12
.gitmodules vendored
View File

@ -4,18 +4,9 @@
[submodule "cmake"]
path = cmake
url = https://github.com/ennorehling/cmake.git
[submodule "quicklist"]
path = quicklist
url = https://github.com/ennorehling/quicklist.git
[submodule "critbit"]
path = critbit
url = https://github.com/ennorehling/critbit.git
[submodule "dlmalloc"]
path = dlmalloc
url = https://github.com/ennorehling/dlmalloc.git
[submodule "cutest"]
path = cutest
url = https://github.com/ennorehling/cutest.git
[submodule "iniparser"]
path = iniparser
url = https://github.com/ennorehling/iniparser.git
@ -26,3 +17,6 @@
path = storage
url = https://github.com/ennorehling/storage.git
branch = master
[submodule "clibs"]
path = clibs
url = https://github.com/ennorehling/clibs

View File

@ -6,7 +6,6 @@ endif(WIN32)
project (eressea-server C)
enable_testing()
find_package (LibXml2)
find_package (SQLite3)
@ -14,65 +13,14 @@ find_package (Curses)
find_package (Lua REQUIRED)
find_package (ToLua REQUIRED)
INCLUDE (CheckIncludeFiles)
INCLUDE (CheckSymbolExists)
CHECK_INCLUDE_FILES (stdbool.h HAVE_STDBOOL_H)
CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H)
CHECK_INCLUDE_FILES (io.h HAVE_IO_H)
CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H)
CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H)
IF (HAVE_IO_H)
CHECK_SYMBOL_EXISTS (_access "io.h" HAVE__ACCESS)
ENDIF (HAVE_IO_H)
IF (HAVE_WINDOWS_H)
CHECK_SYMBOL_EXISTS (_sleep "windows.h" HAVE__SLEEP)
ENDIF(HAVE_WINDOWS_H)
IF(HAVE_STDBOOL_H)
CHECK_SYMBOL_EXISTS (_Bool "stdbool.h" HAVE__BOOL)
ENDIF(HAVE_STDBOOL_H)
IF(HAVE_UNISTD_H)
CHECK_SYMBOL_EXISTS (sleep "unistd.h" HAVE_SLEEP)
CHECK_SYMBOL_EXISTS (usleep "unistd.h" HAVE_USLEEP)
CHECK_SYMBOL_EXISTS (access "unistd.h" HAVE_ACCESS)
ENDIF(HAVE_UNISTD_H)
CHECK_SYMBOL_EXISTS (strlcpy "string.h" HAVE_STRLCPY)
CHECK_SYMBOL_EXISTS (strlcat "string.h" HAVE_STRLCAT)
CHECK_SYMBOL_EXISTS (slprintf "string.h" HAVE_SLPRINTF)
CHECK_SYMBOL_EXISTS (strcasecmp "string.h" HAVE_STRCASECMP)
CHECK_SYMBOL_EXISTS (strncasecmp "string.h" HAVE_STRNCASECMP)
CHECK_SYMBOL_EXISTS (_strlwr "string.h" HAVE__STRLWR)
CHECK_SYMBOL_EXISTS (_strcmpl "string.h" HAVE__STRCMPL)
CHECK_SYMBOL_EXISTS (_strdup "string.h" HAVE__STRDUP)
CHECK_SYMBOL_EXISTS (_stricmp "string.h" HAVE__STRICMP)
CHECK_SYMBOL_EXISTS (_memicmp "string.h" HAVE__MEMICMP)
CHECK_SYMBOL_EXISTS (strcmpl "string.h" HAVE_STRCMPL)
CHECK_SYMBOL_EXISTS (strdup "string.h" HAVE_STRDUP)
CHECK_SYMBOL_EXISTS (stricmp "string.h" HAVE_STRICMP)
CHECK_SYMBOL_EXISTS (memicmp "string.h" HAVE_MEMICMP)
CHECK_SYMBOL_EXISTS (strlwr "string.h" HAVE_STRLWR)
CHECK_SYMBOL_EXISTS (snprintf "stdio.h" HAVE_SNPRINTF)
CHECK_SYMBOL_EXISTS (_snprintf "stdio.h" HAVE__SNPRINTF)
CHECK_SYMBOL_EXISTS (mkdir "sys/stat.h" HAVE_SYS_STAT_MKDIR)
CHECK_SYMBOL_EXISTS (mkdir "direct.h" HAVE_DIRECT_MKDIR)
CHECK_SYMBOL_EXISTS (_mkdir "direct.h" HAVE_DIRECT__MKDIR)
CONFIGURE_FILE (
${CMAKE_CURRENT_SOURCE_DIR}/autoconf.h.in
${CMAKE_BINARY_DIR}/include/autoconf.h)
INCLUDE_DIRECTORIES (${CMAKE_BINARY_DIR}/include)
## skip compiler/libc detection and force cmake autoconf:
#add_definitions(-DUSE_AUTOCONF)
add_subdirectory (cutest)
add_subdirectory (cJSON)
add_subdirectory (storage)
add_subdirectory (iniparser)
add_subdirectory (quicklist)
add_subdirectory (critbit)
add_subdirectory (clibs)
add_subdirectory (process)
add_subdirectory (src eressea)
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 scripts DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.lua")
install(DIRECTORY lunit DESTINATION ${CMAKE_INSTALL_PREFIX} FILES_MATCHING PATTERN "*.lua")
install(DIRECTORY share DESTINATION ${CMAKE_INSTALL_PREFIX})

View File

@ -1,36 +0,0 @@
#pragma once
#ifndef CMAKE_AUTOCONF_H
#define CMAKE_AUTOCONF_H
#cmakedefine HAVE_STDBOOL_H 1
#cmakedefine HAVE_STRINGS_H 1
#cmakedefine HAVE_WINDOWS_H 1
#cmakedefine HAVE_IO_H 1
#cmakedefine HAVE_UNISTD_H 1
#cmakedefine HAVE__BOOL 1
#cmakedefine HAVE_STRCASECMP 1
#cmakedefine HAVE_STRNCASECMP 1
#cmakedefine HAVE__STRICMP 1
#cmakedefine HAVE_SNPRINTF 1
#cmakedefine HAVE__SNPRINTF 1
#cmakedefine HAVE_ACCESS 1
#cmakedefine HAVE__ACCESS 1
#cmakedefine HAVE_SLEEP 1
#cmakedefine HAVE_USLEEP 1
#cmakedefine HAVE__SLEEP 1
#cmakedefine HAVE_STRDUP 1
#cmakedefine HAVE__STRDUP 1
#cmakedefine HAVE_STRICMP 1
#cmakedefine HAVE__STRCMPL 1
#cmakedefine HAVE_STRCMPL 1
#cmakedefine HAVE__MEMICMP 1
#cmakedefine HAVE_MEMICMP 1
#cmakedefine HAVE__STRLWR 1
#cmakedefine HAVE_STRLWR 1
#cmakedefine HAVE_STRLCPY 1
#cmakedefine HAVE_STRLCAT 1
#cmakedefine HAVE_SLPRINTF 1
#cmakedefine HAVE_SYS_STAT_MKDIR 1
#cmakedefine HAVE_DIRECT_MKDIR 1
#cmakedefine HAVE_DIRECT__MKDIR 1
#endif

1
clibs Submodule

@ -0,0 +1 @@
Subproject commit 27c8b3202b52766465743c3324fc0b52c5ba4b11

View File

@ -5,12 +5,11 @@
"e2/terrains.json"
],
"disabled": [
"pay",
"jsreport"
],
"settings": {
"game.id": 2,
"game.name": "Eressea",
"game.name" : "Eressea",
"game.id" : 2,
"orders.default": "work",
"NewbieImmunity": 8,
"modules.wormholes": true,

13
conf/e2/locales.xml Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0"?>
<eressea xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="config://core/messages.xml"/>
<xi:include href="config://core/de/strings.xml"/>
<xi:include href="config://core/en/strings.xml"/>
<xi:include href="config://game/strings.xml"/>
<xi:include href="config://game/spellinfo.xml" />
<xi:include href="config://default/names-undead.xml"/>
<xi:include href="config://default/names-skeletons.xml"/>
<xi:include href="config://default/names-zombies.xml"/>
<xi:include href="config://default/names-ghouls.xml"/>
<xi:include href="config://default/names-dragons.xml"/>
</eressea>

View File

@ -1,11 +1,5 @@
<?xml version="1.0"?>
<eressea xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="config://core/messages.xml"/>
<!-- Localization -->
<xi:include href="config://core/de/strings.xml"/>
<xi:include href="config://core/en/strings.xml"/>
<xi:include href="config://game/spellinfo.xml" />
<xi:include href="config://core/common/items.xml" />
<xi:include href="config://core/common/armor.xml" />
@ -26,10 +20,9 @@
<xi:include href="config://game/equipment.xml"/>
<xi:include href="config://game/items.xml"/>
<xi:include href="config://game/spells.xml"/>
<xi:include href="config://game/strings.xml"/>
<xi:include href="config://default/adamantium.xml"/>
<equipment>
<set name="first_unit">
<set name="autoseed_unit">
<item name="log" amount="50"/>
<item name="stone" amount="50"/>
<item name="iron" amount="50"/>
@ -42,30 +35,8 @@
<skill name="perception" level="30"/>
<skill name="melee" level="1"/>
</set>
<set name="new_faction">
<set name="autoseed_faction">
<item name="adamantium" amount="1"/>
</set>
</equipment>
<xi:include href="config://default/names-undead.xml"/>
<xi:include href="config://default/names-skeletons.xml"/>
<xi:include href="config://default/names-zombies.xml"/>
<xi:include href="config://default/names-ghouls.xml"/>
<xi:include href="config://default/names-dragons.xml"/>
<strings>
<string name="mailto">
<text locale="de">eressea-server@eressea.kn-bremen.de</text>
<text locale="en">eressea-server@eressea.kn-bremen.de</text>
</string>
<string name="newbie_info_game">
<text locale="de">Bitte denke daran, deine Befehle mit dem Betreff
ERESSEA 2 BEFEHLE an eressea-server@eressea.kn-bremen.de zu senden.</text>
<text locale="en">Remember to send your orders to
eressea-server@eressea.kn-bremen.de with the subject ERESSEA 2 ORDERS.</text>
</string>
<string name="mailcmd">
<text locale="de">ERESSEA 2 BEFEHLE</text>
<text locale="en">ERESSEA 2 ORDERS</text>
</string>
</strings>
</eressea>

View File

@ -25,8 +25,8 @@
"jsreport"
],
"settings": {
"game.id": 3,
"game.name": "E3",
"game.name" : "Eressea",
"game.id" : 3,
"orders.default": "work",
"database.gameid": 7,
"NewbieImmunity": 4,
@ -42,6 +42,7 @@
"nmr.timeout": 5,
"nmr.removenewbie": 0,
"GiveRestriction": 3,
"healing.forest": 2.0,
"hunger.long": false,
"hunger.damage": "1d9+9",
"hunger.demons.skill": true,

13
conf/e3/locales.xml Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0"?>
<eressea xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="config://core/messages.xml"/>
<xi:include href="config://core/de/strings.xml"/>
<xi:include href="config://core/en/strings.xml"/>
<xi:include href="config://game/strings.xml"/>
<xi:include href="config://game/messages.xml"/>
<xi:include href="config://default/names-undead.xml"/>
<xi:include href="config://default/names-skeletons.xml"/>
<xi:include href="config://default/names-zombies.xml"/>
<xi:include href="config://default/names-ghouls.xml"/>
<xi:include href="config://default/names-dragons.xml"/>
</eressea>

View File

@ -1,8 +1,5 @@
<?xml version="1.0"?>
<eressea xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="config://core/messages.xml"/>
<xi:include href="config://core/de/strings.xml"/>
<xi:include href="config://core/en/strings.xml"/>
<xi:include href="config://core/common/items.xml"/>
<xi:include href="config://core/common/herbs.xml" />
<xi:include href="config://core/spoils.xml"/>
@ -15,8 +12,6 @@
<xi:include href="config://game/shipnames.xml"/>
<xi:include href="config://core/calendar.xml"/>
<xi:include href="config://game/items.xml" />
<xi:include href="config://game/strings.xml"/>
<xi:include href="config://game/messages.xml"/>
<xi:include href="config://game/races.xml"/>
<xi:include href="config://game/buildings.xml"/>
<xi:include href="config://game/equipment.xml"/>
@ -28,14 +23,6 @@
<calendar name="thirdage" newyear="month_1" start="1"/>
<equipment>
<set name="first_unit">
<item name="log" amount="10"/>
<item name="stone" amount="10"/>
<item name="money" amount="5000"/>
</set>
</equipment>
<xi:include href="config://default/names-undead.xml"/>
<xi:include href="config://default/names-skeletons.xml"/>
<xi:include href="config://default/names-zombies.xml"/>
@ -44,20 +31,4 @@
<rules>
<function name="wage" value="minimum_wage"/>
</rules>
<strings>
<string name="mailto">
<text locale="de">eressea-server@eressea.kn-bremen.de</text>
<text locale="en">eressea-server@eressea.kn-bremen.de</text>
</string>
<string name="newbie_info_game">
<text locale="de">Bitte denke daran, deine Befehle mit dem Betreff
ERESSEA 3 BEFEHLE an eressea-server@eressea.kn-bremen.de zu senden.</text>
<text locale="en">Remember to send your orders to
eressea-server@eressea.kn-bremen.de with the subject E3 ORDERS.</text>
</string>
<string name="mailcmd">
<text locale="de">ERESSEA 3 BEFEHLE</text>
<text locale="en">ERESSEA 3 ORDERS</text>
</string>
</strings>
</eressea>

View File

@ -1,16 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE catalog
PUBLIC "-//OASIS/DTD Entity Resolution XML Catalog V1.0//EN"
"http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<rewriteURI
uriStartString="config://core/"
rewritePrefix="../../res/core/" />
<rewriteURI
uriStartString="config://game/"
rewritePrefix="../../res/e3a/" />
<rewriteURI
uriStartString="config://default/"
rewritePrefix="../../res/" />
</catalog>

View File

@ -1,95 +0,0 @@
{
"include": [
"keywords.json",
"prefixes.json",
"e3/terrains.json"
],
"disabled": [
"herbalism",
"alchemy",
"entertainment",
"espionage",
"perception",
"stealth",
"taxation",
"trade",
"besiege",
"steal",
"buy",
"teach",
"sabotage",
"spy",
"tax",
"entertain",
"sell",
"jsreport"
],
"settings": {
"game.id": 4,
"game.name": "Deveron",
"orders.default": "work",
"database.gameid": 7,
"NewbieImmunity": 4,
"modules.astralspace": false,
"modules.wormholes": false,
"modules.markets": true,
"magic.regeneration": 0.75,
"magic.power": 0.5,
"resource.factor": 0.25,
"skills.cost.tactics": 500,
"entertain.base": 0,
"entertain.perlevel": 20,
"nmr.timeout": 5,
"nmr.removenewbie": 0,
"GiveRestriction": 3,
"hunger.long": false,
"hunger.damage": "1d9+9",
"hunger.demons.skill": true,
"hunger.demons.peasant_tolerance": true,
"init_spells": 0,
"recruit.allow_merge": true,
"study.expensivemigrants": true,
"study.speedup": 2,
"study.produceexp": 12,
"world.era": 3,
"rules.reserve.twophase": true,
"rules.owners.force_leave": false,
"rules.transfermen": false,
"stealth.faction.other": false,
"rules.stealth.anon_battle": false,
"rules.check_overload": false,
"rules.combat.goblinbonus": 3,
"rules.alliances": true,
"rules.combat.herospeed": 3,
"rules.combat.demon_vampire": 5,
"rules.combat.skill_bonus": 0,
"rules.combat.nat_armor": 1,
"rules.items.loot_divisor": 2,
"rules.items.give_divisor": 2,
"rules.move.owner_leave": true,
"rules.region_owners": true,
"rules.cavalry.skill": 2,
"rules.cavalry.mode": 1,
"rules.magic.multipotion": true,
"rules.magic.wol_effect": 5,
"rules.magic.factionlist": true,
"rules.magic.wol_type": 2,
"rules.blessed_harvest.flags": 1,
"rules.magic.elfpower": true,
"rules.magic.playerschools": "gwyrrd illaun draig cerddor",
"rules.build.other_buildings": true,
"rules.economy.taxation": 1,
"rules.food.flags": 2,
"rules.economy.roqf": 5,
"rules.economy.herbrot": 0,
"rules.region_owner_pay_building": "market harbour lighthouse",
"rules.dwarf_castles": true,
"rules.limit.faction": 250,
"rules.grow.formula": 1,
"rules.tactics.formula": 1,
"rules.help.mask": "fight guard money give",
"movement.shipspeed.skillbonus": 6,
"alliance.auto": "fight",
"alliance.restricted": "fight"
}
}

View File

@ -1,64 +0,0 @@
<?xml version="1.0"?>
<eressea xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="config://core/messages.xml"/>
<xi:include href="config://core/de/strings.xml"/>
<xi:include href="config://core/en/strings.xml"/>
<xi:include href="config://core/common/items.xml"/>
<xi:include href="config://core/common/herbs.xml" />
<xi:include href="config://core/spoils.xml"/>
<xi:include href="config://core/common/buildings.xml"/>
<xi:include href="config://game/familiars.xml"/>
<xi:include href="config://default/adamantium.xml" />
<xi:include href="config://game/ships.xml"/>
<xi:include href="config://game/shipnames.xml"/>
<xi:include href="config://core/calendar.xml"/>
<xi:include href="config://game/items.xml" />
<xi:include href="config://game/strings.xml"/>
<xi:include href="config://game/messages.xml"/>
<xi:include href="config://game/races.xml"/>
<xi:include href="config://game/buildings.xml"/>
<xi:include href="config://game/equipment.xml"/>
<xi:include href="config://game/spells.xml"/>
<xi:include href="config://game/luxuries.xml" />
<xi:include href="config://game/weapons.xml" />
<xi:include href="config://game/armor.xml" />
<xi:include href="config://game/resources.xml" />
<calendar name="thirdage" newyear="month_1" start="1"/>
<equipment>
<set name="first_unit">
<item name="log" amount="10"/>
<item name="stone" amount="10"/>
<item name="money" amount="5000"/>
</set>
</equipment>
<xi:include href="config://default/names-undead.xml"/>
<xi:include href="config://default/names-skeletons.xml"/>
<xi:include href="config://default/names-zombies.xml"/>
<xi:include href="config://default/names-ghouls.xml"/>
<xi:include href="config://default/names-dragons.xml"/>
<rules>
<function name="wage" value="minimum_wage"/>
</rules>
<strings>
<string name="mailto">
<text locale="de">eressea-server@eressea.kn-bremen.de</text>
<text locale="en">eressea-server@eressea.kn-bremen.de</text>
</string>
<string name="newbie_info_game">
<text locale="de">Bitte denke daran, deine Befehle mit dem Betreff
ERESSEA 4 BEFEHLE an eressea-server@eressea.kn-bremen.de zu senden.</text>
<text locale="en">Remember to send your orders to
eressea-server@eressea.kn-bremen.de with the subject ERESSEA 4 ORDERS.</text>
</string>
<string name="mailcmd">
<text locale="de">ERESSEA 4 BEFEHLE</text>
<text locale="en">ERESSEA 4 ORDERS</text>
</string>
</strings>
</eressea>

View File

@ -1,5 +1,7 @@
[eressea]
[game]
email = eressea-server@kn-bremen.de
sender = Eressea Server
name = Eressea
base = .
report = reports
verbose = 0

@ -1 +0,0 @@
Subproject commit 971836241277e37274aa3110344836499816ff21

1
cutest

@ -1 +0,0 @@
Subproject commit 6e268687dbf6ae55afb63210c3753530d216a622

View File

@ -20,5 +20,5 @@ if [ ! -d $GAME/reports ]; then
fi
cd $GAME/reports
$HOME/bin/compress.py $TURN "$GAME_NAME"
$ERESSEA/server/bin/compress.py $TURN "$GAME_NAME"
cd -

View File

@ -3,22 +3,53 @@
from email.Utils import parseaddr
from email.Parser import Parser
from os import mkdir, rename, stat, utime, unlink, symlink
from os.path import exists
import os
import os.path
import ConfigParser
from re import compile, IGNORECASE
from stat import ST_MTIME
from string import upper, split, replace
import logging
from sys import argv, stdin, exit
import sys
from sys import stdin
from time import ctime, sleep, time
from socket import gethostname
from rfc822 import parsedate_tz, mktime_tz
LOG_FILENAME='/home/eressea/log/orders.log'
if 'ERESSEA' in os.environ:
dir = os.environ['ERESSEA']
elif 'HOME' in os.environ:
dir = os.path.join(os.environ['HOME'], '/eressea')
else: # WTF? No HOME?
dir = "/home/eressea/eressea"
if not os.path.isdir(dir):
print "please set the ERESSEA environment variable to the install path"
sys.exit(1)
rootdir = dir
game = int(sys.argv[1])
gamedir = os.path.join(rootdir, "game-%d" % (game, ))
frommail = 'eressea-server@kn-bremen.de'
gamename = 'Eressea'
sender = '%s Server <%s>' % (gamename, frommail)
inifile = os.path.join(gamedir, 'eressea.ini')
if not os.path.exists(inifile):
print "no such file: " . inifile
else:
config = ConfigParser.ConfigParser()
config.read(inifile)
if config.has_option('game', 'email'):
frommail = config.get('game', 'email')
if config.has_option('game', 'name'):
gamename = config.get('game', 'name')
if config.has_option('game', 'sender'):
sender = config.get('game', 'sender')
else:
sender = "%s Server <%s>" % (gamename, frommail)
config = None
prefix = 'turn-'
hostname = gethostname()
# base directory for all your games:
rootdir = "/home/eressea"
orderbase = "orders.dir"
sendmail = True
# maximum number of reports per sender:
@ -28,36 +59,21 @@ writeheaders = True
# reject all html email?
rejecthtml = True
games = [
{
"from" : "Eressea Server <eressea-server@eressea.kn-bremen.de>",
"prefix" : "Eressea"
},
{
"from" : "Eressea Server <eressea-server@eressea.kn-bremen.de>",
"prefix": "E3"
},
{
"from" : "Eressea Server <eressea-server@eressea.kn-bremen.de>",
"prefix": "E4"
},
]
def unlock_file(filename):
try:
unlink(filename+".lock")
os.unlink(filename+".lock")
except:
print "could not unlock %s.lock, file not found" % filename
def lock_file(filename):
i = 0
wait = 1
if not exists(filename):
if not os.path.exists(filename):
file=open(filename, "w")
file.close()
while True:
try:
symlink(filename, filename+".lock")
os.symlink(filename, filename+".lock")
return
except:
i = i+1
@ -74,17 +90,17 @@ messages = {
"software and re-send the orders.",
"multipart-de" :
"FEHLER: Die von dir eingeschickte Mail enthält keinen " \
"FEHLER: Die von dir eingeschickte Mail enth<EFBFBD>lt keinen " \
"Text. Evtl. hast Du den Zug als HTML oder als anderweitig " \
"ungültig formatierte Mail ingeschickt. Wir können ihn " \
"deshalb nicht berücksichtigen. Schicke den Zug nochmals " \
"ung<EFBFBD>ltig formatierte Mail ingeschickt. Wir k<>nnen ihn " \
"deshalb nicht ber<EFBFBD>cksichtigen. Schicke den Zug nochmals " \
"als reinen Text ohne Formatierungen ein.",
"maildate-de":
"Es erreichte uns bereits ein Zug mit einem späteren " \
"Es erreichte uns bereits ein Zug mit einem sp<EFBFBD>teren " \
"Absendedatum (%s > %s). Entweder ist deine " \
"Systemzeit verstellt, oder ein Zug hat einen anderen Zug von " \
"dir auf dem Transportweg überholt. Entscheidend für die " \
"dir auf dem Transportweg <EFBFBD>berholt. Entscheidend f<>r die " \
"Auswertungsreihenfolge ist das Absendedatum, d.h. der Date:-Header " \
"deiner Mail.",
@ -173,8 +189,8 @@ def available_file(dirname, basename):
ver = 0
maxdate = 0
filename = "%s/%s,%s,%d" % (dirname, basename, hostname, ver)
while exists(filename):
maxdate = max(stat(filename)[ST_MTIME], maxdate)
while os.path.exists(filename):
maxdate = max(os.stat(filename)[ST_MTIME], maxdate)
ver = ver + 1
filename = "%s/%s,%s,%d" % (dirname, basename, hostname, ver)
if ver >= maxfiles:
@ -234,7 +250,7 @@ def copy_orders(message, filename, sender):
from os.path import split
dirname, basename = split(filename)
dirname = dirname + '/headers'
if not exists(dirname): mkdir(dirname)
if not os.path.exists(dirname): os.mkdir(dirname)
outfile = open(dirname + '/' + basename, "w")
for name, value in message.items():
outfile.write(name + ": " + value + "\n")
@ -265,104 +281,94 @@ def copy_orders(message, filename, sender):
# create a file, containing:
# game=0 locale=de file=/path/to/filename email=rcpt@domain.to
def accept(game, locale, stream, extend=None):
global rootdir, orderbase
global rootdir, orderbase, gamedir, gamename, sender
if extend is not None:
orderbase = orderbase + ".pre-" + extend
gamename = games[game-2]["prefix"]
gamedir = rootdir+"/eressea/game-%d" % (game, )
savedir = gamedir+"/"+orderbase
savedir = os.path.join(gamedir, orderbase)
# check if it's one of the pre-sent orders.
# create the save-directories if they don't exist
if not exists(gamedir): mkdir(gamedir)
if not exists(savedir): mkdir(savedir)
if not os.path.exists(gamedir): os.mkdir(gamedir)
if not os.path.exists(savedir): os.mkdir(savedir)
# parse message
message = Parser().parse(stream)
sender = get_sender(message)
logger = logging.getLogger(sender)
email = get_sender(message)
logger = logging.getLogger(email)
# write syslog
if sender is None or valid_email(sender)==0:
logger.warning("invalid email address: " + str(sender))
if email is None or valid_email(email)==0:
logger.warning("invalid email address: " + str(email))
return -1
logger.info("received orders from " + sender)
logger.info("received orders from " + email)
# get an available filename
lock_file(gamedir + "/orders.queue")
maxdate, filename = available_file(savedir, prefix + sender)
maxdate, filename = available_file(savedir, prefix + email)
if filename is None:
logger.warning("more than " + str(maxfiles) + " orders from " + sender)
logger.warning("more than " + str(maxfiles) + " orders from " + email)
return -1
# copy the orders to the file
text_ok = copy_orders(message, filename, sender)
text_ok = copy_orders(message, filename, email)
unlock_file(gamedir + "/orders.queue")
warning, msg, fail = None, "", False
maildate = message.get("Date")
if maildate != None:
turndate = mktime_tz(parsedate_tz(maildate))
utime(filename, (turndate, turndate))
os.utime(filename, (turndate, turndate))
logger.debug("mail date is '%s' (%d)" % (maildate, turndate))
if turndate < maxdate:
logger.warning("inconsistent message date " + sender)
logger.warning("inconsistent message date " + email)
warning = " (" + messages["warning-" + locale] + ")"
msg = msg + formatpar(messages["maildate-" + locale] % (ctime(maxdate),ctime(turndate)), 76, 2) + "\n"
else:
logger.warning("missing message date " + sender)
logger.warning("missing message date " + email)
warning = " (" + messages["warning-" + locale] + ")"
msg = msg + formatpar(messages["nodate-" + locale], 76, 2) + "\n"
if not text_ok:
warning = " (" + messages["error-" + locale] + ")"
msg = msg + formatpar(messages["multipart-" + locale], 76, 2) + "\n"
logger.warning("rejected - no text/plain in orders from " + sender)
unlink(filename)
logger.warning("rejected - no text/plain in orders from " + email)
os.unlink(filename)
savedir = savedir + "/rejected"
if not exists(savedir): mkdir(savedir)
if not os.path.exists(savedir): os.mkdir(savedir)
lock_file(gamedir + "/orders.queue")
maxdate, filename = available_file(savedir, prefix + sender)
maxdate, filename = available_file(savedir, prefix + email)
store_message(message, filename)
unlock_file(gamedir + "/orders.queue")
fail = True
if sendmail and warning is not None:
frommail = games[key]["from"]
subject = gamename + " " + messages["subject-"+locale] + warning
mail = "Subject: %s\nFrom: %s\nTo: %s\n\n" % (subject, frommail, sender) + msg
mail = "Subject: %s\nFrom: %s\nTo: %s\n\n" % (subject, sender, email) + msg
from smtplib import SMTP
server = SMTP("localhost")
server.sendmail(frommail, sender, mail)
server.sendmail(sender, email, mail)
server.close()
if not sendmail:
print text_ok, fail, sender
print text_ok, fail, email
print filename
if not fail:
lock_file(gamedir + "/orders.queue")
queue = open(gamedir + "/orders.queue", "a")
queue.write("email=%s file=%s locale=%s game=%s\n" % (sender, filename, locale, game))
queue.write("email=%s file=%s locale=%s game=%s\n" % (email, filename, locale, game))
queue.close()
unlock_file(gamedir + "/orders.queue")
logger.info("done - accepted orders from " + sender)
logger.info("done - accepted orders from " + email)
return 0
# the main body of the script:
LOG_FILENAME=os.path.join(rootdir, 'log/orders.log')
logging.basicConfig(level=logging.DEBUG, filename=LOG_FILENAME)
logger = logging
delay=None # TODO: parse the turn delay
try:
game = int(argv[1])
except:
game = argv[1]
if game[:3]=='e3a':
game = 3
elif game[:7]=='eressea':
game = 2
locale = argv[2]
locale = sys.argv[2]
infile = stdin
if len(argv)>3:
infile = open(argv[3], "r")
if len(sys.argv)>3:
infile = open(sys.argv[3], "r")
retval = accept(game, locale, infile, delay)
if infile!=stdin:
infile.close()
exit(retval)
sys.exit(retval)

View File

@ -2,7 +2,9 @@
# -*- coding: iso-8859-1 -*-
from os import unlink, symlink, rename, popen, tmpfile
from os.path import exists
import os
import os.path
import ConfigParser
from re import compile, IGNORECASE
from string import split, join, upper, strip
from sys import argv, exit
@ -14,9 +16,8 @@ from epasswd import EPasswd
def pwd_get_email(faction, pwd, pwdfile=None):
return None
def splitfilename(filename):
from os.path import split
return split(filename)
def split_filename(filename):
return os.path.split(filename)
def unlock_file(filename):
try:
@ -28,7 +29,7 @@ def unlock_file(filename):
def lock_file(filename):
i = 0
wait = 1
if not exists(filename):
if not os.path.exists(filename):
file=open(filename, "w")
file.close()
while True:
@ -62,17 +63,47 @@ messages = {
"error-en": "Error",
}
game = int(sys.argv[1])
echeck_cmd = "/home/eressea/echeck/echeck.sh"
maxlines = 25
# base directory for all your games:
rootdir = "/home/eressea/eressea"
frommail = "Eressea Server <eressea-server@eressea.kn-bremen.de>"
orderbase = "orders.dir"
sendmail = True
maxlines = 25
echeck_cmd = "/home/eressea/echeck/echeck.sh"
install_dir = "/home/eressea/eressea"
if 'ERESSEA' in os.environ:
install_dir = os.environ['ERESSEA']
elif 'HOME' in os.environ:
install_dir = os.path.join(os.environ['HOME'], '/eressea')
if not os.path.isdir(install_dir):
print "please set the ERESSEA environment variable to the install path"
sys.exit(1)
game_dir = os.path.join(install_dir, "game-%d" % (game, ))
frommail = 'eressea-server@kn-bremen.de'
gamename = 'Eressea'
sender = '%s Server <%s>' % (gamename, frommail)
inifile = os.path.join(gamedir, 'eressea.ini')
if not os.path.exists(inifile):
print "no such file: " . inifile
else:
config = ConfigParser.ConfigParser()
config.read(inifile)
if config.has_option('game', 'email'):
frommail = config.get('game', 'email')
if config.has_option('game', 'name'):
gamename = config.get('game', 'name')
if config.has_option('game', 'sender'):
sender = config.get('game', 'sender')
else:
sender = "%s Server <%s>" % (gamename, frommail)
config = None
queue_file = os.path.join(game_dir, "orders.queue")
if not os.path.exists(queue_file):
exit(0)
# regular expression that finds the start of a faction
fact_re = compile("^\s*(eressea|vinyambar|partei|faction)\s+([a-zA-Z0-9]+)\s+\"?([^\"]*)\"?", IGNORECASE)
fact_re = compile("^\s*(eressea|partei|faction)\s+([a-zA-Z0-9]+)\s+\"?([^\"]*)\"?", IGNORECASE)
def check_pwd(filename, email, pw_data):
results = []
@ -98,7 +129,7 @@ def check_pwd(filename, email, pw_data):
return results
def echeck(filename, locale, rules):
dirname, filename = splitfilename(filename)
dirname, filename = split_filename(filename)
stream = popen("%s %s %s %s %s" % (echeck_cmd, locale, filename, dirname, rules), 'r')
lines = stream.readlines()
if len(lines)==0:
@ -111,14 +142,6 @@ def echeck(filename, locale, rules):
stream.close()
return mail
## the main body of the script
game = int(argv[1])
basedir = rootdir + "/game-%d" % (game, )
queuename = basedir + "/orders.queue"
if not exists(queuename):
exit(0)
# parse the queue file -
#print "connecting to SMTP..."
from smtplib import SMTP
@ -127,16 +150,17 @@ try:
except:
print "could not connect to SMTP server"
exit(0)
#print "reading password file..."
pw_data = EPasswd(basedir + "/passwd")
pw_data = EPasswd(os.path.join(game_dir,"passwd"))
#print "reading orders.queue..."
# move the queue file to a save space while locking it:
try:
lock_file(queuename)
lock_file(queue_file)
except:
exit(0)
queuefile = open(queuename, "r")
queuefile = open(queue_file, "r")
lines = queuefile.readlines()
queuefile.close()
@ -154,9 +178,9 @@ tmpfile.close()
openlog("orders")
unlink(queuename)
unlink(queue_file)
try:
unlock_file(queuename)
unlock_file(queue_file)
except:
pass
@ -170,15 +194,15 @@ for line in lines:
email = dict["email"]
locale = dict["locale"]
game = int(dict["game"])
file = dict["file"]
infile = dict["file"]
gamename='[E%d]' % game
rules='e%d' % game
warning = ""
failed = True
results = check_pwd(file, email, pw_data)
logfile = open(basedir+"/zug.log", "a")
dirname, filename = splitfilename(file)
msg = messages["validate-"+locale] + " " + filename + "\n\n"
results = check_pwd(infile, email, pw_data)
logfile = open(os.path.join(game_dir, "zug.log"), "a")
dirname, filename = split_filename(infile)
msg = messages["validate-"+locale] + " " + infilename + "\n\n"
for faction, game_email, success, pwd in results:
msg = msg + messages["faction-"+locale] + " " + faction + "\n"
if success: failed = False
@ -189,25 +213,24 @@ for line in lines:
if failed:
warning = " (" + messages["warning-" + locale] + ")"
syslog("failed - no valid password in " + file)
syslog("failed - no valid password in " + infile)
else:
result = echeck(file, locale, rules)
if email=='eressea':
print result
continue
elif result is None:
result = None
if os.path.exists(echeck_cmd):
result = echeck(infile, locale, rules)
if result is None:
# echeck did not finish
msg = msg + "Echeck was killed. Your turn was accepted, but could not be verified.\n"
msg = msg + "Echeck is broken. Your turn was accepted, but could not be verified.\n"
warning = " (" + messages["warning-" + locale] + ")"
syslog("process - echeck got killed, " + file)
syslog("process - echeck broken, " + infile)
else:
msg = msg + result
syslog("process - checked orders in " + file)
syslog("process - checked orders in " + infile)
subject = gamename + " " + messages["subject-" + locale] + warning
msg = "Subject: %s\nFrom: %s\nTo: %s\nContent-Type: text/plain; charset=utf-8\n\n" % (subject, frommail, email) + msg
msg = "Subject: %s\nFrom: %s\nTo: %s\nContent-Type: text/plain; charset=utf-8\n\n" % (subject, sender, email) + msg
try:
server.sendmail(frommail, email, msg)
server.sendmail(sender, email, msg)
except:
syslog("failed - cannot send to " + email)

View File

@ -8,7 +8,6 @@ if [ ! -f reports.txt ]; then
exit -2
fi
source $HOME/bin/functions.sh
source $ERESSEA/etc/eressea.conf
TEMPLATE=report-mail.txt
if [ "$1" == "-Lde" ]

View File

@ -8,7 +8,6 @@ if [ -z $ERESSEA ]; then
exit -2
fi
source $HOME/bin/functions.sh
source $HOME/etc/eressea.conf
GAME=$1
EMAIL=$2

View File

@ -8,7 +8,6 @@ if [ -z $ERESSEA ]; then
exit -2
fi
source $HOME/bin/functions.sh
source $ERESSEA/etc/eressea.conf
if [ ! -z $1 ]; then
GAME=$ERESSEA/game-$1

@ -1 +0,0 @@
Subproject commit f837dd31e5fcf13c706db1ac2c86b7de3e706578

View File

@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<resource name="adamantium" limited="yes" material="rm_adamantium">
<resource name="adamantium" limited="yes" material="yes">
<item weight="200" score="200">
<construction skill="mining" minskill="8"/>
</item>
<resourcelimit>
<modifier type="require" building="mine"/>
<guard flag="mining"/>
</resourcelimit>
</resource>

View File

@ -1,24 +1,23 @@
<?xml version="1.0"?>
<building name="castle" capacity="1" fort="yes">
<function name="name" value="castle_name_2"/>
<function name="protection" value="building_protection"/>
<function name="taxes" value="lua_building_taxes"/>
<construction skill="building" minskill="1" maxsize="10" defense_bonus="0">
<construction skill="building" minskill="1" maxsize="10">
<requirement type="stone" quantity="1"/>
</construction>
<construction skill="building" minskill="2" maxsize="40" defense_bonus="1">
<construction skill="building" minskill="2" maxsize="40">
<requirement type="stone" quantity="1"/>
</construction>
<construction skill="building" minskill="3" maxsize="200" defense_bonus="3">
<construction skill="building" minskill="3" maxsize="200">
<requirement type="stone" quantity="1"/>
</construction>
<construction skill="building" minskill="4" maxsize="1000" defense_bonus="5">
<construction skill="building" minskill="4" maxsize="1000">
<requirement type="stone" quantity="1"/>
</construction>
<construction skill="building" minskill="5" maxsize="5000" defense_bonus="8">
<construction skill="building" minskill="5" maxsize="5000">
<requirement type="stone" quantity="1"/>
</construction>
<construction skill="building" minskill="6" defense_bonus="12">
<construction skill="building" minskill="6">
<requirement type="stone" quantity="1"/>
</construction>
</building>

View File

@ -1,26 +1,25 @@
<?xml version="1.0"?>
<building name="castle" capacity="1" fort="yes">
<function name="name" value="castle_name"/>
<function name="protection" value="building_protection"/>
<construction skill="building" minskill="1" maxsize="2" defense_bonus="0">
<construction skill="building" minskill="1" maxsize="2">
<requirement type="stone" quantity="1"/>
</construction>
<construction skill="building" minskill="1" maxsize="8" defense_bonus="0">
<construction skill="building" minskill="1" maxsize="8">
<requirement type="stone" quantity="1"/>
</construction>
<construction skill="building" minskill="2" maxsize="40" defense_bonus="1">
<construction skill="building" minskill="2" maxsize="40">
<requirement type="stone" quantity="1"/>
</construction>
<construction skill="building" minskill="3" maxsize="200" defense_bonus="3">
<construction skill="building" minskill="3" maxsize="200">
<requirement type="stone" quantity="1"/>
</construction>
<construction skill="building" minskill="4" maxsize="1000" defense_bonus="5">
<construction skill="building" minskill="4" maxsize="1000">
<requirement type="stone" quantity="1"/>
</construction>
<construction skill="building" minskill="5" maxsize="5000" defense_bonus="8">
<construction skill="building" minskill="5" maxsize="5000">
<requirement type="stone" quantity="1"/>
</construction>
<construction skill="building" minskill="6" defense_bonus="12">
<construction skill="building" minskill="6">
<requirement type="stone" quantity="1"/>
</construction>
</building>

View File

@ -4,9 +4,7 @@
<building name="illusioncastle" capacity="0" maxcapacity="0" maxsize="0" nobuild="yes"/>
<building name="xmas_exit" maxsize="10" maxcapacity="2" nobuild="yes" nodestroy="yes" unique="yes"/>
<building name="caldera" capacity="1" nodestroy="yes" nobuild="yes"/>
<building name="genericbuilding" namechange="no" maxsize="1" nobuild="yes"/>
<building name="artacademy" maxsize="100" nobuild="yes" nodestroy="yes" unique="yes"/>
<building name="artsculpture" namechange="no" maxsize="100" nobuild="yes" nodestroy="yes" unique="yes"/>
<building name="building" namechange="no" maxsize="1" nobuild="yes"/>
<building name="blessedstonecircle" maxcapacity="3" maxsize="100" nobuild="yes" magic="yes" magres="60" magresbonus="30" auraregen="1.50">
<construction skill="building" minskill="2" reqsize="100" maxsize="100">

View File

@ -6,6 +6,10 @@
_x: preposition (15 /Schlumpf/schwerter)
_a: including article (ein Schlumpf, a smurf)
-->
<string name="mailcmd">
<text locale="de">BEFEHLE</text>
<text locale="en">ORDERS</text>
</string>
<string name="vortex">
<text locale="de">Wirbel</text>
<text locale="en">vortex</text>
@ -908,17 +912,9 @@
<string name="illusioncastle">
<text locale="de">Traumschlößchen</text>
</string>
<string name="genericbuilding">
<string name="building">
<text locale="de">Struktur</text>
</string>
<string name="artacademy">
<text locale="de">Akademie der Künste</text>
<text locale="en">academy of arts</text>
</string>
<string name="artsculpture">
<text locale="de">Skulptur</text>
<text locale="en">sculpture</text>
</string>
<!--Testitem -->
<string name="wand">
@ -2375,19 +2371,19 @@
<text locale="en">ghoul</text>
</string>
<string name="juju-zombie">
<string name="juju">
<text locale="de">Juju-Zombie</text>
<text locale="en">juju-zombie</text>
</string>
<string name="juju-zombie_p">
<string name="juju_p">
<text locale="de">Juju-Zombies</text>
<text locale="en">juju-zombies</text>
</string>
<string name="juju-zombie_d">
<string name="juju_d">
<text locale="de">Juju-Zombies</text>
<text locale="en">juju-zombies</text>
</string>
<string name="juju-zombie_x">
<string name="juju_x">
<text locale="de">Juju-Zombie</text>
<text locale="en">juju-zombie</text>
</string>
@ -3815,10 +3811,6 @@
<text locale="de">Meteorregen</text>
<text locale="en">Meteor Shower</text>
</string>
<string name="shadowcall">
<text locale="de">Schattenruf</text>
<text locale="en">Shadow Call</text>
</string>
<string name="create_ror">
<text locale="de">Erschaffe einen Ring der Regeneration</text>
<text locale="en">Create A Ring of Regeneration</text>
@ -4499,10 +4491,6 @@
<text locale="de">Verletzt alle Gegner.</text>
<text locale="en">Injures all enemies.</text>
</string>
<string name="shadowcall">
<text locale="de">Ruft Schattenwesen.</text>
<text locale="en">Calls beings from shadow.</text>
</string>
<string name="aura_of_fear">
<text locale="de">Panik.</text>
<text locale="en">Panic.</text>
@ -6623,53 +6611,17 @@
<text locale="de">EINLADEN</text>
<text locale="en">INVITE</text>
</string>
<string name="rm_stone">
<text locale="de">Steine</text>
<text locale="en">stones</text>
</string>
<string name="rm_horse">
<text locale="de">Pferde</text>
<text locale="en">horses</text>
</string>
<string name="rm_peasant">
<text locale="de">Bauern</text>
<text locale="en">peasants</text>
</string>
<string name="rm_money">
<text locale="de">Silber</text>
<text locale="en">silver</text>
</string>
<string name="rm_laen">
<text locale="de">Laen</text>
<text locale="en">laen</text>
</string>
<string name="rm_sapling">
<string name="sapling">
<text locale="de">Schößlinge</text>
<text locale="en">saplings</text>
</string>
<string name="rm_mallornsapling">
<string name="mallornsapling">
<text locale="de">Mallornschößlinge</text>
<text locale="en">mallorn saplings</text>
</string>
<string name="rm_tree">
<text locale="de">Bäume</text>
<text locale="en">trees</text>
</string>
<string name="rm_mallorn">
<text locale="de">Mallorn</text>
<text locale="en">mallorn</text>
</string>
<string name="rm_iron">
<text locale="de">Eisen</text>
<text locale="en">iron</text>
</string>
<string name="Winter">
<text locale="de">Winter</text>
<text locale="en">winter</text>

View File

@ -310,7 +310,7 @@
<string name="dam">
<text locale="en">dam</text>
</string>
<string name="genericbuilding">
<string name="building">
<text locale="en">structure</text>
</string>
<string name="harbour">

View File

@ -324,7 +324,7 @@
<string name="dam">
<text locale="fr">barrage</text>
</string>
<string name="genericbuilding">
<string name="building">
<text locale="fr">bâtiment</text>
</string>
<string name="harbour">
@ -1912,10 +1912,10 @@
<string name="zombie">
<text locale="fr">zombie</text>
</string>
<string name="juju-zombie_p">
<string name="juju_p">
<text locale="fr">zombies juju</text>
</string>
<string name="juju-zombie">
<string name="juju">
<text locale="fr">zombie juju</text>
</string>
<string name="ghoul_p">

View File

@ -1,5 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<messages>
<message name="newbie_info_game" section="events">
<type>
<arg name="subject" type="string"/>
<arg name="email" type="string"/>
</type>
<text locale="de">Bitte denke daran, deine Befehle mit dem Betreff
$subject an $email zu senden.</text>
<text locale="en">Remember to send your orders to
$email with the subject ${subject}.</text>
</message>
<message name="parse_error" section="errors">
<type>
<arg name="unit" type="unit"/>
@ -1804,7 +1814,7 @@
<text locale="de">"$unit($unit) in $region($region): '$order($command)' - Der Magier erschafft ein Traumgebäude."</text>
<text locale="en">"$unit($unit) in $region($region): '$order($command)' - The magician creates an illusionary building."</text>
</message>
<message name="sp_shapeshift_fail" section="magic">
<message name="sp_shapeshift_fail" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
@ -1900,10 +1910,9 @@
<message name="use_antimagiccrystal" section="magic">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
</type>
<text locale="de">"$unit($unit) benutzt in $region($region) einen Antimagiekristall."</text>
<text locale="en">"$unit($unit) uses an antimagic crystal in $region($region)."</text>
<text locale="de">"$unit($unit) benutzt einen Antimagiekristall."</text>
<text locale="en">"$unit($unit) uses an antimagic crystal."</text>
</message>
<message name="magicboost_effect" section="magic">
<type>
@ -2402,7 +2411,7 @@
<text locale="de">"Eine Botschaft von $unit.dative($unit) in $region($region): 'Ups! Quack, Quack!'"</text>
<text locale="en">"A message from $unit($unit) in $region($region): 'Oops! Croak, Croak!'"</text>
</message>
<message name="familiar_farcast" section="magic">
<message name="familiar_farcast" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
@ -2412,7 +2421,7 @@
<text locale="de">"$unit($unit) in $region($region): '$order($command)' - $unit($mage) kann Zauber, die durch $unit($unit) gewirkt werden, nicht zusätzlich in die Ferne richten."</text>
<text locale="en">"$unit($unit) in $region($region): '$order($command)' - $unit($mage) cannot direct spells that are channeled through $unit($unit) into distant regions."</text>
</message>
<message name="familiar_toofar" section="magic">
<message name="familiar_toofar" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
@ -2552,13 +2561,6 @@
<text locale="de">"$unit($unit) in $region($region) regeneriert $int($amount) Aura."</text>
<text locale="en">"$unit($unit) regenerates $int($amount) aura in $region($region)."</text>
</message>
<message name="msg_magic" section="magic">
<type>
<arg name="string" type="string"/>
</type>
<text locale="de">"$string"</text>
<text locale="en">"$string"</text>
</message>
<message name="studycost" section="study">
<type>
<arg name="unit" type="unit"/>
@ -2596,13 +2598,6 @@
<text locale="de">"$unit($teacher) lehrt $unit($student) $skill($skill)."</text>
<text locale="en">"$unit($teacher) teaches $unit($student) $skill($skill)."</text>
</message>
<message name="msg_study" section="study">
<type>
<arg name="string" type="string"/>
</type>
<text locale="de">"$string"</text>
<text locale="en">"$string"</text>
</message>
<message name="sellamount" section="economy">
<type>
<arg name="unit" type="unit"/>
@ -2834,13 +2829,6 @@
<text locale="de">"$unit($unit) baut für $int($size) an $ship($ship) weiter."</text>
<text locale="en">"$unit($unit) builds $int($size) more on $ship($ship)."</text>
</message>
<message name="msg_production" section="production">
<type>
<arg name="string" type="string"/>
</type>
<text locale="de">"$string"</text>
<text locale="en">"$string"</text>
</message>
<message name="firewall_death" section="movement">
<type>
<arg name="unit" type="unit"/>
@ -2878,15 +2866,7 @@
<text locale="de">"$unit($unit) $if($eq($mode,1),"reitet", "wandert") von $region($start) nach $region($end).$if($isnull($regions),""," Dabei wurde $trail($regions) durchquert.")"</text>
<text locale="en">"$unit($unit) $if($eq($mode,1),"rides", "walks") from $region($start) to $region($end)$if($isnull($regions),""," by way of $trail($regions)")."</text>
</message>
<message name="detectoceandir" section="movement">
<type>
<arg name="unit" type="unit"/>
<arg name="direction" type="direction"/>
</type>
<text locale="de">"$unit($unit) entdeckt dass im $direction($direction) $terrain($region) ist."</text>
<text locale="en">"$unit($unit) discovered that $terrain($region) lies in the $direction($direction)."</text>
</message>
<message name="detectocean" section="movement">
<message name="detectocean" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
@ -2895,7 +2875,7 @@
<text locale="de">"$unit($unit) entdeckt, dass $region($region) $localize($terrain) ist."</text>
<text locale="en">"$unit($unit) discovered that $region($region) is $localize($terrain)."</text>
</message>
<message name="leftship" section="movement">
<message name="leftship" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
@ -2903,7 +2883,7 @@
<text locale="de">"$unit($unit) ist in dieser Runde gelandet und kann nicht weiter ins Landesinnere nach $region($region) vorstossen."</text>
<text locale="en">"$unit($unit) has just landed and cannot continue moving to $region($region)."</text>
</message>
<message name="sailnolandingstorm" section="movement">
<message name="sailnolandingstorm" section="errors">
<type>
<arg name="ship" type="ship"/>
<arg name="region" type="region"/>
@ -2911,7 +2891,7 @@
<text locale="de">"Die Mannschaft der $ship($ship) kann in letzter Sekunde verhindern, dass das Schiff in $region($region) auf Land aufläuft."</text>
<text locale="en">"At the very last moment, the crew of the $ship($ship) saved the ship from running aground in $region($region)."</text>
</message>
<message name="sailnolanding" section="movement">
<message name="sailnolanding" section="errors">
<type>
<arg name="ship" type="ship"/>
<arg name="region" type="region"/>
@ -2919,7 +2899,7 @@
<text locale="de">"Die $ship($ship) konnte in $region($region) nicht einreisen, die Küste ist zu gefährlich für das Schiff."</text>
<text locale="en">"The $ship($ship) could not berth in $region($region). The coast is too dangerous for the vessel."</text>
</message>
<message name="sailforbiddendir" section="movement">
<message name="sailforbiddendir" section="errors">
<type>
<arg name="ship" type="ship"/>
<arg name="direction" type="direction"/>
@ -2927,7 +2907,7 @@
<text locale="de">"Die Mannschaft der $ship($ship) weigert sich, nach $direction($direction) zu reisen."</text>
<text locale="en">"The crew of the $ship($ship) refuses to travel to the $direction($direction)."</text>
</message>
<message name="sailforbidden" section="movement">
<message name="sailforbidden" section="errors">
<type>
<arg name="ship" type="ship"/>
<arg name="region" type="region"/>
@ -2935,7 +2915,7 @@
<text locale="de">"Die Mannschaft der $ship($ship) weigert sich, nach $region($region) zu reisen."</text>
<text locale="en">"The crew of the $ship($ship) refuses to travel to $region($region)."</text>
</message>
<message name="detectforbiddendir" section="movement">
<message name="detectforbiddendir" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="direction" type="direction"/>
@ -2943,7 +2923,7 @@
<text locale="de">"$unit($unit) weigert sich, nach $direction($direction) zu reisen."</text>
<text locale="en">"$unit($unit) refuses to travel to the $direction($direction)."</text>
</message>
<message name="detectforbidden" section="movement">
<message name="detectforbidden" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
@ -2951,7 +2931,7 @@
<text locale="de">"$unit($unit) weigert sich, nach $region($region) zu reisen."</text>
<text locale="en">"$unit($unit) refuses to travel to $region($region)."</text>
</message>
<message name="sailfail" section="movement">
<message name="sailfail" section="errors">
<type>
<arg name="ship" type="ship"/>
<arg name="region" type="region"/>
@ -2959,7 +2939,7 @@
<text locale="de">"Die $ship($ship) konnte $region($region) nicht verlassen."</text>
<text locale="en">"The $ship($ship) could not leave $region($region)."</text>
</message>
<message name="moveblockedbyguard" section="movement">
<message name="moveblockedbyguard" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
@ -2968,35 +2948,7 @@
<text locale="de">"$unit($unit) wurde in $region($region) von $unit.dative($guard) aufgehalten."</text>
<text locale="en">"$unit($unit) was kept in $region($region) by $unit($guard)."</text>
</message>
<message name="peace_confirm" section="events">
<type>
<arg name="enemy" type="faction"/>
</type>
<text locale="de">"Wir haben den Krieg mit $faction($faction) beendet."</text>
<text locale="en">"We declared peace with $faction($faction)."</text>
</message>
<message name="peace_notify" section="events">
<type>
<arg name="enemy" type="faction"/>
</type>
<text locale="de">"$faction($faction) hat den Krieg mit uns beendet."</text>
<text locale="en">"$faction($faction) has declared peace with us."</text>
</message>
<message name="war_confirm" section="events">
<type>
<arg name="enemy" type="faction"/>
</type>
<text locale="de">"Wir haben $faction($faction) den Krieg erklärt."</text>
<text locale="en">"We declared war on $faction($faction)."</text>
</message>
<message name="war_notify" section="events">
<type>
<arg name="enemy" type="faction"/>
</type>
<text locale="de">"$faction($faction) hat uns den Krieg erklärt."</text>
<text locale="en">"$faction($faction) has declared war on us."</text>
</message>
<message name="regionowned" section="movement">
<message name="regionowned" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
@ -3005,7 +2957,7 @@
<text locale="de">"$unit($unit) konnte nicht von $region($region) nach $region($target) reisen, da der Besitzer der Region es verhinderte."</text>
<text locale="en">"$unit($unit) could not travel from $region($region) to $region($target) because the owner denied entrance."</text>
</message>
<message name="leavefail" section="movement">
<message name="leavefail" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
@ -3029,7 +2981,7 @@
<text locale="de">"$unit($follower) konnte $unit($unit) nicht folgen."</text>
<text locale="en">"$unit($follower) could not follow $unit($unit)."</text>
</message>
<message name="moveblocked" section="movement">
<message name="moveblocked" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="direction" type="direction"/>
@ -3037,7 +2989,7 @@
<text locale="de">"$unit($unit) entdeckt, dass es keinen Weg nach $direction($direction) gibt."</text>
<text locale="en">"$unit($unit) discovers that there is no route going $direction($direction)."</text>
</message>
<message name="fogblock" section="movement">
<message name="fogblock" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
@ -3046,13 +2998,6 @@
<text locale="de">"$unit($unit) konnte von $region($region) nicht nach $direction($direction) ausreisen, der Nebel war zu dicht."</text>
<text locale="en">"$unit($unit) could not travel $direction($direction) from $region($region), the fog was too dense."</text>
</message>
<message name="msg_movement" section="movement">
<type>
<arg name="string" type="string"/>
</type>
<text locale="de">"$string"</text>
<text locale="en">"$string"</text>
</message>
<message name="entrise" section="events">
<type>
<arg name="region" type="region"/>
@ -3321,20 +3266,6 @@
<text locale="de">"$unit($unit) marschiert in eine Antimagiezone und löst sich auf."</text>
<text locale="en">"$unit($unit) walks into an antimagical zone and dissolves."</text>
</message>
<message name="illusiondissolve" section="events">
<type>
<arg name="unit" type="unit"/>
</type>
<text locale="de">"$unit($unit) hat sich unbemerkt verflüchtigt."</text>
<text locale="en">"$unit($unit) has dissolved without a trace."</text>
</message>
<message name="warnillusiondissolve" section="events">
<type>
<arg name="unit" type="unit"/>
</type>
<text locale="de">"$unit($unit) wird sich bald verflüchtigen."</text>
<text locale="en">"$unit($unit) will dissolve soon."</text>
</message>
<message name="fleescared" section="events">
<type>
<arg name="amount" type="int"/>
@ -3370,11 +3301,10 @@
</message>
<message name="wrongpasswd" section="events">
<type>
<arg name="faction" type="int"/>
<arg name="password" type="string"/>
</type>
<text locale="de">"ERESSEA $int36($faction) \"${password}\" - Deine Befehle hatten ein falsches Passwort."</text>
<text locale="en">"ERESSEA $int36($faction) \"${password}\" - Your orders had the wrong password."</text>
<text locale="de">"Deine Befehle hatten ein falsches Passwort (${password})."</text>
<text locale="en">"Your orders had the wrong password (${password})."</text>
</message>
<message name="changepasswd" section="events">
<type>
@ -6945,13 +6875,6 @@
<text locale="de">"$unit($unit) in $region($region): '$order($command)' - Man benötigt mindestens $int($minskill) $skill($skill), um $resource($product,0) zu produzieren."</text>
<text locale="en">"$unit($unit) in $region($region): '$order($command)' - You need at least $int($minskill) $skill($skill), to produce $resource($product,0)."</text>
</message>
<message name="msg_errors" section="errors">
<type>
<arg name="string" type="string"/>
</type>
<text locale="de">"$string"</text>
<text locale="en">"$string"</text>
</message>
<message name="msg_event" section="events">
<type>
<arg name="string" type="string"/>
@ -6959,13 +6882,6 @@
<text locale="de">"$string"</text>
<text locale="en">"$string"</text>
</message>
<message name="msg_economy" section="economy">
<type>
<arg name="string" type="string"/>
</type>
<text locale="de">"$string"</text>
<text locale="en">"$string"</text>
</message>
<message name="give_person" section="economy">
<type>
<arg name="unit" type="unit"/>
@ -6997,7 +6913,6 @@
<text locale="de">"$unit($target) erhält $int($amount) $resource($resource,$amount) von $unit($unit)."</text>
<text locale="en">"$unit($target) receives $int($amount) $resource($resource,$amount) from $unit($unit)."</text>
</message>
<message name="give_person_ocean" section="economy">
<type>
<arg name="unit" type="unit"/>
@ -7200,7 +7115,7 @@
<text locale="en">"$unit($unit) in $region($region): '$order($command)' - No pyramids may be build in this region. The closest region to build a pyramid in is between $int($mindist) and $int($maxdist) regions away."</text>
</message>
<message name="wormhole_requirements" section="events">
<message name="wormhole_requirements" section="errors">
<type>
<arg name="unit" type="unit"/>
<arg name="region" type="region"/>
@ -7592,16 +7507,6 @@
<text locale="en">"$unit($mage) casts $spell($spell). $int($amount) fighters are temporarily losing some of their memories."</text>
</message>
<message name="sp_shadowcall_effect" section="magic">
<type>
<arg name="mage" type="unit"/>
<arg name="amount" type="int"/>
<arg name="race" type="race"/>
</type>
<text locale="de">"$unit($mage) ruft $int($amount) $race($race, 0) zu Hilfe."</text>
<text locale="en">"$unit($mage) calls upon the help of $int($amount) $race($race, 0)."</text>
</message>
<message name="battle::killed" section="battle">
<type>
<arg name="unit" type="unit"/>
@ -7621,7 +7526,7 @@
<text locale="de">"Heer $int($index)($abbrev): $int($dead) Tote, $int($fled) Geflohene, $int($survived) Überlebende."</text>
<text locale="en">"Army $int($index)($abbrev): $int($dead) dead, $int($fled) fled, $int($survived) survivors."</text>
</message>
<message name="spellfail::nolevel" section="magic">
<message name="spellfail::nolevel" section="errors">
<type>
<arg name="mage" type="unit"/>
<arg name="region" type="region"/>

View File

@ -1,5 +1,5 @@
<?xml version="1.0"?>
<resource name="horse" limited="yes" material="rm_horse">
<resource name="horse" limited="yes">
<item big="yes" weight="5000" score="10" capacity="7000" animal="yes">
<construction skill="training" minskill="1"/>
<function name="give" value="givehorses"/>

View File

@ -1,5 +1,5 @@
<?xml version="1.0"?>
<resource name="iron" limited="yes" material="rm_iron">
<resource name="iron" limited="yes" material="yes">
<item weight="500" score="10">
<construction skill="mining" minskill="1"/>
</item>

View File

@ -1,5 +1,5 @@
<?xml version="1.0"?>
<resource name="laen" limited="yes" material="rm_laen">
<resource name="laen" limited="yes" material="yes">
<item weight="200" score="100">
<construction skill="mining" minskill="7"/>
</item>

View File

@ -1,5 +1,5 @@
<?xml version="1.0"?>
<resource name="log" material="rm_tree">
<resource name="log">
<item weight="500" score="10">
<construction skill="forestry" minskill="1"/>
</item>

View File

@ -1,12 +1,11 @@
<?xml version="1.0"?>
<resource name="mallorn" material="rm_mallorn">
<resource name="mallorn">
<item weight="500" score="30">
<construction skill="forestry" minskill="2"/>
</item>
<resourcelimit>
<modifier building="sawmill" type="skill" value="1"/>
<modifier building="sawmill" type="material" value="0.5"/>
<guard flag="logging"/>
<function name="produce" value="lua_produceresource"/>
<function name="limit" value="lua_limitresource"/>
</resourcelimit>

View File

@ -3,4 +3,8 @@
<item weight="10" score="100">
<construction skill="herbalism" minskill="4"/>
</item>
<resourcelimit>
<function name="produce" value="lua_produceresource"/>
<function name="limit" value="lua_limitresource"/>
</resourcelimit>
</resource>

View File

@ -3,4 +3,8 @@
<item weight="10" score="50">
<construction skill="herbalism" minskill="3"/>
</item>
<resourcelimit>
<function name="produce" value="lua_produceresource"/>
<function name="limit" value="lua_limitresource"/>
</resourcelimit>
</resource>

View File

@ -1,5 +1,5 @@
<?xml version="1.0"?>
<resource name="stone" limited="yes" material="rm_stone">
<resource name="stone" limited="yes" material="yes">
<item weight="6000" score="10" big="yes">
<construction skill="quarrying" minskill="1"/>
</item>

View File

@ -3,17 +3,16 @@
<xi:include href="config://default/buildings/castle-2.xml" />
<building name="watch" capacity="1" fort="yes">
<building name="watch" maxsize="10" capacity="1" fort="yes">
<function name="name" value="fort_name"/>
<function name="protection" value="building_protection"/>
<function name="taxes" value="lua_building_taxes"/>
<construction skill="building" minskill="1" maxsize="5" defense_bonus="0">
<construction skill="building" minskill="1" maxsize="5">
<requirement type="log" quantity="1"/>
</construction>
<construction skill="building" minskill="2" maxsize="5" defense_bonus="1">
<construction skill="building" minskill="2" maxsize="5">
<requirement type="log" quantity="1"/>
</construction>
<construction skill="building" minskill="2" defense_bonus="2">
<construction skill="building" minskill="2">
<requirement type="log" quantity="1"/>
</construction>
</building>

View File

@ -1,78 +1,9 @@
<?xml version="1.0"?>
<equipment>
<!-- equipment given to new units -->
<set name="new_demon_unit">
<!--skill name="stamina" level="6"/-->
</set>
<set name="new_troll_unit">
<!--skill name="stamina" level="2"/-->
</set>
<set name="seaserpent_spoils">
<item name="dragonblood" amount="2"/>
<item name="seaserpenthead" amount="1"/>
</set>
<set name="goblin_1">
<skill name="melee" level="7"/>
<skill name="stamina" level="3"/>
<item name="sword" amount="1"/>
<item name="shield" amount="1"/>
<item name="chainmail" amount="1"/>
</set>
<set name="troll_1">
<skill name="melee" level="7"/>
<skill name="stamina" level="3"/>
<item name="sword" amount="1"/>
<item name="shield" amount="1"/>
<item name="plate" amount="1"/>
</set>
<set name="front_1">
<skill name="melee" level="7"/>
<skill name="stamina" level="3"/>
<item name="sword" amount="1"/>
<item name="shield" amount="1"/>
<item name="plate" amount="1"/>
</set>
<set name="front_2">
<skill name="melee" level="7"/>
<skill name="stamina" level="3"/>
<item name="sword" amount="1"/>
<item name="towershield" amount="1"/>
<item name="plate" amount="1"/>
</set>
<set name="rear_1">
<skill name="crossbow" level="7"/>
<skill name="stamina" level="3"/>
<item name="crossbow" amount="1"/>
<item name="shield" amount="1"/>
</set>
<set name="rear_2">
<skill name="crossbow" level="7"/>
<skill name="stamina" level="3"/>
<item name="crossbow" amount="1"/>
<item name="shield" amount="1"/>
</set>
<set name="dwarf_2">
<skill name="melee" level="7"/>
<skill name="stamina" level="3"/>
<item name="sword" amount="1"/>
<item name="shield" amount="1"/>
<item name="plate" amount="1"/>
</set>
<set name="halfling_2">
<skill name="crossbow" level="7"/>
<skill name="stamina" level="3"/>
<item name="rep_crossbow" amount="1"/>
</set>
</equipment>

View File

@ -8,9 +8,8 @@
<xi:include href="config://default/races/dragon.xml"/>
<xi:include href="config://default/races/youngdragon.xml"/>
<race name="lynx" magres="0.000000" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.0" 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.0" hp="20" damage="2d3" unarmedattack="0" unarmeddefense="0" attackmodifier="4" defensemodifier="5" walk="yes" teach="no" getitem="yes">
<ai splitsize="99999"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -32,11 +31,9 @@
<attack type="4" damage="2d3"/>
</race>
<race name="human" magres="0.000000" maxaura="1.0" regaura="1.0" recruitcost="100" maintenance="10" weight="1000" capacity="540" speed="1.0" 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.0" regaura="1.0" recruitcost="100" maintenance="10" weight="1000" capacity="540" speed="1.0" hp="20" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<param name="other_race" value="elf"/>
<param name="other_cost" value="500"/>
<skill name="riding" modifier="+1"/>
<skill name="shipcraft" modifier="2"/>
<skill name="sailing" modifier="2"/>
@ -47,11 +44,9 @@
<familiar race="giantturtle"/>
</race>
<race name="orc" studyspeed="-5" magres="-0.05" maxaura="1.0" regaura="1.0" recruitcost="100" maintenance="10" weight="1000" capacity="540" speed="1.0" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="orc" studyspeed="-5" magres="-5" maxaura="1.0" regaura="1.0" recruitcost="100" maintenance="10" weight="1000" capacity="540" speed="1.0" hp="20" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<param name="other_race" value="troll"/>
<param name="other_cost" value="500"/>
<skill name="bow" speed="+5"/>
<skill name="building" modifier="1"/>
@ -76,11 +71,9 @@
<familiar race="ghost"/>
</race>
<race name="halfling" defensemodifier="1" magres="0.05" maxaura="1.0" regaura="1.0" recruitcost="100" maintenance="10" weight="1000" capacity="540" speed="1.0" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="halfling" defensemodifier="1" magres="5" maxaura="1.0" regaura="1.0" recruitcost="100" maintenance="10" weight="1000" capacity="540" speed="1.0" hp="20" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<param name="other_race" value="dwarf"/>
<param name="other_cost" value="500"/>
<param name="luxury_trade" value="600"/>
<skill name="bow" modifier="-1"/>
<skill name="building" modifier="1"/>
@ -104,9 +97,8 @@
<!-- begin secondary races -->
<race name="demon" magres="0.150000" maxaura="1.0" regaura="1.1" recruitcost="360" maintenance="10" weight="1000" capacity="540" speed="1.0" hp="30" ac="2" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" shapeshift="yes" giveperson="yes" giveunit="yes" getitem="yes" recruitethereal="yes" equipment="yes">
<race name="demon" magres="15" maxaura="1.0" regaura="1.1" recruitcost="360" maintenance="10" weight="1000" capacity="540" speed="1.0" hp="30" ac="2" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" shapeshift="yes" giveperson="yes" giveunit="yes" getitem="yes" recruitethereal="yes" equipment="yes">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="cartmaking" modifier="-2"/>
<skill name="forestry" modifier="1"/>
<skill name="melee" modifier="1"/>
@ -124,10 +116,8 @@
<familiar race="ghost"/>
</race>
<race name="elf" magres="0.100000" maxaura="1.0" regaura="1.1" recruitcost="200" maintenance="10" weight="1000" capacity="540" speed="1.0" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="elf" magres="10" maxaura="1.0" regaura="1.1" recruitcost="200" maintenance="10" weight="1000" capacity="540" speed="1.0" hp="20" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<param name="regen.forest" value="2.0"/>
<skill name="armorer" modifier="-1"/>
<skill name="bow" modifier="2"/>
<skill name="building" modifier="-1"/>
@ -144,9 +134,8 @@
<familiar race="unicorn"/>
</race>
<race name="troll" magres="0.100000" maxaura="1.0" regaura="1.0" recruitcost="260" maintenance="10" weight="2000" capacity="1080" speed="1.0" hp="20" ac="1" damage="1d5+3" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="troll" magres="10" maxaura="1.0" regaura="1.0" recruitcost="260" maintenance="10" weight="2000" capacity="1080" speed="1.0" hp="20" ac="1" damage="1d5+3" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<param name="armor.stamina" value="4"/> <!-- +1 natural armor per X levels stamina -->
<skill name="armorer" modifier="2"/>
<skill name="bow" modifier="-2"/>
@ -167,9 +156,8 @@
<familiar race="rat"/>
</race>
<race name="dwarf" magres="0.05" maxaura="1.0" regaura="0.9" recruitcost="240" maintenance="10" weight="1000" capacity="540" speed="1.0" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="dwarf" magres="5" maxaura="1.0" regaura="0.9" recruitcost="240" maintenance="10" weight="1000" capacity="540" speed="1.0" hp="20" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="armorer" modifier="2"/>
<skill name="bow" modifier="-1"/>
<skill name="building" modifier="2"/>
@ -192,9 +180,8 @@
<!-- end player races -->
<race name="kraken" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -219,9 +206,8 @@
<attack type="4" damage="1d10"/>
<attack type="4" damage="1d10"/>
</race>
<race name="giantturtle" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -241,9 +227,8 @@
<skill name="cartmaking" modifier="-99"/>
<attack type="4" damage="2d50"/>
</race>
<race name="dolphin" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -263,9 +248,8 @@
<skill name="cartmaking" modifier="-99"/>
<attack type="4" damage="1d6"/>
</race>
<race name="tiger" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -287,9 +271,8 @@
<attack type="4" damage="1d6"/>
<attack type="4" damage="1d6"/>
</race>
<race name="hellcat" magres="0.500000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -311,9 +294,8 @@
<attack type="4" damage="1d6"/>
<attack type="4" damage="1d6"/>
</race>
<race name="owl" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -334,9 +316,8 @@
<skill name="cartmaking" modifier="-99"/>
<attack type="4" damage="1d4"/>
</race>
<race name="fairy" magres="0.800000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="magic" modifier="1"/>
<skill name="riding" modifier="-1"/>
<skill name="melee" modifier="-1"/>
@ -361,9 +342,8 @@
<attack type="4" damage="1d3"/>
<attack type="4" damage="1d3"/>
</race>
<race name="dreamcat" magres="0.500000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="magic" modifier="1"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
@ -384,9 +364,8 @@
<attack type="4" damage="1d5"/>
<attack type="4" damage="1d5"/>
</race>
<race name="imp" magres="0.500000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -409,9 +388,8 @@
<attack type="1" damage="1d4"/>
<attack type="6" spell="fiery_dragonbreath" level="3" />
</race>
<race name="ghost" magres="0.800000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -435,10 +413,8 @@
<attack type="2" damage="2d30"/>
<attack type="3" damage="1d1"/>
</race>
<race name="wolf" magres="0.000000" 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">
<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"/>
<function name="name" value="namegeneric"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -460,9 +436,8 @@
<attack type="4" damage="1d4"/>
<attack type="4" damage="1d4"/>
</race>
<race name="unicorn" magres="0.900000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -484,9 +459,8 @@
<attack type="4" damage="3d12"/>
<attack type="4" damage="2d4"/>
</race>
<race name="nymph" magres="0.900000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="2"/>
<skill name="building" modifier="-99"/>
@ -507,9 +481,8 @@
<attack type="1" damage="1d4"/>
<attack type="2" damage="2d20"/>
</race>
<race name="songdragon" magres="0.990000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -535,9 +508,8 @@
<attack type="6" spell="fiery_dragonbreath" level="3" />
</race>
<race name="rat" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -559,9 +531,8 @@
<attack type="4" damage="1d4"/>
<attack type="4" damage="1d4"/>
</race>
<race name="eagle" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="-99"/>
@ -582,9 +553,8 @@
<skill name="cartmaking" modifier="-99"/>
<attack type="4" damage="2d3"/>
</race>
<race name="tunnelworm" magres="0.800000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="10"/>
<skill name="bow" modifier="-99"/>
@ -607,24 +577,21 @@
<attack type="4" damage="3d20"/>
<attack type="8" damage="1d10"/>
</race>
<race name="direwolf" magres="0.000000" 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">
<function name="initfamiliar" value="oldfamiliars"/>
<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"/>
<attack type="4" damage="2d4"/>
</race>
<race name="peasant" magres="0.000000" 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">
<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"/>
<attack type="1" damage="1d6"/>
</race>
<race name="braineater" magres="0.900000" 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">
<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"/>
<function name="name" value="namegeneric"/>
<function name="describe" value="describe_race"/>
<attack type="2" damage="3d15"/>
<attack type="3" damage="1d1"/>
<attack type="4" damage="1d1"/>
</race>
<race name="toad" magres="0.200000" maxaura="1.0" regaura="1.0" maintenance="10" weight="100" capacity="540" speed="1.0" hp="10" damage="1d2" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" giveperson="yes" giveunit="yes" getitem="yes" walk="yes">
<race name="toad" magres="20" maxaura="1.0" regaura="1.0" maintenance="10" weight="100" capacity="540" speed="1.0" hp="10" damage="1d2" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" giveperson="yes" giveunit="yes" getitem="yes" walk="yes">
<ai splitsize="1" learn="yes"/>
<skill name="crossbow" modifier="-10"/>
<skill name="mining" modifier="-10"/>
@ -672,77 +639,62 @@
<skill name="stamina" modifier="-10"/>
<attack type="4" damage="1d2"/>
</race>
<race name="mountainguard" unarmedguard="yes" magres="0.500000" 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" 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" canlearn="no" teach="no" noweapons="yes">
<ai splitsize="1"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="2d40"/>
</race>
<race name="shadowmaster" cansail="no" cansteal="no" canlearn="no" magres="0.750000" 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">
<race name="shadowmaster" cansail="no" cansteal="no" canlearn="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"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="2d4"/>
<attack type="2" damage="2d30"/>
<attack type="3" damage="1d2"/>
</race>
<race name="shadowdemon" cansail="no" cansteal="no" canlearn="no" magres="0.750000" 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">
<race name="shadowdemon" cansail="no" cansteal="no" canlearn="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"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="2d3"/>
<attack type="3" damage="1d1"/>
</race>
<race name="stonegolem" stonegolem="true" magres="0.250000" 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" 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" canlearn="no" teach="no">
<ai splitsize="50"/>
<skill name="building" modifier="14"/>
<skill name="roadwork" modifier="14"/>
<attack type="4" damage="2d10+4"/>
</race>
<race name="irongolem" irongolem="true" magres="0.250000" 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" 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" canlearn="no" teach="no">
<ai splitsize="50"/>
<function name="name" value="namegeneric"/>
<skill name="armorer" modifier="14"/>
<skill name="weaponsmithing" modifier="14"/>
<attack type="4" damage="2d8+4"/>
</race>
<race name="spell" magres="0.000000" maxaura="1.0" 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.0" 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">
<ai splitsize="1"/>
<attack type="1" damage="1d4"/>
</race>
<race name="special" magres="0.000000" maxaura="0.000000" regaura="0.000000" weight="0" capacity="0" speed="0.000000" hp="1" damage="1d4" unarmedattack="-2" unarmeddefense="-2">
<race name="special" maxaura="0.000000" regaura="0.000000" weight="0" capacity="0" speed="0.000000" hp="1" damage="1d4" unarmedattack="-2" unarmeddefense="-2">
<ai splitsize="1"/>
<attack type="1" damage="1d4"/>
</race>
<race name="dracoid" magres="0.000000" 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">
<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"/>
<function name="name" value="namedracoid"/>
<attack type="4" damage="1d6"/>
<attack type="4" damage="1d6"/>
<attack type="1" damage="1d5"/>
</race>
<race name="ent" magres="0.250000" 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">
<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"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="2d12"/>
<attack type="4" damage="2d12"/>
</race>
<race name="illusion" magres="0.000000" maxaura="0.000000" regaura="0.000000" weight="0" capacity="0" speed="1.0" hp="1" damage="1d1" unarmedattack="0" unarmeddefense="0" walk="yes" canlearn="no" teach="no" noweapons="yes" illusionary="yes">
<ai splitsize="999999"/>
<function name="age" value="ageillusion"/>
<skill name="unarmed" modifier="-99"/>
<attack type="1" damage="1d1"/>
</race>
<race name="undead" magres="0.000000" maxaura="1.0" regaura="1.0" weight="1000" capacity="540" speed="1.0" 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">
<race name="undead" maxaura="1.0" regaura="1.0" weight="1000" capacity="540" speed="1.0" 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">
<ai splitsize="20000" moverandom="yes"/>
<function name="name" value="nameundead"/>
<function name="age" value="ageundead"/>
<attack type="4" damage="1d7"/>
<attack type="5"/>
</race>
<race name="clone" magres="0.900000" 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" 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" canlearn="no" teach="no" noheal="yes">
<ai splitsize="10000"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
@ -768,9 +720,8 @@
<attack type="1" damage="0d0"/>
</race>
<race name="ghast" magres="0.600000" 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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes">
<ai splitsize="2000" aggression="0.02" killpeasants="yes" moverandom="yes"/>
<function name="name" value="nameghoul"/>
<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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes">
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
<skill name="crossbow" modifier="1"/>
<skill name="bow" modifier="1"/>
<skill name="catapult" modifier="1"/>
@ -787,10 +738,8 @@
<attack type="2" damage="1d30"/>
</race>
<race name="ghoul" magres="0.300000" 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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes">
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
<function name="name" value="nameghoul"/>
<function name="age" value="ageghoul"/>
<skill name="crossbow" modifier="1"/>
<skill name="bow" modifier="1"/>
<skill name="catapult" modifier="1"/>
@ -806,9 +755,8 @@
<attack type="2" damage="1d30"/>
</race>
<race name="juju-zombie" magres="0.500000" 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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistbash="yes" resistcut="yes" resistpierce="yes">
<ai splitsize="2000" aggression="0.02" killpeasants="yes" moverandom="yes"/>
<function name="name" value="namezombie"/>
<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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistbash="yes" resistcut="yes" resistpierce="yes">
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
<skill name="crossbow" modifier="1"/>
<skill name="bow" modifier="1"/>
<skill name="catapult" modifier="1"/>
@ -823,10 +771,8 @@
<attack type="3" damage="1d1"/>
</race>
<race name="zombie" magres="0.200000" 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" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="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" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes">
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
<function name="name" value="namezombie"/>
<function name="age" value="agezombie"/>
<skill name="crossbow" modifier="1"/>
<skill name="bow" modifier="1"/>
<skill name="catapult" modifier="1"/>
@ -839,9 +785,8 @@
<attack type="1" damage="1d7"/>
</race>
<race name="skeletonlord" magres="0.300000" 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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes">
<ai splitsize="2000" aggression="0.02" killpeasants="yes" moverandom="yes"/>
<function name="name" value="nameskeleton"/>
<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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes">
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
<skill name="crossbow" modifier="1"/>
<skill name="bow" modifier="1"/>
<skill name="catapult" modifier="1"/>
@ -855,10 +800,8 @@
<attack type="1" damage="1d7"/>
</race>
<race name="skeleton" magres="0.100000" 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" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="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" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes">
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
<function name="name" value="nameskeleton"/>
<function name="age" value="ageskeleton"/>
<skill name="crossbow" modifier="1"/>
<skill name="bow" modifier="1"/>
<skill name="catapult" modifier="1"/>
@ -871,16 +814,13 @@
<attack type="1" damage="1d7"/>
</race>
<race name="shadowknight" magres="0.000000" maxaura="0.000000" regaura="0.000000" weight="1000" 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="1000" 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">
<ai splitsize="20000" moverandom="yes"/>
<function name="name" value="namegeneric"/>
<attack type="1" damage="1d1"/>
</race>
<race name="seaserpent" magres="0.500000" 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">
<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"/>
<function name="name" value="namegeneric"/>
<function name="move" value="moveswimming"/>
<skill name="tactics" modifier="4"/>
<attack type="4" damage="1d30"/>
<attack type="4" damage="1d30"/>
@ -889,35 +829,4 @@
<attack type="8" damage="1d10"/>
</race>
<!-- for the shadowcall spell -->
<race name="shadowbat" magres="0.800000" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.0" hp="1" ac="4" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="3" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes">
<ai splitsize="5000" killpeasants="yes"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="1d6"/>
<attack type="3" damage="1d1"/>
</race>
<!-- for the shadowcall spell -->
<race name="nightmare" magres="0.500000" maxaura="0.000000" regaura="0.000000" weight="100" capacity="540" speed="1.0" hp="80" ac="10" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="3" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" invinciblenonmagic="yes">
<ai splitsize="500" killpeasants="yes"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="1d4"/>
<attack type="4" damage="1d4"/>
<attack type="4" damage="1d4"/>
<attack type="3" damage="1d4"/>
<attack type="2" damage="1d10"/>
</race>
<!-- for the shadowcall spell -->
<race name="vampunicorn" magres="1.0" maxaura="0.000000" regaura="0.000000" weight="5000" capacity="2000" speed="1.0" hp="30" ac="4" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="3" scarepeasants="yes" walk="yes" teach="no" getitem="yes">
<ai splitsize="5000" killpeasants="yes"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="2d10"/>
<attack type="3" damage="1d4"/>
<attack type="3" damage="1d4"/>
<attack type="3" damage="1d4"/>
<attack type="3" damage="1d4"/>
<attack type="2" damage="2d60"/>
</race>
</races>

View File

@ -1,11 +1,10 @@
<?xml version="1.0"?>
<resource name="iron" limited="yes" material="rm_iron">
<resource name="iron" limited="yes" material="yes">
<item weight="500" score="10">
<construction skill="mining" minskill="1"/>
</item>
<resourcelimit>
<modifier building="mine" type="skill" value="1"/>
<modifier building="mine" type="material" value="0.5"/>
<guard flag="mining"/>
</resourcelimit>
</resource>

View File

@ -1,4 +1,4 @@
<?xml version="1.0"?>
<resource name="mallornseed" limited="yes">
<resource name="mallornseed">
<item weight="10" score="100"/>
</resource>

View File

@ -1,4 +1,4 @@
<?xml version="1.0"?>
<resource name="seed" limited="yes">
<resource name="seed">
<item weight="10" score="50"/>
</resource>

View File

@ -1,5 +1,5 @@
<?xml version="1.0"?>
<resource name="stone" limited="yes" material="rm_stone">
<resource name="stone" limited="yes" material="yes">
<item weight="6000" score="10" big="yes">
<construction skill="quarrying" minskill="1"/>
</item>

View File

@ -107,7 +107,6 @@
<entry spell="rustweapon" level="3" />
<entry spell="sacrifice_strength" level="15" />
<entry spell="seduction" level="6" />
<entry spell="shadowcall" level="12" />
<entry spell="shadowknights" level="1" />
<entry spell="shapeshift" level="3" />
<entry spell="shockwave" level="5" />

View File

@ -665,9 +665,6 @@
<spell name="aura_of_fear" rank="5" index="175" combat="2">
<resource name="aura" amount="12" cost="fixed"/>
</spell>
<spell name="shadowcall" rank="5" index="176" combat="1">
<resource name="aura" amount="24" cost="fixed"/>
</spell>
<spell name="immolation" rank="5" index="180" combat="2">
<resource name="aura" amount="24" cost="fixed"/>
</spell>

View File

@ -1,20 +1,6 @@
<?xml version="1.0"?>
<resources>
<resource name="instantartsculpture">
<function name="change" value="changeitem"/>
<item weight="0">
<function name="use" value="use_instantartsculpture"/>
</item>
</resource>
<resource name="instantartacademy">
<function name="change" value="changeitem"/>
<item weight="0">
<function name="use" value="use_instantartacademy"/>
</item>
</resource>
<resource name="aurapotion50">
<function name="change" value="changeitem"/>
<item weight="0">

View File

@ -4,4 +4,5 @@
<building name="temple" maxsize="50" maxcapacity="2" nobuild="yes" nodestroy="yes" unique="yes" auraregen="1.00" />
<building name="portal" maxsize="2" capacity="1" maxcapacity="2" nobuild="yes" nodestroy="yes" unique="yes" />
<building name="pavilion" maxsize="2" capacity="1" maxcapacity="2" nobuild="yes" nodestroy="yes" unique="yes" />
<building name="artacademy" maxsize="100" nobuild="yes" nodestroy="yes" unique="yes"/>
</buildings>

View File

@ -2,18 +2,18 @@
<equipment>
<!-- one equipment-set per player-race for the first unit in a faction -->
<set name="first_dwarf">
<set name="autoseed_dwarf">
<item name="axe" amount="1"/>
<item name="chainmail" amount="1"/>
<skill name="melee" level="1"/>
</set>
<set name="first_elf">
<set name="autoseed_elf">
<item name="fairyboot" amount="1"/>
<callback name="equip_newunits"/>
</set>
<set name="first_orc">
<set name="autoseed_orc">
<skill name="polearm" level="4"/>
<skill name="melee" level="4"/>
<skill name="crossbow" level="4"/>
@ -21,30 +21,30 @@
<skill name="bow" level="4"/>
</set>
<set name="first_goblin">
<set name="autoseed_goblin">
<item name="roi" amount="1"/>
<callback name="equip_newunits"/>
</set>
<set name="first_human">
<set name="autoseed_human">
<callback name="equip_newunits"/>
</set>
<set name="first_troll">
<set name="autoseed_troll">
<skill name="building" level="1"/>
<skill name="perception" level="3"/>
<item name="stone" amount="50"/>
</set>
<set name="first_demon">
<set name="autoseed_demon">
<skill name="stamina" level="15"/>
</set>
<set name="first_insect">
<set name="autoseed_insect">
<item name="nestwarmth" amount="9"/>
</set>
<set name="first_halfling">
<set name="autoseed_halfling">
<skill name="trade" level="1"/>
<skill name="riding" level="2"/>
<item name="horse" amount="2"/>
@ -58,12 +58,12 @@
<item name="incense" amount="5"/>
</set>
<set name="first_cat">
<set name="autoseed_cat">
<item name="roi" amount="1"/>
<callback name="equip_newunits"/>
</set>
<set name="first_aquarian">
<set name="autoseed_aquarian">
<skill name="sailing" level="1"/>
<callback name="equip_newunits"/>
</set>

View File

@ -63,19 +63,6 @@
</item>
</resource>
<!-- art rewards -->
<resource name="trappedairelemental">
<item weight="0">
<function name="use" value="use_trappedairelemental"/>
</item>
</resource>
<resource name="hornofdancing">
<item weight="0">
<function name="use" value="use_hornofdancing"/>
</item>
</resource>
<!-- museum items -->
<resource name="questkey1" appearance="key">
<!-- Key for an old quest. placeholder item -->

View File

@ -1,7 +1,7 @@
<?xml version="1.0" ?>
<races xmlns:xi="http://www.w3.org/2001/XInclude">
<race name="snowman" magres="0.800000" maxaura="0.000000"
<race name="snowman" magres="80" maxaura="0.000000"
regaura="0.000000" weight="500" capacity="200" equipment="no"
speed="1.000000" hp="1000" ac="4" damage="2d4" unarmedattack="10"
unarmeddefense="10" attackmodifier="8" defensemodifier="8"
@ -10,9 +10,8 @@
<attack type="3" damage="2d6+2"/>
</race>
<race name="human" magres="0.000000" 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">
<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">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<param name="migrants.formula" value="1"/>
<skill name="trade" modifier="1"/>
<skill name="herbalism" modifier="-1"/>
@ -27,9 +26,8 @@
<familiar race="eagle"/>
<familiar race="imp"/>
</race>
<race name="kraken" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="perception" modifier="1"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
@ -61,9 +59,8 @@
<attack type="4" damage="1d10"/>
<attack type="4" damage="1d10"/>
</race>
<race name="giantturtle" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="perception" modifier="1"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
@ -90,9 +87,8 @@
<skill name="taxation" modifier="-99"/>
<attack type="4" damage="2d50"/>
</race>
<race name="dolphin" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
@ -118,9 +114,8 @@
<skill name="taxation" modifier="-99"/>
<attack type="4" damage="1d6"/>
</race>
<race name="tiger" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
@ -148,9 +143,8 @@
<attack type="4" damage="1d6"/>
<attack type="4" damage="1d6"/>
</race>
<race name="hellcat" magres="0.500000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="perception" modifier="1"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
@ -178,9 +172,8 @@
<attack type="4" damage="1d6"/>
<attack type="4" damage="1d6"/>
</race>
<race name="owl" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="espionage" modifier="1"/>
<skill name="stealth" modifier="1"/>
<skill name="perception" modifier="5"/>
@ -209,9 +202,8 @@
<skill name="taxation" modifier="-99"/>
<attack type="4" damage="1d4"/>
</race>
<race name="fairy" magres="0.800000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="stealth" modifier="5"/>
<skill name="espionage" modifier="2"/>
<skill name="perception" modifier="2"/>
@ -244,9 +236,8 @@
<attack type="4" damage="1d3"/>
<attack type="4" damage="1d3"/>
</race>
<race name="dreamcat" magres="0.500000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="magic" modifier="1"/>
<skill name="espionage" modifier="1"/>
<skill name="stealth" modifier="1"/>
@ -275,9 +266,8 @@
<attack type="4" damage="1d5"/>
<attack type="4" damage="1d5"/>
</race>
<race name="imp" magres="0.500000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
@ -308,9 +298,8 @@
<attack type="1" damage="1d4"/>
<attack type="6" spell="fiery_dragonbreath" level="3" />
</race>
<race name="ghost" magres="0.800000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
@ -339,10 +328,8 @@
<attack type="2" damage="2d30"/>
<attack type="3" damage="1d1"/>
</race>
<race name="wolf" magres="0.000000" 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">
<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"/>
<function name="name" value="namegeneric"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
@ -370,9 +357,8 @@
<attack type="4" damage="1d4"/>
<attack type="4" damage="1d4"/>
</race>
<race name="unicorn" magres="0.900000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
@ -401,9 +387,8 @@
<attack type="4" damage="3d12"/>
<attack type="4" damage="2d4"/>
</race>
<race name="nymph" magres="0.900000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="mining" modifier="-99"/>
<skill name="bow" modifier="2"/>
<skill name="building" modifier="-99"/>
@ -431,9 +416,8 @@
<attack type="1" damage="1d4"/>
<attack type="2" damage="2d20"/>
</race>
<race name="songdragon" magres="0.990000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
@ -463,9 +447,8 @@
<attack type="4" damage="2d4"/>
<attack type="6" spell="fiery_dragonbreath" level="3" />
</race>
<race name="rat" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="espionage" modifier="5"/>
<skill name="stealth" modifier="4"/>
<skill name="perception" modifier="2"/>
@ -495,9 +478,8 @@
<attack type="4" damage="1d4"/>
<attack type="4" damage="1d4"/>
</race>
<race name="eagle" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
@ -525,9 +507,8 @@
<skill name="taxation" modifier="-99"/>
<attack type="4" damage="2d3"/>
</race>
<race name="tunnelworm" magres="0.800000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="10"/>
@ -558,9 +539,8 @@
<attack type="4" damage="3d20"/>
<attack type="8" damage="1d10"/>
</race>
<race name="lynx" magres="0.000000" 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">
<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"/>
<function name="initfamiliar" value="oldfamiliars"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
<skill name="mining" modifier="-99"/>
@ -589,25 +569,22 @@
<skill name="taxation" modifier="-99"/>
<attack type="4" damage="2d3"/>
</race>
<race name="direwolf" magres="0.000000" 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">
<function name="initfamiliar" value="oldfamiliars"/>
<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"/>
<attack type="4" damage="2d4"/>
</race>
<race name="peasant" magres="0.000000" 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">
<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"/>
<attack type="1" damage="1d6"/>
</race>
<race name="braineater" magres="0.900000" maxaura="1.000000"
<race name="braineater" magres="90" maxaura="1.000000"
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"/>
<function name="name" value="namegeneric"/>
<function name="describe" value="describe_race"/>
<attack type="2" damage="3d15"/>
<attack type="3" damage="1d1"/>
<attack type="4" damage="1d1"/>
</race>
<race name="toad" magres="0.200000" maxaura="1.000000" regaura="1.000000" maintenance="10" weight="100" capacity="540" speed="1.000000" hp="10" damage="1d2" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" giveperson="yes" giveunit="yes" getitem="yes" walk="yes">
<race name="toad" magres="20" maxaura="1.000000" regaura="1.000000" maintenance="10" weight="100" capacity="540" speed="1.000000" hp="10" damage="1d2" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" giveperson="yes" giveunit="yes" getitem="yes" walk="yes">
<ai splitsize="1" learn="yes"/>
<skill name="alchemy" modifier="-10"/>
<skill name="crossbow" modifier="-10"/>
@ -671,69 +648,61 @@
<skill name="stamina" modifier="-10"/>
<attack type="4" damage="1d2"/>
</race>
<race name="mountainguard" unarmedguard="yes" magres="0.500000" 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" 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" canlearn="no" teach="no" noweapons="yes">
<ai splitsize="1"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="2d40"/>
</race>
<race name="shadowmaster" cansail="no" cansteal="no" canlearn="no" magres="0.750000" 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">
<race name="shadowmaster" cansail="no" cansteal="no" canlearn="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"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="2d4"/>
<attack type="2" damage="2d30"/>
<attack type="3" damage="1d2"/>
</race>
<race name="shadowdemon" cansail="no" cansteal="no" canlearn="no" magres="0.750000" 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">
<race name="shadowdemon" cansail="no" cansteal="no" canlearn="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"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="2d3"/>
<attack type="3" damage="1d1"/>
</race>
<race name="stonegolem" stonegolem="true" magres="0.250000" 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" 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" canlearn="no" teach="no">
<ai splitsize="50"/>
<skill name="building" modifier="14"/>
<skill name="roadwork" modifier="14"/>
<attack type="4" damage="2d10+4"/>
</race>
<race name="irongolem" irongolem="true" magres="0.250000" 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" 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" canlearn="no" teach="no">
<ai splitsize="50"/>
<function name="name" value="namegeneric"/>
<skill name="armorer" modifier="14"/>
<skill name="weaponsmithing" modifier="14"/>
<attack type="4" damage="2d8+4"/>
</race>
<race name="spell" magres="0.000000" maxaura="1.000000" 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.000000" 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">
<ai splitsize="1"/>
<attack type="1" damage="1d4"/>
</race>
<race name="special" magres="0.000000" maxaura="0.000000" regaura="0.000000" weight="0" capacity="0" speed="0.000000" hp="1" damage="1d4" unarmedattack="-2" unarmeddefense="-2">
<race name="special" maxaura="0.000000" regaura="0.000000" weight="0" capacity="0" speed="0.000000" hp="1" damage="1d4" unarmedattack="-2" unarmeddefense="-2">
<ai splitsize="1"/>
<attack type="1" damage="1d4"/>
</race>
<race name="dracoid" magres="0.000000" 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">
<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"/>
<function name="name" value="namedracoid"/>
<attack type="4" damage="1d6"/>
<attack type="4" damage="1d6"/>
<attack type="1" damage="1d5"/>
</race>
<race name="catdragon" magres="0.900000" 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">
<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"/>
<attack type="4" damage="2d40"/>
<attack type="4" damage="2d40"/>
<attack type="4" damage="2d40"/>
<attack type="4" damage="2d40"/>
</race>
<race name="ent" magres="0.250000" 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">
<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"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="2d12"/>
<attack type="4" damage="2d12"/>
</race>
<race name="wyrm" magres="0.900000" 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" 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" unarmedguard="yes">
<ai splitsize="1" killpeasants="yes" learn="yes"/>
<function name="name" value="namedragon"/>
<function name="move" value="movedragon"/>
<skill name="magic" modifier="12"/>
<skill name="tactics" modifier="12"/>
<skill name="perception" modifier="10"/>
@ -742,11 +711,8 @@
<attack type="4" damage="5d30"/>
<attack type="6" spell="powerful_dragonbreath" level="12" />
</race>
<race name="dragon" magres="0.700000" 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">
<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"/>
<function name="name" value="namedragon"/>
<function name="age" value="agedragon"/>
<function name="move" value="movedragon"/>
<skill name="magic" modifier="8"/>
<skill name="tactics" modifier="8"/>
<skill name="perception" modifier="5"/>
@ -755,11 +721,8 @@
<attack type="4" damage="3d30"/>
<attack type="6" spell="icy_dragonbreath" level="6" />
</race>
<race name="youngdragon" magres="0.500000" 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">
<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"/>
<function name="name" value="namedragon"/>
<function name="age" value="agefiredragon"/>
<function name="move" value="movedragon"/>
<skill name="magic" modifier="4"/>
<skill name="tactics" modifier="4"/>
<skill name="stealth" modifier="2"/>
@ -769,22 +732,13 @@
<attack type="4" damage="1d30"/>
<attack type="6" spell="fiery_dragonbreath" level="3" />
</race>
<race name="illusion" magres="0.000000" maxaura="0.000000" regaura="0.000000" weight="0" capacity="0" speed="1.000000" hp="1" damage="1d1" unarmedattack="0" unarmeddefense="0" walk="yes" canlearn="no" teach="no" noweapons="yes" illusionary="yes">
<ai splitsize="999999"/>
<function name="age" value="ageillusion"/>
<skill name="unarmed" modifier="-99"/>
<attack type="1" damage="1d1"/>
</race>
<race name="undead" magres="0.000000" 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" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="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" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes">
<ai splitsize="20000" moverandom="yes"/>
<function name="name" value="nameundead"/>
<function name="age" value="ageundead"/>
<attack type="4" damage="1d7"/>
<attack type="5"/>
</race>
<race name="aquarian" magres="0.000000" maxaura="1.000000" regaura="1.000000" recruitcost="80" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" shipspeed="yes" playerrace="yes" coastal="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="aquarian" maxaura="1.000000" regaura="1.000000" recruitcost="80" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" shipspeed="yes" playerrace="yes" coastal="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="mining" modifier="-2"/>
<skill name="building" modifier="-1"/>
<skill name="trade" modifier="2"/>
@ -801,9 +755,8 @@
<familiar race="dolphin"/>
<familiar race="kraken"/>
</race>
<race name="cat" magres="0.000000" maxaura="1.000000" regaura="1.000000" recruitcost="90" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" defensemodifier="1" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="cat" maxaura="1.000000" regaura="1.000000" recruitcost="90" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" defensemodifier="1" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="alchemy" modifier="-1"/>
<skill name="mining" modifier="-2"/>
<skill name="building" modifier="-1"/>
@ -827,9 +780,8 @@
<familiar race="tiger"/>
<familiar race="hellcat"/>
</race>
<race name="halfling" magres="0.050000" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<param name="hunger.damage" value="1d14+14"/>
<skill name="crossbow" modifier="1"/>
<skill name="mining" modifier="1"/>
@ -860,9 +812,8 @@
<familiar race="eagle"/>
<familiar race="rat"/>
</race>
<race name="insect" magres="0.050000" maxaura="1.000000" regaura="1.000000" recruitcost="80" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" ac="2" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="insect" magres="50" maxaura="1.000000" regaura="1.000000" recruitcost="80" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" ac="2" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="crossbow" modifier="1"/>
<skill name="mining" modifier="1"/>
<skill name="bow" modifier="-2"/>
@ -889,10 +840,8 @@
<familiar race="tunnelworm"/>
<familiar race="imp"/>
</race>
<race name="demon" magres="0.150000" maxaura="1.000000" regaura="1.250000" recruitcost="150" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="50" ac="2" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" shapeshift="yes" giveperson="yes" giveunit="yes" getitem="yes" recruitethereal="yes" equipment="yes">
<race name="demon" magres="15" maxaura="1.000000" regaura="1.250000" recruitcost="150" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="50" ac="2" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" shapeshift="yes" giveperson="yes" giveunit="yes" getitem="yes" recruitethereal="yes" equipment="yes">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="initfamiliar" value="oldfamiliars"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="alchemy" modifier="2"/>
<skill name="trade" modifier="-3"/>
<skill name="forestry" modifier="1"/>
@ -921,9 +870,8 @@
<familiar race="wolf"/>
<familiar race="imp"/>
</race>
<race name="troll" magres="0.100000" maxaura="1.000000" regaura="1.000000" recruitcost="90" maintenance="10" weight="2000" capacity="1080" speed="1.000000" hp="30" ac="1" damage="1d5+3" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="troll" magres="10" maxaura="1.000000" regaura="1.000000" recruitcost="90" maintenance="10" weight="2000" capacity="1080" speed="1.000000" hp="30" ac="1" damage="1d5+3" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="mining" modifier="2"/>
<skill name="bow" modifier="-2"/>
<skill name="building" modifier="2"/>
@ -954,8 +902,6 @@
</race>
<race name="goblin" magres="-0.050000" maxaura="1.000000" regaura="1.000000" recruitcost="40" maintenance="10" weight="600" capacity="440" speed="1.000000" hp="16" damage="1d5" unarmedattack="-2" unarmeddefense="0" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="initfamiliar" value="oldfamiliars"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="alchemy" modifier="1"/>
<skill name="mining" modifier="1"/>
<skill name="building" modifier="1"/>
@ -978,7 +924,7 @@
<familiar race="rat"/>
<familiar race="imp"/>
</race>
<race name="clone" magres="0.900000" 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" 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" canlearn="no" teach="no" noheal="yes">
<ai splitsize="10000"/>
<skill name="alchemy" modifier="-99"/>
<skill name="crossbow" modifier="-99"/>
@ -1011,11 +957,11 @@
<skill name="unarmed" modifier="-99"/>
<attack type="1" damage="0d0"/>
</race>
<race name="template" magres="1.000000" maxaura="0.000000" regaura="0.000000" weight="0" capacity="1000" speed="10.000000" hp="10" damage="1d4" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" fly="yes" swim="yes" walk="yes" shapeshift="yes" shapeshiftany="yes" giveperson="yes" giveunit="yes" getitem="yes" recruitethereal="yes" recruitunlimited="yes" equipment="yes">
<race name="template" magres="100" maxaura="0.000000" regaura="0.000000" weight="0" capacity="1000" speed="10.000000" hp="10" damage="1d4" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" fly="yes" swim="yes" walk="yes" shapeshift="yes" shapeshiftany="yes" giveperson="yes" giveunit="yes" getitem="yes" recruitethereal="yes" recruitunlimited="yes" equipment="yes">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<attack type="1" damage="1d4"/>
</race>
<race name="gnome" magres="1.000000" 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">
<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"/>
<skill name="tactics" modifier="1"/>
<skill name="perception" modifier="1"/>
@ -1023,7 +969,7 @@
<skill name="unarmed" modifier="1"/>
<attack type="1" damage="1d4"/>
</race>
<race name="museumghost" magres="1.000000" 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">
<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"/>
<skill name="tactics" modifier="1"/>
<skill name="perception" modifier="1"/>
@ -1037,9 +983,8 @@
<attack type="2" damage="5d600"/>
<attack type="1" damage="1d4"/>
</race>
<race name="ghast" magres="0.600000" 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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes">
<ai splitsize="2000" aggression="0.02" killpeasants="yes" moverandom="yes"/>
<function name="name" value="nameghoul"/>
<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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes">
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
<skill name="crossbow" modifier="1"/>
<skill name="bow" modifier="1"/>
<skill name="catapult" modifier="1"/>
@ -1055,10 +1000,8 @@
<attack type="2" damage="1d30"/>
<attack type="2" damage="1d30"/>
</race>
<race name="ghoul" magres="0.300000" 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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes">
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
<function name="name" value="nameghoul"/>
<function name="age" value="ageghoul"/>
<skill name="crossbow" modifier="1"/>
<skill name="bow" modifier="1"/>
<skill name="catapult" modifier="1"/>
@ -1073,9 +1016,8 @@
<attack type="3" damage="1d2"/>
<attack type="2" damage="1d30"/>
</race>
<race name="juju-zombie" magres="0.500000" 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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistbash="yes" resistcut="yes" resistpierce="yes">
<ai splitsize="2000" aggression="0.02" killpeasants="yes" moverandom="yes"/>
<function name="name" value="namezombie"/>
<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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistbash="yes" resistcut="yes" resistpierce="yes">
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
<skill name="crossbow" modifier="1"/>
<skill name="bow" modifier="1"/>
<skill name="catapult" modifier="1"/>
@ -1089,10 +1031,8 @@
<attack type="3" damage="1d1"/>
<attack type="3" damage="1d1"/>
</race>
<race name="zombie" magres="0.200000" 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" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="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" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes">
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
<function name="name" value="namezombie"/>
<function name="age" value="agezombie"/>
<skill name="crossbow" modifier="1"/>
<skill name="bow" modifier="1"/>
<skill name="catapult" modifier="1"/>
@ -1104,9 +1044,8 @@
<skill name="unarmed" modifier="1"/>
<attack type="1" damage="1d7"/>
</race>
<race name="skeletonlord" magres="0.300000" 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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes">
<ai splitsize="2000" aggression="0.02" killpeasants="yes" moverandom="yes"/>
<function name="name" value="nameskeleton"/>
<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" canlearn="no" teach="no" absorbpeasants="yes" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes">
<ai splitsize="2000" killpeasants="yes" moverandom="yes"/>
<skill name="crossbow" modifier="1"/>
<skill name="bow" modifier="1"/>
<skill name="catapult" modifier="1"/>
@ -1119,10 +1058,8 @@
<attack type="1" damage="1d7"/>
<attack type="1" damage="1d7"/>
</race>
<race name="skeleton" magres="0.100000" 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" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="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" canlearn="no" teach="no" noheal="yes" undead="yes" equipment="yes" resistcut="yes" resistpierce="yes">
<ai splitsize="10000" killpeasants="yes" moverandom="yes"/>
<function name="name" value="nameskeleton"/>
<function name="age" value="ageskeleton"/>
<skill name="crossbow" modifier="1"/>
<skill name="bow" modifier="1"/>
<skill name="catapult" modifier="1"/>
@ -1134,15 +1071,12 @@
<skill name="unarmed" modifier="1"/>
<attack type="1" damage="1d7"/>
</race>
<race name="shadowknight" magres="0.000000" maxaura="0.000000" regaura="0.000000" weight="1000" capacity="540" speed="1.000000" 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="1000" capacity="540" speed="1.000000" hp="1" damage="1d1" unarmedattack="0" unarmeddefense="0" attackmodifier="1" defensemodifier="1" scarepeasants="yes" walk="yes" canlearn="no" teach="no" noblock="yes">
<ai splitsize="20000" moverandom="yes"/>
<function name="name" value="namegeneric"/>
<attack type="1" damage="1d1"/>
</race>
<race name="seaserpent" magres="0.500000" 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">
<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"/>
<function name="name" value="namegeneric"/>
<function name="move" value="moveswimming"/>
<skill name="tactics" modifier="4"/>
<attack type="4" damage="1d30"/>
<attack type="4" damage="1d30"/>
@ -1150,9 +1084,10 @@
<attack type="6" spell="fiery_dragonbreath" level="3" />
<attack type="8" damage="1d10"/>
</race>
<race name="snotling" magres="-0.050000" maxaura="1.000000" regaura="1.000000" recruitcost="50" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="snotling" magres="-5" maxaura="1.000000" regaura="1.000000"
maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="no" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="alchemy" modifier="1"/>
<skill name="mining" modifier="1"/>
<skill name="building" modifier="1"/>
@ -1180,10 +1115,8 @@
<familiar race="wolf"/>
<familiar race="demon"/>
</race>
<race name="elf" magres="0.100000" maxaura="1.000000" regaura="1.250000" recruitcost="130" 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="elf" magres="10" maxaura="1.000000" regaura="1.250000" recruitcost="130" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="alchemy" modifier="-1"/>
<skill name="mining" modifier="-2"/>
<skill name="bow" modifier="2"/>
@ -1208,9 +1141,8 @@
<familiar race="unicorn"/>
<familiar race="imp"/>
</race>
<race name="dwarf" magres="0.050000" maxaura="1.000000" regaura="0.500000" recruitcost="110" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="dwarf" magres="5" maxaura="1.000000" regaura="0.500000" recruitcost="110" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="mining" modifier="2"/>
<skill name="bow" modifier="-1"/>
<skill name="building" modifier="2"/>
@ -1240,7 +1172,7 @@
<familiar race="wolf"/>
<familiar race="rat"/>
</race>
<race name="orc" magres="-0.050000" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="orc" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" 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"/>
<param name="recruit_multi" value="0.5"/>
<skill name="alchemy" modifier="1"/>
@ -1270,10 +1202,8 @@
<familiar race="wolf"/>
<familiar race="demon"/>
</race>
<race name="shadowdragon" magres="0.950000" 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">
<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"/>
<function name="name" value="namedragon"/>
<function name="move" value="movedragon"/>
<skill name="tactics" modifier="20"/>
<skill name="perception" modifier="20"/>
<attack type="4" damage="5d30"/>
@ -1282,31 +1212,5 @@
<attack type="4" damage="5d30"/>
<attack type="6" spell="drain_skills" level="12"/>
<attack type="6" spell="aura_of_fear" level="12"/>
<precombatspell spell="shadowcall"/>
</race>
<race name="shadowbat" magres="0.800000" maxaura="0.000000" regaura="0.000000" weight="500" capacity="540" speed="1.000000" hp="1" ac="4" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="3" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes">
<ai splitsize="5000" killpeasants="yes"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="1d6"/>
<attack type="3" damage="1d1"/>
</race>
<race name="nightmare" magres="0.500000" maxaura="0.000000" regaura="0.000000" weight="100" capacity="540" speed="1.000000" hp="80" ac="10" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="3" scarepeasants="yes" fly="yes" walk="yes" teach="no" getitem="yes" invinciblenonmagic="yes">
<ai splitsize="500" killpeasants="yes"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="1d4"/>
<attack type="4" damage="1d4"/>
<attack type="4" damage="1d4"/>
<attack type="3" damage="1d4"/>
<attack type="2" damage="1d10"/>
</race>
<race name="vampunicorn" magres="1.000000" maxaura="0.000000" regaura="0.000000" weight="5000" capacity="2000" speed="1.000000" hp="30" ac="4" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="3" defensemodifier="3" scarepeasants="yes" walk="yes" teach="no" getitem="yes">
<ai splitsize="5000" killpeasants="yes"/>
<function name="name" value="namegeneric"/>
<attack type="4" damage="2d10"/>
<attack type="3" damage="1d4"/>
<attack type="3" damage="1d4"/>
<attack type="3" damage="1d4"/>
<attack type="3" damage="1d4"/>
<attack type="2" damage="2d60"/>
</race>
</races>

View File

@ -123,7 +123,6 @@
<entry spell="rustweapon" level="3" />
<entry spell="sacrifice_strength" level="15" />
<entry spell="seduction" level="6" />
<entry spell="shadowcall" level="12" />
<entry spell="shadowknights" level="1" />
<entry spell="shapeshift" level="3" />
<entry spell="shockwave" level="5" />

View File

@ -471,9 +471,6 @@
<spell name="aura_of_fear" rank="5" index="175" combat="2">
<resource name="aura" amount="12" cost="fixed"/>
</spell>
<spell name="shadowcall" rank="5" index="176" combat="1">
<resource name="aura" amount="24" cost="fixed"/>
</spell>
<spell name="mallorntreegrow" rank="5" index="177" far="true" variable="true">
<resource name="aura" amount="6" cost="level"/>
<resource name="mallorn" amount="1" cost="level"/>

View File

@ -352,37 +352,9 @@
<!-- ending here: Wildente and Jadee's wedding -->
<!-- art rewards begin -->
<string name="hornofdancing">
<text locale="de">Horn des Tanzes</text>
<text locale="en">horn of dancing</text>
</string>
<string name="hornofdancing_p">
<text locale="de">Hörner des Tanzes</text>
<text locale="en">horns of dancing</text>
</string>
<string name="instantartacademy">
<text locale="de">Miniatur einer Akademie der Künste</text>
<text locale="en">academy of arts in a box</text>
</string>
<string name="instantartacademy_p">
<text locale="de">Miniaturen einer Akademie der Künste</text>
<text locale="en">academies of arts in a box</text>
</string>
<string name="instantartsculpture">
<text locale="de">Miniatur einer Skulptur</text>
<text locale="en">art sculpture in a box</text>
</string>
<string name="instantartsculpture_p">
<text locale="de">Miniaturen einer Skulptur</text>
<text locale="en">art sculptures in a box</text>
</string>
<string name="trappedairelemental">
<text locale="de">Gefangener Windgeist</text>
<text locale="en">trapped air elemental</text>
</string>
<string name="trappedairelemental_p">
<text locale="de">Gefangene Windgeister</text>
<text locale="en">trapped air elementals</text>
<string name="artacademy">
<text locale="de">Akademie der Künste</text>
<text locale="en">academy of arts</text>
</string>
<string name="aurapotion50">
<text locale="de">Auratrank</text>

View File

@ -1,3 +0,0 @@
<?xml version="1.0" ?>
<items>
</items>

View File

@ -1,7 +1,6 @@
<?xml version="1.0" ?>
<race name="aquarian" magres="0.000000" maxaura="1.000000" regaura="1.000000" recruitcost="80" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" shipspeed="yes" playerrace="yes" coastal="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="aquarian" maxaura="1.000000" regaura="1.000000" recruitcost="80" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" shipspeed="yes" playerrace="yes" coastal="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="mining" modifier="-2"/>
<skill name="building" modifier="-1"/>
<skill name="trade" modifier="2"/>

View File

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="iso-8859-1" ?>
<race name="cat" magres="0.000000" maxaura="1.000000" regaura="1.000000" recruitcost="90" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" defensemodifier="1" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="cat" maxaura="1.000000" regaura="1.000000" recruitcost="90" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" defensemodifier="1" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="alchemy" modifier="-1"/>
<skill name="mining" modifier="-2"/>
<skill name="building" modifier="-1"/>

View File

@ -1,12 +1,11 @@
<?xml version="1.0" ?>
<race name="demon" magres="0.150000" maxaura="1.000000"
<race name="demon" magres="15" maxaura="1.000000"
regaura="1.250000" recruitcost="150" maintenance="10" weight="1000"
capacity="540" speed="1.000000" hp="50" ac="2" damage="1d5"
unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes"
shapeshift="yes" giveperson="yes" giveunit="yes" getitem="yes"
recruitethereal="yes" equipment="yes" healing="1.5">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="alchemy" modifier="2"/>
<skill name="trade" modifier="-3"/>
<skill name="forestry" modifier="1"/>

View File

@ -1,12 +1,10 @@
<race name="dragon" magres="0.700000" maxaura="1.0" regaura="2.000000" weight="10000" capacity="1000000" speed="1.500000" hp="900" ac=
<race name="dragon" magres="70" maxaura="1.0" 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"
income="1000" walk="yes" teach="no" getitem="yes" resistbash="yes"
dragon="yes">
<ai splitsize="2" killpeasants="yes" learn="yes" scare="400"/>
<function name="name" value="namedragon"/>
<function name="age" value="agedragon"/>
<function name="move" value="movedragon"/>
<skill name="magic" modifier="8"/>
<skill name="tactics" modifier="8"/>
<attack type="4" damage="2d20"/>

View File

@ -1,7 +1,6 @@
<?xml version="1.0" ?>
<race name="dwarf" magres="0.050000" maxaura="1.000000" regaura="0.500000" recruitcost="110" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="dwarf" magres="5" maxaura="1.000000" regaura="0.500000" recruitcost="110" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="mining" modifier="2"/>
<skill name="bow" modifier="-1"/>
<skill name="building" modifier="2"/>
@ -30,4 +29,4 @@
<familiar race="lynx"/>
<familiar race="wolf"/>
<familiar race="rat"/>
</race>
</race>

View File

@ -1,7 +1,6 @@
<?xml version="1.0" ?>
<race name="elf" magres="0.100000" maxaura="1.000000" regaura="1.250000" recruitcost="130" 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="elf" magres="10" maxaura="1.000000" regaura="1.250000" recruitcost="130" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="alchemy" modifier="-1"/>
<skill name="mining" modifier="-2"/>
<skill name="bow" modifier="2"/>
@ -26,4 +25,4 @@
<familiar race="unicorn"/>
<familiar race="imp"/>
</race>

View File

@ -1,14 +1,12 @@
<?xml version="1.0" ?>
<race name="goblin" magres="-0.05" maxaura="1.0" regaura="1.0"
<race name="goblin" magres="-5" maxaura="1.0" regaura="1.0"
recruitcost="60" maintenance="6" weight="600" capacity="440"
speed="1.0" hp="16" damage="1d5" unarmedattack="-2" unarmeddefense="0"
playerrace="yes" walk="yes" giveperson="yes" giveunit="yes"
getitem="yes" equipment="yes" healing="2.0">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<param name="hunger.damage" value="1d8+7"/>
<param name="other_race" value="demon"/>
<param name="other_cost" value="500"/>
<param name="recruit_multi" value="0.5"/>
<skill name="building" modifier="1"/>
<skill name="cartmaking" modifier="-1"/>

View File

@ -1,14 +1,12 @@
<?xml version="1.0" ?>
<race name="goblin" magres="-0.05" maxaura="1.0" regaura="1.0"
<race name="goblin" magres="-5" maxaura="1.0" regaura="1.0"
recruitcost="60" maintenance="6" weight="600" capacity="440"
speed="1.0" hp="16" damage="1d5" unarmedattack="-2" unarmeddefense="0"
playerrace="yes" walk="yes" giveperson="yes" giveunit="yes"
getitem="yes" equipment="yes" healing="2.0">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<param name="hunger.damage" value="1d8+7"/>
<param name="other_race" value="demon"/>
<param name="other_cost" value="500"/>
<param name="recruit_multi" value="0.5"/>
<skill name="cartmaking" modifier="-1"/>
<skill name="catapult" modifier="1"/>

View File

@ -1,12 +1,11 @@
<?xml version="1.0" ?>
<race name="goblin" magres="-0.050000" maxaura="1.000000"
<race name="goblin" magres="-5" maxaura="1.000000"
regaura="1.000000" recruitcost="40" maintenance="10" weight="600"
capacity="440" speed="1.000000" hp="16" damage="1d5"
unarmedattack="-2" unarmeddefense="0" playerrace="yes" walk="yes"
giveperson="yes" giveunit="yes" getitem="yes" equipment="yes"
healing="2.0">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="alchemy" modifier="1"/>
<skill name="mining" modifier="1"/>
<skill name="building" modifier="1"/>

View File

@ -1,8 +1,7 @@
<?xml version="1.0" ?>
<race name="halfling" magres="0.050000" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<param name="hunger.damage" value="1d14+14"/>
<param name="hunger.damage" value="1d14+14"/>
<skill name="crossbow" modifier="1"/>
<skill name="mining" modifier="1"/>
<skill name="bow" modifier="-1"/>

View File

@ -1,7 +1,6 @@
<?xml version="1.0" ?>
<race name="human" magres="0.000000" 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">
<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">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="trade" modifier="1"/>
<skill name="herbalism" modifier="-1"/>
<skill name="shipcraft" modifier="1"/>

View File

@ -1,7 +1,6 @@
<?xml version="1.0" ?>
<race name="insect" magres="0.050000" maxaura="1.000000" regaura="1.000000" recruitcost="80" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" ac="2" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="insect" magres="5" maxaura="1.000000" regaura="1.000000" recruitcost="80" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" ac="2" 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"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="crossbow" modifier="1"/>
<skill name="mining" modifier="1"/>
<skill name="bow" modifier="-2"/>
@ -27,4 +26,4 @@
<familiar race="rat"/>
<familiar race="tunnelworm"/>
<familiar race="imp"/>
</race>
</race>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" ?>
<race name="orc" magres="-0.050000" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes" giveperson="yes" giveunit="yes" getitem="yes" equipment="yes">
<race name="orc" magres="-5" maxaura="1.000000" regaura="1.000000" recruitcost="70" maintenance="10" weight="1000" capacity="540" speed="1.000000" hp="24" 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"/>
<param name="recruit_multi" value="0.5"/>
<skill name="alchemy" modifier="1"/>

View File

@ -1,12 +1,11 @@
<?xml version="1.0" ?>
<race name="troll" magres="0.100000" maxaura="1.000000"
<race name="troll" magres="10" maxaura="1.000000"
regaura="1.000000" recruitcost="90" maintenance="10" weight="2000"
capacity="1080" speed="1.000000" hp="30" ac="1" damage="1d5+3"
unarmedattack="-2" unarmeddefense="-2" playerrace="yes" walk="yes"
giveperson="yes" giveunit="yes" getitem="yes" equipment="yes"
healing="1.5">
<ai splitsize="10000" moverandom="yes" learn="yes"/>
<function name="itemdrop" value="defaultdrops"/>
<skill name="mining" modifier="2"/>
<skill name="bow" modifier="-2"/>
<skill name="building" modifier="2"/>

View File

@ -1,11 +1,10 @@
<race name="wyrm" magres="0.900000" maxaura="1.0" regaura="3.000000"
<race name="wyrm" magres="90" maxaura="1.0" regaura="3.000000"
weight="18000" capacity="1000000" speed="1.0" 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" income="5000">
<ai splitsize="1" killpeasants="yes" learn="yes" scare="1000"/>
<function name="name" value="namedragon"/>
<function name="move" value="movedragon"/>
<skill name="magic" modifier="12"/>
<skill name="tactics" modifier="12"/>
<attack type="4" damage="3d20"/>

View File

@ -1,12 +1,10 @@
<race name="youngdragon" magres="0.500000" maxaura="1.0" regaura="1.0"
<race name="youngdragon" magres="50" maxaura="1.0" regaura="1.0"
weight="8000" capacity="10000" speed="1.0" 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" dragon="yes" income="150">
<ai splitsize="6" killpeasants="yes" learn="yes" scare="160"/>
<function name="name" value="namedragon"/>
<function name="age" value="agefiredragon"/>
<function name="move" value="movedragon"/>
<skill name="magic" modifier="4"/>
<skill name="tactics" modifier="4"/>
<attack type="4" damage="1d30"/>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" ?>
<race name="zombie" magres="0.20000" maxaura="1.0" regaura="1.0"
<race name="zombie" magres="20" maxaura="1.0" regaura="1.0"
recruitcost="-1" maintenance="0" weight="1000" capacity="440" speed="1.000000"
hp="20" damage="1d5" unarmedattack="-2" unarmeddefense="-2" playerrace="no"
walk="yes" shapeshift="no" giveperson="no" giveunit="no"

View File

@ -30,8 +30,6 @@ if [ ! -d $ROOT/$BUILD ]; then
exit
fi
git submodule update
echo "build eressea"
cd $ROOT/$BUILD
BRANCH=$(git status -s -b | head -1 | cut -d\ -f 2 | sed 's/\..*//')
@ -40,7 +38,7 @@ VERSION=$(git describe --match 'v*.*.*' --tags | sed 's/^v//')
cmake -DERESSEA_VERSION="$VERSION" ..
else
REV=$(git rev-parse --short HEAD)
cmake -DERESSEA_BUILDNO="$REV-$BUILD" ..
cmake -DERESSEA_BUILDNO="$REV" ..
fi
make $MAKEOPTS && make test
cd $OLDPWD

View File

@ -28,12 +28,13 @@ if [ -d $HOME/usr ]; then
PREFIX_PATH=$HOME/usr:$HOME/usr/local:$PREFIX_PATH
fi
DEST=$(dirname $ROOT)/server
ARGS=" -DCMAKE_MODULE_PATH=$ROOT/cmake/Modules \
-DCMAKE_BUILD_TYPE=$BUILD \
-DCMAKE_LIBRARY_PATH=$LIBRARY_PATH \
-DCMAKE_INCLUDE_PATH=$INCLUDE_PATH \
-DCMAKE_PREFIX_PATH=$PREFIX_PATH \
-DCMAKE_INSTALL_PREFIX=$HOME/eressea/server"
-DCMAKE_INSTALL_PREFIX=$DEST"
git submodule update --init

View File

@ -8,8 +8,6 @@ while [ ! -d $ROOT/.git ]; do
fi
done
DEST=$(dirname $ROOT)/server
[ -z "$CC" ] && [ ! -z `which clang` ] && CC="clang"
[ -z "$CC" ] && [ ! -z `which gcc` ] && CC="gcc"
[ -z "$CC" ] && [ ! -z `which tcc` ] && CC="tcc"

View File

@ -25,9 +25,9 @@ cd $SOURCE
rm -rf crypto tolua
git fetch || abort "failed to update source. do you have local changes?"
[ -z $1 ] || git checkout $1
git pull
git pull -q
git submodule update
s/build || abort "build failed."
s/build > /dev/null || abort "build failed."
}
function assert_file() {
@ -79,9 +79,9 @@ SUPP="$SOURCE/share/debian-7_8.supp"
SERVER="$SOURCE/Debug/eressea/eressea"
VALGRIND=$(which valgrind)
if [ ! -z $VALGRIND ]; then
SERVER="$VALGRIND --suppressions=$SUPP --error-exitcode=1 --leak-check=no $SERVER"
SERVER="$VALGRIND --quiet --suppressions=$SUPP --error-exitcode=1 --leak-check=no $SERVER"
fi
$SERVER -v$verbose -t$turn -re$game $SOURCE/scripts/run-turn.lua
$SERVER -v$verbose -t$turn $SOURCE/scripts/run-turn.lua
let turn=$turn+1
[ -e data/$turn.dat ] || abort "no data file created"
}
@ -160,7 +160,7 @@ case "$1" in
done
if [ $sent -eq 0 ]; then
if [ -e ../$factions ]; then
for faction in $(cat ../$factions) ; do
for faction in $(grep -v -E '^#' ../$factions) ; do
send $faction
done
fi

View File

@ -15,7 +15,6 @@ cd $ROOT
$ROOT/$BUILD/eressea/eressea -v1 scripts/run-tests.lua
$ROOT/$BUILD/eressea/eressea -v1 scripts/run-tests-e2.lua
$ROOT/$BUILD/eressea/eressea -v1 scripts/run-tests-e3.lua
$ROOT/$BUILD/eressea/eressea -v1 scripts/run-tests-e4.lua
rm -rf data reports orders.txt score score.alliances datum turn
cd $OLDWPD

20
s/setup
View File

@ -1,5 +1,15 @@
#!/bin/bash
ROOT=$(pwd)
while [ ! -d $ROOT/.git ]; do
ROOT=$(dirname $ROOT)
if [ "/" = "$ROOT" ]; then
echo "could not find root, are you in the git repository?"
exit
fi
done
ERESSEA=$(dirname $ROOT)
function abort() {
echo $1
[ -z $2 ] && exit -1
@ -37,7 +47,6 @@ while getopts :d:g:r:s:hfn o; do
done
[ $game -gt 0 ] || abort "must use a positive integer for game id"
[ -d $ERESSEA ] || abort "invalid or missing env variable ERESSEA ($ERESSEA)"
[ -z $SOURCE ] && SOURCE=$ERESSEA/$src
[ -d $SOURCE ] || abort "invalid source directory $SOURCE"
[ -z $rules ] && rules=e$game
@ -46,7 +55,8 @@ done
[ -e $TOOLS ] || TOOLS=$SOURCE/bin
[ -z $INIFILE ] && INIFILE=$TOOLS/inifile
[ -e $INIFILE ] || INIFILE=$TOOLS/iniparser/inifile
#[ -e $INIFILE ] || abort "tool is not installed: $INIFILE"
[ -e $SOURCE/conf/$rules/config.xml ] || abort "cannot find conf/$rules/config.xml"
cd $ERESSEA
if [ -d $dir ] ; then
@ -84,8 +94,10 @@ touch eressea.ini
}
ini_start
ini_sec eressea
ini_add eressea locales de,en
ini_sec game
ini_add game locales de,en
ini_add game id $game
ini_add game start 1
ini_sec lua
ini_add lua install $SOURCE
ini_add lua paths $SOURCE/scripts:$SOURCE/lunit

14
s/upgrade Executable file
View File

@ -0,0 +1,14 @@
#!/bin/sh
set -e
ROOT=`pwd`
while [ ! -d $ROOT/.git ]; do
ROOT=`dirname $ROOT`
done
cd $ROOT
git pull
git submodule update
s/build
s/runtests
s/install

View File

@ -1,3 +1,4 @@
if not config.autoseed then return nil end
local autoseed = {}
-- minimum required resources in the 7-hex neighborhood:
@ -64,9 +65,9 @@ local function seed(r, email, race, lang)
assert(f)
local u = unit.create(f, r)
assert(u)
equip_unit(u, "new_faction")
equip_unit(u, "first_unit")
equip_unit(u, "first_" .. race, 7) -- disable old callbacks
equip_unit(u, "autoseed_faction")
equip_unit(u, "autoseed_unit")
equip_unit(u, "autoseed_" .. race, 7)
unit.create(f, r, 5):set_skill("mining", 30)
unit.create(f, r, 5):set_skill("quarrying", 30)
f:set_origin(r)

View File

@ -11,7 +11,7 @@ return {
require('eressea.tunnels'),
require('eressea.ponnuki'),
require('eressea.astral'),
require('eressea.locales'),
-- require('eressea.locales'),
require('eressea.jsreport'),
require('eressea.ents'),
require('eressea.cursed')

View File

@ -1,11 +0,0 @@
require 'eressea.e3.rules'
require 'eressea.spells'
eressea.log.debug("rules for game E4")
return {
require('eressea'),
-- require('eressea.markets'),
require('eressea.frost'),
require('eressea.ents')
}

View File

@ -1,12 +1,14 @@
-- Muschelplateau
if not config.embassy then return nil end
local embassy = {}
local home = nil
-- global exports (use item)
function use_seashell(u, amount)
-- Muschelplateau...
local visit = u.faction.objects:get("embassy_muschel")
local visit = u.faction:get_key('mupL')
if visit and u.region~= home then
local turns = get_turn() - visit
local msg = message.create('msg_event')
@ -32,10 +34,10 @@ function embassy.update()
eressea.log.debug("updating embassies in " .. tostring(home))
local u
for u in home.units do
if u.faction.objects:get('embassy_muschel')==nil then
if u.faction:get_key('mupL')==0 then
if (u.faction:add_item('seashell', 1)>0) then
eressea.log.debug("new seashell for " .. tostring(u.faction))
u.faction.objects:set('embassy_muschel', get_turn())
u.faction:set_key('mupL', get_turn())
end
end
end

View File

@ -1,5 +1,5 @@
-- DEPRECATED
if not config.eternath then return nil end
-- implements parts of a quest in E2
-- this module is deprecated, because it puts functions in the global environment for at_building_action

View File

@ -1,3 +1,4 @@
if not config.ponnuki then return nil end
local ponnuki = {}
local directions = { "NW", "NO", "O", "SO", "SW", "W" }

View File

@ -38,8 +38,47 @@ function hp_changeresource(u, delta)
return hp
end
local function mallorn_region(r)
return r:get_flag(1) -- RF_MALLORN
end
function seed_limit(r)
if mallorn_region(r) then
return 0
end
return r:get_resource("seed")
end
function seed_produce(r, n)
if not mallorn_region(r) then
local seeds = r:get_resource("seed")
if seeds>=n then
r:set_resource("seed", seeds-n)
else
r:set_resource("seed", 0)
end
end
end
function mallornseed_limit(r)
if mallorn_region(r) then
return r:get_resource("seed")
end
return 0
end
function mallornseed_produce(r, n)
if mallorn_region(r) then
local seeds = r:get_resource("seed")
if seeds>=n then
r:set_resource("seed", seeds-n)
else
r:set_resource("seed", 0)
end
end
end
function horse_limit(r)
return r:get_resource("horse")
return r:get_resource("horse")
end
function horse_produce(r, n)
@ -52,9 +91,6 @@ function horse_produce(r, n)
end
function log_limit(r)
-- if r:get_flag(1) then -- RF_MALLORN
-- return 0
-- end
return r:get_resource("tree") + r:get_resource("sapling")
end
@ -75,7 +111,7 @@ function log_produce(r, n)
end
function mallorn_limit(r)
if not r:get_flag(1) then -- RF_MALLORN
if not mallorn_region(r) then
return 0
end
return r:get_resource("tree") + r:get_resource("sapling")

View File

@ -1,4 +1,5 @@
-- DEPRECATED
if not config.wedding then return nil end
-- this script contains the action functions for the two portals
-- used on the jadee/wildente wedding island. the two _action functions

View File

@ -1,3 +1,5 @@
if not config.xmas then return nil end
local gifts = {
e2 = {
{ year = 2015, turn = 959, item = 'snowglobe', msg='santa_f' },

View File

@ -4,6 +4,8 @@ if config.install then
end
if config.rules then
local rules = config.rules .. '/'
assert(0 == read_xml(confdir .. rules .. 'config.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?")
assert(0 == eressea.config.read(rules .. 'config.json', confdir), "could not read JSON data")
assert(0 == read_xml(confdir .. rules .. 'rules.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?")
assert(0 == read_xml(confdir .. rules .. 'locales.xml', confdir .. rules .. 'catalog.xml'), "could not load XML data, did you compile with LIBXML2 ?")
end
eressea.game.reset()

View File

@ -1,23 +0,0 @@
-- Tests that work in E3. With game config of E3.
-- Tests are under scripts/test/e3 and all files must be in scripts/test/e3/init.lua
path = 'scripts'
if config.install then
path = config.install .. '/' .. path
package.path = package.path .. ';' .. config.install .. '/lunit/?.lua'
--needed to find lunit if not run form eressea root. Needs right [lua] install setting in eressea.ini (point to eressea root from the start folder)
end
package.path = package.path .. ';' .. path .. '/?.lua;' .. path .. '/?/init.lua'
config.rules = 'e4'
require 'eressea'
require 'eressea.path'
require 'eressea.xmlconf'
require 'tests.e3'
require 'lunit'
eressea.settings.set("rules.alliances", "0")
rules = require('eressea.' .. config.rules)
result = lunit.main()
return result.errors + result.failed

View File

@ -26,15 +26,17 @@ function callbacks(rules, name, ...)
end
local function dbupdate()
update_scores()
dbname = config.dbname or 'eressea.db'
edb = db.open(config.basepath..'/'..dbname)
if edb~=nil then
edb:update_factions()
edb:update_scores()
else
eressea.log.error("could not open "..config.basepath..'/'..dbname)
end
update_scores()
if config.dbname then
dbname = config.basepath..'/'..config.dbname
edb = db.open(dbame)
if edb~=nil then
edb:update_factions()
edb:update_scores()
else
eressea.log.error("could not open "..dbname)
end
end
end
local function write_emails(locales)
@ -144,7 +146,7 @@ function process(rules, orders)
init_summary()
-- run the turn:
if read_orders(orders) ~= 0 then
if eressea.read_orders(orders) ~= 0 then
print("could not read " .. orders)
return -1
end

View File

@ -330,17 +330,6 @@ function test_message()
return msg
end
function test_hashtable()
local f = faction.create("noreply1@eressea.de", "human", "de")
f.objects:set("enno", "smart guy")
f.objects:set("age", 10)
assert(f.objects:get("jesus") == nil)
assert(f.objects:get("enno") == "smart guy")
assert(f.objects:get("age") == 10)
f.objects:set("age", nil)
assert(f.objects:get("age") == nil)
end
function test_events()
local fail = 1
local function msg_handler(u, evt)
@ -449,10 +438,9 @@ function test_recruit()
u:add_item("money", 110*n+20)
u:add_order("REKRUTIERE " .. n)
process_orders()
assert(u.number == n+1)
assert_equal(n+1, u.number)
local p = r:get_resource("peasant")
assert(p<200 and p>=200-n)
-- assert(u:get_item("money")==10)
assert_true(p<200 and p>=200-n)
end
function test_produce()
@ -479,7 +467,7 @@ function test_work()
u:clear_orders()
u:add_order("ARBEITEN")
process_orders()
assert(u:get_item("money")>=10)
assert_equal(20, u:get_item("money"))
end
function test_upkeep()
@ -491,7 +479,7 @@ function test_upkeep()
u:clear_orders()
u:add_order("LERNE Waffenbau")
process_orders()
assert(u:get_item("money")==u.number)
assert_equal(u:get_item("money"), u.number)
end
function test_id()
@ -499,50 +487,39 @@ function test_id()
local f = faction.create("noreply11@eressea.de", "human", "de")
f.id = atoi36("42")
assert(get_faction(42)~=f)
assert(get_faction("42")==f)
assert(get_faction(atoi36("42"))==f)
assert_not_equal(f, get_faction(42))
assert_equal(f, get_faction("42"))
assert_equal(f, get_faction(atoi36("42")))
local u = unit.create(f, r, 1)
u.id = atoi36("42")
assert(get_unit(42)~=u)
assert(get_unit("42")==u)
assert(get_unit(atoi36("42"))==u)
assert_not_equal(get_unit(42), u)
assert_equal(get_unit("42"), u)
assert_equal(get_unit(atoi36("42")), u)
local b = building.create(r, "castle")
-- <not working> b.id = atoi36("42")
local fortytwo = itoa36(b.id)
assert(get_building(fortytwo)==b)
assert(get_building(atoi36(fortytwo))==b)
assert_equal(get_building(fortytwo), b)
assert_equal(get_building(atoi36(fortytwo)), b)
local s = _test_create_ship(r)
assert_not_nil(s)
-- <not working> s.id = atoi36("42")
local fortytwo = itoa36(s.id)
assert(get_ship(fortytwo)==s)
assert(get_ship(atoi36(fortytwo))==s)
end
function test_herbalism()
local r = region.create(0, 0, "plain")
local f = faction.create("noreply12@eressea.de", "human", "de")
local u = unit.create(f, r, 1)
u:add_item("money", u.number * 100)
u:set_skill("herbalism", 5)
u:clear_orders()
u:add_order("MACHE Samen")
process_orders()
assert_equal(get_ship(fortytwo), s)
assert_equal(get_ship(atoi36(fortytwo)), s)
end
function test_mallorn()
local r = region.create(0, 0, "plain")
r:set_flag(1, false) -- not mallorn
r:set_resource("tree", 100)
assert(r:get_resource("tree")==100)
assert_equal(100, r:get_resource("tree"))
local m = region.create(0, 0, "plain")
m:set_flag(1, true) -- mallorn
m:set_resource("tree", 100)
assert(m:get_resource("tree")==100)
assert_equal(100, m:get_resource("tree"))
local f = faction.create("noreply13@eressea.de", "human", "de")

View File

@ -2,6 +2,38 @@ require "lunit"
module("tests.e2.e2features", package.seeall, lunit.testcase )
function setup()
eressea.free_game()
eressea.settings.set("nmr.timeout", "0")
eressea.settings.set("rules.food.flags", "4")
eressea.settings.set("rules.ship.storms", "0")
eressea.settings.set("rules.encounters", "0")
end
function test_herbalism()
-- OBS: herbalism is currently an E2-only skill
local r = region.create(0, 0, "plain")
local f = faction.create("herbalism@eressea.de", "human", "de")
local u = unit.create(f, r, 1)
eressea.settings.set("rules.grow.formula", 0) -- plants do not grow
u:add_item("money", u.number * 100)
u:set_skill("herbalism", 5)
r:set_resource("seed", 100)
r:set_flag(1, false) -- regular trees
u:clear_orders()
u:add_order("MACHE Samen")
process_orders()
assert_equal(1, u:get_item("seed"))
assert_equal(99, r:get_resource("seed"))
r:set_flag(1, true) -- mallorn
u:clear_orders()
u:add_order("MACHE Mallornsamen")
process_orders()
assert_equal(1, u:get_item("mallornseed"))
assert_equal(98, r:get_resource("seed"))
end
function test_build_harbour()
-- try to reproduce mantis bug 2221
local r = region.create(0, 0, "plain")
@ -42,13 +74,6 @@ local function two_units(r, f1, f2)
return one_unit(r, f1), one_unit(r, f2)
end
function setup()
eressea.free_game()
eressea.settings.set("nmr.timeout", "0")
eressea.settings.set("rules.food.flags", "4")
eressea.settings.set("rules.ship.storms", "0")
end
function test_learn()
eressea.settings.set("study.random_progress", "0")
local r = region.create(0, 0, "plain")

View File

@ -11,30 +11,62 @@ function teardown()
eressea.settings.set("rules.food.flags", "0")
end
function test_build_watch()
local r = region.create(0, 0, "plain")
local f = faction.create("e3build@eressea.de", "human", "de")
local u = unit.create(f, r, 1)
u.number = 20
u:add_item("log", 20)
u.id = 42
u:set_skill("building", 1)
u:add_order("MACHE Wache")
process_orders()
assert_not_nil(u.building)
assert_equal(5, u.building.size)
u:set_skill("building", 2)
u:add_order("MACHE Wache " .. itoa36(u.building.id))
process_orders()
assert_not_nil(u.building)
assert_equal(10, u.building.size)
end
function test_watch()
local r = region.create(0, 0, "plain")
local b = building.create(r, "watch")
assert_equal("scaffolding", b:get_typename(1))
assert_equal("scaffolding", b:get_typename(4))
assert_equal("guardhouse", b:get_typename(5))
assert_equal("guardhouse", b:get_typename(9))
assert_equal("guardtower", b:get_typename(10))
end
function test_small_castles()
local r = region.create(0, 0, "plain")
local f1 = faction.create("noreply@eressea.de", "human", "de")
local u1 = unit.create(f1, r, 1)
local f2 = faction.create("noreply@eressea.de", "halfling", "de")
local u2 = unit.create(f2, r, 1)
u1:add_item("money", 10000)
local r = region.create(0, 0, "plain")
local f1 = faction.create("noreply@eressea.de", "human", "de")
local u1 = unit.create(f1, r, 1)
local f2 = faction.create("noreply@eressea.de", "halfling", "de")
local u2 = unit.create(f2, r, 1)
local b = building.create(r, "castle")
u2.building = b
u1.building = b
local b = building.create(r, "castle")
u2.building = b
u1.building = b
b.owner = u2
assert_equal("site", b:get_typename(7))
assert_equal("fortification", b:get_typename(8))
b.owner = u1
assert_equal("site", b:get_typename(9))
assert_equal("fortification", b:get_typename(10))
b.owner = u2
assert_equal("site", b:get_typename(7))
assert_equal("fortification", b:get_typename(8))
b.owner = u1
assert_equal("site", b:get_typename(9))
assert_equal("fortification", b:get_typename(10))
end
function test_build_normal()
local r = region.create(0, 0, "plain")
local f = faction.create("noreply@eressea.de", "human", "de")
local u = unit.create(f, r, 1)
local r = region.create(0, 0, "plain")
local f = faction.create("noreply@eressea.de", "human", "de")
local u = unit.create(f, r, 1)
u:clear_orders()
u:add_item("stone", 10)
u:set_skill("building", 10)
@ -45,9 +77,9 @@ function test_build_normal()
end
function test_build_packice()
local r = region.create(0, 0, "packice")
local f = faction.create("noreply@eressea.de", "human", "de")
local u = unit.create(f, r, 1)
local r = region.create(0, 0, "packice")
local f = faction.create("packice@eressea.de", "human", "de")
local u = unit.create(f, r, 1)
u:clear_orders()
u:add_item("stone", 10)
u:set_skill("building", 10)

View File

@ -17,7 +17,7 @@ function setup()
end
function test_faction_flags()
assert_equal(2, f.flags) -- FFL_ISNEW
assert_equal(6, f.flags) -- FFL_ISNEW|FFL_PWMSG
f.flags = 42
assert_equal(42, f.flags)
end

View File

@ -95,6 +95,7 @@ function test_force_leave_postcombat()
u1.building = b1
u2.building = b1
eressea.settings.set("rules.owners.force_leave", "1")
eressea.settings.set("NewbieImmunity", "0")
u1:clear_orders()
u1:add_order("ATTACKIERE " .. itoa36(u2.id))
u2:clear_orders()
@ -109,6 +110,7 @@ function test_force_leave_postcombat()
end
end
assert_not_equal(nil, u3)
assert_equal(nil, u2.building)
assert_equal(nil, u3.building)
assert_equal(1, u3.number)
end

View File

@ -8,6 +8,8 @@ function setup()
eressea.settings.set("rules.grow.formula", "0")
eressea.settings.set("rules.peasants.growth.factor", "0")
eressea.settings.set("volcano.active.percent", "0")
eressea.settings.set("volcano.outbreak.percent", "0")
eressea.settings.set("volcano.stop.percent", "0")
end
function test_snowglobe_fail()
@ -44,23 +46,17 @@ function test_snowglobe()
local r2 = region.create(1, 0, "ocean")
local f = faction.create("snowglobe2@eressea.de", "human", "de")
local u = unit.create(f, r1, 1)
local have = 6
local fail = 0
u:add_item("snowglobe", have)
local xform = { ocean = "glacier", glacier = "glacier", firewall = "volcano", volcano = "mountain", desert = "plain", plain = "plain" }
u:clear_orders()
u:add_order("BENUTZEN 1 Schneekugel Ost")
local xform = { ocean = "glacier", glacier = "glacier", firewall = "volcano", desert = "plain", volcano = "mountain", plain = "plain" }
for k, v in pairs(xform) do
r2.terrain = k
process_orders()
use_snowglobe(u, 1, "Ost", nil)
assert_equal(v, r2.terrain)
if k~=v then
have=have - 1
else
if k==v then
fail = fail + 1
assert_equal(fail, f:count_msg_type('target_region_invalid'))
end
assert_equal(have, u:get_item("snowglobe"))
end
end

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