forked from github/server
* Neue Lehrer-Meldung
* Mapper analysiert befehlsdatei für dropouts.
This commit is contained in:
parent
4e30efed94
commit
667e6673b2
|
@ -121,16 +121,34 @@ study_cost(unit *u, int talent)
|
|||
|
||||
/* ------------------------------------------------------------- */
|
||||
|
||||
typedef struct teaching_info {
|
||||
unit * teacher;
|
||||
int value;
|
||||
} teaching_info;
|
||||
|
||||
static void
|
||||
init_learning(struct attrib * a)
|
||||
{
|
||||
a->data.v = calloc(sizeof(teaching_info), 1);
|
||||
}
|
||||
|
||||
static void
|
||||
done_learning(struct attrib * a)
|
||||
{
|
||||
free(a->data.v);
|
||||
}
|
||||
|
||||
static const attrib_type at_learning = {
|
||||
"learning",
|
||||
NULL, NULL, NULL, NULL, NULL,
|
||||
init_learning, done_learning, NULL, NULL, NULL,
|
||||
ATF_UNIQUE
|
||||
};
|
||||
|
||||
static int
|
||||
teach_unit(unit * teacher, unit * student, int teaching, skill_t sk,
|
||||
teach_unit(unit * teacher, unit * student, int nteaching, skill_t sk,
|
||||
boolean report, int * academy)
|
||||
{
|
||||
teaching_info * teach = NULL;
|
||||
attrib * a;
|
||||
int n;
|
||||
|
||||
|
@ -148,22 +166,27 @@ teach_unit(unit * teacher, unit * student, int teaching, skill_t sk,
|
|||
|
||||
n = student->number * 30;
|
||||
a = a_find(student->attribs, &at_learning);
|
||||
if (a!=NULL) n -= a->data.i;
|
||||
if (a!=NULL) {
|
||||
teach = (teaching_info*)a->data.v;
|
||||
n -= teach->value;
|
||||
}
|
||||
|
||||
n = min(n, teaching);
|
||||
n = min(n, nteaching);
|
||||
|
||||
if (n != 0) {
|
||||
struct building * b = inside_building(teacher);
|
||||
const struct building_type * btype = b?b->type:NULL;
|
||||
|
||||
if (a==NULL) a = a_add(&student->attribs, a_new(&at_learning));
|
||||
a->data.i += n;
|
||||
if (teach==NULL) {
|
||||
a = a_add(&student->attribs, a_new(&at_learning));
|
||||
teach = (teaching_info*)a->data.v;
|
||||
}
|
||||
teach->teacher = teacher;
|
||||
teach->value += n;
|
||||
|
||||
/* Solange Akademien größenbeschränkt sind, sollte Lehrer und
|
||||
* Student auch in unterschiedlichen Gebäuden stehen dürfen */
|
||||
if (btype == &bt_academy
|
||||
/* && student->building==teacher->building
|
||||
* && inside_building(student)!=NULL) */
|
||||
&& student->building && student->building->type == &bt_academy)
|
||||
{
|
||||
int j = study_cost(student, sk);
|
||||
|
@ -171,7 +194,7 @@ teach_unit(unit * teacher, unit * student, int teaching, skill_t sk,
|
|||
/* kann Einheit das zahlen? */
|
||||
if (get_pooled(student, student->region, R_SILVER) >= j) {
|
||||
/* Jeder Schüler zusätzlich +10 Tage wenn in Uni. */
|
||||
a->data.i += (n / 30) * 10; /* learning erhöhen */
|
||||
teach->value += (n / 30) * 10; /* learning erhöhen */
|
||||
/* Lehrer zusätzlich +1 Tag pro Schüler. */
|
||||
if (academy) *academy += n;
|
||||
} /* sonst nehmen sie nicht am Unterricht teil */
|
||||
|
@ -206,16 +229,8 @@ teach_unit(unit * teacher, unit * student, int teaching, skill_t sk,
|
|||
* die Talentänderung (enno).
|
||||
*/
|
||||
|
||||
teaching = max(0, teaching - student->number * 30);
|
||||
nteaching = max(0, nteaching - student->number * 30);
|
||||
|
||||
if (report || teacher->faction != student->faction) {
|
||||
add_message(&student->faction->msgs, msg_message("teach",
|
||||
"teacher student skill", teacher, student, sk));
|
||||
if (teacher->faction != student->faction) {
|
||||
add_message(&teacher->faction->msgs, msg_message("teach",
|
||||
"teacher student skill", teacher, student, sk));
|
||||
}
|
||||
}
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
@ -387,7 +402,7 @@ teach(region * r, unit * u)
|
|||
msg_error(u, u->thisorder, "teach_nolearn", "student", u2));
|
||||
continue;
|
||||
}
|
||||
if (eff_skill(u, sk, r) <= eff_skill(u2, sk, r)) {
|
||||
if (eff_skill(u2, sk, r) + TEACHDIFFERENCE >= eff_skill(u, sk, r)) {
|
||||
add_message(&u->faction->msgs,
|
||||
msg_error(u, u->thisorder, "teach_asgood", "student", u2));
|
||||
continue;
|
||||
|
@ -448,6 +463,7 @@ learn(void)
|
|||
if (igetkeyword(u->thisorder, u->faction->locale) == K_STUDY) {
|
||||
double multi = 1.0;
|
||||
attrib * a = NULL;
|
||||
teaching_info * teach = NULL;
|
||||
int money = 0;
|
||||
int maxalchemy = 0;
|
||||
if (u->race == new_race[RC_INSECT] && r_insectstalled(r)
|
||||
|
@ -485,6 +501,9 @@ learn(void)
|
|||
|
||||
p = studycost = study_cost(u,i);
|
||||
a = a_find(u->attribs, &at_learning);
|
||||
if (a!=NULL) {
|
||||
teach = (teaching_info*)a->data.v;
|
||||
}
|
||||
|
||||
/* keine kostenpflichtigen Talente für Migranten. Vertraute sind
|
||||
* keine Migranten, wird in is_migrant abgefangen. Vorsicht,
|
||||
|
@ -597,7 +616,11 @@ learn(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (a==NULL) a = a_add(&u->attribs, a_new(&at_learning));
|
||||
if (teach==NULL) {
|
||||
a = a_add(&u->attribs, a_new(&at_learning));
|
||||
teach = (teaching_info*)a->data.v;
|
||||
teach->teacher = NULL;
|
||||
}
|
||||
if (money>0) {
|
||||
use_pooled(u, r, R_SILVER, money);
|
||||
add_message(&u->faction->msgs, msg_message("studycost",
|
||||
|
@ -606,12 +629,12 @@ learn(void)
|
|||
|
||||
if (get_effect(u, oldpotiontype[P_WISE])) {
|
||||
l = min(u->number, get_effect(u, oldpotiontype[P_WISE]));
|
||||
a->data.i += l * 10;
|
||||
teach->value += l * 10;
|
||||
change_effect(u, oldpotiontype[P_WISE], -l);
|
||||
}
|
||||
if (get_effect(u, oldpotiontype[P_FOOL])) {
|
||||
l = min(u->number, get_effect(u, oldpotiontype[P_FOOL]));
|
||||
a->data.i -= l * 30;
|
||||
teach->value -= l * 30;
|
||||
change_effect(u, oldpotiontype[P_FOOL], -l);
|
||||
}
|
||||
|
||||
|
@ -621,10 +644,10 @@ learn(void)
|
|||
|| i == SK_CATAPULT || i == SK_SWORD || i == SK_SPEAR
|
||||
|| i == SK_AUSDAUER || i == SK_WEAPONLESS)
|
||||
{
|
||||
a->data.i += u->number * (5+warrior_skill*5);
|
||||
teach->value += u->number * (5+warrior_skill*5);
|
||||
} else {
|
||||
a->data.i -= u->number * (5+warrior_skill*5);
|
||||
a->data.i = max(0, a->data.i);
|
||||
teach->value -= u->number * (5+warrior_skill*5);
|
||||
teach->value = max(0, teach->value);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -633,20 +656,20 @@ learn(void)
|
|||
/* p ist Kosten ohne Uni, studycost mit; wenn
|
||||
* p!=studycost, ist die Einheit zwangsweise
|
||||
* in einer Uni */
|
||||
a->data.i += u->number * 10;
|
||||
teach->value += u->number * 10;
|
||||
}
|
||||
if (is_cursed(r->attribs,C_BADLEARN,0)) {
|
||||
a->data.i -= u->number * 10;
|
||||
teach->value -= u->number * 10;
|
||||
}
|
||||
#ifdef SKILLFIX_SAVE
|
||||
if (a && a->data.i) {
|
||||
if (teach && teach->value) {
|
||||
int skill = get_skill(u, (skill_t)i);
|
||||
skillfix(u, (skill_t)i, skill,
|
||||
(int)(u->number * 30 * multi), a->data.i);
|
||||
(int)(u->number * 30 * multi), teach->value);
|
||||
}
|
||||
#endif
|
||||
|
||||
days = (int)((u->number * 30 + a->data.i) * multi);
|
||||
days = (int)((u->number * 30 + teach->value) * multi);
|
||||
if (fval(u, FL_HUNGER)) days = days / 2;
|
||||
while (days) {
|
||||
if (days>=u->number*30) {
|
||||
|
@ -659,6 +682,16 @@ learn(void)
|
|||
}
|
||||
}
|
||||
if (a) {
|
||||
if (teach && teach->teacher) {
|
||||
unit * teacher = teach->teacher;
|
||||
if (teacher->faction != u->faction) {
|
||||
add_message(&u->faction->msgs, msg_message("teach_student",
|
||||
"teacher student skill", teacher, u, (skill_t)i));
|
||||
add_message(&teacher->faction->msgs, msg_message("teach_teacher",
|
||||
"teacher student skill level", teacher, u, (skill_t)i,
|
||||
effskill(u, (skill_t)i)));
|
||||
}
|
||||
}
|
||||
a_remove(&u->attribs, a);
|
||||
a = NULL;
|
||||
}
|
||||
|
@ -689,7 +722,6 @@ learn(void)
|
|||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
teaching(void)
|
||||
{
|
||||
|
|
|
@ -276,7 +276,7 @@ ri36(FILE * F)
|
|||
}
|
||||
|
||||
#define MAXLINE 4096*16
|
||||
static char *
|
||||
char *
|
||||
getbuf(FILE * F)
|
||||
{
|
||||
char lbuf[MAXLINE];
|
||||
|
|
|
@ -74,5 +74,6 @@ extern struct region * readregion(FILE * stream, int x, int y);
|
|||
|
||||
extern void writefaction(FILE * stream, const struct faction * f);
|
||||
extern struct faction * readfaction(FILE * stream);
|
||||
extern char * getbuf(FILE * F);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <race.h>
|
||||
#include <region.h>
|
||||
#include <reports.h>
|
||||
#include <save.h>
|
||||
#include <study.h>
|
||||
#include <skill.h>
|
||||
#include <unit.h>
|
||||
|
@ -37,6 +38,8 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
const char * orderfile = NULL;
|
||||
|
||||
void
|
||||
RemovePartei(void) {
|
||||
faction *f, *F;
|
||||
|
@ -153,12 +156,57 @@ give_latestart_bonus(region *r, unit *u, int b)
|
|||
typedef struct dropout {
|
||||
struct dropout * next;
|
||||
const struct race * race;
|
||||
int x, y;
|
||||
int x, y, fno;
|
||||
} dropout;
|
||||
|
||||
static dropout * dropouts;
|
||||
static newfaction * newfactions;
|
||||
|
||||
void
|
||||
read_orders(const char * filename)
|
||||
{
|
||||
faction * f = NULL;
|
||||
FILE * F = fopen(filename, "r");
|
||||
char * b;
|
||||
char buffer[16];
|
||||
|
||||
if (F==NULL) return;
|
||||
b = getbuf(F);
|
||||
|
||||
for (;;) {
|
||||
switch (igetparam(b, default_locale)) {
|
||||
case P_GAMENAME:
|
||||
case P_FACTION:
|
||||
strncpy(buffer, getstrtoken(), 16);
|
||||
f = findfaction(atoi36(buffer));
|
||||
if (f) fset(f, FL_MARK);
|
||||
break;
|
||||
|
||||
case P_NEXT:
|
||||
f = NULL;
|
||||
break;
|
||||
}
|
||||
b = getbuf(F);
|
||||
}
|
||||
fclose(F);
|
||||
for (f=factions;f;f=f->next) {
|
||||
if (!fval(f, FL_MARK) && f->age <=1) {
|
||||
ursprung * ur = f->ursprung;
|
||||
while (ur && ur->id!=0) ur=ur->next;
|
||||
if (ur) {
|
||||
dropout * drop = calloc(sizeof(dropout), 1);
|
||||
drop->x = ur->x;
|
||||
drop->y = ur->y;
|
||||
drop->fno = f->no;
|
||||
drop->race = f->race;
|
||||
drop->next = dropouts;
|
||||
dropouts = drop;
|
||||
}
|
||||
}
|
||||
freset(f, FL_MARK);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
read_dropouts(const char * filename)
|
||||
{
|
||||
|
@ -174,10 +222,12 @@ read_dropouts(const char * filename)
|
|||
drop->race = rc_find(race);
|
||||
drop->x = x;
|
||||
drop->y = y;
|
||||
drop->fno = -1;
|
||||
drop->next = dropouts;
|
||||
dropouts = drop;
|
||||
}
|
||||
}
|
||||
fclose(F);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -187,10 +237,12 @@ seed_dropouts(void)
|
|||
while (*dropp) {
|
||||
dropout *drop = *dropp;
|
||||
region * r = findregion(drop->x, drop->y);
|
||||
if (r && r->units==NULL) {
|
||||
if (r) {
|
||||
boolean found = false;
|
||||
newfaction **nfp = &newfactions;
|
||||
while (*nfp) {
|
||||
unit * u;
|
||||
for (u=r->units;u;u=u->next) if (u->faction->no==drop->fno) break;
|
||||
if (u==NULL) while (*nfp) {
|
||||
newfaction * nf = *nfp;
|
||||
if (nf->race==drop->race) {
|
||||
unit * u = addplayer(r, nf->email, nf->race, nf->lang);
|
||||
|
@ -202,7 +254,7 @@ seed_dropouts(void)
|
|||
}
|
||||
nfp = &nf->next;
|
||||
}
|
||||
if (found) dropp=&drop->next;
|
||||
if (!found) dropp=&drop->next;
|
||||
} else {
|
||||
*dropp = drop->next;
|
||||
}
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
extern const char * orderfile;
|
||||
extern char *reportdir;
|
||||
extern char *datadir;
|
||||
extern char *basedir;
|
||||
|
@ -1447,6 +1448,9 @@ main(int argc, char *argv[])
|
|||
else
|
||||
turn = atoi(argv[++i]);
|
||||
break;
|
||||
case 'v':
|
||||
orderfile = argv[++i];
|
||||
break;
|
||||
case 'x':
|
||||
maxregions = atoi(argv[++i]);
|
||||
maxregions = (maxregions*81+80) / 81;
|
||||
|
|
|
@ -5761,17 +5761,23 @@
|
|||
</locale>
|
||||
</message>
|
||||
|
||||
<message name="teach">
|
||||
<message name="teach_student" section="study">
|
||||
<type>
|
||||
<arg name="teacher" type="unit"></arg>
|
||||
<arg name="student" type="unit"></arg>
|
||||
<arg name="skill" type="skill"></arg>
|
||||
</type>
|
||||
<locale name="de">
|
||||
<nr section="study">
|
||||
<text>"$unit($teacher) lehrt $unit($student) $skill($skill)."</text>
|
||||
</nr>
|
||||
</locale>
|
||||
<text locale="de">"$unit($teacher) lehrt $unit($student) $skill($skill)."</text>
|
||||
</message>
|
||||
|
||||
<message name="teach_teacher" section="study">
|
||||
<type>
|
||||
<arg name="teacher" type="unit"></arg>
|
||||
<arg name="student" type="unit"></arg>
|
||||
<arg name="skill" type="skill"></arg>
|
||||
<arg name="level" type="int"></arg>
|
||||
</type>
|
||||
<text locale="de">"$unit($teacher) lehrt $unit($student) $skill($skill) auf Stufe $int($level)."</text>
|
||||
</message>
|
||||
|
||||
<message name="teachdumb">
|
||||
|
|
|
@ -3308,17 +3308,23 @@
|
|||
</locale>
|
||||
</message>
|
||||
|
||||
<message name="teach">
|
||||
<message name="teach_student" section="study">
|
||||
<type>
|
||||
<arg name="teacher" type="unit"></arg>
|
||||
<arg name="student" type="unit"></arg>
|
||||
<arg name="skill" type="skill"></arg>
|
||||
</type>
|
||||
<locale name="en">
|
||||
<nr section="none">
|
||||
<text>"$unit($teacher) teaches $unit($student) $skill($skill)."</text>
|
||||
</nr>
|
||||
</locale>
|
||||
<text locale="en">"$unit($teacher) teaches $unit($student) $skill($skill)."</text>
|
||||
</message>
|
||||
|
||||
<message name="teach_teacher" section="study">
|
||||
<type>
|
||||
<arg name="teacher" type="unit"></arg>
|
||||
<arg name="student" type="unit"></arg>
|
||||
<arg name="skill" type="skill"></arg>
|
||||
<arg name="level" type="int"></arg>
|
||||
</type>
|
||||
<text locale="en">"$unit($teacher) teaches $unit($student) $skill($skill) to level $int($level)."</text>
|
||||
</message>
|
||||
|
||||
<message name="spydetect">
|
||||
|
|
Loading…
Reference in New Issue