- Patch von pre-split-2 nach pre-split-3

- Target 'Conversion' für Visual C++ 6.0 gebaut.
- Einige Rassenabhängigkeiten aus dem Kernel entfernt (Trolle, Tränke)
- messages lokalisiert
- resourcen-verzeichnis umgestellt.
- einheitlicher Prefix für Rassen-Flags
- coding.txt um ein paar absätze erweitert
- resourcenverzeichnis kann mit -r angegeben werden (default ist weiterhin "./res")
- eigenschaft, ohne waffen zu attackieren als rassenflag

Bei der nächsten Auswertung beachten:
- funktionieren Schmiede und Bergwerk?
- haben Trolle auf den Pferdebonus ein -1?
- Echeck aus dem alten source in den neuen source kopieren.
This commit is contained in:
Enno Rehling 2001-02-03 13:45:35 +00:00
parent db13b7a220
commit 1e7daf179b
108 changed files with 3276 additions and 915 deletions

View file

@ -4,7 +4,7 @@
# TARGTYPE "Win32 (x86) Console Application" 0x0103
CFG=askalon - Win32 Conversion
CFG=askalon - Win32 Release
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
@ -13,13 +13,12 @@ CFG=askalon - Win32 Conversion
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "askalon-6.mak" CFG="askalon - Win32 Conversion"
!MESSAGE NMAKE /f "askalon-6.mak" CFG="askalon - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "askalon - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "askalon - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE "askalon - Win32 Conversion" (based on "Win32 (x86) Console Application")
!MESSAGE
# Begin Project
@ -40,9 +39,10 @@ RSC=rc.exe
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX /Z7 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /d "NDEBUG"
BSC32=bscmake.exe
@ -50,7 +50,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386
!ELSEIF "$(CFG)" == "askalon - Win32 Debug"
@ -66,34 +66,7 @@ LINK32=link.exe
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /Gm /ZI /Od /I ".." /I "../util" /I "../common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407 /d "_DEBUG"
# ADD RSC /l 0x407 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
!ELSEIF "$(CFG)" == "askalon - Win32 Conversion"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "askalon_"
# PROP BASE Intermediate_Dir "askalon_"
# PROP BASE Ignore_Export_Lib 0
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "askalon_"
# PROP Intermediate_Dir "askalon_"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /Za /W4 /Gm /Zi /Od /I ".." /I "../util" /I "../common" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /FD /c
# SUBTRACT BASE CPP /YX
# ADD CPP /nologo /MDd /Za /W4 /Gm /ZI /Od /I ".." /I "../util" /I "../common" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /D "_DEBUG" /D "CONVERT_TRIGGER" /FR /FD /c
# SUBTRACT CPP /YX
# ADD CPP /nologo /Za /W4 /Gm /ZI /Od /I ".." /I "../util" /I "../common" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407 /d "_DEBUG"
# ADD RSC /l 0x407 /d "_DEBUG"
BSC32=bscmake.exe
@ -109,7 +82,6 @@ LINK32=link.exe
# Name "askalon - Win32 Release"
# Name "askalon - Win32 Debug"
# Name "askalon - Win32 Conversion"
# Begin Group "Header"
# PROP Default_Filter "*.h"
@ -147,8 +119,6 @@ SOURCE=..\old\pointertags.c
# PROP Exclude_From_Build 1
!ELSEIF "$(CFG)" == "askalon - Win32 Conversion"
!ENDIF
# End Source File
@ -162,8 +132,6 @@ SOURCE=..\old\relation.c
# PROP Exclude_From_Build 1
!ELSEIF "$(CFG)" == "askalon - Win32 Conversion"
!ENDIF
# End Source File
@ -177,8 +145,6 @@ SOURCE=..\old\trigger.c
# PROP Exclude_From_Build 1
!ELSEIF "$(CFG)" == "askalon - Win32 Conversion"
!ENDIF
# End Source File

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: main.c,v 1.2 2001/01/26 16:19:39 enno Exp $
* $Id: main.c,v 1.3 2001/02/03 13:45:27 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)
@ -106,10 +106,11 @@ create_game(void)
void
map(void)
{
char zText[16];
FILE * f;
region * r;
sprintf(buf, "map-%d.cr", turn);
f = fopen(buf, "wt");
sprintf(zText, "map-%d.cr", turn);
f = fopen(zText, "wt");
fputs("VERSION 42\n", f);
fputs("\"Standard\";konfiguration\n", f);
fprintf(f, "%d;runde\n", turn);
@ -161,8 +162,11 @@ int quickleave = 0;
void
writepasswd(void)
{
FILE * F;
faction *f;
FILE * F = cfopen("passwd", "w");
char zText[128];
sprintf(zText, "%s/%s", datapath(), "/passwd");
F = cfopen(zText, "w");
if (!F)
return;
puts("Schreibe Passwörter...");
@ -456,7 +460,11 @@ main(int argc, char *argv[])
break;
}
read_datenames("res/timestrings");
{
char zText[MAX_PATH];
strcat(strcpy(zText, resourcepath()), "/timestrings");
read_datenames(zText);
}
init_game();
initgame();
readgame(false);
@ -666,14 +674,6 @@ main(int argc, char *argv[])
}
break;
case 'T':
changeblockterrain();
break;
case 'C':
changeblockchaos();
break;
case 'q':
#if ENNO_CLEANUP
cleanup();

View file

@ -41,7 +41,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX /Z7 /O2 /I "../util" /I "../kernel" /I "../.." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
@ -64,7 +64,7 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX"stdafx.h" /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: giveitem.c,v 1.2 2001/01/26 16:19:39 enno Exp $
* $Id: giveitem.c,v 1.3 2001/02/03 13:45:27 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,18 +54,19 @@ a_readgive(attrib * a, FILE * F)
{
give_data * gdata = (give_data*)a->data.v;
int i;
char zText[32];
if (global.data_version<ITEMTYPE_VERSION) return a_readdefault(a, F);
fscanf(F, "%s ", buf);
i = atoi36(buf);
fscanf(F, "%s ", zText);
i = atoi36(zText);
gdata->building = findbuilding(i);
if (gdata->building==NULL) ur_add((void*)i, (void**)&gdata->building, resolve_building);
for (;;) {
fscanf(F, "%s", buf);
if (!strcmp("end", buf)) break;
fscanf(F, "%s", zText);
if (!strcmp("end", zText)) break;
fscanf(F, "%d", &i);
if (i==0) i_add(&gdata->items, i_new(it_find(buf)))->number = i;
if (i==0) i_add(&gdata->items, i_new(it_find(zText)))->number = i;
}
return 1;
}
@ -95,7 +96,6 @@ give_item(attrib * a)
while (gdata->items) {
item * itm = gdata->items;
i_change(&u->items, itm->type, itm->number);
/* sprintf(buf, "%s findet in %s %d %s", unitname(u), regionid(r), itm->number, locale_string(u->faction->locale, resourcename(itm->type->rtype, (itm->number==1)?0:GR_PLURAL))); */
i_free(i_remove(&gdata->items, itm));
}
return 0;

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: creation.c,v 1.3 2001/01/30 23:16:16 enno Exp $
* $Id: creation.c,v 1.4 2001/02/03 13:45:28 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)
@ -52,6 +52,7 @@
#include <stdlib.h>
#include <string.h>
static int g_maxluxuries;
/* eine insel pro 9x9 feld. das erste feld von (0,0) bis (8,8) */
@ -265,103 +266,3 @@ writemap(FILE * F, int mode)
/* ------------------------------------------------------------- */
/* ------------------------------------------------------------- */
void
changeblockterrain(void)
{
int x1, x2, y1, y2;
int x, y;
int i;
char t;
region *r;
printf("X1? ");
fgets(buf, 6, stdin);
if (buf[0] == 0)
return;
x1 = atoi(buf);
printf("Y1? ");
fgets(buf, 6, stdin);
if (buf[0] == 0)
return;
y1 = atoi(buf);
printf("X2? ");
fgets(buf, 6, stdin);
if (buf[0] == 0)
return;
x2 = atoi(buf);
printf("Y2? ");
fgets(buf, 6, stdin);
if (buf[0] == 0)
return;
y2 = atoi(buf);
puts("Terrain?");
for (i = 0; i != MAXTERRAINS; i++) {
printf("%d - %s\n", i, terrain[i].name);
}
fgets(buf, 6, stdin);
if (buf[0] == 0)
return;
t = (char) atoi(buf);
for (x = x1; x <= x2; x++) {
for (y = y1; y <= y2; y++) {
if (0 != (r = findregion(x, y))) {
terraform(r, t);
}
}
}
}
void
changeblockchaos(void)
{
int x1, x2, y1, y2;
int x, y;
char chaotisch;
region *r;
printf("X1? ");
fgets(buf, 6, stdin);
if (buf[0] == 0)
return;
x1 = atoi(buf);
printf("Y1? ");
fgets(buf, 6, stdin);
if (buf[0] == 0)
return;
y1 = atoi(buf);
printf("X2? ");
fgets(buf, 6, stdin);
if (buf[0] == 0)
return;
x2 = atoi(buf);
printf("Y2? ");
fgets(buf, 6, stdin);
if (buf[0] == 0)
return;
y2 = atoi(buf);
puts("Chaos (0=aus, 1=an) ?");
fgets(buf, 6, stdin);
if (buf[0] == 0)
return;
chaotisch = (char) atoi(buf);
for (x = x1; x <= x2; x++) {
for (y = y1; y <= y2; y++) {
if (0 != (r = findregion(x, y))) {
if (chaotisch) fset(r, RF_CHAOTIC);
else freset(r, RF_CHAOTIC);
}
}
}
}

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: creation.h,v 1.2 2001/01/26 16:19:39 enno Exp $
* $Id: creation.h,v 1.3 2001/02/03 13:45:29 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)
@ -30,8 +30,6 @@ void makeblock(int x1, int y1, char chaos);
void listnames(void);
void writemap(FILE * F, int mode);
void changeblockterrain(void);
void regionspells(void);
void moveunit(void);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: creport.c,v 1.3 2001/01/28 08:50:45 enno Exp $
* $Id: creport.c,v 1.4 2001/02/03 13:45:29 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 @@
#include <stdlib.h>
#include <string.h>
#define C_REPORT_VERSION 52
#define C_REPORT_VERSION 54
#define NEWBLOCKS (C_REPORT_VERSION>=35)
#define ENCODE_SPECIAL 1
@ -718,7 +718,7 @@ report_computer(FILE * F, faction * f)
fprintf(F, "%d;Runde\n", turn);
fputs("2;Zeitalter\n", F);
fprintf(F, "PARTEI %d\n", f->no);
fprintf(F, "\"%s\";Passwort\n", f->passw);
/* fprintf(F, "\"%s\";Passwort\n", f->passw); */
fprintf(F, "\"%s\";locale\n", locale_name(f->locale));
fprintf(F, "%d;Optionen\n", f->options);
if (f->options & want(O_SCORE) && f->age>DISPLAYSCORE) {
@ -854,13 +854,15 @@ report_computer(FILE * F, faction * f)
fprintf(F, "%d;Lohn\n", fwage(r, f, true));
}
/* trade */
fputs("PREISE\n", F);
while (dmd) {
fprintf(F, "%d;%s\n", (dmd->value
? dmd->value*dmd->type->price
: -dmd->type->price),
locale_string(f->locale, resourcename(dmd->type->itype->rtype, 0)));
dmd=dmd->next;
if(rpeasants(r)/TRADE_FRACTION > 0) {
fputs("PREISE\n", F);
while (dmd) {
fprintf(F, "%d;%s\n", (dmd->value
? dmd->value*dmd->type->price
: -dmd->type->price),
locale_string(f->locale, resourcename(dmd->type->itype->rtype, 0)));
dmd=dmd->next;
}
}
}
}

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: economy.c,v 1.2 2001/01/26 16:19:39 enno Exp $
* $Id: economy.c,v 1.3 2001/02/03 13:45:29 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)
@ -48,6 +48,7 @@
/* util includes */
#include <attrib.h>
#include <base36.h>
#include <event.h>
/* libs includes */
@ -354,8 +355,8 @@ recruit(region * r, unit * u, strlist * S,
recruitcost = race[u->faction->race].rekrutieren;
pl = getplane(r);
if (pl && fval(pl, PFL_NORECRUITS)) {
sprintf(buf, "%s - In der Ebene der Herausforderung kann niemand rekrutiert werden.", S->s);
addmessage(0, u->faction, buf, MSG_EVENT, ML_MISTAKE);
add_message(&u->faction->msgs,
new_message(u->faction, "error_pflnorecruit%s:command%u:unit%r:region", S->s, u, r));
return;
}
@ -387,8 +388,6 @@ recruit(region * r, unit * u, strlist * S,
max_skill(u->faction, SK_ALCHEMY))
{
cmistake(u, S->s, 156, MSG_EVENT);
/* sprintf(buf, "Es kann maximal %d Alchemisten pro Partei geben.",
max_skill(u->faction, SK_ALCHEMY)); */
return;
}
n = min(n, get_pooled(u, r, R_SILVER) / recruitcost);
@ -516,7 +515,7 @@ givemen(int n, unit * u, unit * u2, strlist * S)
error = 129;
} else if (u->race != u2->faction->race) {
if (u2->faction->race != RC_HUMAN) {
error = 121;
error = 120;
} else if (count_migrants(u2->faction) + n > count_max_migrants(u2->faction)) {
error = 128;
}
@ -806,15 +805,6 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
freset(u, FL_OWNER);
fset(u2, FL_OWNER);
sprintf(buf, "%s übergibt das Kommando ", unitname(u));
if (u->building)
scat("der Burg");
if (u->ship)
scat("des Schiffes");
scat(" an ");
scat(unitname(u2));
scat(".");
add_message(&u2->faction->msgs, new_message(
u2->faction, "givecommand%u:unit%u:receipient",
u,
@ -1074,6 +1064,7 @@ maintain(building * b, boolean full)
if (b->type->maintenance==NULL) return true;
if (is_cursed(b->attribs, C_NOCOST, 0)) {
fset(b, BLD_MAINTAINED);
fset(b, BLD_WORKING);
return true;
}
u = buildingowner(r, b);
@ -1084,6 +1075,9 @@ maintain(building * b, boolean full)
if (fval(m, MTF_VARIABLE)) need = need * b->size;
if (u) {
/* full ist im ersten versuch true, im zweiten aber false! Das
* bedeutet, das in der Runde in die Region geschafften Resourcen
* nicht genutzt werden können, weil die reserviert sind! */
if (full) need -= get_all(u, m->type);
else need -= get_pooled(u, r, m->type);
if (full && need > 0) {
@ -1189,8 +1183,8 @@ gebaeude_stuerzt_ein(region * r, building * b)
}
if (opfer > 0) {
scat(" ");
icat(opfer);
buf[0]=' ';
strcpy(buf+1, itoa10(opfer));
scat(" Opfer ");
if (opfer == 1) {
scat("ist");
@ -1198,13 +1192,12 @@ gebaeude_stuerzt_ein(region * r, building * b)
scat("sind");
}
scat(" zu beklagen.");
}
} else buf[0] = 0;
addmessage(r, 0, buf, MSG_EVENT, ML_IMPORTANT);
sprintf(buf, "In %s stürzte %s ein.", regionid(r), buildingname(b));
for (f = factions; f; f = f->next)
if (fval(f, FL_DH))
addmessage(0, f, buf, MSG_EVENT, ML_IMPORTANT);
/* erst zum Schluß, weil sonst b schon ge-free't wurde. */
add_message(&f->msgs,
new_message(f, "buildingcrash%r:region%b:building%s:opfer", r, b, buf));
destroy_building(b);
}
@ -1223,10 +1216,10 @@ maintain_buildings(boolean crash)
} else {
unit * u = buildingowner(r, b);
if (u) {
sprintf(buf, "Für das Gebäude %s konnte die ganze Woche kein "
"Unterhalt bezahlt werden.", buildingname(b));
addmessage(r, u->faction, buf, MSG_EVENT, ML_WARN);
addmessage(0, u->faction, buf, MSG_EVENT, ML_IMPORTANT);
add_message(&u->faction->msgs,
new_message(u->faction, "nomaintenance%b:building", b));
add_message(&r->msgs,
new_message(u->faction, "nomaintenance%b:building", b));
}
}
}
@ -1287,8 +1280,6 @@ economics(void)
if (recruitorders) expandrecruit(r, recruitorders);
}
/* Unterhalt für Gebäude */
maintain_buildings(false);
}
/* ------------------------------------------------------------- */

View file

@ -20,6 +20,7 @@ CFG=gamecode - Win32 Conversion
!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
# Begin Project
@ -42,7 +43,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX /Z7 /O2 /I "../util" /I "../kernel" /I "../.." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
@ -65,7 +66,7 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX"stdafx.h" /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
@ -84,12 +85,12 @@ LIB32=link.exe -lib
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "gamecode__"
# PROP Intermediate_Dir "gamecode__"
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /Za /W4 /Z7 /Od /I ".." /I "../util" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /FD /c
# SUBTRACT BASE CPP /YX
# ADD CPP /nologo /MDd /Za /W4 /Z7 /Od /I ".." /I "../util" /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "CONVERT_TRIGGER" /FR /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /FD /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
@ -100,6 +101,29 @@ LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ELSEIF "$(CFG)" == "gamecode - Win32 Profile"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "gamecode___Win32_Profile"
# PROP BASE Intermediate_Dir "gamecode___Win32_Profile"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Profile"
# PROP Intermediate_Dir "Profile"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /I "../util" /I "../kernel" /I "../.." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX- /Z7 /O2 /I "../util" /I "../kernel" /I "../.." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ENDIF
# Begin Target
@ -107,6 +131,7 @@ LIB32=link.exe -lib
# Name "gamecode - Win32 Release"
# Name "gamecode - Win32 Debug"
# Name "gamecode - Win32 Conversion"
# Name "gamecode - Win32 Profile"
# Begin Group "Header"
# PROP Default_Filter "*.h"

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: laws.c,v 1.6 2001/02/02 08:40:45 enno Exp $
* $Id: laws.c,v 1.7 2001/02/03 13:45:29 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)
@ -32,14 +32,15 @@
#endif
/* kernel includes */
#include <item.h>
#include <ship.h>
#include <alchemy.h>
#include <border.h>
#include <faction.h>
#include <alchemy.h>
#include <item.h>
#include <magic.h>
#include <message.h>
#include "skill.h"
#include "magic.h"
#include <save.h>
#include <ship.h>
#include <skill.h>
#include "movement.h"
#include "monster.h"
#include "spy.h"
@ -72,6 +73,7 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
/* - external symbols ------------------------------------------ */
extern int dropouts[2];
@ -822,8 +824,10 @@ static void
inactivefaction(faction * f)
{
FILE *inactiveFILE;
char zText[128];
inactiveFILE = fopen("inactive", "a");
sprintf(zText, "%s/%s", datapath(), "/passwd");
inactiveFILE = fopen(zText, "a");
fprintf(inactiveFILE, "%s:%s:%d:%d\n",
factionid(f),
@ -1343,10 +1347,9 @@ deliverMail(faction * f, region * r, unit * u, const char *s, unit * receiver)
strcpy(message, strcheck(s, DISPLAYSIZE));
if (!receiver) {
sprintf(buf, "Eine Botschaft von %s aus %s: '%s'",
unitname(u), regionid(r), message);
addmessage(0, f, buf, MSG_MESSAGE, ML_IMPORTANT);
if (!receiver) { /* BOTSCHAFT an PARTEI */
add_message(&f->msgs,
new_message(f, "unitmessage%r:region%u:unit%s:message", r, u, message));
}
else { /* BOTSCHAFT an EINHEIT */
unit *emp = receiver;
@ -1616,14 +1619,33 @@ set_passw(void)
break;
case K_PASSWORD:
s = getstrtoken();
{
char pbuf[32];
int i;
if (!s[0]) {
u->faction->passw[0] = 0;
add_message(&u->faction->msgs, new_message(u->faction,
"deletepasswd"));
} else {
set_string(&u->faction->passw, s);
s = getstrtoken();
if (!s || !*s) {
for(i=0; i<6; i++) pbuf[i] = (char)(97 + rand() % 26);
pbuf[6] = 0;
} else {
boolean pwok = true;
char *c;
strncpy(pbuf, s, 31);
pbuf[31] = 0;
c = pbuf;
while(*c) {
if(!isalnum(*c)) pwok = false;
c++;
}
if(pwok == false) {
cmistake(u, S->s, 283, MSG_EVENT);
for(i=0; i<6; i++) pbuf[i] = (char)(97 + rand() % 26);
pbuf[6] = 0;
}
}
set_string(&u->faction->passw, pbuf);
add_message(&u->faction->msgs, new_message(u->faction,
"changepasswd%s:value", gc_add(strdup(u->faction->passw))));
}
@ -1713,14 +1735,18 @@ display_item(faction *f, unit *u, const item_type * itype)
{
FILE *fp;
char t[NAMESIZE + 1];
char filename[256];
char filename[MAX_PATH];
const char *name;
if (u && *i_find(&u->items, itype) == NULL) return false;
name = locale_string(NULL, resourcename(itype->rtype, 0));
sprintf(filename, "showdata/%s", name);
sprintf(filename, "%s/%s/items/%s", resourcepath(), locale_name(f->locale), name);
fp = fopen(filename, "r");
if(!fp) return false;
if (!fp) {
sprintf(filename, "%s/%s/items/%s", resourcepath(), locale_name(NULL), name);
fp = fopen(filename, "r");
if (!fp) return false;
}
sprintf(buf, "%s: ", name);
@ -2213,10 +2239,11 @@ reorder(void)
region * r;
for (r=regions;r;r=r->next) {
unit * u, ** up=&r->units;
boolean sorted=false;
for (u=r->units;u;u=u->next) freset(u, FL_DH);
while (*up) {
u = *up;
if (!fval(u, FL_DH)) {
if (!fval(u, FL_MARK)) {
strlist * o;
for (o=u->orders;o;o=o->next) {
if (igetkeyword(o->s)==K_SORT) {
@ -2230,7 +2257,10 @@ reorder(void)
cmistake(u, o->s, 259, MSG_EVENT);
} else if (fval(u, FL_OWNER)) {
cmistake(u, o->s, 260, MSG_EVENT);
} else switch(p) {
} else if (v == u) {
cmistake(u, o->s, 10, MSG_EVENT);
} else {
switch(p) {
case P_AFTER:
*up = u->next;
u->next = v->next;
@ -2247,14 +2277,17 @@ reorder(void)
u->next = v;
}
break;
}
fset(u, FL_MARK);
sorted = true;
}
fset(u, FL_DH);
break;
}
}
}
if (u==*up) up=&u->next;
}
if (sorted) for (u=r->units;u;u=u->next) freset(u, FL_OWNER);
}
}
@ -2686,7 +2719,7 @@ canheal(const unit *u)
return 10;
break;
}
if (race[u->race].flags & NOHEAL) return 0;
if (race[u->race].flags & RCF_NOHEAL) return 0;
return 10;
}
@ -2701,10 +2734,10 @@ monthly_healing(void)
for (u = r->units; u; u = u->next) {
int umhp;
if((race[u->race].flags & NOHEAL) || fval(u, FL_HUNGER))
if((race[u->race].flags & RCF_NOHEAL) || fval(u, FL_HUNGER))
continue;
if(rterrain(r) == T_OCEAN && !u->ship && !(race[u->race].flags & SWIM))
if(rterrain(r) == T_OCEAN && !u->ship && !(race[u->race].flags & RCF_SWIM))
continue;
umhp = unit_max_hp(u) * u->number;
@ -2895,6 +2928,9 @@ processorders (void)
puts(" - Zerstören, Geben, Rekrutieren, Vergessen");
economics();
puts(" - Gebäudeunterhalt (1. Versuch)");
maintain_buildings(false);
#if MALLOCDBG
assert(_CrtCheckMemory());
#endif

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: monster.c,v 1.4 2001/02/02 08:40:45 enno Exp $
* $Id: monster.c,v 1.5 2001/02/03 13:45:30 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)
@ -810,13 +810,13 @@ monsters_kill_peasants(void)
for (r = regions; r; r = r->next) {
for (u = r->units; u; u = u->next) if(!fval(u, FL_MOVED)) {
if(race[u->race].flags & SCARE_PEASANTS) {
if(race[u->race].flags & RCF_SCAREPEASANTS) {
scared_by_monster(u);
}
if(race[u->race].flags & KILL_PEASANTS) {
if(race[u->race].flags & RCF_KILLPEASANTS) {
eaten_by_monster(u);
}
if(race[u->race].flags & ABSORB_PEASANTS) {
if(race[u->race].flags & RCF_ABSORBPEASANTS) {
absorbed_by_monster(u);
}
}
@ -878,12 +878,12 @@ plan_monsters(void)
/* Diese Verkettung ist krank und sollte durch eine 'vernünftige KI'
* ersetzt werden. */
if( (race[u->race].flags & MOVE_RANDOM)
if( (race[u->race].flags & RCF_MOVERANDOM)
&& (rand()%100<MOVECHANCE || check_overpopulated(u))) {
move_monster(r, u);
} else {
boolean done = false;
if((race[u->race].flags & ATTACK_RANDOM)
if((race[u->race].flags & RCF_ATTACKRANDOM)
&& rand()%100<MONSTERATTACK
&& is_moving == false)
{
@ -893,7 +893,7 @@ plan_monsters(void)
if(u->race == RC_SEASERPENT) {
set_string(&u->thisorder, keywords[K_PIRACY]);
set_string(&u->lastorder, keywords[K_PIRACY]);
} else if(race[u->race].flags & LEARN) {
} else if(race[u->race].flags & RCF_LEARN) {
learn_monster(u);
}
}

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: randenc.c,v 1.5 2001/02/02 08:40:45 enno Exp $
* $Id: randenc.c,v 1.6 2001/02/03 13:45:30 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)
@ -1365,7 +1365,7 @@ randomevents(void)
for (r = regions; r; r=r->next) {
for (u=r->units; u; u=u->next) {
if (u->faction->no != MONSTER_FACTION && (race[u->race].flags & DESERT)) {
if (u->faction->no != MONSTER_FACTION && (race[u->race].flags & RCF_DESERT)) {
if (rand()%100 < 5) {
add_message(&u->faction->msgs, new_message(u->faction,
"desertion%u:unit%r:region", u, r));

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: report.c,v 1.5 2001/01/30 23:16:16 enno Exp $
* $Id: report.c,v 1.6 2001/02/03 13:45:30 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)
@ -806,19 +806,20 @@ prices(FILE * F, region * r, faction * f)
{
const luxury_type *sale=NULL;
struct demand * dmd;
int n = 0;
int n = 0;
if (r->land==NULL || r->land->demands==NULL) return;
for (dmd=r->land->demands;dmd;dmd=dmd->next) {
if (dmd->value==0) sale = dmd->type;
else if (dmd->value > 0) n++;
}
assert(sale!=NULL);
for (dmd=r->land->demands;dmd;dmd=dmd->next) if(dmd->value > 0) n++;
sprintf(buf, "Auf dem Markt wird für %s %d Silber verlangt.",
locale_string(f->locale, resourcename(sale->itype->rtype, GR_PLURAL)),
sale->price);
locale_string(f->locale, resourcename(sale->itype->rtype, GR_PLURAL)),
sale->price);
if(n > 0) scat(" Geboten wird für ");
@ -1285,7 +1286,7 @@ order_template(FILE * F, faction * f)
rps_nowrap(F, "");
rnl(F);
sprintf(buf, "%s %s \"%s\"", parameters[P_FACTION], factionid(f), f->passw);
sprintf(buf, "%s %s \"hier_passwort_eintragen\"", parameters[P_FACTION], factionid(f));
rps_nowrap(F, buf);
rnl(F);
@ -1293,8 +1294,9 @@ order_template(FILE * F, faction * f)
rps_nowrap(F, "");
rnl(F);
sprintf(buf, "; ECHECK %s-w4 -r%d -v3.4", dh ? "-l " : "",
race[f->race].rekrutieren); /* -v3.4: ECheck Version 3.4.x */
sprintf(buf, "; ECHECK %s-w4 -r%d -v%s", dh ? "-l " : "",
race[f->race].rekrutieren, ECHECK_VERSION);
/* -v3.4: ECheck Version 3.4.x */
rps_nowrap(F, buf);
rnl(F);
@ -1696,6 +1698,8 @@ report(FILE *F, faction * f)
if (f->age <= 2) {
rnl(F);
sprintf(buf, "Dein Passwort lautet \"%s\".", f->passw);
centre(F, buf, true);
sprintf(buf, "Bitte denke daran, deine Befehle mit dem Betreff"
" ERESSEA BEFEHLE an eressea@eressea.amber.kn-bremen.de zu senden."
" Am besten, du verwendest die Befehlsvorlage am Ende des Reports.");
@ -2566,7 +2570,7 @@ reports(void)
#ifdef DMALLOC
assert(dmalloc_verify ( NULL ));
#endif
makedir("reports", 0700);
makedir(reportpath(), 0700);
if (global.data_version<BASE36_VERSION) base36conversion();
/* öffnet file BAT (mailit batch file) */

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: study.c,v 1.2 2001/01/26 16:19:39 enno Exp $
* $Id: study.c,v 1.3 2001/02/03 13:45:30 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)
@ -112,7 +112,7 @@ teach(region * r, unit * u)
char *s;
skill_t sk;
if ((race[u->race].flags & NOTEACH)) {
if ((race[u->race].flags & RCF_NOTEACH)) {
cmistake(u, u->thisorder, 274, MSG_EVENT);
return;
}
@ -358,7 +358,7 @@ learn(void)
cmistake(u, findorder(u, u->thisorder), 77, MSG_EVENT);
continue;
}
if ((race[u->race].flags & NOLEARN)) {
if ((race[u->race].flags & RCF_NOLEARN)) {
sprintf(buf, "%s können nichts lernen", race[u->race].name[1]);
mistake(u, u->thisorder, buf, MSG_EVENT);
continue;
@ -475,6 +475,8 @@ learn(void)
}
}
if (a==NULL) a = a_add(&u->attribs, a_new(&at_learning));
if (money>0) {
use_pooled(u, r, R_SILVER, money);
add_message(&u->faction->msgs, new_message(u->faction,
@ -483,12 +485,10 @@ learn(void)
}
if (get_effect(u, oldpotiontype[P_WISE])) {
if (a==NULL) a = a_add(&u->attribs, a_new(&at_learning));
a->data.i += min(u->number, get_effect(u, oldpotiontype[P_WISE])) * 10;
change_effect(u, oldpotiontype[P_WISE], -u->number);
}
if (get_effect(u, oldpotiontype[P_FOOL])) { /* Trank "Dumpfbackenbrot" */
if (a==NULL) a = a_add(&u->attribs, a_new(&at_learning));
a->data.i -= min(u->number, get_effect(u, oldpotiontype[P_FOOL])) * 30;
change_effect(u, oldpotiontype[P_FOOL], -u->number);
}
@ -499,25 +499,21 @@ learn(void)
|| i == SK_CATAPULT || i == SK_SWORD || i == SK_SPEAR
|| i == SK_AUSDAUER || i == SK_WEAPONLESS)
{
if (a==NULL) a = a_add(&u->attribs, a_new(&at_learning));
a->data.i += u->number * (5+warrior_skill*5);
} else {
if (a==NULL) a = a_add(&u->attribs, a_new(&at_learning));
a->data.i -= u->number * (5+warrior_skill*5);
a->data.i = max(0, a->data.i);
}
}
if (p != studycost) {
/* ist_in_gebaeude(r, u, BT_UNIVERSITAET) == 1) { */
/* p ist Kosten ohne Uni, studycost mit; wenn
* p!=studycost, ist die Einheit zwangsweise
* in einer Uni */
if (a==NULL) a = a_add(&u->attribs, a_new(&at_learning));
/* ist_in_gebaeude(r, u, BT_UNIVERSITAET) == 1) { */
/* p ist Kosten ohne Uni, studycost mit; wenn
* p!=studycost, ist die Einheit zwangsweise
* in einer Uni */
a->data.i += u->number * 10;
}
if (is_cursed(r->attribs,C_BADLEARN,0)) {
if (a==NULL) a = a_add(&u->attribs, a_new(&at_learning));
a->data.i -= u->number * 10;
}
#ifdef SKILLFIX_SAVE
@ -527,7 +523,6 @@ learn(void)
(int)(u->number * 30 * multi), a->data.i);
}
#endif
change_skill(u, (skill_t)i, (int)(u->number * 30 * multi) + (a?a->data.i:0));
if (a) {
a_remove(&u->attribs, a);
a = NULL;

View file

@ -41,7 +41,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX /Z7 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
@ -64,7 +64,7 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX"stdafx.h" /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: weapons.c,v 1.2 2001/01/26 16:19:39 enno Exp $
* $Id: weapons.c,v 1.3 2001/02/03 13:45:30 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,8 +51,8 @@ weapon_mod wm_halberd[] = {
{ 0, 0 }
};
static int
attack_firesword(const troop * at)
static boolean
attack_firesword(const troop * at, int *casualties)
{
fighter *fi = at->fighter;
troop dt;
@ -67,7 +67,10 @@ attack_firesword(const troop * at)
enemies = count_enemies(fi->side, FS_ENEMY,
minrow, maxrow);
if (!enemies) return 0;
if (!enemies) {
if (casualties) *casualties = 0;
return false; /* if no enemy found, no use doing standarad attack */
}
do {
dt = select_enemy(fi, minrow, maxrow);
@ -75,11 +78,12 @@ attack_firesword(const troop * at)
--force;
killed += terminate(dt, *at, AT_SPELL, damage, 1);
} while (force && killed < enemies);
return killed;
if (casualties) *casualties = killed;
return true;
}
static int
attack_catapult(const troop * at)
static boolean
attack_catapult(const troop * at, int * casualties)
{
fighter *af = at->fighter;
unit *au = af->unit;
@ -124,7 +128,8 @@ attack_catapult(const troop * at)
}
}
return d;
if (casualties) *casualties = d;
return false;
}
enum {
@ -224,7 +229,7 @@ init_oldweapons(void)
item_type * itype = olditemtype[weapontable[w].item];
int minskill = 1, wflags = WTF_NONE;
weapon_mod * modifiers = NULL;
int (*attack)(const troop *) = NULL;
int (*attack)(const troop *, int * deaths) = NULL;
switch (w) {
case WP_RUNESWORD:

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: alchemy.c,v 1.2 2001/01/26 16:19:39 enno Exp $
* $Id: alchemy.c,v 1.3 2001/02/03 13:45:30 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)
@ -99,7 +99,10 @@ use_potion(unit * u, const item_type * itype, const char * cmd)
return ECUSTOM;
}
if (ptype==oldpotiontype[P_TREES]) {
if (ptype->use) {
int nRetval = ptype->use(u, ptype, cmd);
if (nRetval) return nRetval;
} else if (ptype==oldpotiontype[P_TREES]) {
region * r = u->region;
int holz = new_use_pooled(u, oldresourcetype[R_WOOD], GET_SLACK|GET_RESERVE|GET_POOLED_SLACK, 10);
if (holz < 10)
@ -109,28 +112,8 @@ use_potion(unit * u, const item_type * itype, const char * cmd)
"growtree_effect%u:unit%i:amount", u, holz));
} else if (ptype==oldpotiontype[P_HEAL]) {
return EUNUSABLE;
} else if (ptype==oldpotiontype[P_WARMTH]) {
if (u->faction->race == RC_INSECT) {
fset(u, FL_WARMTH);
cmistake(u, cmd, 164, MSG_EVENT);
} else {
/* nur für insekten: */
cmistake(u, cmd, 163, MSG_EVENT);
return ECUSTOM;
}
} else if (ptype==oldpotiontype[P_HEILWASSER]) {
u->hp = min(unit_max_hp(u) * u->number, u->hp + 400);
} else if (ptype==oldpotiontype[P_BAUERNBLUT]) {
if (u->race == RC_DAEMON) {
attrib * a = (attrib*)a_find(u->attribs, &at_bauernblut);
if (!a) a = a_add(&u->attribs, a_new(&at_bauernblut));
a->data.i += 100;
} else {
/* bekommt nicht: */
cmistake(u, cmd, 165, MSG_EVENT);
u->race = RC_GHOUL;
set_faction(u, findfaction(MONSTER_FACTION));
}
} else if (ptype==oldpotiontype[P_PEOPLE]) {
region * r = u->region;
attrib * a = (attrib*)a_find(r->attribs, &at_peasantluck);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: battle.c,v 1.3 2001/02/02 08:40:45 enno Exp $
* $Id: battle.c,v 1.4 2001/02/03 13:45:30 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)
@ -56,7 +56,7 @@ typedef enum combatmagic {
#include "ship.h"
#include "building.h"
#ifdef GROUPS
#include "group.h"
# include "group.h"
#endif
/* util includes */
@ -81,24 +81,24 @@ typedef enum combatmagic {
#include <fcntl.h>
#endif
#ifdef HAVE_ZLIB
# include <zlib.h>
#elif defined(HAVE_BZ2LIB)
# define dbgprintf(a) gzprintf a;
gzFile bdebug;
#elif HAVE_BZ2LIB
# include <bzlib.h>
# define dbgprintf(a) bz2printf a;
BZFILE *bdebug;
#else
# define dbgprintf(a) fprintf a;
FILE *bdebug;
#endif
/* TODO: header cleanup */
extern int dice_rand(const char *s);
extern item_type it_demonseye;
#ifdef HAVE_ZLIB
gzFile bdebug;
#elif defined(HAVE_BZ2LIB)
BZFILE *bdebug;
#else
FILE *bdebug;
#endif
int obs_count = 0;
boolean nobattledebug = false;
@ -167,8 +167,8 @@ fleeregion(const unit * u)
return NULL;
if (u->ship &&
!(race[u->race].flags & SWIM) &&
!(race[u->race].flags & FLY)) {
!(race[u->race].flags & RCF_SWIM) &&
!(race[u->race].flags & RCF_FLY)) {
return NULL;
}
@ -215,48 +215,22 @@ armedmen(const unit * u)
{
item * itm;
int n = 0;
switch (u->race) {
case RC_DWARF:
case RC_ELF:
case RC_ORC:
case RC_GOBLIN:
case RC_HUMAN:
case RC_TROLL:
case RC_DAEMON:
case RC_INSECT:
case RC_HALFLING:
case RC_CAT:
case RC_AQUARIAN:
/* alle Waffen werden gezaehlt, und dann wird auf die Anzahl
* Personen minimiert */
for (itm=u->items;itm;itm=itm->next) {
if (itm->type->flags & ITF_WEAPON) n += itm->number;
if (n>u->number) break;
}
break;
case RC_ILLUSION:
/* eigentlich unnoetig, da sie sowieso keine skills haben */
break;
default:
if (race[u->race].ec_flags & CANGUARD) {
n = u->number; /* fuer untote und drachen */
if (!urace(u)->flags & RCF_NOWEAPONS) {
if (urace(u)->ec_flags & CANGUARD) {
/* kann ohne waffen bewachen: fuer untote und drachen */
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) >= wtype->minskill) n += itm->number;
if (n>u->number) break;
}
n = min(n, u->number);
}
break;
}
n = min(n, u->number);
return n;
}
@ -267,14 +241,7 @@ battledebug(const char *s)
printf("%s\n", translate_regions(s, NULL));
#endif
if (bdebug) {
#ifdef HAVE_ZLIB
gzprintf(bdebug, "%s\n", translate_regions(s, NULL));
#elif HAVE_BZ2LIB
bz2printf(bdebug, "%s\n", translate_regions(s, NULL));
#else
fprintf(bdebug, "%s\n", translate_regions(s, NULL));
fflush(bdebug);
#endif
dbgprintf((bdebug, "%s\n", translate_regions(s, NULL)));
}
}
@ -679,8 +646,12 @@ weapon_effskill(troop t, troop enemy, const weapon * w, boolean attacking, boole
/* Burgenbonus, Pferdebonus. Der Waffenabhängige wird aber * nicht hier
* gemacht, sondern in weapon_effskill */
if (riding(t) && (wtype==NULL || !fval(wtype, WTF_MISSILE))) {
if (tu->race == RC_TROLL) skill += 1;
else skill += 2;
skill += 2;
#ifdef BETA_CODE
skill = skillmod(urace(tu)->attribs, tu, tu->region, wtype->skill, skill, SMF_RIDING);
#else
if (tu->race == RC_TROLL) skill--;
#endif
}
if (t.index<tf->elvenhorses) {
@ -1776,9 +1747,13 @@ attack(battle *b, troop ta, att *a)
if (getreload(ta)) {
ta.fighter->person[ta.index].reload--;
} else {
boolean standard_attack = true;
if (wp && wp->type->attack) {
af->catmsg += wp->type->attack(&ta);
} else {
int dead;
standard_attack = wp->type->attack(&ta, &dead);
af->catmsg += dead;
}
if (standard_attack) {
boolean missile = false;
if (wp && fval(wp->type, WTF_MISSILE)) missile=true;
if (missile) td = select_enemy(af, missile_range[0]-row, missile_range[1]-row);
@ -2812,7 +2787,7 @@ make_fighter(battle * b, unit * u, boolean attack)
s1->nonblockers[fig->status + FIGHT_ROW] += u->number;
}
if (race[fig->unit->race].flags & HORSE) {
if (race[fig->unit->race].flags & RCF_HORSE) {
fig->horses = fig->unit->number;
fig->elvenhorses = 0;
} else {
@ -2925,34 +2900,24 @@ make_battle(region * r)
static int max_fac_no = 0; /* need this only once */
if (!nobattledebug) {
#ifdef HAVE_ZLIB
sprintf(buf, "battles/battle-%d-%s.gz", obs_count, simplename(r));
bdebug = gzopen(buf, "w");
#elif HAVE_BZ2LIB
sprintf(buf, "battles/battle-%d-%s.bz2", obs_count, simplename(r));
bdebug = BZ2_bzopen(buf, "w");+
#else
sprintf(buf, "battles/battle-%d-%s", obs_count, simplename(r));
bdebug = fopen(buf, "w");
#endif
char zText[MAX_PATH];
sprintf(zText, "%s/battles", basepath());
if (!debug) {
makedir("battles", 0700);
char zFilename[MAX_PATH];
makedir(zText, 0700);
#ifdef HAVE_ZLIB
bdebug = gzopen(buf, "w");
sprintf(zFilename, "%s/battle-%d-%s.log.gz", zText, obs_count, simplename(r));
bdebug = gzopen(zFilename, "w");
#elif HAVE_BZ2LIB
bdebug = BZ2_bzopen(buf, "w");
sprintf(zFilename, "%s/battle-%d-%s.log.bz2", zText, obs_count, simplename(r));
bdebug = BZ2_bzopen(zFilename, "w");+
#else
bdebug = fopen(buf, "w");
sprintf(zFilename, "%s/battle-%d-%s.log", zText, obs_count, simplename(r));
bdebug = fopen(zFilename, "w");
#endif
if (!bdebug) fputs("battles können nicht debugged werden\n", stderr);
else {
#ifdef HAVE_ZLIB
gzprintf(bdebug, "In %s findet ein Kampf statt:", rname(r, NULL));
#elif HAVE_BZ2LIB
bz2printf(bdebug, "In %s findet ein Kampf statt:", region_name(r));
#else
fprintf(bdebug, "In %s findet ein Kampf statt:", rname(r, NULL));
#endif
dbgprintf((bdebug, "In %s findet ein Kampf statt:", rname(r, NULL)));
}
}
obs_count++;

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: build.c,v 1.2 2001/01/26 16:19:39 enno Exp $
* $Id: build.c,v 1.3 2001/02/03 13:45:31 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)
@ -452,13 +452,10 @@ build_road(region * r, unit * u, int size, direction_t d)
++golemsused;
}
scale_number(u,u->number - golemsused);
return;
} else {
/* Nur soviel PRODUCEEXP wie auch tatsaechlich gemacht wurde */
change_skill(u, SK_ROAD_BUILDING, min(n, u->number) * PRODUCEEXP);
}
/* Nur soviel PRODUCEEXP wie auch tatsaechlich gemacht wurde */
change_skill(u, SK_ROAD_BUILDING, min(n, u->number) * PRODUCEEXP);
add_message(&u->faction->msgs, new_message(
u->faction, "buildroad%r:region%u:unit%i:size", r, u, n));
}
@ -569,8 +566,7 @@ build(unit * u, const construction * ctype, int completed, int want)
}
if (basesk < type->minskill) {
if (made==0) return ELOWSKILL;
break; /* not good enough to go on */
if (made==0) return ELOWSKILL; /* not good enough to go on */
}
/* n = maximum buildable size */
@ -671,7 +667,7 @@ build_building(unit * u, const building_type * btype, int want)
{
region * r = u->region;
boolean newbuilding = false;
int built = 0;
int c, built = 0;
building * b = getbuilding(r);
/* einmalige Korrektur */
static FILE *statfile = NULL;
@ -717,20 +713,18 @@ build_building(unit * u, const building_type * btype, int want)
/* the building is already complete */
cmistake(u, findorder(u, u->thisorder), 4, MSG_PRODUCE);
return;
case ENOMATERIALS:
/* something missing from the list of materials */
strcpy(buf, "Dafür braucht man mindestens:");
{
int c, n;
case ENOMATERIALS: {
/* something missing from the list of materials */
const construction * cons = btype->construction;
char * ch = buf+strlen(buf);
assert(cons);
strcpy(buf, "Dafür braucht man mindestens:");
for (c=0;cons->materials[c].number; c++) {
if (c!=0)
strcat(ch++, ",");
n=cons->materials[c].number / cons->reqsize;
sprintf(ch, " %d %s", n?n:1, resname(cons->materials[c].type, cons->materials[c].number==1));
ch = ch+strlen(ch);
int n;
if (c!=0) strcat(ch++, ",");
n = cons->materials[c].number / cons->reqsize;
sprintf(ch, " %d %s", n?n:1, resname(cons->materials[c].type, cons->materials[c].number==1));
ch = ch+strlen(ch);
}
strcat(ch,".");
mistake(u, u->thisorder, buf, MSG_PRODUCE);
@ -973,7 +967,7 @@ do_leave(void)
for (S = u->orders; S; S = S->next) {
if(igetkeyword(S->s) == K_LEAVE) {
if (r->terrain == T_OCEAN && u->ship) {
if(!(race[u->race].flags & SWIM)) {
if(!(race[u->race].flags & RCF_SWIM)) {
cmistake(u, S->s, 11, MSG_MOVE);
break;
}
@ -1032,8 +1026,8 @@ do_misc(char try)
/* Sollte momentan nicht vorkommen, da Schwimmer nicht
* an Land können, und es keine Gebäude auf See gibt. */
if( !(race[u->race].flags & WALK) &&
!(race[u->race].flags & FLY)) {
if( !(race[u->race].flags & RCF_WALK) &&
!(race[u->race].flags & RCF_FLY)) {
if (try) cmistake(u, S->s, 232, MSG_MOVE);
S = Snext;
continue;
@ -1078,8 +1072,8 @@ do_misc(char try)
/* Muß abgefangen werden, sonst könnten Schwimmer an
* Bord von Schiffen an Land gelangen. */
if( !(race[u->race].flags & WALK) &&
!(race[u->race].flags & FLY)) {
if( !(race[u->race].flags & RCF_WALK) &&
!(race[u->race].flags & RCF_FLY)) {
cmistake(u, S->s, 233, MSG_MOVE);
S = Snext;
continue;

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: building.c,v 1.3 2001/01/27 18:15:32 enno Exp $
* $Id: building.c,v 1.4 2001/02/03 13:45:32 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)
@ -755,7 +755,9 @@ findbuildingtype(const char * name, const locale * lang)
static int
sm_smithy(const unit * u, const region * r, skill_t sk, int value) /* skillmod */
{
if (u->region == r && (sk==SK_ARMORER || sk==SK_WEAPONSMITH)) return value + 1;
if (sk==SK_WEAPONSMITH || sk==SK_ARMORER) {
if (u->region == r) return value + 1;
}
return value;
}
@ -769,14 +771,8 @@ mm_smithy(const unit * u, const resource_type * rtype, int value) /* material-mo
void
init_buildings(void)
{
skillmod_data * smd;
attrib * a;
a = a_add(&bt_smithy.attribs, a_new(&at_skillmod));
smd = (skillmod_data *)a->data.v;
smd->special = sm_smithy;
smd->flags = SMF_PRODUCTION;
a = a_add(&bt_smithy.attribs, make_matmod(mm_smithy));
a_add(&bt_smithy.attribs, make_skillmod(NOSKILL, SMF_PRODUCTION, sm_smithy, 0, 0));
a_add(&bt_smithy.attribs, make_matmod(mm_smithy));
}
void

View file

@ -1449,7 +1449,7 @@ sp_healing(fighter * fi, int level, int force, spell * sp)
break;
/* Untote kann man nicht heilen */
if (race[df->unit->race].flags & NOHEAL)
if (race[df->unit->race].flags & RCF_NOHEAL)
continue;
hp = unit_max_hp(df->unit);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: curse.c,v 1.3 2001/01/31 17:40:49 corwin Exp $
* $Id: curse.c,v 1.4 2001/02/03 13:45:32 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)
@ -140,9 +140,24 @@ cfindhash(int i)
#include "umlaut.h"
extern struct tnode cursenames;
typedef struct cursetype_list {
struct cursetype_list * next;
const curse_type * type;
} cursetype_list;
cursetype_list * cursetypes;
void
ct_register(curse_type * ct) {
assert(0);
ct_register(const curse_type * ct)
{
cursetype_list ** ctlp = &cursetypes;
while (*ctlp) {
cursetype_list * ctl = *ctlp;
if (ctl->type==ct) return;
ctlp=&ctl->next;
}
*ctlp = calloc(1, sizeof(cursetype_list));
(*ctlp)->type = ct;
}
const curse_type *
@ -151,24 +166,18 @@ ct_find(const char *c)
/* TODO: findet nur curse_types, die auch in curse_data sind.
* da fehlt noch ene registrierung wie für attrib_type
*/
int i = (int)findtoken(&cursenames, c)-1;
if (cursedaten[i].name[0] == 0) return NULL;
int i = (int)findtoken(&cursenames, c);
if (i == -1 || cursedaten[i].name[0] == 0) {
cursetype_list * ctl = cursetypes;
while (ctl) {
int k = min(strlen(c), strlen(ctl->type->name));
if (!strncasecmp(c, ctl->type->name, k)) return ctl->type;
ctl = ctl->next;
}
}
return &cursedaten[i];
}
int
find_cursebyname(const char *s)
{
int i;
i = (int)findtoken(&cursenames, s)-1;
if(cursedaten[i].name[0] == 0)
return -1;
return i;
}
/* ------------------------------------------------------------- */
boolean
is_normalcurse(curse_t id)
@ -488,7 +497,7 @@ set_curse(unit *mage, attrib **ap, curse_t id, int id2, int vigour,
c->no = newunitid();
chash(c);
switch (c->type->typ){
switch (c->type->typ) {
case CURSETYP_NORM:
break;
@ -1264,7 +1273,7 @@ cinfo_riot(void * obj, typ_t typ, curse *c, int self)
* der wohl noch etwa %s Wochen andauert.
* %info, "Dieser Zauber blafalsel blub"
*/
cursedata cursedaten[MAXCURSE] =
curse_type cursedaten[MAXCURSE] =
{
/* struct's vom typ curse: */
{ /* C_FOGTRAP, */

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: curse.h,v 1.3 2001/01/31 17:40:50 corwin Exp $
* $Id: curse.h,v 1.4 2001/02/03 13:45:32 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)
@ -23,7 +23,7 @@
/* ------------------------------------------------------------- */
/* Zauberwirkungen */
/* nicht vergessen cursedata zu aktualisieren und Reihenfolge beachten!
/* nicht vergessen curse_type zu aktualisieren und Reihenfolge beachten!
*/
enum {
@ -131,12 +131,10 @@ enum {
/* ------------------------------------------------------------- */
/* Allgemeine Zauberwirkungen */
typedef struct cursedata curse_type;
typedef struct curse {
struct curse *nexthash;
int no; /* 'Einheitennummer' dieses Curse */
curse_type * type; /* Zeiger auf ein cursedata-struct */
struct curse_type * type; /* Zeiger auf ein curse_type-struct */
curse_t cspellid; /* Id des Cursezaubers */
int flag; /* generelle Flags wie zb CURSE_ISNEW oder CURSE_NOAGE */
int duration; /* Dauer der Verzauberung. Wird jede Runde vermindert */
@ -179,7 +177,7 @@ typedef int (*cdesc_fun)(const void*, int, curse*, int);
/* ------------------------------------------------------------- */
typedef struct cursedata {
typedef struct curse_type {
int typ;
int givemenacting;
int mergeflags;
@ -189,9 +187,9 @@ typedef struct cursedata {
Zauberanalyse angezeigt */
int (*curseinfo)(const void*, int, curse*, int);
void (*change_vigour)(curse*, int);
} cursedata;
} curse_type;
extern cursedata cursedaten[];
extern struct curse_type cursedaten[];
extern attrib_type at_curse;
extern void curse_write(const attrib * a,FILE * f);
@ -280,6 +278,7 @@ struct unit * get_cursingmagician(struct attrib *ap, curse_t id, int id2);
* */
int find_cursebyname(const char *c);
const curse_type * ct_find(const char *c);
void ct_register(const curse_type *);
/* Regionszauber */
curse * cfindhash(int i);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: eressea.c,v 1.6 2001/02/02 08:40:45 enno Exp $
* $Id: eressea.c,v 1.7 2001/02/03 13:45:32 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)
@ -22,6 +22,10 @@
#include <config.h>
#include "eressea.h"
/* attributes includes */
#include <attributes/reduceproduction.h>
/* kernel includes */
#include "message.h"
#include "spell.h"
#include "names.h"
@ -45,9 +49,7 @@
#include "objtypes.h"
#include "ship.h"
#include "karma.h"
#ifdef GROUPS
#include "group.h"
#endif
/* util includes */
#include <base36.h>
@ -64,14 +66,12 @@
#include <limits.h>
#include <time.h>
/* attributes includes */
#include <attributes/reduceproduction.h>
/* exported variables */
region *regions;
region *regions;
faction *factions;
settings global;
char buf[BUFSIZE + 1];
char buf[BUFSIZE + 1];
FILE *logfile;
const char *directions[MAXDIRECTIONS+2] =
{
@ -264,7 +264,8 @@ max_skill(faction * f, skill_t skill)
return m;
}
const char * g_basedir;
char * g_basedir;
char * g_resourcedir;
const char *
basepath(void)
@ -273,6 +274,14 @@ basepath(void)
return ".";
}
const char *
resourcepath(void)
{
static char zText[MAX_PATH];
if (g_resourcedir) return g_resourcedir;
return strcat(strcpy(zText, basepath()), "/res");
}
int
count_all_money(const region * r)
{
@ -1060,11 +1069,12 @@ count_all (faction * f)
int
count_maxmigrants (faction * f)
{
int x = 0;
if (f->race == RC_HUMAN) {
int x = (int)(log10(count_all(f) / 50.0) * 20);
return max(0, x);
if (x < 0) x = 0;
}
return 0;
return x;
}
race_t
@ -2097,7 +2107,7 @@ init_used_faction_ids(void)
#if defined(OLD_TRIGGER) || defined(CONVERT_TRIGGER)
# include "trigger.h"
# include <eressea/old/trigger.h>
# include <resolve.h>
typedef struct unresolved {
struct unresolved * next;

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: eressea.h,v 1.7 2001/02/02 08:40:45 enno Exp $
* $Id: eressea.h,v 1.8 2001/02/03 13:45:32 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)
@ -138,6 +138,7 @@ typedef struct settings {
extern settings global;
#define RELEASE_VERSION NEWSOURCE_VERSION
#define ECHECK_VERSION "3.9"
/* changes from->to: 72->73: struct unit::lock entfernt.
* 73->74: struct unit::flags eingeführt.
@ -1126,6 +1127,7 @@ extern void add_income(struct unit * u, int type, int want, int qty);
extern int month(int offset);
extern const char * basepath(void);
extern const char * resourcepath(void);
#define FIRST_TURN 184

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: item.c,v 1.5 2001/02/02 08:40:45 enno Exp $
* $Id: item.c,v 1.6 2001/02/03 13:45:32 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)
@ -95,24 +95,26 @@ res_changepeasants(unit * u, const resource_type * rtype, int delta)
int
res_changeitem(unit * u, const resource_type * rtype, int delta)
{
int num;
if (rtype == oldresourcetype[R_STONE] && u->race==RC_STONEGOLEM && delta<=0) {
int reduce = delta / GOLEM_STONE;
if (delta % GOLEM_STONE != 0) --reduce;
scale_number(u, u->number+reduce);
return u->number;
num = u->number;
} else if (rtype == oldresourcetype[R_IRON] && u->race==RC_IRONGOLEM && delta<=0) {
int reduce = delta / GOLEM_IRON;
if (delta % GOLEM_IRON != 0) --reduce;
scale_number(u, u->number+reduce);
return u->number;
num = u->number;
} else {
const item_type * itype = resource2item(rtype);
item * i;
assert(itype!=NULL);
i = i_change(&u->items, itype, delta);
if (i==NULL) return 0;
return i->number;
num = i->number;
}
return num;
}
const char *
@ -1123,7 +1125,6 @@ mod_elves_only(const unit * u, const region * r, skill_t sk, int value)
{
if (u->race==RC_ELF) return value;
unused(r);
unused(sk);
return -118;
}
@ -1262,6 +1263,7 @@ init_olditems(void)
case I_GREATBOW:
a = a_add(&con->attribs, a_new(&at_skillmod));
smd = (skillmod_data*)a->data.v;
smd->skill=NOSKILL;
smd->special = mod_elves_only;
break;
default:
@ -1680,6 +1682,40 @@ const char *potiontext[MAXPOTIONS] =
"Verletzung angewandt.",
};
static int
use_warmthpotion(struct unit *u, const struct potion_type *ptype, const char *cmd)
{
assert(ptype==oldpotiontype[P_WARMTH]);
if (u->faction->race == RC_INSECT) {
fset(u, FL_WARMTH);
cmistake(u, cmd, 164, MSG_EVENT);
} else {
/* nur für insekten: */
cmistake(u, cmd, 163, MSG_EVENT);
return ECUSTOM;
}
unused(ptype);
return 0;
}
static int
use_bloodpotion(struct unit *u, const struct potion_type *ptype, const char *cmd)
{
assert(ptype==oldpotiontype[P_BAUERNBLUT]);
unused(ptype);
if (u->race == RC_DAEMON) {
attrib * a = (attrib*)a_find(u->attribs, &at_bauernblut);
if (!a) a = a_add(&u->attribs, a_new(&at_bauernblut));
a->data.i += 100;
} else {
/* bekommt nicht: */
cmistake(u, cmd, 165, MSG_EVENT);
u->race = RC_GHOUL;
set_faction(u, findfaction(MONSTER_FACTION));
}
return 0;
}
void
init_oldpotions(void)
{
@ -1742,6 +1778,8 @@ init_oldpotions(void)
oldpotiontype[p]->level = potionlevel[p];
oldpotiontype[p]->text = potiontext[p];
}
oldpotiontype[P_WARMTH]->use = &use_warmthpotion;
oldpotiontype[P_BAUERNBLUT]->use = &use_bloodpotion;
}
resource_type * r_silver;

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: item.h,v 1.2 2001/01/26 16:19:39 enno Exp $
* $Id: item.h,v 1.3 2001/02/03 13:45:32 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)
@ -132,6 +132,7 @@ typedef struct potion_type {
const item_type * itype;
int level;
const char * text;
int (*use)(struct unit *, const struct potion_type *, const char *);
/* --- pointers --- */
struct potion_type * next;
} potion_type;
@ -178,7 +179,7 @@ typedef struct weapon_type {
int reload; /* time to reload this weapon */
weapon_mod * modifiers;
/* --- functions --- */
int (*attack)(const struct troop *);
boolean (*attack)(const struct troop *, int *deaths);
/* --- pointers --- */
struct weapon_type * next;
} weapon_type;

View file

@ -4,7 +4,7 @@
# TARGTYPE "Win32 (x86) Static Library" 0x0104
CFG=kernel - Win32 Debug
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
@ -13,12 +13,14 @@ CFG=kernel - Win32 Debug
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "kernel-6.mak" CFG="kernel - Win32 Debug"
!MESSAGE NMAKE /f "kernel-6.mak" CFG="kernel - Win32 Conversion"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!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
# Begin Project
@ -41,7 +43,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX /Z7 /O2 /I "../util" /I "../.." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
@ -64,7 +66,7 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../.." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX"stdafx.h" /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../.." /I ".." /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
@ -74,12 +76,60 @@ LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"Debug\kernel.lib"
!ELSEIF "$(CFG)" == "kernel - Win32 Conversion"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "kernel___Win32_Conversion"
# PROP BASE Intermediate_Dir "kernel___Win32_Conversion"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Conversion"
# PROP Intermediate_Dir "Conversion"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../.." /I ".." /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../.." /I ".." /D "_WINDOWS" /D "BETA_CODE" /D "CONVERT_TRIGGER" /D "WIN32" /D "_DEBUG" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo /out:"Debug\kernel.lib"
# ADD LIB32 /nologo /out:"Debug\kernel.lib"
!ELSEIF "$(CFG)" == "kernel - Win32 Profile"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "kernel___Win32_Profile"
# PROP BASE Intermediate_Dir "kernel___Win32_Profile"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Profile"
# PROP Intermediate_Dir "Profile"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /I "../util" /I "../.." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX- /Z7 /O2 /I "../util" /I "../.." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ENDIF
# Begin Target
# Name "kernel - Win32 Release"
# Name "kernel - Win32 Debug"
# Name "kernel - Win32 Conversion"
# Name "kernel - Win32 Profile"
# Begin Group "Header"
# PROP Default_Filter "*.h"

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: magic.c,v 1.3 2001/01/28 08:01:51 enno Exp $
* $Id: magic.c,v 1.4 2001/02/03 13:45:32 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)
@ -445,38 +445,50 @@ updatespelllist(unit * u)
}
/* Transformierte Wyrm-Magier bekommen Drachenodem */
if (u->race == RC_WYRM) {
if(!getspell(u, SPL_FIREDRAGONODEM) &&
find_spellbyid(SPL_FIREDRAGONODEM)->level <= max) {
if (dragon(u)){
switch (u->race){
/* keine breaks! Wyrme sollen alle drei Zauber können.*/
case RC_WYRM:
{
if(!getspell(u, SPL_WYRMODEM) &&
find_spellbyid(SPL_WYRMODEM)->level <= max) {
addspell(u, SPL_FIREDRAGONODEM);
if (!already_seen(u->faction, spelldaten[i].id)) {
a_add(&u->faction->attribs,
a_new(&at_reportspell))->data.i = SPL_FIREDRAGONODEM;
a_add(&u->faction->attribs,
a_new(&at_seenspell))->data.i = SPL_FIREDRAGONODEM;
addspell(u, SPL_WYRMODEM);
if (!already_seen(u->faction, spelldaten[i].id)) {
a_add(&u->faction->attribs,
a_new(&at_reportspell))->data.i = SPL_WYRMODEM;
a_add(&u->faction->attribs,
a_new(&at_seenspell))->data.i = SPL_WYRMODEM;
}
}
}
}
if(!getspell(u, SPL_DRAGONODEM) &&
find_spellbyid(SPL_DRAGONODEM)->level <= max) {
case RC_DRAGON:
{
if(!getspell(u, SPL_DRAGONODEM) &&
find_spellbyid(SPL_DRAGONODEM)->level <= max) {
addspell(u, SPL_DRAGONODEM);
if (!already_seen(u->faction, spelldaten[i].id)) {
a_add(&u->faction->attribs,
a_new(&at_reportspell))->data.i = SPL_DRAGONODEM;
a_add(&u->faction->attribs,
a_new(&at_seenspell))->data.i = SPL_DRAGONODEM;
addspell(u, SPL_DRAGONODEM);
if (!already_seen(u->faction, spelldaten[i].id)) {
a_add(&u->faction->attribs,
a_new(&at_reportspell))->data.i = SPL_DRAGONODEM;
a_add(&u->faction->attribs,
a_new(&at_seenspell))->data.i = SPL_DRAGONODEM;
}
}
}
}
if(!getspell(u, SPL_WYRMODEM) &&
find_spellbyid(SPL_WYRMODEM)->level <= max) {
case RC_FIREDRAGON:
{
if(!getspell(u, SPL_FIREDRAGONODEM) &&
find_spellbyid(SPL_FIREDRAGONODEM)->level <= max) {
addspell(u, SPL_WYRMODEM);
if (!already_seen(u->faction, spelldaten[i].id)) {
a_add(&u->faction->attribs,
a_new(&at_reportspell))->data.i = SPL_WYRMODEM;
a_add(&u->faction->attribs,
a_new(&at_seenspell))->data.i = SPL_WYRMODEM;
addspell(u, SPL_FIREDRAGONODEM);
if (!already_seen(u->faction, spelldaten[i].id)) {
a_add(&u->faction->attribs,
a_new(&at_reportspell))->data.i = SPL_FIREDRAGONODEM;
a_add(&u->faction->attribs,
a_new(&at_seenspell))->data.i = SPL_FIREDRAGONODEM;
}
}
}
}
}
@ -1528,17 +1540,6 @@ verify_targets(castorder *co)
if (u) {
/* die Einheit wurde nun gefunden und befindet sich in der
* Zielregion */
if ((sp->sptyp & TESTRESISTANCE)
&& target_resists_magic(mage, u, TYP_UNIT, 0))
{ /* Fehlermeldung */
spobj->flag = TARGET_RESISTS;
add_message(&mage->faction->msgs, new_message(mage->faction,
"spellunitresists%u:unit%r:region%s:command%s:id",
mage, mage->region, strdup(co->order),
strdup(itoa36(spobj->data.i))));
failed++;
break;
}
/* Wenn auf Sichtbarkeit geprüft werden soll und die Einheit
* nicht gesehen wird und auch nicht kontaktiert, dann melde
@ -1555,6 +1556,18 @@ verify_targets(castorder *co)
failed++;
break;
}
if ((sp->sptyp & TESTRESISTANCE)
&& target_resists_magic(mage, u, TYP_UNIT, 0))
{ /* Fehlermeldung */
spobj->flag = TARGET_RESISTS;
add_message(&mage->faction->msgs, new_message(mage->faction,
"spellunitresists%u:unit%r:region%s:command%s:id",
mage, mage->region, strdup(co->order),
strdup(itoa36(spobj->data.i))));
failed++;
break;
}
spobj->typ = SPP_UNIT;
spobj->data.u = u;
} else { /* Einheit nicht gefunden */
@ -1566,6 +1579,21 @@ verify_targets(castorder *co)
failed++;
break;
}
/* TODO: Test auf Parteieigenschaft Magieresistsenz */
if ((sp->sptyp & TESTRESISTANCE)
&& target_resists_magic(mage, u, TYP_UNIT, 0))
{ /* Fehlermeldung */
spobj->typ = SPP_UNIT_ID;
spobj->data.i = u->no;
spobj->flag = TARGET_RESISTS;
add_message(&mage->faction->msgs, new_message(mage->faction,
"spellunitresists%u:unit%r:region%s:command%s:id",
mage, mage->region, strdup(co->order),
strdup(itoa36(spobj->data.i))));
failed++;
break;
}
break;
}
case SPP_UNIT:
@ -1586,21 +1614,6 @@ verify_targets(castorder *co)
break;
}
/* TODO: Test auf Parteieigenschaft Magieresistsenz */
if ((sp->sptyp & TESTRESISTANCE)
&& target_resists_magic(mage, u, TYP_UNIT, 0))
{ /* Fehlermeldung */
spobj->typ = SPP_UNIT_ID;
spobj->data.i = u->no;
spobj->flag = TARGET_RESISTS;
add_message(&mage->faction->msgs, new_message(mage->faction,
"spellunitresists%u:unit%r:region%s:command%s:id",
mage, mage->region, strdup(co->order),
strdup(itoa36(spobj->data.i))));
failed++;
break;
}
/* Wenn auf Sichtbarkeit geprüft werden soll und die Einheit
* nicht gesehen wird und auch nicht kontaktiert, dann melde
* 'Einheit nicht gefunden' */
@ -2426,6 +2439,7 @@ set_familiar(unit * mage, unit * familiar)
attrib * a = a_add(&mage->attribs, a_new(&at_skillmod));
skillmod_data * smd = (skillmod_data *)a->data.v;
smd->special = sm_familiar;
smd->skill=NOSKILL;
assert(!nonplayer(mage));
}

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: movement.c,v 1.3 2001/02/02 08:40:45 enno Exp $
* $Id: movement.c,v 1.4 2001/02/03 13:45:32 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)
@ -166,7 +166,7 @@ ridingcapacity(unit * u)
* von zwei Pferden gezogen wird */
pferde = min(get_item(u, I_HORSE), effskill(u, SK_RIDING) * u->number * 2);
if(race[u->race].flags & HORSE) pferde += u->number;
if(race[u->race].flags & RCF_HORSE) pferde += u->number;
/* maximal diese Pferde können zum Ziehen benutzt werden */
wagen = min(pferde / HORSESNEEDED, get_item(u, I_WAGON));
@ -184,7 +184,7 @@ walkingcapacity(unit * u)
* die Leute tragen */
pferde = get_item(u, I_HORSE);
if(race[u->race].flags & HORSE) {
if(race[u->race].flags & RCF_HORSE) {
pferde += u->number;
personen = 0;
} else {
@ -277,7 +277,7 @@ canfly(unit *u)
if(get_item(u, I_PEGASUS) >= u->number && effskill(u, SK_RIDING) >= 4)
return true;
if(race[u->race].flags & FLY) return true;
if(race[u->race].flags & RCF_FLY) return true;
return false;
}
@ -292,9 +292,9 @@ canswim(unit *u)
if(fspecial(u->faction, FS_AMPHIBIAN)) return true;
if(race[u->race].flags & FLY) return true;
if(race[u->race].flags & RCF_FLY) return true;
if(race[u->race].flags & SWIM) return true;
if(race[u->race].flags & RCF_SWIM) return true;
return false;
}
@ -310,7 +310,7 @@ canride(unit * u)
maxunicorns = (skill/5) * u->number;
maxpferde = skill * u->number * 2;
if(!(race[u->race].flags & HORSE)
if(!(race[u->race].flags & RCF_HORSE)
&& ((pferde == 0 && unicorns == 0)
|| pferde > maxpferde || unicorns > maxunicorns)) {
return 0;
@ -321,7 +321,7 @@ canride(unit * u)
#else
if(ridingcapacity(u) - weight(u) >= 0) {
#endif
if(pferde == 0 && unicorns >= u->number && !(race[u->race].flags & HORSE)) {
if(pferde == 0 && unicorns >= u->number && !(race[u->race].flags & RCF_HORSE)) {
return 2;
}
return 1;
@ -1831,7 +1831,7 @@ hunt(unit *u)
} else if(attacked(u)) {
cmistake(u, findorder(u, u->thisorder), 52, MSG_MOVE);
return false;
} else if(race[u->race].flags & CANNOT_MOVE) {
} else if(race[u->race].flags & RCF_CANNOTMOVE) {
cmistake(u, findorder(u, u->thisorder), 55, MSG_MOVE);
return false;
}
@ -1974,7 +1974,7 @@ movement(void)
cmistake(u, findorder(u, u->thisorder), 52, MSG_MOVE);
set_string(&u->thisorder, "");
u = un;
} else if (race[u->race].flags & CANNOT_MOVE) {
} else if (race[u->race].flags & RCF_CANNOTMOVE) {
cmistake(u, findorder(u, u->thisorder), 55, MSG_MOVE);
set_string(&u->thisorder, "");
u = un;
@ -2006,7 +2006,7 @@ movement(void)
if(attacked(u)) {
cmistake(u, o->s, 52, MSG_MOVE);
u = u2; break;
} else if(race[u->race].flags & CANNOT_MOVE) {
} else if(race[u->race].flags & RCF_CANNOTMOVE) {
cmistake(u, o->s, 55, MSG_MOVE);
u = u2; break;
}
@ -2040,7 +2040,7 @@ movement(void)
|| igetkeyword(u->thisorder) == K_ROUTE)) {
if (attacked(u)) {
cmistake(u, findorder(u, u->thisorder), 52, MSG_PRODUCE);
} else if (race[u->race].flags & CANNOT_MOVE) {
} else if (race[u->race].flags & RCF_CANNOTMOVE) {
cmistake(u, findorder(u, u->thisorder), 55, MSG_PRODUCE);
} else
move(r, u, true);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: race.c,v 1.3 2001/01/31 17:40:50 corwin Exp $
* $Id: race.c,v 1.4 2001/02/03 13:45:32 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)
@ -22,18 +22,23 @@
#include "eressea.h"
#include "race.h"
#include "item.h"
#include "spell.h"
#include <races/zombies.h>
#include <races/dragons.h>
#include <races/illusion.h>
#include "alchemy.h"
#include "faction.h"
#include "unit.h"
#include "region.h"
#include "magic.h"
#include "build.h"
#include "names.h"
#include "ship.h"
#include "building.h"
#include "faction.h"
#include "item.h"
#include "magic.h"
#include "region.h"
#include "spell.h"
#include "unit.h"
#include "names.h"
#include "pathfinder.h"
#include "ship.h"
#include "skill.h"
/* util includes */
#include <attrib.h>
@ -41,9 +46,6 @@
/* libc includes */
#include <stdio.h>
#include <math.h>
#include <races/zombies.h>
#include <races/dragons.h>
#include <races/illusion.h>
/* TODO: Tragkraft in die Struktur */
@ -132,7 +134,7 @@ struct racedata race[MAXRACES] =
false,
/* Flags */
WALK | LEARN | MOVE_RANDOM | ATTACK_RANDOM,
RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM,
/* Battle_flags */
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
@ -159,7 +161,7 @@ struct racedata race[MAXRACES] =
0, 0,-1,-1, 0, 1, 0, 0, 0, 1, 0, 0, -99
},
false,
WALK | LEARN | MOVE_RANDOM | ATTACK_RANDOM,
RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM,
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM,
{RC_HOUSECAT, RC_FEY, RC_OWL, RC_NYMPH, RC_UNICORN, RC_IMP}
@ -178,7 +180,7 @@ struct racedata race[MAXRACES] =
0,-1, 1, 0, 1, 0,-2, 2, -1, 0, 1, 0, -99
},
false,
WALK | LEARN | MOVE_RANDOM | ATTACK_RANDOM,
RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM,
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM,
{RC_GOBLIN, RC_WRAITH, RC_IMP, RC_RAT, RC_WARG, RC_DAEMON}
@ -197,7 +199,7 @@ struct racedata race[MAXRACES] =
0, 0, 0,-2, -2, 1,-1, 0, -1, 0, 0, 0, -99
},
false,
WALK | LEARN | MOVE_RANDOM | ATTACK_RANDOM,
RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM,
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM,
{RC_RAT, RC_PSEUDODRAGON, RC_IMP, RC_RAT, RC_RAT, RC_IMP}
@ -216,7 +218,7 @@ struct racedata race[MAXRACES] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -99
},
false,
WALK | LEARN | MOVE_RANDOM | ATTACK_RANDOM,
RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM,
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM,
{RC_WARG, RC_DREAMCAT, RC_OWL, RC_OWL, RC_EAGLE, RC_IMP}
@ -235,7 +237,7 @@ struct racedata race[MAXRACES] =
0,-3, 2, 2, -1,-3,-1, 0, 0,-1, 1, 0, -99
},
false,
WALK | LEARN | MOVE_RANDOM | ATTACK_RANDOM,
RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM,
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM,
{RC_TUNNELWORM, RC_RAT, RC_RAT, RC_EAGLE, RC_TUNNELWORM, RC_WARG}
@ -254,7 +256,7 @@ struct racedata race[MAXRACES] =
1, 0, 0, 0, -1, 1,-3, 1, -2, 1, 1, 0, -99
},
false,
WALK | LEARN | MOVE_RANDOM | ATTACK_RANDOM,
RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM,
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM,
{RC_IMP, RC_IMP, RC_WRAITH, RC_RAT, RC_WARG, RC_IMP}
@ -273,7 +275,7 @@ struct racedata race[MAXRACES] =
1, 0, 0,-1, -1,-1,-2, 0, 0, 1, 0, 0, -99
},
false,
WALK | LEARN | MOVE_RANDOM | ATTACK_RANDOM,
RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM,
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM,
{RC_WRAITH, RC_RAT, RC_OWL, RC_RAT, RC_TUNNELWORM, RC_IMP}
@ -292,7 +294,7 @@ struct racedata race[MAXRACES] =
-1,1, 0, 1, 0, 1, 1, 0, 2, 1,-1, 0, -99
},
false,
WALK | LEARN | MOVE_RANDOM | ATTACK_RANDOM,
RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM,
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM,
{RC_OWL, RC_RAT, RC_EAGLE, RC_PSEUDODRAGON, RC_EAGLE, RC_RAT}
@ -311,7 +313,7 @@ struct racedata race[MAXRACES] =
0, 2,-1,-1, 0, 1, 0, 0, 0, 2, 1, 0, -99
},
false,
WALK | LEARN | MOVE_RANDOM | ATTACK_RANDOM,
RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM,
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM,
{RC_HOUSECAT, RC_DREAMCAT, RC_HOUSECAT, RC_PSEUDODRAGON,
@ -331,7 +333,7 @@ struct racedata race[MAXRACES] =
0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, -99
},
false,
WALK | LEARN | MOVE_RANDOM | ATTACK_RANDOM,
RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM,
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM,
{RC_OCEANTURTLE, RC_DOLPHIN, RC_OCEANTURTLE, RC_DOLPHIN,
@ -351,7 +353,7 @@ struct racedata race[MAXRACES] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
true,
(SCARE_PEASANTS|ATTACK_RANDOM|MOVE_RANDOM|WALK|NOLEARN|NOTEACH|NOHEAL),
(RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_MOVERANDOM|RCF_WALK|RCF_NOLEARN|RCF_NOTEACH|RCF_NOHEAL),
(BF_EQUIPMENT | BF_MAGIC_EQUIPMENT),
CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
@ -370,7 +372,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, WALK|NOLEARN|NOTEACH, 0, 0,
true, RCF_WALK|RCF_NOLEARN|RCF_NOTEACH|RCF_NOWEAPONS, 0, 0,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
NULL, &age_illusion
},
@ -389,7 +391,7 @@ struct racedata race[MAXRACES] =
0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0
},
true,
KILL_PEASANTS|SCARE_PEASANTS|ATTACK_RANDOM|LEARN|FLY|WALK|NOTEACH,
RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_LEARN|RCF_FLY|RCF_WALK|RCF_NOTEACH,
BF_MAGIC_EQUIPMENT,
GETITEM | HOARDMONEY | CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
@ -410,7 +412,7 @@ struct racedata race[MAXRACES] =
0, 0, 0, 0, 8, 0, 0, 0, 0, 5, 0, 0, 0
},
true,
( KILL_PEASANTS|SCARE_PEASANTS|ATTACK_RANDOM|LEARN|FLY|WALK|NOTEACH ),
( RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_LEARN|RCF_FLY|RCF_WALK|RCF_NOTEACH ),
( BF_MAGIC_EQUIPMENT ),
GETITEM | HOARDMONEY | CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
@ -431,7 +433,7 @@ struct racedata race[MAXRACES] =
0, 0, 0, 0, 12, 0, 0, 0, 0,10, 0, 0, 0
},
true,
( KILL_PEASANTS|SCARE_PEASANTS|ATTACK_RANDOM|LEARN|FLY|WALK|NOTEACH ),
( RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_LEARN|RCF_FLY|RCF_WALK|RCF_NOTEACH ),
( BF_MAGIC_EQUIPMENT ),
GETITEM | HOARDMONEY | CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
@ -451,7 +453,7 @@ struct racedata race[MAXRACES] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
true,
( SCARE_PEASANTS | MOVE_RANDOM | LEARN | WALK | NOTEACH ),
( RCF_SCAREPEASANTS | RCF_MOVERANDOM | RCF_LEARN | RCF_WALK | RCF_NOTEACH ),
( BF_MAGIC_EQUIPMENT ),
CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
@ -470,7 +472,7 @@ struct racedata race[MAXRACES] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
true,
( FLY | WALK | NOTEACH),
( RCF_FLY | RCF_WALK | RCF_NOTEACH),
0,
GIVEITEM | GIVEPERSON | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
@ -487,7 +489,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,
ATTACK_RANDOM|MOVE_RANDOM|LEARN|WALK|NOTEACH,
RCF_ATTACKRANDOM|RCF_MOVERANDOM|RCF_LEARN|RCF_WALK|RCF_NOTEACH,
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
GIVEITEM | GIVEPERSON | GETITEM | CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
@ -537,7 +539,7 @@ struct racedata race[MAXRACES] =
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0},
true,
WALK | NOLEARN | NOTEACH, 0,
RCF_WALK | RCF_NOLEARN | RCF_NOTEACH, 0,
GIVEITEM | GIVEPERSON,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
},
@ -553,7 +555,7 @@ struct racedata race[MAXRACES] =
{0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0},
true,
WALK | NOLEARN | NOTEACH, 0,
RCF_WALK | RCF_NOLEARN | RCF_NOTEACH, 0,
GIVEITEM | GIVEPERSON,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
},
@ -569,7 +571,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,
KILL_PEASANTS|SCARE_PEASANTS|ATTACK_RANDOM|MOVE_RANDOM|LEARN|WALK|NOTEACH|DESERT,
RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_MOVERANDOM|RCF_LEARN|RCF_WALK|RCF_NOTEACH|RCF_DESERT,
BF_MAGIC_EQUIPMENT,
0,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
@ -587,7 +589,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,
KILL_PEASANTS|SCARE_PEASANTS|ATTACK_RANDOM|MOVE_RANDOM|LEARN|WALK|NOTEACH|DESERT,
RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_MOVERANDOM|RCF_LEARN|RCF_WALK|RCF_NOTEACH|RCF_DESERT,
BF_MAGIC_EQUIPMENT,
0,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
@ -604,7 +606,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, CANNOT_MOVE|NOLEARN|NOTEACH, 0,
true, RCF_CANNOTMOVE|RCF_NOLEARN|RCF_NOTEACH, 0,
0,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
},
@ -620,7 +622,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},
true,
(SEEK_TARGET|FLY|WALK|NOLEARN|NOTEACH),
(RCF_SEEKTARGET|RCF_FLY|RCF_WALK|RCF_NOLEARN|RCF_NOTEACH),
0,
0,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
@ -639,7 +641,7 @@ struct racedata race[MAXRACES] =
-10,-10,-10,-10, -10, +2,-10,-10, -10,-10,-10,-10, 0
},
true,
LEARN|ATTACK_RANDOM|CANNOT_MOVE,
RCF_LEARN|RCF_ATTACKRANDOM|RCF_CANNOTMOVE,
0,
GIVEITEM | GIVEPERSON | GIVEUNIT | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
@ -658,7 +660,7 @@ struct racedata race[MAXRACES] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
true,
( KILL_PEASANTS|SCARE_PEASANTS|ATTACK_RANDOM|MOVE_RANDOM|LEARN|FLY|WALK|NOTEACH),
( RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_MOVERANDOM|RCF_LEARN|RCF_FLY|RCF_WALK|RCF_NOTEACH),
( BF_INV_NONMAGIC),
CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
@ -677,7 +679,7 @@ struct racedata race[MAXRACES] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
true,
CANNOT_MOVE|NOTEACH,
RCF_CANNOTMOVE|RCF_NOTEACH,
( BF_EQUIPMENT | BF_MAGIC_EQUIPMENT ),
CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
@ -696,7 +698,7 @@ struct racedata race[MAXRACES] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
true,
(WALK|NOTEACH), (0), GIVEPERSON,
(RCF_WALK|RCF_NOTEACH), (0), GIVEPERSON,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
},
@ -718,7 +720,7 @@ struct racedata race[MAXRACES] =
-99, 3,-99,-99, -99, 3,-99,-99, -99, 4,-99, 0, 0
},
true,
(WALK|NOTEACH), (0),
(RCF_WALK|RCF_NOTEACH), (0),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_TUNNELWORM */
@ -736,7 +738,7 @@ struct racedata race[MAXRACES] =
-99,-99, 50,-99, -99,-99,-99,-99, -99,-99,-99, 2, 0
},
true,
(WALK|SCARE_PEASANTS|NOTEACH), (0),
(RCF_WALK|RCF_SCAREPEASANTS|RCF_NOTEACH), (0),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_EAGLE */
@ -754,7 +756,7 @@ struct racedata race[MAXRACES] =
-99, 0,-99,-99, -99,-99,-99,-99, -99, 2,-99, 0, 0
},
true,
(WALK|FLY|NOTEACH), (0),
(RCF_WALK|RCF_FLY|RCF_NOTEACH), (0),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_RAT */
@ -772,7 +774,7 @@ struct racedata race[MAXRACES] =
-99, 5,-99,-99, -99, 4,-99,-99, -99, 2,-99, 0, 0
},
true,
(WALK|NOTEACH), (0),
(RCF_WALK|RCF_NOTEACH), (0),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_PSEUDODRAGON */
@ -790,7 +792,7 @@ struct racedata race[MAXRACES] =
-99, 0,-99,-99, -99, 0,-99,-99, -99, 0,-99, 0, 0
},
true,
(WALK|FLY|NOTEACH), (0),
(RCF_WALK|RCF_FLY|RCF_NOTEACH), (0),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_NYMPH */
@ -808,7 +810,7 @@ struct racedata race[MAXRACES] =
0, 2,-99,-99, -2, 3, 10, -2, -2, 2,-2,-1, 0
},
true,
(WALK|NOTEACH),
(RCF_WALK|RCF_NOTEACH),
(BF_EQUIPMENT|BF_MAGIC_EQUIPMENT),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
@ -827,7 +829,7 @@ struct racedata race[MAXRACES] =
-99, 0,-99,-99, 0, 4,-99,-99, -99, 5,-99, 0, 0
},
true,
(WALK|NOTEACH), (0),
(RCF_WALK|RCF_NOTEACH), (0),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_WARG */
@ -845,7 +847,7 @@ struct racedata race[MAXRACES] =
-99, 0,-99,-99, 0, 0,-99,-99, -99, 2,-99, 0, 0
},
true,
(WALK|SCARE_PEASANTS|NOTEACH), (0),
(RCF_WALK|RCF_SCAREPEASANTS|RCF_NOTEACH), (0),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_WRAITH */
@ -863,7 +865,7 @@ struct racedata race[MAXRACES] =
0, 0,-99,-99, -99, 0,-99,-99, -99, 0,-99, 0, 0
},
true,
(WALK|FLY|SCARE_PEASANTS|NOTEACH),
(RCF_WALK|RCF_FLY|RCF_SCAREPEASANTS|RCF_NOTEACH),
(BF_EQUIPMENT|BF_MAGIC_EQUIPMENT|BF_INV_NONMAGIC),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
@ -881,7 +883,7 @@ struct racedata race[MAXRACES] =
-99,-99,-99,-99, -99,-99,-99,-99, -99, 1,-99, -1, -99,-99, 0,-99,
0, 1,-99,-99, -99, 1,-99,-99, -99, 1, 1, 0, 0
},
true, (FLY|WALK|NOTEACH), (BF_EQUIPMENT|BF_MAGIC_EQUIPMENT),
true, (RCF_FLY|RCF_WALK|RCF_NOTEACH), (BF_EQUIPMENT|BF_MAGIC_EQUIPMENT),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_DREAMCAT */
@ -899,7 +901,7 @@ struct racedata race[MAXRACES] =
0, 1,-99,-99, -99, 1,-99,-99, -99, 1, 1, 0, 0
},
true,
(FLY|WALK|NOTEACH), (BF_INV_NONMAGIC),
(RCF_FLY|RCF_WALK|RCF_NOTEACH), (BF_INV_NONMAGIC),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_FEY */
@ -917,7 +919,7 @@ struct racedata race[MAXRACES] =
-1, 2,-99,-99, -99, 5,-99,-99, -99, 2,-99, 0, 0
},
true,
(FLY|WALK|NOTEACH), (BF_EQUIPMENT|BF_MAGIC_EQUIPMENT),
(RCF_FLY|RCF_WALK|RCF_NOTEACH), (BF_EQUIPMENT|BF_MAGIC_EQUIPMENT),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_OWL */
@ -935,7 +937,7 @@ struct racedata race[MAXRACES] =
-99, 1,-99,-99, -99, 1,-99,-99, -99, 5,-99, 0, 0
},
true,
(FLY|WALK|NOTEACH), (0),
(RCF_FLY|RCF_WALK|RCF_NOTEACH), (0),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_HELLCAT */
@ -953,7 +955,7 @@ struct racedata race[MAXRACES] =
-99, 0,-99,-99, 0, 0,-99,-99, -99, 1,-99, 0, 0
},
true,
(WALK|NOTEACH), (SCARE_PEASANTS),
(RCF_WALK|RCF_NOTEACH), (RCF_SCAREPEASANTS),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_TIGER */
@ -971,7 +973,7 @@ struct racedata race[MAXRACES] =
-99, 0,-99,-99, 0, 0,-99,-99, -99, 1,-99, 0, 0
},
true,
(WALK|NOTEACH), (0),
(RCF_WALK|RCF_NOTEACH), (0),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_DOLPHIN */
@ -989,7 +991,7 @@ struct racedata race[MAXRACES] =
-99, 0,-99,-99, 0, 0,-99,-99, -99, 1,-99, 0, 0
},
true,
(SWIM|NOTEACH), (0),
(RCF_SWIM|RCF_NOTEACH), (0),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_OCEANTURTLE */
@ -1007,7 +1009,7 @@ struct racedata race[MAXRACES] =
-99, 0,-99,-99, 0,-99,-99,-99, -99, 1,-99, 0, 0
},
true,
(SWIM|WALK|NOTEACH), (0),
(RCF_SWIM|RCF_WALK|RCF_NOTEACH), (0),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
}, /* RC_KRAKEN */
@ -1025,7 +1027,7 @@ struct racedata race[MAXRACES] =
-99, 0,-99,-99, 0,-99,-99,-99, -99, 1,-99, 0, 0
},
true,
(SWIM|NOTEACH), (0),
(RCF_SWIM|RCF_NOTEACH), (0),
GIVEITEM | GETITEM,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
},
@ -1049,7 +1051,7 @@ struct racedata race[MAXRACES] =
0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0
},
true,
KILL_PEASANTS|SCARE_PEASANTS|ATTACK_RANDOM|LEARN|NOTEACH|SWIM|MOVE_RANDOM,
RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_LEARN|RCF_NOTEACH|RCF_SWIM|RCF_MOVERANDOM,
(0),
GETITEM | HOARDMONEY | CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
@ -1072,7 +1074,7 @@ struct racedata race[MAXRACES] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
true,
(SCARE_PEASANTS|MOVE_RANDOM|WALK|NOLEARN|NOTEACH),
(RCF_SCAREPEASANTS|RCF_MOVERANDOM|RCF_WALK|RCF_NOLEARN|RCF_NOTEACH),
(BF_NOBLOCK),
0,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}
@ -1135,7 +1137,7 @@ struct racedata race[MAXRACES] =
true,
/* Flags */
WALK | LEARN | MOVE_RANDOM | ATTACK_RANDOM | HORSE,
RCF_WALK | RCF_LEARN | RCF_MOVERANDOM | RCF_ATTACKRANDOM | RCF_HORSE,
/* Battle_flags */
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
@ -1207,7 +1209,7 @@ struct racedata race[MAXRACES] =
true,
/* Flags */
(SCARE_PEASANTS|KILL_PEASANTS|ATTACK_RANDOM|MOVE_RANDOM|WALK|NOLEARN|NOTEACH|NOHEAL),
(RCF_SCAREPEASANTS|RCF_KILLPEASANTS|RCF_ATTACKRANDOM|RCF_MOVERANDOM|RCF_WALK|RCF_NOLEARN|RCF_NOTEACH|RCF_NOHEAL),
/* Battle_flags */
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT | BF_RES_PIERCE | BF_RES_CUT,
@ -1285,7 +1287,7 @@ struct racedata race[MAXRACES] =
true,
/* Flags */
(SCARE_PEASANTS|ABSORB_PEASANTS|ATTACK_RANDOM|MOVE_RANDOM|WALK|NOLEARN|NOTEACH|NOHEAL),
(RCF_SCAREPEASANTS|RCF_ABSORBPEASANTS|RCF_ATTACKRANDOM|RCF_MOVERANDOM|RCF_WALK|RCF_NOLEARN|RCF_NOTEACH|RCF_NOHEAL),
/* Battle_flags */
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT | BF_RES_PIERCE | BF_RES_CUT,
@ -1361,7 +1363,7 @@ struct racedata race[MAXRACES] =
true,
/* Flags */
(SCARE_PEASANTS|KILL_PEASANTS|ATTACK_RANDOM|MOVE_RANDOM|WALK|NOLEARN|NOTEACH|NOHEAL),
(RCF_SCAREPEASANTS|RCF_KILLPEASANTS|RCF_ATTACKRANDOM|RCF_MOVERANDOM|RCF_WALK|RCF_NOLEARN|RCF_NOTEACH|RCF_NOHEAL),
/* Battle_flags */
BF_EQUIPMENT|BF_MAGIC_EQUIPMENT|BF_RES_PIERCE|BF_RES_CUT,
@ -1439,7 +1441,7 @@ struct racedata race[MAXRACES] =
true,
/* Flags */
(SCARE_PEASANTS|ABSORB_PEASANTS|ATTACK_RANDOM|MOVE_RANDOM|WALK|NOLEARN|NOTEACH|NOHEAL),
(RCF_SCAREPEASANTS|RCF_ABSORBPEASANTS|RCF_ATTACKRANDOM|RCF_MOVERANDOM|RCF_WALK|RCF_NOLEARN|RCF_NOTEACH|RCF_NOHEAL),
/* Battle_flags */
BF_EQUIPMENT|BF_MAGIC_EQUIPMENT|BF_RES_PIERCE|BF_RES_CUT|BF_RES_BASH,
@ -1518,7 +1520,7 @@ struct racedata race[MAXRACES] =
true,
/* Flags */
(SCARE_PEASANTS|ABSORB_PEASANTS|ATTACK_RANDOM|MOVE_RANDOM|WALK|NOLEARN|NOTEACH|NOHEAL),
(RCF_SCAREPEASANTS|RCF_ABSORBPEASANTS|RCF_ATTACKRANDOM|RCF_MOVERANDOM|RCF_WALK|RCF_NOLEARN|RCF_NOTEACH|RCF_NOHEAL),
/* Battle_flags */
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
@ -1596,7 +1598,7 @@ struct racedata race[MAXRACES] =
true,
/* Flags */
(SCARE_PEASANTS|ABSORB_PEASANTS|ATTACK_RANDOM|MOVE_RANDOM|WALK|NOLEARN|NOTEACH|NOHEAL),
(RCF_SCAREPEASANTS|RCF_ABSORBPEASANTS|RCF_ATTACKRANDOM|RCF_MOVERANDOM|RCF_WALK|RCF_NOLEARN|RCF_NOTEACH|RCF_NOHEAL),
/* Battle_flags */
BF_EQUIPMENT | BF_MAGIC_EQUIPMENT,
@ -1674,7 +1676,7 @@ struct racedata race[MAXRACES] =
true,
/* Flags */
(WALK|NOTEACH),
(RCF_WALK|RCF_NOTEACH),
/* Battle_flags */
(0),
@ -1745,7 +1747,7 @@ struct racedata race[MAXRACES] =
true,
/* Flags */
(WALK|NOTEACH),
(RCF_WALK|RCF_NOTEACH),
/* Battle_flags */
(0),
@ -1867,6 +1869,7 @@ give_latestart_bonus(region *r, unit *u, int b)
unit *u2 = createunit(r, u->faction, 1, u->race);
change_skill(u2, SK_TACTICS, ((b*30)/2) * u2->number);
u2->irace = u->irace;
fset(u2, FL_PARTEITARNUNG);
}
{
@ -1875,6 +1878,7 @@ give_latestart_bonus(region *r, unit *u, int b)
change_skill(u2, SK_TAXING, 180 * u2->number);
change_item(u2, I_SPEAR, u2->number);
u2->irace = u->irace;
fset(u2, FL_PARTEITARNUNG);
}
}
@ -1911,3 +1915,11 @@ boolean is_undead(const unit *u)
|| u->race == RC_ZOMBIE_LORD || u->race == RC_GHOUL
|| u->race == RC_GHOUL_LORD;
}
extern void
init_races(void)
{
#ifdef BETA_CODE
a_add(&race[RC_TROLL].attribs, make_skillmod(NOSKILL, SMF_RIDING, NULL, 0.0, -1));
#endif
}

View file

@ -45,8 +45,7 @@ typedef struct att {
int flags;
} att;
typedef struct racedata racedata;
struct racedata {
typedef struct race_type {
const char *name[4]; /* neu: name[4]völker */
double magres;
double maxaura; /* Faktor auf Maximale Aura */
@ -73,27 +72,30 @@ struct racedata {
const char *(*generate_name) (const struct unit *);
void (*age_function)(struct unit *u);
boolean (*move_allowed)(struct region *, struct region *);
};
struct attrib * attribs;
} racetype;
#define racedata race_type
/* Flags */
#define KILL_PEASANTS (1<<0) /* Töten Bauern. Dämonen werden nicht über
dieses Flag, sondern in randenc() behandelt. */
#define SCARE_PEASANTS (1<<1)
#define ATTACK_RANDOM (1<<2)
#define MOVE_RANDOM (1<<3)
#define CANNOT_MOVE (1<<4)
#define SEEK_TARGET (1<<5) /* sucht ein bestimmtes Opfer */
#define LEARN (1<<6) /* Lernt automatisch wenn struct faction == 0 */
#define FLY (1<<7) /* kann fliegen */
#define SWIM (1<<8) /* kann schwimmen */
#define WALK (1<<9) /* kann über Land gehen */
#define NOLEARN (1<<10) /* kann nicht normal lernen */
#define NOTEACH (1<<11) /* kann nicht lehren */
#define HORSE (1<<12) /* Einheit ist Pferd, sozusagen */
#define DESERT (1<<13) /* 5% Chance, das Einheit desertiert */
#define DRAGON_LIMIT (1<<14) /* Kann nicht aus Gletscher in Ozean */
#define ABSORB_PEASANTS (1<<15) /* Tötet und absorbiert Bauern */
#define NOHEAL (1<<16) /* Einheit kann nicht geheilt werden */
#define RCF_KILLPEASANTS (1<<0) /* Töten Bauern. Dämonen werden nicht über dieses Flag, sondern in randenc() behandelt. */
#define RCF_SCAREPEASANTS (1<<1)
#define RCF_ATTACKRANDOM (1<<2)
#define RCF_MOVERANDOM (1<<3)
#define RCF_CANNOTMOVE (1<<4)
#define RCF_SEEKTARGET (1<<5) /* sucht ein bestimmtes Opfer */
#define RCF_LEARN (1<<6) /* Lernt automatisch wenn struct faction == 0 */
#define RCF_FLY (1<<7) /* kann fliegen */
#define RCF_SWIM (1<<8) /* kann schwimmen */
#define RCF_WALK (1<<9) /* kann über Land gehen */
#define RCF_NOLEARN (1<<10) /* kann nicht normal lernen */
#define RCF_NOTEACH (1<<11) /* kann nicht lehren */
#define RCF_HORSE (1<<12) /* Einheit ist Pferd, sozusagen */
#define RCF_DESERT (1<<13) /* 5% Chance, das Einheit desertiert */
#define RCF_DRAGONLIMIT (1<<14) /* Kann nicht aus Gletscher in Ozean */
#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 */
/* Economic flags */
#define NOGIVE (1<<0) /* gibt niemals nix */
@ -139,4 +141,6 @@ boolean is_undead(const struct unit *u);
extern boolean allowed_dragon(const struct region * src, const struct region * target);
extern void init_races(void);
#endif

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: region.c,v 1.5 2001/02/02 08:40:46 enno Exp $
* $Id: region.c,v 1.6 2001/02/03 13:45:32 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)
@ -42,6 +42,8 @@
#include <stdlib.h>
#include <string.h>
static int g_maxluxuries;
const int delta_x[MAXDIRECTIONS] =
{
-1, 0, 1, 1, 0, -1
@ -654,7 +656,13 @@ new_region(int x, int y)
}
void
freeland(land_region * lr) {
freeland(land_region * lr)
{
while (lr->demands) {
struct demand * d = lr->demands;
lr->demands = d->next;
free(d);
}
if (lr->name) free(lr->name);
free(lr);
}
@ -700,6 +708,21 @@ makename(void)
name[0] = (char) toupper(name[0]);
return name;
}
void
setluxuries(region * r, const luxury_type * sale)
{
const luxury_type * ltype;
assert(r->land);
for (ltype=luxurytypes; ltype; ltype=ltype->next) {
struct demand * dmd = calloc(sizeof(struct demand), 1);
dmd->type = ltype;
if (ltype!=sale) dmd->value = 1 + rand() % 5;
dmd->next = r->land->demands;
r->land->demands = dmd;
}
}
void
terraform(region * r, terrain_t t)
{
@ -725,8 +748,62 @@ terraform(region * r, terrain_t t)
}
if (!r->land) {
static struct surround {
struct surround * next;
const luxury_type * type;
int value;
} *trash =NULL, *nb = NULL;
const luxury_type * ltype;
direction_t d;
int mnr = 0;
r->land = calloc(1, sizeof(land_region));
rsetname(r, makename());
for (d=0;d!=MAXDIRECTIONS;++d) {
region * nr = rconnect(r, d);
if (nr && nr->land) {
struct demand * sale = r->land->demands;
while (sale && sale->value!=0) sale=sale->next;
if (sale) {
struct surround * sr = nb;
while (sr && sr->type!=sale->type) sr=sr->next;
if (!sr) {
if (trash) {
sr = trash;
trash = trash->next;
} else {
sr = calloc(1, sizeof(struct surround));
}
sr->next = nb;
sr->type = sale->type;
sr->value = 1;
nb = sr;
} else sr->value++;
++mnr;
}
}
}
if (!nb) {
int i;
if (g_maxluxuries==0) {
for (ltype = luxurytypes;ltype;ltype=ltype->next) ++g_maxluxuries;
}
i = rand() % g_maxluxuries;
ltype = luxurytypes;
while (i--) ltype=ltype->next;
} else {
int i = rand() % mnr;
struct surround * srd = nb;
while (i>srd->value) {
i-=srd->value;
srd=srd->next;
}
setluxuries(r, srd->type);
while (srd->next!=NULL) srd=srd->next;
srd->next=trash;
trash = nb;
nb = NULL;
}
}
if (landregion(t)) {

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: region.h,v 1.2 2001/01/26 16:19:40 enno Exp $
* $Id: region.h,v 1.3 2001/02/03 13:45:32 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)
@ -132,6 +132,8 @@ void woodcounts(struct region * r, int delta);
void deathcounts(struct region * r, int delta);
void chaoscounts(struct region * r, int delta);
void setluxuries(struct region * r, const struct luxury_type * sale);
int rlaen(const struct region * r);
void rsetlaen(struct region * r, int value);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: save.c,v 1.7 2001/02/02 08:40:46 enno Exp $
* $Id: save.c,v 1.8 2001/02/03 13:45:32 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)
@ -66,7 +66,7 @@
#include <assert.h>
#if defined(OLD_TRIGGER) || defined(CONVERT_TRIGGER)
# include "trigger.h"
# include <eressea/old/trigger.h>
extern void resolve2(void);
#endif
@ -606,12 +606,6 @@ is_persistent(const char *s)
return false;
}
#if _MSC_VER
#define PATH_MAX _MAX_PATH
#elif !defined(PATH_MAX)
#define PATH_MAX 2048
#endif
#if USE_EVENTS
void
print_hunger(void * data)
@ -625,8 +619,8 @@ void
create_backup(char *file)
{
#if defined(HAVE_ACCESS)
char bfile[PATH_MAX];
char command[PATH_MAX*2+10];
char bfile[MAX_PATH];
char command[MAX_PATH*2+10];
int c = 1;
do {
sprintf(bfile, "%s.backup%d", file, c);
@ -640,7 +634,7 @@ create_backup(char *file)
const char *
datapath(void)
{
static char zText[PATH_MAX];
static char zText[MAX_PATH];
if (g_datadir) return g_datadir;
return strcat(strcpy(zText, basepath()), "/data");
}
@ -2105,7 +2099,6 @@ attrib_init(void)
/* Alle speicherbaren Attribute müssen hier registriert werden */
at_register(&at_unitdissolve);
at_register(&at_key);
at_register(&at_traveldir_new);
at_register(&at_familiar);
at_register(&at_familiarmage);
@ -2203,14 +2196,17 @@ void read_strings(FILE * F);
void read_messages(FILE * F);
const char * messages[] = {
"res/messages.de",
"res/messages.en",
"%s/%s/messages.txt",
NULL
};
const char * strings[] = {
"res/strings.de",
"res/strings.en",
"%s/%s/strings.txt",
NULL
};
const char * locales[] = {
"de", "en",
NULL
};
@ -2218,29 +2214,31 @@ void
init_locales(void)
{
FILE * F;
int i;
for (i=0;strings[i];++i) {
char zText[PATH_MAX];
strcat(strcat(strcpy(zText, basepath()), "/"), strings[i]);
F = fopen(zText, "r+");
if (F) {
read_strings(F);
fclose(F);
} else {
sprintf(buf, "fopen(%s): ", zText);
perror(buf);
int l;
for (l=0;locales[l];++l) {
char zText[MAX_PATH];
int i;
for (i=0;strings[i];++i) {
sprintf(zText, strings[i], resourcepath(), locales[l]);
F = fopen(zText, "r+");
if (F) {
read_strings(F);
fclose(F);
} else {
sprintf(buf, "fopen(%s): ", zText);
perror(buf);
}
}
}
for (i=0;messages[i];++i) {
char zText[PATH_MAX];
strcat(strcat(strcpy(zText, basepath()), "/"), messages[i]);
F = fopen(zText, "r+");
if (F) {
read_messages(F);
fclose(F);
} else {
sprintf(buf, "fopen(%s): ", zText);
perror(buf);
for (i=0;messages[i];++i) {
sprintf(zText, messages[i], resourcepath(), locales[l]);
F = fopen(zText, "r+");
if (F) {
read_messages(F);
fclose(F);
} else {
sprintf(buf, "fopen(%s): ", zText);
perror(buf);
}
}
}
}

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: skill.c,v 1.2 2001/01/26 16:19:40 enno Exp $
* $Id: skill.c,v 1.3 2001/02/03 13:45:32 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)
@ -93,17 +93,33 @@ attrib_type at_skillmod = {
skillmods * modhash[MAXRACES];
attrib *
make_skillmod(skill_t skill, unsigned int flags, int(*special)(const struct unit*, const struct region*, skill_t, int), double multiplier, int bonus)
{
attrib * a = a_new(&at_skillmod);
skillmod_data * smd = (skillmod_data*)a->data.v;
smd->skill=skill;
smd->special=special;
smd->bonus=bonus;
smd->multiplier=multiplier;
smd->flags=flags;
return a;
}
int
skillmod(const attrib * a, const unit * u, const region * r, skill_t sk, int value, int flags)
{
for (a = a_find((attrib*)a, &at_skillmod); a; a=a->nexttype) {
skillmod_data * smd = (skillmod_data *)a->data.v;
if (smd->skill!=NOSKILL && smd->skill!=sk) continue;
if (flags!=SMF_ALWAYS && (smd->flags & flags) == 0) continue;
if (smd->special) {
value = smd->special(u, r, sk, value);
if (value<0) return value; /* pass errors back to caller */
}
if (smd->multiplier) value *= smd->multiplier;
if (smd->multiplier) value = (int)(value*smd->multiplier);
value += smd->bonus;
}
return value;

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: skill.h,v 1.2 2001/01/26 16:19:40 enno Exp $
* $Id: skill.h,v 1.3 2001/02/03 13:45:32 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)
@ -30,12 +30,14 @@ char eff_skill(const struct unit * u, skill_t sk, const struct region * r);
int pure_skill(struct unit * u, skill_t sk, struct region * r);
/* skillmod_data::flags -- wann gilt der modifier? */
#define SMF_ALWAYS 0x01 /* immer */
#define SMF_PRODUCTION 0x02 /* für Produktion */
#define SMF_ALWAYS (1<<0) /* immer */
#define SMF_PRODUCTION (1<<1) /* für Produktion - am gebäude, an der einheit */
#define SMF_RIDING (1<<2) /* Bonus für berittene - an der rasse*/
typedef struct skillmod_data {
skill_t skill;
int (*special)(const struct unit * u, const struct region * r, skill_t skill, int value);
int multiplier;
double multiplier;
int bonus;
int flags;
} skillmod_data;
@ -43,6 +45,7 @@ extern attrib_type at_skillmod;
extern int skillmod(const attrib * a, const struct unit * u, const struct region * r, skill_t sk, int value, int flags);
extern void skill_init(void);
extern void skill_done(void);
extern struct attrib * make_skillmod(skill_t skill, unsigned int flags, int(*special)(const struct unit*, const struct region*, skill_t, int), double multiplier, int bonus);
int level_days(int level);
void remove_zero_skills(void);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: spell.c,v 1.6 2001/02/02 08:40:46 enno Exp $
* $Id: spell.c,v 1.7 2001/02/03 13:45:32 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)
@ -670,7 +670,7 @@ sp_summon_familiar(castorder *co)
}
rc = select_familiar(mage->faction->race, mage->faction->magiegebiet);
if(race[rc].flags & SWIM && !(race[rc].flags & WALK)) {
if(race[rc].flags & RCF_SWIM && !(race[rc].flags & RCF_WALK)) {
int coasts;
if((coasts = is_coastregion(r)) == 0) {
@ -2964,15 +2964,7 @@ sp_firewall(castorder *co)
return cast_level;
}
#endif
#if USE_FIREWALL
/* ------------------------------------------------------------- */
/* 1. Das ist Illaun und sollte dann auch dort stehen
* 2. Beschreibung fehlt
*
* LEUTE, SO GEHT DAS NICHT!
*/
static const char *
wisps_name(const border * b, const region * r, const faction * f, int gflags)
@ -6558,9 +6550,8 @@ sp_q_antimagie(castorder *co)
obj = pa->param[0]->typ;
ctype = NULL;
if(pa->length == 2){
ctype = ct_find(pa->param[2]->data.s);
}
if(pa->length == 2)
ctype = ct_find(pa->param[1]->data.s);
switch(obj){
case SPP_REGION:
@ -8568,7 +8559,7 @@ spell spelldaten[] =
(spell_f)sp_denyattack, patzer
},
{SPL_CERDDOR_EARN_SILVER, "Gaukelleien",
{SPL_CERDDOR_EARN_SILVER, "Gaukeleien",
"Cerddormagier sind _die_ Gaukler unter den Magiern, sie lieben es das "
"Volk zu unterhalten und im Mittelpunkt zu stehen. Schon Anfänger lernen "
"die kleinen Kunststücke und magischen Tricks, mit denen man das Volk "
@ -9589,7 +9580,7 @@ spell spelldaten[] =
(SPELLLEVEL | BUILDINGSPELL | ONETARGET | TESTRESISTANCE),
5, 7,
{
{R_AURA, 50, SPC_LEVEL},
{R_AURA, 50, SPC_FIX},
{R_PERMAURA, 1, SPC_FIX},
{0, 0, 0},
{0, 0, 0},

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: unit.c,v 1.3 2001/01/31 17:40:51 corwin Exp $
* $Id: unit.c,v 1.4 2001/02/03 13:45:32 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)
@ -609,15 +609,21 @@ leave(struct region * r, unit * u)
unused(r);
}
const struct race_type *
urace(const struct unit * u)
{
return &race[u->race];
}
boolean
can_survive(const unit *u, const region *r)
{
if (((terrain[rterrain(r)].flags & WALK_INTO)
&& (race[u->race].flags & WALK)) ||
&& (race[u->race].flags & RCF_WALK)) ||
((terrain[rterrain(r)].flags & SWIM_INTO)
&& (race[u->race].flags & SWIM)) ||
&& (race[u->race].flags & RCF_SWIM)) ||
((terrain[rterrain(r)].flags & FLY_INTO)
&& (race[u->race].flags & FLY))) {
&& (race[u->race].flags & RCF_FLY))) {
if (get_item(u, I_HORSE) && !(terrain[rterrain(r)].flags & WALK_INTO))
return false;

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: unit.h,v 1.2 2001/01/26 16:19:40 enno Exp $
* $Id: unit.h,v 1.3 2001/02/03 13:45:33 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)
@ -138,6 +138,8 @@ void usettarget(struct unit * u, const struct unit * b);
struct unit * utarget(const struct unit * u);
void usettarget(struct unit * u, const struct unit * b);
extern const struct race_type * urace(const struct unit * u);
const char* uprivate(const struct unit * u);
void usetprivate(struct unit * u, const char * c);

View file

@ -41,7 +41,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX /Z7 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
@ -64,7 +64,7 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX"stdafx.h" /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: oceannames.c,v 1.1 2001/01/27 11:32:32 enno Exp $
* $Id: oceannames.c,v 1.2 2001/02/03 13:45:33 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)
@ -84,7 +84,7 @@ nameocean(struct region *r, struct faction * f, const char * newname)
if (!a && newname) a = a_add(&r->attribs, a_new(&at_oceanname));
if (a) {
faction_list **oldf = NULL, **newf = NULL;
faction_list * fl;
faction_list * fl = NULL;
name * names = (name*)a->data.v;
while (names && (!newf && newname) || !oldf) {
faction_list ** fli = &names->factions;

View file

@ -41,7 +41,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX /Z7 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
@ -64,7 +64,7 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX"stdafx.h" /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe

View file

@ -41,7 +41,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX /Z7 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
@ -64,7 +64,7 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX"stdafx.h" /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: spells.c,v 1.2 2001/01/26 16:19:41 enno Exp $
* $Id: spells.c,v 1.3 2001/02/03 13:45:33 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)
@ -13,13 +13,23 @@
*/
#include <config.h>
#include <eressea.h>
#include "spells.h"
#include "alp.h"
/*
#include "firewall.h"
*/
struct curse_type;
extern const struct curse_type ct_firewall;
extern void ct_register(const struct curse_type * ct);
void
init_spells(void)
{
/* sp_summon_alp */
init_alp();
/* init_firewall(); */
ct_register(&ct_firewall);
}

View file

@ -41,7 +41,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX /Z7 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
@ -64,7 +64,7 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX"stdafx.h" /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../util" /I "../kernel" /I "../.." /I ".." /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: triggers.c,v 1.2 2001/01/26 16:19:41 enno Exp $
* $Id: triggers.c,v 1.3 2001/02/03 13:45:33 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)
@ -43,7 +43,7 @@
#include <stdio.h>
void
register_triggers(void)
init_triggers(void)
{
fprintf(stdout, "- registering triggers\n");
tt_register(&tt_changefaction);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: triggers.h,v 1.2 2001/01/26 16:19:41 enno Exp $
* $Id: triggers.h,v 1.3 2001/02/03 13:45:33 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)
@ -12,4 +12,4 @@
* prior permission by the authors of Eressea.
*/
void register_triggers(void);
void init_triggers(void);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: event.c,v 1.2 2001/01/26 16:19:41 enno Exp $
* $Id: event.c,v 1.3 2001/02/03 13:45:33 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)
@ -195,7 +195,8 @@ t_add(trigger ** tlist, trigger * t)
static trigger_type * triggertypes;
void
tt_register(trigger_type * tt) {
tt_register(trigger_type * tt)
{
tt->next = triggertypes;
triggertypes = tt;
}

View file

@ -4,7 +4,7 @@
# TARGTYPE "Win32 (x86) Static Library" 0x0104
CFG=util - Win32 Debug
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
@ -13,12 +13,14 @@ CFG=util - Win32 Debug
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "util-6.mak" CFG="util - Win32 Debug"
!MESSAGE NMAKE /f "util-6.mak" CFG="util - Win32 Conversion"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!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
# Begin Project
@ -41,7 +43,7 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX /Z7 /O2 /I "../.." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
@ -64,7 +66,7 @@ LIB32=link.exe -lib
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../.." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX"stdafx.h" /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../.." /I ".." /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
@ -74,12 +76,60 @@ LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"Debug\util.lib"
!ELSEIF "$(CFG)" == "util - Win32 Conversion"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "util___Win32_Conversion"
# PROP BASE Intermediate_Dir "util___Win32_Conversion"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /Za /W4 /Z7 /Od /I "../.." /I ".." /D "_WINDOWS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD CPP /nologo /Za /W4 /Z7 /Od /I "../.." /I ".." /D "_WINDOWS" /D "BETA_CODE" /D "WIN32" /D "_DEBUG" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo /out:"Debug\util.lib"
# ADD LIB32 /nologo /out:"Debug\util.lib"
!ELSEIF "$(CFG)" == "util - Win32 Profile"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "util___Win32_Profile"
# PROP BASE Intermediate_Dir "util___Win32_Profile"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Profile"
# PROP Intermediate_Dir "Profile"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /I "../.." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX- /Z7 /O2 /I "../.." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
# ADD BASE RSC /l 0x407
# ADD RSC /l 0x407
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ENDIF
# Begin Target
# Name "util - Win32 Release"
# Name "util - Win32 Debug"
# Name "util - Win32 Conversion"
# Name "util - Win32 Profile"
# Begin Group "Header"
# PROP Default_Filter "*.h"

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: config.h,v 1.3 2001/01/28 08:50:45 enno Exp $
* $Id: config.h,v 1.4 2001/02/03 13:45:27 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)
@ -73,11 +73,6 @@ typedef int boolean;
** Architecture Dependent **
**** ****/
#if 0
/* E: ?? Für welche Architektur? Bitte ein ifdef */
# include <math.h> /* wegen __P() redefinition */
#endif
/* für solaris: */
#ifdef SOLARIS
# define _SYS_PROCSET_H
@ -109,13 +104,8 @@ typedef int boolean;
# define __EXTENSIONS__
#endif
#if 0
/* E: für welche Architektur? Bitte ein #ifdef */
# include <string.h>
#endif
#ifdef WIN32
# include <util/windir.h>
# include <common/util/windir.h>
# define HAVE_READDIR
#endif
@ -212,10 +202,14 @@ _CRTIMP int __cdecl _mkdir(const char *);
extern char * strdup(const char *s);
#endif
#ifdef WIN32
# define MAX_PATH _MAX_PATH
#elif !defined(MAX_PATH)
# define MAX_PATH 1024
#if !defined(MAX_PATH)
# ifdef WIN32
# define MAX_PATH _MAX_PATH
# elif defined(PATH_MAX)
# define MAX_PATH PATH_MAX
# else
# define MAX_PATH 1024
# endif
#endif
/**** ****

View file

@ -1,8 +1,24 @@
Was ist das hier?
Dieses File ist eine Sammlung von kleinen Artikeln zum Code - Designgedanken, hauptsächlich, keine Anleitungen.
- Die Variable buf
wird an zu vielen Stellen im Source benutzt. Können wir zumindest in Zukunft versuchen, auf sie zu verzichten? Mir ist nie sehr wohl, wen ich die irgendwo sehe.
- Bibliotheken, module
Jedes Verzeichnis in common/ erzeugt eine Bibliothek. Je nach Bedarf muss aber nicht jeder Server die ganze Bibliothek linken (die ist eher was für den mapper), sondern kann die Files auch einzeln linken.
Jedes Verzeichnis in common/ erzeugt eine Bibliothek. Je nach Bedarf muss aber nicht jeder Server die ganze Bibliothek linken (die ist eher was für den mapper), sondern kann die Files auch einzeln linken.
Jedes modul, item, attribut, usw. sollte eine Funktion zur Verfügung stellen, die seine typen initialisiert, also it_register respektive at_register o.ä. aufruft. Jede Biliothek hat ein File, das ihren Namen trägt (z.b. items.txt) mit einer eigenen init_-Funktion, die alle init_funktionen der enthaltenen objekte enthält. (init_items, init_attributes, usw).
Neue Files hinzufügen heißt also bitte, die Registrierung in den "bibliotheks-file" zu machen.
- KI
Beim Anblick des enums mit Rassen-Flags sieht man schnell, das die in mehrere Kategorien fallen. Eine davon ist die KI-Steuerung, und könnte man die vielleicht getrennt von den anderen speichern?
- Worüber man nachdenken sollte, ehe man etwas neues hinzufügt
90% aller Erweiterungen sind eigentlich optional. Ein Eressea ist z.B. auch ohne die Rasse Troll denkbar. Leider ist die rasse Troll an derart viele Stellen hartgecodet, das man Eressea ohne Trolle nie übersetzen könnte (Im Kampfsystem bekommen z.B. Trolle -1 beim Reitenbonus).
Immer drüber nachdenken, ob man hartcoden muß, oder ob es auch einen anderen Weg gibt (in diesem Fall z.B. ein at_skillmod attribut an der Rasse Troll).
- RC_SPELL
Es gibt einen Zauber (Ferne Vision) der Einheiten vom Typ RC_SPELL erzeugt, aber 36 Stellen, an denen auf diesen Typ abgetestet werden muß (vielleicht sogar mehr?). Können wir das mal auf einen curse umstellen? Am besten in Kombination mit einem allgemeinen "diese Einheit/Region soll in den Report der PArtei x", das man dann auch für Spionage usw. benutzen kann, und das im Fall von Antimagie oder Zauberende durch einen Trigger am entsprechenden curse mit zerlegt wird?
- Wie komplex macht man einen Curse?
siehe vorangegangener Absatz. Generell gilt hier: Lieber zwei vielseitige Dinge machen, als ein unflexibles - der curse sollte lediglich der container seiin, der die wirkung aufrechterhält (das attribut an der region überwacht, und per trigger-funktion bei ende des curse oder antimagie entfernt). die eigentliche wirkung kann man in ein separates attribut stecken, dann ist sie auch in anderen kontexten als zauberei verwendbar (gebaüde oder items mit der gleichen wirkung, z.b.). Tests sollten so wenig wie möglich auf einen curse gehen (in fact, eigentlich nur bei der antimagie) sondern immer auf die wirkung (das attribut).

111
src/doc/triggers.txt Normal file
View file

@ -0,0 +1,111 @@
==-------------------==
New Style Eventhandling
==-------------------==
Zweck des ganzen ist es, möglichst frei Reaktionen auf Ereignisse zu
implementieren. Dazu muß natürlich defineirt sein, was so ein Ereignis
ist. Sowohl die Eriegnisse als auch das, was daraufhin geschieht, muß
möglichst flexibel erweiterbar sein. außerdem sollen solche
Ereigniss-Behandlungen zur Laufzeit defineirt werden können. Die möglichen
Events kann man nur zur Compilezeit definieren, und auch die Klassen von
Behandlungsroutinen, aber festzulegen wer wann auf was reagiert sollte
durch einen Spruch, das auftauchen eines Drachen, einen Event oder den Tod
einer Einheit ausgelöst werden können, und beliebiges anderes.
Wie's geht:
Wenn durch den Code ein Event "event" ausgelöst wird, dann wird für das
betroffene Objekt X die Funktion handle_event(X->attribs, "event")
aufgerufen. Ja, der Event ist ein String.
handle_event(a, e) sucht in der Liste der attribute nach einem
at_eventhandler Objekt. So ein at_eventhandler verwaltet eine Liste von
Trigger-Objekten trigger_list mit Daten und handle() Funktion, die im Fall
des Events aufgerufen wird. Für jeden event-typ (string) gibt es ein
solches at_eventhandler Attribut in der Attributliste, das mehrere
Trigger-Funktionen beinhalten kann. Ich glaube, die hat Ingo in seinem
Ansatz "action" getauft.
Wurde ein Passendes gefunden, dann wird der Reihe nach jeder Trigger
ausgeführt.
Das ganze wird im Datenfile sogar ziemlich lesbar, wie man hier an diesem
Magier sieht:
eventhandler destroy killunit LeL end
Hier ist ein eventhandler, der im falle eines "destroy" Events auch die
Einheit LeL killt (LeL ist der Vertraute des Magiers).
Neue Trigger-Typen machen:
Neue Trigger zu definieren ist ziemlich leicht, und ich habe schonmal ein
paar flexible vordefiniert. Sie sollten möglichst im Verzeichnis triggers/
landen. Dran denken, das jeder in Eressea verwendete trigger-typ mit
tt_register() angemeldet werden muß. Das passiert in der Datei
eressea/triggers.c
Dabei lohnt es sich, die trigger etwas genereller zu mchen. Für viele von
ihnen sollte man resolve.[hc] verstanden haben, da man das zum Speichern
von Referenzen auf Parteien, Einheiten, usw. benötigt.
Trigger aktivieren:
Der Trigger sollte jeweils in der Attributliste des Objektes landen,
dessen Existnez für die Ausführung nötig ist. z.B. der Trigger zum Töten
des Familiars beim Magier, der zum übergeben eines item an eine person die
ein gebäude betritt, in das Gebäude.
Beispiel: Wenn die verzauberte Burg b zerstört wird, soll der zaubernde
Magier einen Schock erleiden:
add_trigger(&b->attribs, "destroy", trigger_shock(mage));
Steht die Burg jedoch nach 10 Runden noch an ihrem Fleck, bekommt er einen
Schatz von 100 Silber:
trigger * ttreasure = trigger_giveitem(mage, &i_silver, 100);
trigger * ttimer = trigger_timetrigger(10, ttreasure);
add_trigger(&b-attribs, "timer", ttimer);
Wie man sieht, kann ein trigger einen anderen auslösen, und mit etwas
Geschick kann man ganze Ketten von Ereignissen hinbekommen, die wieder
neue Trigger setzen, usw.
Bisher definierte Events: (NI=Not Implemented)
{building|faction|unit|ship}:"destroy" - Das Objekt verschwindet.
{building|faction|unit|ship|region}:"timer" - einmal pro Runde in
eressea.c::ageing()
{building}"enter" - Gebäude oder Schiff wird betreten (NI)
Bisher definierte trigger:
- timeout: meta-trigger, aktiviert eine liste von triggern nach einer
zeitspanne.
- changerace: ändert race/irace für eine einheit
- giveitem: gibt items eines typs an eine einheit.
- killunit: tötet die angegebene einhiet.
- shock: schockt einen magier.
- changefaction
- removecurse
adaptierte alte trigger:
- famililars:
familiar: on "destroy" shock(mage)
mage: on "destroy" killunit(familiar)
- toad:
mage: on "timer" timeout([changerace(), giveitem(toadslime)])
- summondragon:
region: on "timer" timeout([createunit()])
- magicboost:
mage: on "timer" timeout(createcurse())
- charm:
target: on "timer" changefaction(target)
new faction: on "destroy" destroy(target)
problems to be solved:
- propagation of triggers/attributes in general
- was, wenn ein removecurse(c) ausgefuehrt werden soll, aber der curse
sich propagiert hat? dafür waere wohl ein forwarding-graph ganz geeignet.
(spells:5066, alp)
TODO:
- fprintf/fscanf nochmal checken.

BIN
src/eressea-6.opt Normal file

Binary file not shown.

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: attributes.c,v 1.3 2001/02/02 08:40:48 enno Exp $
* $Id: attributes.c,v 1.4 2001/02/03 13:45:34 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,7 +14,7 @@
#include <config.h>
#include <eressea.h>
#include "attributes.h"
#include <attributes/attributes.h>
/* attributes includes */
#include <attributes/key.h>

File diff suppressed because it is too large Load diff

11
src/eressea/items.c Normal file
View file

@ -0,0 +1,11 @@
#include <items/lmsreward.h>
#include <items/demonseye.h>
#include <items/weapons.h>
void
init_items(void)
{
init_weapons();
init_demonseye();
init_lmsreward();
}

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: korrektur.c,v 1.10 2001/02/02 08:40:48 enno Exp $
* $Id: korrektur.c,v 1.11 2001/02/03 13:45:34 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)
@ -977,6 +977,7 @@ show_newspells(void)
* terminieren */
spellid_t newspellids[] = { SPL_ETERNIZEWALL,
SPL_CERDDOR_EARN_SILVER,
SPL_PUTTOREST,
SPL_UNHOLYPOWER,
SPL_HOLYGROUND,
@ -1203,6 +1204,54 @@ fix_balsamfiasko(void)
}
#endif
int
count_demand(const region *r)
{
struct demand *dmd;
int c = 0;
for (dmd=r->land->demands;dmd;dmd=dmd->next) c++;
return c;
}
void
fix_demand_region(const region *r)
{
direction_t d;
for (d=0;d!=MAXDIRECTIONS;++d) {
region *nr = rconnect(r, d);
if (nr && nr->land && count_demand(nr) != 7) {
const luxury_type *sale=NULL;
const luxury_type *ltype;
struct demand *dmd, *dmd2;
for(dmd = nr->land->demands; dmd; dmd=dmd->next)
if(dmd->value == 0) sale = dmd->type;
dmd2 = NULL;
for (ltype = luxurytypes;ltype;ltype=ltype->next) {
dmd = malloc(sizeof(struct demand));
dmd->type = ltype;
if(ltype == sale) {
dmd->value = 0;
} else {
dmd->value = 1+rand()%5;
}
}
}
}
}
void
fix_demand(void)
{
region *r;
for(r=regions; r; r=r->next) {
if(count_demand(r) != 7) fix_demand_region(r);
}
}
#if 0
static void
read_laenrepair(boolean active)
@ -1363,8 +1412,10 @@ stats(void)
{
FILE * F;
item * items = NULL;
char zText[MAX_PATH];
F = fopen("res/stats", "wt");
strcat(strcpy(zText, resourcepath()), "/stats");
F = fopen(zText, "wt");
if (F) {
region * r;
const item_type * itype;
@ -1387,8 +1438,7 @@ stats(void)
}
fclose(F);
} else {
sprintf(buf, "fopen(%s): ", "res/stats");
perror(buf);
perror(zText);
}
}
@ -1574,12 +1624,12 @@ init_mwarden(void)
}
#ifdef CONVERT_TRIGGER
#include <old/relation.h>
#include <old/trigger.h>
#include "old/relation.h"
#include "old/trigger.h"
#include "old/trigger_internal.h"
#include <event.h>
#include <trigger_internal.h>
#include <triggers/killunit.h>
#include <triggers/timeout.h>
#include <triggers/changerace.h>
@ -1706,7 +1756,7 @@ convert_triggers(void)
static void
lms_special(unit * u)
{
i_change(&u->items, &it_lmsreward, 1);
if (u) i_change(&u->items, &it_lmsreward, 1);
}
#define LIFEEXPECTANCY (27*40)

14
src/eressea/korrektur.h Normal file
View file

@ -0,0 +1,14 @@
/* vi: set ts=2:
* Eressea PB(E)M host Christian Schlittchen (corwin@amber.kn-bremen.de)
* (C) 1998-2000 Katja Zedel (katze@felidae.kn-bremen.de)
* Henning Peters (faroul@beyond.kn-bremen.de)
* Enno Rehling (enno@eressea-pbem.de)
* Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de)
*
* This program may not be used, modified or distributed without
* prior permission by the authors of Eressea.
**/
extern void korrektur(void);
extern void korrektur_end(void);
extern void init_conversion(void);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: main.c,v 1.8 2001/02/02 08:40:48 enno Exp $
* $Id: main.c,v 1.9 2001/02/03 13:45:34 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)
@ -34,11 +34,13 @@
#include <config.h>
#include <eressea.h>
#include "korrektur.h"
/* initialization - TODO: init in separate module */
#include <items/lmsreward.h>
#include <items/demonseye.h>
#include <items/weapons.h>
#include <attributes/attributes.h>
#include <spells/spells.h>
#include <triggers/triggers.h>
#include <items/items.h>
/* modules includes */
#include <modules/arena.h>
@ -81,6 +83,7 @@ int nowrite = 0;
extern char * g_reportdir;
extern char * g_datadir;
extern char * g_basedir;
extern char * g_resourcedir;
extern boolean nonr;
extern boolean nocr;
@ -89,36 +92,22 @@ extern boolean nomsg;
extern boolean nobattle;
extern boolean nobattledebug;
extern void korrektur(void);
extern void korrektur_end(void);
extern void reorder(region * r);
extern void freeland(land_region * lr);
extern void init_conversion(void);
extern void register_triggers(void);
int mapdetail = 0;
extern void render_init(void);
static void init_items(void)
{
init_weapons();
init_demonseye();
init_lmsreward();
}
static void
init_game(void)
{
register_triggers();
init_triggers();
init_locales();
init_races();
init_spells();
init_resources();
init_items();
init_attributes();
init_demonseye();
#ifdef USE_GM_COMMANDS
init_gmcmd();
#endif
@ -134,8 +123,8 @@ void
create_game(void)
{
assert(regions==NULL || !"game is initialized");
printf("Keine Spieldaten gefunden, erzeuge neues Spiel...\n");
makedir("data", 0700);
printf("Keine Spieldaten gefunden, erzeuge neues Spiel in %s...\n", datapath());
makedir(datapath(), 0700);
/* erste Insel generieren */
new_region(0, 0);
/* Monsterpartei anlegen */
@ -202,16 +191,20 @@ int quickleave = 0;
void
writepasswd(void)
{
faction *f;
FILE * F = cfopen("passwd", "w");
if (!F)
return;
puts("Schreibe Passwörter...");
FILE * F;
char zText[128];
for (f = factions; f; f = f->next) {
fprintf(F, "%s:%s:%s\n", factionid(f), f->name, f->passw);
sprintf(zText, "%s/passwd", basepath());
F = cfopen(zText, "w");
if (F) {
faction *f;
puts("Schreibe Passwörter...");
for (f = factions; f; f = f->next) {
fprintf(F, "%s:%s:%s\n", factionid(f), f->email, f->passw);
}
fclose(F);
}
fclose(F);
}
#ifdef FUZZY_BASE36
@ -410,63 +403,16 @@ int
main(int argc, char *argv[])
{
int i, errorlevel = 0;
FILE * F;
setlocale(LC_ALL, "");
#ifdef LOCALE_CHECK
assert(locale_check() || !"ERROR: The current locale is not suitable for international Eressea.\n");
if (!locale_check())
puts("ERROR: The current locale is not suitable for international Eressea.\n");
#endif
#if MALLOCDBG
init_malloc_debug();
#endif
strcat(strcpy(buf, basepath()), "/res/spells");
F = fopen(buf, "wt");
if (F) {
int i, m = -1;
for (i=0;spelldaten[i].id;++i) {
if (spelldaten[i].magietyp!=m) {
m=spelldaten[i].magietyp;
fprintf(F, "\n%s\n", magietypen[m]);
}
fprintf(F, "%d\t%s\n", spelldaten[i].level, spelldaten[i].name);
}
fclose(F);
} else {
char zText[MAX_PATH];
strcat(strcpy(zText, basepath()), "/res/spells");
sprintf(buf, "fopen(%s): ", zText);
perror(buf);
}
strcat(strcpy(buf, basepath()), "/res/bonus");
F = fopen(buf, "wt");
if (F) {
race_t r;
for (r=0;r!=MAXRACES;++r) {
skill_t sk;
int i = 0;
fprintf(F, "const bonus %s_bonus = {\n\t", race[r].name[0]);
for (sk=0;sk!=MAXSKILLS;sk++) {
if (race[r].bonus[sk]) {
if (i==8) {
i = 0;
fputs("\n\t", F);
}
fprintf(F, "{ SK_%s, %d }, ", skillnames[sk], race[r].bonus[sk]);
++i;
}
}
fputs("{ SK_NONE, 0 }\n};\n", F);
}
fclose(F);
} else {
char zText[MAX_PATH];
strcat(strcpy(zText, basepath()), "/res/bonus");
sprintf(buf, "fopen(%s): ", zText);
perror(buf);
}
debug = 0;
quickleave = 0;
@ -504,6 +450,9 @@ main(int argc, char *argv[])
}
g_datadir = argv[++i];
break;
case 'r':
g_resourcedir = argv[++i];
break;
case 'b':
g_basedir = argv[++i];
break;
@ -528,9 +477,57 @@ main(int argc, char *argv[])
}
{
char zText[MAX_PATH];
strcat(strcpy(zText, basepath()), "/res/timestrings");
strcat(strcpy(zText, resourcepath()), "/timestrings");
read_datenames(zText);
}
#ifdef WRITE_STATS
{
FILE * F;
char zText[MAX_PATH];
strcat(strcpy(zText, resourcepath()), "/spells");
F = fopen(zText, "wt");
if (F) {
int i, m = -1;
for (i=0;spelldaten[i].id;++i) {
if (spelldaten[i].magietyp!=m) {
m=spelldaten[i].magietyp;
fprintf(F, "\n%s\n", magietypen[m]);
}
fprintf(F, "%d\t%s\n", spelldaten[i].level, spelldaten[i].name);
}
fclose(F);
} else {
sprintf(buf, "fopen(%s): ", zText);
perror(buf);
}
strcat(strcpy(zText, resourcepath()), "/bonus");
F = fopen(buf, "wt");
if (F) {
race_t r;
for (r=0;r!=MAXRACES;++r) {
skill_t sk;
int i = 0;
fprintf(F, "const bonus %s_bonus = {\n\t", race[r].name[0]);
for (sk=0;sk!=MAXSKILLS;sk++) {
if (race[r].bonus[sk]) {
if (i==8) {
i = 0;
fputs("\n\t", F);
}
fprintf(F, "{ SK_%s, %d }, ", skillnames[sk], race[r].bonus[sk]);
++i;
}
}
fputs("{ SK_NONE, 0 }\n};\n", F);
}
fclose(F);
} else {
sprintf(buf, "fopen(%s): ", zText);
perror(zText);
}
}
#endif
init_game();
initgame();
readgame(false);
@ -558,11 +555,6 @@ main(int argc, char *argv[])
case 'c':
korrektur();
break;
case 'r':
errorlevel = 0;
score();
doreports();
break;
case 'Q':
quickleave = 1;
break;
@ -634,6 +626,7 @@ main(int argc, char *argv[])
break;
case 'f':
i++;
case 'r':
case 'b':
case 't':
case 'x':
@ -703,10 +696,6 @@ main(int argc, char *argv[])
processturn(buf);
break;
case 'r':
doreports();
break;
case 's':
{
char ztext[64];
@ -715,14 +704,6 @@ main(int argc, char *argv[])
}
break;
case 'T':
changeblockterrain();
break;
case 'C':
changeblockchaos();
break;
case 'q':
#if ENNO_CLEANUP
cleanup();

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: trigger.c,v 1.1 2001/01/27 18:15:32 enno Exp $
* $Id: trigger.c,v 1.2 2001/02/03 13:45:34 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)
@ -34,6 +34,7 @@
#include <resolve.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#if defined(OLD_TRIGGER) || defined(CONVERT_TRIGGER)

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: trigger.h,v 1.1 2001/01/27 18:15:32 enno Exp $
* $Id: trigger.h,v 1.2 2001/02/03 13:45:34 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)
@ -19,7 +19,6 @@
#ifndef TRIGGER_H
#define TRIGGER_H
#include <curse.h>
#include "relation.h"
#include "attrspread.h"

25
src/eressea/spells.c Normal file
View file

@ -0,0 +1,25 @@
/* vi: set ts=2:
*
* $Id: spells.c,v 1.1 2001/02/03 13:45:34 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)
* Henning Peters (faroul@beyond.kn-bremen.de)
* Enno Rehling (enno@eressea-pbem.de)
* Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de)
*
* This program may not be used, modified or distributed without
* prior permission by the authors of Eressea.
*/
#include <config.h>
#include <spells/spells.h>
#include <spells/alp.h>
void
init_spells(void)
{
/* sp_summon_alp */
init_alp();
}

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: triggers.c,v 1.2 2001/01/26 16:19:41 enno Exp $
* $Id: triggers.c,v 1.3 2001/02/03 13:45:34 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)
@ -43,7 +43,7 @@
#include <stdio.h>
void
register_triggers(void)
init_triggers(void)
{
fprintf(stdout, "- registering triggers\n");
tt_register(&tt_changefaction);

View file

@ -1,13 +1,12 @@
/* vi: set ts=2:
*
* $Id: header.txt,v 1.2 2001/01/26 16:19:38 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)
* Henning Peters (faroul@beyond.kn-bremen.de)
* Enno Rehling (enno@eressea-pbem.de)
* Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de)
*
* This program may not be used, modified or distributed without
* prior permission by the authors of Eressea.
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
| | Enno Rehling <enno@eressea-pbem.de>
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
| (c) 1998 - 2001 | Henning Peters <faroul@beyond.kn-bremen.de>
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
+-------------------+ Stefan Reich <reich@halbling.de>
This program may not be used, modified or distributed
without prior permission by the authors of Eressea.
$Id: header.txt,v 1.3 2001/02/03 13:45:27 enno Exp $
*/

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: map_modify.c,v 1.2 2001/01/26 16:19:41 enno Exp $
* $Id: map_modify.c,v 1.3 2001/02/03 13:45:34 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)
@ -92,6 +92,7 @@ blockcoord(int x)
}
static char newblock[BLOCKSIZE][BLOCKSIZE];
static int g_maxluxuries;
static void
block_create(int x1, int y1, int size, char chaotisch, int special, char terrain)
@ -178,16 +179,14 @@ block_create(int x1, int y1, int size, char chaotisch, int special, char terrain
* Landstriche werden benannt und bevoelkert, und die produkte
* p1 und p2 des Kontinentes werden gesetzt. */
region *r;
#ifdef NEW_ITEMS
static int maxluxuries = 0;
int i, i1, i2;
const luxury_type *ltype, *p1 = NULL, *p2=NULL;
if (maxluxuries==0) {
for (ltype = luxurytypes;ltype;ltype=ltype->next) ++maxluxuries;
if (g_maxluxuries==0) {
for (ltype = luxurytypes;ltype;ltype=ltype->next) ++g_maxluxuries;
}
i1 = (item_t)(rand() % maxluxuries);
i1 = (item_t)(rand() % g_maxluxuries);
do {
i2 = (item_t)(rand() % maxluxuries);
i2 = (item_t)(rand() % g_maxluxuries);
}
while (i2 == i1);
ltype = luxurytypes;
@ -196,22 +195,9 @@ block_create(int x1, int y1, int size, char chaotisch, int special, char terrain
else if (i==i2) p2=ltype;
ltype=ltype->next;
}
#else
item_t p1, p2;
p1 = (item_t)(rand() % MAXLUXURIES);
do {
p2 = (item_t)(rand() % MAXLUXURIES);
}
while (p2 == p1);
#endif
for (x = 0; x != BLOCKSIZE; x++) {
for (y = 0; y != BLOCKSIZE; y++) {
#ifdef NEW_ITEMS
struct demand * dmd;
const luxury_type * sale = (rand()%2)?p1:p2;
#else
item_t i;
#endif
r = findregion(x1 + x, y1 + y);
if (r) continue;
r = new_region(x1 + x, y1 + y);
@ -226,13 +212,7 @@ block_create(int x1, int y1, int size, char chaotisch, int special, char terrain
} else {
terraform(r, newblock[x][y]);
}
if (r->land) for (ltype=luxurytypes; ltype; ltype=ltype->next) {
dmd = calloc(sizeof(struct demand), 1);
dmd->type = ltype;
if (ltype!=sale) dmd->value = 1 + rand() % 5;
dmd->next = r->land->demands;
r->land->demands = dmd;
}
if (r->land) setluxuries(r, sale);
}
}
}
@ -916,7 +896,7 @@ make_new_region(int x, int y)
wAddstr(buf);
}
wrefresh(win);
r->terrain = (char) map_input(win, 2, 3, "Terraintyp", 0, MAXTERRAINS-1, 0);
terraform(r, (terrain_t) map_input(win, 2, 3, "Terraintyp", 0, MAXTERRAINS-1, 0));
for (; z > 3; z--) {
wmove(win, z, 2);
wclrtoeol(win);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: map_partei.c,v 1.2 2001/01/26 16:19:41 enno Exp $
* $Id: map_partei.c,v 1.3 2001/02/03 13:45:34 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)
@ -350,7 +350,7 @@ NeuePartei(region * r)
{
int i, q, y;
WINDOW *win;
char email[80];
char email[INPUT_BUFSIZE+1];
race_t frace;
int late;
unit *u;

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: map_region.c,v 1.2 2001/01/26 16:19:41 enno Exp $
* $Id: map_region.c,v 1.3 2001/02/03 13:45:34 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)
@ -49,7 +49,7 @@ static dbllist *runten = NULL, *roben = NULL;
static void
ClearRegion()
ClearRegion(void)
{
int line;
refresh();

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: map_tools.c,v 1.2 2001/01/26 16:19:41 enno Exp $
* $Id: map_tools.c,v 1.3 2001/02/03 13:45:34 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)
@ -188,7 +188,7 @@ yes_no(WINDOW * win, const char *text, const char def)
char *
my_input(WINDOW * win, int x, int y, const char *text)
{
static char buf[120];
static char buf[INPUT_BUFSIZE+1];
int val, ch, p, nw = 0;
if (!win) {
win = openwin(SX - 10, 3, 0);
@ -215,16 +215,18 @@ my_input(WINDOW * win, int x, int y, const char *text)
wmove(win, y, val + p);
wrefresh(win);
}
} else if (ch == 10 || ch == 13) {
} else if (ch == '\n') {
curs_set(0);
} else if (isprint(ch) && x < 68) {
} if(val >= INPUT_BUFSIZE) {
beep();
} else if (isprint(ch)) {
waddch(win, ch);
buf[val] = (char) ch;
val++;
} else
beep();
wrefresh(win);
} while (!(ch == 10 || ch == 13));
} while (!(ch == '\n'));
if (nw)
delwin(win);
curs_set(0);

View file

@ -39,9 +39,10 @@ RSC=rc.exe
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /GX /Z7 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /d "NDEBUG"
BSC32=bscmake.exe
@ -49,7 +50,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386
!ELSEIF "$(CFG)" == "mapper - Win32 Debug"
@ -65,12 +66,12 @@ LINK32=link.exe
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /Za /W4 /Gm /ZI /Od /I ".." /I "../common" /I "../common/util" /I "../common/kernel" /I "../common/gamecode" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX"stdafx.h" /FD /c
# ADD CPP /nologo /Za /W4 /Gm /ZI /Od /I ".." /I "../common" /I "../common/util" /I "../common/kernel" /I "../common/gamecode" /D "_CONSOLE" /D "_MBCS" /D "WIN32" /D "_DEBUG" /D "BETA_CODE" /FR /YX"stdafx.h" /FD /c
# ADD BASE RSC /l 0x407 /d "_DEBUG"
# ADD RSC /l 0x407 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo /S (*.h ../*.h ../kernel/eressea.h ../util/*.h ../triggers/*.h) ../kernel/Debug/*.sbr ../triggers/Debug/*.sbr ../util/Debug/*.sbr
# ADD BSC32 /nologo /S (*.h ../*.h ../common/kernel/*.h ../common/attributes/*.h ../common/spells/*.h ../common/triggers/*.h ../common/items/*.h ../common/modules/*.h ../common/util/*.h) ../common/util/Debug/*.sbr ../common/items/Debug/*.sbr ../common/attributes/Debug/*.sbr ../common/kernel/Debug/*.sbr ../common/spells/Debug/*.sbr ../common/modules/Debug/*.sbr
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 curses.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:console /debug /machine:I386 /out:"Debug/mapper.exe" /pdbtype:sept

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: mapper.c,v 1.3 2001/01/28 08:20:05 enno Exp $
* $Id: mapper.c,v 1.4 2001/02/03 13:45:34 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)
@ -1194,7 +1194,7 @@ main(int argc, char *argv[])
}
initgame();
register_triggers();
init_triggers();
init_locales();
init_attributes();

View file

@ -1,6 +1,6 @@
/* vi: set ts=2:
*
* $Id: mapper.h,v 1.2 2001/01/26 16:19:41 enno Exp $
* $Id: mapper.h,v 1.3 2001/02/03 13:45:34 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)
@ -15,6 +15,10 @@
#ifndef MAPPER_H
#define MAPPER_H
#define INPUT_BUFSIZE 80
#include <terrain.h>
#ifndef ISLANDSIZE
# define ISLANDSIZE ((rand()%3)?(25+rand()%10):(11+rand()%14))
#endif

1
src/res/de/items/Adler Normal file
View file

@ -0,0 +1 @@
Der Adler ist ein ausgezeichneter Späher, fliegend überquert er sogar kurze Meerengen, doch ist er hoch oben am Himmel auch sehr exponiert, was ihn beim Rasten zu einem leichten Ziel macht (Schaden: 2d3, Angriff 6, Verteidigung 2, 15 Trefferpunkte).

View file

@ -0,0 +1 @@
Diese Amulett ist ein hervorragender Fokus für alle Heilzauber. Ein mit diesem Fokus gewirkter Heilzauber wird mit größerer Warscheinlichkeit Erfolgreich sein und doppelt so viele Leute heilen können.

View file

@ -0,0 +1 @@
"Und willzt thou starck sein im Kampfe, so warthe bis ez Nachth izt im vollen Monde. Dann invokiere Belzahor und Nigramoth, und rufe die Daimonica herab auf ein ehern Amulette. Nun maghst thou ez tragen in der Schlachte, so du maghisch begabet bizt, und sieh wie deine Feinde krepieren vor dem waz sich Amulette des Thodes nennet" - Aus dem "Arkanum", geschrieben im Jahre 1

View file

@ -0,0 +1 @@
Das Amulett erlaubt es dem Träger, alle Einheiten, die durch einen Ring der Unsichtbarkeit geschützt sind, zu sehen. Einheiten allerdings, die sich mit ihrem Tarnungs-Talent verstecken, bleiben weiterhin unentdeckt. Die Herstellung des Amulettes kostet 3000 Silber.

View file

@ -0,0 +1 @@
Für den ungeübten Betrachter mag der Antimagiekristall wie ein gewöhnlicher Quarzkristall ausschauen, doch ein Magier spürt, das ihm ganz besondere Kräfte innewohnen. Durch spezielle Rituale antimagisch aufgeladen wird der Kristall, wenn er zu feinem Staub zermahlen und verteilt wird, die beim Zaubern freigesetzten magischen Energien aufsaugen und alle Zauber, welche in der betreffenden Woche in der Region gezaubert werden fehlschlagen lassen.

1
src/res/de/items/Apfel Normal file
View file

@ -0,0 +1 @@
Frucht aus der Gattung Malus (ca. 25 Arten), gehört zur Familie der Rosengewächse. Die am häufigsten kultivierte Baumfrucht. Der Apfel gehört zu den fleischigen Früchten, in dem der gereifte Fruchtknoten und das umgebende Gewebe fleischig und eßbar werden. Die Apfelblüte der meisten Varianten erfordert Kreuzbestäubung zur Befruchtung. Form und Größe des Apfels bei der Ernte variieren abhängig von kulturellen und umweltbedingten Einflüssen in Größe, Form, Farbe und Geschmack, sind jedoch nichtsdestotrotz üblicherweise rund, zwischen 50 und 100mm im Durchmesser und weisen röt- oder gelbliche Farbtöne auf.

View file

@ -0,0 +1 @@
So wisse denn, dass das Auge des Drachen den Weg zur Herausforderung aufzeigt. Doch die Überlieferung sagt, das nur der Unschuldige und Ungewappnete es benutzen kann. Sie sagt auch, daß er einen Beutel mit einem Betrag von bis zu zweitausend Silber mit sich führen soll, jedoch nicht mehr als einem Fünftel der Stärke seines Volkes entsprechend - dem Torwächter zum Geschenke als Beweis seiner asketischen Gesinnung. Die 5 scheidet ganz aus.

View file

@ -0,0 +1 @@
Glückwunsch, mein Kind. Du bist im Besitz des mächtigsten Artefaktes Eresseas. Ein Fluch, sagt man, liege auf ihm, denn niemand hat es bisher lange sein Eigen genannt...

1
src/res/de/items/Einhorn Normal file
View file

@ -0,0 +1 @@
Dieses mystische Wesen lebt bevorzugt in den tiefsten Wäldern und vermag sich hervorragend vor den Augen anderer zu verbergen. Nur selten schließt sich ein Einhorn einem Magier an, jedoch wenn das geschieht ist es ein mächtiger Verbündeter, der auch über eigene Magie verfügt. (2 Angriffe, Schaden: 3d12, 2d4, Angriff 6, Verteidigung 4, 40 Trefferpunkte).

View file

@ -0,0 +1 @@
Ein Elfenpferd wird sich nur den wenigsten jemals anschließen. Hat es jedoch seine Scheu überwunden ist es ein sehr wertvoller Gefährte. Ein Elfenpferd ist schneller als ein Pferd. Zudem hilft es seinem Reiter im Kampf und unterstützt ihn mit seiner Magie. Es sind schwarze Elfenpferde bekannt, die sich sogar Orks angeschlossen haben.

View file

@ -0,0 +1 @@
Diese aus Leder gefertigten und mit Einhornfell verzierten Stiefel ermöglichen es ihrem Träger, sich mit der doppelten Geschwindigkeit fortzubewegen, wenn er zu Fuß reist.

View file

@ -0,0 +1 @@
Ein Flammenschwert gibt dem Träger, der kein Magier sein muß, zusätzlich zu seinem normalen Angriff (3d6+10) einen kleinen Feuerballangriff, der bei 1-10 Opfern 2d6 magischen Schaden verursacht. Um ein Flammenschwert führen zu können, muss man mindestens Hiebwaffen 7 haben, dann verleiht es einem auch einen zusätzlichen Kampfbonus von +1. Ein Flammenschwert erhöht die Magieresistenz seines Trägers wie ein Laenschwert.

1
src/res/de/items/Keks Normal file
View file

@ -0,0 +1 @@
Kleines trockenes Dauergebäck, m od. s; - u. -es, - u. -e

1
src/res/de/items/Kröte Normal file
View file

@ -0,0 +1 @@
Die Kröte ist eine der seltensten Rassen Eresseas. Man munkelt, sie würde nur auf magische Weise entstehen. In einer uralten Abhandlung über Magie aus der Bibliothek der Akademie von Xontormia wird die Theorie aufgestellt, das die Kröte die ins morphische Feld des Magiers übertragene Manifestation eines implodierten Zauberfeldes sein könnte. Vieleicht deswegen ist die Kröte auch gegen Zauber weitaus widerstandsfähiger als die normalen Rassen Eresseas, leider aber auch weitaus unmagischer als diese. Die Kröte kann schon aufgrund ihrer Größe und der fehlenden Hände nur unter Schwierigkeiten normale Tätigkeiten ausüben. Der einzige Vorteil ihrer geringen Größe ist, dass sie sich leichter Verstecken kann.

1
src/res/de/items/Luchs Normal file
View file

@ -0,0 +1 @@
Der Luchs ist bekannt für seine Geschicklichkeit im Verbergen und Beobachten. Mit ein wenig Geduld kann er zu einem hervorragenden Späher ausgebildet werden. Im Kampf verteidigt er sich mit seinen scharfen Krallen und weiß seine Gewandheit zu nutzen (Schaden: 2d3, Angriff 4, Verteidigung 5, 20 Trefferpunkte).

View file

@ -0,0 +1 @@
(Prunus dulcis) [...] Die Nüsse existieren in zwei Varianten, süß und bitter. Süße Mandeln sind der bekannte eßbare Typ, der in Form von Nüssen gegessen, beim Kochen verwandt oder zu Mandelöl und Mandelmehl verarbeitet wird.

View file

@ -0,0 +1 @@
Es heißt, daß, in diesen Mantel gewandet, ein Krieger eine ganze Armee von Feinden niederkämpfen könne. Nun, dies mag ein wenig übertrieben sein, wahr ist auf jeden Fall, daß der Mantel den besten Schutz bietet, der auf Eressea zu finden ist. Vor allem schützt er, anders als nichtmagische Rüstungen, sowohl vor physischen als auch vor magischen Gewalten. Werden die anstürmenden Kräfte aber zu groß, muß auch der Mantel versagen.

1
src/res/de/items/Nuß Normal file
View file

@ -0,0 +1 @@
Nuß, im umgangssprachlichen Sinne alle trockenen, hartschaligen Früchte oder Samen, die eine Schale besitzen, die sich leicht vom inneren, eßbaren Kern entfernen läßt. In der botanischen Terminologie beschränkt sich die Bezeichnung Nuß auf eine einsamige Frucht, die aus einem Fruchtknoten (Ovarium) entstanden ist, dessen äußere Wände sich verholzt haben und der sich nicht öffnet, um seinen Samen zu entlassen. Solche echten Nüsse können eßbar, aber auch ungenießbar sein. Bekannte Beispiele sind Eicheln, Bucheckern, Kastanien und Haselnüsse. Beispiele für Früchte oder Samen, die vom Volksmund fälschlich als Nüsse bezeichnet werden, sind Mandeln und Walnüsse: Im botanischen Sinne sind dies Steinfrüchte, denen die fleischige äußere Schale entfernt wurde. Andere Beispiele für unechte Nüsse sind Erdnüsse - in Hülsen eingeschlossene Samen - sowie Roßkastanien und Paranüsse, bei denen es sich um von Kapseln umhüllte Samen handelt.

View file

@ -0,0 +1 @@
Ein Ring der Macht verstärkt die Kraft des Magiers. Jeder Zauber wird, ohne das sich die Kosten erhöhen, so gezaubert als hätte der Magier eine Stufe mehr.

View file

@ -0,0 +1 @@
Dieses magische Artefakt wurde seit Urzeiten von den Elfen benutzt, auf der Jagd oder um sich vor Feinden zu verbergen. Doch auch andere Rassen haben nach der Begegnung mit den Elfenvölkern den Wert des Rings schnell schätzen gelernt - schließlich macht er den Träger für jedes noch so scharfe Auge unsichtbar - nur mit magischen Mitteln ist der Verborgene noch zu entdecken.

View file

@ -0,0 +1 @@
Die rötlich glühende Klinge dieser furchterregenden magischen Waffe ist mit dunklen Runen bedeckt. Nur die erfahrendsten Schwertkämpfer vermögen ihre Kraft zu zähmen, doch in ihrer Hand vermag dem Runenschwert nichts zu widerstehen - selbst magische Rüstungen durchdringt es ohne Schwierigkeiten - und den Geist des Kämpfers füllt es mit unterschütterlicher Zuversicht.

View file

@ -0,0 +1 @@
Geformt aus dem seltenen Feuerrubin vermag dieses Artefakt wahre Wunder zu vollbringen. In der Hand eines magisch Begabten vermag es ein Schild um eine ganze Armee zu legen, um sie zu schützen vor magischen Attacken. Ja, fürwahr eines der mächtigsten Artefakte Eresseas, und jeder deiner Magier sollte eines mit sich führen, so du die Möglichkeit dazu hast.

View file

@ -0,0 +1 @@
Dieses Fluggerät aus der Schmiede der Zwerge von Celeband galt wie die 'Ebene der Herausforderung' seit Urzeiten als verschollen, ja man zweifelte seine Existenz an. Die Sage überliefert, das derjenige, der sie auf der Spitze des Turmes seiner Gesinnung benutzt, als einziger die 'Ebene der Herausforderungen' verlassen kann.

View file

@ -0,0 +1 @@
Dieses magische Szepter, ein Geschenk Igjarjuks, sorgt für große Verwirrung und Gedächtnisverlust. Syntax: BENUTZE "Szepter der Tränen"

View file

@ -0,0 +1 @@
Dieses verzauberte Drachenauge muß vor dem Abend einer Schlacht vom Heerführer verzehrt werden. Während der Nacht wird er dann Einblick in die Träume der feindlichen Heerführer erhalten und so möglicherweise einen entscheidenden Vorteil im kommenden Gefecht erlangen.

View file

@ -0,0 +1 @@
Diese aus den Tiefen Eresseas stammende gigantische Geschöpf ist dem Leben im Untergrund hervorragend angepasst. Blind, taub und nicht besonders intelligent, aber mit seinen gewaltigen Kräften kann es ganze Berge versetzen oder Wälder roden. (Schaden: 3d20, Angriff 6, Verteidigung 1, Rüstung 6, 300 Trefferpunkte)

1
src/res/de/items/Warg Normal file
View file

@ -0,0 +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).

View file

@ -0,0 +1,7 @@
Dieser Beutel umschließt eine kleine Dimensionsfalte, in der bis
zu 200 Gewichtseinheiten transportiert werden können, ohne dass
sie auf das Traggewicht angerechnet werden. Pferde und andere
Lebewesen sowie besonders sperrige Dinge (Wagen und Katapulte) können
nicht in dem Beutel transportiert werden. Auch ist es nicht möglich,
einen Zauberbeutel in einem anderen zu transportieren. Der Beutel
selber wiegt 1 GE.

Some files were not shown because too many files have changed in this diff Show more