1
0
Fork 0

character sheet: Added equipment display in slots and cargo slots

This commit is contained in:
Michaël Lemaire 2017-03-05 18:48:13 +01:00
parent 3f336c8d11
commit 0cdc7b3def
9 changed files with 86 additions and 5 deletions

View file

@ -75,6 +75,10 @@ module TS.SpaceTac {
// List of slots, able to contain equipment
slots: Slot[]
// Cargo
cargo_space: number = 0
cargo: Equipment[] = []
// Ship attributes
attributes = new ShipAttributes()
@ -434,6 +438,13 @@ module TS.SpaceTac {
}
}
/**
* Set the available cargo space.
*/
setCargoSpace(cargo: number) {
this.cargo_space = cargo;
}
// Add an empty equipment slot of the given type
addSlot(type: SlotType): Slot {
var result = new Slot(this, type);

View file

@ -2,9 +2,10 @@ module TS.SpaceTac.Specs {
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 model = new ShipModel("test", 1, 2, SlotType.Shield, SlotType.Weapon, SlotType.Weapon);
var ship = gen.generate(1, model);
expect(ship.model).toBe("test");
expect(ship.cargo_space).toBe(2);
expect(ship.slots.length).toBe(3);
expect(ship.slots[0].type).toBe(SlotType.Shield);
expect(ship.slots[1].type).toBe(SlotType.Weapon);

View file

@ -22,6 +22,7 @@ module TS.SpaceTac {
// Apply model
result.model = model.code;
result.setCargoSpace(model.cargo);
model.slots.forEach((slot: SlotType) => {
result.addSlot(slot);
});

View file

@ -8,12 +8,16 @@ module TS.SpaceTac {
// Minimal level to use this model
level: number;
// Cargo space
cargo: number;
// Available slots
slots: SlotType[];
constructor(code: string, level: number, ...slots: SlotType[]) {
constructor(code: string, level: number, cargo: number, ...slots: SlotType[]) {
this.code = code;
this.level = level;
this.cargo = cargo;
this.slots = slots;
}
@ -22,9 +26,9 @@ module TS.SpaceTac {
// TODO Store in cache
var result = [];
result.push(new ShipModel("scout", 1, SlotType.Hull, SlotType.Power, SlotType.Power, SlotType.Engine, SlotType.Weapon));
result.push(new ShipModel("scout", 1, 2, SlotType.Hull, SlotType.Power, SlotType.Power, SlotType.Engine, SlotType.Weapon));
result.push(new ShipModel("whirlwind", 1, SlotType.Hull, SlotType.Shield, SlotType.Power, SlotType.Engine,
result.push(new ShipModel("whirlwind", 1, 4, SlotType.Hull, SlotType.Shield, SlotType.Power, SlotType.Engine,
SlotType.Weapon, SlotType.Weapon));
return result;

View file

@ -0,0 +1,18 @@
module TS.SpaceTac.UI {
/**
* Display a ship cargo slot
*/
export class CharacterCargo extends Phaser.Image {
constructor(sheet: CharacterSheet, x: number, y: number) {
super(sheet.game, x, y, "character-cargo-slot");
}
/**
* Set the equipment displayed in the slot
*/
setEquipment(equipment: CharacterEquipment | null) {
this.addChild(equipment);
equipment.position.set(98, 98);
}
}
}

View file

@ -0,0 +1,14 @@
module TS.SpaceTac.UI {
/**
* Display a ship equipment, either attached to a slot, in cargo, or being dragged down
*/
export class CharacterEquipment extends Phaser.Image {
constructor(sheet: CharacterSheet, equipment: Equipment) {
let action_icon = equipment.action != null && !(equipment.action instanceof MoveAction);
super(sheet.game, 0, 0, action_icon ? `battle-actions-${equipment.action.code}` : `equipment-${equipment.code}`);
this.anchor.set(0.5, 0.5);
this.scale.set(0.5, 0.5);
}
}
}

View file

@ -16,10 +16,12 @@ module TS.SpaceTac.UI.Specs {
ship1.addSlot(SlotType.Engine);
ship1.addSlot(SlotType.Shield);
ship1.addSlot(SlotType.Weapon);
ship1.setCargoSpace(3);
ship1.name = "Ship 1";
let ship2 = fleet.addShip();
ship2.addSlot(SlotType.Hull);
ship2.name = "Ship 2";
ship2.setCargoSpace(2);
sheet.show(ship1, false);
@ -28,12 +30,14 @@ module TS.SpaceTac.UI.Specs {
expect(sheet.ship_name.text).toEqual("Ship 1");
expect(sheet.ship_slots.length).toBe(4);
expect(sheet.ship_cargo.length).toBe(3);
let portrait = <Phaser.Button>sheet.portraits.getChildAt(1);
portrait.onInputUp.dispatch();
expect(sheet.ship_name.text).toEqual("Ship 2");
expect(sheet.ship_slots.length).toBe(1);
expect(sheet.ship_cargo.length).toBe(2);
});
});

View file

@ -25,6 +25,9 @@ module TS.SpaceTac.UI {
// Ship slots
ship_slots: Phaser.Group;
// Ship cargo
ship_cargo: Phaser.Group;
// Fleet's portraits
portraits: Phaser.Group;
@ -62,6 +65,10 @@ module TS.SpaceTac.UI {
this.ship_slots.position.set(372, 120);
this.addChild(this.ship_slots);
this.ship_cargo = new Phaser.Group(this.game);
this.ship_cargo.position.set(1240, 86);
this.addChild(this.ship_cargo);
this.portraits = new Phaser.Group(this.game);
this.portraits.position.set(152, 0);
this.addChild(this.portraits);
@ -152,6 +159,19 @@ module TS.SpaceTac.UI {
let slot_display = new CharacterSlot(this, slotsinfo.positions[idx].x, slotsinfo.positions[idx].y, slot.type);
slot_display.scale.set(slotsinfo.scaling, slotsinfo.scaling);
this.ship_slots.addChild(slot_display);
if (slot.attached) {
let equipment = new CharacterEquipment(this, slot.attached);
slot_display.setEquipment(equipment);
}
});
slotsinfo = CharacterSheet.getSlotPositions(ship.cargo_space, 638, 496, 200, 200);
this.ship_cargo.removeAll(true);
range(ship.cargo_space).forEach(idx => {
let cargo_slot = new CharacterCargo(this, slotsinfo.positions[idx].x, slotsinfo.positions[idx].y);
cargo_slot.scale.set(slotsinfo.scaling, slotsinfo.scaling);
this.ship_cargo.addChild(cargo_slot);
});
this.updateFleet(ship.fleet);
@ -177,7 +197,7 @@ module TS.SpaceTac.UI {
}
/**
* Get the positions and scaling for slots, to fit in ship_slots group.
* Get the positions and scaling for slots, to fit in a rectangle group.
*/
static getSlotPositions(count: number, areawidth: number, areaheight: number, slotwidth: number, slotheight: number): { positions: { x: number, y: number }[], scaling: number } {
// Find grid size

View file

@ -10,5 +10,13 @@ module TS.SpaceTac.UI {
sloticon.anchor.set(0.5, 0.5);
this.addChild(sloticon);
}
/**
* Set the equipment displayed in the slot
*/
setEquipment(equipment: CharacterEquipment | null) {
this.addChild(equipment);
equipment.position.set(84, 83);
}
}
}