From 0e2478bdb90493c164f8b4a412f56d21953dab2d Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sat, 24 Feb 2007 20:09:52 +0000 Subject: [PATCH] FASTROW macro to slightly speed up get_unitrow() --- src/common/kernel/battle.c | 43 ++++++++++++++++++++++++++------------ src/common/kernel/battle.h | 10 +++++++++ 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/common/kernel/battle.c b/src/common/kernel/battle.c index f0e92b37c..a3c815dc2 100644 --- a/src/common/kernel/battle.c +++ b/src/common/kernel/battle.c @@ -476,8 +476,23 @@ get_unitrow(const fighter * af, const side * vs) int i; for (i=FIGHT_ROW;i!=row;++i) if (af->side->size[i]) break; return FIGHT_ROW+(row-i); + } else { +#ifdef FASTROW + battle * b = vs->battle; + if (row==b->rowcache.row && b->alive==b->rowcache.alive && af->side==b->rowcache.as && vs==b->rowcache.vs) { + return b->rowcache.result; + } else { + b->rowcache.alive = b->alive; + b->rowcache.as = af->side; + b->rowcache.vs = vs; + b->rowcache.row = row; + b->rowcache.result = get_row(af->side, row, vs); + return b->rowcache.result; + } +#else + return b->rowcache.result; +#endif } - return get_row(af->side, row, vs); } static void @@ -1251,19 +1266,21 @@ count_enemies(battle * b, const fighter * af, int minrow, int maxrow, int select #ifdef FASTCOUNT int sr = statusrow(af->status); - if (select!=SELECT_FIND) { - if (b->alive==b->fast.alive && as==b->fast.side && sr==b->fast.status && minrow==b->fast.minrow && maxrow==b->fast.maxrow) { - if (b->fast.enemies[select]>=0) { - return b->fast.enemies[select]; - } - } else { - b->fast.side = as; - b->fast.status = sr; - b->fast.minrow = minrow; - b->fast.alive=b->alive; - b->fast.maxrow = maxrow; - memset(b->fast.enemies, -1, sizeof(b->fast.enemies)); + if (b->alive==b->fast.alive && as==b->fast.side && sr==b->fast.status && minrow==b->fast.minrow && maxrow==b->fast.maxrow) { + if (b->fast.enemies[select]>=0) { + return b->fast.enemies[select]; + } else if (select&SELECT_FIND) { + if (b->fast.enemies[select-SELECT_FIND]>=0) { + return b->fast.enemies[select-SELECT_FIND]; + } } + } else { + b->fast.side = as; + b->fast.status = sr; + b->fast.minrow = minrow; + b->fast.alive=b->alive; + b->fast.maxrow = maxrow; + memset(b->fast.enemies, -1, sizeof(b->fast.enemies)); } #endif diff --git a/src/common/kernel/battle.h b/src/common/kernel/battle.h index 227c16dd1..389ec4195 100644 --- a/src/common/kernel/battle.h +++ b/src/common/kernel/battle.h @@ -70,6 +70,16 @@ extern "C" { #ifdef SMALL_BATTLE_MESSAGES boolean small; #endif +#define FASTROW +#ifdef FASTROW + struct { + const struct side * as; + const struct side * vs; + int alive; + int row; + int result; + } rowcache; +#endif #define FASTCOUNT #ifdef FASTCOUNT struct {