@firestone-hs/replay-parser
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.
81 lines • 15.1 kB
JavaScript
import { BlockType, CardType, GameTag, Zone } from '@firestone-hs/reference-data';
import uniq from 'lodash-es/uniq';
import { CardPlayedFromHandAction } from '../../models/action/card-played-from-hand-action';
import { ActionHistoryItem } from '../../models/history/action-history-item';
import { TagChangeHistoryItem } from '../../models/history/tag-change-history-item';
import { ActionHelper } from './action-helper';
export class CardPlayedFromHandParser {
constructor(allCards) {
this.allCards = allCards;
}
applies(item) {
return item instanceof ActionHistoryItem || item instanceof TagChangeHistoryItem;
}
parse(item, currentTurn, entitiesBeforeAction, history) {
if (item instanceof ActionHistoryItem && parseInt(item.node.attributes.type) === BlockType.PLAY) {
// The case of a ShowEntity (or FullEntity) when we didn't previously know the
// card. In that case, a ShowEntity (or FullEntity) element is created that contains
// the tag with the proper zone
// Use entities when playing Eviscerate at t6o at
// http://www.zerotoheroes.com/r/hearthstone/572de12ee4b0d4231295c49e/an-arena-game-going-5-0
const result = [];
if (item.node.showEntities) {
for (const showEntity of item.node.showEntities) {
if (showEntity.tags.get(GameTag[GameTag.ZONE]) === Zone.PLAY &&
showEntity.tags.get(GameTag[GameTag.CARDTYPE]) !== CardType.ENCHANTMENT) {
result.push(CardPlayedFromHandAction.create({
timestamp: showEntity.attributes.ts,
index: showEntity.index,
entityId: showEntity.id,
}, this.allCards));
}
}
}
return result;
}
else if (item instanceof TagChangeHistoryItem) {
// The case of a ShowEntity command when the card was already known - basically
// when we play our own card. In that case, the tags are already known, and
// tag changes are the only things we care about
if (item.tag.tag === GameTag.ZONE && item.tag.value === Zone.PLAY) {
if (entitiesBeforeAction.get(item.tag.entity) &&
entitiesBeforeAction.get(item.tag.entity).getTag(GameTag.CARDTYPE) !== CardType.ENCHANTMENT &&
entitiesBeforeAction.get(item.tag.entity).getTag(GameTag.ZONE) === Zone.HAND) {
return [
CardPlayedFromHandAction.create({
timestamp: item.timestamp,
index: item.index,
entityId: item.tag.entity,
}, this.allCards),
];
}
}
}
}
// For blood gems
reduce(actions) {
return ActionHelper.combineActions(actions, (previous, current) => this.shouldMergeActions(previous, current), (previous, current) => this.mergeActions(previous, current));
}
shouldMergeActions(previousAction, currentAction) {
if (previousAction instanceof CardPlayedFromHandAction && currentAction instanceof CardPlayedFromHandAction) {
// console.log('Merging card played from hand actions', previousAction, currentAction);
if (previousAction.entities.get(previousAction.originId)?.getTag(GameTag.CARDTYPE) === CardType.SPELL &&
previousAction.entities.get(previousAction.originId)?.cardID ===
currentAction.entities.get(currentAction.originId)?.cardID) {
return true;
}
}
return false;
}
mergeActions(previousAction, currentAction) {
return ActionHelper.mergeIntoFirstAction(previousAction, currentAction, {
entities: currentAction.entities,
originId: currentAction.originId,
targetIds: uniq([
...uniq(previousAction.targetIds || []),
...uniq(currentAction.targetIds || []),
]),
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1wbGF5ZWQtZnJvbS1oYW5kLXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9hY3Rpb24vY2FyZC1wbGF5ZWQtZnJvbS1oYW5kLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFbEYsT0FBTyxJQUFJLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFFNUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFN0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE1BQU0sT0FBTyx3QkFBd0I7SUFDcEMsWUFBb0IsUUFBeUI7UUFBekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7SUFBRyxDQUFDO0lBRTFDLE9BQU8sQ0FBQyxJQUFpQjtRQUMvQixPQUFPLElBQUksWUFBWSxpQkFBaUIsSUFBSSxJQUFJLFlBQVksb0JBQW9CLENBQUM7SUFDbEYsQ0FBQztJQUVNLEtBQUssQ0FDWCxJQUE4QyxFQUM5QyxXQUFtQixFQUNuQixvQkFBeUMsRUFDekMsT0FBK0I7UUFFL0IsSUFBSSxJQUFJLFlBQVksaUJBQWlCLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUFDaEcsOEVBQThFO1lBQzlFLG9GQUFvRjtZQUNwRiwrQkFBK0I7WUFDL0IsaURBQWlEO1lBQ2pELDZGQUE2RjtZQUM3RixNQUFNLE1BQU0s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LENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQzFEO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ1o7U0FDRDtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUVPLFlBQVksQ0FBQyxjQUFzQixFQUFFLGFBQXFCO1FBQ2pFLE9BQU8sWUFBWSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUU7WUFDdkUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxRQUFRO1lBQ2hDLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtZQUNoQyxTQUFTLEVBQUUsSUFBSSxDQUFDO2dCQUNmLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO2dCQUN2QyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQzthQUN0QyxDQUFzQjtTQUNLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCbG9ja1R5cGUsIENhcmRUeXBlLCBHYW1lVGFnLCBab25lIH0gZnJvbSAnQGZpcmVzdG9uZS1ocy9yZWZlcmVuY2UtZGF0YSc7XHJcbmltcG9ydCB7IE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XHJcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC1lcy91bmlxJztcclxuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi9hY3Rpb24nO1xyXG5pbXBvcnQgeyBDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvYWN0aW9uL2NhcmQtcGxheWVkLWZyb20taGFuZC1hY3Rpb24nO1xyXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2FtZS9lbnRpdHknO1xyXG5pbXBvcnQgeyBBY3Rpb25IaXN0b3J5SXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9oaXN0b3J5L2FjdGlvbi1oaXN0b3J5LWl0ZW0nO1xyXG5pbXBvcnQgeyBIaXN0b3J5SXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9oaXN0b3J5L2hpc3RvcnktaXRlbSc7XHJcbmltcG9ydCB7IFRhZ0NoYW5nZUhpc3RvcnlJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2hpc3RvcnkvdGFnLWNoYW5nZS1oaXN0b3J5LWl0ZW0nO1xyXG5pbXBvcnQgeyBBbGxDYXJkc1NlcnZpY2UgfSBmcm9tICcuLi9hbGwtY2FyZHMuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjdGlvbkhlbHBlciB9IGZyb20gJy4vYWN0aW9uLWhlbHBlcic7XHJcbmltcG9ydCB7IFBhcnNlciB9IGZyb20gJy4vcGFyc2VyJztcclxuXHJcbmV4cG9ydCBjbGFzcyBDYXJkUGxheWVkRnJvbUhhbmRQYXJzZXIgaW1wbGVtZW50cyBQYXJzZXIge1xyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgYWxsQ2FyZHM6IEFsbENhcmRzU2VydmljZSkge31cclxuXHJcblx0cHVibGljIGFwcGxpZXMoaXRlbTogSGlzdG9yeUl0ZW0pOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBpdGVtIGluc3RhbmNlb2YgQWN0aW9uSGlzdG9yeUl0ZW0gfHwgaXRlbSBpbnN0YW5jZW9mIFRhZ0NoYW5nZUhpc3RvcnlJdGVtO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHBhcnNlKFxyXG5cdFx0aXRlbTogQWN0aW9uSGlzdG9yeUl0ZW0gfCBUYWdDaGFuZ2VIaXN0b3J5SXRlbSxcclxuXHRcdGN1cnJlbnRUdXJuOiBudW1iZXIsXHJcblx0XHRlbnRpdGllc0JlZm9yZUFjdGlvbjogTWFwPG51bWJlciwgRW50aXR5PixcclxuXHRcdGhpc3Rvcnk6IHJlYWRvbmx5IEhpc3RvcnlJdGVtW10sXHJcblx0KTogQWN0aW9uW10ge1xyXG5cdFx0aWYgKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25IaXN0b3J5SXRlbSAmJiBwYXJzZUludChpdGVtLm5vZGUuYXR0cmlidXRlcy50eXBlKSA9PT0gQmxvY2tUeXBlLlBMQVkpIHtcclxuXHRcdFx0Ly8gVGhlIGNhc2Ugb2YgYSBTaG93RW50aXR5IChvciBGdWxsRW50aXR5KSB3aGVuIHdlIGRpZG4ndCBwcmV2aW91c2x5IGtub3cgdGhlXHJcblx0XHRcdC8vIGNhcmQuIEluIHRoYXQgY2FzZSwgYSBTaG93RW50aXR5IChvciBGdWxsRW50aXR5KSBlbGVtZW50IGlzIGNyZWF0ZWQgdGhhdCBjb250YWluc1xyXG5cdFx0XHQvLyB0aGUgdGFnIHdpdGggdGhlIHByb3BlciB6b25lXHJcblx0XHRcdC8vIFVzZSBlbnRpdGllcyB3aGVuIHBsYXlpbmcgRXZpc2NlcmF0ZSBhdCB0Nm8gYXRcclxuXHRcdFx0Ly8gaHR0cDovL3d3dy56ZXJvdG9oZXJvZXMuY29tL3IvaGVhcnRoc3RvbmUvNTcyZGUxMmVlNGIwZDQyMzEyOTVjNDllL2FuLWFyZW5hLWdhbWUtZ29pbmctNS0wXHJcblx0XHRcdGNvbnN0IHJlc3VsdCA9IFtdO1xyXG5cdFx0XHRpZiAoaXRlbS5ub2RlLnNob3dFbnRpdGllcykge1xyXG5cdFx0XHRcdGZvciAoY29uc3Qgc2hvd0VudGl0eSBvZiBpdGVtLm5vZGUuc2hvd0VudGl0aWVzKSB7XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdHNob3dFbnRpdHkudGFncy5nZXQoR2FtZVRhZ1tHYW1lVGFnLlpPTkVdKSA9PT0gWm9uZS5QTEFZICYmXHJcblx0XHRcdFx0XHRcdHNob3dFbnRpdHkudGFncy5nZXQoR2FtZVRhZ1tHYW1lVGFnLkNBUkRUWVBFXSkgIT09IENhcmRUeXBlLkVOQ0hBTlRNRU5UXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0cmVzdWx0LnB1c2goXHJcblx0XHRcdFx0XHRcdFx0Q2FyZFBsYXllZEZyb21IYW5kQWN0aW9uLmNyZWF0ZShcclxuXHRcdFx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGltZXN0YW1wOiBzaG93RW50aXR5LmF0dHJpYnV0ZXMudHMsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGluZGV4OiBzaG93RW50aXR5LmluZGV4LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbnRpdHlJZDogc2hvd0VudGl0eS5pZCxcclxuXHRcdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmFsbENhcmRzLFxyXG5cdFx0XHRcdFx0XHRcdCksXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUYWdDaGFuZ2VIaXN0b3J5SXRlbSkge1xyXG5cdFx0XHQvLyBUaGUgY2FzZSBvZiBhIFNob3dFbnRpdHkgY29tbWFuZCB3aGVuIHRoZSBjYXJkIHdhcyBhbHJlYWR5IGtub3duIC0gYmFzaWNhbGx5XHJcblx0XHRcdC8vIHdoZW4gd2UgcGxheSBvdXIgb3duIGNhcmQuIEluIHRoYXQgY2FzZSwgdGhlIHRhZ3MgYXJlIGFscmVhZHkga25vd24sIGFuZFxyXG5cdFx0XHQvLyB0YWcgY2hhbmdlcyBhcmUgdGhlIG9ubHkgdGhpbmdzIHdlIGNhcmUgYWJvdXRcclxuXHRcdFx0aWYgKGl0ZW0udGFnLnRhZyA9PT0gR2FtZVRhZy5aT05FICYmIGl0ZW0udGFnLnZhbHVlID09PSBab25lLlBMQVkpIHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRlbnRpdGllc0JlZm9yZUFjdGlvbi5nZXQoaXRlbS50YWcuZW50aXR5KSAmJlxyXG5cdFx0XHRcdFx0ZW50aXRpZXNCZWZvcmVBY3Rpb24uZ2V0KGl0ZW0udGFnLmVudGl0eSkuZ2V0VGFnKEdhbWVUYWcuQ0FSRFRZUEUpICE9PSBDYXJkVHlwZS5FTkNIQU5UTUVOVCAmJlxyXG5cdFx0XHRcdFx0ZW50aXRpZXNCZWZvcmVBY3Rpb24uZ2V0KGl0ZW0udGFnLmVudGl0eSkuZ2V0VGFnKEdhbWVUYWcuWk9ORSkgPT09IFpvbmUuSEFORFxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIFtcclxuXHRcdFx0XHRcdFx0Q2FyZFBsYXllZEZyb21IYW5kQWN0aW9uLmNyZWF0ZShcclxuXHRcdFx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdFx0XHR0aW1lc3RhbXA6IGl0ZW0udGltZXN0YW1wLFxyXG5cdFx0XHRcdFx0XHRcdFx0aW5kZXg6IGl0ZW0uaW5kZXgsXHJcblx0XHRcdFx0XHRcdFx0XHRlbnRpdHlJZDogaXRlbS50YWcuZW50aXR5LFxyXG5cdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0dGhpcy5hbGxDYXJkcyxcclxuXHRcdFx0XHRcdFx0KSxcclxuXHRcdFx0XHRcdF07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBGb3IgYmxvb2QgZ2Vtc1xyXG5cdHB1YmxpYyByZWR1Y2UoYWN0aW9uczogcmVhZG9ubHkgQWN0aW9uW10pOiByZWFkb25seSBBY3Rpb25bXSB7XHJcblx0XHRyZXR1cm4gQWN0aW9uSGVscGVyLmNvbWJpbmVBY3Rpb25zPEFjdGlvbj4oXHJcblx0XHRcdGFjdGlvbnMsXHJcblx0XHRcdChwcmV2aW91cywgY3VycmVudCkgPT4gdGhpcy5zaG91bGRNZXJnZUFjdGlvbnMocHJldmlvdXMsIGN1cnJlbnQpLFxyXG5cdFx0XHQocHJldmlvdXMsIGN1cnJlbnQpID0+IHRoaXMubWVyZ2VBY3Rpb25zKHByZXZpb3VzLCBjdXJyZW50KSxcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHNob3VsZE1lcmdlQWN0aW9ucyhwcmV2aW91c0FjdGlvbjogQWN0aW9uLCBjdXJyZW50QWN0aW9uOiBBY3Rpb24pOiBib29sZWFuIHtcclxuXHRcdGlmIChwcmV2aW91c0FjdGlvbiBpbnN0YW5jZW9mIENhcmRQbGF5ZWRGcm9tSGFuZEFjdGlvbiAmJiBjdXJyZW50QWN0aW9uIGluc3RhbmNlb2YgQ2FyZFBsYXllZEZyb21IYW5kQWN0aW9uKSB7XHJcblx0XHRcdC8vIGNvbnNvbGUubG9nKCdNZXJnaW5nIGNhcmQgcGxheWVkIGZyb20gaGFuZCBhY3Rpb25zJywgcHJldmlvdXNBY3Rpb24sIGN1cnJlbnRBY3Rpb24pO1xyXG5cdFx0XHRpZiAoXHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24uZW50aXRpZXMuZ2V0KHByZXZpb3VzQWN0aW9uLm9yaWdpbklkKT8uZ2V0VGFnKEdhbWVUYWcuQ0FSRFRZUEUpID09PSBDYXJkVHlwZS5TUEVMTCAmJlxyXG5cdFx0XHRcdHByZXZpb3VzQWN0aW9uLmVudGl0aWVzLmdldChwcmV2aW91c0FjdGlvbi5vcmlnaW5JZCk/LmNhcmRJRCA9PT1cclxuXHRcdFx0XHRcdGN1cnJlbnRBY3Rpb24uZW50aXRpZXMuZ2V0KGN1cnJlbnRBY3Rpb24ub3JpZ2luSWQpPy5jYXJkSURcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgbWVyZ2VBY3Rpb25zKHByZXZpb3VzQWN0aW9uOiBBY3Rpb24sIGN1cnJlbnRBY3Rpb246IEFjdGlvbik6IEFjdGlvbiB7XHJcblx0XHRyZXR1cm4gQWN0aW9uSGVscGVyLm1lcmdlSW50b0ZpcnN0QWN0aW9uKHByZXZpb3VzQWN0aW9uLCBjdXJyZW50QWN0aW9uLCB7XHJcblx0XHRcdGVudGl0aWVzOiBjdXJyZW50QWN0aW9uLmVudGl0aWVzLFxyXG5cdFx0XHRvcmlnaW5JZDogY3VycmVudEFjdGlvbi5vcmlnaW5JZCxcclxuXHRcdFx0dGFyZ2V0SWRzOiB1bmlxKFtcclxuXHRcdFx0XHQuLi51bmlxKHByZXZpb3VzQWN0aW9uLnRhcmdldElkcyB8fCBbXSksXHJcblx0XHRcdFx0Li4udW5pcShjdXJyZW50QWN0aW9uLnRhcmdldElkcyB8fCBbXSksXHJcblx0XHRcdF0pIGFzIHJlYWRvbmx5IG51bWJlcltdLFxyXG5cdFx0fSBhcyBDYXJkUGxheWVkRnJvbUhhbmRBY3Rpb24pO1xyXG5cdH1cclxufVxyXG4iXX0=