warscript 0.0.1-dev.1d3eae2 → 0.0.1-dev.1d4ae4c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/types/frame.lua +47 -1
- package/core/types/sound.lua +1 -1
- package/engine/behaviour/ability/damage.d.ts +3 -0
- package/engine/behaviour/ability/damage.lua +8 -2
- package/engine/behaviour/ability.d.ts +9 -5
- package/engine/behaviour/ability.lua +29 -0
- package/engine/behaviour/unit/stun-immunity.d.ts +1 -1
- package/engine/behaviour/unit/stun-immunity.lua +5 -4
- package/engine/behaviour/unit.lua +13 -3
- package/engine/buff.d.ts +53 -19
- package/engine/buff.lua +268 -142
- package/engine/internal/mechanics/cast-ability.lua +6 -3
- package/engine/internal/object-data/attribute-bonus.lua +2 -2
- package/engine/internal/object-data/health-bonus.d.ts +2 -0
- package/engine/internal/object-data/health-bonus.lua +16 -0
- package/engine/internal/object-data/mana-bonus.d.ts +2 -0
- package/engine/internal/object-data/mana-bonus.lua +16 -0
- package/engine/internal/unit/attributes.d.ts +17 -0
- package/engine/internal/unit/attributes.lua +46 -0
- package/engine/internal/unit/bonus.d.ts +4 -0
- package/engine/internal/unit/bonus.lua +23 -3
- package/engine/internal/unit/fly-height.lua +3 -3
- package/engine/internal/unit/interrupts.d.ts +12 -0
- package/engine/internal/unit/interrupts.lua +28 -0
- package/engine/internal/unit/range-event.d.ts +12 -0
- package/engine/internal/unit/range-event.lua +90 -0
- package/engine/internal/unit/scale.lua +3 -3
- package/engine/internal/unit+bonus.lua +3 -3
- package/engine/internal/unit-missile-launch.lua +12 -5
- package/engine/internal/unit.d.ts +2 -9
- package/engine/internal/unit.lua +79 -121
- package/engine/local-client.d.ts +5 -0
- package/engine/local-client.lua +56 -1
- package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
- package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
- package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
- package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
- package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
- package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
- package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
- package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
- package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
- package/engine/object-data/entry/ability-type.d.ts +2 -0
- package/engine/object-data/entry/ability-type.lua +84 -4
- package/engine/object-data/entry/buff-type/applicable.lua +113 -109
- package/engine/object-field/ability.lua +2 -2
- package/engine/object-field/item.d.ts +22 -0
- package/engine/object-field/item.lua +95 -0
- package/engine/object-field.d.ts +3 -1
- package/engine/object-field.lua +42 -18
- package/engine/random.d.ts +1 -0
- package/engine/random.lua +8 -0
- package/engine/standard/fields/item.d.ts +3 -0
- package/engine/standard/fields/item.lua +5 -0
- package/engine/standard/fields/unit.d.ts +11 -8
- package/engine/standard/fields/unit.lua +11 -7
- package/engine/unit.d.ts +3 -0
- package/engine/unit.lua +3 -0
- package/lualib_bundle.lua +1 -1
- package/math.d.ts +2 -0
- package/math.lua +14 -0
- package/objutil/buff.lua +9 -7
- package/objutil/object.lua +1 -1
- package/operation.lua +1 -4
- package/package.json +5 -5
- package/patch-lua.lua +15 -0
- package/utility/linked-map.d.ts +34 -0
- package/utility/linked-map.lua +101 -0
- package/utility/linked-set.d.ts +2 -1
- package/utility/linked-set.lua +21 -0
- package/utility/records.lua +20 -1
- /package/engine/internal/object-data/{armor-increase.d.ts → armor-bonus.d.ts} +0 -0
- /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
- /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
- /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
|
@@ -45,6 +45,7 @@ local isButtonVisibleFalseAbilityTypes = {}
|
|
|
45
45
|
local casterCastingEffectPresetsByAbilityTypeId = {}
|
|
46
46
|
local casterChannelingEffectPresetsByAbilityTypeId = {}
|
|
47
47
|
local targetCastingEffectPresetsByAbilityTypeId = {}
|
|
48
|
+
local targetChannelingEffectPresetsByAbilityTypeId = {}
|
|
48
49
|
local targetEffectSoundPresetByAbilityTypeId = {}
|
|
49
50
|
____exports.AbilityType = __TS__Class()
|
|
50
51
|
local AbilityType = ____exports.AbilityType
|
|
@@ -378,6 +379,19 @@ __TS__SetDescriptor(
|
|
|
378
379
|
},
|
|
379
380
|
true
|
|
380
381
|
)
|
|
382
|
+
__TS__SetDescriptor(
|
|
383
|
+
AbilityType.prototype,
|
|
384
|
+
"targetChannelingEffectPresets",
|
|
385
|
+
{
|
|
386
|
+
get = function(self)
|
|
387
|
+
return targetChannelingEffectPresetsByAbilityTypeId[self.id] or ({})
|
|
388
|
+
end,
|
|
389
|
+
set = function(self, targetChannelingEffectPresets)
|
|
390
|
+
targetChannelingEffectPresetsByAbilityTypeId[self.id] = map(targetChannelingEffectPresets, toEffectPreset)
|
|
391
|
+
end
|
|
392
|
+
},
|
|
393
|
+
true
|
|
394
|
+
)
|
|
381
395
|
__TS__SetDescriptor(
|
|
382
396
|
AbilityType.prototype,
|
|
383
397
|
"targetEffectPresets",
|
|
@@ -1099,18 +1113,84 @@ local function handleAbilityChannelingStartEvent(caster, ability)
|
|
|
1099
1113
|
end
|
|
1100
1114
|
casterChannelingEffectsByCaster[caster] = effects
|
|
1101
1115
|
end
|
|
1116
|
+
local targetChannelingEffectModelPathsByAbilityTypeId = postcompile(function()
|
|
1117
|
+
return mapValues(
|
|
1118
|
+
targetChannelingEffectPresetsByAbilityTypeId,
|
|
1119
|
+
function(targetChannelingEffectPresets) return map(targetChannelingEffectPresets, extractAttachmentPresetInputModelPath) end
|
|
1120
|
+
)
|
|
1121
|
+
end)
|
|
1122
|
+
local targetChannelingEffectAttachmentPointsByAbilityTypeId = postcompile(function()
|
|
1123
|
+
return mapValues(
|
|
1124
|
+
targetChannelingEffectPresetsByAbilityTypeId,
|
|
1125
|
+
function(targetChannelingEffectPresets) return map(targetChannelingEffectPresets, extractAttachmentPresetInputNodeFQN) end
|
|
1126
|
+
)
|
|
1127
|
+
end)
|
|
1128
|
+
local targetChannelingEffectParametersByAbilityTypeId = postcompile(function()
|
|
1129
|
+
return mapValues(
|
|
1130
|
+
targetChannelingEffectPresetsByAbilityTypeId,
|
|
1131
|
+
function(targetChannelingEffectPresets) return map(targetChannelingEffectPresets, "parameters") end
|
|
1132
|
+
)
|
|
1133
|
+
end)
|
|
1134
|
+
local targetChannelingEffectsByCaster = {}
|
|
1135
|
+
local function handleAbilityWidgetTargetChannelingStartEvent(caster, ability, target)
|
|
1136
|
+
local effectModelPaths = targetChannelingEffectModelPathsByAbilityTypeId[ability.typeId]
|
|
1137
|
+
local attachmentPoints = targetChannelingEffectAttachmentPointsByAbilityTypeId[ability.typeId]
|
|
1138
|
+
local parameters = targetChannelingEffectParametersByAbilityTypeId[ability.typeId]
|
|
1139
|
+
local effects = {}
|
|
1140
|
+
if effectModelPaths ~= nil then
|
|
1141
|
+
for i = 1, #effectModelPaths do
|
|
1142
|
+
local effectModelPath = effectModelPaths[i]
|
|
1143
|
+
local attachmentPoint = attachmentPoints and attachmentPoints[i]
|
|
1144
|
+
if attachmentPoint == nil or attachmentPoint == "" then
|
|
1145
|
+
attachmentPoint = "origin"
|
|
1146
|
+
end
|
|
1147
|
+
effects[i] = Effect:create(effectModelPath, target, attachmentPoint, parameters and parameters[i])
|
|
1148
|
+
end
|
|
1149
|
+
end
|
|
1150
|
+
targetChannelingEffectsByCaster[caster] = effects
|
|
1151
|
+
end
|
|
1152
|
+
local function handleAbilityPointTargetChannelingStartEvent(caster, ability, x, y)
|
|
1153
|
+
local effectModelPaths = targetChannelingEffectModelPathsByAbilityTypeId[ability.typeId]
|
|
1154
|
+
local attachmentPoints = targetChannelingEffectAttachmentPointsByAbilityTypeId[ability.typeId]
|
|
1155
|
+
local parameters = targetChannelingEffectParametersByAbilityTypeId[ability.typeId]
|
|
1156
|
+
local effects = {}
|
|
1157
|
+
if effectModelPaths ~= nil then
|
|
1158
|
+
for i = 1, #effectModelPaths do
|
|
1159
|
+
local effectModelPath = effectModelPaths[i]
|
|
1160
|
+
local attachmentPoint = attachmentPoints and attachmentPoints[i]
|
|
1161
|
+
if attachmentPoint == nil or attachmentPoint == "" then
|
|
1162
|
+
attachmentPoint = "origin"
|
|
1163
|
+
end
|
|
1164
|
+
effects[i] = Effect:create(effectModelPath, x, y, parameters and parameters[i])
|
|
1165
|
+
end
|
|
1166
|
+
end
|
|
1167
|
+
targetChannelingEffectsByCaster[caster] = effects
|
|
1168
|
+
end
|
|
1102
1169
|
local function handleAbilityStopChannelingEvent(caster)
|
|
1103
|
-
local
|
|
1104
|
-
if
|
|
1105
|
-
for i = 1, #
|
|
1106
|
-
|
|
1170
|
+
local casterEffects = casterChannelingEffectsByCaster[caster]
|
|
1171
|
+
if casterEffects ~= nil then
|
|
1172
|
+
for i = 1, #casterEffects do
|
|
1173
|
+
casterEffects[i]:destroy()
|
|
1107
1174
|
end
|
|
1108
1175
|
casterChannelingEffectsByCaster[caster] = nil
|
|
1109
1176
|
end
|
|
1177
|
+
local targetEffects = targetChannelingEffectsByCaster[caster]
|
|
1178
|
+
if targetEffects ~= nil then
|
|
1179
|
+
for i = 1, #targetEffects do
|
|
1180
|
+
targetEffects[i]:destroy()
|
|
1181
|
+
end
|
|
1182
|
+
targetChannelingEffectsByCaster[caster] = nil
|
|
1183
|
+
end
|
|
1110
1184
|
end
|
|
1111
1185
|
for abilityTypeId in pairs(casterChannelingEffectModelPathsByAbilityTypeId) do
|
|
1112
1186
|
Unit.abilityChannelingStartEvent[abilityTypeId]:addListener(4, handleAbilityChannelingStartEvent)
|
|
1113
1187
|
Unit.abilityChannelingFinishEvent[abilityTypeId]:addListener(4, handleAbilityStopChannelingEvent)
|
|
1114
1188
|
Unit.abilityStopEvent[abilityTypeId]:addListener(4, handleAbilityStopChannelingEvent)
|
|
1115
1189
|
end
|
|
1190
|
+
for abilityTypeId in pairs(targetChannelingEffectModelPathsByAbilityTypeId) do
|
|
1191
|
+
Unit.abilityWidgetTargetChannelingStartEvent[abilityTypeId]:addListener(4, handleAbilityWidgetTargetChannelingStartEvent)
|
|
1192
|
+
Unit.abilityPointTargetChannelingStartEvent[abilityTypeId]:addListener(4, handleAbilityPointTargetChannelingStartEvent)
|
|
1193
|
+
Unit.abilityChannelingFinishEvent[abilityTypeId]:addListener(4, handleAbilityStopChannelingEvent)
|
|
1194
|
+
Unit.abilityStopEvent[abilityTypeId]:addListener(4, handleAbilityStopChannelingEvent)
|
|
1195
|
+
end
|
|
1116
1196
|
return ____exports
|
|
@@ -65,123 +65,127 @@ function ApplicableBuffType.wrap(self, other)
|
|
|
65
65
|
return __TS__New(____exports.ApplicableBuffType, other.object)
|
|
66
66
|
end
|
|
67
67
|
ApplicableBuffType.BASE_ID = fourCC("BHbz")
|
|
68
|
-
local applicatorAbilityTypeIdByApplicatorTypeByApplicableBuffTypeId, applicatorUpgradeIdByApplicatorAbilityTypeId = table.unpack(
|
|
69
|
-
|
|
70
|
-
local
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if applicableBuffType.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
68
|
+
local applicatorAbilityTypeIdByApplicatorTypeByApplicableBuffTypeId, applicatorUpgradeIdByApplicatorAbilityTypeId = table.unpack(
|
|
69
|
+
postcompile(function()
|
|
70
|
+
local function prepareAbilityType(abilityTypeConstructor, applicableBuffType)
|
|
71
|
+
local abilityType = abilityTypeConstructor:create()
|
|
72
|
+
abilityType.isInternal = true
|
|
73
|
+
abilityType.levelCount = applicableBuffType.levelCount
|
|
74
|
+
abilityType.buttonPositionX = 0
|
|
75
|
+
abilityType.buttonPositionY = -11
|
|
76
|
+
abilityType.casterAttachmentPresets = {}
|
|
77
|
+
abilityType.targetEffectPresets = {}
|
|
78
|
+
abilityType.casterEffectSoundPresetId = nil
|
|
79
|
+
abilityType.learnLevelMinimum = 6
|
|
80
|
+
abilityType.race = "other"
|
|
81
|
+
abilityType.shouldCheckTechTreeDependencies = false
|
|
82
|
+
abilityType.techTreeDependencies = {}
|
|
83
|
+
abilityType.allowedTargetCombatClassifications = combatClassificationsOf(
|
|
84
|
+
4,
|
|
85
|
+
2,
|
|
86
|
+
2097152,
|
|
87
|
+
8,
|
|
88
|
+
1048576,
|
|
89
|
+
16
|
|
90
|
+
)
|
|
91
|
+
abilityType.areaOfEffect = 0
|
|
92
|
+
abilityType.castRange = 999999
|
|
93
|
+
abilityType.cooldown = 0
|
|
94
|
+
abilityType.manaCost = 0
|
|
95
|
+
abilityType.buffDuration = 0
|
|
96
|
+
abilityType.heroBuffDuration = 0
|
|
97
|
+
return abilityType
|
|
98
|
+
end
|
|
99
|
+
local multilevelPhysicalPositiveApplicatorAbilityTypes = {}
|
|
100
|
+
local applicatorAbilityTypeIdByApplicatorTypeByApplicableBuffTypeId = {}
|
|
101
|
+
for applicableBuffType in pairs(compiletimeApplicableBuffTypes) do
|
|
102
|
+
local applicatorAbilityTypeIdByApplicatorType = {}
|
|
103
|
+
if applicableBuffType.resistanceType == 1 or applicableBuffType.resistanceType == nil then
|
|
104
|
+
if applicableBuffType.polarity == 2 or applicableBuffType.polarity == nil then
|
|
105
|
+
local applicatorAbilityType = prepareAbilityType(CurseAbilityType, applicableBuffType)
|
|
106
|
+
applicatorAbilityType.missProbability = 0
|
|
107
|
+
applicatorAbilityType.buffTypeIds = {applicableBuffType.id}
|
|
108
|
+
applicatorAbilityTypeIdByApplicatorType[852190] = applicatorAbilityType.id
|
|
109
|
+
end
|
|
110
|
+
if applicableBuffType.polarity == 1 or applicableBuffType.polarity == nil then
|
|
111
|
+
local applicatorAbilityType = prepareAbilityType(BloodLustAbilityType, applicableBuffType)
|
|
112
|
+
applicatorAbilityType.attackSpeedIncreaseFactor = 0
|
|
113
|
+
applicatorAbilityType.movementSpeedIncreaseFactor = 0
|
|
114
|
+
applicatorAbilityType.scaleIncrease = 0
|
|
115
|
+
applicatorAbilityType.buffTypeIds = {applicableBuffType.id}
|
|
116
|
+
applicatorAbilityTypeIdByApplicatorType[852101] = applicatorAbilityType.id
|
|
117
|
+
end
|
|
108
118
|
end
|
|
109
|
-
if applicableBuffType.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
119
|
+
if applicableBuffType.resistanceType == 2 or applicableBuffType.resistanceType == nil then
|
|
120
|
+
if applicableBuffType.polarity == 2 or applicableBuffType.polarity == nil then
|
|
121
|
+
local applicatorAbilityType = prepareAbilityType(SlowPoisonAbilityType, applicableBuffType)
|
|
122
|
+
applicatorAbilityType.damagePerSecond = 0
|
|
123
|
+
applicatorAbilityType.movementSpeedDecreaseFactor = 0
|
|
124
|
+
applicatorAbilityType.attackSpeedDecreaseFactor = 0
|
|
125
|
+
applicatorAbilityType.isDamageStacking = false
|
|
126
|
+
applicatorAbilityType.isMovementSpeedFactorStacking = false
|
|
127
|
+
applicatorAbilityType.isAttackSpeedFactorStacking = false
|
|
128
|
+
applicatorAbilityType.isAbleToKill = false
|
|
129
|
+
applicatorAbilityType.buffTypeIds = {applicableBuffType.id, applicableBuffType.id}
|
|
130
|
+
applicatorAbilityTypeIdByApplicatorType[852173] = applicatorAbilityType.id
|
|
131
|
+
end
|
|
132
|
+
if applicableBuffType.polarity == 1 or applicableBuffType.polarity == nil then
|
|
133
|
+
local applicatorAbilityType = prepareAbilityType(BerserkAbilityType, applicableBuffType)
|
|
134
|
+
applicatorAbilityType.attackSpeedIncreaseFactor = 0
|
|
135
|
+
applicatorAbilityType.movementSpeedIncreaseFactor = 0
|
|
136
|
+
applicatorAbilityType.receivedDamageIncreaseFactor = 0
|
|
137
|
+
applicatorAbilityType.buffTypeIds = {applicableBuffType.id}
|
|
138
|
+
if applicatorAbilityType.levelCount > 1 then
|
|
139
|
+
multilevelPhysicalPositiveApplicatorAbilityTypes[#multilevelPhysicalPositiveApplicatorAbilityTypes + 1] = applicatorAbilityType
|
|
140
|
+
end
|
|
141
|
+
applicatorAbilityTypeIdByApplicatorType[852100] = applicatorAbilityType.id
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
if applicableBuffType.polarity == 0 or applicableBuffType.polarity == nil then
|
|
145
|
+
local applicatorAbilityType = prepareAbilityType(PermanentImmolationAbilityType, applicableBuffType)
|
|
146
|
+
applicatorAbilityType.levelCount = 1
|
|
147
|
+
applicatorAbilityType.damagePerInterval = 0
|
|
148
|
+
applicatorAbilityType.castRange = 0
|
|
149
|
+
applicatorAbilityType.buffDuration = MAXIMUM_INTEGER
|
|
150
|
+
applicatorAbilityType.heroBuffDuration = MAXIMUM_INTEGER
|
|
151
|
+
applicatorAbilityType.allowedTargetCombatClassifications = combatClassificationsOf(1)
|
|
114
152
|
applicatorAbilityType.buffTypeIds = {applicableBuffType.id}
|
|
115
|
-
applicatorAbilityTypeIdByApplicatorType[
|
|
153
|
+
applicatorAbilityTypeIdByApplicatorType[0] = applicatorAbilityType.id
|
|
116
154
|
end
|
|
155
|
+
applicatorAbilityTypeIdByApplicatorTypeByApplicableBuffTypeId[applicableBuffType.id] = applicatorAbilityTypeIdByApplicatorType
|
|
117
156
|
end
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
end
|
|
131
|
-
if applicableBuffType.polarity == 1 or applicableBuffType.polarity == nil then
|
|
132
|
-
local applicatorAbilityType = prepareAbilityType(BerserkAbilityType, applicableBuffType)
|
|
133
|
-
applicatorAbilityType.attackSpeedIncreaseFactor = 0
|
|
134
|
-
applicatorAbilityType.movementSpeedIncreaseFactor = 0
|
|
135
|
-
applicatorAbilityType.receivedDamageIncreaseFactor = 0
|
|
136
|
-
applicatorAbilityType.buffTypeIds = {applicableBuffType.id}
|
|
137
|
-
if applicatorAbilityType.levelCount > 1 then
|
|
138
|
-
multilevelPhysicalPositiveApplicatorAbilityTypes[#multilevelPhysicalPositiveApplicatorAbilityTypes + 1] = applicatorAbilityType
|
|
157
|
+
local applicatorUpgradeIds = {}
|
|
158
|
+
local applicatorUpgradeIdByApplicatorAbilityTypeId = {}
|
|
159
|
+
for ____, multilevelPhysicalPositiveApplicatorAbilityTypesChunk in ipairs(chunked(multilevelPhysicalPositiveApplicatorAbilityTypes, 4)) do
|
|
160
|
+
local maxLevelCount = max(map(multilevelPhysicalPositiveApplicatorAbilityTypesChunk, "levelCount"))
|
|
161
|
+
local applicatorAbilityTypeIds = map(multilevelPhysicalPositiveApplicatorAbilityTypesChunk, "id")
|
|
162
|
+
local applicatorUpgrade = BlankUpgrade:create()
|
|
163
|
+
applicatorUpgrade.isInternal = true
|
|
164
|
+
applicatorUpgrade.levelCount = maxLevelCount - 1
|
|
165
|
+
applicatorUpgrade.effects = map(
|
|
166
|
+
applicatorAbilityTypeIds,
|
|
167
|
+
function(applicatorAbilityTypeId)
|
|
168
|
+
return {type = "rlev", bonusBase = 1, bonusIncrement = 1, abilityTypeId = applicatorAbilityTypeId}
|
|
139
169
|
end
|
|
140
|
-
|
|
170
|
+
)
|
|
171
|
+
applicatorUpgradeIds[#applicatorUpgradeIds + 1] = applicatorUpgrade.id
|
|
172
|
+
for ____, applicatorAbilityTypeId in ipairs(applicatorAbilityTypeIds) do
|
|
173
|
+
applicatorUpgradeIdByApplicatorAbilityTypeId[applicatorAbilityTypeId] = applicatorUpgrade.id
|
|
141
174
|
end
|
|
142
175
|
end
|
|
143
|
-
|
|
144
|
-
local
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
applicatorAbilityType.allowedTargetCombatClassifications = combatClassificationsOf(1)
|
|
151
|
-
applicatorAbilityType.buffTypeIds = {applicableBuffType.id}
|
|
152
|
-
applicatorAbilityTypeIdByApplicatorType[0] = applicatorAbilityType.id
|
|
153
|
-
end
|
|
154
|
-
applicatorAbilityTypeIdByApplicatorTypeByApplicableBuffTypeId[applicableBuffType.id] = applicatorAbilityTypeIdByApplicatorType
|
|
155
|
-
end
|
|
156
|
-
local applicatorUpgradeIds = {}
|
|
157
|
-
local applicatorUpgradeIdByApplicatorAbilityTypeId = {}
|
|
158
|
-
for ____, multilevelPhysicalPositiveApplicatorAbilityTypesChunk in ipairs(chunked(multilevelPhysicalPositiveApplicatorAbilityTypes, 4)) do
|
|
159
|
-
local maxLevelCount = max(map(multilevelPhysicalPositiveApplicatorAbilityTypesChunk, "levelCount"))
|
|
160
|
-
local applicatorAbilityTypeIds = map(multilevelPhysicalPositiveApplicatorAbilityTypesChunk, "id")
|
|
161
|
-
local applicatorUpgrade = BlankUpgrade:create()
|
|
162
|
-
applicatorUpgrade.isInternal = true
|
|
163
|
-
applicatorUpgrade.levelCount = maxLevelCount - 1
|
|
164
|
-
applicatorUpgrade.effects = map(
|
|
165
|
-
applicatorAbilityTypeIds,
|
|
166
|
-
function(applicatorAbilityTypeId)
|
|
167
|
-
return {type = "rlev", bonusBase = 1, bonusIncrement = 1, abilityTypeId = applicatorAbilityTypeId}
|
|
168
|
-
end
|
|
169
|
-
)
|
|
170
|
-
applicatorUpgradeIds[#applicatorUpgradeIds + 1] = applicatorUpgrade.id
|
|
171
|
-
for ____, applicatorAbilityTypeId in ipairs(applicatorAbilityTypeIds) do
|
|
172
|
-
applicatorUpgradeIdByApplicatorAbilityTypeId[applicatorAbilityTypeId] = applicatorUpgrade.id
|
|
176
|
+
for ____, unitType in ipairs(UnitType:getAll()) do
|
|
177
|
+
local ____array_0 = __TS__SparseArrayNew(table.unpack(unitType.affectingUpgradeIds))
|
|
178
|
+
__TS__SparseArrayPush(
|
|
179
|
+
____array_0,
|
|
180
|
+
table.unpack(applicatorUpgradeIds)
|
|
181
|
+
)
|
|
182
|
+
unitType.affectingUpgradeIds = {__TS__SparseArraySpread(____array_0)}
|
|
173
183
|
end
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
table.unpack(applicatorUpgradeIds)
|
|
180
|
-
)
|
|
181
|
-
unitType.affectingUpgradeIds = {__TS__SparseArraySpread(____array_0)}
|
|
182
|
-
end
|
|
183
|
-
return {applicatorAbilityTypeIdByApplicatorTypeByApplicableBuffTypeId, applicatorUpgradeIdByApplicatorAbilityTypeId}
|
|
184
|
-
end))
|
|
184
|
+
return {applicatorAbilityTypeIdByApplicatorTypeByApplicableBuffTypeId, applicatorUpgradeIdByApplicatorAbilityTypeId}
|
|
185
|
+
end),
|
|
186
|
+
1,
|
|
187
|
+
2
|
|
188
|
+
)
|
|
185
189
|
local EVASION_ABILITY_TYPE_IDS = postcompile(function()
|
|
186
190
|
return AbilityType:getAllIdsByBaseIds(map({
|
|
187
191
|
"AEev",
|
|
@@ -519,9 +519,9 @@ __TS__SetDescriptor(
|
|
|
519
519
|
)
|
|
520
520
|
____exports.resolveCurrentAbilityDependentValue = function(ability, value)
|
|
521
521
|
if __TS__InstanceOf(value, ____exports.AbilityField) then
|
|
522
|
-
return value:getValue(ability)
|
|
522
|
+
return value:getValue(ability, true)
|
|
523
523
|
elseif __TS__InstanceOf(value, ____exports.AbilityLevelField) then
|
|
524
|
-
return value:getValue(ability, ability.level)
|
|
524
|
+
return value:getValue(ability, ability.level, true)
|
|
525
525
|
elseif type(value) == "function" then
|
|
526
526
|
return value(ability)
|
|
527
527
|
else
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** @noSelfInFile */
|
|
2
|
+
import { ObjectField } from "../object-field";
|
|
3
|
+
import { Item } from "../internal/item";
|
|
4
|
+
import { ItemType, ItemTypeId } from "../object-data/entry/item-type";
|
|
5
|
+
export declare abstract class ItemField<ValueType extends number | string | boolean = number | string | boolean, NativeFieldType = any> extends ObjectField<ItemType, Item, ValueType, NativeFieldType> {
|
|
6
|
+
protected get instanceClass(): typeof Item;
|
|
7
|
+
protected getObjectDataEntryId(instance: Item): ItemTypeId;
|
|
8
|
+
}
|
|
9
|
+
export declare class ItemBooleanField extends ItemField<boolean, jitembooleanfield> {
|
|
10
|
+
protected get defaultValue(): boolean;
|
|
11
|
+
protected getNativeFieldById(id: number): jitembooleanfield;
|
|
12
|
+
protected hasNativeFieldValue(): boolean;
|
|
13
|
+
protected getNativeFieldValue(instance: Item): boolean;
|
|
14
|
+
protected setNativeFieldValue(instance: Item, value: boolean): boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class ItemIntegerField extends ItemField<number, jitemintegerfield> {
|
|
17
|
+
protected get defaultValue(): number;
|
|
18
|
+
protected getNativeFieldById(id: number): jitemintegerfield;
|
|
19
|
+
protected hasNativeFieldValue(): boolean;
|
|
20
|
+
protected getNativeFieldValue(instance: Item): number;
|
|
21
|
+
protected setNativeFieldValue(instance: Item, value: number): boolean;
|
|
22
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
local ____lualib = require("lualib_bundle")
|
|
2
|
+
local __TS__Class = ____lualib.__TS__Class
|
|
3
|
+
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
|
|
4
|
+
local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
|
|
5
|
+
local ____exports = {}
|
|
6
|
+
local ____object_2Dfield = require("engine.object-field")
|
|
7
|
+
local ObjectField = ____object_2Dfield.ObjectField
|
|
8
|
+
local ____item = require("engine.internal.item")
|
|
9
|
+
local Item = ____item.Item
|
|
10
|
+
local ____lua_2Dsets = require("utility.lua-sets")
|
|
11
|
+
local luaSetOf = ____lua_2Dsets.luaSetOf
|
|
12
|
+
local convertItemBooleanField = ConvertItemBooleanField
|
|
13
|
+
local convertItemIntegerField = ConvertItemIntegerField
|
|
14
|
+
local getItemBooleanField = BlzGetItemBooleanField
|
|
15
|
+
local getItemIntegerField = BlzGetItemIntegerField
|
|
16
|
+
local setItemBooleanField = BlzSetItemBooleanField
|
|
17
|
+
local setItemIntegerField = BlzSetItemIntegerField
|
|
18
|
+
____exports.ItemField = __TS__Class()
|
|
19
|
+
local ItemField = ____exports.ItemField
|
|
20
|
+
ItemField.name = "ItemField"
|
|
21
|
+
__TS__ClassExtends(ItemField, ObjectField)
|
|
22
|
+
function ItemField.prototype.getObjectDataEntryId(self, instance)
|
|
23
|
+
return instance.typeId
|
|
24
|
+
end
|
|
25
|
+
__TS__SetDescriptor(
|
|
26
|
+
ItemField.prototype,
|
|
27
|
+
"instanceClass",
|
|
28
|
+
{get = function(self)
|
|
29
|
+
return Item
|
|
30
|
+
end},
|
|
31
|
+
true
|
|
32
|
+
)
|
|
33
|
+
local nativeItemBooleanFieldIds = luaSetOf(fourCC("iusa"))
|
|
34
|
+
____exports.ItemBooleanField = __TS__Class()
|
|
35
|
+
local ItemBooleanField = ____exports.ItemBooleanField
|
|
36
|
+
ItemBooleanField.name = "ItemBooleanField"
|
|
37
|
+
__TS__ClassExtends(ItemBooleanField, ____exports.ItemField)
|
|
38
|
+
function ItemBooleanField.prototype.getNativeFieldById(self, id)
|
|
39
|
+
return convertItemBooleanField(id)
|
|
40
|
+
end
|
|
41
|
+
function ItemBooleanField.prototype.hasNativeFieldValue(self)
|
|
42
|
+
return nativeItemBooleanFieldIds[self.id] ~= nil
|
|
43
|
+
end
|
|
44
|
+
function ItemBooleanField.prototype.getNativeFieldValue(self, instance)
|
|
45
|
+
return getItemBooleanField(instance.handle, self.nativeField)
|
|
46
|
+
end
|
|
47
|
+
function ItemBooleanField.prototype.setNativeFieldValue(self, instance, value)
|
|
48
|
+
return setItemBooleanField(instance.handle, self.nativeField, value)
|
|
49
|
+
end
|
|
50
|
+
__TS__SetDescriptor(
|
|
51
|
+
ItemBooleanField.prototype,
|
|
52
|
+
"defaultValue",
|
|
53
|
+
{get = function(self)
|
|
54
|
+
return false
|
|
55
|
+
end},
|
|
56
|
+
true
|
|
57
|
+
)
|
|
58
|
+
local nativeItemIntegerFieldIds = luaSetOf(
|
|
59
|
+
fourCC("ilev"),
|
|
60
|
+
fourCC("iuse"),
|
|
61
|
+
fourCC("icid"),
|
|
62
|
+
fourCC("ihtp"),
|
|
63
|
+
fourCC("ihpc"),
|
|
64
|
+
fourCC("ipri"),
|
|
65
|
+
fourCC("iarm"),
|
|
66
|
+
fourCC("iclr"),
|
|
67
|
+
fourCC("iclg"),
|
|
68
|
+
fourCC("iclb"),
|
|
69
|
+
fourCC("ical")
|
|
70
|
+
)
|
|
71
|
+
____exports.ItemIntegerField = __TS__Class()
|
|
72
|
+
local ItemIntegerField = ____exports.ItemIntegerField
|
|
73
|
+
ItemIntegerField.name = "ItemIntegerField"
|
|
74
|
+
__TS__ClassExtends(ItemIntegerField, ____exports.ItemField)
|
|
75
|
+
function ItemIntegerField.prototype.getNativeFieldById(self, id)
|
|
76
|
+
return convertItemIntegerField(id)
|
|
77
|
+
end
|
|
78
|
+
function ItemIntegerField.prototype.hasNativeFieldValue(self)
|
|
79
|
+
return nativeItemIntegerFieldIds[self.id] ~= nil
|
|
80
|
+
end
|
|
81
|
+
function ItemIntegerField.prototype.getNativeFieldValue(self, instance)
|
|
82
|
+
return getItemIntegerField(instance.handle, self.nativeField)
|
|
83
|
+
end
|
|
84
|
+
function ItemIntegerField.prototype.setNativeFieldValue(self, instance, value)
|
|
85
|
+
return setItemIntegerField(instance.handle, self.nativeField, value)
|
|
86
|
+
end
|
|
87
|
+
__TS__SetDescriptor(
|
|
88
|
+
ItemIntegerField.prototype,
|
|
89
|
+
"defaultValue",
|
|
90
|
+
{get = function(self)
|
|
91
|
+
return 0
|
|
92
|
+
end},
|
|
93
|
+
true
|
|
94
|
+
)
|
|
95
|
+
return ____exports
|
package/engine/object-field.d.ts
CHANGED
|
@@ -46,6 +46,7 @@ export declare abstract class ObjectField<ObjectDataEntryType extends ObjectData
|
|
|
46
46
|
private modifiersByInstance?;
|
|
47
47
|
getValue(entry: ObjectDataEntryType | InstanceType, includeModifiers?: boolean): ValueType;
|
|
48
48
|
setValue(entry: ObjectDataEntryType | InstanceType, value: ValueType): boolean;
|
|
49
|
+
updateActualValue(instance: InstanceType): void;
|
|
49
50
|
applyModifier(instance: InstanceType, modifier: ObjectFieldModifier<InstanceType, ValueType>): void;
|
|
50
51
|
removeModifier(instance: InstanceType, modifier: ObjectFieldModifier<InstanceType, ValueType>): boolean;
|
|
51
52
|
removeValue(entry: ObjectDataEntryType): boolean;
|
|
@@ -87,8 +88,9 @@ export declare abstract class ObjectLevelField<ObjectDataEntryType extends Objec
|
|
|
87
88
|
protected abstract getNativeFieldValue(instance: InstanceType, level: number): ValueType;
|
|
88
89
|
protected abstract setNativeFieldValue(instance: InstanceType, level: number, value: ValueType): boolean;
|
|
89
90
|
protected abstract getLevelCount(entry: ObjectDataEntryType | InstanceType): number;
|
|
90
|
-
getValue<LevelType extends [number] | []>(entry: ObjectDataEntryType | InstanceType, ...[level]: LevelType): LevelType extends [number] ? ValueType : ValueType[];
|
|
91
|
+
getValue<LevelType extends [number, boolean?] | [boolean?]>(entry: ObjectDataEntryType | InstanceType, ...[level, includeModifiers]: LevelType): LevelType extends [number, boolean?] ? ValueType : ValueType[];
|
|
91
92
|
setValue(entry: ObjectDataEntryType | InstanceType, ...[levelOrValue, value]: [value: ObjectDataEntryLevelFieldValueSupplier<InputValueType, ValueType>] | [level: number, value: InputValueType]): boolean;
|
|
93
|
+
updateActualValue(instance: InstanceType, level?: number): void;
|
|
92
94
|
applyModifier(instance: InstanceType, modifier: ObjectLevelFieldModifier<InstanceType, ValueType>): void;
|
|
93
95
|
removeModifier(instance: InstanceType, modifier: ObjectLevelFieldModifier<InstanceType, ValueType>): boolean;
|
|
94
96
|
trySetValue(entry: ObjectDataEntryType | InstanceType, levelOrValue: number | unknown, value?: unknown): boolean;
|
package/engine/object-field.lua
CHANGED
|
@@ -139,7 +139,7 @@ function ObjectField.prototype.setValue(self, entry, value)
|
|
|
139
139
|
return true
|
|
140
140
|
end
|
|
141
141
|
originalValueByInstance[entry] = value
|
|
142
|
-
value = self:calculateActualValue(entry)
|
|
142
|
+
value = (self:calculateActualValue(entry))
|
|
143
143
|
end
|
|
144
144
|
end
|
|
145
145
|
local previousValue = self:setActualValue(entry, value)
|
|
@@ -163,6 +163,12 @@ function ObjectField.prototype.setValue(self, entry, value)
|
|
|
163
163
|
end
|
|
164
164
|
return true
|
|
165
165
|
end
|
|
166
|
+
function ObjectField.prototype.updateActualValue(self, instance)
|
|
167
|
+
local actualValue, hasModifiers = self:calculateActualValue(instance)
|
|
168
|
+
if hasModifiers then
|
|
169
|
+
self:setActualValue(instance, actualValue)
|
|
170
|
+
end
|
|
171
|
+
end
|
|
166
172
|
function ObjectField.prototype.applyModifier(self, instance, modifier)
|
|
167
173
|
local modifiersByInstance = self.modifiersByInstance
|
|
168
174
|
if modifiersByInstance == nil then
|
|
@@ -182,10 +188,7 @@ function ObjectField.prototype.applyModifier(self, instance, modifier)
|
|
|
182
188
|
____originalValueByInstance_instance_3 = self:getActualValue(instance)
|
|
183
189
|
end
|
|
184
190
|
____originalValueByInstance_4[____instance_5] = ____originalValueByInstance_instance_3
|
|
185
|
-
self:setActualValue(
|
|
186
|
-
instance,
|
|
187
|
-
self:calculateActualValue(instance)
|
|
188
|
-
)
|
|
191
|
+
self:setActualValue(instance, (self:calculateActualValue(instance)))
|
|
189
192
|
end
|
|
190
193
|
end
|
|
191
194
|
function ObjectField.prototype.removeModifier(self, instance, modifier)
|
|
@@ -193,10 +196,7 @@ function ObjectField.prototype.removeModifier(self, instance, modifier)
|
|
|
193
196
|
if modifiersByInstance ~= nil then
|
|
194
197
|
local modifiers = modifiersByInstance[instance]
|
|
195
198
|
if modifiers ~= nil and modifiers:remove(modifier) then
|
|
196
|
-
self:setActualValue(
|
|
197
|
-
instance,
|
|
198
|
-
self:calculateActualValue(instance)
|
|
199
|
-
)
|
|
199
|
+
self:setActualValue(instance, (self:calculateActualValue(instance)))
|
|
200
200
|
return true
|
|
201
201
|
end
|
|
202
202
|
end
|
|
@@ -283,10 +283,11 @@ function ObjectField.prototype.calculateActualValue(self, instance)
|
|
|
283
283
|
for modifier in pairs(modifiers) do
|
|
284
284
|
value = modifier(instance, value, originalValue)
|
|
285
285
|
end
|
|
286
|
+
return value, true
|
|
286
287
|
end
|
|
287
|
-
return value
|
|
288
|
+
return value, false
|
|
288
289
|
end
|
|
289
|
-
return self.defaultValue
|
|
290
|
+
return self.defaultValue, false
|
|
290
291
|
end
|
|
291
292
|
function ObjectField.prototype.invokeValueChangeEvent(self, ...)
|
|
292
293
|
self:invokeValueChangeEventRecursive(
|
|
@@ -402,12 +403,12 @@ ____exports.ObjectLevelField = __TS__Class()
|
|
|
402
403
|
local ObjectLevelField = ____exports.ObjectLevelField
|
|
403
404
|
ObjectLevelField.name = "ObjectLevelField"
|
|
404
405
|
__TS__ClassExtends(ObjectLevelField, ObjectFieldBase)
|
|
405
|
-
function ObjectLevelField.prototype.getValue(self, entry, level)
|
|
406
|
+
function ObjectLevelField.prototype.getValue(self, entry, level, includeModifiers)
|
|
406
407
|
if level == nil then
|
|
407
408
|
local result = {}
|
|
408
409
|
local levelCount = self:getLevelCount(entry)
|
|
409
410
|
for i = 0, levelCount - 1 do
|
|
410
|
-
result[i + 1] = self:getValue(entry, i)
|
|
411
|
+
result[i + 1] = self:getValue(entry, i, includeModifiers)
|
|
411
412
|
end
|
|
412
413
|
return result
|
|
413
414
|
end
|
|
@@ -425,11 +426,13 @@ function ObjectLevelField.prototype.getValue(self, entry, level)
|
|
|
425
426
|
end
|
|
426
427
|
return self.defaultValue
|
|
427
428
|
end
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
429
|
+
if not includeModifiers then
|
|
430
|
+
local ____opt_22 = self.originalValueByLevelByInstance
|
|
431
|
+
local ____opt_20 = ____opt_22 and ____opt_22[entry]
|
|
432
|
+
local originalValue = ____opt_20 and ____opt_20[level]
|
|
433
|
+
if originalValue ~= nil then
|
|
434
|
+
return originalValue
|
|
435
|
+
end
|
|
433
436
|
end
|
|
434
437
|
return self:getActualValue(entry, level)
|
|
435
438
|
end
|
|
@@ -512,6 +515,27 @@ function ObjectLevelField.prototype.setValue(self, entry, levelOrValue, value)
|
|
|
512
515
|
end
|
|
513
516
|
return true
|
|
514
517
|
end
|
|
518
|
+
function ObjectLevelField.prototype.updateActualValue(self, instance, level)
|
|
519
|
+
local modifiersByInstance = self.modifiersByInstance
|
|
520
|
+
if modifiersByInstance == nil then
|
|
521
|
+
return
|
|
522
|
+
end
|
|
523
|
+
local modifiers = modifiersByInstance[instance]
|
|
524
|
+
if modifiers == nil or modifiers.size == 0 then
|
|
525
|
+
return
|
|
526
|
+
end
|
|
527
|
+
if level == nil then
|
|
528
|
+
for i = 0, self:getLevelCount(instance) - 1 do
|
|
529
|
+
self:updateActualValue(instance, i)
|
|
530
|
+
end
|
|
531
|
+
return
|
|
532
|
+
end
|
|
533
|
+
self:setActualValue(
|
|
534
|
+
instance,
|
|
535
|
+
level,
|
|
536
|
+
self:calculateActualValue(instance, level)
|
|
537
|
+
)
|
|
538
|
+
end
|
|
515
539
|
function ObjectLevelField.prototype.applyModifier(self, instance, modifier)
|
|
516
540
|
local modifiersByInstance = self.modifiersByInstance
|
|
517
541
|
if modifiersByInstance == nil then
|
package/engine/random.d.ts
CHANGED
package/engine/random.lua
CHANGED
|
@@ -28,4 +28,12 @@ ____exports.random = function(...)
|
|
|
28
28
|
...
|
|
29
29
|
))
|
|
30
30
|
end
|
|
31
|
+
____exports.shuffle = function(array)
|
|
32
|
+
for i = #array - 1, 1 do
|
|
33
|
+
local j = getRandomInt(0, i)
|
|
34
|
+
local value = array[i + 1]
|
|
35
|
+
array[i + 1] = array[j + 1]
|
|
36
|
+
array[j + 1] = value
|
|
37
|
+
end
|
|
38
|
+
end
|
|
31
39
|
return ____exports
|