public boolean isReachableTo(StandardEntity se) { if (se instanceof Human) { Human hum = (Human) se; if (agent.getVisibleEntities(Human.class).contains(hum) && hum.isPositionDefined() && hum.getAreaPosition().isBlockadesDefined()) { for (Blockade blockade : hum.getAreaPosition().getBlockades()) { if (blockade.getShape().contains(hum.getPositionPoint().toGeomPoint())) return false; } } if (!hum.getImReachableToEdges().isEmpty()) return agent .move .getMoveType(PoliceReachablityMove.class) .isReallyReachableTo(hum.getImReachableToEdges()); } return isReachableTo(se.getPositionPair()); }
private void chooseHumanMessages() { PriorityQueue<Human> validHumans = new PriorityQueue<Human>( 50, new Comparator<Human>() { @Override public int compare(Human o1, Human o2) { return o2.updatedtime() - o1.updatedtime(); } }); for (Human hm : agent.model().humans()) { if ((hm.isHPDefined() && hm.isPositionDefined()) && (hm.getRescueInfo().getIgnoredUntil() == 1000 || (hm.getHP() < 10000 && hm.getPositionArea() instanceof Refuge) || hm.getHP() == 0)) { if (agent instanceof SOSAgent<?>) { SOSAgent<?> sosAgent = ((SOSAgent<?>) agent); sosAgent.sosLogger.noComunication.debug( hm + " ignoreUntil:" + hm.getRescueInfo().getIgnoredUntil() + " " + hm.getRescueInfo().getIgnoreReason() + " " + hm.fullDescription()); } MessageBlock messageBlock = new MessageBlock(HEADER_IGNORED_TARGET); messageBlock.addData(DATA_ID, hm.getID().getValue()); messageBlock.setPriority(8); sayMessages.add(messageBlock); } else if (hm.isPositionDefined() && ((hm.isDamageDefined() && hm.getDamage() > 0) || (hm.isBuriednessDefined() && hm.getBuriedness() > 0)) && hm.getHP() > 0 && !hm.getRescueInfo().isIgnored()) { int deathTime; if (agent instanceof AmbulanceTeamAgent) { deathTime = hm.getRescueInfo().getDeathTime(); } else deathTime = SimpleDeathTime.getEasyLifeTime(hm.getHP(), hm.getDamage(), hm.updatedtime()); if (deathTime - hm.getBuriedness() / 2 > agent.model().time()) validHumans.add(hm); } } // Collections.sort(validHumans, new Comparator<Human>() { // @Override // public int compare(Human o1, Human o2) { // return o2.updatedtime() - o1.updatedtime(); // } // }); int priority = 10; int count = 0; for (Human hm : validHumans) { count++; if (priority > 0 && count % 10 == 0) priority--; if (hm instanceof Civilian) { MessageBlock messageBlock = new MessageBlock(HEADER_SENSED_CIVILIAN); messageBlock.addData(DATA_ID, hm.getID().getValue()); messageBlock.addData(DATA_AREA_INDEX, hm.getPositionArea().getAreaIndex()); messageBlock.addData(DATA_HP, hm.getHP() / 322); int damage = hm.getDamage(); if (damage > 1200) damage = 1200; messageBlock.addData(DATA_DAMAGE, damage / 10); int buried = hm.getBuriedness(); if (buried > 126) buried = 126; messageBlock.addData(DATA_BURIEDNESS, buried); messageBlock.addData(DATA_TIME, hm.updatedtime()); boolean isReallyReachable; if (agent instanceof SOSAgent<?>) isReallyReachable = !((SOSAgent<?>) agent) .move.isReallyUnreachableXYPolice(hm.getPositionArea().getPositionPair()); else isReallyReachable = false; messageBlock.addData(DATA_IS_REALLY_REACHABLE, isReallyReachable ? 1 : 0); messageBlock.setPriority(priority); sayMessages.add(messageBlock); } else { MessageBlock messageBlock = new MessageBlock(HEADER_SENSED_AGENT); messageBlock.addData(DATA_AGENT_INDEX, hm.getAgentIndex()); messageBlock.addData(DATA_AREA_INDEX, hm.getPositionArea().getAreaIndex()); messageBlock.addData(DATA_HP, hm.getHP() / 322); int damage = hm.getDamage(); if (damage > 1200) damage = 1200; messageBlock.addData(DATA_DAMAGE, damage / 10); int buried = hm.getBuriedness(); if (buried > 126) buried = 126; messageBlock.addData(DATA_BURIEDNESS, buried); messageBlock.addData(DATA_TIME, hm.updatedtime()); messageBlock.setPriority(priority); sayMessages.add(messageBlock); } } }