From 0dce9060e9dfde4302d6b7798cc5ea6ffad82fcc Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Thu, 15 Jan 2004 22:11:19 +0000 Subject: [PATCH] making ct_find faster, since it's the slowest function in the game. --- src/common/kernel/curse.c | 14 +++++++++----- src/common/kernel/spell.c | 14 ++++++++++---- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/common/kernel/curse.c b/src/common/kernel/curse.c index 1becc6d92..6e090fc26 100644 --- a/src/common/kernel/curse.c +++ b/src/common/kernel/curse.c @@ -35,8 +35,9 @@ #include "objtypes.h" /* util includes */ -#include -#include +#include +#include +#include /* libc includes */ #include @@ -224,12 +225,14 @@ typedef struct cursetype_list { const curse_type * type; } cursetype_list; -cursetype_list * cursetypes; +#define CMAXHASH 63 +cursetype_list * cursetypes[CMAXHASH]; void ct_register(const curse_type * ct) { - cursetype_list ** ctlp = &cursetypes; + unsigned int hash = hashstring(ct->cname); + cursetype_list ** ctlp = &cursetypes[hash]; while (*ctlp) { cursetype_list * ctl = *ctlp; if (ctl->type==ct) return; @@ -242,7 +245,8 @@ ct_register(const curse_type * ct) const curse_type * ct_find(const char *c) { - cursetype_list * ctl = cursetypes; + unsigned int hash = hashstring(c); + cursetype_list * ctl = cursetypes[hash]; while (ctl) { int k = min(strlen(c), strlen(ctl->type->cname)); if (!strncasecmp(c, ctl->type->cname, k)) return ctl->type; diff --git a/src/common/kernel/spell.c b/src/common/kernel/spell.c index 0820734bf..c608a6ed7 100644 --- a/src/common/kernel/spell.c +++ b/src/common/kernel/spell.c @@ -161,6 +161,12 @@ do_shock(unit *u, const char *reason) /* Spruchanalyse - Ausgabe von curse->info und curse->name */ /* ------------------------------------------------------------- */ +static int +curse_chance(const struct curse * c, int force) +{ + return 100 + (int)((force - c->vigour)*10); +} + void magicanalyse_region(region *r, unit *mage, int force) { @@ -178,7 +184,7 @@ magicanalyse_region(region *r, unit *mage, int force) /* ist der curse schwächer als der Analysezauber, so ergibt sich * mehr als 100% chance und damit immer ein Erfolg. */ - chance = (force - c->vigour)*10 + 100; + chance = curse_chance(c, force); mon = c->duration + (rand()%10) - 5; mon = max(1,mon); found = true; @@ -220,7 +226,7 @@ magicanalyse_unit(unit *u, unit *mage, int force) c = (curse*)a->data.v; /* ist der curse schwächer als der Analysezauber, so ergibt sich * mehr als 100% chance und damit immer ein Erfolg. */ - chance = (force - c->vigour)*10 + 100; + chance = chance = curse_chance(c, force); mon = c->duration + (rand()%10) - 5; mon = max(1,mon); @@ -261,7 +267,7 @@ magicanalyse_building(building *b, unit *mage, int force) c = (curse*)a->data.v; /* ist der curse schwächer als der Analysezauber, so ergibt sich * mehr als 100% chance und damit immer ein Erfolg. */ - chance = (force - c->vigour)*10 + 100; + chance = curse_chance(c, force); mon = c->duration + (rand()%10) - 5; mon = max(1,mon); @@ -303,7 +309,7 @@ magicanalyse_ship(ship *sh, unit *mage, int force) c = (curse*)a->data.v; /* ist der curse schwächer als der Analysezauber, so ergibt sich * mehr als 100% chance und damit immer ein Erfolg. */ - chance = (force - c->vigour)*10 + 100; + chance = curse_chance(c, force); mon = c->duration + (rand()%10) - 5; mon = max(1,mon);