diff --git a/src/common/items/artrewards.c b/src/common/items/artrewards.c index 1ca627a9e..849649a19 100644 --- a/src/common/items/artrewards.c +++ b/src/common/items/artrewards.c @@ -1,38 +1,38 @@ /* vi: set ts=2: - * - * Eressea PB(E)M host Copyright (C) 1998-2003 - * Christian Schlittchen (corwin@amber.kn-bremen.de) - * Katja Zedel (katze@felidae.kn-bremen.de) - * Henning Peters (faroul@beyond.kn-bremen.de) - * Enno Rehling (enno@eressea-pbem.de) - * Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de) - * - * This program may not be used, modified or distributed without - * prior permission by the authors of Eressea. - */ +* +* Eressea PB(E)M host Copyright (C) 1998-2003 +* Christian Schlittchen (corwin@amber.kn-bremen.de) +* Katja Zedel (katze@felidae.kn-bremen.de) +* Henning Peters (faroul@beyond.kn-bremen.de) +* Enno Rehling (enno@eressea-pbem.de) +* Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de) +* +* This program may not be used, modified or distributed without +* prior permission by the authors of Eressea. +*/ #include #include #include "artrewards.h" /* kernel includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* gamecode includes */ -#include +#include /* util includes */ -#include -#include +#include +#include /* libc includes */ #include @@ -46,20 +46,20 @@ static int age_peaceimmune(attrib * a) { - return --a->data.i; + return --a->data.i; } static attrib_type at_peaceimmune = { - "peaceimmune", - NULL, NULL, - age_peaceimmune, - a_writedefault, - a_readdefault + "peaceimmune", + NULL, NULL, + age_peaceimmune, + a_writedefault, + a_readdefault }; static int use_hornofdancing(struct unit * u, const struct item_type * itype, - int amount, const char *cm) + int amount, const char *cm) { region *r; int regionsPacified = 0; @@ -88,29 +88,29 @@ use_hornofdancing(struct unit * u, const struct item_type * itype, if(regionsPacified > 0) { ADDMSG(&u->faction->msgs, msg_message("hornofpeace_u_success", - "unit region command pacified", u, u->region, cm, regionsPacified)); + "unit region command pacified", u, u->region, cm, regionsPacified)); } else { ADDMSG(&u->faction->msgs, msg_message("hornofpeace_u_nosuccess", - "unit region command", u, u->region, cm)); + "unit region command", u, u->region, cm)); } return 0; } static resource_type rt_hornofdancing = { - { "hornofdancing", "hornofdancing_p" }, - { "hornofdancing", "hornofdancing_p" }, - RTF_ITEM, - &res_changeitem + { "hornofdancing", "hornofdancing_p" }, + { "hornofdancing", "hornofdancing_p" }, + RTF_ITEM, + &res_changeitem }; item_type it_hornofdancing = { - &rt_hornofdancing, /* resourcetype */ - 0, 1, 0, /* flags, weight, capacity */ - NULL, /* construction */ - &use_hornofdancing, - NULL, - NULL + &rt_hornofdancing, /* resourcetype */ + 0, 1, 0, /* flags, weight, capacity */ + NULL, /* construction */ + &use_hornofdancing, + NULL, + NULL }; @@ -118,13 +118,13 @@ item_type it_hornofdancing = { static int use_trappedairelemental(struct unit * u, const struct item_type * itype, - int amount, const char *cm) + int amount, const char *cm) { curse *c; int shipId; ship *sh; - shipId = getshipid(); + shipId = getshipid(); if(shipId <= 0) { cmistake(u, cm, 20, MSG_MOVE); return 0; @@ -137,34 +137,34 @@ use_trappedairelemental(struct unit * u, const struct item_type * itype, } c = create_curse(u, &sh->attribs, ct_find("shipspeedup"), - 20, 999999, SPEEDUP, 0); + 20, 999999, SPEEDUP, 0); curse_setflag(c, CURSE_NOAGE); ADDMSG(&u->faction->msgs, msg_message("trappedairelemental_success", - "unit region command ship", u, u->region, cm, sh)); + "unit region command ship", u, u->region, cm, sh)); return 1; } static resource_type rt_trappedairelemental = { - { "trappedairelemental", "trappedairelemental_p" }, - { "trappedairelemental", "trappedairelemental_p" }, - RTF_ITEM, - &res_changeitem + { "trappedairelemental", "trappedairelemental_p" }, + { "trappedairelemental", "trappedairelemental_p" }, + RTF_ITEM, + &res_changeitem }; item_type it_trappedairelemental = { - &rt_trappedairelemental, /* resourcetype */ - 0, 1, 0, /* flags, weight, capacity */ - NULL, /* construction */ - &use_trappedairelemental, - NULL, - NULL + &rt_trappedairelemental, /* resourcetype */ + 0, 1, 0, /* flags, weight, capacity */ + NULL, /* construction */ + &use_trappedairelemental, + NULL, + NULL }; static int use_aurapotion50(struct unit * u, const struct item_type * itype, - int amount, const char *cm) + int amount, const char *cm) { if(!is_mage(u)) { cmistake(u, cm, 214, MSG_MAGIC); @@ -174,25 +174,25 @@ use_aurapotion50(struct unit * u, const struct item_type * itype, change_spellpoints(u, 50); ADDMSG(&u->faction->msgs, msg_message("aurapotion50", - "unit region command", u, u->region, cm)); + "unit region command", u, u->region, cm)); return 1; } static resource_type rt_aurapotion50 = { - { "aurapotion50", "aurapotion50_p" }, - { "aurapotion50", "aurapotion50_p" }, - RTF_ITEM, - &res_changeitem + { "aurapotion50", "aurapotion50_p" }, + { "aurapotion50", "aurapotion50_p" }, + RTF_ITEM, + &res_changeitem }; item_type it_aurapotion50 = { - &rt_aurapotion50, /* resourcetype */ - 0, 1, 0, /* flags, weight, capacity */ - NULL, /* construction */ - &use_aurapotion50, - NULL, - NULL + &rt_aurapotion50, /* resourcetype */ + 0, 1, 0, /* flags, weight, capacity */ + NULL, /* construction */ + &use_aurapotion50, + NULL, + NULL }; #define BAGPIPEFRACTION dice_rand("2d4+2") @@ -200,7 +200,7 @@ item_type it_aurapotion50 = { static int use_bagpipeoffear(struct unit * u, const struct item_type * itype, - int amount, const char *cm) + int amount, const char *cm) { int money; @@ -214,31 +214,107 @@ use_bagpipeoffear(struct unit * u, const struct item_type * itype, rsetmoney(u->region, rmoney(u->region) - money); create_curse(u, &u->region->attribs, ct_find("depression"), - 20, BAGPIPEDURATION, 0, 0); - + 20, BAGPIPEDURATION, 0, 0); + ADDMSG(&u->faction->msgs, msg_message("bagpipeoffear_faction", - "unit region command money", u, u->region, cm, money)); - + "unit region command money", u, u->region, cm, money)); + ADDMSG(&u->region->msgs, msg_message("bagpipeoffear_region", - "unit money", u, money)); + "unit money", u, money)); return 0; } static resource_type rt_bagpipeoffear = { - { "bagpipeoffear", "bagpipeoffear_p" }, - { "bagpipeoffear", "bagpipeoffear_p" }, - RTF_ITEM, - &res_changeitem + { "bagpipeoffear", "bagpipeoffear_p" }, + { "bagpipeoffear", "bagpipeoffear_p" }, + RTF_ITEM, + &res_changeitem }; item_type it_bagpipeoffear = { - &rt_bagpipeoffear, /* resourcetype */ - 0, 1, 0, /* flags, weight, capacity */ - NULL, /* construction */ - &use_bagpipeoffear, - NULL, - NULL + &rt_bagpipeoffear, /* resourcetype */ + 0, 1, 0, /* flags, weight, capacity */ + NULL, /* construction */ + &use_bagpipeoffear, + NULL, + NULL +}; + +static int +use_instantartacademy(struct unit * u, const struct item_type * itype, + int amount, const char *cm) +{ + building *b; + + if(u->region->land == NULL) { + cmistake(u, cm, 242, MSG_MAGIC); + return 0; + } + + b = new_building(bt_find("artacademy"), u->region, u->faction->locale); + b->size = 100; + sprintf(buf, "%s", LOC(u->faction->locale, "artacademy")); + set_string(&b->name, buf); + + ADDMSG(&u->region->msgs, msg_message( + "artacademy_create", "unit command", u, cm)); + + return 1; +} + +static resource_type rt_instantartacademy = { + { "instantartacademy", "instantartacademy_p" }, + { "instantartacademy", "instantartacademy_p" }, + RTF_ITEM, + &res_changeitem +}; + +item_type it_instantartacademy = { + &rt_instantartacademy, /* resourcetype */ + 0, 1, 0, /* flags, weight, capacity */ + NULL, /* construction */ + &use_instantartacademy, + NULL, + NULL +}; + +static int +use_instantartsculpture(struct unit * u, const struct item_type * itype, + int amount, const char *cm) +{ + building *b; + + if(u->region->land == NULL) { + cmistake(u, cm, 242, MSG_MAGIC); + return 0; + } + + b = new_building(bt_find("artsculpture"), u->region, u->faction->locale); + b->size = 100; + sprintf(buf, "%s", LOC(u->faction->locale, "artsculpture")); + set_string(&b->name, buf); + + ADDMSG(&u->region->msgs, msg_message( + "artsculpture_create", "unit region command", u, cm)); + + return 1; +} + +static resource_type rt_instantartsculpture = { + { "instantartsculpture", "instantartsculpture_p" }, + { "instantartsculpture", "instantartsculpture_p" }, + RTF_ITEM, + &res_changeitem +}; + +item_type it_instantartsculpture = { + &rt_instantartsculpture, /* resourcetype */ + 0, 1, 0, /* flags, weight, capacity */ + NULL, /* construction */ + &use_instantartsculpture, + NULL, + NULL }; static int @@ -335,4 +411,3 @@ register_artrewards(void) it_register(&it_instantartsculpture); register_function((pf_generic)use_instantartsculpture, "instantartsculpture"); } - diff --git a/src/common/items/items.vcproj b/src/common/items/items.vcproj index e06b8fcc5..d17e076a1 100644 --- a/src/common/items/items.vcproj +++ b/src/common/items/items.vcproj @@ -120,6 +120,9 @@ + + @@ -151,6 +154,9 @@ RelativePath=".\xerewards.h"> + + diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index 05bb73e5d..e2cf54dbf 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -377,7 +377,9 @@ troop select_corpse(battle * b, fighter * af) /* Wählt eine Leiche aus, der af hilft. casualties ist die Anzahl der * Toten auf allen Seiten (im Array). Wenn af == NULL, wird die - * Parteizugehörigkeit ignoriert, und irgendeine Leiche genommen. */ + * Parteizugehörigkeit ignoriert, und irgendeine Leiche genommen. + * + * Untote werden nicht ausgewählt (casualties, not dead) */ { troop dt = {0, 0}; @@ -2307,16 +2309,17 @@ aftermath(battle * b) #ifdef TROLLSAVE /* Trolle können regenerieren */ - if (df->alive > 0 && dead && old_race(du->race) == RC_TROLL) { + if (df->alive > 0 && dead>0 && old_race(du->race) == RC_TROLL) { for (i = 0; i != dead; ++i) { if (chance(TROLL_REGENERATION)) { ++df->alive; ++df->side->alive; ++df->side->battle->alive; ++trollsave[df->side->index]; - --dead; + /* do not change dead here, or loop will not terminate! recalculate later */ } } + dead = du->number - df->alive - df->run.number; } #endif /* Regeneration durch PR_MERCY */ @@ -2326,19 +2329,23 @@ aftermath(battle * b) ++df->alive; ++df->side->alive; ++df->side->battle->alive; - --dead; + /* do not change dead here, or loop will not terminate! recalculate later */ } } + dead = du->number - df->alive - df->run.number; } - /* Tote, die wiederbelebt werde können */ + /* tote insgesamt: */ + df->side->dead += dead; + /* Tote, die wiederbelebt werde können: */ if (playerrace(df->unit->race)) { df->side->casualties += dead; } #ifdef SHOW_KILLS if (df->hits + df->kills) { - struct message * m = new_message(du->faction, "killsandhits%u:unit%i:hits%i:kills", du, df->hits, df->kills); + struct message * m = msg_message("killsandhits", "unit hits kills", du, df->hits, df->kills); message_faction(b, du->faction, m); + msg_release(m); } #endif } @@ -2372,7 +2379,6 @@ aftermath(battle * b) relevant = true; } s->flee = 0; - s->dead = 0; cv_foreach(df, s->fighters) { unit *du = df->unit; @@ -2394,8 +2400,6 @@ aftermath(battle * b) sum_hp += df->person[n].hp; } - s->dead += dead; - if (df->alive == du->number) continue; /* nichts passiert */ /* die weggerannten werden später subtrahiert! */ diff --git a/src/common/kernel/battle.h b/src/common/kernel/battle.h index 36296ab1c..ce32decdf 100644 --- a/src/common/kernel/battle.h +++ b/src/common/kernel/battle.h @@ -92,7 +92,7 @@ extern "C" { int removed; /* stoned */ int flee; int dead; - int casualties; + int casualties; /* those dead that were real people, not undead! */ int healed; boolean dh; boolean stealth; /* Die Einheiten sind getarnt */ diff --git a/src/common/kernel/combatspells.c b/src/common/kernel/combatspells.c index 2b7696692..b0ce40ecb 100644 --- a/src/common/kernel/combatspells.c +++ b/src/common/kernel/combatspells.c @@ -941,7 +941,7 @@ sp_chaosrow(fighter * fi, int level, double power, spell * sp) n = df->unit->number; if (chance(power/n)) { - row = statusrow(df->status); + row = statusrow(df->status)+FIRST_ROW; df->side->size[row] -= df->alive; if (df->unit->race->battle_flags & BF_NOBLOCK) { df->side->nonblockers[row] -= df->alive; @@ -1569,6 +1569,9 @@ sp_reanimate(fighter * fi, int level, double power, spell * sp) ++t.fighter->side->size[t.fighter->unit->status + 1]; ++t.fighter->side->healed; --t.fighter->side->casualties; + assert(t.fighter->side->casualties>=0); + --t.fighter->side->dead; + assert(t.fighter->side->dead>=0); ++j; } } @@ -1712,8 +1715,8 @@ sp_undeadhero(fighter * fi, int level, double power, spell * sp) int maxrow = AVOID_ROW; cvector *fgs; void **fig; - int n, j, undead = 0; - int k = (int)get_force(power,0); + int n, undead = 0; + int force = (int)get_force(power,0); double c = 0.50 + 0.02 * power; /* Liste aus allen Kämpfern */ @@ -1724,42 +1727,38 @@ sp_undeadhero(fighter * fi, int level, double power, spell * sp) fighter *df = *fig; unit *du = df->unit; - if (!k) - break; + if (force<=0) break; /* keine Monster */ - if (!playerrace(du->race)) - continue; + if (!playerrace(du->race)) continue; if (df->alive + df->run.number < du->number) { - j = 0; + int j = 0; /* Wieviele Untote können wir aus dieser Einheit wecken? */ for (n = df->alive + df->run.number; n <= du->number; n++) { - if (!k) break; - if (chance(c)) { - undead++; - j++; - --df->side->casualties; - ++df->side->alive; - --k; + ++j; + if (--force<=0) break; } } if (j > 0) { int hp = unit_max_hp(du); + undead += j; + df->side->casualties -= j; if (j == du->number) { /* Einheit war vollständig tot und konnte vollständig zu * Untoten gemacht werden */ int nr; + df->side->dead -= j; + df->side->alive += j; du->race = new_race[RC_UNDEAD]; setguard(du, GUARD_NONE); u_setfaction(du,mage->faction); if (fval(mage, UFL_PARTEITARNUNG)) fset(du, UFL_PARTEITARNUNG); - df->alive = du->number; /* den Toten wieder volle Hitpoints geben */ for (nr = 0; nr != df->alive; ++nr) { df->person[nr].hp = hp; diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c index 895878628..43fb720b1 100644 --- a/src/common/kernel/eressea.c +++ b/src/common/kernel/eressea.c @@ -2694,7 +2694,7 @@ wage(const region *r, const unit *u, boolean img) curse * c; int wage; attrib *a; - building_type *artsculpture_type = bt_find("artsculpture"); + const building_type *artsculpture_type = bt_find("artsculpture"); static const curse_type * drought_ct, * blessedharvest_ct; static boolean init;