character sheet: Prevent messing with escorted ship's equipement
This commit is contained in:
parent
daf59cc16d
commit
eaa52e9b75
1
TODO.md
1
TODO.md
|
@ -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
|
||||
|
||||
|
|
29
src/ui/character/CharacterCargo.spec.ts
Normal file
29
src/ui/character/CharacterCargo.spec.ts
Normal 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);
|
||||
});
|
||||
});
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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([]);
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue