155 lines
5.3 KiB
TypeScript
155 lines
5.3 KiB
TypeScript
import { SkewedRandomGenerator } from "../common/RandomGenerator";
|
|
import { RObjectContainer } from "../common/RObject";
|
|
import { testing } from "../common/Testing";
|
|
import { nn } from "../common/Tools";
|
|
import { Fleet } from "./Fleet";
|
|
import { GameSession } from "./GameSession";
|
|
import { StarLocation, StarLocationType } from "./StarLocation";
|
|
|
|
testing("GameSession", test => {
|
|
/**
|
|
* Compare two sessions
|
|
*/
|
|
function compare(session1: GameSession, session2: GameSession) {
|
|
test.check.equals(session1, session2);
|
|
}
|
|
|
|
/**
|
|
* Apply deterministic game steps
|
|
*/
|
|
function applyGameSteps(session: GameSession): void {
|
|
var battle = nn(session.getBattle());
|
|
battle.advanceToNextShip();
|
|
// TODO Make some fixed moves (AI?)
|
|
battle.endBattle(battle.fleets[0]);
|
|
}
|
|
|
|
test.case("serializes to a string", check => {
|
|
var session = new GameSession();
|
|
session.startQuickBattle();
|
|
|
|
// Dump and reload
|
|
var dumped = session.saveToString();
|
|
var loaded_session = GameSession.loadFromString(dumped);
|
|
|
|
// Check equality
|
|
compare(loaded_session, session);
|
|
|
|
// Apply game steps
|
|
applyGameSteps(session);
|
|
applyGameSteps(loaded_session);
|
|
|
|
// Check equality after game steps
|
|
compare(loaded_session, session);
|
|
});
|
|
|
|
test.case("generates a quick battle", check => {
|
|
var session = new GameSession();
|
|
session.startQuickBattle();
|
|
|
|
check.same(session.getBattle(), session.player.fleet.battle, "battle");
|
|
check.same(session.player.fleet, session.fleet, "fleet");
|
|
check.same(nn(session.getBattle()).fleets[0], session.fleet, "attacker fleet");
|
|
});
|
|
|
|
test.case("applies battle outcome to bound player", check => {
|
|
let session = new GameSession();
|
|
check.equals(session.getBattle(), null);
|
|
|
|
let location1 = new StarLocation();
|
|
let location2 = new StarLocation(location1.star);
|
|
session.universe.locations = new RObjectContainer([location1, location2]);
|
|
|
|
// Victory case
|
|
location1.encounter = new Fleet();
|
|
session.player.fleet.setLocation(location1);
|
|
check.notequals(session.getBattle(), null);
|
|
check.notequals(location1.encounter, null);
|
|
|
|
let battle = nn(session.getBattle());
|
|
battle.endBattle(session.player.fleet);
|
|
session.setBattleEnded();
|
|
check.notequals(session.getBattle(), null);
|
|
check.equals(location1.encounter, null);
|
|
|
|
// Defeat case
|
|
location2.encounter = new Fleet();
|
|
session.player.fleet.setLocation(location2);
|
|
check.notequals(session.getBattle(), null);
|
|
check.notequals(location2.encounter, null);
|
|
|
|
battle = nn(session.getBattle());
|
|
battle.endBattle(null);
|
|
session.setBattleEnded();
|
|
check.notequals(session.getBattle(), null);
|
|
check.notequals(location2.encounter, null);
|
|
});
|
|
|
|
test.case("generates a new campaign", check => {
|
|
let session = new GameSession();
|
|
|
|
session.startNewGame(false);
|
|
check.notequals(session.player, null);
|
|
check.equals(session.player.fleet.ships.length, 0);
|
|
check.equals(session.player.fleet.credits, 0);
|
|
check.equals(session.universe.stars.length, 50);
|
|
check.equals(session.getBattle(), null);
|
|
check.equals(session.start_location.shop, null);
|
|
check.equals(session.start_location.encounter, null);
|
|
check.equals(session.start_location.encounter_gen, true);
|
|
|
|
session.setCampaignFleet();
|
|
check.equals(session.player.fleet.ships.length, 2);
|
|
check.equals(session.player.fleet.credits, 0);
|
|
check.equals(session.player.fleet.location, session.start_location.id);
|
|
});
|
|
|
|
test.case("can revert battle", check => {
|
|
let session = new GameSession();
|
|
let star = session.universe.addStar();
|
|
let loc1 = star.addLocation(StarLocationType.PLANET);
|
|
loc1.clearEncounter();
|
|
let loc2 = star.addLocation(StarLocationType.PLANET);
|
|
loc2.encounter_random = new SkewedRandomGenerator([0], true);
|
|
session.universe.updateLocations();
|
|
|
|
session.fleet.setLocation(loc1);
|
|
check.in("init in loc1", check => {
|
|
check.equals(session.getBattle(), null, "bound battle");
|
|
check.equals(session.fleet.location, loc1.id, "fleet location");
|
|
check.equals(session.player.hasVisitedLocation(loc2), false, "visited");
|
|
});
|
|
|
|
session.fleet.setLocation(loc2);
|
|
check.in("move to loc2", check => {
|
|
check.notequals(session.getBattle(), null, "bound battle");
|
|
check.equals(session.fleet.location, loc2.id, "fleet location");
|
|
check.equals(session.player.hasVisitedLocation(loc2), true, "visited");
|
|
});
|
|
let enemy = loc2.encounter;
|
|
|
|
session.revertBattle();
|
|
check.in("reverted", check => {
|
|
check.equals(session.getBattle(), null, "bound battle");
|
|
check.equals(session.fleet.location, loc1.id, "fleet location");
|
|
check.equals(session.player.hasVisitedLocation(loc2), true, "visited");
|
|
});
|
|
|
|
session.fleet.setLocation(loc2);
|
|
check.in("move to loc2 again", check => {
|
|
check.notequals(session.getBattle(), null, "bound battle");
|
|
check.equals(session.fleet.location, loc2.id, "fleet location");
|
|
check.equals(session.player.hasVisitedLocation(loc2), true, "visited");
|
|
check.same(nn(session.getBattle()).fleets[1], nn(enemy), "same enemy");
|
|
});
|
|
});
|
|
|
|
/*test.case("can generate lots of new games", check => {
|
|
range(20).forEach(() => {
|
|
let session = new GameSession();
|
|
session.startNewGame();
|
|
check.equals(session.universe.stars.length, 50);
|
|
});
|
|
});*/
|
|
});
|