#include "diseases.h"
#define PREDEFINED_TYPES ([ "milk" : 30, "meat" : 40, "confectionary" : 1,\
"fruit" : 20 ])
#define ALL_DISEASES ([ "/std/effects/disease/headache" : 30,\
"/std/effects/disease/revulsion" : 20,\
])
void apply_effect(object, string, int);
/**
* @ignore yes
*/
void create() {
} /* create() */
/**
* This method calculates a mapping of the chances for each particular
* disease occuring.
* It then chooses the actual disease.
*/
string choose_disease() {
int total_rating;
float i;
string disease;
mapping individual_chances = ([]);
//Work out each diseases individual rating, though store it in the
//return mapping for now, to reduce memory usage.
foreach(disease in keys(ALL_DISEASES)) {
individual_chances[disease] = random(ALL_DISEASES[disease]);
}
//Calculate the total rating of the diseases.
foreach(disease in keys(individual_chances)) {
total_rating += individual_chances[disease];
}
if(total_rating < 1) { return keys(ALL_DISEASES)[0]; } //Hack, avoid div by 0 errors.
i = 0;
foreach(disease in keys(individual_chances)) {
//Actually calculate the diseases individual chance.
individual_chances[disease] = ({
i, ((individual_chances[disease] / (total_rating + 0.0)) * 100) + i});
i = individual_chances[disease][1];
}
//Choose the actual disease.
i = random(100);
foreach(disease in keys(individual_chances)) {
if(i >= individual_chances[disease][0] && i < individual_chances[disease][1]) {
return disease;
}
}
} /* calculate_chances() */
mixed stats() { return ALL_DISEASES; }
void consume_food(object player, int decomposition, int weight,
string type) {
int chance;
if(type == "disease_free") return;
chance = weight;
// Change food.c so that weight passed in is the weight of food
// consumed, not the weight of the total food.
chance += decomposition * 10;
chance += PREDEFINED_TYPES[type];
chance += (((0 - player->query_con()) + 30) * 2);
if(random(chance) > 60) {
apply_effect(player, choose_disease(), chance);
return;
}
if(!random(40)) {
apply_effect(player, choose_disease(), chance);
}
} /* consume_food() */
/**
* This method can catch diseases that need specific syntaxes to be
* activated. If the disease isn't listed, it is just applied normally.
*/
void apply_effect(object player, string effect, int severity) {
// Removed the player from the arguments as it's passed to the effect
// automatically and is causing runtimes when merging effects.
// Sandoz.
// player->add_effect(effect, player, severity);
player->add_effect(effect, severity);
} /* apply_effect() */