scales[WeaponType.SmartCannon] = { {from = 0, to = 28, size = 1.0, usedSlots = 2}, {from = 29, to = 38, size = 1,5, usedSlots = 3}, {from = 39, to = 49, size = 2.0, usedSlots = 4}, --dummy for cooaxial, add 1 to size and level {from = 50, to = 52, size = 4.0, usedSlots = 5}, } scales[WeaponType.HeavyCannon] = { {from = 0, to = 28, size = 3.0, usedSlots = 4}, {from = 29, to = 38, size = 4.0, usedSlots = 5}, {from = 39, to = 49, size = 5.0, usedSlots = 6}, --dummy for cooaxial, add 1 to size and level {from = 50, to = 52, size = 6, usedSlots = 6}, } scales[WeaponType.Diffuser] = { {from = 0, to = 46, size = 1.0, usedSlots = 2}, {from = 47, to = 50, size = 2.0, usedSlots = 4}, --dummy for cooaxial, add 1 to size and level {from = 51, to = 52, size = 3.0, usedSlots = 6}, } scales[WeaponType.Hookgun] = { {from = 0, to = 46, size = 1.0, usedSlots = 2}, {from = 47, to = 50, size = 2.0, usedSlots = 4}, --dummy for cooaxial, add 1 to size and level {from = 51, to = 52, size = 4.0, usedSlots = 6}, } scales[WeaponType.HiveLauncher] = { {from = 0, to = 32, size = 1.0, usedSlots = 2}, {from = 33, to = 40, size = 1.5, usedSlots = 3}, {from = 41, to = 50, size = 2.0, usedSlots = 4}, --dummy for cooaxial, add 1 to size and level {from = 51, to = 52, size = 3.0, usedSlots = 6}, } if GameVersion() >= Version(0, 31, 0) then possibleSpecialties[WeaponType.SmartCannon] = { {specialty = Specialty.HighDamage, probability = 0.2}, {specialty = Specialty.HighFireRate, probability = 0.3}, {specialty = Specialty.HighRange, probability = 0.7}, } else possibleSpecialties[WeaponType.SmartCannon] = { Specialty.HighDamage, Specialty.HighFireRate, Specialty.HighRange, Specialty.HighHullDamage, Specialty.LessCoolingTime, } end if GameVersion() >= Version(0, 31, 0) then possibleSpecialties[WeaponType.HeavyCannon] = { {specialty = Specialty.HighDamage, probability = 0.2}, {specialty = Specialty.HighRange, probability = 0.35}, {specialty = Specialty.HighFireRate, probability = 0.3}, } else possibleSpecialties[WeaponType.HeavyCannon] = { Specialty.HighDamage, Specialty.HighFireRate, Specialty.HighRange, Specialty.HighHullDamage, Specialty.HighShieldDamage, Specialty.LessCoolingTime, } end if GameVersion() >= Version(0, 31, 0) then possibleSpecialties[WeaponType.Diffuser] = { {specialty = Specialty.HighDamage, probability = 0.3}, {specialty = Specialty.HighRange, probability = 0.3}, } else possibleSpecialties[WeaponType.Diffuser] = { Specialty.HighDamage, Specialty.HighRange, Specialty.FasterRechargeTime, } end if GameVersion() >= Version(0, 31, 0) then possibleSpecialties[WeaponType.Hookgun] = { {specialty = Specialty.HighDamage, probability = 0.3}, {specialty = Specialty.HighRange, probability = 0.3}, } else possibleSpecialties[WeaponType.Hookgun] = { Specialty.HighDamage, Specialty.HighRange, Specialty.FasterRechargeTime, } end if GameVersion() >= Version(0, 31, 0) then possibleSpecialties[WeaponType.HiveLauncher] = { {specialty = Specialty.HighShootingTime, probability = 0.2}, {specialty = Specialty.HighDamage, probability = 0.15}, {specialty = Specialty.HighFireRate, probability = 0.15}, {specialty = Specialty.HighRange, probability = 0.25}, {specialty = Specialty.BurstFire, probability = 0.1}, } else possibleSpecialties[WeaponType.HiveLauncher] = { Specialty.HighDamage, Specialty.HighRange, Specialty.FasterRechargeTime, } end function TurretGenerator.generateSmartCannonTurret(rand, dps, tech, material, rarity) local result = TurretTemplate() -- generate turret local requiredCrew = TurretGenerator.dpsToRequiredCrew(dps) local crew = Crew() crew:add(requiredCrew, CrewMan(CrewProfessionType.Gunner)) result.crew = crew -- generate weapons local numWeapons = rand:getInt(1, 4) local weapon = WeaponGenerator.generateSmartCannon(rand, dps, tech, material, rarity) weapon.fireDelay = weapon.fireDelay * numWeapons -- attach weapons to turret TurretGenerator.attachWeapons(rand, result, weapon, numWeapons) local shootingTime = 25 * rand:getFloat(0.8, 1.2) local coolingTime = 15 * rand:getFloat(0.8, 1.2) TurretGenerator.createStandardCooling(result, coolingTime, shootingTime) TurretGenerator.scale(rand, result, WeaponType.SmartCannon, tech, 0.6) local specialties = TurretGenerator.addSpecialties(rand, result, WeaponType.SmartCannon) result.slotType = TurretSlotType.Armed result:updateStaticStats() local name = "Smart-Cannon /* weapon name*/"%_T local specType = rand:getInt(0, 2) if specType == 1 then name = "Ionized Smart-Cannon /* weapon name*/"%_T weapon.shieldPenetration = 1 elseif specType == 2 then name = "Plasmed Smart-Cannon /* weapon name*/"%_T weapon.damageType = DamageType.Plasma weapon.damage = weapon.damage * 0.9 end local dmgAdjective, outerAdjective, barrel, multishot, coax, serial = makeTitleParts(rand, specialties, result, DamageType.Physical) result.title = Format("%1%%2%%3%%4%%5%%6%%7% /* [outer-adjective][barrel][coax][dmg-adjective][multishot][name][serial] */"%_T, outerAdjective, barrel, coax, dmgAdjective, multishot, name, serial) return result end generatorFunction[WeaponType.SmartCannon] = TurretGenerator.generateSmartCannonTurret function TurretGenerator.generateHeavyCannonTurret(rand, dps, tech, material, rarity) local result = TurretTemplate() -- generate turret local requiredCrew = TurretGenerator.dpsToRequiredCrew(dps) local crew = Crew() crew:add(requiredCrew, CrewMan(CrewProfessionType.Gunner)) crew:add(requiredCrew, CrewMan(CrewProfessionType.Repair)) result.crew = crew -- generate weapons local numWeapons = rand:getInt(1, 4) local weapon = WeaponGenerator.generateHeavyCannon(rand, dps, tech, material, rarity) weapon.fireDelay = weapon.fireDelay * numWeapons -- attach weapons to turret TurretGenerator.attachWeapons(rand, result, weapon, numWeapons) local shootingTime = 25 * rand:getFloat(0.8, 1.2) local coolingTime = 20 * rand:getFloat(0.8, 1.2) TurretGenerator.createStandardCooling(result, coolingTime, shootingTime) TurretGenerator.scale(rand, result, WeaponType.HeavyCannon, tech, 0.6) local specialties = TurretGenerator.addSpecialties(rand, result, WeaponType.HeavyCannon) result.slotType = TurretSlotType.Armed result:updateStaticStats() local name = "Heavy Cannon /* weapon name*/"%_T local dmgAdjective, outerAdjective, barrel, multishot, coax, serial = makeTitleParts(rand, specialties, result, DamageType.Physical) local Pen = rand:getInt(0, rarity.value) if Pen > 0 then weapon.blockPenetration = Pen outerAdjective = "Cumulative "%_T end if result.size >= 4 then name = "Mons Meg /* weapon name*/"%_T end if result.size >= 5 then name = "Dulle Griet /* weapon name*/"%_T end result.title = Format("%1%%2%%3%%4%%5%%6%%7% /* [outer-adjective][barrel][coax][dmg-adjective][multishot][name][serial] */"%_T, outerAdjective, barrel, coax, dmgAdjective, multishot, name, serial) return result end generatorFunction[WeaponType.HeavyCannon] = TurretGenerator.generateHeavyCannonTurret function TurretGenerator.generateDiffuserTurret(rand, dps, tech, material, rarity) local result = TurretTemplate() -- generate turret local requiredCrew = TurretGenerator.dpsToRequiredCrew(dps) local crew = Crew() crew:add(requiredCrew, CrewMan(CrewProfessionType.Gunner)) result.crew = crew -- generate weapons local numWeapons = rand:getInt(1, 2) local weapon = WeaponGenerator.generateDiffuser(rand, dps, tech, material, rarity) weapon.damage = weapon.damage / numWeapons -- attach weapons to turret TurretGenerator.attachWeapons(rand, result, weapon, numWeapons) local rechargeTime = 20 * rand:getFloat(0.8, 1.2) local shootingTime = 15 * rand:getFloat(0.8, 1.2) TurretGenerator.createBatteryChargeCooling(result, rechargeTime, shootingTime) TurretGenerator.scale(rand, result, WeaponType.Diffuser, tech, 0.75) local specialties = TurretGenerator.addSpecialties(rand, result, WeaponType.Diffuser) result.slotType = TurretSlotType.Armed result:updateStaticStats() local name = "Diffuser /* weapon name*/"%_T local dmgAdjective, outerAdjective, barrel, multishot, coax, serial = makeTitleParts(rand, specialties, result, DamageType.Energy) result.title = Format("%1%%2%%3%%4%%5%%6%%7% /* [outer-adjective][barrel][coax][dmg-adjective][multishot][name][serial] */"%_T, outerAdjective, barrel, coax, dmgAdjective, multishot, name, serial) return result end generatorFunction[WeaponType.Diffuser] = TurretGenerator.generateDiffuserTurret function TurretGenerator.generateHookgunTurret(rand, dps, tech, material, rarity) local result = TurretTemplate() -- generate turret local requiredCrew = TurretGenerator.dpsToRequiredCrew(dps) local crew = Crew() crew:add(requiredCrew*2, CrewMan(CrewProfessionType.Gunner)) result.crew = crew -- generate weapons local numWeapons = rand:getInt(1, 2) local weapon = WeaponGenerator.generateHookgun(rand, dps, tech, material, rarity) weapon.damage = weapon.damage / numWeapons -- attach weapons to turret TurretGenerator.attachWeapons(rand, result, weapon, numWeapons) local rechargeTime = 4 * rand:getFloat(0.8, 1.2) local shootingTime = 2 * rand:getFloat(0.8, 1.2) TurretGenerator.createBatteryChargeCooling(result, rechargeTime, shootingTime) TurretGenerator.scale(rand, result, WeaponType.Hookgun, tech, 0.75) local specialties = TurretGenerator.addSpecialties(rand, result, WeaponType.Hookgun) result.slotType = TurretSlotType.Armed result:updateStaticStats() local name = "Hookgun /* weapon name*/"%_T local dmgAdjective, outerAdjective, barrel, multishot, coax, serial = makeTitleParts(rand, specialties, result, DamageType.Physical) result.title = Format("%1%%2%%3%%4%%5%%6%%7% /* [outer-adjective][barrel][coax][dmg-adjective][multishot][name][serial] */"%_T, outerAdjective, barrel, coax, dmgAdjective, multishot, name, serial) return result end generatorFunction[WeaponType.Hookgun] = TurretGenerator.generateHookgunTurret function TurretGenerator.generateHiveLauncherTurret(rand, dps, tech, material, rarity) local result = TurretTemplate() -- generate turret local requiredCrew = TurretGenerator.dpsToRequiredCrew(dps) local crew = Crew() crew:add(requiredCrew*2, CrewMan(CrewProfessionType.Gunner)) result.crew = crew -- generate weapons local numWeapons = rand:getInt(1, 2) local weapon = WeaponGenerator.generateHiveLauncher(rand, dps, tech, material, rarity) weapon.damage = weapon.damage / numWeapons -- attach weapons to turret local positions = {} if rand:getBool() then table.insert(positions, vec3(0, 0.3, 0)) else table.insert(positions, vec3(0.4, 0.3, 0)) table.insert(positions, vec3(-0.4, 0.3, 0)) end -- attach for _, position in pairs(positions) do weapon.localPosition = position * result.size result:addWeapon(weapon) end local shootingTime = 20 * rand:getFloat(0.8, 1.2) local coolingTime = 15 * rand:getFloat(0.8, 1.2) TurretGenerator.createStandardCooling(result, coolingTime, shootingTime) TurretGenerator.scale(rand, result, WeaponType.RocketLauncher, tech, 0.6, coaxialAllowed) local specialties = TurretGenerator.addSpecialties(rand, result, WeaponType.RocketLauncher) result.slotType = TurretSlotType.Armed result:updateStaticStats() local name = "Hive-Launcher /* weapon name*/"%_T if weapon.shotsFired > 20 then name = "Swarm-Launcher /* weapon name*/"%_T end local dmgAdjective, outerAdjective, barrel, multishot, coax, serial = makeTitleParts(rand, specialties, result, DamageType.Physical) multishot = ""%_T result.title = Format("%1%%2%%3%%4%%5%%6%%7% /* [outer-adjective][barrel][coax][dmg-adjective][multishot][name][serial] */"%_T, outerAdjective, barrel, coax, dmgAdjective, multishot, name, serial) return result end generatorFunction[WeaponType.HiveLauncher] = TurretGenerator.generateHiveLauncherTurret