gamedata.java

来自「Java mulitplayer strategy game. Adaptati」· Java 代码 · 共 523 行

JAVA
523
字号
package net.sf.jawp.client;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

import java.util.Map;


import net.sf.jawp.api.domain.BattleReportVO;
import net.sf.jawp.api.domain.Fleet;
import net.sf.jawp.api.domain.GameSpeed;
import net.sf.jawp.api.domain.Planet;
import net.sf.jawp.api.domain.Realm;
import net.sf.jawp.api.domain.stub.FleetVO;
import net.sf.jawp.api.domain.stub.PlanetRO;
import net.sf.jawp.api.service.JAWPGameService;
import net.sf.jawp.gf.api.Resolver;
import net.sf.jawp.util.Log;

/**
 * client view over player data
 * 
 * @author jarek
 * @version $Revision: 1.32 $
 * 
 */
public class GameData
{
	public static final String UNKNOWN_REALM = "?";
	
	
	private static final Log LOG = Log.getLog(GameData.class );
	
	private static final NumberFormat MINUTE_FORMATTER = new DecimalFormat("00");
	
	private static final int SEC_PER_MINUTE = 60;
	
	private static final int SEC_PER_HOUR = SEC_PER_MINUTE * 60;
	
	private static final int SEC_PER_DAY = SEC_PER_HOUR * 24;

	private final JAWPGameService gameService;

	private Realm realmData;

	private GameSpeed gameSpeed;
	
	private final Map<Long, Realm> visibleRealms;
	
	
	
	private final PlanetsHolder planetsHolder;
	
	
	private final FleetHolder fleetsHolder;
	
	private final PlanetResolver planetResolver;
	
	private final Resolver<Realm> realmResolver;
	/**
	 * 
	 * Creates new instance of GameData.
	 * @param game communication service endpoint
	 */
	public GameData(final JAWPGameService game)
	{
		this.gameService = game;
		this.visibleRealms = new HashMap<Long, Realm>();
		
		this.planetsHolder = new PlanetsHolder();
		this.fleetsHolder = new FleetHolder();
		
		
		this.planetResolver = new PlanetResolver();
		this.realmResolver = new RealmResolver();
	}

	private GameSpeed getGameSpeed()
	{
		if ( this.gameSpeed == null)
		{
			this.gameSpeed = this.gameService.getGameSpeed();
		}
		return this.gameSpeed;
	}
	
	public final Collection<Planet> getVisiblePlanets()
	{
		/*if (this.visiblePlanets.isEmpty())
		{
			refreshPlanets();
		}
		return this.visiblePlanets.values();*/
		return convertToPlanet(this.planetsHolder.getAll());
	}

	public final Planet getPlanet(final long key)
	{
		return this.planetsHolder.find(key);
	}
	
	/*private void updateShownFleets()
	{
		// to show
		for (final Fleet f : this.ownFleets.values())
		{

			updateOwnFleet(f);
		}

		// to hide
		for (final long key : this.shownFleets)
		{
			
			if (!this.ownFleets.containsKey(key) )
			{
				final Fleet toHide = getFleet(key);
				addHideFleet(toHide);
			}
			else
			{
				final Fleet f = this.getFleet(key);
				if (f.getTarget() == null)
				{
					addHideFleet(f);
				}
			}

		}
	}*/
	
	public final Fleet getFleet( final long key)
	{
		return this.fleetsHolder.find( key);
	}

	/*private void updateOwnFleet(final Fleet f)
	{
		if (this.shownFleets.contains(f.getKey()))
		{
			// update position only
			this.shownFleets.add(f.getKey());
		}
		else if (f.getTarget() != null
				&& !this.shownFleets.contains(f.getKey()))
		{
			addShowFleet(f);
		}
	}*/

	/*private void addShowFleet(final Fleet f)
	{
		this.showFleets.add(f.getKey());
	}

	private void addHideFleet(final Fleet f)
	{
		this.hideFleets.add(f);
	}*/

	public final Collection<Fleet> getFleetsToShow()
	{
		return convertToFleet( this.fleetsHolder.getAdded() );
	}

	public final Collection<Fleet> getFleetsToHide()
	{
		return convertToFleet( this.fleetsHolder.getRemoved() );
	}

	public final Collection<Fleet> getFleetsToUpdate()
	{
		return convertToFleet( this.fleetsHolder.getUpdated() );
	}

	public final Collection<Fleet> getOwnFleets()
	{
		return convertToFleet( this.fleetsHolder.getAll() );
	}

	public Collection<Planet> getUpdateOwnerShipCollection()
	{
		return convertToPlanet(this.planetsHolder.getUpdated());
	}
	
	public Collection<Planet> getAddedPlanets()
	{
		return convertToPlanet(this.planetsHolder.getAdded());
	}
	
	public final Realm getRealm()
	{
		if (this.realmData == null)
		{
			loadOwnRealm();
		}
		return this.realmData;
	}

	public final void moveFleet(final Planet from, final Planet to, final int sz)
	{
		final long startTime = System.currentTimeMillis(); 
		this.gameService.moveFleet(from.getKey(), to.getKey(), sz);
		final PlanetRO pl = this.planetsHolder.find(from.getKey() );
		pl.setHomeFleetSize( pl.getHomeFleetSize() - sz); //TODO: this is semihack
		assert LOG.debug(System.currentTimeMillis() - startTime + "ms to send move order");
	}

	private Realm getRealm(final long key)
	{

		final Realm visible = this.visibleRealms.get(key);
		if (visible == null)
		{
			return loadRealm(key);
		}
		else
		{
			return visible;
		}
	}

	private Realm loadRealm(final long key)
	{
		final Realm result = this.gameService.getOtherRealm(key);
		this.visibleRealms.put(result.getKey(), result);
		return result;
	}

	public final String getRealmName(final long key)
	{
		final Realm realm = getRealm(key);
		if (realm != null)
		{
			return realm.getName();
		}
		else
		{
			return GameData.UNKNOWN_REALM;
		}
	}
	
	private Realm loadOwnRealm()
	{
		this.realmData = gameService.getRealm();
		this.visibleRealms.put ( this.realmData.getKey() , this.realmData);
		return realmData;
	}

	public final void refresh()
	{
		loadOwnRealm();
		refreshPlanets();
		refreshVisibleFleets();
		refreshRealms();
	}

	private void refreshPlanets()
	{
		final Collection<Planet> allPlanets = this.gameService.getPlanets();

		this.planetsHolder.bulkRefresh(convertToPlanetRO(allPlanets));
		
		
		
		

	}

	private void refreshVisibleFleets()
	{
		final Collection<Fleet> allFleets = this.gameService.getOwnFleets();
		this.fleetsHolder.bulkRefresh( removeHomeFleets(convertToFleetVO(allFleets)));
	}

/*	private void refreshFleet(final Fleet f)
	{
		final Fleet old = this.oldFleets.get(f.getKey());
		if (old == null)
		{
			this.ownFleets.put(f.getKey(), f);
		}
		else
		{
			//@todo: update using RO 
			old.setDirection( f.getDirection()); 
			old.setPosition( f.getPosition());
			old.setSize(f.getSize());
			old.setTarget( f.getTarget());
			old.setTargetPosition( f.getTargetPosition());
			this.ownFleets.put(old.getKey(), old);
		}
		
	}*/
	

	public final boolean isOwn(final Planet planet)
	{
		final Planet real = this.getPlanet( planet.getKey());
		return real.getOwner().getKey() == getRealmKey();
	}

	public final boolean isNeutral(final Planet planet)
	{
		final Planet real = this.getPlanet( planet.getKey());
		final long realmKey = real.getOwner().getKey();
		final String realmName = getRealmName(realmKey );
		return realmName.equals("neutral"); //todo: change this to sth more sensible
	}
	
	/**
	 * neutral is also enemy
	 */
	public final boolean isEnemy( final Planet p)
	{
		return !isOwn(p);
	}
		
	private long getRealmKey()
	{
		return getRealm().getKey();
	}
	
	private static class PlanetsHolder extends ClientObjectsHolder<PlanetRO>
	{

		/**
		 * {@inheritDoc}
		 */
		@Override
		protected boolean hasChanged(final PlanetRO old, final PlanetRO newObject)
		{
			return  !old.getOwner().equals( newObject.getOwner());
		}

		/**
		 * {@inheritDoc}
		 */
		@Override
		protected void update(final PlanetRO old, final PlanetRO newObject, final boolean changed)
		{
			if ( changed)
			{
				//assert LOG.debug( "old owner of: " + old.getKey() + " was " + old.getOwner().getKey());
				//assert LOG.debug( "new owner of: " + newObject.getKey() + "  is " + newObject.getOwner().getKey());
				old.setOwner( newObject.getOwner());
			}
			old.setHomeFleetSize( newObject.getHomeFleetSize());
			old.setProduced( newObject.getProduced());
			old.setProductivity( newObject.getProductivity());
		}
		
	}
	
	private static class FleetHolder extends ClientObjectsHolder<FleetVO>
	{
		protected boolean hasChanged(final FleetVO old, final FleetVO newObject)
		{
			return old.getTimeToGo() != newObject.getTimeToGo();
		}

		protected void update(final FleetVO old, final FleetVO f, final boolean changed)
		{
			old.setTimeToGo( f.getTimeToGo());
			old.setDirection( f.getDirection()); 
			old.setPosition( f.getPosition());
			old.setSize(f.getSize());
			old.setTarget( f.getTarget());
			old.setTargetPosition( f.getTargetPosition());
		}
		
	}
	
	
	private Collection<Planet> convertToPlanet( final Collection<PlanetRO> input)
	{
		return new ArrayList<Planet>(input);
	}
	
	private Collection<PlanetRO> convertToPlanetRO( final Collection<Planet> input)
	{
		final ArrayList<PlanetRO> result = new ArrayList<PlanetRO>(input.size());
		for ( final Planet p : input)
		{
			result.add( new PlanetRO(p));
		}
		return result;
	}
	
	private Collection<Fleet> convertToFleet( final Collection<FleetVO> input)
	{
		return new ArrayList<Fleet>(input);
	}
	
	private Collection<FleetVO> removeHomeFleets( final Collection<FleetVO> input)
	{
		
		final ArrayList<FleetVO> result = new ArrayList<FleetVO>( input.size());
		for ( final FleetVO f : input)
		{
			if ( f.getTimeToGo() > 0) 
			{
				result.add ( f);
			}
		}
		result.trimToSize();
		return result;
	}
	
	private Collection<FleetVO> convertToFleetVO( final Collection<Fleet> input)
	{
		final ArrayList<FleetVO> result = new ArrayList<FleetVO>( input.size());
		for ( final Fleet f : input)
		{
			result.add ( new FleetVO( f));
		}
		return result;
	}
	
	

	public final PlanetResolver getPlanetResolver()
	{
		return planetResolver;
	}

	public Resolver<Realm> getRealmResolver()
	{
		return realmResolver;
	}
	
	private class PlanetResolver implements Resolver<Planet>
	{
		public Planet find(final long key)
		{
			return getPlanet(key);
		}
		
	}
	private class RealmResolver implements Resolver<Realm>
	{
		public Realm find(final long key)
		{
			
			final Realm r = getRealm(key);
			//System.out.println("rr:"+r.getName());
			return r;
		}
		
	}
	
	public final Collection<Realm> getKnownRealms()
	{
		return this.visibleRealms.values();
	}
	
	public final void refreshRealms()
	{
		final Collection<Long> keys = this.visibleRealms.keySet();
		for ( final Long key : keys)
		{
			loadRealm(key);
		}
	}
	
	public final Collection<BattleReportVO> getBattleReports()
	{
		return this.gameService.getBattleReports();
	}
	
	public final String getDistanceAsString( final Planet src, final Planet trg)
	{
		final double dist = src.calcDistance( trg );
		
		return convertDistToString(  dist);
	}
	
	private double  convertDistToTime( final double dist)
	{
		return dist / getGameSpeed().getBaseFleetSpeed();
	}
	
	public final String convertDistToString( final double dist)
	{
		return convertTimeToString( (int)convertDistToTime( dist));
	}
	
	public static final String convertTimeToString( final int sec)
	{
		int secs = sec; 
		final int days = secs / SEC_PER_DAY;
		secs = secs % SEC_PER_DAY;
		final int hours = secs / SEC_PER_HOUR;
		secs = secs % SEC_PER_HOUR;
		final int mins = secs / SEC_PER_MINUTE;
		secs  = secs % SEC_PER_MINUTE;
		final StringBuilder sb = new StringBuilder();
		if ( days > 0)
		{
			sb.append( days + "d ");
		}
		if ( hours > 0)
		{
			sb.append( hours + ":");
		}
		if ( mins > 0)
		{
			sb.append( MINUTE_FORMATTER.format( mins) );
			sb.append(':');
		}
		
		sb.append( MINUTE_FORMATTER.format(secs));
		sb.append('s');
		return sb.toString();
	}
	

		
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?