- Spezialeigenschaften verbessert.

- Prototyp für einen Algorithmus zur Ermittlung von Schlachten und
  Angriffen bei Einführung von VORRÜCKEN, in python.
This commit is contained in:
Christian Schlittchen 2001-03-07 15:00:18 +00:00
parent 435e98f50c
commit 7d70ca82b5
10 changed files with 303 additions and 16 deletions

View File

@ -437,7 +437,7 @@ cr_output_unit(FILE * F, region * r,
} }
if(u->faction != f && a_fshidden if(u->faction != f && a_fshidden
&& a_fshidden->data.ca[0] == 1 && effskill(u, SK_STEALTH) >= 5) { && a_fshidden->data.ca[0] == 1 && effskill(u, SK_STEALTH) >= 6) {
fprintf(F, "-1;Anzahl\n"); fprintf(F, "-1;Anzahl\n");
} else { } else {
fprintf(F, "%d;Anzahl\n", u->number); fprintf(F, "%d;Anzahl\n", u->number);
@ -546,7 +546,7 @@ cr_output_unit(FILE * F, region * r,
if (f == u->faction || u->faction->race==RC_ILLUSION) { if (f == u->faction || u->faction->race==RC_ILLUSION) {
show = u->items; show = u->items;
} else if (itemcloak==false && mode>=see_unit && !(a_fshidden } else if (itemcloak==false && mode>=see_unit && !(a_fshidden
&& a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 2)) { && a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 3)) {
show = NULL; show = NULL;
for (itm=u->items;itm;itm=itm->next) { for (itm=u->items;itm;itm=itm->next) {
item * ishow; item * ishow;

View File

@ -2565,7 +2565,7 @@ ageing(void)
static int static int
maxunits(faction *f) maxunits(faction *f)
{ {
return MAXUNITS + 250 * fspecial(f, FS_ADMINISTRATOR); return MAXUNITS + 400 * fspecial(f, FS_ADMINISTRATOR);
} }
static void static void

View File

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* $Id: karma.c,v 1.3 2001/02/28 18:25:25 corwin Exp $ * $Id: karma.c,v 1.4 2001/03/07 15:00:18 corwin Exp $
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -88,7 +88,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = {
false false
}, },
{ {
"Krieger", "Barbar",
"Einheiten dieser Partei erhalten durch Lernen von Waffentalenten " "Einheiten dieser Partei erhalten durch Lernen von Waffentalenten "
"(Taktik und Reiten zählen nicht dazu!) 40 statt 30 Lerntage. Weitere " "(Taktik und Reiten zählen nicht dazu!) 40 statt 30 Lerntage. Weitere "
"Stufen erhöhen den Bonus um +5/+10. Die Fokussierung auf das " "Stufen erhöhen den Bonus um +5/+10. Die Fokussierung auf das "
@ -133,9 +133,9 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = {
{ {
"Administrator", "Administrator",
"Das Einheitenlimit einer Partei mit dieser Eigenschaft erhöht sich um " "Das Einheitenlimit einer Partei mit dieser Eigenschaft erhöht sich um "
"250 Einheiten. Leider verschlingt der Verwaltungsaufwand viel Silber, " "400 Einheiten. Leider verschlingt der Verwaltungsaufwand viel Silber, "
"so dass sich der Unterhalt pro Person um 1 Silberstück erhöht. Weitere " "so dass sich der Unterhalt pro Person um 1 Silberstück erhöht. Weitere "
"Stufen der Eigenschaft erhöhen das Limit um weitere 250 Einheiten und " "Stufen der Eigenschaft erhöhen das Limit um weitere 400 Einheiten und "
"den Unterhalt um ein weiteres Silberstück.", "den Unterhalt um ein weiteres Silberstück.",
true true
}, },
@ -190,9 +190,9 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = {
{ {
"Versteckt", "Versteckt",
"Eine Partei mit dieser Eigenschaft hat die Fähigkeit zu Tarnung " "Eine Partei mit dieser Eigenschaft hat die Fähigkeit zu Tarnung "
"zur Perfektion getrieben. Jede Einheit mit mindestens Tarnung 2 " "zur Perfektion getrieben. Jede Einheit mit mindestens Tarnung 3 "
"versteckt alle ihre Gegenstände so, daß sie von anderen Parteien " "versteckt alle ihre Gegenstände so, daß sie von anderen Parteien "
"nicht mehr gesehen werden können. Jede Einheit mit mindestens Tarnung 5 " "nicht mehr gesehen werden können. Jede Einheit mit mindestens Tarnung 6 "
"schafft es auch, die Zahl der in ihr befindlichen Personen zu verbergen. " "schafft es auch, die Zahl der in ihr befindlichen Personen zu verbergen. "
"Um diese Eigenschaft steuern zu können, stehen diesen Parteien die " "Um diese Eigenschaft steuern zu können, stehen diesen Parteien die "
"Befehle TARNE ANZAHL [NICHT] und TARNE GEGENSTÄNDE [NICHT] zur " "Befehle TARNE ANZAHL [NICHT] und TARNE GEGENSTÄNDE [NICHT] zur "
@ -208,7 +208,6 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = {
"Woche ihren normalen Tätigkeiten nachzugehen.", "Woche ihren normalen Tätigkeiten nachzugehen.",
false false
}, },
/* TODO: Noch nicht implementiert */
{ {
"Magische Immunität", "Magische Immunität",
"Eine Partei mit dieser Eigenschaft ist völlig immun gegen alle Arten " "Eine Partei mit dieser Eigenschaft ist völlig immun gegen alle Arten "
@ -224,7 +223,6 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = {
"jeweils einem weiteren Magier das Lernen eines anderen Gebiets.", "jeweils einem weiteren Magier das Lernen eines anderen Gebiets.",
true true
}, },
/* TODO: Namen ändern, negative Eigenschaft implementieren */
{ {
"Jihad", "Jihad",
"Eine Partei mit dieser Eigenschaft kann eine (Spieler)-Rasse " "Eine Partei mit dieser Eigenschaft kann eine (Spieler)-Rasse "
@ -554,3 +552,4 @@ jihad_attacks(void)
} }
} }
} }

View File

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* $Id: magic.c,v 1.11 2001/02/18 10:06:09 enno Exp $ * $Id: magic.c,v 1.12 2001/03/07 15:00:18 corwin Exp $
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -1213,6 +1213,8 @@ target_resists_magic(unit *magician, void *obj, int objtyp, int t_bonus)
int at, pa = 0; int at, pa = 0;
skill_t i; skill_t i;
if(fspecial(((unit *)obj)->faction, FS_MAGICIMMUNE)) return true;
at = effskill(magician, SK_MAGIC); at = effskill(magician, SK_MAGIC);
for (i=0;i<MAXSKILLS;i++) { for (i=0;i<MAXSKILLS;i++) {
@ -1445,6 +1447,8 @@ regeneration(unit * u)
double potenz = 1.5; double potenz = 1.5;
double divisor = 2.0; double divisor = 2.0;
if(fspecial(u->faction, FS_MAGICIMMUNE)) return 0;
sk = effskill(u, SK_MAGIC); sk = effskill(u, SK_MAGIC);
/* Rassenbonus/-malus */ /* Rassenbonus/-malus */
d = (int)(pow(sk, potenz) * race[u->race].regaura / divisor); d = (int)(pow(sk, potenz) * race[u->race].regaura / divisor);
@ -1503,7 +1507,7 @@ regeneration_magiepunkte(void)
} }
set_spellpoints(u, min(aura, auramax)); set_spellpoints(u, min(aura, auramax));
/* Zum letzten Mal Spruchliste aktualiesieren */ /* Zum letzten Mal Spruchliste aktualisieren */
updatespelllist(u); updatespelllist(u);
} }
} }

View File

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* $Id: reports.c,v 1.7 2001/02/28 23:28:54 enno Exp $ * $Id: reports.c,v 1.8 2001/03/07 15:00:18 corwin Exp $
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -207,7 +207,7 @@ bufunit(const faction * f, const unit * u, int indent,
} }
scat(", "); scat(", ");
if(u->faction != f && a_fshidden if(u->faction != f && a_fshidden
&& a_fshidden->data.ca[0] == 1 && effskill(u, SK_STEALTH) >= 5) { && a_fshidden->data.ca[0] == 1 && effskill(u, SK_STEALTH) >= 6) {
scat("? "); scat("? ");
} else { } else {
icat(u->number); icat(u->number);
@ -270,7 +270,7 @@ bufunit(const faction * f, const unit * u, int indent,
if (f == u->faction || telepath_see || u->faction->race==RC_ILLUSION) { if (f == u->faction || telepath_see || u->faction->race==RC_ILLUSION) {
show = u->items; show = u->items;
} else if (!itemcloak && mode >= see_unit && !(a_fshidden } else if (!itemcloak && mode >= see_unit && !(a_fshidden
&& a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 2)) { && a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 3)) {
show = NULL; show = NULL;
for (itm=u->items;itm;itm=itm->next) { for (itm=u->items;itm;itm=itm->next) {
item * ishow; item * ishow;

View File

@ -0,0 +1,119 @@
#!/usr/bin/python
from Stack import *
class Node:
def __init__(self, obj):
self.obj = obj
self.marker = 0
class Vertex:
def __init__(self, node1, node2):
self.nodes = (node1, node2)
self.marker = 0
class Graph:
def __init__(self):
self.nodes = []
self.vertices = []
def remove_node(self, node):
self.nodes.remove(node)
for v in self.vertices:
if v.nodes[0] == node or v.nodes[1] == node:
self.vertices.remove(v)
def find_node(self, obj):
for n in self.nodes:
if n.obj == obj:
return n
return None
def neighbours(self, node):
n = []
for v in self.vertices:
if v.nodes[0] == node and v.nodes[1] not in n:
n.append(v.nodes[1])
elif v.nodes[1] == node and v.nodes[0] not in n:
n.append(v.nodes[0])
return n
def reset_marker(self):
for n in self.nodes:
n.marker = 0
for v in self.vertices:
v.marker = 0
def dsearch(self,node):
reset_marker()
dg = [node]
s = Stack()
node.marker = 1
s.push(node)
while not s.empty():
n = s.pop()
for nb in self.neighbours(n):
if nb.marker == 0:
nb.marker = 1
dg.append(nb)
s.push(nb)
return dg
def dgraphs(self):
rl = []
nodelist = self.nodes[:]
while nodelist != []:
start = nodelist.pop()
self.reset_marker()
g = Graph()
g.nodes.append(start)
start.marker = 1
s = Stack()
s.push(start)
while not s.empty():
tnode = s.pop()
for nb in self.neighbours(tnode):
if nb.marker == 0:
nb.marker = 1
g.nodes.append(nb)
nodelist.remove(nb)
s.push(nb)
for v in self.vertices:
if v.nodes[0] in g.nodes:
g.vertices.append(v)
rl.append(g)
return rl
# g = Graph()
# n1 = Node(1)
# n2 = Node(2)
# n3 = Node(3)
# n4 = Node(4)
# n5 = Node(5)
# n6 = Node(6)
# g.nodes.append(n1)
# g.nodes.append(n2)
# g.nodes.append(n3)
# g.nodes.append(n4)
# g.nodes.append(n5)
# g.nodes.append(n6)
# g.vertices.append(Vertex(n1,n2))
# g.vertices.append(Vertex(n1,n4))
# g.vertices.append(Vertex(n2,n6))
# for dg in g.dgraphs():
# for e in dg:
# print e.obj,
# print

Binary file not shown.

View File

@ -0,0 +1,17 @@
#!/usr/bin/python
class Stack:
def __init__(self):
self.data = []
def push(self, obj):
self.data.append(obj)
def pop(self):
return self.data.pop()
def empty(self):
if self.data == []:
return 1
return 0

Binary file not shown.

View File

@ -0,0 +1,148 @@
#!/usr/bin/python
# vi:set ts=4:
# Algorithmus zur Berechnung von regionsübergreifenden Schlachten.
# Testprogramm.
# 1) Graph aufbauen aus alle Attackierern und allen direkt attackierten
# 2) Helfer in den Graphen aufnehmen
# 3) Disjunkte Teilgraphen ermitteln
# 4) Innerhalb der Teilgraphen die 'Wer-schlägt-wen-Beziehung' aufbauen
import re
from Stack import *
from Graph import *
class heer:
def __init__(self, rx, ry, f, o):
self.rx = rx
self.ry = ry
self.f = f
self.o = o
self.attacked = []
def toString(self):
return "("+self.f+","+str(self.rx)+","+str(self.ry)+")"
def dist(x1, y1, x2, y2):
dx = x1 - x2
dy = y1 - y2
if dy < 0:
dy = -dy
dx = -dx
if dx >= 0:
return dx + dy;
if -dx >= dy:
return -dx
return dy
def is_neighbour(h, r1, r2):
x1 = r1[0]
y1 = r1[1]
x2 = r2[0]
y2 = r2[1]
if dist(h.rx, h.ry, x1, y1) <= 1 and dist(h.rx, h.ry, x2, y2) <= 1:
return 1
return 0
heere = [
Node(heer(0,-2, 'D', 'A->C:1,-3')),
Node(heer(1,-3, 'D', '')),
Node(heer(1,-2, 'D', '')),
Node(heer(2,-3, 'D', 'A->C:1,-3')),
Node(heer(1,-2, 'C', 'L->D')),
Node(heer(1,-3, 'C', 'A->D:1,-2')),
Node(heer(0, 0, 'A', '')),
Node(heer(0, 0, 'B', 'L->A'))
]
def find_heer_node(x, y, f):
for node in heere:
h = node.obj
if h.rx == x and h.ry == y and h.f == f:
return node
return None
def allied(f1, f2):
if f1 == f2:
return 1
return 0
g1 = Graph()
a_re = re.compile('A->(\w):(-?\d+),(-?\d+)')
l_re = re.compile('L->(\w)')
# Schritt 1
for node in heere:
f = ''
h = node.obj
mo = a_re.match(h.o)
if mo != None:
f = mo.group(1)
x = int(mo.group(2))
y = int(mo.group(3))
mo = l_re.match(h.o)
if mo != None:
f = mo.group(1)
x = h.rx
y = h.ry
if f != '':
tnode = find_heer_node(x,y,f)
if node not in g1.nodes:
g1.nodes.append(node)
if tnode not in g1.nodes:
g1.nodes.append(tnode)
g1.vertices.append(Vertex(node,tnode))
tnode.obj.attacked.append((x,y,node))
# Schritt 2
for node1 in g1.nodes:
heer1 = node1.obj
for attack in heer1.attacked:
attacker_node = attack[2]
for node2 in heere:
heer2 = node2.obj
# heer 1 ist der angegriffene
# heer 2 der potentielle Helfer
if heer1 != heer2 and allied(heer1.f,heer2.f) and not allied(heer2.f, attacker_node.obj.f):
if is_neighbour(heer2, (heer1.rx, heer1.ry), attack):
if node2 not in g1.nodes:
g1.nodes.append(node2)
g1.vertices.append(Vertex(attacker_node,node2))
# Schritt 3
battles = g1.dgraphs()
count = 1
for battle in battles:
print "Schlacht "+str(count),
count = count + 1
for node in battle.nodes:
heer = node.obj
print heer.toString()+",",
print
# Schritt 4
for node in battle.nodes:
heer = node.obj
print "\tHeer "+str(heer.toString())+" attackiert gegen",
for enemy in battle.neighbours(node):
print str(enemy.obj.toString())+",",
print