/*** creatures ***/ int maxCrtrs = 1000; Creature[] crtrs = new Creature[maxCrtrs]; int numCrtrs = 0; int numStart = 20; color[] colors = {color(192, 64, 64), color(64, 192, 64), color(64, 64, 129)}; int numSelected = 0; int[] sIds = new int[maxCrtrs]; int numMatched = 0; int[] mIds = new int[maxCrtrs]; boolean joinCreatures = false; void init_creatures() { for (int i = 0; i < numStart; i++) { crtrs[i] = new Creature(i); crtrs[i].init(); } numCrtrs = numStart; } void run_creatures() { for (int i = 0; i < numCrtrs; i++) { if (crtrs[i].alive) { crtrs[i].be(); } } watch_creatures(); } void watch_creatures() { count_num_selected(); boolean oneColor = one_color(); if (numSelected > 1) { if (!oneColor) { s.kill(); } else { set_as_matched(); s.kill(); } } if (joinCreatures) { join_creatures(); } } void count_num_selected() { numSelected = 0; int j = 0; for (int i = 0; i < numCrtrs; i++) { if (crtrs[i].selected && crtrs[i].alive) { numSelected++; sIds[j] = crtrs[i].id; j++; } } } boolean one_color () { if (numSelected > 1) { color comp = crtrs[sIds[0]].c; for (int i = 1; i < numSelected; i++) { if (crtrs[sIds[i]].c != comp) { return false; } } } return true; } void set_as_matched() { float x = 0, y = 0; for (int i = 0; i < numSelected; i++) { x += crtrs[sIds[i]].p.x; y += crtrs[sIds[i]].p.y; } x /= numSelected; y /= numSelected; for (int i = 0; i < numSelected; i++) { crtrs[sIds[i]].matched(x, y); } mIds = sIds; numMatched = numSelected; } void join_creatures() { println("joining ..."); float d = 0; Position p = new Position(crtrs[mIds[0]].p); color c = crtrs[mIds[0]].c; for (int i = 0; i < numMatched; i++) { d += crtrs[mIds[i]].diameter; crtrs[mIds[i]].kill(); } crtrs[numCrtrs] = new Creature(numCrtrs); crtrs[numCrtrs].set(p, d, c); numCrtrs++; numMatched = 0; joinCreatures = false; println("joined!"); }