From 3ede76b5145001bd105e23f5d16d17bf2c9a0f6f Mon Sep 17 00:00:00 2001 From: Jai <814683@qq.com> Date: Tue, 11 Jul 2023 23:43:09 +0800 Subject: [PATCH] fix: readbuffer not support sign integer --- bin/build.lua | 30 +++++- init.bat | 2 +- src/lua/core/checker.lua | 6 +- src/lua/core/dummper.lua | 30 +++--- src/lua/core/readbuffer.lua | 4 +- src/lua/object/AbilityObjEditing.lua | 135 +++++++++++++++++++++++++-- 6 files changed, 175 insertions(+), 32 deletions(-) diff --git a/bin/build.lua b/bin/build.lua index 1bbe490..5c0616f 100644 --- a/bin/build.lua +++ b/bin/build.lua @@ -83,16 +83,28 @@ local function generateAPI(file, name) o:close() local apis = {} + local super = {} - local lastfunc - local lastClass + local lastfunc, lastClass, lastSuperClass for i, line in ipairs(string.split(lua, '\n')) do - if string.startswith(line, '_G.') then - lastClass = line:split(' ')[3] - elseif string.find(line, 'function') then + local cls = string.gmatch(line, "= class%('(%w+)'.*%)")() + if cls then + lastClass = cls + lastSuperClass = nil + elseif string.find(line, '^function ') then lastfunc = string.gsub(string.gsub(line, 'function %w+:', ''), '%(.*%)', '') elseif string.find(line, '^end') then + if lastSuperClass then + super[lastSuperClass] = lastClass + else + super[0] = lastClass + end lastfunc = nil + elseif string.find(line, 'self.def = ') then + local s, i = string.gsub(line, ".*'(%w+)'.*", '%1') + if i > 0 then + lastSuperClass = s + end elseif string.find(line, 'self.def:') then local k = string.gsub(line, '.*%(\'(%w+).*', '%1') apis[k] = {cls = lastClass, func = lastfunc} @@ -103,8 +115,16 @@ local function generateAPI(file, name) for key, value in pairs(apis) do table.insert(lines, string.format('["%s"]={cls="%s", func="%s"},', key, value.cls, value.func)) end + table.insert(lines, '["super"] = {') + for key, value in pairs(super) do + table.insert(lines, string.format('["%s"]="%s",', key, value)) + end + table.insert(lines, '},') table.insert(lines, '}') local ret = table.concat(lines, '\n') + local f = io.open(file .. '.txt', 'w') + f:write(ret) + f:close() return files[name], ret end diff --git a/init.bat b/init.bat index ea5c7d9..483ea88 100644 --- a/init.bat +++ b/init.bat @@ -1,2 +1,2 @@ cd /d "%~dp0" -call bin\premake5.exe vs2019 +call bin\premake5.exe vs2022 diff --git a/src/lua/core/checker.lua b/src/lua/core/checker.lua index 9a4c89c..d023e8e 100644 --- a/src/lua/core/checker.lua +++ b/src/lua/core/checker.lua @@ -17,7 +17,7 @@ function checktype(value, checkType, api, index) return end - if checkType == 'float' and t == 'integer' then + if checkType == 'float' and t == 'integer' or checkType == 'integer' and t == 'float' then return end @@ -42,9 +42,9 @@ function checkenum(value, enum, api, index) if not e then return end - if enumCache[e][value] then + if enumCache[e][value] or value == '' then return end - error(string.format([[bad argument #%s to '%s' (%s expected, got %s)]], index, api, enum, type(value))) + error(string.format([[bad argument #%s to '%s' (%s expected, got %s, value %s)]], index, api, enum, type(value), value)) end diff --git a/src/lua/core/dummper.lua b/src/lua/core/dummper.lua index 378c745..8adbfea 100644 --- a/src/lua/core/dummper.lua +++ b/src/lua/core/dummper.lua @@ -13,7 +13,7 @@ function Dummper:prepareAPIs(defType) return end - self.file = io.open(string.format([[dump.%s.lua]], defType), 'w') + self.file = io.open(string.format([[%s.lua]], defType), 'w') end @@ -25,13 +25,14 @@ function Dummper:exec(defs) return end - local info = {} + local info = {'local u'} for id, def in pairs(defs) do local index = #info + 1 - local cls + local sub = {} for k, v in pairs(def.fields) do - if not sourcecode[self.defType][v.id] then - print('Miss API with', self.defType, def.id, v.id, v.value) + local api = sourcecode[self.defType][v.id] + if not api then + -- print('Miss API with', self.defType, def.id, v.id, v.value) else local value = v.value if type(value) == 'string' then @@ -41,20 +42,23 @@ function Dummper:exec(defs) value = '""' end end - if v.level then - table.insert(info, string.format('u%s:%s(%s, %s)', def.id, sourcecode[self.defType][v.id].func, + if v.level and v.level > 0 then + table.insert(sub, string.format('u:%s(%s, %s)', api.func, v.level, value)) else - table.insert(info, string.format('u%s:%s(%s)', def.id, sourcecode[self.defType][v.id].func, value)) + table.insert(sub, string.format('u:%s(%s)', api.func, value)) end - cls = sourcecode[self.defType][v.id].cls end end - - if def.superId then - table.insert(info, index, string.format('\nlocal u%s=%s:new("%s", "%s")', def.id, cls, def.id, def.superId)) + local cls = sourcecode[self.defType].super[def.superId or def.id] + if cls then + table.insert(info, index, string.format('\nu=%s:new("%s")', cls, def.id)) else - table.insert(info, index, string.format('\nlocal u%s=%s:new("%s")', def.id, cls, def.id)) + cls = sourcecode[self.defType].super["0"] + table.insert(info, index, string.format('\nu=%s:new("%s", "%s")', cls, def.id, def.superId or def.id)) + end + if #sub > 0 then + table.insert(info, table.concat(sub, '\n')) end end diff --git a/src/lua/core/readbuffer.lua b/src/lua/core/readbuffer.lua index 483310f..123ecf4 100644 --- a/src/lua/core/readbuffer.lua +++ b/src/lua/core/readbuffer.lua @@ -18,11 +18,11 @@ function ReadBuffer:readRaw(n) end function ReadBuffer:readInt() - return string.unpack('I4<', self:readRaw(4)) + return string.unpack('i4<', self:readRaw(4)) end function ReadBuffer:readShort() - return string.unpack('I2<', self:readRaw(2)) + return string.unpack('i2<', self:readRaw(2)) end function ReadBuffer:readFloat() diff --git a/src/lua/object/AbilityObjEditing.lua b/src/lua/object/AbilityObjEditing.lua index a1730e3..77cfb93 100644 --- a/src/lua/object/AbilityObjEditing.lua +++ b/src/lua/object/AbilityObjEditing.lua @@ -1,6 +1,12 @@ AbilityDefinition = class('AbilityDefinition') _G.AbilityDefinition = AbilityDefinition +function AbilityDefinition:constructor(id, superId) + if superId then + self.def = createDefinition(DefinitionType.Ability, id, superId) + end +end + function AbilityDefinition:setName(value) checktype(value, 'string', 'setName', 1) self.def:setLvlDataString('anam', 0, 0, value) @@ -231,6 +237,7 @@ function AbilityDefinition:setHotkeyTurnOff(value) end function AbilityDefinition:setRequirements(value) + checktype(self.def, 'table', 'setRequirements', 0) checktype(value, 'string', 'setRequirements', 1) self.def:setLvlDataString('areq', 0, 0, value) end @@ -5576,8 +5583,8 @@ end function AbilityDefinitionNeutralBuilding:setInteractionType(level, value) checktype(level, 'integer', 'setInteractionType', 1) - checktype(value, 'string', 'setInteractionType', 2) - self.def:setLvlDataString('Neu2', level, 2, value) + checktype(value, 'integer', 'setInteractionType', 2) + self.def:setLvlDataInt('Neu2', level, 2, value) end AbilityDefinitionShopSharing = class('AbilityDefinitionShopSharing', AbilityDefinition) @@ -5607,8 +5614,8 @@ end function AbilityDefinitionShopSharing:setInteractionType(level, value) checktype(level, 'integer', 'setInteractionType', 1) - checktype(value, 'string', 'setInteractionType', 2) - self.def:setLvlDataString('Neu2', level, 2, value) + checktype(value, 'integer', 'setInteractionType', 2) + self.def:setLvlDataInt('Neu2', level, 2, value) end AbilityDefinitionRepairHuman = class('AbilityDefinitionRepairHuman', AbilityDefinition) @@ -5716,6 +5723,49 @@ function AbilityDefinitionFirelordIncinerate:setDeathDamageHalfArea(level, value self.def:setLvlDataUnreal('Nic5', level, 5, value) end +AbilityDefinitionFirelordIncinerateArrow = class('AbilityDefinitionFirelordIncinerateArrow', AbilityDefinition) +_G.AbilityDefinitionFirelordIncinerateArrow = AbilityDefinitionFirelordIncinerateArrow + +function AbilityDefinitionFirelordIncinerateArrow:constructor(id) + self.def = createDefinition(DefinitionType.Ability, id, 'ANia') +end + +function AbilityDefinitionFirelordIncinerateArrow:setDeathDamageHalfAmount(level, value) + checktype(level, 'integer', 'setDeathDamageHalfAmount', 1) + checktype(value, 'float', 'setDeathDamageHalfAmount', 2) + self.def:setLvlDataUnreal('Nic4', level, 4, value) +end + +function AbilityDefinitionFirelordIncinerateArrow:setDeathDamageFullArea(level, value) + checktype(level, 'integer', 'setDeathDamageFullArea', 1) + checktype(value, 'float', 'setDeathDamageFullArea', 2) + self.def:setLvlDataUnreal('Nic3', level, 3, value) +end + +function AbilityDefinitionFirelordIncinerateArrow:setBonusDamageMultiplier(level, value) + checktype(level, 'integer', 'setBonusDamageMultiplier', 1) + checktype(value, 'float', 'setBonusDamageMultiplier', 2) + self.def:setLvlDataUnreal('Nic1', level, 1, value) +end + +function AbilityDefinitionFirelordIncinerateArrow:setDeathDamageFullAmount(level, value) + checktype(level, 'integer', 'setDeathDamageFullAmount', 1) + checktype(value, 'float', 'setDeathDamageFullAmount', 2) + self.def:setLvlDataUnreal('Nic2', level, 2, value) +end + +function AbilityDefinitionFirelordIncinerateArrow:setDeathDamageDelay(level, value) + checktype(level, 'integer', 'setDeathDamageDelay', 1) + checktype(value, 'float', 'setDeathDamageDelay', 2) + self.def:setLvlDataUnreal('Nic6', level, 6, value) +end + +function AbilityDefinitionFirelordIncinerateArrow:setDeathDamageHalfArea(level, value) + checktype(level, 'integer', 'setDeathDamageHalfArea', 1) + checktype(value, 'float', 'setDeathDamageHalfArea', 2) + self.def:setLvlDataUnreal('Nic5', level, 5, value) +end + AbilityDefinitionBearform = class('AbilityDefinitionBearform', AbilityDefinition) _G.AbilityDefinitionBearform = AbilityDefinitionBearform @@ -6837,8 +6887,8 @@ end function AbilityDefinitionNeutralBuildinganyunit:setInteractionType(level, value) checktype(level, 'integer', 'setInteractionType', 1) - checktype(value, 'string', 'setInteractionType', 2) - self.def:setLvlDataString('Neu2', level, 2, value) + checktype(value, 'integer', 'setInteractionType', 2) + self.def:setLvlDataInt('Neu2', level, 2, value) end AbilityDefinitionGhost = class('AbilityDefinitionGhost', AbilityDefinition) @@ -11552,8 +11602,8 @@ end function AbilityDefinitionAlliedBuilding:setInteractionType(level, value) checktype(level, 'integer', 'setInteractionType', 1) - checktype(value, 'string', 'setInteractionType', 2) - self.def:setLvlDataString('Neu2', level, 2, value) + checktype(value, 'integer', 'setInteractionType', 2) + self.def:setLvlDataInt('Neu2', level, 2, value) end AbilityDefinitionControlMagic = class('AbilityDefinitionControlMagic', AbilityDefinition) @@ -11674,6 +11724,37 @@ function AbilityDefinitionAllPlus2:setStrengthBonus(level, value) self.def:setLvlDataInt('Istr', level, 3, value) end +AbilityDefinitionAllPlus3 = class('AbilityDefinitionAllPlus3', AbilityDefinition) +_G.AbilityDefinitionAllPlus3 = AbilityDefinitionAllPlus3 + +function AbilityDefinitionAllPlus3:constructor(id) + self.def = createDefinition(DefinitionType.Ability, id, 'AIx3') +end + +function AbilityDefinitionAllPlus3:setHideButton(level, value) + checktype(level, 'integer', 'setHideButton', 1) + checktype(value, 'boolean', 'setHideButton', 2) + self.def:setLvlDataBoolean('Ihid', level, 4, value) +end + +function AbilityDefinitionAllPlus3:setIntelligenceBonus(level, value) + checktype(level, 'integer', 'setIntelligenceBonus', 1) + checktype(value, 'integer', 'setIntelligenceBonus', 2) + self.def:setLvlDataInt('Iint', level, 2, value) +end + +function AbilityDefinitionAllPlus3:setAgilityBonus(level, value) + checktype(level, 'integer', 'setAgilityBonus', 1) + checktype(value, 'integer', 'setAgilityBonus', 2) + self.def:setLvlDataInt('Iagi', level, 1, value) +end + +function AbilityDefinitionAllPlus3:setStrengthBonus(level, value) + checktype(level, 'integer', 'setStrengthBonus', 1) + checktype(value, 'integer', 'setStrengthBonus', 2) + self.def:setLvlDataInt('Istr', level, 3, value) +end + AbilityDefinitionCrownofKingsAllPlus5 = class('AbilityDefinitionCrownofKingsAllPlus5', AbilityDefinition) _G.AbilityDefinitionCrownofKingsAllPlus5 = AbilityDefinitionCrownofKingsAllPlus5 @@ -13446,6 +13527,37 @@ function AbilityDefinitionSeaWitchForkedLightning:setDistance(level, value) self.def:setLvlDataUnreal('Ucs3', level, 3, value) end +AbilityDefinitionLightning = class('AbilityDefinitionLightning', AbilityDefinition) +_G.AbilityDefinitionLightning = AbilityDefinitionLightning + +function AbilityDefinitionLightning:constructor(id) + self.def = createDefinition(DefinitionType.Ability, id, 'ACfl') +end + +function AbilityDefinitionLightning:setNumberofTargetsHit(level, value) + checktype(level, 'integer', 'setNumberofTargetsHit', 1) + checktype(value, 'integer', 'setNumberofTargetsHit', 2) + self.def:setLvlDataInt('Ocl2', level, 2, value) +end + +function AbilityDefinitionLightning:setDamageperTarget(level, value) + checktype(level, 'integer', 'setDamageperTarget', 1) + checktype(value, 'float', 'setDamageperTarget', 2) + self.def:setLvlDataUnreal('Ocl1', level, 1, value) +end + +function AbilityDefinitionLightning:setFinalArea(level, value) + checktype(level, 'integer', 'setFinalArea', 1) + checktype(value, 'float', 'setFinalArea', 2) + self.def:setLvlDataUnreal('Ucs4', level, 4, value) +end + +function AbilityDefinitionLightning:setDistance(level, value) + checktype(level, 'integer', 'setDistance', 1) + checktype(value, 'float', 'setDistance', 2) + self.def:setLvlDataUnreal('Ucs3', level, 3, value) +end + AbilityDefinitionStrengthMod = class('AbilityDefinitionStrengthMod', AbilityDefinition) _G.AbilityDefinitionStrengthMod = AbilityDefinitionStrengthMod @@ -15876,3 +15988,10 @@ function AbilityDefinitionSunderingBlades:setDefenseTypeAffected(level, types) checktype(types, 'integer', 'setDefenseTypeAffected', 2) self.def:setLvlDataInt('Hsb3', level, 3, types) end + +AbilityDefinitionOrb = class('AbilityDefinitionOrb', AbilityDefinition) +_G.AbilityDefinitionOrb = AbilityDefinitionOrb + +function AbilityDefinitionOrb:constructor(id) + self.def = createDefinition(DefinitionType.Ability, id, 'Asph') +end