From e211a578eb99b1ed036f21549d8d348b90778f0d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 14 Feb 2001 09:17:56 +0000 Subject: [PATCH] =?UTF-8?q?Speedups:=20-=20side::alive=20und=20battle::ali?= =?UTF-8?q?ve=20wird=20kontinuierlich=20mitgef=C3=BChrt=20-=20Aufpassen!?= =?UTF-8?q?=20-=20erste=20Ideen=20f=C3=BCr=20FAST=5FGETUNITROW=20--=20klap?= =?UTF-8?q?pt=20aber=20noch=20nicht=20mit=20nonblockers,=20d.h.=20es=20dis?= =?UTF-8?q?abled=20sich=20ist=20in=20K=C3=A4mpfen=20mit=20denen=20selbstt?= =?UTF-8?q?=C3=A4tig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/kernel/alchemy.h | 1 - src/common/kernel/battle.c | 44 ++++++++++++++++++++------------- src/common/kernel/battle.h | 25 +++++++++++++++---- src/common/kernel/build.h | 1 - src/common/kernel/building.h | 1 - src/common/kernel/curse.h | 1 - src/common/kernel/eressea.h | 1 - src/common/kernel/faction.h | 1 - src/common/kernel/group.h | 1 - src/common/kernel/item.h | 1 - src/common/kernel/kernel-6.dsp | 8 ------ src/eressea-6.opt | Bin 144384 -> 151552 bytes src/eressea/eressea-6.dsp | 2 +- 13 files changed, 48 insertions(+), 39 deletions(-) diff --git a/src/common/kernel/alchemy.h b/src/common/kernel/alchemy.h index 84543ff62..870c9d424 100644 --- a/src/common/kernel/alchemy.h +++ b/src/common/kernel/alchemy.h @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: alchemy.h,v 1.2 2001/01/26 16:19:39 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) diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index f9cbc8491..3b0c3017f 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: battle.c,v 1.13 2001/02/14 08:35:12 katze Exp $ + * $Id: battle.c,v 1.14 2001/02/14 09:17:56 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,11 +22,8 @@ typedef enum combatmagic { - DO_PRECOMBATSPELL, - DO_POSTCOMBATSPELL - } combatmagic_t; @@ -461,6 +458,11 @@ get_unitrow(const fighter * af) int front = 0; size_t bsize; +#ifdef FAST_GETUNITROW + if (!b->nonblockers && b->alive==af->row.alive) { + return af->row.cached; + } +#endif bsize = cv_size(&b->sides); if (csizerow.alive = b->alive; + af->row.cached = result; +#endif return result; } @@ -797,6 +803,8 @@ rmtroop(troop dt) side *ds = df->side; --df->alive; + --df->side->alive; + --df->side->battle->alive; assert(dt.index >= 0 && dt.index < df->unit->number); assert(df->alive < df->unit->number); df->person[dt.index] = df->person[df->alive - df->removed]; @@ -2162,16 +2170,23 @@ aftermath(battle * b) #ifdef TROLLSAVE /* Trolle können regenerieren */ if (df->alive > 0 && dead && du->race == RC_TROLL) - for (i = 0; i != dead; ++i) - if (chance(TROLL_REGENERATION)) + for (i = 0; i != dead; ++i) { + if (chance(TROLL_REGENERATION)) { ++df->alive; + ++df->side->alive; + ++df->side->battle->alive; + } + } trollsave[df->side->index] += dead - du->number + df->alive; #endif /* Regeneration durch PR_MERCY */ if (dead && pr_mercy) for (i = 0; i != dead; ++i) - if (rand()%100 < pr_mercy) + if (rand()%100 < pr_mercy) { ++df->alive; + ++df->side->alive; + ++df->side->battle->alive; + } /* Tote, die wiederbelebt werde können */ if (!nonplayer(df->unit)) { @@ -2212,7 +2227,6 @@ aftermath(battle * b) if (s->bf->lastturn+(b->has_tactics_turn?1:0)>1) { relevant = true; } - s->alive = 0; s->flee = 0; s->dead = 0; @@ -2235,7 +2249,6 @@ aftermath(battle * b) s->dead += dead; s->flee += df->run_number; - s->alive += df->alive; if (df->alive == du->number) continue; /* nichts passiert */ @@ -2707,6 +2720,8 @@ make_fighter(battle * b, unit * u, boolean attack) fig->status = u->status; fig->side = s1; fig->alive = u->number; + fig->side->alive += u->number; + fig->side->battle->alive += u->number; fig->catmsg = -1; /* Freigeben nicht vergessen! */ @@ -2838,6 +2853,9 @@ make_fighter(battle * b, unit * u, boolean attack) s1->size[SUM_ROW] += u->number; if (race[u->race].battle_flags & BF_NOBLOCK) { s1->nonblockers[fig->status + FIGHT_ROW] += u->number; +#ifdef FAST_GETUNITROW + b->nonblockers = true; +#endif } if (race[fig->unit->race].flags & RCF_HORSE) { @@ -3094,14 +3112,6 @@ battle_report(battle * b) bfaction *bf; buf[0] = 0; - for_each(s, b->sides) { - fighter *f; - - s->alive = 0; - for_each(f, s->fighters) { - s->alive += f->alive; - } next(f); - } next(s); for_each(s, b->sides) { for_each(s2, b->sides) { diff --git a/src/common/kernel/battle.h b/src/common/kernel/battle.h index cea2436f5..e2722a707 100644 --- a/src/common/kernel/battle.h +++ b/src/common/kernel/battle.h @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: battle.h,v 1.3 2001/02/14 01:38:50 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,11 +14,18 @@ #ifndef BATTLE_H #define BATTLE_H +/** new code defines **/ +#define FAST_GETUNITROW +#define FASTENEMY + +/** more defines **/ #define FS_ENEMY 1 #define FS_HELP 2 -#define NUMROWS 5 /* Eressea hat 4 Verteidigungslinien. 1 ist - * * * vorn */ +/***** Verteidigungslinien. + * Eressea hat 4 Verteidigungslinien. 1 ist vorn, 5. enthält Summen + */ +#define NUMROWS 5 #define SUM_ROW 0 #define FIGHT_ROW 1 #define BEHIND_ROW 2 @@ -50,8 +56,12 @@ typedef struct battle { boolean has_tactics_turn; int keeploot; boolean reelarrow; - int dh; + int dh; + int alive; boolean small; +#ifdef FAST_GETUNITROW + boolean nonblockers; +#endif } battle; typedef struct tactics { @@ -66,7 +76,6 @@ typedef struct side { struct faction *faction; /* Die Partei, die hier kämpft */ struct bfaction * bf; /* Die Partei, die hier kämpft */ const struct group * group; -#define FASTENEMY #ifdef FASTENEMY # define E_ENEMY 1 # define E_ATTACKING 2 @@ -168,6 +177,12 @@ typedef struct fighter { int run_hp; /* accumulated hp of fleeing people */ struct region *run_to; /* destination of fleeing people */ int action_counter; /* number of active actions the struct unit did in the fight */ +#ifdef FAST_GETUNITROW + struct { + int alive; + int cached; + } row; +#endif } fighter; typedef struct troop { diff --git a/src/common/kernel/build.h b/src/common/kernel/build.h index 971c508dd..f07d322d9 100644 --- a/src/common/kernel/build.h +++ b/src/common/kernel/build.h @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: build.h,v 1.2 2001/01/26 16:19:39 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) diff --git a/src/common/kernel/building.h b/src/common/kernel/building.h index ddce1dd2c..264fc0344 100644 --- a/src/common/kernel/building.h +++ b/src/common/kernel/building.h @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: building.h,v 1.2 2001/01/26 16:19:39 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) diff --git a/src/common/kernel/curse.h b/src/common/kernel/curse.h index 8bb159799..5b3026d07 100644 --- a/src/common/kernel/curse.h +++ b/src/common/kernel/curse.h @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $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) diff --git a/src/common/kernel/eressea.h b/src/common/kernel/eressea.h index b3edbb344..5674ac62c 100644 --- a/src/common/kernel/eressea.h +++ b/src/common/kernel/eressea.h @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: eressea.h,v 1.17 2001/02/12 22:39:56 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) diff --git a/src/common/kernel/faction.h b/src/common/kernel/faction.h index 0ae1fa55b..ca72a773b 100644 --- a/src/common/kernel/faction.h +++ b/src/common/kernel/faction.h @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: faction.h,v 1.2 2001/01/26 16:19:39 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) diff --git a/src/common/kernel/group.h b/src/common/kernel/group.h index d28fdd1fe..71666e53d 100644 --- a/src/common/kernel/group.h +++ b/src/common/kernel/group.h @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: group.h,v 1.2 2001/01/26 16:19:39 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) diff --git a/src/common/kernel/item.h b/src/common/kernel/item.h index 3cfe25405..25bc1730c 100644 --- a/src/common/kernel/item.h +++ b/src/common/kernel/item.h @@ -1,6 +1,5 @@ /* vi: set ts=2: * - * $Id: item.h,v 1.5 2001/02/14 07:44:57 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) diff --git a/src/common/kernel/kernel-6.dsp b/src/common/kernel/kernel-6.dsp index 4998fa2be..435a49cab 100644 --- a/src/common/kernel/kernel-6.dsp +++ b/src/common/kernel/kernel-6.dsp @@ -155,18 +155,10 @@ SOURCE=.\building.h # End Source File # Begin Source File -SOURCE=.\creation.h -# End Source File -# Begin Source File - SOURCE=.\curse.h # End Source File # Begin Source File -SOURCE=.\economy.h -# End Source File -# Begin Source File - SOURCE=.\eressea.h # End Source File # Begin Source File diff --git a/src/eressea-6.opt b/src/eressea-6.opt index 87d1647fe1e85b3ffe4d76624ef691f47623d1eb..23793762c2fb951c8bba48269c8936e8ca3a075c 100644 GIT binary patch literal 151552 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 delta 7587 zcmds6eNa@_6@TZlyxoOGcFiukEGu1H7R7{Bf=;9r>vuKHM4*l#mL@@26<9uGAzG61 zrHS}81`cwPG#^ZBXIfaJLI(Ol2BtH%NoU$B(oWMPW>V9{&JagZP~%Lb=RIJmold6e zd;fH2etYk}`|j`DbM86kp7*w~)7*H;^g^!b2a+U>Gfo%14y{$@9+3+0Ec&B%*l$iw zP6l~oJ7Wi9Cj&d9QVq%gz8&SU*YTBS7|Mk%ZogCpu1D2GOM6~vhTdI<-vjQJSL1Ry z8#9gBI3};aU&;?58SlqZV+Q`(xF7eLvT?oX>o{N<=#Nf@7K3`I*?6ct-R> z!gy4h+W-<~yKmq*V-mWIiFZX3h{5IViF={wS=B7?r8UV<#?;o7guL5JLcwtKvb7uY zmz#G~Ru-28!+~x8{dZijIv5TIi*B7Wb*E_^vurL2?wb($|i(l(@ zU?8#-L)|eHSp}}%w#Y_-N8d=t7e{<}_FaGP<^G??+~(f>kPPGTJ;P5=-IsPUg$`RG zh0eOcODDL8Ij2(T4^}9pD{h!i%M!ugd-Ouo?Lnfl#CB{3bFcY&`JGW+j8gn0bNUuF!Hir>G4t<9 zh6MdL3okIu}~7`7r2OqAOSaAci_tNiP5u__0XF`;HL;*r_mw!4vu}0het1@ zV(3HP{}2_odUeMz{LLS}UHbopVtt>03AngWPRod=-|{JJFyPQga{n0@yeGagYusWV zQ^!qs3T`SDRJ$-3mq=2yWLQkQvV@~y)FMe<=5J*vpA}~>#!vMm=@IU44VD)w#X$l0 z!Da_m#QDmoLV*O!qf&zn%MwKTGG4wG8VmtwiIQ z!bQPvi0?v{x}aRG7euz%!hP(ZI0O&sD1feH2?M!h~y{zCB#Waz2W34=HQ59leO zFIpU?A6xaZ+N>rnD%+I8l0R*NY_m8{>wUsV_AF5d3v^V?_L@PGPBH>4T5TzBnfN~S z&eluWsp$QUESk86RnnqP@%vk&I0EzZl%S@eznDZbr0FTY8kxS3WtQyuh=fY=IibQDZJ8KU9J@G0W2quxjTXf&H918Zl{+}!I901? z!js=iv_3bENWoorpS$R@mG$mDl82CY^2VLDf5 zQChPeUm*5_(3llgP~?6NJ