/*TODO should only happen in tick phase... * Otherwise two bots could validly reproduce into same cell... * one would succeed and the other would not. * Or would kill the newborn or something. Bad. */ public void addNewEntity(AbsPos target, Entity toAdd) { // target position for new entity should be empty checkNotNull(toAdd); assert (grid.get(target) != DEBUG_PENDING_CHANGE_PLACEHOLDER); assert (grid.get(target) == null); assert (!addBuffer.contains(toAdd)); grid.set( target, DEBUG_PENDING_CHANGE_PLACEHOLDER); // TODO removeme; pending new ent; don't want anything // else to happen here addBuffer.add(new Entry<Entity>(target, toAdd)); }
public void swap(AbsPos a, AbsPos b) { Entity aEnt = get(a); if (aEnt instanceof BotEntity) { botIndex.put(((BotEntity) aEnt).getID(), b); } Entity bEnt = get(b); if (bEnt instanceof BotEntity) { botIndex.put(((BotEntity) bEnt).getID(), a); } grid.set(a, bEnt); grid.set(b, aEnt); }
private void flushRemoveBuffer() { while (!removeBuffer.isEmpty()) { Entity fakeEntToDie = removeBuffer.remove(); Entry<Entity> entry = grid.get(fakeEntToDie); AbsPos pos = entry.getPosition(); Entity entToDie = entry.getContents(); if (entToDie instanceof BotEntity) { BotEntity botToDie = ((BotEntity) entToDie); botIndex.remove(botToDie.getID()); } grid.set(pos, null); MatchLog.removeEntity(entToDie); } }
private void flushAddBuffer() { while (!addBuffer.isEmpty()) { Entry<Entity> entry = addBuffer.remove(); Entity toAdd = entry.getContents(); AbsPos addPos = entry.getPosition(); assert (!grid.contains(toAdd)); assert (grid.get(addPos) == DEBUG_PENDING_CHANGE_PLACEHOLDER); if (toAdd instanceof BotEntity) { BotEntity newBot = (BotEntity) toAdd; botIndex.put(newBot.getID(), addPos); } grid.set(addPos, toAdd); MatchLog.addEntity(toAdd, addPos); } }