/*******************************************************************************
* Copyright 2014 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.badlogic.gdx.ai.msg;
import com.almasb.fxgl.core.pool.Poolable;
/**
* A Telegram is the container of a message. The {@link MessageDispatcher} manages telegram life-cycle.
*
* @author davebaol
*/
public class Telegram implements Comparable<Telegram>, Poolable {
/**
* Indicates that the sender doesn't need any return receipt
*/
public static final int RETURN_RECEIPT_UNNEEDED = 0;
/**
* Indicates that the sender needs the return receipt
*/
public static final int RETURN_RECEIPT_NEEDED = 1;
/**
* Indicates that the return receipt has been sent back to the original sender of the telegram
*/
public static final int RETURN_RECEIPT_SENT = 2;
/**
* The agent that sent this telegram
*/
public Telegraph sender;
/**
* The agent that is to receive this telegram
*/
public Telegraph receiver;
/**
* The message type.
*/
public int message;
/**
* The return receipt status of this telegram. Its value should be {@link #RETURN_RECEIPT_UNNEEDED}, {@link #RETURN_RECEIPT_NEEDED} or
* {@link #RETURN_RECEIPT_SENT}.
*/
public int returnReceiptStatus;
/**
* Messages can be dispatched immediately or delayed for a specified amount of time. If a delay is necessary, this field is
* stamped with the time the message should be dispatched.
*/
private float timestamp;
/**
* Any additional information that may accompany the message
*/
public Object extraInfo;
/**
* Creates an empty {@code Telegram}.
*/
public Telegram() {
}
/**
* Returns the time stamp of this telegram.
*/
public float getTimestamp() {
return timestamp;
}
/**
* Sets the time stamp of this telegram.
*/
public void setTimestamp(float timestamp) {
this.timestamp = timestamp;
}
@Override
public void reset() {
this.sender = null;
this.receiver = null;
this.message = 0;
this.returnReceiptStatus = RETURN_RECEIPT_UNNEEDED;
this.extraInfo = null;
this.timestamp = 0;
}
@Override
public int compareTo(Telegram other) {
if (this.equals(other)) return 0;
return (this.timestamp - other.timestamp < 0) ? -1 : 1;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + message;
result = prime * result + ((receiver == null) ? 0 : receiver.hashCode());
result = prime * result + ((sender == null) ? 0 : sender.hashCode());
result = prime * result + Float.floatToIntBits(timestamp);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
Telegram other = (Telegram) obj;
if (message != other.message) return false;
if (Float.floatToIntBits(timestamp) != Float.floatToIntBits(other.timestamp)) return false;
if (sender == null) {
if (other.sender != null) return false;
} else if (!sender.equals(other.sender)) return false;
if (receiver == null) {
if (other.receiver != null) return false;
} else if (!receiver.equals(other.receiver)) return false;
return true;
}
}