diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index b0cdc9a03..7c9ac0879 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -70,7 +70,6 @@ #include #include -#define dbgprintf(a) fprintf a; static FILE *bdebug; #undef DELAYED_OFFENSE /* non-guarding factions cannot attack after moving */ @@ -156,20 +155,20 @@ fleeregion(const unit * u) } #endif /* SIMPLE_ESCAPE */ -static char * -sidename(side * s, boolean truename) +static xmlChar * +sidename(side * s) { #define SIDENAMEBUFLEN 256 static char sidename_buf[SIDENAMEBUFLEN]; - if(s->stealthfaction && truename == false) { + if (s->stealthfaction) { snprintf(sidename_buf, SIDENAMEBUFLEN, "%s", factionname(s->stealthfaction)); } else { snprintf(sidename_buf, SIDENAMEBUFLEN, "%s", factionname(s->bf->faction)); } - return sidename_buf; + return (xmlChar *)sidename_buf; } static const char * @@ -224,18 +223,6 @@ armedmen(const unit * u) return n; } -static void -battle_log(const char *s) -{ -#if SHOW_DEBUG - puts(s); - putc('\n'); -#endif - if (bdebug) { - dbgprintf((bdebug, "%s\n", s)); - } -} - void message_all(battle * b, message * m) { @@ -255,35 +242,15 @@ message_all(battle * b, message * m) void battlerecord(battle * b, const char *s) { - struct message * m = msg_message("msg_battle", "string", s); + struct message * m = msg_message("battle_msg", "string", s); message_all(b, m); msg_release(m); } -void -battlemsg(battle * b, unit * u, const char * s) -{ - bfaction * bf; - struct message * m; - plane * p = rplane(b->region); - watcher * w; - - sprintf(buf, "%s %s", unitname(u), s); - m = msg_message("msg_battle", "string", buf); - for (bf=b->factions;bf;bf=bf->next) { - message_faction(b, bf->faction, m); - } - if (p) for (w=p->watchers;w;w=w->next) { - for (bf = b->factions;bf;bf=bf->next) if (bf->faction==w->faction) break; - if (bf==NULL) message_faction(b, w->faction, m); - } - msg_release(m); -} - static void fbattlerecord(battle * b, faction * f, const char *s) { - message * m = msg_message("msg_battle", "string", s); + message * m = msg_message("battle_msg", "string", s); message_faction(b, f, m); msg_release(m); } @@ -945,7 +912,6 @@ terminate(troop dt, troop at, int type, const char *damage, boolean missile) unit *du = df->unit; battle *b = df->side->battle; int heiltrank = 0; - char debugbuf[512]; /* Schild */ void **si; @@ -1054,9 +1020,8 @@ terminate(troop dt, troop at, int type, const char *damage, boolean missile) kritchance = min(0.9, kritchance); while (chance(kritchance)) { - if (battledebug) { - sprintf(debugbuf, "%s/%d landet einen kritischen Treffer", unitid(au), at.index); - battle_log(debugbuf); + if (bdebug) { + fprintf(bdebug, "%s/%d landet einen kritischen Treffer", unitid(au), at.index); } da += dice_rand(damage); } @@ -1136,11 +1101,6 @@ terminate(troop dt, troop at, int type, const char *damage, boolean missile) } } - if (battledebug) { - sprintf(debugbuf, "Verursacht %dTP, Rüstung %d: %d -> %d HP", - da, ar, df->person[dt.index].hp, df->person[dt.index].hp - rda); - } - #ifdef SMALL_BATTLE_MESSAGES if (b->small) { if (rda > 0) { @@ -1156,8 +1116,9 @@ terminate(troop dt, troop at, int type, const char *damage, boolean missile) df->person[dt.index].hp -= rda; if (df->person[dt.index].hp > 0) { /* Hat überlebt */ - if (battledebug) { - battle_log(debugbuf); + if (bdebug) { + fprintf(bdebug, "Damage %d, armor %d: %d -> %d HP\n", + da, ar, df->person[dt.index].hp, df->person[dt.index].hp - rda); } if (au->race == new_race[RC_DAEMON]) { #ifdef TODO_RUNESWORD @@ -1226,9 +1187,9 @@ terminate(troop dt, troop at, int type, const char *damage, boolean missile) return false; } - if (battledebug) { - strcat(debugbuf, ", tot"); - battle_log(debugbuf); + if (bdebug) { + fprintf(bdebug, "Damage %d, armor %d: %d -> %d HP, tot.\n", + da, ar, df->person[dt.index].hp, df->person[dt.index].hp - rda); } #ifdef SMALL_BATTLE_MESSAGES if (b->small) { @@ -1519,7 +1480,6 @@ do_combatmagic(battle *b, combatmagic_t was) double power; const spell *sp; const struct locale * lang = mage->faction->locale; - char cmd[128]; order * ord; switch(was) { @@ -1538,10 +1498,7 @@ do_combatmagic(battle *b, combatmagic_t was) if (sp == NULL) continue; - snprintf(cmd, 128, "%s \"%s\"", - LOC(lang, keywords[K_CAST]), spell_name(sp, lang)); - - ord = parse_order(cmd, lang); + ord = create_order(K_CAST, lang, "'%s'", spell_name(sp, lang)); if (cancast(mage, sp, 1, 1, ord) == false) { free_order(ord); continue; @@ -1616,7 +1573,6 @@ do_combatspell(troop at) void **mg; order * ord; int sl; - char cmd[128]; const struct locale * lang = mage->faction->locale; sp = get_combatspell(mage, 1); @@ -1624,9 +1580,7 @@ do_combatspell(troop at) fi->magic = 0; /* Hat keinen Kampfzauber, kämpft nichtmagisch weiter */ return; } - snprintf(cmd, 128, "%s \"%s\"", - LOC(lang, keywords[K_CAST]), spell_name(sp, lang)); - ord = parse_order(cmd, lang); + ord = create_order(K_CAST, lang, "'%s'", spell_name(sp, lang)); if (cancast(mage, sp, 1, 1, ord) == false) { fi->magic = 0; /* Kann nicht mehr Zaubern, kämpft nichtmagisch weiter */ return; @@ -1849,6 +1803,20 @@ attack_message(const troop at, const troop dt, const weapon * wp, int dist) } #endif +static void +debug_hit(troop at, const weapon * awp, troop dt, const weapon * dwp, int skdiff, int dist, boolean success) +{ + fprintf(bdebug, "%.4s/%d [%6s/%d] %s %.4s/%d [%6s/%d] with %d distance %d", + unitid(at.fighter->unit), at.index, + LOC(default_locale, awp ? resourcename(awp->type->itype->rtype, 0) : "unarmed"), + weapon_effskill(at, dt, awp, true, dist>1), + success?"hits":"misses", + unitid(dt.fighter->unit), dt.index, + LOC(default_locale, dwp ? resourcename(dwp->type->itype->rtype, 0) : "unarmed"), + weapon_effskill(dt, at, dwp, false, dist>1), + skdiff, dist); +} + int hits(troop at, troop dt, weapon * awp) { @@ -1857,8 +1825,6 @@ hits(troop at, troop dt, weapon * awp) battle * b = at.fighter->side->battle; #endif fighter *af = at.fighter, *df = dt.fighter; - unit *au = af->unit, *du = df->unit; - char debugbuf[512]; const armor_type * armor, * shield; int skdiff = 0; int dist = get_unitrow(af, df->side) + get_unitrow(df, af->side) - 1; @@ -1889,25 +1855,14 @@ hits(troop at, troop dt, weapon * awp) /* Verteidiger bekommt eine Rüstung */ armor = select_armor(dt, true); shield = select_armor(dt, false); - sprintf(debugbuf, "%.4s/%d [%6s/%d] attackiert %.4s/%d [%6s/%d] mit %d dist %d", - unitid(au), at.index, - (awp != NULL) ? - locale_string(default_locale, resourcename(awp->type->itype->rtype, 0)) : "unbewaffnet", - weapon_effskill(at, dt, awp, true, dist>1), - unitid(du), dt.index, - (dwp != NULL) ? - locale_string(default_locale, resourcename(dwp->type->itype->rtype, 0)) : "unbewaffnet", - weapon_effskill(dt, at, dwp, false, dist>1), - skdiff, dist); #ifdef SMALL_BATTLE_MESSAGES if (b->small) { smallbuf = attack_message(at, dt, awp, dist); } #endif if (contest(skdiff, armor, shield)) { - if (battledebug) { - strcat(debugbuf, " und trifft."); - battle_log(debugbuf); + if (bdebug) { + debug_hit(at, awp, dt, dwp, skdiff, dist, true); } #ifdef SMALL_BATTLE_MESSAGES if (b->small) { @@ -1917,9 +1872,8 @@ hits(troop at, troop dt, weapon * awp) #endif return 1; } - if (battledebug) { - strcat(debugbuf, "."); - battle_log(debugbuf); + if (bdebug) { + debug_hit(at, awp, dt, dwp, skdiff, dist, false); } #ifdef SMALL_BATTLE_MESSAGES if (b->small) { @@ -2114,9 +2068,8 @@ attack(battle *b, troop ta, const att *a, int numattack) } if (reload && wp && wp->type->reload && !getreload(ta)) { int i = setreload(ta); - if (battledebug) { - sprintf(buf, " Nachladen gesetzt: %d", i); - battle_log(buf); + if (bdebug) { + fprintf(bdebug, " reloading %d turns\n", i); } } } @@ -2712,9 +2665,9 @@ aftermath(battle * b) /* Beute verteilen */ for (l=df->loot; l; l=l->next) { const item_type * itype = l->type; - sprintf(buf, "%s erbeute%s %d %s.", unitname(du), du->number==1?"t":"n", - l->number, locale_string(default_locale, resourcename(itype->rtype, l->number!=1))); - fbattlerecord(b, du->faction, buf); + message * m = msg_message("battle_loot", "unit amount item", du, l->number, itype->rtype); + message_faction(b, du->faction, m); + msg_release(m); i_change(&du->items, itype, l->number); } @@ -2752,12 +2705,11 @@ aftermath(battle * b) free(trollsave); #endif - if (battledebug) { - sprintf(buf, "The battle lasted %d turns, %s and %s.\n", + if (bdebug) { + fprintf(bdebug, "The battle lasted %d turns, %s and %s.\n", b->turn, - b->has_tactics_turn==true?"had a tactic turn":"had no tactic turn", - battle_was_relevant==true?"was relevant":"was not relevant."); - battle_log(buf); + b->has_tactics_turn?"had a tactic turn":"had no tactic turn", + battle_was_relevant?"was relevant":"was not relevant."); } } @@ -2774,8 +2726,8 @@ battle_punit(unit * u, battle * b) spunit(&S, f, u, 4, see_battle); for (x = S; x; x = x->next) { fbattlerecord(b, f, x->s); - if (battledebug && u->faction == f) { - battle_log(x->s); + if (bdebug && u->faction == f) { + fputs(x->s, bdebug); } } if (S) @@ -2824,26 +2776,29 @@ static void print_header(battle * b) { bfaction * bf; + char zText[1024]; for (bf=b->factions;bf;bf=bf->next) { message * m; faction * f = bf->faction; - const char * lastf = NULL; + const xmlChar * lastf = NULL; boolean first = false; side * s; + size_t size; - buf[0] = 0; + zText[0] = 0; + size = sizeof(zText); for (s=b->sides; s; s=s->next) { fighter *df; for (df=s->fighters;df;df=df->next) { if (is_attacker(df)) { - if (first) strcat(buf, ", "); + if (first) size -= strlcat(zText, ", ", size); if (lastf) { - strcat(buf, lastf); + size -= strlcat(zText, (const char *)lastf, size); first = true; } if (seematrix(f, s) == true) - lastf = sidename(s, false); + lastf = sidename(s); else lastf = LOC(f->locale, "unknown_faction_dative"); break; @@ -2851,13 +2806,13 @@ print_header(battle * b) } } if (first) { - strcat(buf, " "); - strcat(buf, LOC(f->locale, "and")); - strcat(buf, " "); + size -= strlcat(zText, " ", size); + size -= strlcat(zText, (const char *)LOC(f->locale, "and"), size); + size -= strlcat(zText, " ", size); } - if (lastf) strcat(buf, lastf); + if (lastf) size -= strlcat(zText, (const char *)lastf, size); - m = msg_message("battle::starters", "factions", buf); + m = msg_message("battle::starters", "factions", zText); message_faction(b, f, m); msg_release(m); } @@ -2871,23 +2826,25 @@ print_stats(battle * b) int i = 0; for (s=b->sides;s;s=s->next) { bfaction *bf; - char *k; ++i; for (bf=b->factions;bf;bf=bf->next) { faction * f = bf->faction; - const char * loc_army = LOC(f->locale, "battle_army"); + const xmlChar * loc_army = LOC(f->locale, "battle_army"); char * bufp; const xmlChar * header; size_t rsize, size; int komma; + const xmlChar * sname = seematrix(f, s) ? sidename(s) : LOC(f->locale, "unknown_faction"); + message * msg; + char buf[1024]; fbattlerecord(b, f, " "); - slprintf(buf, sizeof(buf), "%s %d: %s", loc_army, army_index(s), - seematrix(f, s) ? sidename(s, false) : LOC(f->locale, "unknown_faction")); - fbattlerecord(b, f, buf); + msg = msg_message("msg_army", "index name", army_index(s), sname); + message_faction(b, f, msg); + msg_release(msg); bufp = buf; size = sizeof(buf); @@ -2898,7 +2855,7 @@ print_stats(battle * b) if (enemy(s2, s)) { const char * abbrev = seematrix(f, s2)?sideabkz(s2, false):"-?-"; rsize = slprintf(bufp, size, "%s %s %d(%s)", - komma++ ? "," : header, loc_army, army_index(s2), abbrev); + komma++ ? "," : (const char*)header, loc_army, army_index(s2), abbrev); if (rsize>size) rsize = size-1; size -= rsize; bufp += rsize; @@ -2915,7 +2872,7 @@ print_stats(battle * b) if (friendly(s2, s)) { const char * abbrev = seematrix(f, s2)?sideabkz(s2, false):"-?-"; rsize = slprintf(bufp, size, "%s %s %d(%s)", - komma++ ? "," : header, loc_army, army_index(s2), abbrev); + komma++ ? "," : (const char*)header, loc_army, army_index(s2), abbrev); if (rsize>size) rsize = size-1; size -= rsize; bufp += rsize; @@ -2931,7 +2888,7 @@ print_stats(battle * b) for (s2=b->sides;s2;s2=s2->next) { if (s->relations[s2->index] & E_ATTACKING) { const char * abbrev = seematrix(f, s2)?sideabkz(s2, false):"-?-"; - rsize = slprintf(bufp, size, "%s %s %d(%s)", komma++ ? "," : header, loc_army, + rsize = slprintf(bufp, size, "%s %s %d(%s)", komma++ ? "," : (const char*)header, loc_army, army_index(s2), abbrev); if (rsize>size) rsize = size-1; size -= rsize; @@ -2940,17 +2897,14 @@ print_stats(battle * b) } if (komma) fbattlerecord(b, f, buf); } - buf[77] = (char)0; - for (k = buf; *k; ++k) *k = '-'; - battlerecord(b, buf); - if (battledebug && s->bf->faction) { + + if (bdebug && s->bf->faction) { if (s->bf->faction->alliance) { - slprintf(buf, sizeof(buf), "##### %s (%s/%d)", s->bf->faction->name, itoa36(s->bf->faction->no), + fprintf(bdebug, "##### %s (%s/%d)\n", s->bf->faction->name, itoa36(s->bf->faction->no), s->bf->faction->alliance?s->bf->faction->alliance->id:0); } else { - slprintf(buf, sizeof(buf), "##### %s (%s)", s->bf->faction->name, itoa36(s->bf->faction->no)); + fprintf(bdebug, "##### %s (%s)\n", s->bf->faction->name, itoa36(s->bf->faction->no)); } - battle_log(buf); } print_fighters(b, s); } @@ -3018,16 +2972,10 @@ make_fighter(battle * b, unit * u, side * s1, boolean attack) const group * g = NULL; const attrib *a = a_find(u->attribs, &at_otherfaction); const faction *stealthfaction = a?get_otherfaction(a):NULL; - static const struct item_type * it_demonseye; - static boolean init = false; unsigned int flags = 0; assert(u->number); if (fval(u, UFL_PARTEITARNUNG)!=0) flags |= SIDE_STEALTH; - if (!init) { - it_demonseye = it_find("demonseye"); - init=true; - } if (fval(u, UFL_GROUP)) { const attrib * agroup = a_find(u->attribs, &at_group); @@ -3213,17 +3161,6 @@ make_fighter(battle * b, unit * u, side * s1, boolean attack) } } - if (it_demonseye && i_get(u->items, it_demonseye)) { - char lbuf[80]; - const char * s = LOC(default_locale, rc_name(u->race, 3)); - char * c = lbuf; - while (*s) *c++ = (char)toupper(*s++); - *c = 0; - fig->person[0].hp = unit_max_hp(u) * 3; - slprintf(buf, sizeof(buf), "Eine Stimme ertönt über dem Schlachtfeld. 'DIESES %sKIND IST MEIN. IHR SOLLT ES NICHT HABEN.'. Eine leuchtende Aura umgibt %s", lbuf, unitname(u)); - battlerecord(b, buf); - } - s1->size[statusrow(fig->status)] += u->number; s1->size[SUM_ROW] += u->number; if (u->race->battle_flags & BF_NOBLOCK) { @@ -3379,7 +3316,7 @@ make_battle(region * r) bdebug = fopen(zFilename, "w"); if (!bdebug) log_error(("battles können nicht debugged werden\n")); else { - dbgprintf((bdebug, "In %s findet ein Kampf statt:\n", rname(r, NULL))); + fprintf(bdebug, "In %s findet ein Kampf statt:\n", rname(r, NULL)); } obs_count++; } @@ -3503,8 +3440,6 @@ battle_report(battle * b) boolean komma; bfaction *bf; - buf[0] = 0; - for (s=b->sides; s; s=s->next) { for(s2=b->sides; s2; s2=s2->next) { if (s->alive-s->removed > 0 && s2->alive-s2->removed > 0 && enemy(s, s2)) { @@ -3520,6 +3455,7 @@ battle_report(battle * b) for (bf=b->factions;bf;bf=bf->next) { faction * fac = bf->faction; + char buf[1024]; char * bufp = buf; size_t size = sizeof(buf), rsize; message * m; @@ -3537,7 +3473,7 @@ battle_report(battle * b) int r, k = 0, * alive = get_alive(s); int l = FIGHT_ROW; const char * abbrev = seematrix(fac, s)?sideabkz(s, false):"-?-"; - const char * loc_army = LOC(fac->locale, "battle_army"); + const xmlChar * loc_army = LOC(fac->locale, "battle_army"); char buffer[32]; if (komma) { @@ -3799,15 +3735,12 @@ init_battle(region * r, battle **bp) if (fval(u, UFL_LONGACTION)) continue; if (peace_ct && curse_active(get_curse(r->attribs, peace_ct))) { - sprintf(buf, "Hier ist es so schön friedlich, %s möchte " - "hier niemanden angreifen.", unitname(u)); - mistake(u, ord, buf, MSG_BATTLE); + ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "peace_active", "")); continue; } if (slave_ct && curse_active(get_curse(u->attribs, slave_ct))) { - sprintf(buf, "%s kämpft nicht.", unitname(u)); - mistake(u, ord, buf, MSG_BATTLE); + ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "slave_active", "")); continue; } @@ -3836,78 +3769,71 @@ init_battle(region * r, battle **bp) /* Fehler: "Die Einheit wurde nicht gefunden" */ if (!u2 || u2->number == 0 || !cansee(u->faction, u->region, u2, 0)) { ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "feedback_unit_not_found", "")); - continue; + continue; + } + /* Fehler: "Die Einheit ist eine der unsrigen" */ + if (u2->faction == u->faction) { + cmistake(u, ord, 45, MSG_BATTLE); + continue; + } + /* Fehler: "Die Einheit ist mit uns alliert" */ + if (alliedunit(u, u2->faction, HELP_FIGHT)) { + cmistake(u, ord, 47, MSG_BATTLE); + continue; + } + if (u2->faction->age < NewbieImmunity()) { + add_message(&u->faction->msgs, + msg_feedback(u, u->thisorder, "newbie_immunity_error", "turns", NewbieImmunity())); + continue; + } + /* Fehler: "Die Einheit ist mit uns alliert" */ + + if (calm_ct) { + attrib * a = a_find(u->attribs, &at_curse); + boolean calm = false; + while (a && a->type==&at_curse) { + curse * c = (curse *)a->data.v; + if (c->type==calm_ct && c->effect.i==u2->faction->subscription) { + if (curse_active(c)) { + calm = true; + break; + } + } + a = a->next; } - /* Fehler: "Die Einheit ist eine der unsrigen" */ - if (u2->faction == u->faction) { - cmistake(u, ord, 45, MSG_BATTLE); - continue; - } - /* Fehler: "Die Einheit ist mit uns alliert" */ - if (alliedunit(u, u2->faction, HELP_FIGHT)) { + if (calm) { cmistake(u, ord, 47, MSG_BATTLE); continue; } - /* xmas */ - if (u2->no==atoi36("xmas") && u2->irace==new_race[RC_GNOME]) { - a_add(&u->attribs, a_new(&at_key))->data.i = atoi36("coal"); - sprintf(buf, "%s ist böse gewesen...", unitname(u)); - mistake(u, ord, buf, MSG_BATTLE); - continue; - } if (u2->faction->age < NewbieImmunity()) { - add_message(&u->faction->msgs, - msg_feedback(u, u->thisorder, "newbie_immunity_error", "turns", NewbieImmunity())); - continue; + } + /* Ende Fehlerbehandlung */ + if (b==NULL) { + unit * utmp; + for (utmp=r->units; utmp!=NULL; utmp=utmp->next) { + fset(utmp->faction, FFL_NOAID); } - /* Fehler: "Die Einheit ist mit uns alliert" */ + b = make_battle(r); + } + c1 = join_battle(b, u, true); + c2 = join_battle(b, u2, false); - if (calm_ct) { - attrib * a = a_find(u->attribs, &at_curse); - boolean calm = false; - while (a && a->type==&at_curse) { - curse * c = (curse *)a->data.v; - if (c->type==calm_ct && c->effect.i==u2->faction->subscription) { - if (curse_active(c)) { - calm = true; - break; - } - } - a = a->next; - } - if (calm) { - cmistake(u, ord, 47, MSG_BATTLE); - continue; - } - } - /* Ende Fehlerbehandlung */ - if (b==NULL) { - unit * utmp; - for (utmp=r->units; utmp!=NULL; utmp=utmp->next) { - fset(utmp->faction, FFL_NOAID); - } - b = make_battle(r); - } - c1 = join_battle(b, u, true); - c2 = join_battle(b, u2, false); - - /* Hat die attackierte Einheit keinen Noaid-Status, - * wird das Flag von der Faction genommen, andere - * Einheiten greifen ein. */ - if (!fval(u2, UFL_NOAID)) freset(u2->faction, FFL_NOAID); - - if (c1!=NULL && c2!=NULL) { - /* Merken, wer Angreifer ist, für die Rückzahlung der - * Präcombataura bei kurzem Kampf. */ - c1->side->bf->attacker = true; - - set_enemy(c1->side, c2->side, true); - if (battledebug && !enemy(c1->side, c2->side)) { - sprintf(buf, "%s attackiert %s", sidename(c1->side, false), - sidename(c2->side, false)); - battle_log(buf); - } - fighting = true; + /* Hat die attackierte Einheit keinen Noaid-Status, + * wird das Flag von der Faction genommen, andere + * Einheiten greifen ein. */ + if (!fval(u2, UFL_NOAID)) freset(u2->faction, FFL_NOAID); + + if (c1!=NULL && c2!=NULL) { + /* Merken, wer Angreifer ist, für die Rückzahlung der + * Präcombataura bei kurzem Kampf. */ + c1->side->bf->attacker = true; + + set_enemy(c1->side, c2->side, true); + if (bdebug && !enemy(c1->side, c2->side)) { + fprintf(bdebug, "%s attacks %s\n", sidename(c1->side), + sidename(c2->side)); } + fighting = true; + } } } } @@ -4098,10 +4024,8 @@ battle_flee(battle * b) #endif } } - if (battledebug && runners > 0) { - char lbuf[256]; - sprintf(lbuf, "Flucht: %d aus %s", runners, itoa36(fig->unit->no)); - battle_log(lbuf); + if (bdebug && runners > 0) { + fprintf(bdebug, "Fleeing: %d from %s\n", runners, itoa36(fig->unit->no)); } } } @@ -4172,10 +4096,8 @@ do_battle(region * r) #endif for (;battle_report(b) && b->turn<=COMBAT_TURNS;++b->turn) { - if (battledebug) { - char lbuf[256]; - sprintf(lbuf, "*** Runde: %d", b->turn); - battle_log(lbuf); + if (bdebug) { + fprintf(bdebug, "*** Turn: %d\n", b->turn); } battle_flee(b); battle_update(b); diff --git a/src/common/kernel/battle.h b/src/common/kernel/battle.h index 6966f1892..1dfa2b6dd 100644 --- a/src/common/kernel/battle.h +++ b/src/common/kernel/battle.h @@ -238,7 +238,6 @@ extern "C" { extern troop select_enemy(struct fighter * af, int minrow, int maxrow, int select); extern int count_enemies(struct battle * b, const struct fighter * af, int minrow, int maxrow, int select); extern boolean terminate(troop dt, troop at, int type, const char *damage, boolean missile); - extern void battlemsg(battle * b, struct unit * u, const char * s); extern void battlerecord(battle * b, const char *s); extern void message_all(battle * b, struct message * m); extern void message_faction(battle * b, struct faction * f, struct message * m); diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c index 103b0c741..edcfe3a13 100644 --- a/src/common/kernel/eressea.c +++ b/src/common/kernel/eressea.c @@ -1646,13 +1646,19 @@ largestbuilding (const region * r, boolean img) return best; } -const char * +xmlChar * +write_unitname(const unit * u, xmlChar * buffer, size_t size) +{ + snprintf((char*)buffer, size, "%s (%s)", (const char*)u->name, itoa36(u->no)); + buffer[size-1] = 0; + return buffer; +} + +const xmlChar * unitname(const unit * u) { char *ubuf = idbuf[(++nextbuf) % 8]; - snprintf(ubuf, sizeof(name), "%s (%s)", u->name, itoa36(u->no)); - ubuf[sizeof(name)-1] = 0; - return ubuf; + return write_unitname(u, (xmlChar*)ubuf, sizeof(name)); } /* -- Erschaffung neuer Einheiten ------------------------------ */ @@ -2074,7 +2080,7 @@ init_locale(const struct locale * lang) tokens = get_translations(lang, UT_TERRAINS); for (terrain=terrains();terrain!=NULL;terrain=terrain->next) { - var.v = terrain; + var.v = (void*)terrain; addtoken(tokens, LOC(lang, terrain->_name), var); } } diff --git a/src/common/kernel/eressea.h b/src/common/kernel/eressea.h index eb6ca25db..b00bfaa6b 100644 --- a/src/common/kernel/eressea.h +++ b/src/common/kernel/eressea.h @@ -258,7 +258,8 @@ struct region *findunitregion(const struct unit * su); char *estring(const char *s); char *cstring(const char *s); -const char *unitname(const struct unit * u); +extern const xmlChar *unitname(const struct unit * u); +extern xmlChar * write_unitname(const struct unit * u, xmlChar * buffer, size_t size); struct building *largestbuilding(const struct region * r, boolean img); diff --git a/src/common/kernel/order.c b/src/common/kernel/order.c index 63faa87e1..4bdd30710 100644 --- a/src/common/kernel/order.c +++ b/src/common/kernel/order.c @@ -267,6 +267,7 @@ create_order(keyword_t kwd, const struct locale * lang, const char * params, ... va_list marker; char zBuffer[DISPLAYSIZE]; char * sptr = zBuffer; + char quote = 0; va_start(marker, params); while (params) { @@ -275,8 +276,18 @@ create_order(keyword_t kwd, const struct locale * lang, const char * params, ... case ' ': /* ignore these, they are syntactical sugar */ break; + case '"': + case '\'': + *sptr++ = *params; + if (!quote) quote = *params; + else if (quote==*params) { + quote = 0; + *sptr++ = ' '; + } + break; case 's': sptr += strlcpy(sptr, va_arg(marker, const char *), sizeof(zBuffer)-(sptr-zBuffer)); + if (!quote) *sptr++ = ' '; break; case 'd': sptr += strlcpy(sptr, itoa10(va_arg(marker, int)), sizeof(zBuffer)-(sptr-zBuffer)); diff --git a/src/common/kernel/order.h b/src/common/kernel/order.h index 02d56adb3..673aa2217 100644 --- a/src/common/kernel/order.h +++ b/src/common/kernel/order.h @@ -35,6 +35,7 @@ typedef struct order { } order; /* constructor */ +extern order * create_order(keyword_t kwd, const struct locale * lang, const char * params, ...); extern order * parse_order(const xmlChar * s, const struct locale * lang); extern void replace_order(order ** dst, order * orig, const order * src); diff --git a/src/common/spells/combatspells.c b/src/common/spells/combatspells.c index f05a0995f..24e49363b 100644 --- a/src/common/spells/combatspells.c +++ b/src/common/spells/combatspells.c @@ -267,20 +267,16 @@ sp_combatrosthauch(fighter * fi, int level, double power, spell * sp) battle *b = fi->side->battle; cvector *fgs; void **fig; - int force; + int force = lovar(power * 15); int k = 0; + /* Immer aus der ersten Reihe nehmen */ - static const char * msgt[] = { - "ruft ein fürchterliches Unwetter über seine Feinde, doch es gab niemanden mehr, den dies treffen konnte.", - "ruft ein fürchterliches Unwetter über seine Feinde, doch der magische Regen zeigt keinen Effekt.", - "ruft ein fürchterliches Unwetter über seine Feinde, Der magischen Regen lässt alles Eisen rosten." - }; unused(sp); - force = lovar(power * 15); - if (!count_enemies(b, fi, FIGHT_ROW, BEHIND_ROW-1, SELECT_ADVANCE|SELECT_FIND)) { - battlemsg(b, fi->unit, msgt[0]); + message * msg = msg_message("rust_effect_0", "mage", fi->unit); + message_all(b, msg); + msg_release(msg); return 0; } @@ -339,11 +335,15 @@ sp_combatrosthauch(fighter * fi, int level, double power, spell * sp) if (k == 0) { /* keine Waffen mehr da, die zerstört werden könnten */ - battlemsg(b, fi->unit, msgt[1]); + message * msg = msg_message("rust_effect_1", "mage", fi->unit); + message_all(b, msg); + msg_release(msg); fi->magic = 0; /* kämpft nichtmagisch weiter */ level = 0; } else { - battlemsg(b, fi->unit, msgt[2]); + message * msg = msg_message("rust_effect_2", "mage", fi->unit); + message_all(b, msg); + msg_release(msg); } return level; } diff --git a/src/common/spells/spells.c b/src/common/spells/spells.c index 55a57c471..477145e1b 100644 --- a/src/common/spells/spells.c +++ b/src/common/spells/spells.c @@ -25,6 +25,7 @@ #include #include +#include struct curse_type; extern void ct_register(const struct curse_type * ct); @@ -544,6 +545,7 @@ sp_summon_familiar(castorder *co) direction_t d; message * msg; xmlChar zText[NAMESIZE]; + size_t size; if (get_familiar(mage) != NULL ) { cmistake(mage, co->order, 199, MSG_MAGIC); @@ -591,6 +593,7 @@ sp_summon_familiar(castorder *co) if (rc->bonus[sk] > -5) dh++; } zText[0] = 0; + size = sizeof(zText); for (sk=0;skbonus[sk] > -5) { dh--; @@ -598,12 +601,12 @@ sp_summon_familiar(castorder *co) dh1 = 1; } else { if (dh == 0) { - strncat((char*)zText, (const char*)LOC(mage->faction->locale, "list_and"), sizeof(zText)); + size -= strlcat((char*)zText, (const char*)LOC(mage->faction->locale, "list_and"), size); } else { - strncat((char*)zText, (const char*)", ", sizeof(zText)); + size -= strlcat((char*)zText, (const char*)", ", size); } } - strncat((char*)zText, (const char*)skillname(sk, mage->faction->locale), sizeof(zText)); + size -= strlcat((char*)zText, (const char*)skillname(sk, mage->faction->locale), size); } } ADDMSG(&mage->faction->msgs, msg_message("familiar_describe", diff --git a/src/res/de/strings.xml b/src/res/de/strings.xml index ea7e5834e..b7287f855 100644 --- a/src/res/de/strings.xml +++ b/src/res/de/strings.xml @@ -6955,4 +6955,9 @@ An alp died before it reached its target. + + unbewaffnet + unarmed + + diff --git a/src/res/messages.xml b/src/res/messages.xml index fd925f2d9..0357af0ad 100644 --- a/src/res/messages.xml +++ b/src/res/messages.xml @@ -1060,6 +1060,27 @@ "Ein Alp hat sein Opfer gefunden und springt auf den Rücken von $unit($target)!" + + + + + "$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, doch es gab niemanden mehr, den dies treffen konnte." + + + + + + + "$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, doch der magische Regen zeigt keinen Effekt." + + + + + + + "$unit($mage) ruft ein fürchterliches Unwetter über seine Feinde, Der magischen Regen lässt alles Eisen rosten." + + @@ -1272,13 +1293,21 @@ "$unit($unit) hit $int($hits) times and killed $int($kills) enemies." "$unit($unit) hit $int($hits) times and killed $int($kills) enemies." - + "$string" "$string" + + + + + + "Heer $int($index): $name" + "Army $int($index): $name" + @@ -7599,4 +7628,34 @@ "$unit($unit) is stricken by a strange disease." + + + + + + + "$unit($unit) erbeutet $int($amount) $resource($item,$amount)." + "$unit($unit) collects $int($amount) $resource($item,$amount)." + + + + + + + + + "$unit($unit) in $region($region): '$order($command)' - Es ist so schön friedlich, man möchte hier niemanden angreifen." + "$unit($unit) in $region($region): '$order($command)' - It's so quiet and peaceful, nobody wants to attack anybody right now." + + + + + + + + + "$unit($unit) in $region($region): '$order($command)' - Diese Einheit kämpft nicht." + "$unit($unit) in $region($region): '$order($command)' - This unit will not fight." + +