// Petrarch
// Merentha Lib 1.0
// skill daemon
#include <skills.h>
#include <math.h>
#include <std.h>
inherit DAEMON;
void init_skills(object ob) {
mapping tmp_skills=([]);
string *skills;
int i=sizeof(skills=ALL_SKILLS);
if (!ob) return;
ob->set_skill_bonus("attack",0);
while(i--) tmp_skills[skills[i]]=(["level":25,"points":0,"adjustment":0,"adj_points":0]);
ob->set_skills( tmp_skills );
}
int skill_cost(ob, _class, skill) {
if(_class=="mage")
if(ob->query_class("mage")) {
if (member_array(skill, MAGE_TERRIBLE_SKILLS)!=-1) return 15;
if (member_array(skill, MAGE_BAD_SKILLS)!=-1) return 9;
if (member_array(skill, MAGE_AVG_SKILLS)!=-1) return 3;
if (member_array(skill, MAGE_GOOD_SKILLS)!=-1) return -3;
if (member_array(skill, MAGE_GREAT_SKILLS)!=-1) return -10;
}
if(_class=="fighter")
if(ob->query_class("fighter")) {
if (member_array(skill, FIGHTER_TERRIBLE_SKILLS)!=-1) return 15;
if (member_array(skill, FIGHTER_BAD_SKILLS)!=-1) return 9;
if (member_array(skill, FIGHTER_AVG_SKILLS)!=-1) return 3;
if (member_array(skill, FIGHTER_GOOD_SKILLS)!=-1) return -3;
if (member_array(skill, FIGHTER_GREAT_SKILLS)!=-1) return -10;
}
if(_class=="healer")
if(ob->query_class("healer")) {
if (member_array(skill, HEALER_TERRIBLE_SKILLS)!=-1) return 15;
if (member_array(skill, HEALER_BAD_SKILLS)!=-1) return 9;
if (member_array(skill, HEALER_AVG_SKILLS)!=-1) return 3;
if (member_array(skill, HEALER_GOOD_SKILLS)!=-1) return -3;
if (member_array(skill, HEALER_GREAT_SKILLS)!=-1) return -10;
}
if(_class=="monk")
if(ob->query_class("monk")) {
if (member_array(skill, MONK_TERRIBLE_SKILLS)!=-1) return 15;
if (member_array(skill, MONK_BAD_SKILLS)!=-1) return 9;
if (member_array(skill, MONK_AVG_SKILLS)!=-1) return 3;
if (member_array(skill, MONK_GOOD_SKILLS)!=-1) return -3;
if (member_array(skill, MONK_GREAT_SKILLS)!=-1) return -10;
}
return 0;
}
int class_adjustment(ob, skill) {
int val;
if (ob->query_class()) val=sizeof(explode(ob->query_class(),"/"));
else val=1;
if(val==4) val=5;
else if(val==3) val=6;
else if(val==2) val=7;
else val=8;
return (skill_cost(ob,"mage",skill)+
skill_cost(ob,"fighter",skill)+
skill_cost(ob,"healer",skill)+
skill_cost(ob,"monk",skill) )*val/10;
}
int gender_adjustment(object ob, string skill) {
if (ob->query_gender()=="male") {
if (member_array(skill, MALE_GREAT_SKILLS )!=-1) return -12;
if (member_array(skill, MALE_GOOD_SKILLS )!=-1) return -6;
if (member_array(skill, MALE_BAD_SKILLS )!=-1) return 8;
if (member_array(skill, MALE_TERRIBLE_SKILLS )!=-1) return 16;
}
if (ob->query_gender()=="female") {
if (member_array(skill, FEMALE_GREAT_SKILLS )!=-1) return -12;
if (member_array(skill, FEMALE_GOOD_SKILLS )!=-1) return -6;
if (member_array(skill, FEMALE_BAD_SKILLS )!=-1) return 8;
if (member_array(skill, FEMALE_TERRIBLE_SKILLS )!=-1) return 16;
}
}
int race_adjustment(object ob, string skill) {
if (ob->query_race()=="human") {
if (member_array(skill, HUMAN_GOOD_SKILLS )!=-1) return -6;
if (member_array(skill, HUMAN_BAD_SKILLS )!=-1) return 8;
}
if (ob->query_race()=="elf") {
if (member_array(skill, ELF_GOOD_SKILLS )!=-1) return -6;
if (member_array(skill, ELF_BAD_SKILLS )!=-1) return 8;
}
if (ob->query_race()=="fairy") {
if (member_array(skill, FAIRY_GOOD_SKILLS )!=-1) return -6;
if (member_array(skill, FAIRY_BAD_SKILLS )!=-1) return 8;
}
if (ob->query_race()=="gnome") {
if (member_array(skill, GNOME_GOOD_SKILLS )!=-1) return -6;
if (member_array(skill, GNOME_BAD_SKILLS )!=-1) return 8;
}
if (ob->query_race()=="giant") {
if (member_array(skill, GIANT_GOOD_SKILLS )!=-1) return -6;
if (member_array(skill, GIANT_BAD_SKILLS )!=-1) return 8;
}
if (ob->query_race()=="dwarf") {
if (member_array(skill, DWARF_GOOD_SKILLS )!=-1) return -6;
if (member_array(skill, DWARF_BAD_SKILLS )!=-1) return 8;
}
}
int overall_skill_adjustment(object ob, string skill) {
return
class_adjustment(ob, skill)+
gender_adjustment(ob, skill)+
race_adjustment(ob, skill)+
ob->query_skill_adjustment(skill)+
ob->query_level()
;
}
int formula(object ob, string skill) {
int val=sizeof(explode(""+ob->query_class(),"/"));
int lev=ob->query_skill_level(skill);
if(!ob || !skill || !val) return 1;
return (lev*lev)*(100+
overall_skill_adjustment(ob, skill)
)/100;
}
int adj_formula(object ob, string skill) {
int lev=ob->query_skill_level(skill);
if(!ob || !skill) return 1;
return (lev*lev*2)/(ob->query_stat("wisdom"));
}