1
0
Fork 0

Added a ship model system

This commit is contained in:
Michaël Lemaire 2015-05-05 21:49:33 +02:00
parent dcbfbca891
commit 301bce75e0
8 changed files with 84 additions and 11 deletions

1
TODO
View file

@ -3,4 +3,3 @@
* Add retreat from battle
* Refactor the tooltip system to use it more
* Flash ship icons that receive damage
* Add a ship model system

View file

@ -14,6 +14,9 @@ module SpaceTac.Game {
// Name of the ship
name: string;
// Code of the ShipModel used to create it
model: string;
// Flag indicating if the ship is alive
alive: boolean;
@ -67,6 +70,7 @@ module SpaceTac.Game {
this.fleet = fleet || new Fleet();
this.level = 1;
this.name = name;
this.model = "default";
this.alive = true;
this.initiative = this.newAttribute(AttributeCode.Initiative);
this.initiative.setMaximal(1);

View file

@ -13,16 +13,20 @@ module SpaceTac.Game {
// Generate a ship of a given level
// The ship will not be named, nor will be a member of any fleet
generate(level: number): Ship {
generate(level: number, model: ShipModel = null): Ship {
var result = new Ship();
var loot = new LootGenerator(this.random);
// Add equipment slots
result.addSlot(SlotType.Armor);
result.addSlot(SlotType.Engine);
result.addSlot(SlotType.Power);
result.addSlot(SlotType.Shield);
result.addSlot(SlotType.Weapon);
if (!model) {
// Get a random model
model = ShipModel.getRandomModel(level, this.random);
}
// Apply model
result.model = model.code;
model.slots.forEach((slot: SlotType) => {
result.addSlot(slot);
});
// Fill equipment slots
result.slots.forEach((slot: Slot) => {

48
src/app/game/ShipModel.ts Normal file
View file

@ -0,0 +1,48 @@
module SpaceTac.Game {
"use strict";
// A model of ship
// It defines the ship looks, and available slots for equipment
export class ShipModel {
// Code to identify the model
code: string;
// Minimal level to use this model
level: number;
// Available slots
slots: SlotType[];
constructor(code: string, level: number, ...slots: SlotType[]) {
this.code = code;
this.level = level;
this.slots = slots;
}
// Get the default ship model collection available in-game
static getDefaultCollection(): ShipModel[] {
// TODO Store in cache
var result = [];
result.push(new ShipModel("scout", 1, SlotType.Armor, SlotType.Engine, SlotType.Power, SlotType.Weapon));
result.push(new ShipModel("whirlwind", 1, SlotType.Armor, SlotType.Engine, SlotType.Power, SlotType.Shield,
SlotType.Weapon, SlotType.Weapon));
return result;
}
// Pick a random model in the default collection
static getRandomModel(level: Number, random: RandomGenerator = new RandomGenerator()): ShipModel {
var collection = this.getDefaultCollection();
collection = collection.filter((model: ShipModel) => {
return model.level <= level;
});
var result = random.choice(collection);
if (!result) {
console.error("Couldn't pick a random model for level " + level.toString());
}
return result;
}
}
}

View file

@ -1,6 +1,6 @@
/// <reference path="../../definitions/jasmine.d.ts"/>
module SpaceTac.Game {
module SpaceTac.Game.Specs {
"use strict";
describe("Ship", function () {

View file

@ -0,0 +1,18 @@
/// <reference path="../../definitions/jasmine.d.ts"/>
module SpaceTac.Game.Specs {
"use strict";
describe("ShipGenerator", function () {
it("can use ship model", function () {
var gen = new ShipGenerator();
var model = new ShipModel("test", 1, SlotType.Shield, SlotType.Weapon, SlotType.Weapon);
var ship = gen.generate(1, model);
expect(ship.model).toBe("test");
expect(ship.slots.length).toBe(3);
expect(ship.slots[0].type).toBe(SlotType.Shield);
expect(ship.slots[1].type).toBe(SlotType.Weapon);
expect(ship.slots[2].type).toBe(SlotType.Weapon);
});
});
}

View file

@ -22,7 +22,7 @@ module SpaceTac.View {
super(battleview.game);
// Add ship sprite
this.sprite = new Phaser.Button(battleview.game, 0, 0, "ship-scout-sprite");
this.sprite = new Phaser.Button(battleview.game, 0, 0, "ship-" + ship.model + "-sprite");
this.sprite.rotation = ship.arena_angle;
this.sprite.anchor.set(0.5, 0.5);
this.addChild(this.sprite);

View file

@ -41,7 +41,7 @@ module SpaceTac.View {
this.layer_base = new Phaser.Image(this.game, 0, 0, "battle-shiplist-base", 0);
this.addChild(this.layer_base);
this.layer_portrait = new Phaser.Image(this.game, 30, 30, "ship-scout-portrait", 0);
this.layer_portrait = new Phaser.Image(this.game, 30, 30, "ship-" + ship.model + "-portrait", 0);
this.layer_portrait.anchor.set(0.5, 0.5);
this.layer_portrait.scale.set(0.19, 0.19);
this.addChild(this.layer_portrait);