UNPKG

mdx-m3-viewer

Version:

A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.

147 lines (109 loc) 3.87 kB
import ECA from '../../../parsers/w3x/wtg/eca'; import Parameter from '../../../parsers/w3x/wtg/parameter'; import SubParameters from '../../../parsers/w3x/wtg/subparameters'; import WeuData from '../data'; import { convertParameterInline } from '../conversions'; /** * IsUnitOwnedByPlayer(whichUnit, whichPlayer) == boolean * => * GetOwningPlayer(whichUnit) == whichPlayer */ export function transformerIsUnitOwnedByPlayer(data: WeuData, object: ECA | SubParameters) { let parameter = <Parameter>data.stack[1]; let comparator = <ECA>data.stack[2]; let comparatorParameters = comparator.parameters; if (comparator.name !== 'OperatorCompareBoolean') { return false; } let otherParameter; if (comparator.parameters[0] === parameter) { otherParameter = comparatorParameters[2]; } else { otherParameter = comparatorParameters[0]; } let trueOrFalse = convertParameterInline(data, otherParameter, 'boolean'); if (trueOrFalse !== 'true' && trueOrFalse !== 'false') { return false; } // Change to a player comparison. comparator.name = 'OperatorComparePlayer'; let parameters = object.parameters; let whichPlayer = parameters[1]; // Change IsUnitOwnedByPlayer(whichUnit, whichPlayer) to GetOwningPlayer(whichUnit) parameter.value = 'GetOwningPlayer'; object.name = 'GetOwningPlayer'; object.parameters.length = 1; comparatorParameters[0] = parameter; // Equal or not equal. if (trueOrFalse === 'true') { comparatorParameters[1].value = 'OperatorEqualENE'; } else { comparatorParameters[1].value = 'OperatorNotEqualENE'; } // Change the boolean to whichPlayer. comparatorParameters[2] = whichPlayer; return true; } /** * IsUnitRace(whichUnit, whichRace) == boolean * => * GetUnitRace(whichUnit) == whichRace */ export function transformerIsUnitRace(data: WeuData, object: ECA | SubParameters) { let parameter = <Parameter>data.stack[1]; let comparator = <ECA>data.stack[2]; let comparatorParameters = comparator.parameters; if (comparator.name !== 'OperatorCompareBoolean') { return false; } let otherParameter; if (comparator.parameters[0] === parameter) { otherParameter = comparatorParameters[2]; } else { otherParameter = comparatorParameters[0]; } let trueOrFalse = convertParameterInline(data, otherParameter, 'boolean'); if (trueOrFalse !== 'true' && trueOrFalse !== 'false') { return false; } // Change to a race comparison. comparator.name = 'OperatorCompareRace'; let parameters = object.parameters; let whichRace = parameters[1]; // Change IsUnitRace(whichUnit, whichRace) to GetUnitRace(whichUnit) parameter.value = 'GetUnitRace'; object.name = 'GetUnitRace'; object.parameters.length = 1; comparatorParameters[0] = parameter; let isEqual = comparatorParameters[1].value === 'OperatorEqualENE'; let isTrue = trueOrFalse === 'true'; // Essentially a XOR between the booleans. if (isEqual === isTrue) { comparatorParameters[1].value = 'OperatorEqualENE'; } else { comparatorParameters[1].value = 'OperatorNotEqualENE'; } comparatorParameters[1] = whichRace; return true; } /** * IsUnitType(whichUnit, UNIT_TYPE_DEAD) == boolean * => * IsUnitDeadBJ(whichUnit) == boolean */ export function transformerIsUnitType(data: WeuData, object: ECA | SubParameters) { let comparator = <ECA>data.stack[2]; if (comparator.name !== 'OperatorCompareBoolean') { return false; } let whichUnitType = convertParameterInline(data, object.parameters[1], 'unittype'); if (whichUnitType !== 'UNIT_TYPE_DEAD') { return false; } let parameter = <Parameter>data.stack[1]; // Change IsUnitType(whichUnit, UNIT_TYPE_DEAD) to IsUnitDeadBJ(whichUnit) parameter.value = 'IsUnitDeadBJ'; object.name = 'IsUnitDeadBJ'; object.parameters.length = 1; return true; }