/**
* 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 org.lostkingdomsfrontier.pfrpg;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* A ResourcePool is used to track the expending and replenishing of a resource, such as hit points
*
* @author bebopjmm
*
*/
public class ResourcePool
{
static final Log LOG_ = LogFactory.getLog(ResourcePool.class);
/**
* Maximum number of tracked resources in the pool.
*/
private int poolMax_;
/**
* Current number of tracked resources in the pool
*/
private int poolCurrent_;
/**
* Current amount of allowed resources over the maximum
*/
private int surplus_ = 0;
/**
* True if a surplus of resources is allowed for this pool
*/
private boolean isSurplusAllowed_ = false;
/**
* True if a deficit of resources is allowed for this pool
*/
private boolean isDeficitAllowed_ = false;
/**
* Constructs a new ResourcePool
*
* @param max Maximum number of resources the pool can contain
* @param isFilled If true, the pool will be filled to maximum capacity, otherwise the pool will
* be empty.
*/
public ResourcePool(int max, boolean isFilled)
{
this.poolMax_ = max;
if (isFilled) {
this.poolCurrent_ = max;
}
else {
this.poolCurrent_ = 0;
}
}
/**
* @return the maximum capacity of the pool.
*/
public int getPoolMax()
{
return poolMax_;
}
/**
* @return current number of resources in the pool.
*/
public int getPoolCurrent()
{
return poolCurrent_;
}
/**
* @return the current surplus of resources
*/
public int getSurplus()
{
return surplus_;
}
/**
* @return true if a surplus is allowed, otherwise false.
*/
public boolean isSurplusAllowed()
{
return isSurplusAllowed_;
}
/**
* @param isSurplusAllowed the isSurplusAllowed to set
*/
public void setSurplusAllowed(boolean isSurplusAllowed)
{
this.isSurplusAllowed_ = isSurplusAllowed;
}
/**
* @return true if a deficit is allowed, otherwise false.
*/
public boolean isDeficitAllowed()
{
return isDeficitAllowed_;
}
/**
* @param isDeficitAllowed the isDeficitAllowed to set
*/
public void setDeficitAllowed(boolean isDeficitAllowed)
{
this.isDeficitAllowed_ = isDeficitAllowed;
}
/**
* This method changes the maximum capacity of the pool, possibly adjusting the current value by
* the same delta.
*
* @param delta amount to change the capacity
* @param changeCurrent if true, the current value will be changed by the same delta
* @return the updated maximum capacity of the pool
* @throws ResourceException when
*/
public int updateMax(int delta, boolean changeCurrent) throws ResourceException
{
LOG_.debug("Max size [" + poolMax_ + "] update (" + delta + ") changeCurrent = "
+ changeCurrent);
int oldMax = this.poolMax_;
this.poolMax_ += delta;
if (poolMax_ < 0) {
this.poolMax_ = oldMax;
throw new ResourceException();
}
if (changeCurrent) {
if (delta > 0)
replenish(delta);
else
expend(delta);
}
return this.poolMax_;
}
/**
* This method adds the indicated surplus to the pool, optionally increasing the current value by
* the same amount.
*
* @param surplus amount to add to the allowed pool surplus
* @param fill if true, the current value will be increased
* @throws ResourceException when the pool does not allow a surplus.
*/
public void addSurplus(int surplus, boolean fill) throws ResourceException
{
if (!isSurplusAllowed_) {
throw new ResourceException();
}
this.surplus_ += surplus;
if (fill) {
replenish(surplus);
}
}
/**
* This method decreases the surplus by the indicated amount, optionally also decreasing the
* current value by the same amount.
*
* @param surplus the amount to remove from the allowed pool surplus
* @param withdraw if true, the current value will be decreased
* @throws ResourceException when the amount the remove exceeds the surplus of the pool.
*/
public void removeSurplus(int surplus, boolean withdraw) throws ResourceException
{
if (surplus > this.surplus_) {
throw new ResourceException();
}
this.surplus_ -= surplus;
if (withdraw) {
expend(surplus);
}
}
/**
* Removes the indicate count from the pool. Incurring a deficit when one is not allowed
* (isDeficitAllowed) will result in a ResourceException being thrown.
*
* @param count the amount to expend from the pool.
* @return the amount expended
* @throws ResourceException when count exceeds the current pool size and deficits are not
* allowed.
*/
public synchronized int expend(int count) throws ResourceException
{
if ((count > poolCurrent_) && (!isDeficitAllowed_)) {
throw new ResourceException();
}
poolCurrent_ -= count;
return count;
}
/**
* Adds the indicated count back to the pool.
*
* @param count the amount to replenish into the pool.
* @return the overflow that could not be added to the pool.
*/
public synchronized int replenish(int count)
{
int max = poolMax_ + surplus_;
poolCurrent_ += count;
if (poolCurrent_ <= max) {
return 0;
}
else {
int overflow = poolCurrent_ - max;
poolCurrent_ = max;
return (overflow);
}
}
}