mirror of
https://github.com/brmlab/brmlife.git
synced 2025-08-03 02:13:35 +02:00
Pheromones: Merge tile and agent info in pheromones output
This commit is contained in:
parent
61cdd42252
commit
96208e93ba
2 changed files with 27 additions and 5 deletions
3
README
3
README
|
@ -40,7 +40,8 @@ The following inputs (in no particular order) are supported:
|
||||||
x herp
|
x herp
|
||||||
pheromones (<ph>,<ph>,<ph>,...) (<ph>...)...
|
pheromones (<ph>,<ph>,<ph>,...) (<ph>...)...
|
||||||
(<ph>,...) describes set of pheromones on a tile,
|
(<ph>,...) describes set of pheromones on a tile,
|
||||||
in the same order as visual
|
in the same order as visual; if agent is on a tile,
|
||||||
|
its pheromones are merged with tile pheromones
|
||||||
<ph> format is <id>:<intensity>
|
<ph> format is <id>:<intensity>
|
||||||
<id>: pheromone id 0..65535
|
<id>: pheromone id 0..65535
|
||||||
<intensity>: floating-point number
|
<intensity>: floating-point number
|
||||||
|
|
|
@ -41,10 +41,31 @@ connection::senses(int tick_id, class agent &a)
|
||||||
for (int i = 0; i < dir_n; i++) {
|
for (int i = 0; i < dir_n; i++) {
|
||||||
bufp += snprintf(bufp, sizeof(buf) - (bufp - buf), " (");
|
bufp += snprintf(bufp, sizeof(buf) - (bufp - buf), " (");
|
||||||
class pheromones &ps = a.tile->tile_in_dir(dirs[i][0], dirs[i][1]).pheromones;
|
class pheromones &ps = a.tile->tile_in_dir(dirs[i][0], dirs[i][1]).pheromones;
|
||||||
for (std::list<class pheromone>::iterator pi = ps.spectrum.begin(); pi != ps.spectrum.end(); pi++) {
|
class agent *ai = a.tile->tile_in_dir(dirs[i][0], dirs[i][1]).agent;
|
||||||
if (pi != ps.spectrum.begin())
|
if (ai) {
|
||||||
bufp += snprintf(bufp, sizeof(buf) - (bufp - buf), ",");
|
/* We need to merge pheromones. */
|
||||||
bufp += snprintf(bufp, sizeof(buf) - (bufp - buf), "%d:%f", pi->id, pi->val);
|
class pheromones &pt = ai->pheromones;
|
||||||
|
std::list<class pheromone>::iterator pi, pj;
|
||||||
|
for (pi = ps.spectrum.begin(), pj = pt.spectrum.begin();
|
||||||
|
pi != ps.spectrum.end() || pj != pt.spectrum.end(); ) {
|
||||||
|
if (pi != ps.spectrum.begin() || pj != pt.spectrum.begin())
|
||||||
|
bufp += snprintf(bufp, sizeof(buf) - (bufp - buf), ",");
|
||||||
|
int i; double v;
|
||||||
|
if (pj == pt.spectrum.end() || (pi != ps.spectrum.end() && pi->id < pj->id)) {
|
||||||
|
i = pi->id; v = pi->val; ++pi;
|
||||||
|
} else if (pi == ps.spectrum.end() || pj->id < pi->id) {
|
||||||
|
i = pj->id; v = pj->val; ++pj;
|
||||||
|
} else {
|
||||||
|
i = pi->id; v = pi->val + pj->val; ++pi, ++pj;
|
||||||
|
}
|
||||||
|
bufp += snprintf(bufp, sizeof(buf) - (bufp - buf), "%d:%f", i, v);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (std::list<class pheromone>::iterator pi = ps.spectrum.begin(); pi != ps.spectrum.end(); pi++) {
|
||||||
|
if (pi != ps.spectrum.begin())
|
||||||
|
bufp += snprintf(bufp, sizeof(buf) - (bufp - buf), ",");
|
||||||
|
bufp += snprintf(bufp, sizeof(buf) - (bufp - buf), "%d:%f", pi->id, pi->val);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
bufp += snprintf(bufp, sizeof(buf) - (bufp - buf), ")");
|
bufp += snprintf(bufp, sizeof(buf) - (bufp - buf), ")");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue