forked from github/server
Merge pull request #44 from badgerman/master
Automatic Teaching feature by CTD
This commit is contained in:
commit
e4ab34115b
44
src/study.c
44
src/study.c
|
@ -493,25 +493,37 @@ int teach_cmd(unit * u, struct order *ord)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static double study_speedup(unit * u)
|
typedef enum study_rule_t {
|
||||||
|
STUDY_DEFAULT = 0,
|
||||||
|
STUDY_FASTER = 1,
|
||||||
|
STUDY_AUTOTEACH = 2
|
||||||
|
} study_rule_t;
|
||||||
|
|
||||||
|
static double study_speedup(unit * u, skill_t s, study_rule_t rule)
|
||||||
{
|
{
|
||||||
#define MINTURN 5 /* 5 */
|
#define MINTURN 16
|
||||||
#define OFSTURN 2 /* 2 */
|
double learnweeks = 0;
|
||||||
|
int i;
|
||||||
if (turn > MINTURN) {
|
if (turn > MINTURN) {
|
||||||
static int speed_rule = -1;
|
if (rule == STUDY_FASTER) {
|
||||||
if (speed_rule < 0) {
|
|
||||||
speed_rule = get_param_int(global.parameters, "study.speedup", 0);
|
|
||||||
}
|
|
||||||
if (speed_rule == 1) {
|
|
||||||
double learn_age = OFSTURN;
|
|
||||||
int i;
|
|
||||||
for (i = 0; i != u->skill_size; ++i) {
|
for (i = 0; i != u->skill_size; ++i) {
|
||||||
skill *sv = u->skills + i;
|
skill *sv = u->skills + i;
|
||||||
double learn_time = sv->level * (sv->level + 1) / 2.0;
|
if (sv->id == s){
|
||||||
learn_age += learn_time;
|
learnweeks = sv->level * (sv->level + 1) / 2.0;
|
||||||
|
if (learnweeks < turn / 3) {
|
||||||
|
return 2.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (learn_age < turn) {
|
return 2.0; /* If the skill was not found it is the first study. */
|
||||||
return 2.0 - learn_age / turn;
|
}
|
||||||
|
if (rule == STUDY_AUTOTEACH) {
|
||||||
|
for (i = 0; i != u->skill_size; ++i) {
|
||||||
|
skill *sv = u->skills + i;
|
||||||
|
learnweeks = +(sv->level * (sv->level + 1) / 2.0);
|
||||||
|
}
|
||||||
|
if (learnweeks < turn / 2) {
|
||||||
|
return 2.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -531,6 +543,7 @@ int learn_cmd(unit * u, order * ord)
|
||||||
int money = 0;
|
int money = 0;
|
||||||
skill_t sk;
|
skill_t sk;
|
||||||
int maxalchemy = 0;
|
int maxalchemy = 0;
|
||||||
|
int speed_rule = (study_rule_t)get_param_int(global.parameters, "study.speedup", 0);
|
||||||
static int learn_newskills = -1;
|
static int learn_newskills = -1;
|
||||||
if (learn_newskills < 0) {
|
if (learn_newskills < 0) {
|
||||||
const char *str = get_param(global.parameters, "study.newskills");
|
const char *str = get_param(global.parameters, "study.newskills");
|
||||||
|
@ -539,7 +552,6 @@ int learn_cmd(unit * u, order * ord)
|
||||||
else
|
else
|
||||||
learn_newskills = 1;
|
learn_newskills = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((u_race(u)->flags & RCF_NOLEARN) || fval(u, UFL_WERE)) {
|
if ((u_race(u)->flags & RCF_NOLEARN) || fval(u, UFL_WERE)) {
|
||||||
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_race_nolearn", "race",
|
ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "error_race_nolearn", "race",
|
||||||
u_race(u)));
|
u_race(u)));
|
||||||
|
@ -732,7 +744,7 @@ int learn_cmd(unit * u, order * ord)
|
||||||
teach->value -= u->number * 10;
|
teach->value -= u->number * 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
multi *= study_speedup(u);
|
multi *= study_speedup(u, sk, speed_rule);
|
||||||
days = study_days(u, sk);
|
days = study_days(u, sk);
|
||||||
days = (int)((days + teach->value) * multi);
|
days = (int)((days + teach->value) * multi);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue