From 29742df5525a6686c5a0eed6409638c3b7dda8eb Mon Sep 17 00:00:00 2001 From: Steffen Mecke Date: Thu, 7 May 2015 18:00:05 +0200 Subject: [PATCH 1/2] added function to list all spells --- scripts/spelllist/list-spells-e3.lua | 49 ++++++++++++++++++++++++++++ src/bind_unit.c | 21 ++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 scripts/spelllist/list-spells-e3.lua 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); From ef061642ed403a100d3ecf1bf0c7556c943c2fae Mon Sep 17 00:00:00 2001 From: Steffen Mecke Date: Thu, 7 May 2015 18:01:35 +0200 Subject: [PATCH 2/2] scripts for converting report files with spell descriptions into MediaWiki pages this was used to create the wiki pages Zauberliste_E3 und Zauberbeschreibungen_E3 --- scripts/spelllist/csv2mediawikicmplt.perl | 93 +++++++++++++ scripts/spelllist/csv2mediawikitable.perl | 122 +++++++++++++++++ scripts/spelllist/extract.sh | 5 + scripts/spelllist/extractzauber.perl | 157 ++++++++++++++++++++++ 4 files changed, 377 insertions(+) create mode 100644 scripts/spelllist/csv2mediawikicmplt.perl create mode 100644 scripts/spelllist/csv2mediawikitable.perl create mode 100644 scripts/spelllist/extract.sh create mode 100644 scripts/spelllist/extractzauber.perl 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 = ''; + } + +}