forked from github/server
fix study.c teacher messaging
This commit is contained in:
parent
57f6c56e89
commit
23b211d9e4
2
clibs
2
clibs
|
@ -1 +1 @@
|
||||||
Subproject commit 1052905e08314de8778750d7585474182723111e
|
Subproject commit f91ef37f08c5244bf616f1836c0aa9caaf36805c
|
48
src/sqlite.c
48
src/sqlite.c
|
@ -133,30 +133,41 @@ static void update_faction(sqlite3 *db, const faction *f) {
|
||||||
sqlite3_finalize(stmt);
|
sqlite3_finalize(stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct cb_data {
|
||||||
|
const faction *f;
|
||||||
|
sqlite3 *db;
|
||||||
|
db_faction *dbf;
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool db_faction_cb(void *el, void *arg) {
|
||||||
|
db_faction *df = (db_faction *)el;
|
||||||
|
struct cb_data *cb = (struct cb_data *)arg;
|
||||||
|
const faction *f = cb->f;
|
||||||
|
|
||||||
|
if (f->no == df->no || strcmp(f->email, df->email) == 0 || strcmp(f->name, df->name) == 0) {
|
||||||
|
cb->dbf = df;
|
||||||
|
}
|
||||||
|
if (f->subscription == df->uid) {
|
||||||
|
cb->dbf = df;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
int db_update_factions(sqlite3 * db, bool force, int game_id) {
|
int db_update_factions(sqlite3 * db, bool force, int game_id) {
|
||||||
selist *ql = read_factions(db, game_id);
|
selist *ql = read_factions(db, game_id);
|
||||||
|
if (ql) {
|
||||||
faction *f;
|
faction *f;
|
||||||
|
struct cb_data cbdata;
|
||||||
|
cbdata.db = db;
|
||||||
|
cbdata.dbf = NULL;
|
||||||
sqlite3_exec(db, "BEGIN", 0, 0, 0);
|
sqlite3_exec(db, "BEGIN", 0, 0, 0);
|
||||||
for (f = factions; f; f = f->next) {
|
for (f = factions; f; f = f->next) {
|
||||||
bool update = force;
|
bool update = force;
|
||||||
db_faction *dbf = 0;
|
cbdata.f = f;
|
||||||
<<<<<<< HEAD
|
selist_foreach_ex(ql, db_faction_cb, &cbdata);
|
||||||
ql_iter it = qli_init(&ql);
|
if (cbdata.dbf) {
|
||||||
=======
|
const db_faction *dbf = cbdata.dbf;
|
||||||
#ifdef SELIST_TODO
|
|
||||||
selist_iter it = qli_init(&ql);
|
|
||||||
>>>>>>> remove quicklist shim, use selist everywhere
|
|
||||||
while (qli_more(it)) {
|
|
||||||
db_faction *df = (db_faction*)qli_next(&it);
|
|
||||||
if (f->no == df->no || strcmp(f->email, df->email) == 0 || strcmp(f->name, df->name) == 0) {
|
|
||||||
dbf = df;
|
|
||||||
}
|
|
||||||
if (f->subscription == df->uid) {
|
|
||||||
dbf = df;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (dbf) {
|
|
||||||
if (dbf->uid != f->subscription) {
|
if (dbf->uid != f->subscription) {
|
||||||
log_warning("faction %s(%d) not found in database, but matches %d\n", itoa36(f->no), f->subscription, dbf->uid);
|
log_warning("faction %s(%d) not found in database, but matches %d\n", itoa36(f->no), f->subscription, dbf->uid);
|
||||||
f->subscription = dbf->uid;
|
f->subscription = dbf->uid;
|
||||||
|
@ -174,6 +185,7 @@ int db_update_factions(sqlite3 * db, bool force, int game_id) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlite3_exec(db, "COMMIT", 0, 0, 0);
|
sqlite3_exec(db, "COMMIT", 0, 0, 0);
|
||||||
|
}
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
50
src/study.c
50
src/study.c
|
@ -52,8 +52,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include <util/rand.h>
|
#include <util/rand.h>
|
||||||
#include <util/rng.h>
|
#include <util/rng.h>
|
||||||
#include <util/umlaut.h>
|
#include <util/umlaut.h>
|
||||||
|
#include <selist.h>
|
||||||
#include <quicklist.h>
|
|
||||||
|
|
||||||
/* libc includes */
|
/* libc includes */
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
@ -222,7 +221,7 @@ teach_unit(unit * teacher, unit * student, int nteaching, skill_t sk,
|
||||||
a = a_add(&student->attribs, a_new(&at_learning));
|
a = a_add(&student->attribs, a_new(&at_learning));
|
||||||
teach = (teaching_info *)a->data.v;
|
teach = (teaching_info *)a->data.v;
|
||||||
}
|
}
|
||||||
ql_push(&teach->teachers, teacher);
|
selist_push(&teach->teachers, teacher);
|
||||||
teach->value += n;
|
teach->value += n;
|
||||||
|
|
||||||
if (student->building && teacher->building == student->building) {
|
if (student->building && teacher->building == student->building) {
|
||||||
|
@ -531,6 +530,36 @@ static bool ExpensiveMigrants(void)
|
||||||
return rule;
|
return rule;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct teach_data {
|
||||||
|
unit *u;
|
||||||
|
skill_t sk;
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool cb_msg_teach(void *el, void *arg) {
|
||||||
|
struct teach_data *td = (struct teach_data *)arg;
|
||||||
|
unit *ut = (unit *)el;
|
||||||
|
unit * u = td->u;
|
||||||
|
skill_t sk = td->sk;
|
||||||
|
if (ut->faction != u->faction) {
|
||||||
|
bool feedback = alliedunit(u, ut->faction, HELP_GUARD);
|
||||||
|
if (feedback) {
|
||||||
|
ADDMSG(&ut->faction->msgs, msg_message("teach_teacher",
|
||||||
|
"teacher student skill level", ut, u, sk,
|
||||||
|
effskill(u, sk, 0)));
|
||||||
|
}
|
||||||
|
ADDMSG(&u->faction->msgs, msg_message("teach_student",
|
||||||
|
"teacher student skill", ut, u, sk));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void msg_teachers(struct selist *teachers, struct unit *u, skill_t sk) {
|
||||||
|
struct teach_data cbdata;
|
||||||
|
cbdata.sk = sk;
|
||||||
|
cbdata.u = u;
|
||||||
|
selist_foreach_ex(teachers, cb_msg_teach, &cbdata);
|
||||||
|
}
|
||||||
|
|
||||||
int study_cmd(unit * u, order * ord)
|
int study_cmd(unit * u, order * ord)
|
||||||
{
|
{
|
||||||
region *r = u->region;
|
region *r = u->region;
|
||||||
|
@ -755,19 +784,8 @@ int study_cmd(unit * u, order * ord)
|
||||||
|
|
||||||
learn_skill(u, sk, days);
|
learn_skill(u, sk, days);
|
||||||
if (a != NULL) {
|
if (a != NULL) {
|
||||||
ql_iter qli = qli_init(&teach->teachers);
|
if (teach->teachers) {
|
||||||
while (qli_more(qli)) {
|
msg_teachers(teach->teachers, u, sk);
|
||||||
unit *teacher = (unit *)qli_next(&qli);
|
|
||||||
if (teacher->faction != u->faction) {
|
|
||||||
bool feedback = alliedunit(u, teacher->faction, HELP_GUARD);
|
|
||||||
if (feedback) {
|
|
||||||
ADDMSG(&teacher->faction->msgs, msg_message("teach_teacher",
|
|
||||||
"teacher student skill level", teacher, u, sk,
|
|
||||||
effskill(u, sk, 0)));
|
|
||||||
}
|
|
||||||
ADDMSG(&u->faction->msgs, msg_message("teach_student",
|
|
||||||
"teacher student skill", teacher, u, sk));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
a_remove(&u->attribs, a);
|
a_remove(&u->attribs, a);
|
||||||
a = NULL;
|
a = NULL;
|
||||||
|
|
|
@ -27,7 +27,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct unit;
|
struct unit;
|
||||||
struct quicklist;
|
struct selist;
|
||||||
|
|
||||||
int teach_cmd(struct unit *u, struct order *ord);
|
int teach_cmd(struct unit *u, struct order *ord);
|
||||||
int study_cmd(struct unit *u, struct order *ord);
|
int study_cmd(struct unit *u, struct order *ord);
|
||||||
|
@ -48,7 +48,7 @@ extern "C" {
|
||||||
|
|
||||||
#define TEACHNUMBER 10
|
#define TEACHNUMBER 10
|
||||||
typedef struct teaching_info {
|
typedef struct teaching_info {
|
||||||
struct quicklist *teachers;
|
struct selist *teachers;
|
||||||
int value;
|
int value;
|
||||||
} teaching_info;
|
} teaching_info;
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include <tests.h>
|
#include <tests.h>
|
||||||
|
|
||||||
#include <CuTest.h>
|
#include <CuTest.h>
|
||||||
#include <quicklist.h>
|
#include <selist.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
@ -539,9 +539,9 @@ static void test_teach_message(CuTest *tc) {
|
||||||
teach = (teaching_info *)a->data.v;
|
teach = (teaching_info *)a->data.v;
|
||||||
CuAssertPtrNotNull(tc, teach->teachers);
|
CuAssertPtrNotNull(tc, teach->teachers);
|
||||||
CuAssertIntEquals(tc, 600, teach->value);
|
CuAssertIntEquals(tc, 600, teach->value);
|
||||||
CuAssertIntEquals(tc, 2, ql_length(teach->teachers));
|
CuAssertIntEquals(tc, 2, selist_length(teach->teachers));
|
||||||
CuAssertPtrEquals(tc, u1, ql_get(teach->teachers, 0));
|
CuAssertPtrEquals(tc, u1, selist_get(teach->teachers, 0));
|
||||||
CuAssertPtrEquals(tc, u2, ql_get(teach->teachers, 1));
|
CuAssertPtrEquals(tc, u2, selist_get(teach->teachers, 1));
|
||||||
study_cmd(u, u->thisorder);
|
study_cmd(u, u->thisorder);
|
||||||
CuAssertPtrEquals(tc, NULL, test_find_messagetype(u1->faction->msgs, "teach_teacher"));
|
CuAssertPtrEquals(tc, NULL, test_find_messagetype(u1->faction->msgs, "teach_teacher"));
|
||||||
CuAssertPtrNotNull(tc, test_find_messagetype(u2->faction->msgs, "teach_teacher"));
|
CuAssertPtrNotNull(tc, test_find_messagetype(u2->faction->msgs, "teach_teacher"));
|
||||||
|
|
|
@ -105,10 +105,11 @@ struct cb_data {
|
||||||
struct region *r;
|
struct region *r;
|
||||||
};
|
};
|
||||||
|
|
||||||
void cb_map(void *data, void *ex) {
|
static bool cb_map(void *data, void *ex) {
|
||||||
struct cb_data *cb = (struct cb_data *)ex;
|
struct cb_data *cb = (struct cb_data *)ex;
|
||||||
struct unit *u = (struct unit *)data;
|
struct unit *u = (struct unit *)data;
|
||||||
cb->call(cb->r, u, cb->data);
|
cb->call(cb->r, u, cb->data);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void travelthru_map(region * r, void(*cb)(region *, struct unit *, void *), void *data)
|
void travelthru_map(region * r, void(*cb)(region *, struct unit *, void *), void *data)
|
||||||
|
|
Loading…
Reference in New Issue