diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index c42024fd7..0f5b1e128 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -3313,8 +3313,20 @@ monthly_healing(void) region *r; unit *u; int p; + int healingcurse = 0; + curse *c = NULL; + static const curse_type * heal_ct; + heal_ct = ct_find("healingzone"); for (r = regions; r; r = r->next) { + if (heal_ct) { + /* bonus zurücksetzen */ + healingcurse = 0; + c = get_curse(r->attribs, heal_ct); + if (c) { + healingcurse = curse_geteffect(c); + } + } for (u = r->units; u; u = u->next) { int umhp; @@ -3348,10 +3360,22 @@ monthly_healing(void) max_unit = max_unit * 3 / 2; } #endif + /* der healing curse verändert den Regenerationsprozentsatz. + * Wenn dies für negative Heilung benutzt wird, kann es zu + * negativen u->hp führen! */ + if (healingcurse != 0) { + p += healingcurse; + } + /* Aufaddieren der geheilten HP. */ - u->hp = min(u->hp + max_unit/(100/p), umhp); - if (u->hp < umhp && (rand() % 10 < max_unit % 10)) + u->hp = min(u->hp + max_unit*p/100, umhp); + if (u->hp < umhp && (rand() % 10 < max_unit % 10)){ ++u->hp; + } + /* soll man an negativer regeneration sterben können? */ + if (u->hp <= 0){ + u->hp = 1; + } } } } diff --git a/src/common/kernel/race.c b/src/common/kernel/race.c index 788ca518c..84ca6ac67 100644 --- a/src/common/kernel/race.c +++ b/src/common/kernel/race.c @@ -285,6 +285,9 @@ unit_max_hp(const unit * u) int h; double p; h = u->race->hitpoints; + static const curse_type * heal_ct; + heal_ct = ct_find("healingzone"); + p = pow(effskill(u, SK_AUSDAUER) / 2.0, 1.5) * 0.2; h += (int) (h * p + 0.5); @@ -293,6 +296,14 @@ unit_max_hp(const unit * u) h *= 2; } + /* der healing curse verändert die maximalen hp */ + if (heal_ct) { + curse *c = get_curse(u->region->attribs, heal_ct); + if (c) { + h = (int) (h * (1.0+(curse_geteffect(c)/100))); + } + } + return h; } /* diff --git a/src/common/kernel/spell.c b/src/common/kernel/spell.c index f0125a607..63da80837 100644 --- a/src/common/kernel/spell.c +++ b/src/common/kernel/spell.c @@ -4481,8 +4481,12 @@ sp_recruit(castorder *co) return 0; } /* Immer noch zuviel auf niedrigen Stufen. Deshalb die Rekrutierungskosten - * mit einfliessen lassen und dafür den Exponenten etwas größer. */ - n = (int)((pow(force, 1.6) * 50)/f->race->recruitcost); + * mit einfliessen lassen und dafür den Exponenten etwas größer. + * Wenn die Rekrutierungskosten deutlich höher sind als der Faktor, + * ist das Verhältniss von ausgegebene Aura pro Bauer bei Stufe 2 + * ein mehrfaches von Stufe 1, denn in beiden Fällen gibt es nur 1 + * Bauer, nur die Kosten steigen. */ + n = (int)((pow(force, 1.6) * 100)/f->race->recruitcost); n = min(rpeasants(r),n); n = max(n, 1); @@ -4501,6 +4505,55 @@ sp_recruit(castorder *co) return cast_level; } +/* ------------------------------------------------------------- */ +/* Name: Wanderprediger - Große Anwerbung + * Stufe: 14 + * Gebiet: Cerddor + * Wirkung: + * Bauern schliessen sich der eigenen Partei an + * ist zusätzlich zur Rekrutierungsmenge in der Region + * */ + +static int +sp_bigrecruit(castorder *co) +{ + unit *u; + faction *f; + int n; + region *r = co->rt; + unit *mage = (unit *)co->magician; + int cast_level = co->level; + int force = co->force; + + f = mage->faction; + + if (rpeasants(r) == 0){ + report_failure(mage, co->order); + return 0; + } + /* Für vergleichbare Erfolge bei unterschiedlichen Rassen die + * Rekrutierungskosten mit einfliessen lassen. */ + n = (int)((force * force * 1000)/f->race->recruitcost); + /* Zufälliger Wert mit n/2 Maximum, mindestens aber force Anzahl */ + n = force+lovar(n); + /* natürlich nur maximal soviele Bauern, wie auch in der Region sind */ + n = min(rpeasants(r),n); + + if(n <= 0){ + report_failure(mage, co->order); + return 0; + } + + rsetpeasants(r, rpeasants(r) - n); + u = create_unit(r, f, n, f->race, 0, (n == 1 ? "Bauer" : "Bauern"), mage); + set_string(&u->thisorder, locale_string(u->faction->locale, "defaultorder")); + + sprintf(buf, "%s konnte %d %s anwerben", unitname(mage), n, + n == 1 ? "Bauer" : "Bauern"); + addmessage(r, mage->faction, buf, MSG_MAGIC, ML_INFO); + return cast_level; +} + /* ------------------------------------------------------------- */ /* Name: Aushorchen * Stufe: 7 @@ -7660,7 +7713,7 @@ spell spelldaten[] = 5, 4, { {R_AURA, 6, SPC_LEVEL}, - {R_MALLORN, 2, SPC_LEVEL}, + {R_MALLORN, 1, SPC_LEVEL}, {R_TREES, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}}, @@ -9513,6 +9566,27 @@ spell spelldaten[] = (spell_f)sp_charmingsong, patzer }, + {SPL_BIGRECRUIT, "Hohe Kunst der Überzeugung", + "Aus 'Wanderungen' von Firudin dem Weisen: " + "'In Weilersweide, nahe dem Wytharhafen, liegt ein kleiner Gasthof, der " + "nur wenig besucht ist. Niemanden bekannt ist, das dieser Hof " + "bis vor einigen Jahren die Bleibe des verbannten Wanderpredigers Grauwolf " + "war. Nachdem er bei einer seiner berüchtigten flammenden Reden fast die " + "gesammte Bauernschaft angeworben hatte, wurde er wegen Aufruhr verurteilt " + "und verbannt. Nur zögerlich war er bereit mir das Geheimniss seiner " + "Überzeugungskraft zu lehren.'", + NULL, + NULL, + M_BARDE, (SPELLLEVEL), 5, 14, + { + {R_AURA, 20, SPC_LEVEL}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}}, + (spell_f)sp_bigrecruit, patzer + }, + {SPL_RALLYPEASANTMOB, "Aufruhr beschwichtigen", "Mit Hilfe dieses magischen Gesangs kann der Magier eine Region in " "Aufruhr wieder beruhigen. Die Bauernhorden werden sich verlaufen " @@ -10366,4 +10440,4 @@ spell spelldaten[] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}}, NULL, NULL } -}; \ No newline at end of file +}; diff --git a/src/common/kernel/spell.h b/src/common/kernel/spell.h index ae9ee86bd..a16004669 100644 --- a/src/common/kernel/spell.h +++ b/src/common/kernel/spell.h @@ -204,6 +204,7 @@ enum { SPL_SHADOWCALL, /* 176? */ SPL_MALLORNTREEGROW, SPL_INVISIBILITY2_ILLAUN, + SPL_BIGRECRUIT, MAXALLSPELLS, NO_SPELL = (spellid_t) -1 }; diff --git a/src/common/spells/regioncurse.c b/src/common/spells/regioncurse.c index a0259ff29..3e888249a 100644 --- a/src/common/spells/regioncurse.c +++ b/src/common/spells/regioncurse.c @@ -359,6 +359,13 @@ static struct curse_type ct_holyground = { "beschützen diese vor dem der dunklen Magie des lebenden Todes.", cinfo_region }; +static struct curse_type ct_healing = { + "healingzone", + CURSETYP_NORM, 0, (M_VIGOUR | M_DURATION), + "Heilung ist in dieser Region magisch beeinflusst.", + cinfo_region +}; + void register_regioncurse(void) @@ -388,6 +395,7 @@ register_regioncurse(void) ct_register(&ct_riotzone); ct_register(&ct_godcursezone); ct_register(&ct_holyground); + ct_register(&ct_healing); } diff --git a/src/eressea/korrektur.c b/src/eressea/korrektur.c index 7c37bc990..24759d4c7 100644 --- a/src/eressea/korrektur.c +++ b/src/eressea/korrektur.c @@ -620,7 +620,7 @@ show_newspells(void) * terminieren */ spellid_t newspellids[] = { - SPL_INVISIBILITY2_ILLAUN, + SPL_BIGRECRUIT, SPL_NOSPELL }; /* die id's der neuen oder veränderten Sprüche werden in newspellids[]