Benutzer:Count Ypsilon/Skript:npclist.pl

aus FreewarWiki, der Referenz für Freewar
Version vom 28. September 2011, 12:49 Uhr von Arbiedz (Diskussion | Beiträge) (Schützte „Benutzer:Count Ypsilon/Skript:npclist.pl“: Spam ([edit=autoconfirmed] (unbeschränkt) [move=autoconfirmed] (unbeschränkt)))
(Unterschied) ← Nächstältere Version | ↑ Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Dieses Skript erzeugt eine Liste aller im Wiki verzeichneten NPCs. In der Ausgabedatei steht jede Zeile für ein NPC und hat den Inhalt

NPC-Name;Angriffsstärke;LP;XP;GM;Vorkommen;Drops;Bild-URL;Bild-Autor

Vorkommen ist dabei eine durch / separierte Liste der unter "Vorkommen" gelisteten Gebiete. Falls explizite Felder gelistet sind, werden diese im Vorkommen in der Form X,Y verzeichnet.

Das Skript arbeitet nun mit dem Source der Wiki-Seiten, ist dafür allerdings auf die Verwendung der NPC-Vorlagen angewiesen. Für NPCs, die die Vorlage emulieren, muss ein Extra-Datenblock eingebaut werden, wie beispielsweise eine frühere Version von Windgeist (Quest).

#!/usr/bin/perl

use strict;
use LWP::UserAgent;
use URI::Escape;
use HTTP::Request;



my $ua = LWP::UserAgent->new();
my $host = "http://www.fwwiki.de";
my $url = $host . "/index.php/Kategorie:NPCs";
my @urllist;




push(@urllist, $url);


# als erstes die URLs aufsammeln, die auf die aufeinanderfolgenden Kategorieseiten verweisen:
while($url ne "")  {
	my $request = HTTP::Request->new("GET", $url);
	my $response = $ua->simple_request($request);
	my $c = $response->content();


	$url = "";
	if ($c =~ /(<a [^>]*Kategorie:NPCs[^<]*)(n[^<]*chste \d+)/im) { # Zeichenkette mit der Angabe "nächste n" ermitteln
		# $1 enthält jetzt die URL im Format <a ... href="..." ... >
		$c = $1;
		# print "HTML-URL: " . $c . "\n";
		if ($c =~ /href=\"([^\"]*)/im) { # ... aus href="..." rausfummeln
 			$url = $host . $1;
 			$url =~ s/&/&/g;
 			push(@urllist, $url);
		}
	}
}

# Nun die Kategorieseiten abarbeiten:

foreach (@urllist) {
	my $request = HTTP::Request->new("GET", $_);
	my $response = $ua->simple_request($request);
	my $c = $response->content();

	while($c =~ /<a([^>]*)>([^<]*)<\/a>/gm) {
		my ($anchor, $text) = ($1, $2);
		my $href;
		$href = $1 if ($anchor =~ /href\s*=\s*"([^"]*)"/);
		$href =~ s/&/&/g;
		my $title;
		$title = $1 if ($anchor =~ /title\s*=\s*"([^"]*)"/);
		next if ($href eq "");
		registerNpc($text, $host.$href) if ($title eq $text);
	}
}


sub trim($)
{
	my $string = shift;
	$string =~ s/^\s+//;
	$string =~ s/\s+$//;
	return $string;
}


 sub registerNpc
 {
	my ($text, $href) = @_;
	my $request = HTTP::Request->new("GET", $href."?action=edit");
	my $response = $ua->simple_request($request);
	my $c = $response->content();
	$c =~ tr/\n/ /;

	my $atk;
	my $xp;
	my $lp;
	my $gm;
	my $drops;
	my $bild;
	my $bildautor;
	my @vklist;
	my @itemlist;
	$atk = $1 if ($c =~ /\|\s*St..?rke\s*=\s*(\d+)/i);
	$lp = $1.$3 if ($c =~ /\|\s*Lebenspunkte\s*=\s*(\d+)(\.(\d+))?/i);
	$xp = $1 if ($c =~ /\|\s*XP\s*=\s*(\d+)/i);
	$gm = $1 if ($c =~ /\|\s*Gold\s*=\s*(\d+)/i);
	$bild = trim($1) if ($c =~ /\|\s*Bild\s*=\s*([^|}]*)/i);
	$bildautor = trim($1) if ($c =~ /\|\s*Bildautor\s*=\s*([^|}]*)/i);

	if ($c=~ /\|Vorkommen\s*=\s([^=]*)/) {
		my $vk=$1;
		while ($vk =~ /\*\s*\[\[([^\]]+)\]\]/ogm) {
			my $area = $1;
			$area = $1 if ($area =~ /(.*)\|/);
			push(@vklist, $area);
		}
	}
	if ($c=~ /\|Items\s*=\s([^=]*)/) {
		my $it=$1;
		while ($it =~ /\*\s*\[\[([^\]]+)\]\]/og) {
			push(@itemlist, $1);
 		}
	}
	while ($c=~/\{\{Feld\|[^|]+\|[^|]+\|(\d+)\|(\d+)\}\}/ogm) {
		push(@vklist, "$1,$2");
	}

	if ($atk>0) {
		print "$text;$atk;$lp;$xp;$gm;";
		print join("/", @vklist);
		print ";";
		print join("/", @itemlist);
		print ";$bild;$bildautor";
		print "\n";
	}
}