/* vi: set ts=2: * * * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) * Henning Peters (faroul@beyond.kn-bremen.de) * Enno Rehling (enno@eressea-pbem.de) * Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de) * * based on: * * Atlantis v1.0 13 September 1993 Copyright 1993 by Russell Wallace * Atlantis v1.7 Copyright 1996 by Alex Schröder * * This program may not be used, modified or distributed without * prior permission by the authors of Eressea. * This program may not be sold or used commercially without prior written * permission from the authors. */ #include #include "eressea.h" #include "luck.h" /* attributes includes */ #include #include #include "economy.h" #include "randenc.h" /* kernel include */ #include #include #include #include #include #include #include #include #include /* util includes */ #include #include /* libc includes */ #include #include #include #include #include const int STANDARD_LUCK = 2; extern struct item_type * i_silver; #ifdef BAD_NON_ANSI_CODE static void lucky_silver(const unit *u) { int i = 0, r, max = 0; int luck = fspecial(u->faction, FS_LUCKY); do { r = 1000 + rand()%(10000*luck); if(r > max) max = r; i++; } while(i <= luck); i_change(&((unit *)u)->items, i_silver, max); add_message(&u->faction->msgs, new_message(u->faction, "lucky_item%u:unit%X:item%d:amount", u, i_silver->rtype, max)); } static void lucky_item(const unit *u) { int i = 0, r, max = 0; item_type *itype; int amount; int luck = fspecial(u->faction, FS_LUCKY); const int n_items = 35; /* ordered rougly by value */ item_type *it_list[] = { olditemtype[I_RUSTY_SWORD], olditemtype[I_RUSTY_SHIELD], olditemtype[I_RUSTY_CHAIN_MAIL], olditemtype[I_BALM], olditemtype[I_SPICES], olditemtype[I_MYRRH], olditemtype[I_OIL], olditemtype[I_SILK], olditemtype[I_INCENSE], olditemtype[I_JEWELERY], olditemtype[I_IRON], olditemtype[I_WOOD], olditemtype[I_MALLORN], olditemtype[I_STONE], olditemtype[I_HORSE], olditemtype[I_SWORD], olditemtype[I_SPEAR], olditemtype[I_CROSSBOW], olditemtype[I_AXE], olditemtype[I_LANCE], olditemtype[I_HALBERD], olditemtype[I_LONGBOW], olditemtype[I_SHIELD], olditemtype[I_CHAIN_MAIL], olditemtype[I_PLATE_ARMOR], olditemtype[I_WAGON], olditemtype[I_CATAPULT], &it_mallornspear, &it_mallornlance, &it_mallornbow, &it_mallorncrossbow, olditemtype[I_GREATBOW], olditemtype[I_LAEN], olditemtype[I_LAENSWORD], olditemtype[I_LAENSHIELD], olditemtype[I_LAENCHAIN], }; do { r = rand()%n_items; if(r > max) max = r; i++; } while(i <= luck); itype = it_list[r]; if(luck) amount = 10 + rand()%(luck*40) + rand()%(luck*40); else amount = 5 + rand()%10 +rand()%10; i_change(&((unit *)u)->items, itype, amount); add_message(&u->faction->msgs, new_message(u->faction, "lucky_item%u:unit%X:item%d:amount", u, itype->rtype, amount)); } static void lucky_magic_item(const unit *u) { item_type *itype; int amount; int luck = fspecial(u->faction, FS_LUCKY); const int n_items = 13; item_type *it_list[] = { olditemtype[I_AMULET_OF_HEALING], olditemtype[I_AMULET_OF_TRUE_SEEING], olditemtype[I_RING_OF_INVISIBILITY], olditemtype[I_RING_OF_POWER], olditemtype[I_FIRESWORD], olditemtype[I_CHASTITY_BELT], olditemtype[I_FEENSTIEFEL], olditemtype[I_ANTIMAGICCRYSTAL], olditemtype[I_RING_OF_NIMBLEFINGER], olditemtype[I_TROLLBELT], olditemtype[I_TACTICCRYSTAL], olditemtype[I_RING_OF_REGENERATION], olditemtype[I_SACK_OF_CONSERVATION], }; itype = it_list[rand()%n_items]; amount = 1 + rand()%luck; i_change(&((unit *)u)->items, itype, amount); add_message(&u->faction->msgs, new_message(u->faction, "lucky_item%u:unit%X:item%d:amount", u, itype->rtype, amount)); } static void lucky_event(const faction *f) { const unit *u = random_unit_in_faction(f); if(!u) return; switch(rand()%3) { case 0: lucky_silver(u); break; case 1: lucky_item(u); break; case 2: lucky_magic_item(u); break; } } #endif void check_luck(void) { #ifdef BAD_NON_ANSI_CODE faction *f; for(f=factions; f; f=f->next) { if(rand()%100 < STANDARD_LUCK+fspecial(f, FS_LUCKY)*8) lucky_event(f); } #endif }