forked from github/server
remove region.donations, replace with a global list.
This commit is contained in:
parent
d29d38f710
commit
337aca9b3c
|
@ -4,57 +4,76 @@
|
||||||
#include <kernel/faction.h>
|
#include <kernel/faction.h>
|
||||||
#include <kernel/region.h>
|
#include <kernel/region.h>
|
||||||
#include <kernel/messages.h>
|
#include <kernel/messages.h>
|
||||||
|
#include <quicklist.h>
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef struct transfer {
|
||||||
|
struct region *r;
|
||||||
|
struct faction *f1, *f2;
|
||||||
|
int amount;
|
||||||
|
} transfer;
|
||||||
|
|
||||||
|
static quicklist *transfers = 0;
|
||||||
|
|
||||||
|
int cmp_transfer(const void *v1, const void *v2) {
|
||||||
|
const transfer *t1 = (const transfer *)v1;
|
||||||
|
const transfer *t2 = (const transfer *)v2;
|
||||||
|
if (t1->r == t2->r) {
|
||||||
|
if (t1->f1 == t2->f1) {
|
||||||
|
if (t1->f2 == t2->f2) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return t1->f2->no - t2->f2->no;
|
||||||
|
}
|
||||||
|
return t1->f1->no - t2->f1->no;
|
||||||
|
}
|
||||||
|
return t1->r->uid - t2->r->uid;
|
||||||
|
}
|
||||||
|
|
||||||
void add_donation(faction * f1, faction * f2, int amount, region * r)
|
void add_donation(faction * f1, faction * f2, int amount, region * r)
|
||||||
{
|
{
|
||||||
donation *sp;
|
transfer tr, *tf;
|
||||||
|
quicklist *ql = transfers;
|
||||||
|
int qi = 0;
|
||||||
|
|
||||||
sp = r->donations_;
|
tr.r = r;
|
||||||
|
tr.f1 = f1;
|
||||||
while (sp) {
|
tr.f2 = f2;
|
||||||
if (sp->f1 == f1 && sp->f2 == f2) {
|
tr.amount = amount;
|
||||||
sp->amount += amount;
|
if (ql_set_find_ex(&ql, &qi, &tr, cmp_transfer)) {
|
||||||
return;
|
tf = (transfer *)ql_get(ql, qi);
|
||||||
|
tf->amount += amount;
|
||||||
}
|
}
|
||||||
sp = sp->next;
|
else {
|
||||||
|
tf = malloc(sizeof(transfer));
|
||||||
|
memcpy(tf, &tr, sizeof(transfer));
|
||||||
}
|
}
|
||||||
|
ql_set_insert_ex(&transfers, tf, cmp_transfer);
|
||||||
sp = calloc(1, sizeof(donation));
|
|
||||||
sp->f1 = f1;
|
|
||||||
sp->f2 = f2;
|
|
||||||
sp->amount = amount;
|
|
||||||
sp->next = r->donations_;
|
|
||||||
r->donations_ = sp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_donations(void) {
|
void free_donations(void) {
|
||||||
region *r;
|
ql_foreach(transfers, free);
|
||||||
for (r = regions; r; r = r->next) {
|
ql_free(transfers);
|
||||||
while (r->donations_) {
|
transfers = 0;
|
||||||
donation *don = r->donations_;
|
|
||||||
r->donations_ = don->next;
|
|
||||||
free(don);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void report_transfer(faction *f1, faction *f2, region *r, int amount) {
|
||||||
|
struct message *msg = msg_message("donation",
|
||||||
|
"from to amount", f1, f2, amount);
|
||||||
|
r_addmessage(r, f1, msg);
|
||||||
|
r_addmessage(r, f2, msg);
|
||||||
|
msg_release(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void report_donations(void)
|
void report_donations(void)
|
||||||
{
|
{
|
||||||
region *r;
|
ql_iter qli = qli_init(&transfers);;
|
||||||
for (r = regions; r; r = r->next) {
|
|
||||||
while (r->donations_) {
|
while (qli_more(qli)) {
|
||||||
donation *sp = r->donations_;
|
transfer *tf = (transfer *)qli_next(&qli);
|
||||||
if (sp->amount > 0) {
|
if (tf->amount > 0) {
|
||||||
struct message *msg = msg_message("donation",
|
report_transfer(tf->f1, tf->f2, tf->r, tf->amount);
|
||||||
"from to amount", sp->f1, sp->f2, sp->amount);
|
|
||||||
r_addmessage(r, sp->f1, msg);
|
|
||||||
r_addmessage(r, sp->f2, msg);
|
|
||||||
msg_release(msg);
|
|
||||||
}
|
|
||||||
r->donations_ = sp->next;
|
|
||||||
free(sp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,6 @@ extern "C" {
|
||||||
struct message;
|
struct message;
|
||||||
struct message_list;
|
struct message_list;
|
||||||
struct rawmaterial;
|
struct rawmaterial;
|
||||||
struct donation;
|
|
||||||
struct item;
|
struct item;
|
||||||
|
|
||||||
#define MORALE_TAX_FACTOR 0.005 /* 0.5% tax per point of morale */
|
#define MORALE_TAX_FACTOR 0.005 /* 0.5% tax per point of morale */
|
||||||
|
@ -104,12 +103,6 @@ extern "C" {
|
||||||
struct region_owner *ownership;
|
struct region_owner *ownership;
|
||||||
} land_region;
|
} land_region;
|
||||||
|
|
||||||
typedef struct donation {
|
|
||||||
struct donation *next;
|
|
||||||
struct faction *f1, *f2;
|
|
||||||
int amount;
|
|
||||||
} donation;
|
|
||||||
|
|
||||||
typedef struct region {
|
typedef struct region {
|
||||||
struct region *next;
|
struct region *next;
|
||||||
struct land_region *land;
|
struct land_region *land;
|
||||||
|
@ -133,7 +126,6 @@ extern "C" {
|
||||||
struct message_list *msgs;
|
struct message_list *msgs;
|
||||||
} *individual_messages;
|
} *individual_messages;
|
||||||
struct attrib *attribs;
|
struct attrib *attribs;
|
||||||
struct donation *donations_;
|
|
||||||
const struct terrain_type *terrain;
|
const struct terrain_type *terrain;
|
||||||
struct rawmaterial *resources;
|
struct rawmaterial *resources;
|
||||||
#ifdef FAST_CONNECT
|
#ifdef FAST_CONNECT
|
||||||
|
|
Loading…
Reference in New Issue