warscript 0.0.1-dev.64cec8d → 0.0.1-dev.65ee461

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.
Files changed (99) hide show
  1. package/config.d.ts +5 -0
  2. package/config.lua +10 -0
  3. package/core/types/effect.d.ts +1 -3
  4. package/core/types/effect.lua +26 -29
  5. package/core/types/sound.d.ts +17 -24
  6. package/core/types/sound.lua +94 -24
  7. package/core/types/timer.d.ts +6 -7
  8. package/core/types/timer.lua +18 -21
  9. package/core/util.lua +6 -1
  10. package/engine/behaviour/ability/apply-buff.d.ts +5 -0
  11. package/engine/behaviour/ability/apply-buff.lua +32 -0
  12. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  13. package/engine/behaviour/ability/damage.d.ts +3 -0
  14. package/engine/behaviour/ability/damage.lua +2 -2
  15. package/engine/behaviour/ability/emulate-impact.lua +4 -5
  16. package/engine/behaviour/ability.d.ts +12 -3
  17. package/engine/behaviour/ability.lua +66 -7
  18. package/engine/behaviour/unit.d.ts +2 -0
  19. package/engine/buff.d.ts +56 -41
  20. package/engine/buff.lua +295 -228
  21. package/engine/internal/ability.lua +16 -15
  22. package/engine/internal/item/ability.lua +47 -9
  23. package/engine/internal/item.d.ts +2 -2
  24. package/engine/internal/item.lua +56 -25
  25. package/engine/internal/mechanics/ability-duration.lua +1 -1
  26. package/engine/internal/object-data/auto-attack-speed-increase.d.ts +1 -1
  27. package/engine/internal/object-data/auto-attack-speed-increase.lua +2 -0
  28. package/engine/internal/object-data/evasion-probability.d.ts +2 -0
  29. package/engine/internal/object-data/evasion-probability.lua +16 -0
  30. package/engine/internal/unit/add-item-to-slot-init.d.ts +2 -0
  31. package/engine/internal/unit/add-item-to-slot-init.lua +23 -0
  32. package/engine/internal/unit/add-item-to-slot.d.ts +2 -0
  33. package/engine/internal/unit/add-item-to-slot.lua +52 -0
  34. package/engine/internal/unit/bonus.d.ts +2 -0
  35. package/engine/internal/unit/bonus.lua +17 -0
  36. package/engine/internal/unit/ignore-events-items.d.ts +2 -0
  37. package/engine/internal/unit/ignore-events-items.lua +5 -0
  38. package/engine/internal/unit/item.lua +3 -4
  39. package/engine/internal/unit.d.ts +7 -1
  40. package/engine/internal/unit.lua +48 -13
  41. package/engine/lightning.d.ts +12 -5
  42. package/engine/lightning.lua +48 -14
  43. package/engine/object-data/auxiliary/animation-name.d.ts +1 -0
  44. package/engine/object-data/auxiliary/animation-name.lua +16 -0
  45. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  46. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  47. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  48. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  49. package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
  50. package/engine/object-data/entry/ability-type/blank-configurable.lua +12 -1
  51. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  52. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  53. package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
  54. package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
  55. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  56. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  57. package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
  58. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  59. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  60. package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
  61. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  62. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  63. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  64. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  65. package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
  66. package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
  67. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  68. package/engine/object-data/entry/ability-type/web.lua +52 -0
  69. package/engine/object-data/entry/ability-type.d.ts +20 -17
  70. package/engine/object-data/entry/ability-type.lua +159 -39
  71. package/engine/object-data/entry/buff-type/applicable.lua +13 -37
  72. package/engine/object-data/entry/buff-type.d.ts +1 -1
  73. package/engine/object-data/entry/buff-type.lua +2 -2
  74. package/engine/object-data/entry/destructible-type.d.ts +1 -1
  75. package/engine/object-data/entry/item-type.d.ts +1 -1
  76. package/engine/object-data/entry/item-type.lua +4 -4
  77. package/engine/object-data/entry/lightning-type.d.ts +1 -1
  78. package/engine/object-data/entry/sound-preset.d.ts +33 -0
  79. package/engine/object-data/entry/sound-preset.lua +140 -0
  80. package/engine/object-data/entry/unit-type.d.ts +8 -1
  81. package/engine/object-data/entry/unit-type.lua +61 -8
  82. package/engine/object-data/entry/upgrade.d.ts +1 -1
  83. package/engine/object-data/entry/upgrade.lua +4 -4
  84. package/engine/object-data/entry.d.ts +16 -14
  85. package/engine/object-data/entry.lua +60 -32
  86. package/engine/object-data/utility/object-data-entry-id-generator.lua +7 -0
  87. package/engine/object-field/ability.d.ts +5 -2
  88. package/engine/object-field/ability.lua +3 -0
  89. package/engine/object-field.d.ts +2 -2
  90. package/engine/object-field.lua +4 -0
  91. package/engine/standard/entries/sound-preset.d.ts +10 -0
  92. package/engine/standard/entries/sound-preset.lua +10 -0
  93. package/engine/unit.d.ts +1 -0
  94. package/engine/unit.lua +1 -0
  95. package/objutil/unit.lua +8 -0
  96. package/package.json +2 -2
  97. package/utility/reflection.lua +11 -7
  98. package/engine/object-data/entry/ability-type-effects.d.ts +0 -2
  99. package/engine/object-data/entry/ability-type-effects.lua +0 -89
@@ -1,9 +1,16 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
3
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
- local __TS__New = ____lualib.__TS__New
5
4
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
+ local __TS__InstanceOf = ____lualib.__TS__InstanceOf
6
6
  local ____exports = {}
7
+ local ____unit = require("engine.internal.unit")
8
+ local Unit = ____unit.Unit
9
+ require("engine.internal.unit.ability")
10
+ local ____timer = require("core.types.timer")
11
+ local Timer = ____timer.Timer
12
+ local ____effect = require("core.types.effect")
13
+ local Effect = ____effect.Effect
7
14
  local ____lua_2Dmaps = require("utility.lua-maps")
8
15
  local mapValues = ____lua_2Dmaps.mapValues
9
16
  local ____arrays = require("utility.arrays")
@@ -13,7 +20,7 @@ local mapIndexed = ____arrays.mapIndexed
13
20
  local ____attachment_2Dpreset = require("engine.object-data.auxiliary.attachment-preset")
14
21
  local extractAttachmentPresetInputModelPath = ____attachment_2Dpreset.extractAttachmentPresetInputModelPath
15
22
  local extractAttachmentPresetInputNodeFQN = ____attachment_2Dpreset.extractAttachmentPresetInputNodeFQN
16
- local toAttachmentPreset = ____attachment_2Dpreset.toAttachmentPreset
23
+ local toEffectPreset = ____attachment_2Dpreset.toEffectPreset
17
24
  local ____combat_2Dclassification = require("engine.object-data.auxiliary.combat-classification")
18
25
  local combatClassificationsToStringArray = ____combat_2Dclassification.combatClassificationsToStringArray
19
26
  local stringArrayToCombatClassifications = ____combat_2Dclassification.stringArrayToCombatClassifications
@@ -24,13 +31,18 @@ local ____entry = require("engine.object-data.entry")
24
31
  local extractObjectDataEntryLevelFieldValue = ____entry.extractObjectDataEntryLevelFieldValue
25
32
  local ObjectDataEntry = ____entry.ObjectDataEntry
26
33
  local ____object_2Ddata_2Dentry_2Did_2Dgenerator = require("engine.object-data.utility.object-data-entry-id-generator")
27
- local ObjectDataEntryIdGenerator = ____object_2Ddata_2Dentry_2Did_2Dgenerator.ObjectDataEntryIdGenerator
34
+ local abilityTypeIdGenerator = ____object_2Ddata_2Dentry_2Did_2Dgenerator.abilityTypeIdGenerator
28
35
  local ____upgrade = require("engine.object-data.entry.upgrade")
29
36
  local Upgrade = ____upgrade.Upgrade
37
+ local ____sound = require("core.types.sound")
38
+ local Sound3D = ____sound.Sound3D
39
+ local SoundSettings = ____sound.SoundSettings
40
+ local castAnimationFQNByAbilityTypeId = {}
30
41
  local isButtonVisibleFalseAbilityTypes = {}
31
42
  local casterCastingEffectPresetsByAbilityTypeId = {}
32
43
  local casterChannelingEffectPresetsByAbilityTypeId = {}
33
44
  local targetCastingEffectPresetsByAbilityTypeId = {}
45
+ local targetEffectSoundPresetByAbilityTypeId = {}
34
46
  ____exports.AbilityType = __TS__Class()
35
47
  local AbilityType = ____exports.AbilityType
36
48
  AbilityType.name = "AbilityType"
@@ -45,10 +57,7 @@ end
45
57
  function AbilityType.getObjectData(self, map)
46
58
  return map.objects.ability
47
59
  end
48
- AbilityType.idGenerator = __TS__New(
49
- ObjectDataEntryIdGenerator,
50
- fourCC("A000")
51
- )
60
+ AbilityType.idGenerator = abilityTypeIdGenerator
52
61
  __TS__SetDescriptor(
53
62
  AbilityType.prototype,
54
63
  "channelingAnimation",
@@ -109,7 +118,7 @@ __TS__SetDescriptor(
109
118
  return casterCastingEffectPresetsByAbilityTypeId[self.id] or ({})
110
119
  end,
111
120
  set = function(self, casterCastingEffectPresets)
112
- casterCastingEffectPresetsByAbilityTypeId[self.id] = map(casterCastingEffectPresets, toAttachmentPreset)
121
+ casterCastingEffectPresetsByAbilityTypeId[self.id] = map(casterCastingEffectPresets, toEffectPreset)
113
122
  end
114
123
  },
115
124
  true
@@ -122,7 +131,7 @@ __TS__SetDescriptor(
122
131
  return casterChannelingEffectPresetsByAbilityTypeId[self.id] or ({})
123
132
  end,
124
133
  set = function(self, casterChannelingEffectPresets)
125
- casterChannelingEffectPresetsByAbilityTypeId[self.id] = map(casterChannelingEffectPresets, toAttachmentPreset)
134
+ casterChannelingEffectPresetsByAbilityTypeId[self.id] = map(casterChannelingEffectPresets, toEffectPreset)
126
135
  end
127
136
  },
128
137
  true
@@ -267,10 +276,10 @@ __TS__SetDescriptor(
267
276
  "lightningTypeIds",
268
277
  {
269
278
  get = function(self)
270
- return self:getObjectDataEntryIdsField("alig")
279
+ return self:getObjectDataEntryNumericIdsField("alig")
271
280
  end,
272
281
  set = function(self, lightningTypeIds)
273
- self:setObjectDataEntryIdsField("alig", lightningTypeIds)
282
+ self:setObjectDataEntryNumericIdsField("alig", lightningTypeIds)
274
283
  end
275
284
  },
276
285
  true
@@ -361,7 +370,7 @@ __TS__SetDescriptor(
361
370
  return targetCastingEffectPresetsByAbilityTypeId[self.id] or ({})
362
371
  end,
363
372
  set = function(self, targetCastingEffectPresets)
364
- targetCastingEffectPresetsByAbilityTypeId[self.id] = map(targetCastingEffectPresets, toAttachmentPreset)
373
+ targetCastingEffectPresetsByAbilityTypeId[self.id] = map(targetCastingEffectPresets, toEffectPreset)
365
374
  end
366
375
  },
367
376
  true
@@ -504,7 +513,7 @@ __TS__SetDescriptor(
504
513
  "techTreeDependencies",
505
514
  {
506
515
  get = function(self)
507
- local techTreeDependencyIds = self:getObjectDataEntryIdsField("areq")
516
+ local techTreeDependencyIds = self:getObjectDataEntryNumericIdsField("areq")
508
517
  local techTreeDependencyInternalLevels = self:getNumbersField("arqa")
509
518
  return mapIndexed(
510
519
  techTreeDependencyIds,
@@ -524,7 +533,7 @@ __TS__SetDescriptor(
524
533
  map(techTreeDependencies, extractTechTreeDependencyInputLevel),
525
534
  function(techTreeDependencyLevel) return techTreeDependencyLevel + 1 end
526
535
  )
527
- self:setObjectDataEntryIdsField("areq", techTreeDependencyIds)
536
+ self:setObjectDataEntryNumericIdsField("areq", techTreeDependencyIds)
528
537
  self:setNumbersField("arqa", techTreeDependencyInternalLevels)
529
538
  end
530
539
  },
@@ -714,26 +723,40 @@ __TS__SetDescriptor(
714
723
  )
715
724
  __TS__SetDescriptor(
716
725
  AbilityType.prototype,
717
- "soundPresetName",
726
+ "casterEffectSoundPresetId",
718
727
  {
719
728
  get = function(self)
720
- return self:getStringField("aefs")
729
+ local casterEffectSoundPresetId = self:getStringField("aefs")
730
+ return casterEffectSoundPresetId ~= "" and casterEffectSoundPresetId or nil
721
731
  end,
722
- set = function(self, soundPresetName)
723
- self:setStringField("aefs", soundPresetName)
732
+ set = function(self, casterEffectSoundPresetId)
733
+ self:setStringField("aefs", casterEffectSoundPresetId or "")
724
734
  end
725
735
  },
726
736
  true
727
737
  )
728
738
  __TS__SetDescriptor(
729
739
  AbilityType.prototype,
730
- "loopingSoundPresetName",
740
+ "casterEffectLoopingSoundPresetId",
731
741
  {
732
742
  get = function(self)
733
743
  return self:getStringField("aefl")
734
744
  end,
735
- set = function(self, loopingSoundPresetName)
736
- self:setStringField("aefl", loopingSoundPresetName)
745
+ set = function(self, casterEffectLoopingSoundPresetId)
746
+ self:setStringField("aefl", casterEffectLoopingSoundPresetId)
747
+ end
748
+ },
749
+ true
750
+ )
751
+ __TS__SetDescriptor(
752
+ AbilityType.prototype,
753
+ "targetEffectSoundPresetId",
754
+ {
755
+ get = function(self)
756
+ return targetEffectSoundPresetByAbilityTypeId[self.id]
757
+ end,
758
+ set = function(self, targetEffectSoundPresetId)
759
+ targetEffectSoundPresetByAbilityTypeId[self.id] = targetEffectSoundPresetId
737
760
  end
738
761
  },
739
762
  true
@@ -792,10 +815,10 @@ __TS__SetDescriptor(
792
815
  "buffTypeIds",
793
816
  {
794
817
  get = function(self)
795
- return self:getObjectDataEntryIdsLevelField("abuf")
818
+ return self:getObjectDataEntryNumericIdsLevelField("abuf")
796
819
  end,
797
820
  set = function(self, buffTypeIds)
798
- self:setObjectDataEntryIdsLevelField("abuf", buffTypeIds)
821
+ self:setObjectDataEntryNumericIdsLevelField("abuf", buffTypeIds)
799
822
  end
800
823
  },
801
824
  true
@@ -844,10 +867,10 @@ __TS__SetDescriptor(
844
867
  "effectBuffTypeIds",
845
868
  {
846
869
  get = function(self)
847
- return self:getObjectDataEntryIdsLevelField("aeff")
870
+ return self:getObjectDataEntryNumericIdsLevelField("aeff")
848
871
  end,
849
872
  set = function(self, effectBuffTypeIds)
850
- self:setObjectDataEntryIdsLevelField("aeff", effectBuffTypeIds)
873
+ self:setObjectDataEntryNumericIdsLevelField("aeff", effectBuffTypeIds)
851
874
  end
852
875
  },
853
876
  true
@@ -950,39 +973,136 @@ local _ = postcompile(function()
950
973
  abilityType.buttonPositionY = -11
951
974
  end
952
975
  end)
953
- ---
954
- -- @internal For use by internal systems only.
955
- ____exports.casterCastingEffectModelPathsByAbilityTypeId = postcompile(function()
976
+ for abilityTypeId, animationFQN in pairs(postcompile(function() return castAnimationFQNByAbilityTypeId end)) do
977
+ Unit.abilityCastingStartEvent[abilityTypeId]:addListener(
978
+ 4,
979
+ function(caster, ability)
980
+ if ability:getField(ABILITY_RLF_CASTING_TIME) ~= 0 then
981
+ Timer:run(function()
982
+ caster:playAnimation(animationFQN)
983
+ end)
984
+ end
985
+ end
986
+ )
987
+ end
988
+ for abilityTypeId, soundPresetId in pairs(postcompile(function() return targetEffectSoundPresetByAbilityTypeId end)) do
989
+ if soundPresetId ~= nil then
990
+ Unit.abilityWidgetTargetChannelingStartEvent[abilityTypeId]:addListener(
991
+ 4,
992
+ function(caster, ability, target)
993
+ if __TS__InstanceOf(target, Unit) then
994
+ Sound3D:playFromLabel(soundPresetId, SoundSettings.Ability, target)
995
+ else
996
+ Sound3D:playFromLabel(soundPresetId, SoundSettings.Ability, target.x, target.y)
997
+ end
998
+ end
999
+ )
1000
+ Unit.abilityPointTargetChannelingStartEvent[abilityTypeId]:addListener(
1001
+ 4,
1002
+ function(caster, ability, x, y)
1003
+ Sound3D:playFromLabel(soundPresetId, SoundSettings.Ability, x, y)
1004
+ end
1005
+ )
1006
+ end
1007
+ end
1008
+ local casterCastingEffectModelPathsByAbilityTypeId = postcompile(function()
956
1009
  return mapValues(
957
1010
  casterCastingEffectPresetsByAbilityTypeId,
958
1011
  function(casterCastingEffectPresets) return map(casterCastingEffectPresets, extractAttachmentPresetInputModelPath) end
959
1012
  )
960
1013
  end)
961
- ---
962
- -- @internal For use by internal systems only.
963
- ____exports.casterCastingEffectAttachmentPointsByAbilityTypeId = postcompile(function()
1014
+ local casterCastingEffectAttachmentPointsByAbilityTypeId = postcompile(function()
964
1015
  return mapValues(
965
1016
  casterCastingEffectPresetsByAbilityTypeId,
966
1017
  function(casterCastingEffectPresets) return map(casterCastingEffectPresets, extractAttachmentPresetInputNodeFQN) end
967
1018
  )
968
1019
  end)
969
- ---
970
- -- @internal For use by internal systems only.
971
- ____exports.casterChannelingEffectModelPathsByAbilityTypeId = postcompile(function()
1020
+ local casterCastingEffectParametersByAbilityTypeId = postcompile(function()
1021
+ return mapValues(
1022
+ casterCastingEffectPresetsByAbilityTypeId,
1023
+ function(casterCastingEffectPresets) return map(casterCastingEffectPresets, "parameters") end
1024
+ )
1025
+ end)
1026
+ local casterCastingEffectsByCaster = {}
1027
+ local function handleAbilityCastingStartEvent(caster, ability)
1028
+ local effectModelPaths = casterCastingEffectModelPathsByAbilityTypeId[ability.typeId]
1029
+ local attachmentPoints = casterCastingEffectAttachmentPointsByAbilityTypeId[ability.typeId]
1030
+ local parameters = casterCastingEffectParametersByAbilityTypeId[ability.typeId]
1031
+ local effects = {}
1032
+ if effectModelPaths ~= nil then
1033
+ for i = 1, #effectModelPaths do
1034
+ local effectModelPath = effectModelPaths[i]
1035
+ local attachmentPoint = attachmentPoints and attachmentPoints[i]
1036
+ if attachmentPoint == nil or attachmentPoint == "" then
1037
+ attachmentPoint = "origin"
1038
+ end
1039
+ effects[i] = Effect:create(effectModelPath, caster, attachmentPoint, parameters and parameters[i])
1040
+ end
1041
+ end
1042
+ casterCastingEffectsByCaster[caster] = effects
1043
+ end
1044
+ local function handleAbilityStopCastingEvent(caster)
1045
+ local effects = casterCastingEffectsByCaster[caster]
1046
+ if effects ~= nil then
1047
+ for i = 1, #effects do
1048
+ effects[i]:destroy()
1049
+ end
1050
+ casterCastingEffectsByCaster[caster] = nil
1051
+ end
1052
+ end
1053
+ for abilityTypeId in pairs(casterCastingEffectModelPathsByAbilityTypeId) do
1054
+ Unit.abilityCastingStartEvent[abilityTypeId]:addListener(4, handleAbilityCastingStartEvent)
1055
+ Unit.abilityChannelingStartEvent[abilityTypeId]:addListener(4, handleAbilityStopCastingEvent)
1056
+ Unit.abilityStopEvent[abilityTypeId]:addListener(4, handleAbilityStopCastingEvent)
1057
+ end
1058
+ local casterChannelingEffectModelPathsByAbilityTypeId = postcompile(function()
972
1059
  return mapValues(
973
1060
  casterChannelingEffectPresetsByAbilityTypeId,
974
1061
  function(casterChannelingEffectPresets) return map(casterChannelingEffectPresets, extractAttachmentPresetInputModelPath) end
975
1062
  )
976
1063
  end)
977
- ---
978
- -- @internal For use by internal systems only.
979
- ____exports.casterChannelingEffectAttachmentPointsByAbilityTypeId = postcompile(function()
1064
+ local casterChannelingEffectAttachmentPointsByAbilityTypeId = postcompile(function()
980
1065
  return mapValues(
981
1066
  casterChannelingEffectPresetsByAbilityTypeId,
982
1067
  function(casterChannelingEffectPresets) return map(casterChannelingEffectPresets, extractAttachmentPresetInputNodeFQN) end
983
1068
  )
984
1069
  end)
985
- warpack.afterMapInit(function()
986
- require("engine.object-data.entry.ability-type-effects")
1070
+ local casterChannelingEffectParametersByAbilityTypeId = postcompile(function()
1071
+ return mapValues(
1072
+ casterChannelingEffectPresetsByAbilityTypeId,
1073
+ function(casterChannelingEffectPresets) return map(casterChannelingEffectPresets, "parameters") end
1074
+ )
987
1075
  end)
1076
+ local casterChannelingEffectsByCaster = {}
1077
+ local function handleAbilityChannelingStartEvent(caster, ability)
1078
+ local effectModelPaths = casterChannelingEffectModelPathsByAbilityTypeId[ability.typeId]
1079
+ local attachmentPoints = casterChannelingEffectAttachmentPointsByAbilityTypeId[ability.typeId]
1080
+ local parameters = casterChannelingEffectParametersByAbilityTypeId[ability.typeId]
1081
+ local effects = {}
1082
+ if effectModelPaths ~= nil then
1083
+ for i = 1, #effectModelPaths do
1084
+ local effectModelPath = effectModelPaths[i]
1085
+ local attachmentPoint = attachmentPoints and attachmentPoints[i]
1086
+ if attachmentPoint == nil or attachmentPoint == "" then
1087
+ attachmentPoint = "origin"
1088
+ end
1089
+ effects[i] = Effect:create(effectModelPath, caster, attachmentPoint, parameters and parameters[i])
1090
+ end
1091
+ end
1092
+ casterChannelingEffectsByCaster[caster] = effects
1093
+ end
1094
+ local function handleAbilityStopChannelingEvent(caster)
1095
+ local effects = casterChannelingEffectsByCaster[caster]
1096
+ if effects ~= nil then
1097
+ for i = 1, #effects do
1098
+ effects[i]:destroy()
1099
+ end
1100
+ casterChannelingEffectsByCaster[caster] = nil
1101
+ end
1102
+ end
1103
+ for abilityTypeId in pairs(casterChannelingEffectModelPathsByAbilityTypeId) do
1104
+ Unit.abilityChannelingStartEvent[abilityTypeId]:addListener(4, handleAbilityChannelingStartEvent)
1105
+ Unit.abilityChannelingFinishEvent[abilityTypeId]:addListener(4, handleAbilityStopChannelingEvent)
1106
+ Unit.abilityStopEvent[abilityTypeId]:addListener(4, handleAbilityStopChannelingEvent)
1107
+ end
988
1108
  return ____exports
@@ -10,8 +10,8 @@ local ____exports = {}
10
10
  local preparePhysicalPositiveApplicatorAbility
11
11
  local ____ability_2Dtype = require("engine.object-data.entry.ability-type")
12
12
  local AbilityType = ____ability_2Dtype.AbilityType
13
- local ____cripple = require("engine.object-data.entry.ability-type.cripple")
14
- local CrippleAbilityType = ____cripple.CrippleAbilityType
13
+ local ____curse = require("engine.object-data.entry.ability-type.curse")
14
+ local CurseAbilityType = ____curse.CurseAbilityType
15
15
  local ____searing_2Darrows = require("engine.object-data.entry.ability-type.searing-arrows")
16
16
  local SearingArrowsAbilityType = ____searing_2Darrows.SearingArrowsAbilityType
17
17
  local ____slow_2Dpoison = require("engine.object-data.entry.ability-type.slow-poison")
@@ -30,7 +30,6 @@ local ____arrays = require("utility.arrays")
30
30
  local chunked = ____arrays.chunked
31
31
  local map = ____arrays.map
32
32
  local max = ____arrays.max
33
- local toLuaSet = ____arrays.toLuaSet
34
33
  local ____blood_2Dlust = require("engine.object-data.entry.ability-type.blood-lust")
35
34
  local BloodLustAbilityType = ____blood_2Dlust.BloodLustAbilityType
36
35
  local ____berserk = require("engine.object-data.entry.ability-type.berserk")
@@ -43,22 +42,11 @@ local ____permanent_2Dimmolation = require("engine.object-data.entry.ability-typ
43
42
  local PermanentImmolationAbilityType = ____permanent_2Dimmolation.PermanentImmolationAbilityType
44
43
  local ____cast_2Dability = require("engine.internal.mechanics.cast-ability")
45
44
  local castAbility = ____cast_2Dability.castAbility
46
- local createItem = CreateItem
47
- local getAbilityId = BlzGetAbilityId
48
- local getItemAbility = BlzGetItemAbility
49
- local getOwningPlayer = GetOwningPlayer
50
- local getUnitAbilityByIndex = BlzGetUnitAbilityByIndex
51
- local itemAddAbility = BlzItemAddAbility
52
- local removeItem = RemoveItem
53
45
  local setAbilityIntegerField = BlzSetAbilityIntegerField
54
46
  local setAbilityRealLevelField = BlzSetAbilityRealLevelField
55
- local setItemBooleanField = BlzSetItemBooleanField
56
47
  local setPlayerTechResearched = SetPlayerTechResearched
57
48
  local unitAddAbility = UnitAddAbility
58
- local unitAddItem = UnitAddItem
59
49
  local unitDisableAbility = BlzUnitDisableAbility
60
- local unitDropItemSlot = UnitDropItemSlot
61
- local unitInventorySize = UnitInventorySize
62
50
  local unitRemoveAbility = UnitRemoveAbility
63
51
  local compiletimeApplicableBuffTypes = {}
64
52
  ____exports.ApplicableBuffType = __TS__Class()
@@ -86,7 +74,7 @@ local applicatorAbilityTypeIdByApplicatorTypeByApplicableBuffTypeId, applicatorU
86
74
  abilityType.buttonPositionY = -11
87
75
  abilityType.casterAttachmentPresets = {}
88
76
  abilityType.targetEffectPresets = {}
89
- abilityType.soundPresetName = ""
77
+ abilityType.casterEffectSoundPresetId = nil
90
78
  abilityType.learnLevelMinimum = 6
91
79
  abilityType.race = "other"
92
80
  abilityType.shouldCheckTechTreeDependencies = false
@@ -113,12 +101,10 @@ local applicatorAbilityTypeIdByApplicatorTypeByApplicableBuffTypeId, applicatorU
113
101
  local applicatorAbilityTypeIdByApplicatorType = {}
114
102
  if applicableBuffType.resistanceType == 1 or applicableBuffType.resistanceType == nil then
115
103
  if applicableBuffType.polarity == 2 or applicableBuffType.polarity == nil then
116
- local applicatorAbilityType = prepareAbilityType(CrippleAbilityType, applicableBuffType)
117
- applicatorAbilityType.movementSpeedDecreaseFactor = 0
118
- applicatorAbilityType.attackSpeedDecreaseFactor = 0
119
- applicatorAbilityType.damageDecreaseFactor = 0
104
+ local applicatorAbilityType = prepareAbilityType(CurseAbilityType, applicableBuffType)
105
+ applicatorAbilityType.missProbability = 0
120
106
  applicatorAbilityType.buffTypeIds = {applicableBuffType.id}
121
- applicatorAbilityTypeIdByApplicatorType[852189] = applicatorAbilityType.id
107
+ applicatorAbilityTypeIdByApplicatorType[852190] = applicatorAbilityType.id
122
108
  end
123
109
  if applicableBuffType.polarity == 1 or applicableBuffType.polarity == nil then
124
110
  local applicatorAbilityType = prepareAbilityType(BloodLustAbilityType, applicableBuffType)
@@ -204,15 +190,6 @@ local EVASION_ABILITY_TYPE_IDS = postcompile(function()
204
190
  "AIcs"
205
191
  }, fourCC))
206
192
  end)
207
- local INVENTORY_ABILITY_TYPE_IDS = postcompile(function()
208
- return toLuaSet(AbilityType:getAllIdsByBaseIds(map({
209
- "AInv",
210
- "Aihn",
211
- "Aien",
212
- "Aion",
213
- "Aiun"
214
- }, fourCC)))
215
- end)
216
193
  local SEARING_ARROWS_DUMMY_ABILITY_TYPE_ID = compiletime(function()
217
194
  local abilityType = SearingArrowsAbilityType:create()
218
195
  abilityType.isInternal = true
@@ -244,8 +221,8 @@ Unit.abilityCastingStartEvent[SEARING_ARROWS_DUMMY_ABILITY_TYPE_ID]:addListener(
244
221
  )
245
222
  ---
246
223
  -- @internal For use by internal systems only.
247
- ____exports.internalApplyBuff = function(unit, applicableBuffTypeId, polarity, resistanceType, level, duration, spellStealPriority, learnLevelMinimum, movementSpeedIncreaseFactor)
248
- local applicatorType = polarity == 1 and (resistanceType == 1 and 852101 or 852100) or (polarity == 2 and (resistanceType == 1 and 852189 or 852173) or 0)
224
+ ____exports.internalApplyBuff = function(unit, applicableBuffTypeId, polarity, resistanceType, level, duration, spellStealPriority, learnLevelMinimum, missProbability)
225
+ local applicatorType = polarity == 1 and (resistanceType == 1 and 852101 or 852100) or (polarity == 2 and (resistanceType == 1 and 852190 or 852173) or 0)
249
226
  local ____opt_1 = applicatorAbilityTypeIdByApplicatorTypeByApplicableBuffTypeId[applicableBuffTypeId]
250
227
  local applicatorAbilityTypeId = ____opt_1 and ____opt_1[applicatorType]
251
228
  if applicatorAbilityTypeId == nil then
@@ -267,8 +244,7 @@ ____exports.internalApplyBuff = function(unit, applicableBuffTypeId, polarity, r
267
244
  applicatorAbilityTypeId,
268
245
  preparePhysicalPositiveApplicatorAbility,
269
246
  level,
270
- duration or 0,
271
- movementSpeedIncreaseFactor
247
+ duration or 0
272
248
  )
273
249
  if level ~= nil and level > 0 then
274
250
  local upgradeId = applicatorUpgradeIdByApplicatorAbilityTypeId[applicatorAbilityTypeId]
@@ -298,6 +274,9 @@ ____exports.internalApplyBuff = function(unit, applicableBuffTypeId, polarity, r
298
274
  ability:setField(ABILITY_RLF_DURATION_HERO, level, actualDuration)
299
275
  ability:setField(ABILITY_IF_PRIORITY, spellStealPriority or 0)
300
276
  ability:setField(ABILITY_IF_REQUIRED_LEVEL, learnLevelMinimum or 6)
277
+ if missProbability ~= nil and applicatorType == 852190 then
278
+ ability:setField(ABILITY_RLF_CHANCE_TO_MISS_CRS, missProbability)
279
+ end
301
280
  end,
302
281
  applicatorType,
303
282
  unit
@@ -309,16 +288,13 @@ ____exports.internalApplyBuff = function(unit, applicableBuffTypeId, polarity, r
309
288
  end
310
289
  return success
311
290
  end
312
- preparePhysicalPositiveApplicatorAbility = function(ability, level, duration, movementSpeedIncreaseFactor)
291
+ preparePhysicalPositiveApplicatorAbility = function(ability, level, duration)
313
292
  if level == nil then
314
293
  setAbilityIntegerField(ability, ABILITY_IF_LEVELS, 1)
315
294
  level = 1
316
295
  end
317
296
  setAbilityRealLevelField(ability, ABILITY_RLF_DURATION_NORMAL, level, duration)
318
297
  setAbilityRealLevelField(ability, ABILITY_RLF_DURATION_HERO, level, duration)
319
- if movementSpeedIncreaseFactor ~= nil then
320
- setAbilityRealLevelField(ability, ABILITY_RLF_MOVEMENT_SPEED_INCREASE_BSK1, level, movementSpeedIncreaseFactor)
321
- end
322
298
  end
323
299
  ---
324
300
  -- @internal For use by internal systems only.
@@ -5,7 +5,7 @@ import { Race } from "../auxiliary/race";
5
5
  import { SoundPresetName } from "../auxiliary/sound-preset-name";
6
6
  import { ObjectDataEntry, ObjectDataEntryId } from "../entry";
7
7
  import { LightningTypeId } from "./lightning-type";
8
- export type BuffTypeId = ObjectDataEntryId & {
8
+ export type BuffTypeId = ObjectDataEntryId & number & {
9
9
  readonly __buffTypeId: unique symbol;
10
10
  };
11
11
  export declare abstract class BuffType<Id extends BuffTypeId = BuffTypeId> extends ObjectDataEntry<Id> {
@@ -94,10 +94,10 @@ __TS__SetDescriptor(
94
94
  "lightningTypeIds",
95
95
  {
96
96
  get = function(self)
97
- return self:getObjectDataEntryIdsField("flig")
97
+ return self:getObjectDataEntryNumericIdsField("flig")
98
98
  end,
99
99
  set = function(self, lightningTypeIds)
100
- self:setObjectDataEntryIdsField("flig", lightningTypeIds)
100
+ self:setObjectDataEntryNumericIdsField("flig", lightningTypeIds)
101
101
  end
102
102
  },
103
103
  true
@@ -2,7 +2,7 @@
2
2
  import { ArmorSoundType } from "../auxiliary/armor-sound-type";
3
3
  import { CombatClassifications } from "../auxiliary/combat-classification";
4
4
  import { ObjectDataEntry, ObjectDataEntryId } from "../entry";
5
- export type DestructibleTypeId = ObjectDataEntryId & {
5
+ export type DestructibleTypeId = ObjectDataEntryId & number & {
6
6
  readonly __destructibleTypeId: unique symbol;
7
7
  };
8
8
  export declare abstract class DestructibleType extends ObjectDataEntry<DestructibleTypeId> {
@@ -2,7 +2,7 @@
2
2
  import { ArmorSoundType } from "../auxiliary/armor-sound-type";
3
3
  import { ObjectDataEntry, ObjectDataEntryId } from "../entry";
4
4
  import type { AbilityTypeId } from "./ability-type";
5
- export type ItemTypeId = ObjectDataEntryId & {
5
+ export type ItemTypeId = ObjectDataEntryId & number & {
6
6
  readonly __itemTypeId: unique symbol;
7
7
  };
8
8
  export declare class ItemType extends ObjectDataEntry<ItemTypeId> {
@@ -27,10 +27,10 @@ __TS__SetDescriptor(
27
27
  "abilityTypeIds",
28
28
  {
29
29
  get = function(self)
30
- return self:getObjectDataEntryIdsField("iabi")
30
+ return self:getObjectDataEntryNumericIdsField("iabi")
31
31
  end,
32
32
  set = function(self, abilityTypeIds)
33
- self:setObjectDataEntryIdsField("iabi", abilityTypeIds)
33
+ self:setObjectDataEntryNumericIdsField("iabi", abilityTypeIds)
34
34
  end
35
35
  },
36
36
  true
@@ -261,10 +261,10 @@ __TS__SetDescriptor(
261
261
  "cooldownGroupId",
262
262
  {
263
263
  get = function(self)
264
- return self:getObjectDataEntryIdField("icid")
264
+ return self:getObjectDataEntryNumericIdField("icid")
265
265
  end,
266
266
  set = function(self, cooldownGroupId)
267
- self:setObjectDataEntryIdField("icid", cooldownGroupId)
267
+ self:setObjectDataEntryNumericIdField("icid", cooldownGroupId)
268
268
  end
269
269
  },
270
270
  true
@@ -1,7 +1,7 @@
1
1
  /** @noSelfInFile */
2
2
  import { ObjectDataEntry, ObjectDataEntryConstructor, ObjectDataEntryId } from "../entry";
3
3
  import { Color } from "../../../core/types/color";
4
- export type LightningTypeId = ObjectDataEntryId & {
4
+ export type LightningTypeId = ObjectDataEntryId & number & {
5
5
  readonly __lightningTypeId: unique symbol;
6
6
  };
7
7
  export type StandardLightningTypeId = LightningTypeId & {
@@ -0,0 +1,33 @@
1
+ /** @noSelfInFile */
2
+ import { ObjectDataEntry, ObjectDataEntryId } from "../entry";
3
+ import { SoundEax } from "../auxiliary/sound-eax";
4
+ export type SoundPresetId = ObjectDataEntryId & string & {
5
+ readonly __soundPresetId: unique symbol;
6
+ };
7
+ export type StandardSoundPresetId = SoundPresetId & {
8
+ readonly __standardSoundPresetId: unique symbol;
9
+ };
10
+ export declare class SoundPreset extends ObjectDataEntry<SoundPresetId> {
11
+ static readonly BASE_ID: SoundPresetId;
12
+ private static nextId;
13
+ protected static generateId(): string;
14
+ protected static getObjectData(map: WarMap): WarObjects;
15
+ get filePaths(): string[];
16
+ set filePaths(filePaths: string[]);
17
+ get volume(): number;
18
+ set volume(volume: number);
19
+ get pitch(): number;
20
+ set pitch(pitch: number);
21
+ get priority(): number;
22
+ set priority(priority: number);
23
+ get channel(): number;
24
+ set channel(channel: number);
25
+ get minimumDistance(): number;
26
+ set minimumDistance(minimumDistance: number);
27
+ get maximumDistance(): number;
28
+ set maximumDistance(maximumDistance: number);
29
+ get distanceCutoff(): number;
30
+ set distanceCutoff(distanceCutoff: number);
31
+ get eax(): SoundEax;
32
+ set eax(eax: SoundEax);
33
+ }