making ct_find faster, since it's the slowest function in the game.

This commit is contained in:
Enno Rehling 2004-01-15 22:11:19 +00:00
parent 32659cddb6
commit 0dce9060e9
2 changed files with 19 additions and 9 deletions

View File

@ -35,8 +35,9 @@
#include "objtypes.h" #include "objtypes.h"
/* util includes */ /* util includes */
#include <resolve.h> #include <util/resolve.h>
#include <base36.h> #include <util/base36.h>
#include <util/goodies.h>
/* libc includes */ /* libc includes */
#include <stdio.h> #include <stdio.h>
@ -224,12 +225,14 @@ typedef struct cursetype_list {
const curse_type * type; const curse_type * type;
} cursetype_list; } cursetype_list;
cursetype_list * cursetypes; #define CMAXHASH 63
cursetype_list * cursetypes[CMAXHASH];
void void
ct_register(const curse_type * ct) ct_register(const curse_type * ct)
{ {
cursetype_list ** ctlp = &cursetypes; unsigned int hash = hashstring(ct->cname);
cursetype_list ** ctlp = &cursetypes[hash];
while (*ctlp) { while (*ctlp) {
cursetype_list * ctl = *ctlp; cursetype_list * ctl = *ctlp;
if (ctl->type==ct) return; if (ctl->type==ct) return;
@ -242,7 +245,8 @@ ct_register(const curse_type * ct)
const curse_type * const curse_type *
ct_find(const char *c) ct_find(const char *c)
{ {
cursetype_list * ctl = cursetypes; unsigned int hash = hashstring(c);
cursetype_list * ctl = cursetypes[hash];
while (ctl) { while (ctl) {
int k = min(strlen(c), strlen(ctl->type->cname)); int k = min(strlen(c), strlen(ctl->type->cname));
if (!strncasecmp(c, ctl->type->cname, k)) return ctl->type; if (!strncasecmp(c, ctl->type->cname, k)) return ctl->type;

View File

@ -161,6 +161,12 @@ do_shock(unit *u, const char *reason)
/* Spruchanalyse - Ausgabe von curse->info und curse->name */ /* 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 void
magicanalyse_region(region *r, unit *mage, int force) 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 /* ist der curse schwächer als der Analysezauber, so ergibt sich
* mehr als 100% chance und damit immer ein Erfolg. */ * 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 = c->duration + (rand()%10) - 5;
mon = max(1,mon); mon = max(1,mon);
found = true; found = true;
@ -220,7 +226,7 @@ magicanalyse_unit(unit *u, unit *mage, int force)
c = (curse*)a->data.v; c = (curse*)a->data.v;
/* ist der curse schwächer als der Analysezauber, so ergibt sich /* ist der curse schwächer als der Analysezauber, so ergibt sich
* mehr als 100% chance und damit immer ein Erfolg. */ * 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 = c->duration + (rand()%10) - 5;
mon = max(1,mon); mon = max(1,mon);
@ -261,7 +267,7 @@ magicanalyse_building(building *b, unit *mage, int force)
c = (curse*)a->data.v; c = (curse*)a->data.v;
/* ist der curse schwächer als der Analysezauber, so ergibt sich /* ist der curse schwächer als der Analysezauber, so ergibt sich
* mehr als 100% chance und damit immer ein Erfolg. */ * 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 = c->duration + (rand()%10) - 5;
mon = max(1,mon); mon = max(1,mon);
@ -303,7 +309,7 @@ magicanalyse_ship(ship *sh, unit *mage, int force)
c = (curse*)a->data.v; c = (curse*)a->data.v;
/* ist der curse schwächer als der Analysezauber, so ergibt sich /* ist der curse schwächer als der Analysezauber, so ergibt sich
* mehr als 100% chance und damit immer ein Erfolg. */ * 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 = c->duration + (rand()%10) - 5;
mon = max(1,mon); mon = max(1,mon);