diff --git a/src/Makefile.include b/src/Makefile.include index 91adbd37f..ddeb651e4 100644 --- a/src/Makefile.include +++ b/src/Makefile.include @@ -100,7 +100,7 @@ ifeq (.depend,$(wildcard .depend)) include .depend endif # Create dependencies -depend:: +.depend depend:: $(SOURCES) @echo "Creating dependencies in `pwd`/.depend"; $(DEPEND) $(CFLAGS) $(DEFINES) $(INCDIRS) $(SOURCES) >| .depend endif @@ -160,7 +160,7 @@ $(BUILD_DIR) $(PUBLISH_DIR): # object files: $(BUILD_DIR)/%:: $(BUILD_DIR) -$(BUILD_DIR)/%.o:: %.c +$(BUILD_DIR)/%.o:: %.c .depend @echo $(MSG_COMPILE) $(CC) $(CFLAGS) -o $@ -c $< @echo diff --git a/src/common/attributes/attributes-5.dsp b/src/common/attributes/attributes-5.dsp index e91691c9b..05860e89e 100644 --- a/src/common/attributes/attributes-5.dsp +++ b/src/common/attributes/attributes-5.dsp @@ -9,21 +9,21 @@ CFG=attributes - Win32 Debug NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den\ Befehl -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "attributes.mak". -!MESSAGE +!MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "attributes.mak" CFG="attributes - Win32 Debug" -!MESSAGE +!MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: -!MESSAGE +!MESSAGE !MESSAGE "attributes - Win32 Release" (basierend auf\ "Win32 (x86) Static Library") !MESSAGE "attributes - Win32 Debug" (basierend auf\ "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP Scc_ProjName "" @@ -72,7 +72,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/attributes/attributes-6.dsp b/src/common/attributes/attributes-6.dsp index 214fdb5f0..6a79a71de 100644 --- a/src/common/attributes/attributes-6.dsp +++ b/src/common/attributes/attributes-6.dsp @@ -7,19 +7,19 @@ CFG=attributes - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "attributes-6.mak". -!MESSAGE +!MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "attributes-6.mak" CFG="attributes - Win32 Debug" -!MESSAGE +!MESSAGE !MESSAGE Possible choices for configuration are: -!MESSAGE +!MESSAGE !MESSAGE "attributes - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "attributes - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 @@ -74,7 +74,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/gamecode/creport.c b/src/common/gamecode/creport.c index 8416b922d..c4eade093 100644 --- a/src/common/gamecode/creport.c +++ b/src/common/gamecode/creport.c @@ -373,7 +373,7 @@ cr_output_ship(FILE * F, ship * s, unit * u, int fcaptain, faction * f, region * fprintf(F, "%d;Partei\n", fcaptain); /* calculate cargo */ - if (u && (u->faction == f || f->race == RC_ILLUSION)) { + if (u && (u->faction == f || omniscient(f))) { for (u2 = r->units; u2; u2 = u2->next) if (u2->ship == s) w += weight(u2); @@ -423,7 +423,7 @@ cr_output_unit(FILE * F, region * r, if (strlen(u->display)) fprintf(F, "\"%s\";Beschr\n", u->display); - if ((u->faction == f || f->race == RC_ILLUSION) || !fval(u, FL_PARTEITARNUNG)) { + if ((u->faction == f || omniscient(f)) || !fval(u, FL_PARTEITARNUNG)) { #ifdef GROUPS if (u->faction == f) { const attrib * a = a_find(u->attribs, &at_group); @@ -460,7 +460,7 @@ cr_output_unit(FILE * F, region * r, fprintf(F, "%d;Parteitarnung\n", fval(u, FL_PARTEITARNUNG)); /* additional information for own units */ - if (u->faction == f || f->race == RC_ILLUSION) { + if (u->faction == f || omniscient(f)) { const char *c; int i; const attrib * a; @@ -485,7 +485,7 @@ cr_output_unit(FILE * F, region * r, if (c) fprintf(F, "\"%s\";privat\n", c); c = hp_status(u); - if (c && *c && (u->faction == f || f->race == RC_ILLUSION)) + if (c && *c && (u->faction == f || omniscient(f))) fprintf(F, "\"%s\";hp\n", c); if (fval(u, FL_HUNGER) && (u->faction == f)) fputs("1;hunger\n", F); @@ -543,7 +543,7 @@ cr_output_unit(FILE * F, region * r, } /* items */ pr = 0; - if (f == u->faction || u->faction->race==RC_ILLUSION) { + if (f == u->faction || omniscient(u->faction)) { show = u->items; } else if (itemcloak==false && mode>=see_unit && !(a_fshidden && a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 3)) { @@ -587,7 +587,7 @@ cr_output_unit(FILE * F, region * r, fprintf(F, "%d;%s\n", in, locale_string(NULL, ic)); } - if ((u->faction == f || f->race == RC_ILLUSION) && u->botschaften) + if ((u->faction == f || omniscient(f)) && u->botschaften) cr_output_str_list(F, "EINHEITSBOTSCHAFTEN", u->botschaften, f); print_curses(F, u, TYP_UNIT, u->attribs, (u->faction == f)? 1 : 0); @@ -857,7 +857,7 @@ report_computer(FILE * F, faction * f) maxmining = 0; for (u = r->units; u; u = u->next) { int s = eff_skill(u, SK_MINING, r); - if (u->faction == f || f->race == RC_ILLUSION) + if (u->faction == f || omniscient(f)) maxmining = max(maxmining, s); } if (maxmining >= 4) diff --git a/src/common/gamecode/economy.c b/src/common/gamecode/economy.c index 181bd2785..acabdbf13 100644 --- a/src/common/gamecode/economy.c +++ b/src/common/gamecode/economy.c @@ -250,7 +250,8 @@ expandrecruit(region * r, request * recruitorders) for (i = 0, n = 0; i != norders && n < rfrac; i++, n++) { if (!(race[oa[i].unit->race].ec_flags & REC_HORSES)) { recruitcost = race[oa[i].unit->faction->race].rekrutieren; - use_pooled(oa[i].unit, r, R_SILVER, recruitcost); + if (use_pooled(oa[i].unit, r, R_SILVER, recruitcost) != recruitcost) + break; set_number(oa[i].unit, oa[i].unit->number + 1); if (oa[i].unit->faction->race != RC_DAEMON) p--; oa[i].unit->race = oa[i].unit->faction->race; @@ -263,7 +264,8 @@ expandrecruit(region * r, request * recruitorders) for (i = 0, n = 0; i != norders && n < h; i++, n++) { if (race[oa[i].unit->race].ec_flags & REC_HORSES) { recruitcost = race[oa[i].unit->faction->race].rekrutieren; - use_pooled(oa[i].unit, r, R_SILVER, recruitcost); + if (use_pooled(oa[i].unit, r, R_SILVER, recruitcost) != recruitcost) + break; set_number(oa[i].unit, oa[i].unit->number + 1); if (oa[i].unit->faction->race != RC_DAEMON) h--; @@ -1254,7 +1256,7 @@ economics(void) break; case K_GIVE: - dogive(r, u, S, false); + dogive(r, u, S, S->s[0]=='@'?true:false); break; case K_LIEFERE: diff --git a/src/common/gamecode/gamecode-5.dsp b/src/common/gamecode/gamecode-5.dsp index 9b58acf6f..5f6fe8364 100644 --- a/src/common/gamecode/gamecode-5.dsp +++ b/src/common/gamecode/gamecode-5.dsp @@ -9,22 +9,22 @@ CFG=gamecode - Win32 Conversion NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den\ Befehl -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "gamecode-5.mak". -!MESSAGE +!MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "gamecode-5.mak" CFG="gamecode - Win32 Conversion" -!MESSAGE +!MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: -!MESSAGE +!MESSAGE !MESSAGE "gamecode - Win32 Release" (basierend auf\ "Win32 (x86) Static Library") !MESSAGE "gamecode - Win32 Debug" (basierend auf "Win32 (x86) Static Library") !MESSAGE "gamecode - Win32 Conversion" (basierend auf\ "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP Scc_ProjName "" @@ -96,7 +96,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/gamecode/gamecode-6.dsp b/src/common/gamecode/gamecode-6.dsp index 05be9e876..5f1a3cb2f 100644 --- a/src/common/gamecode/gamecode-6.dsp +++ b/src/common/gamecode/gamecode-6.dsp @@ -7,21 +7,21 @@ CFG=gamecode - Win32 Conversion !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "gamecode-6.mak". -!MESSAGE +!MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "gamecode-6.mak" CFG="gamecode - Win32 Conversion" -!MESSAGE +!MESSAGE !MESSAGE Possible choices for configuration are: -!MESSAGE +!MESSAGE !MESSAGE "gamecode - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "gamecode - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE "gamecode - Win32 Conversion" (based on "Win32 (x86) Static Library") !MESSAGE "gamecode - Win32 Profile" (based on "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 @@ -124,7 +124,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index cdd1efb6f..9b6faba45 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -560,7 +560,11 @@ horses(region * r) m = max(0, m); if (m) { double gg = (HORSEGROWTH*(rhorses(r)/1.5)*((double)m-(rhorses(r)/1.5))/(double)m)/100.0; - int g = (int)(normalvariate(gg,gg/4)); + int g; + attrib *a = a_find(r->attribs, &at_horseluck); + + if(a) gg *= log((double)(a->data.i)) + 1.0; + g = (int)(normalvariate(gg,gg/4)); if(g > 0) { rsethorses(r, rhorses(r) + g); @@ -2394,7 +2398,7 @@ renumber(void) case P_FACTION: s = getstrtoken(); if(strlen(s)>4) s[4]=0; - if (*s) { + if (s && *s) { int i = atoi36(s); attrib * a = a_find(f->attribs, &at_number); if (!a) a = a_add(&f->attribs, a_new(&at_number)); @@ -2404,7 +2408,7 @@ renumber(void) case P_UNIT: s = getstrtoken(); - if(*s == 0) { + if(s == NULL || *s == 0) { i = newunitid(); } else { i = atoi36(s); @@ -2442,7 +2446,7 @@ renumber(void) continue; } s = getstrtoken(); - if(*s == 0) { + if(s == NULL || *s == 0) { i = newcontainerid(); } else { i = atoi36(s); @@ -2690,7 +2694,6 @@ setdefaults (void) if (getparam() == P_TEMP) break; case K_BESIEGE: case K_ENTERTAIN: - case K_FOLLOW: case K_RESEARCH: case K_SPY: case K_STEAL: diff --git a/src/common/gamecode/monster.c b/src/common/gamecode/monster.c index ae489eaf2..29a00b392 100644 --- a/src/common/gamecode/monster.c +++ b/src/common/gamecode/monster.c @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: monster.c,v 1.9 2001/02/22 21:46:44 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -696,7 +695,6 @@ make_ponnuki(void) u = createunit(r, findfaction(MONSTER_FACTION), 1, RC_ILLUSION); u->irace = RC_GOBLIN; set_string(&u->name, "Ponnuki"); - u->age=-1000; set_string(&u->display, "Go, Ponnuki, Go."); uunhash(u); u->no = ponn; @@ -861,6 +859,9 @@ plan_monsters(void) if (u->faction->no != MONSTER_FACTION) continue; + /* Monster bekommen jede Runde ein paar Tage Wahrnehmung dazu */ + change_skill(u, SK_OBSERVATION, u->number * 10); + ta = a_find(u->attribs, &at_hate); if (ta && strncmp(u->lastorder, "WARTEN", 6) != 0) { unit * tu = (unit *)ta->data.v; diff --git a/src/common/gamecode/randenc.c b/src/common/gamecode/randenc.c index 05f615b5a..dfb411a02 100644 --- a/src/common/gamecode/randenc.c +++ b/src/common/gamecode/randenc.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: randenc.c,v 1.9 2001/02/10 14:18:00 enno Exp $ + * $Id: randenc.c,v 1.10 2001/04/01 06:58:36 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -119,11 +119,19 @@ dissolve_units(void) } break; case 2: - rsettrees(r, rtrees(r) + n); - if (n == 1) { - scat("wurde zum Baum."); - }else{ - scat("wurden zu Bäumen."); + if(r->land) { + rsettrees(r, rtrees(r) + n); + if (n == 1) { + scat("wurde zum Baum."); + }else{ + scat("wurden zu Bäumen."); + } + } else { + if(n == 1) { + scat("verfaulte in der feuchten Seeluft."); + } else { + scat("verfaulten in der feuchten Seeluft."); + } } break; default: diff --git a/src/common/gamecode/report.c b/src/common/gamecode/report.c index 77cc04c00..02e53603c 100644 --- a/src/common/gamecode/report.c +++ b/src/common/gamecode/report.c @@ -1394,7 +1394,9 @@ order_template(FILE * F, faction * f) } } - if(u->lastorder[0]) { + /* If the lastorder begins with an @ it should have + * been printed in the loop before. */ + if(u->lastorder[0] != 0 && u->lastorder[0] != '@') { sprintf(buf, " %s", u->lastorder); rps_nowrap(F, buf); rnl(F); @@ -1713,7 +1715,7 @@ report(FILE *F, faction * f) dh = 0; for(a=a_find(f->attribs, &at_faction_special); a; a=a->nexttype) { dh++; - if(fspecials[a->data.sa[0]].levels) { + if(fspecials[a->data.sa[0]].maxlevel) { sprintf(buf2, "%s (%d)", fspecials[a->data.sa[0]].name, a->data.sa[1]); } else { sprintf(buf2, "%s", fspecials[a->data.sa[0]].name); @@ -3133,7 +3135,7 @@ writeadresses(void) if (!F) return; for (f = factions; f; f = f->next) { - if (f->no != MONSTER_FACTION) { + if (f->no != MONSTER_FACTION && !nonplayer_race(f->race)) { fprintf(F, "%s:%s:%s\n", factionname(f), f->email, f->banner); } } diff --git a/src/common/gamecode/spy.c b/src/common/gamecode/spy.c index 96245a8df..065f5aefd 100644 --- a/src/common/gamecode/spy.c +++ b/src/common/gamecode/spy.c @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: spy.c,v 1.6 2001/02/22 21:46:44 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -107,23 +106,24 @@ setstealth(unit * u, strlist * S) return; } - /* Dämomen können sich als anderer race tarnen */ + /* Pseudodrachen können sich nur als Drachen tarnen */ - if (u->race == RC_DAEMON) { - if ((t = findrace(s)) != NORACE && !race[t].nonplayer) { - u->irace = t; + t = findrace(s); + if (t != NORACE) { + if (u->race == RC_PSEUDODRAGON || u->race == RC_BIRTHDAYDRAGON) { + if (t==RC_PSEUDODRAGON||t==RC_FIREDRAGON||t==RC_DRAGON||t==RC_WYRM) { + u->irace = t; + } return; } - } - /* Pseudodrachen auch */ - - if (u->race == RC_PSEUDODRAGON || u->race == RC_BIRTHDAYDRAGON) { - t = findrace(s); - if(t==RC_PSEUDODRAGON||t==RC_FIREDRAGON||t==RC_DRAGON||t==RC_WYRM) { - u->irace = t; - return; + /* Dämomen und Illusionsparteien können sich als andere race tarnen */ + if (race[u->race].flags & RCF_SHAPESHIFT) { + if (!race[t].nonplayer) { + u->irace = t; + } } + return; } switch(findparam(s)) { diff --git a/src/common/gamecode/study.c b/src/common/gamecode/study.c index c81b723cf..8cdd60cdb 100644 --- a/src/common/gamecode/study.c +++ b/src/common/gamecode/study.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: study.c,v 1.8 2001/02/19 14:19:24 corwin Exp $ + * $Id: study.c,v 1.9 2001/04/01 06:58:37 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -456,9 +456,10 @@ learn(void) } } if (i == SK_ALCHEMY) { - maxalchemy = get_skill(u, SK_ALCHEMY); - if (maxalchemy==0 && count_skill(u->faction, SK_ALCHEMY) + u->number > - max_skill(u->faction, SK_ALCHEMY)) { + maxalchemy = eff_skill(u, SK_ALCHEMY, r); + if (get_skill(u, SK_ALCHEMY)==0 + && count_skill(u->faction, SK_ALCHEMY) + u->number > + max_skill(u->faction, SK_ALCHEMY)) { sprintf(buf, "Es kann maximal %d Alchemisten pro Partei geben", max_skill(u->faction, SK_ALCHEMY)); mistake(u, u->thisorder, buf, MSG_EVENT); @@ -566,7 +567,7 @@ learn(void) for (ptype=potiontypes; ptype; ptype=ptype->next) { if (skill == ptype->level * 2) { attrib * a = a_find(f->attribs, &at_showitem); - while (a && a->data.v != ptype) a=a->next; + while (a && a->data.v != ptype) a=a->nexttype; if (!a) { a = a_add(&f->attribs, a_new(&at_showitem)); a->data.v = (void*) ptype->itype; diff --git a/src/common/items/items-5.dsp b/src/common/items/items-5.dsp index d1791b6ec..84ea30af4 100644 --- a/src/common/items/items-5.dsp +++ b/src/common/items/items-5.dsp @@ -9,19 +9,19 @@ CFG=items - Win32 Debug NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den\ Befehl -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "items-5.mak". -!MESSAGE +!MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "items-5.mak" CFG="items - Win32 Debug" -!MESSAGE +!MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: -!MESSAGE +!MESSAGE !MESSAGE "items - Win32 Release" (basierend auf "Win32 (x86) Static Library") !MESSAGE "items - Win32 Debug" (basierend auf "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP Scc_ProjName "" @@ -70,7 +70,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/items/items-6.dsp b/src/common/items/items-6.dsp index ed7bda719..b4ded2de2 100644 --- a/src/common/items/items-6.dsp +++ b/src/common/items/items-6.dsp @@ -7,19 +7,19 @@ CFG=items - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "items-6.mak". -!MESSAGE +!MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "items-6.mak" CFG="items - Win32 Debug" -!MESSAGE +!MESSAGE !MESSAGE Possible choices for configuration are: -!MESSAGE +!MESSAGE !MESSAGE "items - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "items - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 @@ -74,7 +74,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/items/lmsreward.c b/src/common/items/lmsreward.c index 3b79168c8..336f6840d 100644 --- a/src/common/items/lmsreward.c +++ b/src/common/items/lmsreward.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: lmsreward.c,v 1.2 2001/02/02 08:58:26 enno Exp $ + * $Id: lmsreward.c,v 1.3 2001/04/01 06:58:37 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -55,7 +55,8 @@ static attrib_type at_lmsstory = { age_lmsstory, a_writedefault, a_readdefault, - ATF_UNIQUE | ATF_CURSE + ATF_UNIQUE /* | ATF_CURSE */ /* Das geht nicht, weil der Inhalt + des Attributs kein curse * ist */ }; static int @@ -86,7 +87,8 @@ item_type it_lmsreward = { ITF_NOTLOST|ITF_CURSED, 0, 0, /* flags, weight, capacity */ 0, NOSKILL, /* minskill, skill */ NULL, /* construction */ - &use_lmsreward, + NULL, /* anstelle von use_lmsreward */ +/* &use_lmsreward, */ NULL }; diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index dd85e04f9..cff15c69e 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -214,14 +214,15 @@ armedmen(const unit * u) if (!(urace(u)->flags & RCF_NOWEAPONS)) { if (urace(u)->ec_flags & CANGUARD) { /* kann ohne waffen bewachen: fuer untote und drachen */ - n = u->number; + n = u->number; } else { /* alle Waffen werden gezaehlt, und dann wird auf die Anzahl * Personen minimiert */ for (itm=u->items;itm;itm=itm->next) { const weapon_type * wtype = resource2weapon(itm->type->rtype); if (wtype==NULL) continue; - if (effskill(u, wtype->skill) >= wtype->minskill) n += itm->number; + if (effskill(u, wtype->skill) >= 1) n += itm->number; + /* if (effskill(u, wtype->skill) >= wtype->minskill) n += itm->number; */ if (n>u->number) break; } n = min(n, u->number); @@ -528,12 +529,13 @@ reportcasualties(battle * b, fighter * fig) bfaction * bf; if (fig->alive == fig->unit->number) return; - fbattlerecord(fig->unit->faction, fig->unit->region, " "); + fbattlerecord(fig->unit->faction, b->region, " "); for (bf = b->factions;bf;bf=bf->next) { faction * f = bf->faction; struct message * m = new_message(f, "casualties%u:unit%r:runto%i:run%i:alive%i:fallen", - fig->unit, fig->run.region, fig->run.number, fig->alive, fig->unit->number - fig->alive - fig->run.number); - brecord(f, fig->unit->region, m); + fig->unit, fig->run.region, fig->run.number, fig->alive, + fig->unit->number - fig->alive - fig->run.number); + brecord(f, b->region, m); } } @@ -558,8 +560,8 @@ contest(int skilldiff, armor_t ar, armor_t sh) p = rand() % 100; vw -= p; } - while (vw > 0 && p >= 90); - return (vw < 0); + while (vw >= 0 && p >= 90); + return (vw <= 0); } static boolean @@ -610,7 +612,7 @@ weapon_skill(const weapon_type * wtype, const unit * u, boolean attacking) if (skill < race[u->race].at_default) skill = race[u->race].at_default; } else { if (skill < race[u->race].df_default) skill = race[u->race].df_default; - } + } } } else { /* changed: if we own a weapon, we have at least a skill of 0 */ @@ -1784,8 +1786,8 @@ attack(battle *b, troop ta, att *a) int dead; standard_attack = wp->type->attack(&ta, &dead); af->catmsg += dead; - /* TODO: dies hier ist nicht richtig. wenn die katapulte/etc. - * keinen gegner gefunden haben, sollte es nicht erhöht werden. + /* TODO: dies hier ist nicht richtig. wenn die katapulte/etc. + * keinen gegner gefunden haben, sollte es nicht erhöht werden. * außerdem müsste allen gegenern der counter erhöht werden. */ if (af->person[ta.index].last_action < b->turn) { @@ -2082,7 +2084,7 @@ loot_items(fighter * corpse) } static void -loot_fleeing(fighter* fig, unit* runner) +loot_fleeing(fighter* fig, unit* runner) { /* TODO: Vernünftig fixen */ runner->items = NULL; @@ -2091,6 +2093,19 @@ loot_fleeing(fighter* fig, unit* runner) fig->run.items = NULL; } +static void +merge_fleeloot(fighter* fig, unit* u) +{ + item * itm = fig->run.items; + item ** ip = &u->items; + + while (itm) { + i_add(ip, itm); + itm = itm->next; + } + fig->run.items = NULL; +} + static boolean seematrix(const faction * f, const side * s) { @@ -2217,14 +2232,12 @@ aftermath(battle * b) if (df->alive == du->number) continue; /* nichts passiert */ - reportcasualties(b, df); scale_number(du, df->alive + df->run.number); du->hp = sum_hp + df->run.hp; /* die weggerannten werden später subtrahiert! */ assert(du->number >= 0); - /* Report the casualties */ if (df->run.hp) { /* Sonderbehandlung für sich auflösende Einheiten wie Wölfe, @@ -2237,13 +2250,17 @@ aftermath(battle * b) continue; } if (df->alive == 0) { + /* Zuerst dürfen die Feinde plündern, die mitgenommenen Items + * stehen in fig->run.items. Dann werden die Fliehenden auf + * die leere (tote) alte Einheit gemapt */ + if (fval(df,FIG_NOLOOT)){ + merge_fleeloot(df, du); + } else { + loot_items(df); + loot_fleeing(df, du); + } scale_number(du, df->run.number); du->hp = df->run.hp; - /* Distribute Loot */ - if (!fval(df,FIG_NOLOOT)){ - loot_fleeing(df, du); - loot_items(df); - } } else { unit *nu = createunit(du->region, du->faction, df->run.number, du->race); skill_t sk; @@ -2280,7 +2297,10 @@ aftermath(battle * b) setguard(du, GUARD_NONE); fset(du, FL_MOVED); leave(du->region, du); - if (df->run.region) travel(r, du, df->run.region, 1); + if (df->run.region) { + travel(r, du, df->run.region, 1); + df->run.region = du->region; + } } else if (df->alive==0) { /* alle sind tot, niemand geflohen. Einheit auflösen */ setguard(du, GUARD_NONE); @@ -2289,8 +2309,11 @@ aftermath(battle * b) loot_items(df); } + /* Report the casualties */ + reportcasualties(b, df); + if (!nonplayer_race(du->race)) { - /* tote im kampf werden zu regionsuntoten: + /* tote im kampf werden zu regionsuntoten: * for each of them, a peasant will die as well */ is += dead; } @@ -2947,7 +2970,7 @@ make_battle(region * r) bdebug = gzopen(zFilename, "w"); #elif HAVE_BZ2LIB sprintf(zFilename, "%s/battle-%d-%s.log.bz2", zText, obs_count, simplename(r)); - bdebug = BZ2_bzopen(zFilename, "w");+ + bdebug = BZ2_bzopen(zFilename, "w");+ #else sprintf(zFilename, "%s/battle-%d-%s.log", zText, obs_count, simplename(r)); bdebug = fopen(zFilename, "w"); @@ -3206,7 +3229,7 @@ join_allies(battle * b) extern struct item_type * i_silver; void -flee(const troop dt) +flee(const troop dt) { fighter * fig = dt.fighter; unit * u = fig->unit; @@ -3219,7 +3242,7 @@ flee(const troop dt) const item_type * itype = itm->type; int keep = 0; - if (itype->capacity>0 || fval(itype, ITF_ANIMAL)) { + if (fval(itype, ITF_ANIMAL)) { /* Regeländerung: Man muß das Tier nicht reiten können, * um es vom Schlachtfeld mitzunehmen, ist ja nur * eine Region weit. * */ @@ -3229,8 +3252,16 @@ flee(const troop dt) /* if it doesn't weigh anything, it won't slow us down */ keep = itm->number; } - if (itm->number==keep && keep>0) { - i_add(&fig->run.items, i_remove(ip, itm)); + /* jeder troop nimmt seinen eigenen Teil der Sachen mit */ + if (keep>0){ + if (itm->number==keep) { + i_add(&fig->run.items, i_remove(ip, itm)); + } else { + item *run_itm = i_new(itype); + run_itm->number = keep; + i_add(&fig->run.items, run_itm); + i_change(ip, itype, -keep); + } } if (*ip==itm) ip = &itm->next; } @@ -3526,13 +3557,20 @@ do_battle(void) } } } + + /* this has to be calculated before the actual attacks take + * place because otherwise the dead would not strike the + * round they die. */ + for (fi = b->fighters.begin; fi != b->fighters.end; ++fi) { + fighter *fig = *fi; + fig->fighting = fig->alive - fig->removed; + } + for (fi = b->fighters.begin; fi != b->fighters.end; ++fi) { fighter *fig = *fi; - /* Kämpfer diese Runde: */ - fig->fighting = fig->alive - fig->removed; /* ist in dieser Einheit noch jemand handlungsfähig? */ - if (fig->fighting == 0) continue; + if (fig->fighting <= 0) continue; /* Taktikrunde: */ if (b->turn == 0) { diff --git a/src/common/kernel/build.c b/src/common/kernel/build.c index a7479c879..4adca8cfb 100644 --- a/src/common/kernel/build.c +++ b/src/common/kernel/build.c @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: build.c,v 1.9 2001/03/04 18:41:25 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -276,39 +275,60 @@ do_siege(void) } /* ------------------------------------------------------------- */ +void +destroy_road(unit *u, int n, const char *cmd) +{ + direction_t d = getdirection(); + unit *u2; + region *r = u->region; + + for (u2=r->units;u2;u2=u2->next) { + if (u2->faction!=u->faction && getguard(u2)&GUARD_TAX && + !allied(u, u2->faction, HELP_GUARD)) { + cmistake(u, cmd, 70, MSG_EVENT); + return; + } + } + + if (d==NODIRECTION) { + cmistake(u, cmd, 71, MSG_PRODUCE); + } else { +#if 0 + int salvage, divy = 2; +#endif + int willdo = min(n, (1+get_skill(u, SK_ROAD_BUILDING))*u->number); + int road = rroad(r, d); + region * r2 = rconnect(r,d); + willdo = min(willdo, road); +#if 0 + salvage = willdo / divy; + change_item(u, I_STONE, salvage); +#endif + rsetroad(r, d, road - willdo); + add_message(&u->faction->msgs, new_message( + u->faction, "destroy_road%u:unit%r:from%r:to", u, r, r2)); + } +} + void destroy(region * r, unit * u, const char * cmd) { ship *sh; unit *u2; - int size = 0; +#if 0 const construction * con = NULL; + int size = 0; +#endif + char *s; + int n = INT_MAX; if (u->number < 1) return; - if (getparam()==P_ROAD) { - direction_t d = getdirection(); - for (u2=r->units;u2;u2=u2->next) { - if (u2->faction!=u->faction && getguard(u2)&GUARD_TAX && - !allied(u, u2->faction, HELP_GUARD)) { - cmistake(u, cmd, 70, MSG_EVENT); - return; - } - } - if (d==NODIRECTION) cmistake(u, cmd, 71, MSG_PRODUCE); - else { - int salvage, divy = 2; - int cando = (1+get_skill(u, SK_ROAD_BUILDING))*u->number; - int road = rroad(r, d); - region * r2 = rconnect(r,d); - cando = min(cando, road); - salvage = cando / divy; - change_item(u, I_STONE, salvage); - rsetroad(r, d, road - cando); - add_message(&u->faction->msgs, new_message( - u->faction, "destroy_road%u:unit%r:from%r:to", u, r, r2)); - } + s = getstrtoken(); + + if (findparam(s)==P_ROAD) { + destroy_road(u, INT_MAX, cmd); return; } @@ -317,43 +337,80 @@ destroy(region * r, unit * u, const char * cmd) return; } + if(s && *s) { + n = atoi(s); + if(n <= 0) { + cmistake(u, cmd, 288, MSG_PRODUCE); + return; + } + } + + if(getparam() == P_ROAD) { + destroy_road(u, n, cmd); + return; + } + if (u->building) { building *b = u->building; +#if 0 con = b->type->construction; size = b->size; - /* befördere alle Einheiten hinaus */ +#endif - for (u2 = r->units; u2; u2 = u2->next) - if (u2->building == b) { - u2->building = 0; - freset(u2, FL_OWNER); - } - add_message(&u->faction->msgs, new_message( - u->faction, "destroy%b:building%u:unit", b, u)); - destroy_building(b); + if(n >= b->size) { + /* destroy completly */ + /* all units leave the building */ + for (u2 = r->units; u2; u2 = u2->next) + if (u2->building == b) { + u2->building = 0; + freset(u2, FL_OWNER); + } + add_message(&u->faction->msgs, new_message( + u->faction, "destroy%b:building%u:unit", b, u)); + destroy_building(b); + } else { + /* partial destroy */ + b->size -= n; + add_message(&u->faction->msgs, new_message( + u->faction, "destroy_partial%b:building%u:unit", b, u)); + } } else if (u->ship) { sh = u->ship; +#if 0 con = sh->type->construction; size = (sh->size * DAMAGE_SCALE - sh->damage) / DAMAGE_SCALE; +#endif + if (rterrain(r) == T_OCEAN) { cmistake(u, cmd, 14, MSG_EVENT); return; } - for (u2 = r->units; u2; u2 = u2->next) - if (u2->ship == sh) { - u2->ship = 0; - freset(u2, FL_OWNER); - } - add_message(&u->faction->msgs, new_message( - u->faction, "shipdestroy%u:unit%r:region%h:ship", u, r, sh)); - - destroy_ship(sh, r); + if(n >= (sh->size*100)/sh->type->construction->maxsize) { + /* destroy completly */ + /* all units leave the ship */ + for (u2 = r->units; u2; u2 = u2->next) + if (u2->ship == sh) { + u2->ship = 0; + freset(u2, FL_OWNER); + } + add_message(&u->faction->msgs, new_message( + u->faction, "shipdestroy%u:unit%r:region%h:ship", u, r, sh)); + destroy_ship(sh, r); + } else { + /* partial destroy */ + sh->size -= (sh->type->construction->maxsize * n)/100; + add_message(&u->faction->msgs, new_message( + u->faction, "shipdestroy_partial%u:unit%r:region%h:ship", u, r, sh)); + } } else printf("* Fehler im Program! Die Einheit %s von %s\n" " (Spieler: %s) war owner eines objects,\n" " war aber weder in einer Burg noch in einem Schiff.\n", unitname(u), u->faction->name, u->faction->email); + +#if 0 + /* Achtung: Nicht an ZERSTÖRE mit Punktangabe angepaßt! */ if (con) { /* Man sollte alle Materialien zurückkriegen können: */ int c; @@ -364,6 +421,7 @@ destroy(region * r, unit * u, const char * cmd) change_resource(u, rq->type, recycle); } } +#endif } /* ------------------------------------------------------------- */ @@ -505,7 +563,7 @@ build(unit * u, const construction * ctype, int completed, int want) int made = 0; int basesk, effsk; - if (want==0) return 0; + if (want<=0) return 0; if (type==NULL) return 0; if (type->improvement==NULL && completed==type->maxsize) return ECOMPLETE; @@ -582,7 +640,6 @@ build(unit * u, const construction * ctype, int completed, int want) if (want>0) n = min(want, n); if (type->maxsize>0) { - /* && type->improvement!=NULL) { */ n = min(type->maxsize-completed, n); } @@ -671,8 +728,6 @@ build_building(unit * u, const building_type * btype, int want) int c, built = 0; building * b = getbuilding(r); /* einmalige Korrektur */ - static FILE *statfile = NULL; - const construction *con = btype->construction; static char buffer[8 + IDSIZE + 1 + NAMESIZE + 1]; const char *string2; @@ -706,7 +761,13 @@ build_building(unit * u, const building_type * btype, int want) } if (b) built = b->size; - if (want<=0) want = INT_MAX; + if (want<=0 || want == INT_MAX) { + if(b == NULL) { + want = btype->maxsize - built; + } else { + want = b->type->maxsize - built; + } + } built = build(u, btype->construction, built, want); switch (built) { @@ -771,12 +832,6 @@ build_building(unit * u, const building_type * btype, int want) sprintf(buffer, "%s %d %s %s", keywords[K_MAKE], want-built, string2, buildingid(b)); set_string(&u->lastorder, buffer); - /* einmalige Korrektur */ - if(turn==209 && con->maxsize > 0 && con->reqsize > 1) - fprintf(statfile,"%d;%d;%d;%d\n", - b->no, u->no, b->size, built); - /* Korrektur ende */ - b->size += built; if (b->type == &bt_lighthouse) update_lighthouse(b); diff --git a/src/common/kernel/eressea.c b/src/common/kernel/eressea.c index d115ba576..917b8d7e6 100644 --- a/src/common/kernel/eressea.c +++ b/src/common/kernel/eressea.c @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: eressea.c,v 1.25 2001/02/28 23:28:53 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -790,7 +789,7 @@ cansee(const faction * f, const region * r, const unit * u, int modifier) int n; boolean cansee = false; unit *u2; - if (u->faction == f || f->race == RC_ILLUSION) cansee = true; + if (u->faction == f || omniscient(f)) cansee = true; else if (u->race == RC_SPELL || u->number == 0) return false; else { n = eff_stealth(u, r) - modifier; @@ -837,7 +836,7 @@ cansee(faction * f, region * r, unit * u, int modifier) #endif int n = 0; boolean ring = false; - if (u->faction == f || f->race == RC_ILLUSION) return true; + if (u->faction == f || omniscient(f)) return true; #if FAST_CANSEE /* buggy */ if (lastr==r && lastf==f) { n = eff_stealth(u, r) - modifier; diff --git a/src/common/kernel/eressea.h b/src/common/kernel/eressea.h index a6b3da59a..726581874 100644 --- a/src/common/kernel/eressea.h +++ b/src/common/kernel/eressea.h @@ -662,7 +662,8 @@ enum { RC_GHOUL_LORD, RC_MUS_SPIRIT, /* 58 */ - RC_GNOME, /* 59 */ + RC_GNOME, /* 59 */ + RC_TEMPLATE, /* 60 */ MAXRACES, NORACE = (race_t) - 1 diff --git a/src/common/kernel/karma.c b/src/common/kernel/karma.c index bf2586c75..59a7025f4 100644 --- a/src/common/kernel/karma.c +++ b/src/common/kernel/karma.c @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: karma.c,v 1.4 2001/03/07 15:00:18 corwin Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -73,7 +72,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "Schaden innerhalb einer Woche und zusätzlich in jeder Kampfrunde " "HP entsprechend ihres Ausdauer-Talents. Sie benötigen jedoch 11 " "Unterhalt pro Woche.", - false + 1 }, { "Städter", @@ -85,7 +84,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "bei einem Turm 1 Silber, bei einer Befestigung 3 Silber weniger. Gibt " "es kein entsprechendes Gebäude in der Region, verringert sich ihr " "Arbeitslohn um 5 Silber.", - false + 1 }, { "Barbar", @@ -96,7 +95,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "In allen nichtkriegerischen Talenten einschließlich Magie und Taktik " "erhalten sie die entsprechende Anzahl von Lerntagen weniger pro " "Lernwoche.", - true + 100 }, /* TODO: Noch nicht so implementiert. */ { @@ -110,7 +109,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "Ein junger Drache benötigt 1000 Silber Unterhalt pro Woche, ein " "ausgewachsener Drache 5000 und ein Wyrm 10000 Silber. Bekommt er " "dieses Silber nicht, besteht eine Wahrscheinlichkeit, das er desertiert!", - true + 100 }, /* TODO: Relativ sinnlose Eigenschaft. */ { @@ -118,7 +117,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "Alle Personen dieser Partei beginnen mit 30 Talenttagen in allen " "Waffentalenten, in denen ihre Rasse keinen Malus hat. Zusätzliche " "Stufen bringen jeweils einen zusätzlichen Talentpunkt.", - true + 100 }, { "Feenreich", @@ -128,7 +127,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "solche Waffe nehmen sie einen zusätzlichen Schadenspunkt. Zusätzliche " "Stufen dieser Eigenschaft verringern das Gewicht auf 1/3, 1/4, ... und " "erhöhen den Schaden durch Eisenwaffen um einen weiteren Punkt.", - true + 100 }, { "Administrator", @@ -137,7 +136,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "so dass sich der Unterhalt pro Person um 1 Silberstück erhöht. Weitere " "Stufen der Eigenschaft erhöhen das Limit um weitere 400 Einheiten und " "den Unterhalt um ein weiteres Silberstück.", - true + 100 }, /* TODO: Noch nicht so implementiert */ { @@ -147,8 +146,14 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "wie eigene Einheiten, mit allen Talentwerten und Gegenständen. Leider " "führt eine so intensive Beschäftigung mit dem Geistigen zur körperlichen " "Verkümmerung, und die Partei erhält -1 auf alle Talente außer " - "Alchemie, Kräuterkunde, Magie, Spionage, Tarnung und Wahrnehmung.", - false + "Alchemie, Kräuterkunde, Magie, Spionage, Tarnung und Wahrnehmung. Wird " + "diese Eigenschaft ein zweites Mal erworben, so bleibt die Wirkung nicht " + "auf Magier beschränkt, sondern alle Einheiten einer Partei können " + "die Talente und Gegenstände aller fremden Einheiten sehen. Allerdings " + "gibt es in beiden Fällen eine Einschränkung: Die Einheit muß sich einen " + "Monat lang auf die psychischen Ströme einer Region einstellen, bevor " + "sie in der Lage ist, die Gedanken der anderen zu lesen.", + 2 }, { "Amphibium", @@ -157,7 +162,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "Ozeanfeld stehen. Pferde weigern sich, in ein Ozeanfeld zu laufen. " "Zusätzliche Stufen dieser Eigenschaft reduzieren den Schaden um jeweils " "5 Punkte. Achtung: Auf dem Ozean wird kein Schaden regeneriert.", - true + 3 }, /* TODO: negative Eigenschaft */ { @@ -165,14 +170,14 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "Eine Partei mit dieser Eigenschaft hat eine so hohe magische " "Affinität, dass sie pro Stufe der Eigenschaft zwei zusätzlich Magier " "ausbilden kann.", - true + 100 }, /* TODO: negative Eigenschaft */ { "Sappeur", "Befestigungen wirken gegen Einheiten einer Partei mit dieser " "Eigenschaft nur mit ihrer halben Schutzwirkung (aufgerundet).", - false + 1 }, /* TODO: Noch nicht implementiert */ { @@ -185,7 +190,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "versetzen. Zusätzliche Stufen erhöhen die Reichweite um jeweils " "eine Region, erhöhen jedoch die Wahrscheinlichkeit eines zufälligen " "Versetzens geringfügig.", - true + 100 }, { "Versteckt", @@ -197,7 +202,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "Um diese Eigenschaft steuern zu können, stehen diesen Parteien die " "Befehle TARNE ANZAHL [NICHT] und TARNE GEGENSTÄNDE [NICHT] zur " "Verfügung.", - false + 1 }, /* TODO: Noch nicht implementiert */ { @@ -206,14 +211,14 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "sich mit Hilfe eines speziellen Befehls jede Woche um eine Region " "bewegen. Dies macht es den Bewohnern jedoch unmöglich, in dieser " "Woche ihren normalen Tätigkeiten nachzugehen.", - false + 1 }, { "Magische Immunität", "Eine Partei mit dieser Eigenschaft ist völlig immun gegen alle Arten " "von Magie. Allerdings verlieren die Magier einer solchen Partei ihre " "Fähigkeit, Aura zu regenerieren, völlig.", - false + 1 }, /* TODO: Noch nicht implementiert */ { @@ -221,7 +226,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "Eine Partei mit dieser Eigenschaft kann einen ihrer Magier in einem " "anderen als dem Parteimagiegebiet ausbilden. Weitere Stufen ermöglichen " "jeweils einem weiteren Magier das Lernen eines anderen Gebiets.", - true + 100 }, { "Jihad", @@ -235,7 +240,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "oder eine Rasse mehrfach, in diesem Fall addiert sich die Wirkung. " "Ein einmal erklärter Jihad kann nicht wieder rückgängig gemacht " "werden.", - true + 100 }, /* TODO: is_undead() und Sonderbehandlungen von Untoten */ { @@ -244,7 +249,7 @@ struct fspecialdata fspecials[MAXFACTIONSPECIALS] = { "soviele Trefferpunkte wie normale Angehörige der entsprechenden Rasse, " "verlieren jedoch ihre Fähigkeit zur Regeneration erlittenen Schadens " "komplett.", - false + 100 } }; @@ -275,7 +280,7 @@ buy_special(unit *u, strlist *S, fspecial_t special) /* Alles ok, attribut geben */ if(a2) { - if(fspecials[special].levels) { + if(a2->data.sa[1] < fspecials[special].maxlevel) { a2->data.sa[1]++; add_message(&f->msgs, new_message(f, "new_fspecial_level%S:special%d:level", special, a2->data.sa[1])); diff --git a/src/common/kernel/karma.h b/src/common/kernel/karma.h index 24a522e40..40f83b670 100644 --- a/src/common/kernel/karma.h +++ b/src/common/kernel/karma.h @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: karma.h,v 1.3 2001/02/28 18:25:25 corwin Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -46,9 +45,9 @@ typedef enum { typedef struct fspecialdata fspecialdata; struct fspecialdata { - const char *name; - const char *description; - boolean levels; + const char *name; + const char *description; + const short maxlevel; }; extern struct attrib_type at_faction_special; diff --git a/src/common/kernel/kernel-5.dsp b/src/common/kernel/kernel-5.dsp index dd4296ace..5597de537 100644 --- a/src/common/kernel/kernel-5.dsp +++ b/src/common/kernel/kernel-5.dsp @@ -9,19 +9,19 @@ CFG=kernel - Win32 Debug NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den\ Befehl -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "kernel-5.mak". -!MESSAGE +!MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "kernel-5.mak" CFG="kernel - Win32 Debug" -!MESSAGE +!MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: -!MESSAGE +!MESSAGE !MESSAGE "kernel - Win32 Release" (basierend auf "Win32 (x86) Static Library") !MESSAGE "kernel - Win32 Debug" (basierend auf "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP Scc_ProjName "" @@ -70,7 +70,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"Debug\kernel.lib" -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/kernel/kernel-6.dsp b/src/common/kernel/kernel-6.dsp index e0e7ff2e5..ed60f3123 100644 --- a/src/common/kernel/kernel-6.dsp +++ b/src/common/kernel/kernel-6.dsp @@ -7,21 +7,21 @@ CFG=kernel - Win32 Conversion !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "kernel-6.mak". -!MESSAGE +!MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "kernel-6.mak" CFG="kernel - Win32 Conversion" -!MESSAGE +!MESSAGE !MESSAGE Possible choices for configuration are: -!MESSAGE +!MESSAGE !MESSAGE "kernel - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "kernel - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE "kernel - Win32 Conversion" (based on "Win32 (x86) Static Library") !MESSAGE "kernel - Win32 Profile" (based on "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 @@ -122,7 +122,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/kernel/movement.c b/src/common/kernel/movement.c index becb9e174..fc5f2d33c 100644 --- a/src/common/kernel/movement.c +++ b/src/common/kernel/movement.c @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: movement.c,v 1.15 2001/03/04 18:41:25 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -137,7 +136,6 @@ getdirection(void) } /* ------------------------------------------------------------- */ -#ifdef NEW_DRIVE static attrib_type at_driveweight = { "driveweight", NULL, NULL, NULL, NULL, NULL }; @@ -151,7 +149,6 @@ eff_weight(const unit *u) return weight(u); } -#endif int ridingcapacity(unit * u) @@ -248,11 +245,7 @@ canwalk(unit * u) if (pferde > maxpferde) return 2; -#ifdef NEW_DRIVE if (walkingcapacity(u) - eff_weight(u) >= 0) -#else - if (walkingcapacity(u) - weight(u) >= 0) -#endif return 0; /* Stimmt das Gewicht, impliziert dies hier, daß alle Wagen ohne @@ -316,11 +309,7 @@ canride(unit * u) return 0; } -#ifdef NEW_DRIVE if(ridingcapacity(u) - eff_weight(u) >= 0) { -#else - if(ridingcapacity(u) - weight(u) >= 0) { -#endif if(pferde == 0 && unicorns >= u->number && !(race[u->race].flags & RCF_HORSE)) { return 2; } @@ -767,20 +756,47 @@ cycle_route(unit *u, int gereist) set_string(&u->lastorder, neworder); } -#ifdef NEW_DRIVE void init_drive(void) { region *r; unit *u, *ut, *u2; - strlist *S, *St; + strlist *S; int w; - /* This function calculates the weights of all transported units and - * adds them to an internal counter which is used by travel() to - * calculate effective weight and movement. */ - for (r=regions; r; r=r->next) { + /* This is just a simple check for non-corresponding K_TRANSPORT/ + * K_DRIVE. This is time consuming for an error check, but there + * doesn't seem to be an easy way to speed this up. */ + + for(u=r->units; u; u=u->next) { + if(igetkeyword(u->thisorder) == K_DRIVE && !fval(u, FL_LONGACTION)) { + boolean found = false; + ut = getunit(r, u); + if(!ut) { + cmistake(u, findorder(u, u->thisorder), 64, MSG_MOVE); + continue; + } + for (S = ut->orders; S; S = S->next) if (igetkeyword(S->s) == K_TRANSPORT) { + if(getunit(r, ut) == u) { + found = true; + break; + } + } + if(found == false) { + if(cansee(u->faction, r, ut, 0)) { + cmistake(u, findorder(u, u->thisorder), 286, MSG_MOVE); + } else { + cmistake(u, findorder(u, u->thisorder), 64, MSG_MOVE); + } + } + } + } + + /* This calculates the weights of all transported units and + * adds them to an internal counter which is used by travel() to + * calculate effective weight and movement. */ + for (u=r->units; u; u=u->next) { w = 0; @@ -788,7 +804,7 @@ init_drive(void) ut = getunit(r, u); if(!ut) continue; - for (St = ut->orders; St; St = St->next) if (igetkeyword(St->s) == K_DRIVE) { + if (igetkeyword(ut->thisorder) == K_DRIVE && !fval(ut, FL_LONGACTION)) { u2 = getunit(r, u); if(u2 == u) { w += weight(ut); @@ -801,7 +817,6 @@ init_drive(void) } } } -#endif int *storms; @@ -863,9 +878,6 @@ travel(region * first, unit * u, region * next, int flucht) region *rv[MAXSPEED]; strlist *S; unit *ut, *u2; -#ifndef NEW_DRIVE - int restkapazitaet; -#endif int gereist = 0; char buf2[80]; static direction_t route[MAXSPEED]; @@ -880,7 +892,9 @@ travel(region * first, unit * u, region * next, int flucht) * Normalerweise verliert man 3 BP pro Region, bei Straßen nur 2 BP. * Außerdem: Wenn Einheit transportiert, nur halbe BP */ - if (!dragon(u) && rterrain(next) == T_OCEAN && (u->ship || rterrain(current)==T_OCEAN)) { + if (rterrain(current)==T_OCEAN + && !(race[u->race].flags&(RCF_FLY) && rterrain(next)!=T_OCEAN)) + { /* Die Einheit kann nicht fliegen, ist im Ozean, und will an Land */ if (u->race != RC_AQUARIAN) { cmistake(u, findorder(u, u->thisorder), 44, MSG_MOVE); @@ -891,7 +905,7 @@ travel(region * first, unit * u, region * next, int flucht) return NULL; } } - } else { + } else if (rterrain(current)!=T_OCEAN) { /* An Land kein NACH wenn in dieser Runde Schiff VERLASSEN! */ if (leftship(u) && is_guarded(current, u, GUARD_LANDING)) { cmistake(u, findorder(u, u->thisorder), 70, MSG_MOVE); @@ -901,9 +915,7 @@ travel(region * first, unit * u, region * next, int flucht) cmistake(u, findorder(u, u->thisorder), 143, MSG_MOVE); return NULL; } - } - - if (rterrain(next) == T_OCEAN && u->ship && u->ship->moved == 1) { + } else if (rterrain(next) == T_OCEAN && u->ship && u->ship->moved == 1) { cmistake(u, findorder(u, u->thisorder), 13, MSG_MOVE); return NULL; } @@ -1125,67 +1137,46 @@ travel(region * first, unit * u, region * next, int flucht) /* und jetzt noch die transportierten Einheiten verschieben */ -#ifndef NEW_DRIVE - if (canride(u)) { - restkapazitaet = ridingcapacity(u) - weight(u); - } else { - restkapazitaet = walkingcapacity(u) - weight(u); - } -#endif - for (S = u->orders; S; S = S->next) { if (igetkeyword(S->s) == K_TRANSPORT) { - ut = getunit(first, u); - if (ut) { boolean found = false; - strlist * ot; - for(ot=ut->orders;ot && !found;ot = ot->next) { - if (igetkeyword(ot->s) == K_DRIVE) { - u2 = getunit(first, ut); - if (!u2) { - cmistake(ut, ut->thisorder, 64, MSG_MOVE); - continue; - } else { -#ifndef NEW_DRIVE - restkapazitaet -= weight(ut); - if (restkapazitaet >= 0) { -#endif - add_message(&u->faction->msgs, new_message( - u->faction, "transport%u:unit%u:target%r:start%r:end", - u, ut, first, current)); - - if(!(terrain[current->terrain].flags & WALK_INTO) - && get_item(ut, I_HORSE)) { - cmistake(ut, ut->thisorder, 67, MSG_MOVE); - continue; - } - if(can_survive(ut, current)) { - for (i = 0; i != m; i++) - travelthru(ut, rv[i]); - move_unit(ut, current, NULL); - } else { - cmistake(ut, ut->thisorder, 230, MSG_MOVE); - continue; - } -#ifndef NEW_DRIVE - } else { - sprintf(buf, "Keine Transportkapazitäten" - " frei für %s und deren Gepäck.", unitname(ut)); - mistake(u, u->thisorder, buf, MSG_MOVE); - } -#endif - } + if (igetkeyword(ut->thisorder) == K_DRIVE + && !fval(ut, FL_LONGACTION)) { + u2 = getunit(first, ut); + if(u2 == u) { found = true; + add_message(&u->faction->msgs, new_message( + u->faction, "transport%u:unit%u:target%r:start%r:end", + u, ut, first, current)); + if(!(terrain[current->terrain].flags & WALK_INTO) + && get_item(ut, I_HORSE)) { + cmistake(u, u->thisorder, 67, MSG_MOVE); + cmistake(ut, ut->thisorder, 67, MSG_MOVE); + continue; + } + if(can_survive(ut, current)) { + for (i = 0; i != m; i++) + travelthru(ut, rv[i]); + move_unit(ut, current, NULL); + } else { + cmistake(u, u->thisorder, 287, MSG_MOVE); + cmistake(ut, ut->thisorder, 230, MSG_MOVE); + continue; + } + } + } + if (!found) { + if(cansee(u->faction, u->region, ut, 0)) { + cmistake(u, findorder(u, u->thisorder), 90, MSG_MOVE); + } else { + cmistake(u, findorder(u, u->thisorder), 64, MSG_MOVE); } } - if (!found) cmistake(u, u->thisorder, 90, MSG_MOVE); } else { if (ut) { - sprintf(buf, - "Konnte %s in dieser Region nicht finden.", unitname(ut)); - mistake(u, u->thisorder, buf, MSG_MOVE); + cmistake(u, findorder(u, u->thisorder), 64, MSG_MOVE); } else { cmistake(u, findorder(u, u->thisorder), 99, MSG_MOVE); } @@ -1990,9 +1981,7 @@ movement(void) region *r; /* Initialize the additional encumbrance by transported units */ -#ifdef NEW_DRIVE init_drive(); -#endif for (r = regions; r; r = r->next) { unit ** up = &r->units; diff --git a/src/common/kernel/plane.c b/src/common/kernel/plane.c index 5226dfd15..fc26b7ba4 100644 --- a/src/common/kernel/plane.c +++ b/src/common/kernel/plane.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: plane.c,v 1.3 2001/02/17 14:47:42 enno Exp $ + * $Id: plane.c,v 1.4 2001/04/01 06:58:40 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -148,7 +148,6 @@ plane_center_x(plane *pl) int plane_center_y(plane *pl) - { if(pl == NULL) return 0; @@ -156,8 +155,8 @@ plane_center_y(plane *pl) return(pl->miny + pl->maxy)/2; } -int region_x(const region *r, const faction *f) - +int +region_x(const region *r, const faction *f) { plane *pl; @@ -165,8 +164,8 @@ int region_x(const region *r, const faction *f) return r->x - ursprung_x(f, pl) - plane_center_x(pl); } -int region_y(const region *r, const faction *f) - +int +region_y(const region *r, const faction *f) { plane *pl; @@ -176,7 +175,6 @@ int region_y(const region *r, const faction *f) void set_ursprung(faction *f, int id, int x, int y) - { ursprung *ur; @@ -219,7 +217,7 @@ create_new_plane(int id, const char *name, int minx, int maxx, int miny, int max /* Umrechnung Relative-Absolute-Koordinaten */ int -rel_to_abs(struct plane *pl, struct faction * f, int rel, unsigned char index) +rel_to_abs(const struct plane *pl, const struct faction * f, int rel, unsigned char index) { assert(index == 0 || index == 1); diff --git a/src/common/kernel/plane.h b/src/common/kernel/plane.h index b3f3fcc50..a46ea7e24 100644 --- a/src/common/kernel/plane.h +++ b/src/common/kernel/plane.h @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: plane.h,v 1.4 2001/02/17 14:47:42 enno Exp $ + * $Id: plane.h,v 1.5 2001/04/01 06:58:40 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -63,7 +63,7 @@ int ursprung_y(const struct faction *f, const plane *pl); void set_ursprung(struct faction *f, int id, int x, int y); plane * create_new_plane(int id, const char *name, int minx, int maxx, int miny, int maxy, int flags); plane * getplanebyname(const char *); -extern int rel_to_abs(struct plane *pl, struct faction * f, int rel, unsigned char index); +extern int rel_to_abs(const struct plane *pl, const struct faction * f, int rel, unsigned char index); extern void * resolve_plane(void * data); extern void write_plane_reference(const plane * p, FILE * F); diff --git a/src/common/kernel/race.c b/src/common/kernel/race.c index 70ee8d4cf..c12be98c2 100644 --- a/src/common/kernel/race.c +++ b/src/common/kernel/race.c @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: race.c,v 1.8 2001/02/28 18:25:25 corwin Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -46,6 +45,7 @@ /* libc includes */ #include +#include #include /* TODO: Tragkraft in die Struktur */ @@ -263,7 +263,7 @@ struct racedata race[MAXRACES] = 1, 0, 0, 0, -1, 1,-3, 1, -2, 1, 1, 0, -99 }, false, - RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM, + RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM | RCF_SHAPESHIFT, BF_EQUIPMENT | BF_MAGIC_EQUIPMENT, GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM, {RC_IMP, RC_IMP, RC_WRAITH, RC_RAT, RC_WARG, RC_IMP} @@ -479,7 +479,7 @@ struct racedata race[MAXRACES] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, true, - ( RCF_FLY | RCF_WALK | RCF_NOTEACH), + ( RCF_FLY | RCF_WALK | RCF_NOTEACH | RCF_SHAPESHIFT ), 0, GIVEITEM | GIVEPERSON | GETITEM, {NORACE,NORACE,NORACE,NORACE,NORACE,NORACE} @@ -613,7 +613,7 @@ struct racedata race[MAXRACES] = }, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - true, RCF_CANNOTMOVE|RCF_NOLEARN|RCF_NOTEACH, 0, + true, RCF_CANNOTMOVE|RCF_NOLEARN|RCF_NOTEACH|RCF_NOWEAPONS, 0, 0, {NORACE,NORACE,NORACE,NORACE,NORACE,NORACE} }, @@ -1136,12 +1136,12 @@ struct racedata race[MAXRACES] = Alc,Arm,Ber,Bog, Bur,Han,Hol,Kat, Kräu,Mag,Pfer,Rei, Rüs,Sbau,Hie,Seg, Sta,Spi,Stei,Str, Tak,Tar,Unt,Waf, Wag,Wahr,Steu,Aus, WlK */ { - 0, 1,-3, 1, -2, 1, 0,-2, 1, 0, 4, 0, -1,-3, 0,-3, - 1,-1,-1, 0, 0,-1, 0, 1, 1, 1, 1, 0, 0 + 0, 1,-3, 1, -2, 1, 0,-2, 1, 0, 4, 0, -1,-4, 0,-4, + 1,-1,-1, 0, 0,-1, 0, 1, 1, 0, 1, 0, 0 }, /* Nonplayer (bei Gelegenheit entfernen) */ - true, + false, /* Flags */ RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM | RCF_HORSE, @@ -1765,6 +1765,39 @@ struct racedata race[MAXRACES] = /* Vertraute für den Zauber (Generisch, Illaun, Tybied, Cerddor, Gwyrrd, Draig) */ {NORACE,NORACE,NORACE,NORACE,NORACE,NORACE} + }, + /* Template */ + { + /* const char *name[4] */ + {"Schablone", "Schablonen", "Schablonen", NULL}, + 1.0, /* Magieresistenz (0=Normal) */ + 0.0, /* Maximale Aura (1=Durchschnitt) */ + 0.0, /* Auraregeneration (1=Durchschnitt) */ + 1, 0, /* Rekrutierungskosten, Unterhalt pro Runde */ + 10000, /* Splitsize */ + 0, /* Gewicht */ + 10.0, /* Multiplikator Geschwindigkeit */ + 10, /* Trefferpunkte */ + "1d4", /* Schaden AT_STANDARD unbewaffnet */ + 0, /* Natürliche Rüstung */ + -2, -2, /* Angriff, Verteidigung unbewaffnet */ + 0, 0, /* Bonus Angriff, Verteidigung */ + { /* Angriffe */ + {AT_STANDARD, {NULL}, 0}, {AT_NONE, {NULL}, 0}, {AT_NONE, {NULL}, 0}, + {AT_NONE, {NULL}, 0}, {AT_NONE, {NULL}, 0}, {AT_NONE, {NULL}, 0}, + }, + { /* Talentboni */ + /* Alc,Arm,Ber,Bog, Bur,Han,Hol,Kat, Krä,Mag,Pfe,Rei, Rüs,Sba,Hie,Seg, */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* Sta,Spi,Ste,Str, Tak,Tar,Unt,Waf, Wag,Wah,Ste,Aus, WlK */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + true, /* Nonplayer (bei Gelegenheit entfernen) */ + (RCF_SHAPESHIFT | RCF_FLY | RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM), /* flags */ + (BF_EQUIPMENT | BF_MAGIC_EQUIPMENT), /* battle */ + (CANGUARD | GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM), /* economy */ + /* Vertraute für den Zauber (Gen, Ill, Tyb, Cer, Gwy, Dra) */ + {NORACE,NORACE,NORACE,NORACE,NORACE,NORACE} } }; @@ -1861,6 +1894,9 @@ give_starting_equipment(struct region *r, struct unit *u) } set_skill(u, SK_SAILING, 30); break; + case RC_CENTAUR: + rsethorses(r, 250+rand()%51+rand()%51); + break; } set_money(u, 2000 + turn * 10); diff --git a/src/common/kernel/race.h b/src/common/kernel/race.h index 4b49850bf..f7fad161c 100644 --- a/src/common/kernel/race.h +++ b/src/common/kernel/race.h @@ -33,7 +33,7 @@ #define AT_COMBATSPELL 7 #define AT_STRUCTURAL 8 -#define GOLEM_IRON 5 /* Anzahl Eisen in einem Eisengolem */ +#define GOLEM_IRON 4 /* Anzahl Eisen in einem Eisengolem */ #define GOLEM_STONE 5 /* Anzahl Steine in einem Steingolem */ typedef struct att { @@ -96,6 +96,7 @@ typedef struct race_type { #define RCF_ABSORBPEASANTS (1<<15) /* Tötet und absorbiert Bauern */ #define RCF_NOHEAL (1<<16) /* Einheit kann nicht geheilt werden */ #define RCF_NOWEAPONS (1<<17) /* Einheit kann keine Waffen bneutzen */ +#define RCF_SHAPESHIFT (1<<18) /* Kann TARNE RASSE benutzen. */ /* Economic flags */ #define NOGIVE (1<<0) /* gibt niemals nix */ @@ -122,9 +123,9 @@ typedef struct race_type { /* Wird in die Rückzugsberechnung nicht einbezogen */ #define BF_RES_PIERCE (1<<6) /* Halber Schaden durch PIERCE */ -#define BF_RES_CUT (1<<6) +#define BF_RES_CUT (1<<7) /* Halber Schaden durch CUT */ -#define BF_RES_BASH (1<<6) +#define BF_RES_BASH (1<<8) /* Halber Schaden durch BASH */ extern struct racedata race[]; @@ -138,6 +139,7 @@ boolean is_undead(const struct unit *u); #define nonplayer(u) (race[(u)->race].nonplayer) #define nonplayer_race(r) (race[r].nonplayer) #define illusionary(u) ((u)->race==RC_ILLUSION) +#define omniscient(f) ((f)->race==RC_ILLUSION || (f)->race==RC_TEMPLATE) extern boolean allowed_dragon(const struct region * src, const struct region * target); diff --git a/src/common/kernel/reports.c b/src/common/kernel/reports.c index 8766ce670..4ebeb7ccf 100644 --- a/src/common/kernel/reports.c +++ b/src/common/kernel/reports.c @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: reports.c,v 1.8 2001/03/07 15:00:18 corwin Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -267,7 +266,7 @@ bufunit(const faction * f, const unit * u, int indent, } dh = 0; - if (f == u->faction || telepath_see || u->faction->race==RC_ILLUSION) { + if (f == u->faction || telepath_see || omniscient(u->faction)) { show = u->items; } else if (!itemcloak && mode >= see_unit && !(a_fshidden && a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 3)) { diff --git a/src/common/kernel/save.c b/src/common/kernel/save.c index fde3a072a..efe72ef86 100644 --- a/src/common/kernel/save.c +++ b/src/common/kernel/save.c @@ -826,6 +826,9 @@ readgame(boolean backup) else f->magiegebiet = (magic_t)((rand() % 5)+1); + if (nonplayer_race(f->race)) { + f->lastorders = turn+1; + } if (global.data_version >= KARMA_VERSION) f->karma = ri(F); else diff --git a/src/common/kernel/spell.c b/src/common/kernel/spell.c index c4f224972..0a6275f21 100644 --- a/src/common/kernel/spell.c +++ b/src/common/kernel/spell.c @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: spell.c,v 1.14 2001/03/09 06:28:24 katze Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -692,6 +691,10 @@ sp_summon_familiar(castorder *co) } familiar = createunit(target_region, mage->faction, 1, rc); + if (target_region==mage->region) { + familiar->building = mage->building; + familiar->ship = mage->ship; + } familiar->status = ST_FLEE; /* flieht */ sprintf(buf, "Vertrauter von %s", unitname(mage)); set_string(&familiar->name, buf); @@ -1032,6 +1035,10 @@ sp_summonent(castorder *co) ents = min(power*power, rtrees(r)); u = createunit(r, mage->faction, ents, RC_TREEMAN); + if (r==mage->region) { + u->building = mage->building; + u->ship = mage->ship; + } set_string(&u->name, race[RC_TREEMAN].name[u->number>1]); if (fval(mage, FL_PARTEITARNUNG)) fset(u, FL_PARTEITARNUNG); @@ -1473,6 +1480,10 @@ sp_create_irongolem(castorder *co) } u2 = createunit(r, mage->faction, force*8, RC_IRONGOLEM); + if (r==mage->region) { + u2->building = mage->building; + u2->ship = mage->ship; + } set_skill(u2, SK_ARMORER, 30*u2->number); set_skill(u2, SK_WEAPONSMITH, 30*u2->number); if (fval(mage, FL_PARTEITARNUNG)) @@ -1536,6 +1547,10 @@ sp_create_stonegolem(castorder *co) } u2 = createunit(r, mage->faction, force* 5,RC_STONEGOLEM); + if (r==mage->region) { + u2->building = mage->building; + u2->ship = mage->ship; + } set_skill(u2, SK_ROAD_BUILDING, 30*u2->number); set_skill(u2, SK_BUILDING, 30*u2->number); if (fval(mage, FL_PARTEITARNUNG)) @@ -2221,9 +2236,14 @@ sp_ironkeeper(castorder *co) return 0; } keeper = createunit(r, mage->faction, 1, RC_IRONKEEPER); + if (r==mage->region) { + keeper->building = mage->building; + keeper->ship = mage->ship; + } /*keeper->age = cast_level + 2;*/ guard(keeper, GUARD_MINING); fset(keeper, FL_ISNEW); + set_string(&keeper->name, "Bergwächter"); keeper->status = ST_AVOID; /* kaempft nicht */ /* Parteitarnen, damit man nicht sofort weiß, wer dahinter steckt */ fset(keeper, FL_PARTEITARNUNG); @@ -2412,25 +2432,32 @@ patzer_peasantmob(castorder *co) int anteil = 6, n; unit *u; attrib *a; - region *r = co->rt; + region *r; unit *mage = (unit *)co->magician; + + if (mage->region->land){ + r = mage->region; + } else { + r = co->rt; + } - anteil += rand() % 4; - n = rpeasants(r) * anteil / 10; - rsetpeasants(r, rpeasants(r) - n); - assert(rpeasants(r) >= 0); + if (r->land) { + anteil += rand() % 4; + n = rpeasants(r) * anteil / 10; + rsetpeasants(r, rpeasants(r) - n); + assert(rpeasants(r) >= 0); - u = createunit(r, findfaction(MONSTER_FACTION), n, RC_PEASANT); - guard(u, GUARD_ALL); - a = a_new(&at_unitdissolve); - a->data.ca[0] = 1; /* An rpeasants(r). */ - a->data.ca[1] = 10; /* 10% */ - a_add(&u->attribs, a); - a_add(&u->attribs, make_hate(mage)); - - sprintf(buf, "Ein Bauernmob erhebt sich und macht Jagd auf Schwarzmagier."); - addmessage(r, 0, buf, MSG_MAGIC, ML_INFO); + u = createunit(r, findfaction(MONSTER_FACTION), n, RC_PEASANT); + guard(u, GUARD_ALL); + a = a_new(&at_unitdissolve); + a->data.ca[0] = 1; /* An rpeasants(r). */ + a->data.ca[1] = 10; /* 10% */ + a_add(&u->attribs, a); + a_add(&u->attribs, make_hate(mage)); + sprintf(buf, "Ein Bauernmob erhebt sich und macht Jagd auf Schwarzmagier."); + addmessage(r, 0, buf, MSG_MAGIC, ML_INFO); + } return; } @@ -3103,6 +3130,10 @@ sp_unholypower(castorder *co) } un = createunit(co->rt, u->faction, 0, target_race); + if (co->rt==u->region) { + un->building = u->building; + un->ship = u->ship; + } transfermen(u, un, n); add_message(&co->rt->msgs, new_message(mage->faction, "unholypower_limitedeffect%u:mage%u:target%s:race%i:amount", @@ -3296,6 +3327,10 @@ sp_summonshadow(castorder *co) int val; u = createunit(r, mage->faction, force*force, RC_SHADOW); + if (r==mage->region) { + u->building = mage->building; + u->ship = mage->ship; + } if (fval(mage, FL_PARTEITARNUNG)) fset(u, FL_PARTEITARNUNG); @@ -3339,6 +3374,10 @@ sp_summonshadowlords(castorder *co) int force = co->force; u = createunit(r, mage->faction, force*force, RC_SHADOWLORD); + if (r==mage->region) { + u->building = mage->building; + u->ship = mage->ship; + } if (fval(mage, FL_PARTEITARNUNG)) fset(u, FL_PARTEITARNUNG); @@ -3475,9 +3514,60 @@ sp_magicboost(castorder *co) } /* ------------------------------------------------------------- */ -/* Name: Totenruf - Mächte des Todes +/* Name: kleines Blutopfer * Stufe: 4 * Gebiet: Draig + * Kategorie: Einheit, positiv + * + * Wirkung: + * Hitpoints to Aura: 4:1/3:1 + * Patzer: + * permanenter HP verlust + * + * Flag: + * (ONSHIPCAST) + */ +static int +sp_bloodsacrifice(castorder *co) +{ + unit *mage = (unit *)co->magician; + int cast_level = co->level; + int aura, damage; + int hp = mage->hp - 5; /* braucht noch 4 HP zum Bezahlen des + Spruchs, und 1 HP zum Überleben*/ + + if (hp <= 0){ + report_failure(mage, co->order); + return 0; + } + + damage = min(hp, dice_rand("4d12")); + + if (eff_skill(mage, SK_MAGIC, mage->region) > 8){ + aura = damage / 3; + } else { + aura = damage / 4; + } + + if (aura <= 0){ + report_failure(mage, co->order); + return 0; + } + + get_mage(mage)->spellpoints += aura; + use_pooled(mage, mage->region, R_HITPOINTS, damage); + + add_message(&mage->faction->msgs, new_message(mage->faction, + "sp_bloodsacrifice_effect%u:unit%r:region%s:command%i:amount", + mage, mage->region, strdup(co->order), aura)); + + return cast_level; +} + +/* ------------------------------------------------------------- */ +/* Name: Totenruf - Mächte des Todes + * Stufe: 6 + * Gebiet: Draig * Kategorie: Beschwörung, positiv * Flag: FARCASTING * Wirkung: @@ -3515,6 +3605,10 @@ sp_summonundead(castorder *co) } u = make_undead_unit(r, mage->faction, undead, race); + if (r==mage->region) { + u->building = mage->building; + u->ship = mage->ship; + } if (fval(mage, FL_PARTEITARNUNG)) fset(u, FL_PARTEITARNUNG); @@ -3542,7 +3636,7 @@ sp_summonundead(castorder *co) * Gebiet: Draig * Kategorie: Region, negativ * Wirkung: - * Alle Magier in der betroffenen Region wird eine Teil ihrer + * Allen Magier in der betroffenen Region wird eine Teil ihrer * Magischen Kraft in die Gefilde des Chaos entzogen Jeder Magier im * Einflussbereich verliert Stufe(Zaubernden)*5% seiner Magiepunkte. * Keine Regeneration in der Woche (fehlt noch) @@ -4281,6 +4375,10 @@ sp_recruit(castorder *co) rsetpeasants(r, rpeasants(r) - n); u = createunit(r, f, n, f->race); + if (r==mage->region) { + u->building = mage->building; + u->ship = mage->ship; + } set_string(&u->name, n == 1 ? "Bauer" : "Bauern"); set_string(&u->thisorder, keywords[K_WORK]); u->status = mage->status; @@ -6959,7 +7057,7 @@ spell spelldaten[] = "werden, bevor die Aura sich verflüchtigt. " "Jeder Golem hat jede Runde eine Chance von 10% zu Staub zu zerfallen. " "Gibt man den Golems die Befehle MACHE BURG oder MACHE STRASSE, " - "so werden pro Golem 10 Steine verbaut und der Golem löst sich auf.", + "so werden pro Golem 5 Steine verbaut und der Golem löst sich auf.", NULL, NULL, M_DRUIDE, (SPELLLEVEL), 4, 1, @@ -6977,7 +7075,7 @@ spell spelldaten[] = "geschaffen werden. " "Jeder Golem hat jede Runde eine Chance von 15% zu Staub zu zerfallen. " "Gibt man den Golems den Befehl MACHE SCHWERT/BIHÄNDER oder " - "MACHE SCHILD/KETTENHEMD/PLATTENPANZER, so werden pro Golem 5 " + "MACHE SCHILD/KETTENHEMD/PLATTENPANZER, so werden pro Golem 4 " "Eisenbarren verbaut und der Golem löst sich auf.", NULL, NULL, @@ -7259,11 +7357,11 @@ spell spelldaten[] = "weiterhin unentdeckt.", NULL, NULL, - M_DRUIDE, (0), 5, 6, + M_DRUIDE, (ONSHIPCAST), 5, 6, { {R_AURA, 50, SPC_FIX}, {R_SILVER, 3000, SPC_FIX}, - {0, 0, 0}, + {R_PERMAURA, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}}, (spell_f)sp_createitem_trueseeing, patzer_createitem @@ -7276,11 +7374,11 @@ spell spelldaten[] = "einer unsichtbaren Einheit muss jede Person einen Ring tragen.", NULL, NULL, - M_DRUIDE, (0), 5, 6, + M_DRUIDE, (ONSHIPCAST), 5, 6, { {R_AURA, 50, SPC_FIX}, {R_SILVER, 3000, SPC_FIX}, - {0, 0, 0}, + {R_PERMAURA, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}}, (spell_f)sp_createitem_invisibility, patzer_createitem @@ -7440,7 +7538,7 @@ spell spelldaten[] = "welches in ihm aufbewahrte Kräuter besser zu konservieren vermag.", NULL, NULL, - M_DRUIDE, (0), 5, 5, + M_DRUIDE, (ONSHIPCAST), 5, 5, { {R_AURA, 30, SPC_FIX}, {R_PERMAURA, 1, SPC_FIX}, @@ -7659,6 +7757,24 @@ spell spelldaten[] = (spell_f)sp_magicboost, patzer }, + {SPL_BLOODSACRIFICE, "kleines Blutopfer", + "Mit diesem Ritual kann der Magier einen Teil seiner Lebensenergie " + "opfern, um dafür an magischer Kraft zu gewinnen. Erfahrene " + "Ritualmagier berichten, das sich das Ritual, einmal initiiert, nur " + "schlecht steuern ließe und die Menge der so gewonnenen Kraft stark " + "schwankt.", + NULL, + NULL, + M_CHAOS, (ONSHIPCAST), 1, 4, + { + {R_HITPOINTS, 4, SPC_FIX}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}}, + (spell_f)sp_bloodsacrifice, patzer + }, + {SPL_BERSERK, "Blutrausch", "In diesem blutigen Ritual opfert der Magier vor der Schlacht ein " "Neugeborenes vor den Augen seiner Armee. Die so gerufenen Blutgeister " @@ -7695,6 +7811,7 @@ spell spelldaten[] = (spell_f)sp_fumblecurse, patzer_fumblecurse }, +<<<<<<< spell.c {SPL_SUMMONUNDEAD, "Mächte des Todes", "Nächtelang muss der Schwarzmagier durch die Friedhöfe und Gräberfelder " "der Region ziehen um dann die ausgegrabenen Leichen beleben zu können. " @@ -7703,16 +7820,16 @@ spell spelldaten[] = "sein kann.", NULL, NULL, - M_CHAOS, (SPELLLEVEL | FARCASTING), 5, 6, + M_CHAOS, (SPELLLEVEL | FARCASTING | ONSHIPCAST), 5, 6, { + { {R_AURA, 5, SPC_LEVEL}, - {0, 0, 0}, - {0, 0, 0}, - {0, 0, 0}, - {0, 0, 0}}, - (spell_f)sp_summonundead, patzer_peasantmob + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}}, + (spell_f)sp_summonundead, patzer_peasantmob }, - {SPL_COMBATRUST, "Rosthauch", "Mit diesem Ritual wird eine dunkle Gewitterfront " "beschworen, die sich unheilverkündend über der Region auftürmt. " @@ -7738,11 +7855,11 @@ spell spelldaten[] = "weiterhin unentdeckt.", NULL, NULL, - M_CHAOS, (0), 5, 6, + M_CHAOS, (ONSHIPCAST), 5, 6, { {R_AURA, 50, SPC_FIX}, {R_SILVER, 3000, SPC_FIX}, - {0, 0, 0}, + {R_PERMAURA, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}}, (spell_f)sp_createitem_trueseeing, patzer_createitem @@ -7755,11 +7872,11 @@ spell spelldaten[] = "einer unsichtbaren Einheit muss jede Person einen Ring tragen.", NULL, NULL, - M_CHAOS, (0), 5, 6, + M_CHAOS, (ONSHIPCAST), 5, 6, { {R_AURA, 50, SPC_FIX}, {R_SILVER, 3000, SPC_FIX}, - {0, 0, 0}, + {R_PERMAURA, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}}, (spell_f)sp_createitem_invisibility, patzer_createitem @@ -7874,7 +7991,7 @@ spell spelldaten[] = "die trollisch zähe Haut positiv auswirken.", NULL, NULL, - M_CHAOS, (0), 5, 9, + M_CHAOS, (ONSHIPCAST), 5, 9, { {R_AURA, 20, SPC_FIX}, {R_PERMAURA, 1, SPC_FIX}, @@ -8040,14 +8157,14 @@ spell spelldaten[] = "senden, das Schwert mit seiner Macht zu beseelen...'", NULL, NULL, - M_CHAOS, (0), 5, 12, - { - {R_AURA, 150, SPC_FIX}, - {R_BERSERK, 1, SPC_FIX}, - {R_SWORD, 1, SPC_FIX}, - {0, 0, 0}, - {0, 0, 0}}, - (spell_f)sp_create_firesword, patzer + M_CHAOS, (ONSHIPCAST), 5, 12, + { + {R_AURA, 100, SPC_FIX}, + {R_BERSERK, 1, SPC_FIX}, + {R_SWORD, 1, SPC_FIX}, + {R_PERMAURA, 1, SPC_FIX}, + {0, 0, 0}}, + (spell_f)sp_create_firesword, patzer }, {SPL_DRAIG_FAMILIAR, "Vertrauten rufen", @@ -8056,24 +8173,24 @@ spell spelldaten[] = "Magier anschließen wird.", NULL, NULL, - M_CHAOS, (NOTFAMILIARCAST), 5, 13, - { + M_CHAOS, (NOTFAMILIARCAST), 5, 13, + { {R_AURA, 100, SPC_FIX}, {R_PERMAURA, 5, SPC_FIX}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}}, - (spell_f)sp_summon_familiar, patzer + (spell_f)sp_summon_familiar, patzer }, {SPL_CHAOSSUCTION, "Chaossog", - "Durch das Opfern von 500 Bauern kann der Chaosmagier ein Tor zur " - "astralen Welt öffnen. Das Tor kann in der Folgewoche verwendet werden, " - "es löst sich am Ende der Folgewoche auf.", + "Durch das Opfern von 500 Bauern kann der Chaosmagier ein Tor zur " + "astralen Welt öffnen. Das Tor kann in der Folgewoche verwendet werden, " + "es löst sich am Ende der Folgewoche auf.", NULL, NULL, - M_CHAOS, (0), 5, 14, - { + M_CHAOS, (0), 5, 14, + { {R_AURA, 150, SPC_FIX}, {R_PEASANTS, 500, SPC_FIX}, {0, 0, 0}, @@ -8088,7 +8205,9 @@ spell spelldaten[] = "Der Zauberer sendet dem Ziel des Spruches einen Traum.", "ZAUBERE Traumsenden ", "u", - M_TRAUM, (UNITSPELL | TESTCANSEE | SPELLLEVEL | ONETARGET), 5, 1, + M_TRAUM, + (UNITSPELL | TESTCANSEE | SPELLLEVEL | ONETARGET | ONSHIPCAST), + 5, 1, { {R_AURA, 1, SPC_LEVEL}, {0, 0, 0}, @@ -8305,11 +8424,11 @@ spell spelldaten[] = "weiterhin unentdeckt.", NULL, NULL, - M_TRAUM, (0), 5, 6, + M_TRAUM, (ONSHIPCAST), 5, 6, { {R_AURA, 50, SPC_FIX}, {R_SILVER, 3000, SPC_FIX}, - {0, 0, 0}, + {R_PERMAURA, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}}, (spell_f)sp_createitem_trueseeing, patzer_createitem @@ -8322,11 +8441,11 @@ spell spelldaten[] = "einer unsichtbaren Einheit muss jede Person einen Ring tragen.", NULL, NULL, - M_TRAUM, (0), 5, 6, + M_TRAUM, (ONSHIPCAST), 5, 6, { {R_AURA, 50, SPC_FIX}, {R_SILVER, 3000, SPC_FIX}, - {0, 0, 0}, + {R_PERMAURA, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}}, (spell_f)sp_createitem_invisibility, patzer_createitem @@ -8482,15 +8601,15 @@ spell spelldaten[] = "es einige Wochen später...", NULL, "u+", - M_TRAUM, - (UNITSPELL | TESTRESISTANCE | TESTCANSEE | SPELLLEVEL), 5, 12, - { + M_TRAUM, + (UNITSPELL | TESTRESISTANCE | TESTCANSEE | SPELLLEVEL), 5, 12, + { {R_AURA, 5, SPC_LEVEL}, - {0, 0, 0}, - {0, 0, 0}, - {0, 0, 0}, - {0, 0, 0}}, - (spell_f)sp_sweetdreams, patzer + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}}, + (spell_f)sp_sweetdreams, patzer }, {SPL_CREATE_TACTICCRYSTAL, "Erschaffe ein Traumauge", @@ -8505,9 +8624,9 @@ spell spelldaten[] = "Die Interpretation von Träumen ist eine schwierige Angelegenheit.", NULL, NULL, - M_TRAUM, (0), 5, 14, + M_TRAUM, (ONSHIPCAST), 5, 14, { - {R_PERMAURA, 10, SPC_FIX}, + {R_PERMAURA, 5, SPC_FIX}, {R_DRAGONHEAD, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}, @@ -8843,11 +8962,11 @@ spell spelldaten[] = "weiterhin unentdeckt.", NULL, NULL, - M_BARDE, (0), 5, 6, + M_BARDE, (ONSHIPCAST), 5, 6, { {R_AURA, 50, SPC_FIX}, {R_SILVER, 3000, SPC_FIX}, - {0, 0, 0}, + {R_PERMAURA, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}}, (spell_f)sp_createitem_trueseeing, patzer_createitem @@ -8860,11 +8979,11 @@ spell spelldaten[] = "einer unsichtbaren Einheit muss jede Person einen Ring tragen.", NULL, NULL, - M_BARDE, (0), 5, 6, + M_BARDE, (ONSHIPCAST), 5, 6, { {R_AURA, 50, SPC_FIX}, {R_SILVER, 3000, SPC_FIX}, - {0, 0, 0}, + {R_PERMAURA, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}}, (spell_f)sp_createitem_invisibility, patzer_createitem @@ -9120,7 +9239,7 @@ spell spelldaten[] = "könnte dies ebenfalls von Nutzen sein.", NULL, NULL, - M_BARDE, (0), 5, 11, + M_BARDE, (ONSHIPCAST), 5, 11, { {R_AURA, 20, SPC_FIX}, {R_PERMAURA, 1, SPC_FIX}, @@ -9442,11 +9561,11 @@ spell spelldaten[] = "weiterhin unentdeckt.", NULL, NULL, - M_ASTRAL, (0), 5, 5, + M_ASTRAL, (ONSHIPCAST), 5, 5, { {R_AURA, 50, SPC_FIX}, {R_SILVER, 3000, SPC_FIX}, - {0, 0, 0}, + {R_PERMAURA, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}}, (spell_f)sp_createitem_trueseeing, patzer_createitem @@ -9533,11 +9652,11 @@ spell spelldaten[] = "einer unsichtbaren Einheit muss jede Person einen Ring tragen.", NULL, NULL, - M_ASTRAL, (0), 5, 6, + M_ASTRAL, (ONSHIPCAST), 5, 6, { {R_AURA, 50, SPC_FIX}, {R_SILVER, 3000, SPC_FIX}, - {0, 0, 0}, + {R_PERMAURA, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}}, (spell_f)sp_createitem_invisibility, patzer_createitem @@ -9552,7 +9671,7 @@ spell spelldaten[] = "fehlschlagen lassen.", NULL, NULL, - M_ASTRAL, (0), 5, 7, + M_ASTRAL, (ONSHIPCAST), 5, 7, { {R_AURA, 50, SPC_FIX}, {R_SILVER, 3000, SPC_FIX}, @@ -9593,7 +9712,7 @@ spell spelldaten[] = "ZAUBER \"Mauern der Ewigkeit\" ", "b", M_ASTRAL, - (SPELLLEVEL | BUILDINGSPELL | ONETARGET | TESTRESISTANCE), + (SPELLLEVEL | BUILDINGSPELL | ONETARGET | TESTRESISTANCE | ONSHIPCAST), 5, 7, { {R_AURA, 50, SPC_FIX}, @@ -9668,11 +9787,11 @@ spell spelldaten[] = "als wäre der Magier eine Stufe besser.", NULL, NULL, - M_ASTRAL, 0, 5, 9, + M_ASTRAL, (ONSHIPCAST), 5, 9, { {R_AURA, 100, SPC_FIX}, {R_SILVER, 4000, SPC_FIX}, - {0, 0, 0}, + {R_PERMAURA, 1, SPC_FIX}, {0, 0, 0}, {0, 0, 0}}, (spell_f)sp_createitem_power, patzer_createitem @@ -9704,7 +9823,7 @@ spell spelldaten[] = "selber wiegt 1 GE.", NULL, NULL, - M_ASTRAL, (0), 5, 10, + M_ASTRAL, (ONSHIPCAST), 5, 10, { {R_AURA, 30, SPC_FIX}, {R_PERMAURA, 1, SPC_FIX}, @@ -9830,7 +9949,7 @@ spell spelldaten[] = "Zauberers enorm größere Mengen an Aura zu beherrschen.", NULL, NULL, - M_GRAU, 0, 5, 9, + M_GRAU, (ONSHIPCAST), 5, 9, { {R_AURA, 100, SPC_FIX}, {R_PERMAURA, 1, SPC_FIX}, @@ -9846,7 +9965,7 @@ spell spelldaten[] = "seinem Träger zukommen.", NULL, NULL, - M_GRAU, 0, 5, 9, + M_GRAU, (ONSHIPCAST), 5, 9, { {R_AURA, 100, SPC_FIX}, {R_PERMAURA, 1, SPC_FIX}, @@ -9860,7 +9979,7 @@ spell spelldaten[] = "", NULL, NULL, - M_GRAU, 0, 5, 7, + M_GRAU, (ONSHIPCAST), 5, 7, { {R_AURA, 50, SPC_FIX}, {R_SILVER, 3000, SPC_FIX}, @@ -9894,7 +10013,7 @@ spell spelldaten[] = "und wird so gut wie immun gegen alle Formen von Magie.", NULL, NULL, - M_GRAU, 0, 5, 6, + M_GRAU, (ONSHIPCAST), 5, 6, { {R_AURA, 100, SPC_FIX}, {R_PERMAURA, 1, SPC_FIX}, diff --git a/src/common/kernel/spell.h b/src/common/kernel/spell.h index b894d43f9..8c0d97555 100644 --- a/src/common/kernel/spell.h +++ b/src/common/kernel/spell.h @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: spell.h,v 1.5 2001/01/31 17:40:51 corwin Exp $ + * $Id: spell.h,v 1.6 2001/04/01 06:58:40 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -194,6 +194,7 @@ enum { SPL_PUTTOREST, SPL_UNHOLYPOWER, SPL_HOLYGROUND, + SPL_BLOODSACRIFICE, MAXALLSPELLS, NO_SPELL = (spellid_t) -1 }; diff --git a/src/common/modules/gmcmd.c b/src/common/modules/gmcmd.c index 655373025..ff89306df 100644 --- a/src/common/modules/gmcmd.c +++ b/src/common/modules/gmcmd.c @@ -6,13 +6,15 @@ #include /* kernel includes */ -#include #include -#include -#include #include +#include +#include +#include +#include /* util includes */ +#include #include #include @@ -137,22 +139,122 @@ find_key(struct attrib * attribs, int key) } /** - ** GM: TERRAFORM + ** GM: TERRAFORM + ** requires: permission-key "gmterf" **/ static void gm_terraform(const char * str, struct unit * u) { + const struct plane * p = rplane(u->region); + int x = rel_to_abs(p, u->faction, atoi(igetstrtoken(str)), 0); + int y = rel_to_abs(p, u->faction, atoi(getstrtoken()), 1); + const char * c = getstrtoken(); + region * r = findregion(x, y); terrain_t t; - const char * c = igetstrtoken(str); - { + if (r==NULL || p!=rplane(r)) { + mistake(u, str, "Diese Regon kann die Einheit nicht umwandeln.\n", 0); + } else { /* checking permissions */ attrib * permissions = a_find(u->faction->attribs, &at_permissions); - if (!permissions || !find_key((attrib*)permissions->data.v, atoi36("gmtf"))) return; + if (!permissions || !find_key((attrib*)permissions->data.v, atoi36("gmterf"))) return; } for (t=0;t!=MAXTERRAINS;++t) { if (!strcasecmp(locale_string(u->faction->locale, terrain[t].name), c)) break; } - if (t!=MAXTERRAINS) terraform(u->region, t); + if (t!=MAXTERRAINS) terraform(r, t); +} + +/** + ** GM: TELEPORT + ** requires: permission-key "gmtele" + **/ +static void +gm_teleport(const char * str, struct unit * u) +{ + const struct plane * p = rplane(u->region); + unit * to = findunit(atoi36(igetstrtoken(str))); + int x = rel_to_abs(p, u->faction, atoi(getstrtoken()), 0); + int y = rel_to_abs(p, u->faction, atoi(getstrtoken()), 1); + region * r = findregion(x, y); + + if (r==NULL || p!=rplane(r)) { + mistake(u, str, "In diese Region kann die Einheit nicht teleportieren.\n", 0); + } if (to==NULL || (rplane(to->region)!=rplane(r) && !ucontact(to, u))) { + mistake(u, str, "Die Einheit wurde nicht gefunden, oder sie hat uns nicht kontaktiert.\n", 0); + } else { + /* checking permissions */ + attrib * permissions = a_find(u->faction->attribs, &at_permissions); + if (!permissions || !find_key((attrib*)permissions->data.v, atoi36("gmtele"))) { + mistake(u, str, "Unzureichende Rechte für diesen Befehl.\n", 0); + } + else move_unit(to, r, NULL); + } +} + +/** + ** GM: GIVE + ** requires: permission-key "gmgive" + **/ +static void +gm_give(const char * str, struct unit * u) +{ + unit * to = findunit(atoi36(igetstrtoken(str))); + int num = atoi(getstrtoken()); + const item_type * itype = finditemtype(getstrtoken(), u->faction->locale); + + if (to==NULL || rplane(to->region) != rplane(u->region)) { + /* unknown or in another plane */ + mistake(u, str, "Die Einheit wurde nicht gefunden.\n", 0); + } else if (itype==NULL || i_get(u->items, itype)==0) { + /* unknown or not enough */ + mistake(u, str, "So einen Gegenstand hat die Einheit nicht.\n", 0); + } else { + /* checking permissions */ + attrib * permissions = a_find(u->faction->attribs, &at_permissions); + if (!permissions || !find_key((attrib*)permissions->data.v, atoi36("gmgive"))) { + mistake(u, str, "Unzureichende Rechte für diesen Befehl.\n", 0); + } + else { + int i = i_get(u->items, itype); + if (iitems, itype, -num); + i_change(&to->items, itype, num); + } + } + } +} + +/** + ** GM: SKILL + ** requires: permission-key "gmskil" + **/ +static void +gm_skill(const char * str, struct unit * u) +{ + unit * to = findunit(atoi36(igetstrtoken(str))); + skill_t skill = findskill(getstrtoken()); + int num = atoi(getstrtoken()); + + if (to==NULL || rplane(to->region) != rplane(u->region)) { + /* unknown or in another plane */ + mistake(u, str, "Die Einheit wurde nicht gefunden.\n", 0); + } else if (skill==NOSKILL || skill==SK_MAGIC || skill==SK_ALCHEMY) { + /* unknown or not enough */ + mistake(u, str, "Dieses Talent ist unbekannt, oder kann nciht erhöht werden.\n", 0); + } else if (num<0 || num>5000) { + /* sanity check failed */ + mistake(u, str, "Der gewählte Wert ist nicht zugelassen.\n", 0); + } else { + /* checking permissions */ + attrib * permissions = a_find(u->faction->attribs, &at_permissions); + if (!permissions || !find_key((attrib*)permissions->data.v, atoi36("gmskil"))) { + mistake(u, str, "Unzureichende Rechte für diesen Befehl.\n", 0); + } + else { + set_skill(to, skill, num); + } + } } static void @@ -180,9 +282,11 @@ init_gmcmd(void) add_gmcommand(&g_cmds, "gm", &gm_command); add_gmcommand(&g_cmds, "terraform", &gm_terraform); add_gmcommand(&g_cmds, "create", &gm_create); + add_gmcommand(&g_cmds, "give", &gm_give); + add_gmcommand(&g_cmds, "teleport", &gm_teleport); + add_gmcommand(&g_cmds, "skill", &gm_skill); } - /* * execute gm-commands for all units in the game */ @@ -206,6 +310,100 @@ gmcommands(void) if (*rp==r) rp = &r->next; } } + +#define EXTENSION 10000 + +faction * +gm_addquest(const char * email, const char * name, int radius, unsigned int flags) +{ + plane * p; + attrib * a; + unit * u; + region * center; + boolean invalid = false; + int minx, miny, maxx, maxy, cx, cy; + int x, y, i; + faction * f = calloc(1, sizeof(faction)); + + /* GM faction */ + a_add(&f->attribs, make_key(atoi36("quest"))); + f->banner = strdup("Questenpartei"); + f->passw = strdup(itoa36(rand())); + f->email = strdup(email); + f->name = strdup("Questenpartei"); + f->race = RC_TEMPLATE; + f->age = 0; + f->lastorders = turn; + f->alive = true; + f->locale = find_locale("de"); + f->options = want(O_COMPRESS) | want(O_REPORT) | want(O_COMPUTER) | want(O_ADRESSEN); + { + faction * xist; + int i = atoi36("gm00")-1; + do { + xist = findfaction(++i); + } while (xist); + + f->no = i; + addlist(&factions, f); + } + + /* GM playfield */ + do { + minx = (rand() % (2*EXTENSION)) - EXTENSION; + miny = (rand() % (2*EXTENSION)) - EXTENSION; + for (x=0;!invalid && x<=radius*2;++x) { + for (y=0;!invalid && y<=radius*2;++y) { + region * r = findregion(minx+x, miny+y); + if (r) invalid = true; + } + } + } while (invalid); + maxx = minx+2*radius; cx = minx+radius; + maxy = miny+2*radius; cy = miny+radius; + p = create_new_plane(rand(), name, minx, maxx, miny, maxy, flags); + center = new_region(cx, cy); + for (x=0;x<=2*radius;++x) { + int y; + for (y=0;y<=2*radius;++y) { + region * r = findregion(minx+x, miny+y); + if (!r) r = new_region(minx+x, miny+y); + freset(r, RF_ENCOUNTER); + r->planep = p; + if (distance(r, center)==radius) { + terraform(r, T_FIREWALL); + } else if (r==center) { + terraform(r, T_PLAIN); + } else { + terraform(r, T_OCEAN); + } + } + } + + /* generic permissions */ + a = a_add(&f->attribs, a_new(&at_permissions)); + + a_add((attrib**)&a->data.v, make_key(atoi36("gmterf"))); + a_add((attrib**)&a->data.v, make_key(atoi36("gmtele"))); + a_add((attrib**)&a->data.v, make_key(atoi36("gmgive"))); + a_add((attrib**)&a->data.v, make_key(atoi36("gmskil"))); + + a_add((attrib**)&a->data.v, make_atgmcreate(resource2item(r_silver))); + + for (i=0;i<=I_INCENSE;++i) { + a_add((attrib**)&a->data.v, make_atgmcreate(olditemtype[i])); + } + + /* one initial unit */ + u = createunit(center, f, 1, RC_TEMPLATE); + u->irace = RC_GNOME; + u->number = 1; + set_string(&u->name, "Questenmeister"); + u->irace = RC_GOBLIN; + + return f; +} + #ifdef TEST_GM_COMMANDS void setup_gm_faction(void) diff --git a/src/common/modules/gmcmd.h b/src/common/modules/gmcmd.h index 5d9ca3310..c656cf7a2 100644 --- a/src/common/modules/gmcmd.h +++ b/src/common/modules/gmcmd.h @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: gmcmd.h,v 1.4 2001/01/31 07:59:42 enno Exp $ + * $Id: gmcmd.h,v 1.5 2001/04/01 06:58:40 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -14,6 +14,7 @@ struct attrib; struct unit; +struct faction; extern void init_gmcmd(void); /* initialize this module */ @@ -21,6 +22,7 @@ extern void init_gmcmd(void); extern void gmcommands(void); /* execute commands */ +extern struct faction * gm_addquest(const char * email, const char * name, int radius, unsigned int flags); /* * doesn't belong in here: diff --git a/src/common/modules/modules-5.dsp b/src/common/modules/modules-5.dsp index 93a22379c..4f0b79320 100644 --- a/src/common/modules/modules-5.dsp +++ b/src/common/modules/modules-5.dsp @@ -9,20 +9,20 @@ CFG=modules - Win32 Debug NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den\ Befehl -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "modules-5.mak". -!MESSAGE +!MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "modules-5.mak" CFG="modules - Win32 Debug" -!MESSAGE +!MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: -!MESSAGE +!MESSAGE !MESSAGE "modules - Win32 Release" (basierend auf\ "Win32 (x86) Static Library") !MESSAGE "modules - Win32 Debug" (basierend auf "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP Scc_ProjName "" @@ -71,7 +71,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"Debug\modules.lib" -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/modules/modules-6.dsp b/src/common/modules/modules-6.dsp index 409c4bb5c..28660831e 100644 --- a/src/common/modules/modules-6.dsp +++ b/src/common/modules/modules-6.dsp @@ -7,19 +7,19 @@ CFG=modules - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "modules-6.mak". -!MESSAGE +!MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "modules-6.mak" CFG="modules - Win32 Debug" -!MESSAGE +!MESSAGE !MESSAGE Possible choices for configuration are: -!MESSAGE +!MESSAGE !MESSAGE "modules - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "modules - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 @@ -74,7 +74,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"Debug\modules.lib" -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/modules/xmas2000.c b/src/common/modules/xmas2000.c index 17ac8056c..a6cbb8c76 100644 --- a/src/common/modules/xmas2000.c +++ b/src/common/modules/xmas2000.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: xmas2000.c,v 1.4 2001/02/04 09:46:48 corwin Exp $ + * $Id: xmas2000.c,v 1.5 2001/04/01 06:58:41 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -71,7 +71,7 @@ xmasgate_handle(trigger * t, void * data) if (*up==u) up = &u->next; } } else - fprintf(stderr, "\aERROR: could not perform xmasgate::handle()\n"); + fprintf(stderr, "ERROR: could not perform xmasgate::handle()\n"); unused(data); return 0; } diff --git a/src/common/races/illusion.c b/src/common/races/illusion.c index 7a43bc39b..dec5888af 100644 --- a/src/common/races/illusion.c +++ b/src/common/races/illusion.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: illusion.c,v 1.2 2001/01/26 16:19:41 enno Exp $ + * $Id: illusion.c,v 1.3 2001/04/01 06:58:41 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -24,17 +24,19 @@ /* libc includes */ #include -#define ILLUSIONMAX 6 +#define ILLUSIONMAX 6 void age_illusion(unit *u) { - if (u->age == ILLUSIONMAX) { - add_message(&u->faction->msgs, new_message(u->faction, - "warnillusiondissolve%u:unit", u)); - } else if (u->age > ILLUSIONMAX) { - set_number(u, 0); - add_message(&u->faction->msgs, new_message(u->faction, - "illusiondissolve%u:unit", u)); + if (u->faction->race!=RC_ILLUSION) { + if (u->age == ILLUSIONMAX) { + add_message(&u->faction->msgs, new_message(u->faction, + "warnillusiondissolve%u:unit", u)); + } else if (u->age > ILLUSIONMAX) { + set_number(u, 0); + add_message(&u->faction->msgs, new_message(u->faction, + "illusiondissolve%u:unit", u)); + } } } diff --git a/src/common/races/races-6.dsp b/src/common/races/races-6.dsp index b4a1c115c..b4dfaf705 100644 --- a/src/common/races/races-6.dsp +++ b/src/common/races/races-6.dsp @@ -7,19 +7,19 @@ CFG=races - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "races-6.mak". -!MESSAGE +!MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "races-6.mak" CFG="races - Win32 Debug" -!MESSAGE +!MESSAGE !MESSAGE Possible choices for configuration are: -!MESSAGE +!MESSAGE !MESSAGE "races - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "races - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 @@ -74,7 +74,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"Debug\races.lib" -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/races/zombies.c b/src/common/races/zombies.c index 1330e08eb..0321fb869 100644 --- a/src/common/races/zombies.c +++ b/src/common/races/zombies.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: zombies.c,v 1.3 2001/01/31 14:32:58 corwin Exp $ + * $Id: zombies.c,v 1.4 2001/04/01 06:58:41 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -76,9 +76,7 @@ age_undead(unit *u) u2 = make_undead_unit(r, findfaction(MONSTER_FACTION), 0, RC_UNDEAD); transfermen(u, u2, u->number - n); u2->building = u->building; - if (rterrain(r) == T_OCEAN) { - u2->ship = u->ship; - } + u2->ship = u->ship; } } diff --git a/src/common/spells/alp.c b/src/common/spells/alp.c index 2444f5be8..efe438ef5 100644 --- a/src/common/spells/alp.c +++ b/src/common/spells/alp.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: alp.c,v 1.2 2001/01/26 16:19:41 enno Exp $ + * $Id: alp.c,v 1.3 2001/04/01 06:58:41 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -100,6 +100,10 @@ sp_summon_alp(struct castorder *co) * sobald der Alp sein Opfer erreicht hat. */ alp = createunit(r, findfaction(MONSTER_FACTION), 1, RC_ALP); + if (r==mage->region) { + alp->building = mage->building; + alp->ship = mage->ship; + } set_skill(alp, SK_STEALTH, alp->number * 840); /* 840 Tage = T7 */ alp->status = ST_FLEE; /* flieht */ diff --git a/src/common/spells/spells-6.dsp b/src/common/spells/spells-6.dsp index 4f7a4d3b5..df4719b0d 100644 --- a/src/common/spells/spells-6.dsp +++ b/src/common/spells/spells-6.dsp @@ -7,19 +7,19 @@ CFG=spells - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "spells-6.mak". -!MESSAGE +!MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "spells-6.mak" CFG="spells - Win32 Debug" -!MESSAGE +!MESSAGE !MESSAGE Possible choices for configuration are: -!MESSAGE +!MESSAGE !MESSAGE "spells - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "spells - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 @@ -74,7 +74,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"Debug\spells.lib" -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/triggers/triggers-6.dsp b/src/common/triggers/triggers-6.dsp index dc88a75bf..e6cd8aa70 100644 --- a/src/common/triggers/triggers-6.dsp +++ b/src/common/triggers/triggers-6.dsp @@ -7,19 +7,19 @@ CFG=triggers - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "triggers-6.mak". -!MESSAGE +!MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "triggers-6.mak" CFG="triggers - Win32 Debug" -!MESSAGE +!MESSAGE !MESSAGE Possible choices for configuration are: -!MESSAGE +!MESSAGE !MESSAGE "triggers - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "triggers - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 @@ -74,7 +74,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo /out:"Debug\triggers.lib" -!ENDIF +!ENDIF # Begin Target diff --git a/src/common/util/util-6.dsp b/src/common/util/util-6.dsp index 1dff99c02..550adf865 100644 --- a/src/common/util/util-6.dsp +++ b/src/common/util/util-6.dsp @@ -7,21 +7,21 @@ CFG=util - Win32 Conversion !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "util-6.mak". -!MESSAGE +!MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE +!MESSAGE !MESSAGE NMAKE /f "util-6.mak" CFG="util - Win32 Conversion" -!MESSAGE +!MESSAGE !MESSAGE Possible choices for configuration are: -!MESSAGE +!MESSAGE !MESSAGE "util - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "util - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE "util - Win32 Conversion" (based on "Win32 (x86) Static Library") !MESSAGE "util - Win32 Profile" (based on "Win32 (x86) Static Library") -!MESSAGE +!MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 @@ -122,7 +122,7 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo -!ENDIF +!ENDIF # Begin Target diff --git a/src/eressea-6.dsw b/src/eressea-6.dsw index 6e7c3e9be..f45d99dda 100644 --- a/src/eressea-6.dsw +++ b/src/eressea-6.dsw @@ -3,33 +3,6 @@ Microsoft Developer Studio Workspace File, Format Version 6.00 ############################################################################### -Project: "askalon"=".\askalon\askalon-6.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name attributes - End Project Dependency - Begin Project Dependency - Project_Dep_Name gamecode - End Project Dependency - Begin Project Dependency - Project_Dep_Name kernel - End Project Dependency - Begin Project Dependency - Project_Dep_Name triggers - End Project Dependency - Begin Project Dependency - Project_Dep_Name util - End Project Dependency -}}} - -############################################################################### - Project: "attributes"=".\common\attributes\attributes-6.dsp" - Package Owner=<4> Package=<5> @@ -42,18 +15,6 @@ Package=<4> ############################################################################### -Project: "doc"=.\doc\doc.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - Project: "eressea"=".\eressea\eressea-6.dsp" - Package Owner=<4> Package=<5> @@ -111,42 +72,6 @@ Package=<4> ############################################################################### -Project: "mapper"=".\mapper\mapper-6.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name triggers - End Project Dependency - Begin Project Dependency - Project_Dep_Name util - End Project Dependency - Begin Project Dependency - Project_Dep_Name kernel - End Project Dependency - Begin Project Dependency - Project_Dep_Name attributes - End Project Dependency - Begin Project Dependency - Project_Dep_Name items - End Project Dependency - Begin Project Dependency - Project_Dep_Name modules - End Project Dependency - Begin Project Dependency - Project_Dep_Name races - End Project Dependency - Begin Project Dependency - Project_Dep_Name spells - End Project Dependency -}}} - -############################################################################### - Project: "modules"=".\common\modules\modules-6.dsp" - Package Owner=<4> Package=<5> @@ -183,21 +108,6 @@ Package=<4> ############################################################################### -Project: "translator"=.\tools\translator.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name util - End Project Dependency -}}} - -############################################################################### - Project: "triggers"=".\common\triggers\triggers-6.dsp" - Package Owner=<4> Package=<5> diff --git a/src/eressea/eressea-6.dsp b/src/eressea/eressea-6.dsp index 3c0ebed7b..294b524ce 100644 --- a/src/eressea/eressea-6.dsp +++ b/src/eressea/eressea-6.dsp @@ -119,7 +119,7 @@ LINK32=link.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /I ".." /I "../common" /I "../common/util" /I "../common/kernel" /I "../common/gamecode" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /Za /W4 /Zi /O2 /I ".." /I "../common" /I "../common/util" /I "../common/kernel" /I "../common/gamecode" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /Za /W4 /Zi /O2 /I ".." /I "../common" /I "../common/util" /I "../common/kernel" /I "../common/gamecode" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /c # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe diff --git a/src/eressea/korrektur.c b/src/eressea/korrektur.c index 3146e4d71..52ba6b7e4 100644 --- a/src/eressea/korrektur.c +++ b/src/eressea/korrektur.c @@ -158,10 +158,8 @@ fix_skills(void) attrib * a = a_find(global.attribs, &at_key); \ while (a && a->data.i!=(magic)) a=a->next; \ if (a) { \ - log_warning(("[do_once] a unique fix was called a second time\n")); \ - return; \ - } \ - else { \ + log_warning(("[do_once] a unique fix %d=\"%s\" was called a second time\n", magic, itoa36(magic))); \ + } else { \ (fun); \ a_add(&global.attribs, make_key(magic)); \ } \ @@ -1024,8 +1022,8 @@ show_newspells(void) /* Alle geänderten Zauber in das array newspellids[]. mit SPL_NOSPELL * terminieren */ - spellid_t newspellids[] = { SPL_UNHOLYPOWER, SPL_SUMMONUNDEAD, - SPL_ORKDREAM, SPL_NOSPELL }; + spellid_t newspellids[] = { + }; /* die id's der neuen oder veränderten Sprüche werden in newspellids[] * abgelegt */ @@ -1723,7 +1721,7 @@ free_skillfix(attrib * a) attrib_type at_skillfix = { "skillfix", init_skillfix, free_skillfix }; -void +void skillfix(struct unit * u, skill_t skill, int from, int self, int teach) { attrib * a = a_add(&u->attribs, a_new(&at_skillfix)); @@ -1748,7 +1746,7 @@ write_skillfix(void) attrib * a = a_find(u->attribs, &at_skillfix); while (a) { skillfix_data * data = (skillfix_data*)a->data.v; - fprintf(F, "%s %d %d %d %d %d\n", + fprintf(F, "%s %d %d %d %d %d\n", itoa36(data->u->no), data->skill, data->number, @@ -1817,7 +1815,7 @@ convert_triggers(void) if (u && u2) { if (nonplayer(u) || (!nonplayer(u2) && u->race==RC_GOBLIN)) set_familiar(u2, u); - else + else set_familiar(u, u2); } else { if (u2) fprintf(stderr, "WARNING: FAMILIAR info for %s may be broken!\n", unitname(u2)); @@ -2087,10 +2085,10 @@ fix_timeouts(void) *tptr = (*tptr)->next; } else tptr = &(*tptr)->next; } - if (t->type == &tt_changerace || - t->type == &tt_changefaction || - t->type == &tt_createcurse || - t->type == &tt_createunit) + if (t->type == &tt_changerace || + t->type == &tt_changefaction || + t->type == &tt_createcurse || + t->type == &tt_createunit) { trigger * timer = get_timeout(td->triggers, t); if (toad && t->type == &tt_changerace) { @@ -2128,6 +2126,32 @@ fix_timeouts(void) } } +#include +static void +test_gmquest(void) +{ + const struct faction * f; + /* enno's world */ + f = gm_addquest("enno@eressea.upb.de", "GM Zone", 1, PFL_NOATTACK|PFL_NOALLIANCES|PFL_NOFEED|PFL_FRIENDLY); + log_printf("Neue Questenpartei %s\n", factionname(f)); + + f = gm_addquest("xandril@att.net", "Mardallas Welt", 40, 0); + log_printf("Neue Questenpartei %s\n", factionname(f)); + + f = gm_addquest("moritzsalinger@web.de", "Laen-Kaiser", 7, /*PFL_NORECRUITS |*/ PFL_NOMAGIC /*| PFL_NOBUILD*/); + log_printf("Neue Questenpartei %s\n", factionname(f)); + + f = gm_addquest("Denise.Muenstermann@home.gelsen-net.de", "Mochikas Queste", 7, PFL_NOMAGIC); + log_printf("Neue Questenpartei %s\n", factionname(f)); + + f = gm_addquest("feeron@aol.com", "Eternath", 11, 0); + log_printf("Neue Questenpartei %s\n", factionname(f)); + + f = gm_addquest("BigBear@nord-com.net", "Leonidas Vermächtnis", 15, PFL_NOMAGIC|PFL_NOSTEALTH); + log_printf("Neue Questenpartei %s\n", factionname(f)); + +} + void korrektur(void) { @@ -2146,6 +2170,7 @@ korrektur(void) fix_allies(); do_once(atoi36("fhrb"), fix_herbs()); do_once(atoi36("ftos"), fix_timeouts()); + do_once(atoi36("gmtst"), test_gmquest()); /* test gm quests */ #ifndef SKILLFIX_SAVE fix_skills(); #endif diff --git a/src/eressea/old/relation.c b/src/eressea/old/relation.c index 5cf11f400..549418b39 100644 --- a/src/eressea/old/relation.c +++ b/src/eressea/old/relation.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: relation.c,v 1.1 2001/01/27 18:15:32 enno Exp $ + * $Id: relation.c,v 1.2 2001/04/01 06:58:44 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -51,10 +51,14 @@ rel_init(attrib *a) static void rel_done(attrib *a) { +#ifdef OLD_TRIGGER reldata *rel = (reldata *)a->data.v; if( rel->obj2 ) untag_pointer(&rel->obj2, rel->typ2, TAG_RELATION); free(rel); +#else + unused(a); +#endif } #ifdef OLD_TRIGGER diff --git a/src/mapper/Makefile b/src/mapper/Makefile index bd720c2b9..9016773ea 100644 --- a/src/mapper/Makefile +++ b/src/mapper/Makefile @@ -13,6 +13,7 @@ OBJECTS = $(SOURCES:%.c=$(BUILD_DIR)/%.o) INCLUDES += \ -I../common/util \ -I../common/kernel \ + -I../common/spells \ -I../common LIBS += \ diff --git a/src/mapper/map_modify.c b/src/mapper/map_modify.c index 9acdbaa95..9e73ded77 100644 --- a/src/mapper/map_modify.c +++ b/src/mapper/map_modify.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: map_modify.c,v 1.7 2001/02/18 10:14:04 corwin Exp $ + * $Id: map_modify.c,v 1.8 2001/04/01 06:58:44 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -219,48 +219,6 @@ block_create(int x1, int y1, int size, char chaotisch, int special, char terrain vset_destroy(&fringe); } - -static void -blockcreate(int x1, int y1, int size, char chaos) -{ - char chaotic = 0; - int special = 0; - char terrain = T_OCEAN; - int local_climate = climate(y1); - - if (special == 1) - terrain = T_OCEAN; - else if (special == 2) - terrain = terrain_create(local_climate); - - /* Chaotisch ? */ - - if ((x1 < -36 || x1 > 36 || y1 < -36) && chaos == 1) { - if (rand() % 100 < 50) { - chaotic = 1; - } - switch (rand() % 6) { - case 1: - case 2: - special = 1; /* Nur Wasser ... */ - break; - case 3: - special = 2; /* Ein-Terrain-Insel */ - break; - case 4: /* Miniinsel */ - size = 3 + rand() % 5; - break; - } - } - block_create(x1, y1, size, chaotic, special, terrain); -} - -void -makeblock(int x1, int y1, char chaos) -{ - blockcreate(x1, y1, ISLANDSIZE, chaos); -} - static void addmenulist(menulist ** SP, const char *s, int *val) { @@ -915,6 +873,26 @@ make_new_region(int x, int y) modified=1; } +#define BLOCK_RADIUS 6 + +void +make_ocean_block(int x, int y) +{ + int cx, cy; + region *r; + + for(cx = x - BLOCK_RADIUS; cx < x+BLOCK_RADIUS; cx++) { + for(cy = y - BLOCK_RADIUS; cy < y+BLOCK_RADIUS; cy++) { + if(koor_distance(cx, cy, x, y) < BLOCK_RADIUS) { + if(!findregion(cx, cy)) { + r = new_region(cx, cy); + terraform(r, T_OCEAN); + } + } + } + } +} + void make_new_block(int x, int y) { diff --git a/src/mapper/mapper.c b/src/mapper/mapper.c index 3ffd880a8..f118eb7a7 100644 --- a/src/mapper/mapper.c +++ b/src/mapper/mapper.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: mapper.c,v 1.13 2001/02/18 12:20:37 corwin Exp $ + * $Id: mapper.c,v 1.14 2001/04/01 06:58:44 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -872,8 +873,8 @@ movearound(int rx, int ry) { } ch = -9; break; - case 0x2: /* die altmodische Art */ - make_new_block(rx, ry); + case 0x2: + make_ocean_block(rx, ry); ch = -9; break; case 'S': @@ -1238,6 +1239,7 @@ main(int argc, char *argv[]) init_triggers(); init_attributes(); + init_spells(); init_resources(); /* init_weapons(); */ diff --git a/src/mapper/mapper.h b/src/mapper/mapper.h index 4779d045f..33ccd0280 100644 --- a/src/mapper/mapper.h +++ b/src/mapper/mapper.h @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: mapper.h,v 1.4 2001/02/09 13:53:53 corwin Exp $ + * $Id: mapper.h,v 1.5 2001/04/01 06:58:44 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -54,6 +54,7 @@ int modify_region(struct region * r); void NeueBurg(struct region * r); void NeuesSchiff(struct region * r); void create_island(struct region *r, int n, terrain_t t); +void make_ocean_block(int x, int y); void make_new_block(int x, int y); void moveln(const int x); char *my_input(WINDOW * win, int x, int y, const char *text, const char *def); diff --git a/src/res/de/items/Tiegel mit Krötenschleim b/src/res/de/items/Tiegel mit Krötenschleim new file mode 100644 index 000000000..cecea15e2 --- /dev/null +++ b/src/res/de/items/Tiegel mit Krötenschleim @@ -0,0 +1 @@ +Dieser Tiegel enthält die seltenste alchemistische Substanz Eresseas, den Krötenschleim. Angeblich soll der Krötenschleim eine aussergewöhnlich hohe magische Absorbtionskraft besitzen und deswegen in obskuren magischen Ritualen Verwendung finden. diff --git a/src/res/de/items/Warg b/src/res/de/items/Warg index 0c0a2d02d..3e149d7c9 100644 --- a/src/res/de/items/Warg +++ b/src/res/de/items/Warg @@ -1 +1 @@ -Diese großen Wölfe sind nicht alle so wild und böse wie in den Legenden berichtet, und einige von ihnen schließen sich auch guten Magier bereitwillig an und sind ihnen dann treue Gefährten. (3 Angriffe, Schaden: 2d6, 1d4, 1d4, Angriff 6, Verteidigung 3, 25 Trefferpunkte). +Diese großen Wölfe sind nicht alle so wild und böse wie in den Legenden berichtet, und einige von ihnen schließen sich auch guten Magiern bereitwillig an und sind ihnen dann treue Gefährten. (3 Angriffe, Schaden: 2d6, 1d4, 1d4, Angriff 6, Verteidigung 3, 25 Trefferpunkte). diff --git a/src/res/de/items/toadslime b/src/res/de/items/toadslime new file mode 100644 index 000000000..cecea15e2 --- /dev/null +++ b/src/res/de/items/toadslime @@ -0,0 +1 @@ +Dieser Tiegel enthält die seltenste alchemistische Substanz Eresseas, den Krötenschleim. Angeblich soll der Krötenschleim eine aussergewöhnlich hohe magische Absorbtionskraft besitzen und deswegen in obskuren magischen Ritualen Verwendung finden. diff --git a/src/res/de/messages.txt b/src/res/de/messages.txt index 8e30681f5..554810766 100644 --- a/src/res/de/messages.txt +++ b/src/res/de/messages.txt @@ -1,5 +1,4 @@ # Kommentare sind erlaubt. Endlich. -# $Id: messages.txt,v 1.4 2001/02/25 19:31:40 enno Exp $ # Fehlermeldungen: msg_errors;errors:0;de;{string} @@ -90,7 +89,7 @@ error86;errors:0;de;{unit} in {region}: '{command}' - Falsches Passwort. error87;errors:0;de;{unit} in {region}: '{command}' - Für das Elixier benötigt man Drachenblut. error88;errors:0;de;{unit} in {region}: '{command}' - Für den Schiffbau braucht man Holz. error89;errors:0;de;{unit} in {region}: '{command}' - Geldgebot fehlt. -error90;errors:0;de;{unit} in {region}: '{command}' - Die Einheit hat keinen FAHRE-Befehl. +error90;errors:0;de;{unit} in {region}: '{command}' - Die Einheit fährt nicht mit uns. error91;errors:0;de;{unit} in {region}: '{command}' - Hier gibt es keine Mallornbäume. error92;errors:0;de;{unit} in {region}: '{command}' - Hier gibt es keinen normalen Wald. error93;errors:0;de;{unit} in {region}: '{command}' - Hier gibt es schon einen Hafen. @@ -250,7 +249,7 @@ error247;errors:0;de;{unit} in {region}: '{command}' - Die Partei hat schon eine error248;errors:0;de;{unit} in {region}: '{command}' - Die Partei muß mindestens 10 Runden alt sein. error249;errors:0;de;{unit} in {region}: '{command}' - Das Schiff kann nicht aufs offene Meer hinaus segeln. error250;errors:0;de;{unit} in {region}: '{command}' - Nicht genug Karma. -error251;errors:0;de;{unit} in {region}: '{command}' - Diese Kraft haben uns die Götter schon gewährt. +error251;errors:0;de;{unit} in {region}: '{command}' - Diese Kraft können selbst die Götter nicht mehr mächtiger machen. error252;errors:0;de;{unit} in {region}: '{command}' - Was und wieviel soll geopfert werden? error253;errors:0;de;{unit} in {region}: '{command}' - Der Magier ist nicht stark genug, sich den Göttern zu opfern. error254;errors:0;de;{unit} in {region}: '{command}' - Auraangabe fehlerhaft oder zuwenig Aura. @@ -285,6 +284,9 @@ error282;errors:0;de;{unit} in {region}: '{command}' - Gegen diese Rasse kann ke error283;events:0;de;{unit} in {region}: '{command}' - Das Passwort darf nur Buchstaben und Ziffern enthalten. error284;errors:0;de;{unit} in {region}: '{command}' - Nur noch nicht gestärkte Untote können das Ziel dieses Zaubers sein. error285;errors:0;de;{unit} in {region}: '{command}' - Diese Einheit kennt keine Trankrezepte. +error286;errors:0;de;{unit} in {region}: '{command}' - Die Einheit transportiert uns nicht. +error287;errors:0;de;{unit} in {region}: '{command}' - Dorthin können wir die Einheit nicht transportieren. +error288;errors:0;de;{unit} in {region}: '{command}' - Wieviel sollen wir einreißen? # Meldungen und Ereignisse msg_event;events:0;de;{string} @@ -309,7 +311,7 @@ usepotion;events:4;de;{unit} benutzt {potion}. spydetect;events:0;de;{target} fühlt sich durch {$unit spy} beobachtet. spyfail;events:0;de;{spy} gelang es nicht, etwas über {target} herauszufinden. stealfail;events:0;de;{unit} gelang es nicht, sich nahe genug an {target} heranzuschleichen. -stealdetect;events:0;de;{unit} fühlt sich bebachtet. +stealdetect;events:0;de;{unit} fühlt sich beobachtet. stealfatal;events:0;de;{unit} wurde beim versuchten Diebstahl ertappt. thiefdiscover;events:0;de;{target} ertappte {unit} beim versuchten Diebstahl. stealeffect;events:0;de;{unit} wurde in {region} beklaut. @@ -324,6 +326,7 @@ warnillusiondissolve;events:1;de;{unit} wird sich bald verfl illusiondissolve;events:0;de;{unit} hat sich unbemerkt verflüchtigt. illusionantimagic;events:0;de;{unit} marschiert in eine Antimagiezone und löst sich auf. shipdestroy;events:0;de;{unit} in {region} versenkt die {ship}. +shipdestroy_partial;events:0;de;{unit} in {region} beschädigt die {ship}. orcified;events:0;de;Vor den vielen Orks in {region} fliehen die anderen Einwohner. deorcified;events:0;de;Langsam kehren andere Völker nach {region} zurück. piratenovictim;events:0;de;Die {ship} in {region} kann keine Schiffe aufbringen. @@ -332,6 +335,7 @@ itemcloak;events:0;de;{mage} legt einen Schleier um die Ausr scunicorn;events:0;de;{unit} schließen sich {amount} {type} an. buildroad;events:1;de;{unit} erweitert in {region} das Straßennetz um {size}. destroy;events:1;de;{unit} zerstört {building}. +destroy_partial;events:1;de;{unit} reißt einen Teil von {building} ein. researchherb;events:0;de;{unit} in {region} stellt fest, daß es hier {amount} {herb} gibt. researchherb_none;events:0;de;{unit} in {region} kann keine Kräuter finden. destroy_road;events:0;de;{unit} reißt die Straße zwischen {from} und {to} ein. @@ -490,6 +494,7 @@ puttorest;magic:0;de;{mage} befreit die gequ unholypower_effect;magic:0;de;{mage} verwandelt {target}. unholypower_limitedeffect;magic:0;de;{mage} verwandelt {amount} {race} aus {target}. holyground;magic:0;de;{mage} beschwört Naturgeister in den Boden der Region. +sp_bloodsacrifice_effect;magic:0;de;{unit} in {region}: '{command}' - {unit} gewinnt durch das Ritual {amount} Aura. # Kämpfe msg_battle;battle:0;de;{string} diff --git a/src/res/messages.de b/src/res/messages.de index 98b38f49c..c9950a35d 100644 --- a/src/res/messages.de +++ b/src/res/messages.de @@ -1,5 +1,5 @@ # Kommentare sind erlaubt. Endlich. -# $Id: messages.de,v 1.7 2001/02/04 13:20:12 corwin Exp $ +# $Id: messages.de,v 1.8 2001/04/01 06:58:45 enno Exp $ # Fehlermeldungen: msg_errors;errors:0;de;{string} @@ -304,7 +304,7 @@ usepotion;events:4;de;{unit} benutzt {potion}. spydetect;events:0;de;{target} fühlt sich durch {$unit spy} beobachtet. spyfail;events:0;de;{spy} gelang es nicht, etwas über {target} herauszufinden. stealfail;events:0;de;{unit} gelang es nicht, sich nahe genug an {target} heranzuschleichen. -stealdetect;events:0;de;{unit} fühlt sich bebachtet. +stealdetect;events:0;de;{unit} fühlt sich beobachtet. stealfatal;events:0;de;{unit} wurde beim versuchten Diebstahl ertappt. thiefdiscover;events:0;de;{target} ertappte {unit} beim versuchten Diebstahl. stealeffect;events:0;de;{unit} wurde in {region} beklaut. @@ -486,6 +486,7 @@ puttorest;magic;0;de;{mage} befreit die gequ unholypower_effect;0;de;{mage} verwandelt {target}. unholypower_limitedeffect;0;de;{mage} verwandelt {amount} {race} aus {target}. holyground;0;de;{mage} beschwört Naturgeister in den Boden der Region. +sp_bloodsacrifice_effect;magic:0;de;{unit} in {region}: '{command}' - {unit} gewinnt durch das Ritual {amount} Aura. # Kämpfe msg_battle;battle:0;de;{string}