forked from github/server
lucky_item läuft nur auf GCC, wieder geklammert, und ne alternativimplementation angeangen.
This commit is contained in:
parent
09c503ba69
commit
166b347aeb
|
@ -75,6 +75,11 @@ lucky_silver(const unit *u)
|
||||||
"lucky_item%u:unit%X:item%d:amount", u, i_silver->rtype, max));
|
"lucky_item%u:unit%X:item%d:amount", u, i_silver->rtype, max));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct luckyitem {
|
||||||
|
const char * name;
|
||||||
|
int weight; /* weighting the item */
|
||||||
|
} luckyitem;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
lucky_item(const unit *u)
|
lucky_item(const unit *u)
|
||||||
{
|
{
|
||||||
|
@ -82,9 +87,10 @@ lucky_item(const unit *u)
|
||||||
item_type *itype;
|
item_type *itype;
|
||||||
int amount;
|
int amount;
|
||||||
int luck = fspecial(u->faction, FS_LUCKY);
|
int luck = fspecial(u->faction, FS_LUCKY);
|
||||||
const int n_items = 35;
|
#if defined(__GNUC__) && !defined(__STDC__)
|
||||||
|
const int nitems = 35;
|
||||||
/* ordered rougly by value */
|
/* ordered rougly by value */
|
||||||
item_type *it_list[] = {
|
item_type *it_list[nitems] = {
|
||||||
olditemtype[I_RUSTY_SWORD],
|
olditemtype[I_RUSTY_SWORD],
|
||||||
olditemtype[I_RUSTY_SHIELD],
|
olditemtype[I_RUSTY_SHIELD],
|
||||||
olditemtype[I_RUSTY_CHAIN_MAIL],
|
olditemtype[I_RUSTY_CHAIN_MAIL],
|
||||||
|
@ -122,14 +128,34 @@ lucky_item(const unit *u)
|
||||||
olditemtype[I_LAENSHIELD],
|
olditemtype[I_LAENSHIELD],
|
||||||
olditemtype[I_LAENCHAIN],
|
olditemtype[I_LAENCHAIN],
|
||||||
};
|
};
|
||||||
|
#else
|
||||||
|
/* Das ist schöner so, denke ich... */
|
||||||
|
static int nitems = 0;
|
||||||
|
static int maxweight = 0;
|
||||||
|
struct luckyitem it_list[] = {
|
||||||
|
{ "mallorn", 1 },
|
||||||
|
{ NULL, 0 }
|
||||||
|
};
|
||||||
|
if (nitems==0) {
|
||||||
|
while (it_list[nitems].name) {
|
||||||
|
maxweight +=it_list[nitems].weight;
|
||||||
|
++nitems;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* weight is unused */
|
||||||
|
r = rand()%nitems;
|
||||||
|
#endif
|
||||||
do {
|
do {
|
||||||
r = rand()%n_items;
|
r = rand()%nitems;
|
||||||
if(r > max) max = r;
|
if(r > max) max = r;
|
||||||
i++;
|
i++;
|
||||||
} while(i <= luck);
|
} while(i <= luck);
|
||||||
|
|
||||||
|
#if defined(__GNUC__) && !defined(__STDC__)
|
||||||
itype = it_list[r];
|
itype = it_list[r];
|
||||||
|
#else
|
||||||
|
itype = it_find(it_list[r].name);
|
||||||
|
#endif
|
||||||
|
|
||||||
if(luck)
|
if(luck)
|
||||||
amount = 10 + rand()%(luck*40) + rand()%(luck*40);
|
amount = 10 + rand()%(luck*40) + rand()%(luck*40);
|
||||||
|
@ -145,6 +171,7 @@ lucky_item(const unit *u)
|
||||||
static void
|
static void
|
||||||
lucky_magic_item(const unit *u)
|
lucky_magic_item(const unit *u)
|
||||||
{
|
{
|
||||||
|
#if defined(__GNUC__) && !defined(__STDC__)
|
||||||
item_type *itype;
|
item_type *itype;
|
||||||
int amount;
|
int amount;
|
||||||
int luck = fspecial(u->faction, FS_LUCKY);
|
int luck = fspecial(u->faction, FS_LUCKY);
|
||||||
|
@ -172,8 +199,10 @@ lucky_magic_item(const unit *u)
|
||||||
|
|
||||||
add_message(&u->faction->msgs, new_message(u->faction,
|
add_message(&u->faction->msgs, new_message(u->faction,
|
||||||
"lucky_item%u:unit%X:item%d:amount", u, itype->rtype, amount));
|
"lucky_item%u:unit%X:item%d:amount", u, itype->rtype, amount));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
lucky_event(const faction *f)
|
lucky_event(const faction *f)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2552,32 +2552,22 @@ static boolean
|
||||||
add_seen(const struct region * r, unsigned char mode, boolean dis)
|
add_seen(const struct region * r, unsigned char mode, boolean dis)
|
||||||
{
|
{
|
||||||
seen_region * find = find_seen(r);
|
seen_region * find = find_seen(r);
|
||||||
if (find) {
|
if (find==NULL) {
|
||||||
if (find->mode >= mode) return false;
|
|
||||||
if (find->mode>see_neighbour || find->next==NULL) {
|
|
||||||
find->mode = mode;
|
|
||||||
find->disbelieves |= dis;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
/* take it out the list, so it can get processed again */
|
|
||||||
find->next->prev = find->prev;
|
|
||||||
if (find->prev) find->prev->next = find->next;
|
|
||||||
else seen = find->next;
|
|
||||||
} else {
|
|
||||||
int index = abs((r->x & 0xffff) + ((r->y) << 16)) % MAXSEEHASH;
|
int index = abs((r->x & 0xffff) + ((r->y) << 16)) % MAXSEEHASH;
|
||||||
if (!reuse) reuse = (seen_region*)calloc(1, sizeof(seen_region));
|
if (!reuse) reuse = (seen_region*)calloc(1, sizeof(struct seen_region));
|
||||||
*append = find = reuse;
|
*append = find = reuse;
|
||||||
reuse = reuse->next;
|
reuse = reuse->next;
|
||||||
find->nextHash = seehash[index];
|
find->nextHash = seehash[index];
|
||||||
seehash[index] = find;
|
seehash[index] = find;
|
||||||
find->r = r;
|
find->r = r;
|
||||||
|
if (last) last->next = find;
|
||||||
|
find->next = NULL;
|
||||||
|
find->prev = last;
|
||||||
|
last = find;
|
||||||
|
append = &last->next;
|
||||||
|
} else if (find->mode >= mode) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
/* put it at the end of the list, where the unprocessed nodes are */
|
|
||||||
if (last) last->next = find;
|
|
||||||
find->next = NULL;
|
|
||||||
find->prev = last;
|
|
||||||
last = find;
|
|
||||||
append = &last->next;
|
|
||||||
find->mode = mode;
|
find->mode = mode;
|
||||||
find->disbelieves |= dis;
|
find->disbelieves |= dis;
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue