# メッセージクラスの作り方 "adf-core-java/src/main/java/adf/core/agent/communication/standard/bundle/information"の各エージェントごとにあるメッセージクラスに沿って作り方を紹介します.詳しく見たい方はgithubのリンクに飛べるようにしてあるのでそちらを参照してください. [\[githubのリンク\]](https://github.com/roborescue/adf-core-java/tree/master/src/main/java/adf/core/agent/communication/standard/bundle/information) ## メッセージクラスの作成 informationディレクトリを作成し,その中に"作りたいクラス名".javaを作成します.クラス名はMessage〇〇のようにするとわかりやすいと思います. 例としてMessageCivilian.javaの情報量を削減したaNewMessageCivilian.javaのクラスを以下に載せます.与えられた引数に応じてクラス内に記述されているメッセージを送信することが可能です. ```java= package autumn_2023.module.comm; import adf.core.agent.communication.standard.bundle.StandardMessage; import adf.core.agent.communication.standard.bundle.StandardMessagePriority; import adf.core.component.communication.util.BitOutputStream; import adf.core.component.communication.util.BitStreamReader; import rescuecore2.standard.entities.Civilian; import rescuecore2.worldmodel.EntityID; public class NewMessageCivilian extends StandardMessage { public static final int I_AM_POLICE_FORCE = 0; public static final int I_AM_FIRE_BRIGADE = 1; public static final int I_AM_AMBULANCE_TEAM = 2; private final EntityID positionID; private final int agentType; private final int SIZE_POSITION_ID = 32; private final int SIZE_TYPE_ID = 4; public NewMessageCivilian(boolean isRadio, StandardMessagePriority sendingPriority, EntityID positionID, int agentType) { super(isRadio, sendingPriority); this.positionID = positionID; this.agentType = agentType; } public NewMessageCivilian(boolean isRadio, int senderID, int ttl, BitStreamReader bitStreamReader) { super(isRadio, senderID, ttl, bitStreamReader); this.positionID = new EntityID(bitStreamReader.getBits(SIZE_POSITION_ID)); this.agentType = bitStreamReader.getBits(SIZE_TYPE_ID); } public EntityID getPositionID() { return positionID; } public int getAgentType() { return agentType; } @Override public int getByteArraySize() { return this.toBitOutputStream().size(); } @Override public byte[] toByteArray() { return this.toBitOutputStream().toByteArray(); } @Override public BitOutputStream toBitOutputStream() { final BitOutputStream bitOutputStream = new BitOutputStream(); bitOutputStream.writeBits(this.positionID.getValue(), SIZE_POSITION_ID); bitOutputStream.writeBits(this.agentType, SIZE_TYPE_ID); return bitOutputStream; } @Override public String getCheckKey() { return String.format("Rescue Request Position ID : " + this.positionID.getValue()); } } ``` ## MessageCoordinatorの登録 MessageCoordinatorのMessageCivilianを新たに作成したNewMessageCivilianに変更してください. DefaultMessageCoordinatorを使用している場合は新たにMessageCoordinatorを作成してください. ```java=50 if (msg instanceof MessageBuilding) { fireBrigadeMessages.add(msg); } else if (msg instanceof NewMessageCivilian) { fireBrigadeMessages.add(msg); ambulanceMessages.add(msg); } else if (msg instanceof MessageRoad) { fireBrigadeMessages.add(msg); ambulanceMessages.add(msg); policeMessages.add(msg); } else if (msg instanceof CommandAmbulance) { ambulanceMessages.add(msg); } else if (msg instanceof CommandFire) { fireBrigadeMessages.add(msg); } else if (msg instanceof CommandPolice) { policeMessages.add(msg); } else if (msg instanceof CommandScout) { if (agentType == StandardEntityURN.FIRE_STATION) { fireBrigadeMessages.add(msg); } else if (agentType == StandardEntityURN.POLICE_OFFICE) { policeMessages.add(msg); } else if (agentType == StandardEntityURN.AMBULANCE_CENTRE) { ambulanceMessages.add(msg); } } ``` ## メッセージクラスの利用 先ほど作ったメッセージクラスを使うにはクラスを登録する必要があります. 1シミュレーションステップのうち初めに実行されるモジュールのupdateInfo()内で登録するようにしましょう.登録する際この処理は一回だけおこなわれるように注意してください.作成したメッセージクラスをインポートするようにしてください. ```java= import "作成したメッセージクラスのパス" ``` ```java= final int index = new StandardMessageBundle().getMessageClassList().size() + 1; mm.registerMessageClass(index, "作成したクラス名".class); ``` :::info **NOTE:** this.agent.Timestepでステップ数を取ることができるため,1ステップ目でのみ実行するといいと思います. :::