1
0
Fork 0

character sheet: Prevent messing with escorted ship's equipement

This commit is contained in:
Michaël Lemaire 2017-07-25 01:02:49 +02:00
parent daf59cc16d
commit eaa52e9b75
12 changed files with 88 additions and 28 deletions

View file

@ -29,7 +29,6 @@ Character sheet
* Highlight allowed destinations during drag-and-drop, with text hints
* When transferring to another ship, if the item can't be equipped (unmatched requirements), the transfer is cancelled instead of trying cargo
* Effective skill is sometimes not updated when upgrading base skill
* Forbid to modify escorted ship
* Add merged cargo display for the whole fleet
* Fix player's ship name not updating with level

View file

@ -0,0 +1,29 @@
module TS.SpaceTac.UI.Specs {
describe("CharacterCargo", function () {
let testgame = setupEmptyView();
it("checks conditions for adding/removing equipment", function () {
let view = testgame.baseview;
let sheet = new CharacterSheet(view);
let ship = new Ship();
sheet.show(ship);
let source = new CharacterCargo(sheet, 0, 0);
let equipment = new CharacterEquipment(sheet, new Equipment(), source);
let destination = new CharacterCargo(sheet, 0, 0);
expect(destination.addEquipment(equipment, null, true)).toBe(false);
ship.setCargoSpace(1);
expect(destination.addEquipment(equipment, null, true)).toBe(true);
ship.critical = true;
expect(destination.addEquipment(equipment, null, true)).toBe(false);
ship.critical = false;
expect(source.removeEquipment(equipment, null, true)).toBe(false);
ship.addCargo(equipment.item);
expect(source.removeEquipment(equipment, null, true)).toBe(true);
ship.critical = true;
expect(source.removeEquipment(equipment, null, true)).toBe(false);
});
});
}

View file

@ -23,18 +23,21 @@ module TS.SpaceTac.UI {
isInside(x: number, y: number): boolean {
return this.getBounds().contains(x, y);
}
getEquipmentAnchor(): { x: number, y: number, scale: number } {
getEquipmentAnchor(): { x: number, y: number, scale: number, alpha: number } {
return {
x: this.x + this.parent.x + 98 * this.scale.x,
y: this.y + this.parent.y + 98 * this.scale.y,
scale: this.scale.x
x: this.x + (this.parent ? this.parent.x : 0) + 98 * this.scale.x,
y: this.y + (this.parent ? this.parent.y : 0) + 98 * this.scale.y,
scale: this.scale.x,
alpha: this.alpha,
}
}
getPriceOffset(): number {
return 82;
}
addEquipment(equipment: CharacterEquipment, source: CharacterEquipmentContainer | null, test: boolean): boolean {
if (this.sheet.ship.getFreeCargoSpace() > 0) {
if (this.sheet.ship.critical) {
return false;
} if (this.sheet.ship.getFreeCargoSpace() > 0) {
if (test) {
return true;
} else {
@ -45,7 +48,9 @@ module TS.SpaceTac.UI {
}
}
removeEquipment(equipment: CharacterEquipment, destination: CharacterEquipmentContainer | null, test: boolean): boolean {
if (contains(this.sheet.ship.cargo, equipment.item)) {
if (this.sheet.ship.critical) {
return false;
} else if (contains(this.sheet.ship.cargo, equipment.item)) {
if (test) {
return true;
} else {

View file

@ -17,12 +17,8 @@ module TS.SpaceTac.UI.Specs {
isInside(x: number, y: number): boolean {
return x == this.x;
}
getEquipmentAnchor(): { x: number, y: number, scale: number } {
return {
x: this.x,
y: 0,
scale: 0.5
}
getEquipmentAnchor(): { x: number, y: number, scale: number, alpha: number } {
return { x: this.x, y: 0, scale: 0.5, alpha: 1 };
}
getPriceOffset(): number {
return 12;

View file

@ -10,7 +10,7 @@ module TS.SpaceTac.UI {
/**
* Get a centric anchor point and scaling to snap the equipment
*/
getEquipmentAnchor(): { x: number, y: number, scale: number }
getEquipmentAnchor(): { x: number, y: number, scale: number, alpha: number }
/**
* Get a vertical offset to position the price tag
*/
@ -91,7 +91,7 @@ module TS.SpaceTac.UI {
let info = this.container.getEquipmentAnchor();
this.position.set(info.x, info.y);
this.scale.set(0.5 * info.scale, 0.5 * info.scale);
this.alpha = 1.0;
this.alpha = info.alpha;
}
/**
@ -99,7 +99,9 @@ module TS.SpaceTac.UI {
*/
setupDragDrop(sheet: CharacterSheet) {
this.inputEnabled = true;
this.input.enableDrag(false, true);
if (this.container.removeEquipment(this, null, true)) {
this.input.enableDrag(false, true);
}
this.events.onDragStart.add(() => {
this.sheet.view.audio.playOnce("ui-drag");

View file

@ -57,6 +57,12 @@ module TS.SpaceTac.UI.Specs {
expect(ship1.cargo).toContain(equ3);
equ.applyDragDrop(source, dest, false);
expect(ship1.cargo).toContain(equ3);
// Cannot transfer to escorted ship
ship2.setCargoSpace(2);
expect(equ.applyDragDrop(source, dest, true)).toBe(true);
ship2.critical = true;
expect(equ.applyDragDrop(source, dest, true)).toBe(false);
});
});
}

View file

@ -42,15 +42,17 @@ module TS.SpaceTac.UI {
isInside(x: number, y: number): boolean {
return this.getBounds().contains(x, y);
}
getEquipmentAnchor(): { x: number, y: number, scale: number } {
getEquipmentAnchor(): { x: number, y: number, scale: number, alpha: number } {
// not needed, equipment is never shown snapped in the slot
return { x: 0, y: 0, scale: 1 };
return { x: 0, y: 0, scale: 1, alpha: 1 };
}
getPriceOffset(): number {
return 0;
}
addEquipment(equipment: CharacterEquipment, source: CharacterEquipmentContainer | null, test: boolean): boolean {
if (this.ship != this.sheet.ship && equipment.item.slot_type !== null) {
if (this.ship.critical) {
return false;
} else if (this.ship != this.sheet.ship && equipment.item.slot_type !== null) {
let slot = this.ship.getFreeSlot(equipment.item.slot_type);
if (slot) {
if (test) {

View file

@ -247,6 +247,7 @@ module TS.SpaceTac.UI {
ship.slots.forEach((slot, idx) => {
let slot_display = new CharacterSlot(this, slotsinfo.positions[idx].x, slotsinfo.positions[idx].y, slot.type);
slot_display.scale.set(slotsinfo.scaling, slotsinfo.scaling);
slot_display.alpha = ship.critical ? 0.5 : 1;
this.ship_slots.addChild(slot_display);
if (slot.attached) {
@ -260,6 +261,7 @@ module TS.SpaceTac.UI {
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);
cargo_slot.alpha = ship.critical ? 0.5 : 1;
this.ship_cargo.addChild(cargo_slot);
if (idx < this.ship.cargo.length) {

View file

@ -11,7 +11,7 @@ module TS.SpaceTac.UI.Specs {
let ship = fleet.addShip();
ship.setCargoSpace(2);
let equ1 = new Equipment(SlotType.Shield, "equ1");
ship.addCargo(equ1)
ship.addCargo(equ1);
let equ2 = new Equipment(SlotType.Weapon, "equ2");
let shop = <any>new Shop(1, [equ2], 0);

View file

@ -21,11 +21,15 @@ module TS.SpaceTac.UI {
removeEquipment(equipment: CharacterEquipment, destination: CharacterEquipmentContainer | null, test: boolean): boolean {
let shop = this.sheet.shop;
if (shop && contains(shop.getStock(), equipment.item)) {
let price = shop.getPrice(equipment.item);
if (test) {
return price <= this.sheet.fleet.credits;
if (destination) {
let price = shop.getPrice(equipment.item);
if (test) {
return price <= this.sheet.fleet.credits;
} else {
return shop.sellToFleet(equipment.item, this.sheet.fleet);
}
} else {
return shop.sellToFleet(equipment.item, this.sheet.fleet);
return test;
}
} else {
return false;

View file

@ -25,14 +25,24 @@ module TS.SpaceTac.UI.Specs {
ship.upgradeSkill("skill_time");
expect(slot.addEquipment(equipment, source, true)).toBe(true);
ship.critical = true;
expect(slot.addEquipment(equipment, source, true)).toBe(false);
ship.critical = false;
expect(ship.listEquipment(SlotType.Engine)).toEqual([]);
let result = slot.addEquipment(equipment, source, false);
expect(result).toBe(true);
expect(ship.listEquipment(SlotType.Engine)).toEqual([equipment.item]);
expect(slot.removeEquipment(equipment, source, true)).toBe(true);
ship.critical = true;
expect(slot.removeEquipment(equipment, source, true)).toBe(false);
ship.critical = false;
result = slot.removeEquipment(equipment, source, false);
expect(result).toBe(true);
expect(ship.listEquipment(SlotType.Engine)).toEqual([]);
});
});
}

View file

@ -26,18 +26,21 @@ module TS.SpaceTac.UI {
isInside(x: number, y: number): boolean {
return this.getBounds().contains(x, y);
}
getEquipmentAnchor(): { x: number, y: number, scale: number } {
getEquipmentAnchor(): { x: number, y: number, scale: number, alpha: number } {
return {
x: this.x + this.parent.x + 84 * this.scale.x,
y: this.y + this.parent.y + 83 * this.scale.y,
scale: this.scale.x
scale: this.scale.x,
alpha: this.alpha,
}
}
getPriceOffset(): number {
return 66;
}
addEquipment(equipment: CharacterEquipment, source: CharacterEquipmentContainer | null, test: boolean): boolean {
if (this.sheet.ship.canEquip(equipment.item)) {
if (this.sheet.ship.critical) {
return false;
} if (this.sheet.ship.canEquip(equipment.item)) {
if (test) {
return true;
} else {
@ -48,7 +51,9 @@ module TS.SpaceTac.UI {
}
}
removeEquipment(equipment: CharacterEquipment, destination: CharacterEquipmentContainer | null, test: boolean): boolean {
if (contains(this.sheet.ship.listEquipment(equipment.item.slot_type), equipment.item)) {
if (this.sheet.ship.critical) {
return false;
} if (contains(this.sheet.ship.listEquipment(equipment.item.slot_type), equipment.item)) {
if (test) {
return true;
} else {