diff --git a/scripts/spelllist/csv2mediawikicmplt.perl b/scripts/spelllist/csv2mediawikicmplt.perl
new file mode 100644
index 000000000..0c2bc1c88
--- /dev/null
+++ b/scripts/spelllist/csv2mediawikicmplt.perl
@@ -0,0 +1,93 @@
+##### convert extracted list to full list
+sub strip {
+ $_[0] =~ s/#(.*)#/\1/g
+
+}
+
+$, = "\t"; # set output field separator
+$\ = "\n"; # set output record separator
+
+$n = "
"; # in-field newline character
+
+$textdelim = "#"; # text delimiter
+
+$lastgebiet="none";
+$lastletter="0";
+
+$lettersorted=1;
+
+while (<>){
+ if (!($_ =~ /^#/)) {
+ chomp;
+ ($gebiet, $name, $beschreibung, $art, $stufe, $rang, $komponenten, $modifikationen, $syntax, $runde) = split($, , $_);
+
+
+ strip($gebiet);
+ if ($schoolsorted){
+ if ("$lastgebiet" ne "$gebiet"){
+ print "";
+ print "== " . $gebiet . " ==";
+ print "";
+ }
+ }
+ if ($lettersorted) {
+ $letter = substr $name, 0, 1;
+ if ("$lastletter" ne "$letter"){
+ print "";
+ print "== " . $letter . ".. ==";
+ print "";
+ }
+ $lastletter = $letter
+ }
+
+ $lastgebiet=$gebiet;
+
+ strip($name);
+
+ strip($beschreibung);
+ $kurzbeschreibung = $beschreibung;
+ $kurzbeschreibung =~ s/^([^.]*.).*$/\1/;
+
+ strip($art);
+ if ("$art" eq "Kampfzauber"){
+ $kart="Kampf";
+ }
+ if ("$art" eq "Präkampfzauber"){
+ $kart="K-Prä";
+ }
+ if ("$art" eq "Postkampfzauber"){
+ $kart="K-Post";
+ }
+ if ("$art" eq "Normaler Zauber"){
+ $kart="Normal";
+ }
+
+ strip($stufe);
+ strip($rang);
+ strip($komponenten);
+
+ strip($modifikationen);
+# $modifikationen =~ s/Fernzauber/Fern/;
+# $modifikationen =~ s/Schiffszauber/Schiff/;
+# $modifikationen =~ s/Seezauber/See/;
+
+ strip($syntax);
+ $syntax =~ s/\\"/"/g;
+
+
+ print "=== " . $name . " ===";
+ print "";
+ print "'''Beschreibung''':
$beschreibung
";
+ print "'''Art''': $art
";
+ print "'''Stufe''': $stufe
";
+ print "'''Rang''': $rang
";
+ print "'''Komponenten''': $komponenten
";
+ print "'''Modifikationen''': $modifikationen
";
+ print "'''Syntax''': $syntax
";
+ print "";
+ }
+}
+
+# von Hand:
+# Nebel der Verwirrung und Schleier der Verwirrung:
+# :!: Diesen Zauber gibt es nicht mehr.
diff --git a/scripts/spelllist/csv2mediawikitable.perl b/scripts/spelllist/csv2mediawikitable.perl
new file mode 100644
index 000000000..d6b555b15
--- /dev/null
+++ b/scripts/spelllist/csv2mediawikitable.perl
@@ -0,0 +1,122 @@
+##### convert extracted list to table (dokuwiki syntax)
+sub strip {
+ $_[0] =~ s/#(.*)#/\1/g
+
+}
+
+$, = "\t"; # set output field separator
+#$\ = "\n"; # set output record separator
+
+$n = "
"; # in-field newline character
+
+$textdelim = "#"; # text delimiter
+
+$lastgebiet="none";
+
+$separate = 0;
+
+my %spells = ();
+
+%Gebiete = ('Cerddor' => 'C', 'Draig' => 'D', 'Gwyrrd' => 'G', 'Illaun' => 'I', 'Tybied' => 'T',
+ 'Gemein' => 'A', 'Kein Magiegebiet' => 'N');
+
+$suffix ="_E3";
+
+while (<>) {
+ chomp;
+ if (!($_ =~ /^#/)) {
+ ($gebiet, $name, $beschreibung, $art, $stufe, $rang, $komponenten, $modifikationen, $syntax, $runde) = split($, , $_);
+
+ strip($gebiet);
+ $gebiet = $Gebiete{$gebiet};
+
+ strip($name);
+
+ strip($beschreibung);
+ $kurzbeschreibung = $beschreibung;
+ $kurzbeschreibung =~ s/^([^.]*.).*$/\1/;
+
+ strip($art);
+ if ("$art" eq "Kampfzauber") {
+ $kart="Kampf";
+ }
+ if ("$art" eq "Präkampfzauber") {
+ $kart="K-Prä";
+ }
+ if ("$art" eq "Postkampfzauber") {
+ $kart="K-Post";
+ }
+ if ("$art" eq "Normaler Zauber") {
+ $kart="Normal";
+ }
+
+ strip($stufe);
+ strip($rang);
+ strip($komponenten);
+
+ strip($modifikationen);
+ $modifikationen =~ s/Fernzauber/Fern/;
+ $modifikationen =~ s/Schiffszauber/Schiff/;
+ $modifikationen =~ s/Seezauber/See/;
+ $modifikationen =~ s/Kann nicht vom Vertrauten gezaubert werden/V<\/sup>/;
+
+ strip($syntax);
+ $syntax =~ s/\\"/"/g;
+
+ if (not exists $spells{$name}) {
+ $spells{$name} = {};
+ foreach my $v (values %Gebiete) {
+ $spells{$name}{$v} = 'N';
+ }
+ }
+
+ $spells{$name}{$gebiet} = 'J';
+ $spells{$name}{'name'} = $name;
+ $spells{$name}{'beschreibung'} = $kurzbeschreibung;
+ $spells{$name}{'art'} = $kart;
+ $spells{$name}{'stufe'} = $stufe;
+ $spells{$name}{'rang'} = $rang;
+ $spells{$name}{'komponenten'} = $komponenten;
+ $spells{$name}{'modifikationen'} = $modifikationen;
+ $spells{$name}{'syntax'} = $syntax;
+ $spells{$name}{'runde'} = $runde;
+ }
+}
+
+print "== Alle Zauber ==\n\n";
+print "{| class=\"wikitable sortable\"\n";
+print "! ";
+foreach my $v (values %Gebiete) {
+ print "$v !! ";
+}
+print "Name !! Kurzbeschreibung !! Art !! Stufe !! Rang !! Komponenten !! Modifikationen\n";
+
+
+foreach my $name (sort { $spells{$a}{'name'} cmp $spells{$b}{'name'} } keys %spells ) {
+
+ $name = $spells{$name}{'name'};
+ $beschreibung = $spells{$name}{'beschreibung'};
+ $art = $spells{$name}{'art'};
+ $stufe = $spells{$name}{'stufe'};
+ $rang = $spells{$name}{'rang'};
+ $komponenten = $spells{$name}{'komponenten'};
+ $modifikationen = $spells{$name}{'modifikationen'};
+ $syntax = $spells{$name}{'syntax'};
+ $runde = $spells{$name}{'runde'};
+
+
+ print "|-\n| ";
+ foreach my $v (values %Gebiete) {
+ print "$spells{$name}{$v} || ";
+ }
+ print "[[Zauberbeschreibungen$suffix#$name|$name]] || $beschreibung || $art || $stufe || $rang || $komponenten || $modifikationen\n";
+}
+
+$\ = "\n"; # set output record separator
+
+print "|}";
+foreach my $k (keys %Gebiete) {
+ print "$Gebiete{$k} $k
";
+}
+print "V Kann nicht vom Vertrauten gezaubert werden
";
+print "";
diff --git a/scripts/spelllist/extract.sh b/scripts/spelllist/extract.sh
new file mode 100644
index 000000000..819fed25c
--- /dev/null
+++ b/scripts/spelllist/extract.sh
@@ -0,0 +1,5 @@
+# run list-spells-e3.lua, e.g. build-x86_64-gcc-Debug/eressea/eressea -v0 list-spells-e3.lua
+# cp ../reports/*nr e3
+cat e3/*nr | perl extractzauber.perl > spells.csv
+cat spells.csv | perl csv2mediawikitable.perl > spelltable.mwiki
+cat spells.csv | perl csv2mediawikicmplt.perl > spelldescriptions.mwiki
diff --git a/scripts/spelllist/extractzauber.perl b/scripts/spelllist/extractzauber.perl
new file mode 100644
index 000000000..0c87eb68a
--- /dev/null
+++ b/scripts/spelllist/extractzauber.perl
@@ -0,0 +1,157 @@
+#!/usr/bin/perl
+eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
+ if $running_under_some_shell;
+ # this emulates #! processing on NIH machines.
+ # (remove #! line above if indigestible)
+
+eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
+ # process any FOO=bar switches
+
+############ EXTRACTZAUBER
+############ Author: stm
+############ Datum 04/09
+############
+############ Filtert Zauberbeschreibung aus NRs nach CSV-Format
+############
+$, = "\t"; # set output field separator
+$\ = "\n"; # set output record separator
+
+$n = "\\\\"; # in-field newline character
+
+$textdelim = "#"; # text delimiter
+$interdelim = ", "; # delimiter inside a record
+
+$zauber = 0;
+
+# Magiegebiet filtern
+
+$runde = $ARGV[0];
+$runde =~ s/^(.*[^0-9])*([0-9]+)-.*[.]nr/\2/;
+
+
+while (<>) {
+ chomp; # strip record separator
+ if (/.*\/(Gwyrrd|Illaun|Cerddor|Tybied|Draig|Gemein|Kein Magiegebiet)/) {
+ $gebiet = $_;
+ $gebiet =~ s/.*\/(Gwyrrd|Illaun|Cerddor|Tybied|Draig|Gemein|Kein Magiegebiet).*$/\1/g;
+# $gebiet = ($s = '.*/([^ ]*).*', s/$s/\1/g);
+ }
+ # Abschnitt Tränke beendet Abschnitt Zauber
+ # Ausgabe des letzen Zaubers
+ if ($zauber==1 && /Neue Tränke/) {
+ if ($name ne '') { #???
+ print $gebiet . $, . $name . $, . $textdelim . $beschreibung . $textdelim . $, . $art .
+
+ $, . $stufe . $, . $rang . $, . $textdelim . $komponenten . $textdelim . $, .
+
+ $modifikationen . $, . $textdelim . $syntax . $textdelim . $, . $runde;
+ }
+ $zauber = 0;
+ }
+ # Abschnitt Aktueller Status beendet Abschnitt Zauber
+ # Ausgabe des letzen Zaubers
+ if ($zauber==1 && /Aktueller Status/) {
+ $zauber = 0;
+ }
+ if (zauber==0 && $_ =~ /.*Neue Zauber.*/) {
+ $zauber = 1;
+ print "#Gebiet" . $, . "Name" . $, . "Beschreibung" . $, . "Art" . $, . "Stufe" . $, . "Rang" . $, . "Komponenten" . $, . "Modifikationen" . $, . "Syntax" . $, . "Runde";
+ print "# Textdelimiter: #" . $, . "" . $, . "" . $, . "" . $, . "" . $, . "" . $, . "" . $, . "" . $, . "" . $, . "";
+ }
+
+ #Beginn eines Zaubers durch Name des Zaubers; beendet Syntaxmodus
+ # Ausgabe letzter Zauber
+ if ($zauber == 1 && $_ =~ /^ *.*$/ && !($_ =~ / *Neue Zauber/)) {
+ $syntaxstart = 0;
+ if ($name ne '') { #???
+ print $gebiet . $, . $name . $, . $textdelim . $beschreibung . $textdelim . $, . $art
+ . $, . $stufe . $, . $rang . $, . $textdelim . $komponenten . $textdelim . $, .
+ $modifikationen . $, . $textdelim . $syntax . $textdelim . $, . $runde;
+ }
+ $name = $_;
+ $name =~ s/^ *([A-Z])/\1/g;
+# $name = ($s = '^ *([A-Z])', s/$s/\1/g);
+ }
+
+ # Art; beendet Beschreibungsmodus
+ if ($zauber==1 && $beschreibungstart==1 && $_ =~ /^ *Art:.*$/) {
+ $beschreibungstart = 0;
+ $art = $_;
+ $art =~ s/ *Art: ([A-Za-z ]*)/\1/;
+ }
+
+ # Wenn in Beschreibungsmodus: Anhägen an Beschreibung
+ if ($zauber==1 && $beschreibungstart == 1) {
+ $line = $_;
+ $line =~ s/^ *//;
+ # Escaping von Sonderzeichen
+ $line =~ s/"/\\\"/g;
+ if ($beschreibung eq '') {
+ $beschreibung = $line;
+ }
+ else {
+ $beschreibung = $beschreibung . ' ' . $line;
+ }
+ }
+ # Start von Beschreibungsmodus
+ if ($zauber == 1 && $_ =~ /^ *Beschreibung:.*$/) {
+ $beschreibungstart = 1;
+ $beschreibung = '';
+ }
+
+ # Stufe
+ if ($zauber == 1 && $_ =~ /^ *Stufe:.*$/) {
+ $stufe = $_;
+ $stufe =~ s/ *Stufe: ([A-Za-z ]*)/\1/;
+ }
+
+ # Rang
+ if ($zauber == 1 && $_ =~ /^ *Rang:.*$/) {
+ $rang = $_;
+ $rang =~ s/ *Rang: ([A-Za-z ]*)/\1/;
+ }
+
+ # Modifikationen; beendet Komponentenmodus
+ if ($zauber==1 && $komponentenstart == 1 && $_ =~ /^ *Modifikationen:.*$/) {
+ $komponentenstart = 0;
+ $modifikationen = $_;
+ $modifikationen =~ s/ *Modifikationen: *([A-Za-z ]*)/\1/;
+ }
+
+ # Komponente hinzufügen
+ if ($zauber==1 && $komponentenstart == 1) {
+ $komp = $_;
+ $komp =~ s/^ *- *//;
+ if ($komponenten eq '') {
+ $komponenten = $komp;
+ }
+ else {
+ $komponenten = $komponenten . $interdelim . $komp;
+ }
+ }
+ # Start Komponentenmodus
+ if ($zauber == 1 && $_ =~ /^ *Komponenten:.*$/) {
+ $komponentenstart = 1;
+ $komponenten = '';
+ }
+
+ # Syntaxzeile hinzufügen mit Escaping
+ if ($zauber==1 && $syntaxstart == 1) {
+ $line = $_;
+ $line =~ s/"/\\\"/g;
+ if ($line ne '') { #???
+ if ($syntax eq '') {
+ $syntax = $line;
+ }
+ else {
+ $syntax = $syntax . $line;
+ }
+ }
+ }
+ # Begin Syntaxmodus
+ if ($zauber == 1 && $_ =~ /^ *Syntax:.*$/) {
+ $syntaxstart = 1;
+ $syntax = '';
+ }
+
+}
diff --git a/scripts/spelllist/list-spells-e3.lua b/scripts/spelllist/list-spells-e3.lua
new file mode 100644
index 000000000..b7c704f3d
--- /dev/null
+++ b/scripts/spelllist/list-spells-e3.lua
@@ -0,0 +1,49 @@
+function list_all_spells()
+ local r = region.create(0, 0, "plain")
+ local schools = {
+ "gray",
+ "illaun",
+ "tybied",
+ "cerddor",
+ "gwyrrd",
+ "draig",
+ "common" }
+
+ for i, school in ipairs(schools) do
+ local f = faction.create("drac@eressea.de", "human", "de")
+ f.name = school
+ f.magic = school
+ f.id = atoi36(school:sub(1,4))
+ local u = unit.create(f, r, 1)
+ u.race="elf"
+ u:set_skill("magic", 50)
+ u.magic=school
+ u:add_all_spells(school)
+ end
+
+ process_orders()
+ write_reports()
+end
+
+
+local path = 'scripts'
+if config.install then
+ path = config.install .. '/' .. path
+end
+package.path = package.path .. ';' .. path .. '/?.lua;' .. path .. '/?/init.lua'
+
+config.rules='e3'
+
+require 'eressea'
+require 'eressea.path'
+require 'eressea.xmlconf'
+
+local rules = {}
+if config.rules then
+ rules = require('eressea.' .. config.rules)
+ eressea.log.info('loaded ' .. #rules .. ' modules for ' .. config.rules)
+else
+ eressea.log.warning('no rule modules loaded, specify a game in eressea.ini or with -r')
+end
+
+list_all_spells()
diff --git a/src/bind_unit.c b/src/bind_unit.c
index 5e06cab37..2c6833735 100755
--- a/src/bind_unit.c
+++ b/src/bind_unit.c
@@ -571,6 +571,26 @@ static int tolua_unit_addspell(lua_State * L)
return 1;
}
+static int tolua_unit_addallspells(lua_State * L)
+{
+ unit *u = (unit *) tolua_tousertype(L, 1, 0);
+ const char *school = tolua_tostring(L, 2, 0);
+ spellbook *book = get_spellbook(school);
+
+ if (book && book->spells) {
+ quicklist *ql;
+ int qi;
+ for (qi = 0, ql = book->spells; ql; ql_advance(&ql, &qi, 1)) {
+ spellbook_entry * sbe = (spellbook_entry *)ql_get(ql, qi);
+ unit_add_spell(u, NULL, sbe->sp, sbe->level);
+ }
+ }
+
+ return 1;
+}
+
+
+
static int tolua_unit_set_racename(lua_State * L)
{
unit *self = (unit *)tolua_tousertype(L, 1, 0);
@@ -1032,6 +1052,7 @@ void tolua_unit_open(lua_State * L)
tolua_variable(L, TOLUA_CAST "race_name", &tolua_unit_get_racename,
&tolua_unit_set_racename);
tolua_function(L, TOLUA_CAST "add_spell", &tolua_unit_addspell);
+ tolua_function(L, TOLUA_CAST "add_all_spells", &tolua_unit_addallspells);
#ifdef TODO /* spellbooks */
tolua_function(L, TOLUA_CAST "remove_spell", &tolua_unit_removespell);
tolua_variable(L, TOLUA_CAST "spells", &tolua_unit_get_spells, 0);