diff --git a/assets/data/units/north.json b/assets/data/units/north.json index 8daad825..1d573d31 100644 --- a/assets/data/units/north.json +++ b/assets/data/units/north.json @@ -2345,7 +2345,7 @@ "ew": "5+", "react-weapons": "LAC (T Link)", "mounted-weapons": "-", - "traits": "Transport: 2 Squads, CommsECM, ECCM, Stealth (Aux)", + "traits": "Transport: 2 Squads, Comms, ECM, ECCM, Stealth (Aux)", "type": "Vehicle", "height": 1 }, diff --git a/assets/data/units/peace_river.json b/assets/data/units/peace_river.json index 5bcbdc7f..a6492734 100644 --- a/assets/data/units/peace_river.json +++ b/assets/data/units/peace_river.json @@ -590,7 +590,7 @@ "ew": "4+", "react-weapons": "MRF, LP, LVB", "mounted-weapons": "-", - "traits": "Hands, Agile, Airdrop, Comms, SatUp, ECM+ (Aux), Sensors:36 (Aux)", + "traits": "Hands, Agile, Airdrop, Comms, SatUp, ECM+ (Aux), Sensors:36 (Aux)", "type": "Gear", "height": 1.5 } @@ -702,7 +702,7 @@ "ew": "5+", "react-weapons": "LAC (Precise Silent), LVB", "mounted-weapons": "LRP", - "traits": "Hands, Agile, Airdrop, Vet, Comms, Stealth (Aux)", + "traits": "Hands, Agile, Airdrop, Vet, Comms, Stealth (Aux)", "type": "Gear", "height": 1.5 }, @@ -821,7 +821,7 @@ "ew": "5+", "react-weapons": "LPA, LVB", "mounted-weapons": "LRP", - "traits": "Hands, Agile, Airdrop, Vet, Comms, Stealth (Aux)", + "traits": "Hands, Agile, Airdrop, Vet, Comms, Stealth (Aux)", "type": "Gear", "height": 1.5 }, @@ -838,7 +838,7 @@ "ew": "5+", "react-weapons": "MRL, LVB", "mounted-weapons": "LRP", - "traits": "Hands, Agile, Airdrop, Vet, Comms, Stealth (Aux)", + "traits": "Hands, Agile, Airdrop, Vet, Comms, Stealth (Aux)", "type": "Gear", "height": 1.5 } @@ -1617,7 +1617,7 @@ "ew": "5+", "react-weapons": "MRF (AA Silent)", "mounted-weapons": "MRP (Link)", - "traits": "Agile, ECM, Stealth TD, VTOL", + "traits": "Agile, ECM, Stealth, TD, VTOL", "type": "Vehicle", "height": 2 } diff --git a/assets/data/units/south.json b/assets/data/units/south.json index 23ea34ba..54dd35e8 100644 --- a/assets/data/units/south.json +++ b/assets/data/units/south.json @@ -2810,7 +2810,7 @@ "ew": "6+", "react-weapons": "HMG (L Link Auto), HMG (R Link Auto)", "mounted-weapons": "HFL (T Apex)", - "traits": "Amphib, Offroad, SmokeTransport: 2 Squads", + "traits": "Amphib, Offroad, Smoke, Transport: 2 Squads", "type": "Vehicle", "height": 1 } diff --git a/lib/models/mods/duelist/duelist_modification.dart b/lib/models/mods/duelist/duelist_modification.dart index e9cfb327..8c1ff841 100644 --- a/lib/models/mods/duelist/duelist_modification.dart +++ b/lib/models/mods/duelist/duelist_modification.dart @@ -109,13 +109,13 @@ class DuelistModification extends BaseModification { ); mod.addMod>( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Duelist')), + createAddTraitToList(Trait.Duelist()), description: '+Duelist', ); mod.addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Vet')), + createAddTraitToList(Trait.Vet()), description: '+Vet', ); @@ -174,7 +174,10 @@ class DuelistModification extends BaseModification { independentOperator.addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Independent Operator')), + createAddTraitToList(const Trait( + name: 'Independent Operator', + description: 'Duelist is an Independent Operator and will be the' + + ' sole model in a combat group')), description: 'Duelist is an Independent Operator and will be the sole ' + 'model in a combat group', ); @@ -225,7 +228,11 @@ class DuelistModification extends BaseModification { }) ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Lead by Example')), + createAddTraitToList(const Trait( + name: 'Lead by Example', + description: 'duelist will gain the following ability during the ' + + ' game. Once per round, for each duelist, whenever a duelist ' + + ' damages an enemy model, give one SP to one model in formation with the duelist.')), description: 'duelist will gain the following ability during the game. Once ' + 'per round, for each duelist, whenever a duelist damages an enemy ' + @@ -493,8 +500,13 @@ class DuelistModification extends BaseModification { return rs!.duelistModCheck(u, cg!, modID: aceGunnerId); }) ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Ace Gunner'))) + ..addMod( + UnitAttribute.traits, + createAddTraitToList(const Trait( + name: 'Ace Gunner', + description: 'This model does not suffer the -1D6 modifier when' + + ' using the Split weapon trait', + ))) ..addMod( UnitAttribute.special, createAddStringToList( diff --git a/lib/models/mods/factionUpgrades/peace_river.dart b/lib/models/mods/factionUpgrades/peace_river.dart index 43ca5be3..08d30fae 100644 --- a/lib/models/mods/factionUpgrades/peace_river.dart +++ b/lib/models/mods/factionUpgrades/peace_river.dart @@ -103,7 +103,7 @@ class PeaceRiverFactionMods extends FactionModification { ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW: 4') ..addMod>( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Agile')), + createAddTraitToList(Trait.Agile()), description: '+Agile', ); } @@ -143,8 +143,8 @@ class PeaceRiverFactionMods extends FactionModification { ) ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV: +1') - ..addMod>(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Shield')), + ..addMod>( + UnitAttribute.traits, createAddTraitToList(Trait.Shield()), description: '+Shield') ..addMod>(UnitAttribute.weapons, (value) { final newList = value.toList(); @@ -219,7 +219,7 @@ class PeaceRiverFactionMods extends FactionModification { newList.remove(selectedWeaponToRemove); newList.add(Weapon.fromWeapon( selectedWeaponToRemove, - addTraits: [const Trait(name: 'Advanced')], + addTraits: [Trait.Advanced()], )); return newList; @@ -441,8 +441,7 @@ class PeaceRiverFactionMods extends FactionModification { }, dynamicDescription: () { return '${unitRPToRemove.isNotEmpty ? '-$unitRPToRemove' : ''}'; }) - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Shield')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Shield()), description: '+Shield'); } /* diff --git a/lib/models/mods/standardUpgrades/standard_modification.dart b/lib/models/mods/standardUpgrades/standard_modification.dart index 318e1a97..e9a62729 100644 --- a/lib/models/mods/standardUpgrades/standard_modification.dart +++ b/lib/models/mods/standardUpgrades/standard_modification.dart @@ -53,7 +53,7 @@ class StandardModification extends BaseModification { factory StandardModification.antiAirTrait(Unit u, CombatGroup cg) { final List _options = []; final RegExp weaponMatch = RegExp(r'^(AC|RC|LC|RLC)'); - final traitToAdd = const Trait(name: 'AA'); + final traitToAdd = Trait.AA(); final allWeapons = u.weapons; allWeapons @@ -694,7 +694,7 @@ class StandardModification extends BaseModification { ) ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Smoke')), + createAddTraitToList(Trait.Smoke()), description: '+Smoke', ); } diff --git a/lib/models/mods/unitUpgrades/black_talon.dart b/lib/models/mods/unitUpgrades/black_talon.dart index 2642e884..521f6d1b 100644 --- a/lib/models/mods/unitUpgrades/black_talon.dart +++ b/lib/models/mods/unitUpgrades/black_talon.dart @@ -13,20 +13,18 @@ final UnitModification psi = UnitModification(name: 'Psi Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Psi')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms'); final UnitModification darkJaguarPsi = UnitModification(name: 'Psi Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Psi')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SatUp', isAux: true)), + createAddTraitToList(Trait.SatUp(isAux: true)), description: '+SatUp (Aux)', ); @@ -34,19 +32,16 @@ final UnitModification phi = UnitModification(name: 'Phi Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Phi')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), description: '+ECCM'); final UnitModification darkMambaPsi = UnitModification(name: 'Psi Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Psi')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp'); final UnitModification xi = UnitModification(name: 'Xi Upgrade') @@ -119,17 +114,13 @@ final UnitModification darkCoyotePsi = UnitModification(name: 'Psi Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(3), description: 'TV +3') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Psi')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SP', level: 1)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SP(1)), description: '+SP:+1') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), description: '+ECCM'); final UnitModification iota = UnitModification(name: 'Iota Upgrade') @@ -154,8 +145,7 @@ final UnitModification spectre = UnitModification(name: 'Spectra Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Spectre')) ..addMod(UnitAttribute.ew, createSetIntMod(3), description: 'EW 3+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECM+')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECMPlus()), description: '+ECM+'); final UnitModification darkHoplitePsi = UnitModification( @@ -166,14 +156,11 @@ final UnitModification darkHoplitePsi = UnitModification( ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Psi')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SP', level: 1)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SP(1)), description: '+SP:+1') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp'); final UnitModification blackwindTheta = UnitModification(name: 'Theta Upgrade') diff --git a/lib/models/mods/unitUpgrades/caprice.dart b/lib/models/mods/unitUpgrades/caprice.dart index 19f63885..21dd5c09 100644 --- a/lib/models/mods/unitUpgrades/caprice.dart +++ b/lib/models/mods/unitUpgrades/caprice.dart @@ -7,8 +7,7 @@ import 'package:gearforce/models/weapons/weapons.dart'; final UnitModification command = UnitModification(name: 'Command Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SP', level: 1)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SP(1)), description: '+SP:+1'); final UnitModification mortar = UnitModification(name: 'Mortar Upgrade') @@ -22,6 +21,5 @@ final UnitModification command2 = UnitModification(name: 'Command Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms'); diff --git a/lib/models/mods/unitUpgrades/cef.dart b/lib/models/mods/unitUpgrades/cef.dart index 176deae6..6b4994a5 100644 --- a/lib/models/mods/unitUpgrades/cef.dart +++ b/lib/models/mods/unitUpgrades/cef.dart @@ -13,14 +13,11 @@ final UnitModification command = UnitModification(name: 'Command Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), description: '+ECCM (Aux)'); final UnitModification mobilityPack6 = UnitModification( @@ -28,11 +25,10 @@ final UnitModification mobilityPack6 = UnitModification( ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod( UnitAttribute.name, createSimpleStringMod(false, 'with Mobility Pack')) - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Airdrop')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Airdrop()), description: '+Airdrop') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Jetpack', level: 6, isAux: true)), + ..addMod( + UnitAttribute.traits, createAddTraitToList(Trait.Jetpack(6, isAux: true)), description: '+Jetpack:6 (Aux)'); final UnitModification stealth = UnitModification(name: 'Stealth Upgrade') @@ -41,8 +37,8 @@ final UnitModification stealth = UnitModification(name: 'Stealth Upgrade') ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') ..addMod(UnitAttribute.roles, createAddRoleToList(Role(name: RoleType.SO)), description: '+SO') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Stealth', isAux: true)), + ..addMod( + UnitAttribute.traits, createAddTraitToList(Trait.Stealth(isAux: true)), description: '+Stealth (Aux)'); final UnitModification mobilityPack5 = UnitModification( @@ -50,11 +46,10 @@ final UnitModification mobilityPack5 = UnitModification( ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod( UnitAttribute.name, createSimpleStringMod(false, 'with Mobility Pack')) - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Airdrop')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Airdrop()), description: '+Airdrop') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Jetpack', level: 5, isAux: true)), + ..addMod( + UnitAttribute.traits, createAddTraitToList(Trait.Jetpack(5, isAux: true)), description: '+Jetpack:5 (Aux)'); final UnitModification mrl = UnitModification(name: 'MRL Upgrade') @@ -80,8 +75,7 @@ final UnitModification grelCrew2 = UnitModification(name: 'GREL Crew Upgrade') ..addMod(UnitAttribute.gunnery, createSetIntMod(3), description: 'GU 3+') ..addMod(UnitAttribute.piloting, createSetIntMod(3), description: 'PI 3+') ..addMod(UnitAttribute.ew, createSetIntMod(3), description: 'EW 3+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'React+')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ReactPlus()), description: '+React+'); final UnitModification grelCrew3 = UnitModification(name: 'GREL Crew Upgrade') @@ -90,8 +84,7 @@ final UnitModification grelCrew3 = UnitModification(name: 'GREL Crew Upgrade') ..addMod(UnitAttribute.gunnery, createSetIntMod(3), description: 'GU 3+') ..addMod(UnitAttribute.piloting, createSetIntMod(3), description: 'PI 3+') ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'React+')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ReactPlus()), description: '+React+'); final UnitModification grelCrew4 = UnitModification(name: 'GREL Crew Upgrade') @@ -109,21 +102,18 @@ final UnitModification hpc64Command = UnitModification( ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp') - ..addMod(UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECM()), description: '+ECM'); final UnitModification jan = UnitModification(name: 'Jan Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Jan')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms'); final UnitModification squad = UnitModification(name: 'Squad') diff --git a/lib/models/mods/unitUpgrades/eden.dart b/lib/models/mods/unitUpgrades/eden.dart index a672de77..953ecc2f 100644 --- a/lib/models/mods/unitUpgrades/eden.dart +++ b/lib/models/mods/unitUpgrades/eden.dart @@ -9,11 +9,9 @@ final UnitModification wizard = UnitModification(name: 'Wizard Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Wizard')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECM', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECM(isAux: true)), description: '+ECM (Aux)') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), description: '+ECCM (Aux)'); final UnitModification utopianSpecialOperations = UnitModification( @@ -23,19 +21,17 @@ final UnitModification utopianSpecialOperations = UnitModification( createSimpleStringMod(false, 'Utopian Special Operations')) ..addMod(UnitAttribute.roles, createAddRoleToList(Role(name: RoleType.SO)), description: '+SO') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Airdrop')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Airdrop()), description: '+Airdrop') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Stealth', isAux: true)), + ..addMod( + UnitAttribute.traits, createAddTraitToList(Trait.Stealth(isAux: true)), description: '+Stealth (Aux)'); final UnitModification dominus = UnitModification(name: 'Dominus Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Dominus')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Comms', isAux: false)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms'); final UnitModification halberd = UnitModification(name: 'Halberd Upgrade') @@ -52,30 +48,25 @@ final UnitModification halberd = UnitModification(name: 'Halberd Upgrade') ..addMod( UnitAttribute.traits, createReplaceTraitInList( - oldValue: const Trait(name: 'Brawl', level: 1), - newValue: const Trait(name: 'Brawl', level: 2)), + oldValue: Trait.Brawl(1), newValue: Trait.Brawl(2)), description: '-Brawl:1, +Brawl:2'); final UnitModification doppelDominus = UnitModification(name: 'Dominus Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Dominus')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Comms', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms(isAux: true)), description: '+Comms (Aux)') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), description: '+ECCM (Aux)'); final UnitModification hydor = UnitModification(name: 'Hydor Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(-1), description: 'TV -1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Hydor')) - ..addMod( - UnitAttribute.traits, - createRemoveTraitFromList( - const Trait(name: 'Jetpack', level: 8, isAux: true)), + ..addMod(UnitAttribute.traits, + createRemoveTraitFromList(Trait.Jetpack(8, isAux: true)), description: '-Jetpack:8 (Aux)') - ..addMod(UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Sub')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Sub()), description: '+Sub'); final UnitModification saker = UnitModification(name: 'Saker Upgrade') @@ -102,17 +93,15 @@ final UnitModification lyddite = UnitModification(name: 'Lyddite Upgrade') description: '-MATM (T), +LAM (T)', ); -final UnitModification serpentinaDominus = - UnitModification(name: 'Dominus Upgrade') - ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') - ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Dominus')) - ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Comms', isAux: false)), - description: '+Comms') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), - description: '+ECCM (Aux)'); +final UnitModification serpentinaDominus = UnitModification( + name: 'Dominus Upgrade') + ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') + ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Dominus')) + ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), + description: '+Comms') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), + description: '+ECCM (Aux)'); final UnitModification team = UnitModification(name: 'Team') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') diff --git a/lib/models/mods/unitUpgrades/north.dart b/lib/models/mods/unitUpgrades/north.dart index 3a01784e..c047d6d8 100644 --- a/lib/models/mods/unitUpgrades/north.dart +++ b/lib/models/mods/unitUpgrades/north.dart @@ -19,7 +19,7 @@ final UnitModification headHunter = UnitModification(name: 'Headhunter Upgrade') ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Comms')), + createAddTraitToList(Trait.Comms()), description: '+Comms', ); @@ -33,57 +33,48 @@ final UnitModification meleeSpecialist1 = UnitModification( ..addMod( UnitAttribute.traits, createReplaceTraitInList( - oldValue: const Trait(name: 'Brawl', level: 1), - newValue: const Trait(name: 'Brawl', level: 2)), + oldValue: Trait.Brawl(1), newValue: Trait.Brawl(2)), description: '-Brawl:1, +Brawl:2'); -final UnitModification thunderJaguar = UnitModification( - name: 'Thunder Jaguar Upgrade') - ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') - ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Thunder')) - ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), - description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), - description: '+SatUp'); +final UnitModification thunderJaguar = + UnitModification(name: 'Thunder Jaguar Upgrade') + ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') + ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Thunder')) + ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), + description: '+Comms') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), + description: '+SatUp'); final UnitModification seccom = UnitModification(name: 'Seccom Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV: +1') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'with Seccom')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), description: '+ECCM'); final UnitModification sabertooth = UnitModification(name: 'Sabertooth Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Sabertooth')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp'); final UnitModification tattletale = UnitModification(name: 'Tattletale Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Tattletale')) - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SP', level: 1)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SP(1)), description: 'SP:1'); final UnitModification mpCommand = UnitModification(name: 'Command Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), description: '+ECCM (Aux)'); final UnitModification armored = UnitModification(name: 'Armored Upgrade') @@ -93,41 +84,34 @@ final UnitModification armored = UnitModification(name: 'Armored Upgrade') ..addMod(UnitAttribute.weapons, createAddWeaponToList(buildWeapon('LPZ')!), description: '+LPZ'); -final UnitModification thunderGrizzly = UnitModification( - name: 'Thunder Grizzly Upgrade') - ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') - ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Thunder')) - ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), - description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), - description: '+SatUp'); +final UnitModification thunderGrizzly = + UnitModification(name: 'Thunder Grizzly Upgrade') + ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') + ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Thunder')) + ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), + description: '+Comms') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), + description: '+SatUp'); final UnitModification koalaCommand = UnitModification(name: 'Command Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), description: '+ECCM'); final UnitModification denMother = UnitModification(name: 'Den Mother Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Den Mother')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp'); final UnitModification gatlingLaser = UnitModification( @@ -175,20 +159,17 @@ final UnitModification crossbow = UnitModification( ), description: '-LATM, +MATM (T)'); -final UnitModification scimitarCommand = UnitModification( - name: 'Command Upgrade') - ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') - ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) - ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), - description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), - description: '+SatUp') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), - description: '+ECCM'); +final UnitModification scimitarCommand = + UnitModification(name: 'Command Upgrade') + ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') + ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) + ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), + description: '+Comms') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), + description: '+SatUp') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), + description: '+ECCM'); final UnitModification sledgehammer = UnitModification( name: 'Sledgehammer Upgrade') @@ -213,7 +194,5 @@ final UnitModification bastion = UnitModification(name: 'Bastion Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Bastion')) ..addMod( - UnitAttribute.traits, - createAddTraitToList( - const Trait(name: 'Transport', type: 'Squads', level: 2)), + UnitAttribute.traits, createAddTraitToList(Trait.Transport(2, 'Squad')), description: '+Transport: 2 Squads'); diff --git a/lib/models/mods/unitUpgrades/nucoal.dart b/lib/models/mods/unitUpgrades/nucoal.dart index 1814c967..313fdde2 100644 --- a/lib/models/mods/unitUpgrades/nucoal.dart +++ b/lib/models/mods/unitUpgrades/nucoal.dart @@ -13,25 +13,20 @@ final UnitModification cv = UnitModification(name: 'CV Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'CV')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), description: '+ECCM (Aux)'); final UnitModification cuirassierCv = UnitModification(name: 'CV Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'CV')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), description: '+ECCM (Aux)'); final UnitModification fragCannon = UnitModification( @@ -77,11 +72,9 @@ final UnitModification espionCv = UnitModification(name: 'CV Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'CV')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp'); final UnitModification mfmBoa = UnitModification( @@ -106,14 +99,11 @@ final UnitModification cv2 = UnitModification(name: 'CV Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'CV')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), description: '+ECCM (Aux)'); final UnitModification voltigeurABM = UnitModification( @@ -158,14 +148,11 @@ final UnitModification voltigeurCv = UnitModification(name: 'CV Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'CV')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), description: '+ECCM'); final UnitModification sampsonCv = UnitModification( @@ -176,14 +163,11 @@ final UnitModification sampsonCv = UnitModification( ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'CV')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), description: '+ECCM (Aux)'); final UnitModification squad = UnitModification(name: 'Squad') @@ -196,8 +180,7 @@ final UnitModification koreshi = UnitModification(name: 'Koreshi Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Koreshi')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod(UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Vet')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Vet()), description: '+Vet'); diff --git a/lib/models/mods/unitUpgrades/peace_river.dart b/lib/models/mods/unitUpgrades/peace_river.dart index 1cbb7035..f25d194b 100644 --- a/lib/models/mods/unitUpgrades/peace_river.dart +++ b/lib/models/mods/unitUpgrades/peace_river.dart @@ -17,51 +17,41 @@ final UnitModification chieftain = UnitModification(name: 'Chieftain Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Chieftain')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms'); final UnitModification spectre = UnitModification(name: 'Spectre Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Spectre')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod(UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECM()), description: '+ECM'); -final UnitModification warriorIVChieftain = UnitModification( - name: 'Chieftain Upgrade') - ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') - ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Chieftain')) - ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), - description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), - description: '+SatUp'); +final UnitModification warriorIVChieftain = + UnitModification(name: 'Chieftain Upgrade') + ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') + ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Chieftain')) + ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), + description: '+Comms') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), + description: '+SatUp'); final UnitModification warriorIVSpectre = UnitModification(name: 'Spectre Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Spectre')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECM()), description: '+ECM') - ..addMod( - UnitAttribute.traits, - createAddTraitToList(const Trait( - name: 'Sensors', - level: 24, - isAux: true, - )), + ..addMod(UnitAttribute.traits, + createAddTraitToList(Trait.Sensors(24, isAux: true)), description: '+Sensors:24 (Aux)'); final UnitModification jetpack = UnitModification(name: 'Jetpack Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Jetpack')) - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Jetpack', level: 6)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Jetpack(6)), description: '+Jetpack:6'); final UnitModification warriorIVSpecialForces = UnitModification( @@ -71,8 +61,8 @@ final UnitModification warriorIVSpecialForces = UnitModification( ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') ..addMod(UnitAttribute.roles, createAddRoleToList(Role(name: RoleType.SO)), description: '+SO') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Stealth', isAux: true)), + ..addMod( + UnitAttribute.traits, createAddTraitToList(Trait.Stealth(isAux: true)), description: '+Stealth (Aux)'); final UnitModification meleeSpecialist = UnitModification( @@ -88,8 +78,7 @@ final UnitModification meleeSpecialist = UnitModification( ..addMod( UnitAttribute.traits, createReplaceTraitInList( - oldValue: const Trait(name: 'Brawl', level: 1), - newValue: const Trait(name: 'Brawl', level: 2)), + oldValue: Trait.Brawl(1), newValue: Trait.Brawl(2)), description: '-Brawl:1, +Brawl:2'); final UnitModification meleeSpecialist1 = UnitModification( @@ -102,15 +91,13 @@ final UnitModification meleeSpecialist1 = UnitModification( ..addMod( UnitAttribute.traits, createReplaceTraitInList( - oldValue: const Trait(name: 'Brawl', level: 1), - newValue: const Trait(name: 'Brawl', level: 2)), + oldValue: Trait.Brawl(1), newValue: Trait.Brawl(2)), description: '-Brawl:1, +Brawl:2'); final UnitModification shield = UnitModification(name: 'Shield Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'with Shield')) - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Shield')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Shield()), description: '+Shield'); final UnitModification pitBullSpectre = @@ -118,16 +105,10 @@ final UnitModification pitBullSpectre = ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Spectre')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECM()), description: '+ECM') - ..addMod( - UnitAttribute.traits, - createAddTraitToList(const Trait( - name: 'Sensors', - level: 24, - isAux: true, - )), + ..addMod(UnitAttribute.traits, + createAddTraitToList(Trait.Sensors(24, isAux: true)), description: '+Sensors:24 (Aux)'); final UnitModification greyhoundChieftain = @@ -135,33 +116,28 @@ final UnitModification greyhoundChieftain = ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Chieftain')) ..addMod(UnitAttribute.ew, createSetIntMod(3), description: 'EW 3+') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SP', level: 1)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SP(1)), description: '+SP:+1') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), description: '+ECCM'); -final UnitModification skirmisherChieftain = - UnitModification(name: 'Chieftain Upgrade') - ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') - ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Chieftain')) - ..addMod(UnitAttribute.ew, createSetIntMod(3), description: 'EW 3+') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SatUp', isAux: true)), - description: '+SatUp (Aux)') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), - description: '+ECCM (Aux)'); +final UnitModification skirmisherChieftain = UnitModification( + name: 'Chieftain Upgrade') + ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') + ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Chieftain')) + ..addMod(UnitAttribute.ew, createSetIntMod(3), description: 'EW 3+') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp(isAux: true)), + description: '+SatUp (Aux)') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), + description: '+ECCM (Aux)'); final UnitModification skirmisherTag = UnitModification(name: 'Tag Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'with Tag')) ..addMod(UnitAttribute.ew, createSetIntMod(3), description: 'EW 3+') - ..addMod(UnitAttribute.traits, createAddTraitToList(const Trait(name: 'TD')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.TD()), description: '+TD') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), description: '+ECCM (Aux)'); final UnitModification SkirmisherSpecialForces = UnitModification( @@ -171,16 +147,15 @@ final UnitModification SkirmisherSpecialForces = UnitModification( ..addMod(UnitAttribute.ew, createSetIntMod(3), description: 'EW 3+') ..addMod(UnitAttribute.roles, createAddRoleToList(Role(name: RoleType.SO)), description: '+SO') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Stealth', isAux: true)), + ..addMod( + UnitAttribute.traits, createAddTraitToList(Trait.Stealth(isAux: true)), description: '+Stealth (Aux)'); final UnitModification shinobiMeleeSpecialist = UnitModification( name: 'Melee Specialist Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV: +1') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'melee specialist')) - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Brawl', level: 2)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Brawl(2)), description: '+Brawl:2') ..addMod( UnitAttribute.weapons, @@ -189,32 +164,24 @@ final UnitModification shinobiMeleeSpecialist = UnitModification( newValue: buildWeapon('LVB (Precise)', hasReact: true)!), description: '-LVB, +LVB (Precise)'); -final UnitModification shinobiChieftain = UnitModification( - name: 'Chieftain Upgrade') - ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') - ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Chieftain')) - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), - description: '+ECCM') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), - description: '+SatUp'); +final UnitModification shinobiChieftain = + UnitModification(name: 'Chieftain Upgrade') + ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') + ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Chieftain')) + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), + description: '+ECCM') + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), + description: '+SatUp'); final UnitModification shinobiSpectre = UnitModification(name: 'Spectre Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Spectre')) ..addMod(UnitAttribute.ew, createSetIntMod(3), description: 'EW 3+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECM+')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECMPlus()), description: '+ECM+') - ..addMod( - UnitAttribute.traits, - createAddTraitToList(const Trait( - name: 'Sensors', - level: 24, - isAux: true, - )), + ..addMod(UnitAttribute.traits, + createAddTraitToList(Trait.Sensors(24, isAux: true)), description: '+Sensors:24 (Aux)'); final UnitModification spartanSpectre = @@ -222,16 +189,10 @@ final UnitModification spartanSpectre = ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Spectre')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECM()), description: '+ECM') - ..addMod( - UnitAttribute.traits, - createAddTraitToList(const Trait( - name: 'Sensors', - level: 24, - isAux: true, - )), + ..addMod(UnitAttribute.traits, + createAddTraitToList(Trait.Sensors(24, isAux: true)), description: '+Sensors:24 (Aux)'); final UnitModification crusaderV = UnitModification( @@ -247,8 +208,7 @@ final UnitModification crusaderV = UnitModification( newItems: [buildWeapon('MRP')!, buildWeapon('MFM')!], ), description: '-MRP (Link), -LFM, +MRP, +MFM') - ..addMod(UnitAttribute.traits, - createRemoveTraitFromList(const Trait(name: 'Vuln', type: 'Haywire')), + ..addMod(UnitAttribute.traits, createRemoveTraitFromList(Trait.VulnH()), description: '-Vuln:Haywire'); final UnitModification cataphractSarisa = @@ -267,14 +227,11 @@ final UnitModification cataphractLord = UnitModification(name: 'Lord Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Lord')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SP', level: 1)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SP(1)), description: '+SP:+1') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), description: '+ECCM'); final UnitModification tankHunter = @@ -292,14 +249,11 @@ final UnitModification uhlanLord = UnitModification(name: 'Lord Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Lord')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SP', level: 1)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SP(1)), description: '+SP:+1') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), description: '+ECCM'); final UnitModification hyeneIISpectre = @@ -307,25 +261,20 @@ final UnitModification hyeneIISpectre = ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'Spectre Dog')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECM+')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECMPlus()), description: '+ECM+'); final UnitModification alphaDog = UnitModification(name: 'Alpha Dog Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(3), description: 'TV +3') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Alpha Dog')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SP', level: 1)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SP(1)), description: '+SP:+1') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), description: '+ECCM') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp'); final UnitModification arbalest = UnitModification(name: 'Arbalest Upgrade') @@ -346,14 +295,11 @@ final UnitModification herdLord = UnitModification( ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Herd Lord')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SP', level: 1)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SP(1)), description: '+SP:+1') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp'); final UnitModification missile = UnitModification(name: 'Missile Upgrade') diff --git a/lib/models/mods/unitUpgrades/south.dart b/lib/models/mods/unitUpgrades/south.dart index b0e9c5cf..1a125142 100644 --- a/lib/models/mods/unitUpgrades/south.dart +++ b/lib/models/mods/unitUpgrades/south.dart @@ -17,8 +17,7 @@ final UnitModification command = UnitModification(name: 'Command Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms'); final UnitModification mortarUpgrade = UnitModification(name: 'Mortar Upgrade') @@ -37,11 +36,9 @@ final UnitModification sidewinderCommand = UnitModification( ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SatUp', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp(isAux: true)), description: '+SatUp (Aux)'); final UnitModification razorFang = UnitModification(name: 'Razor Fang Upgrade') @@ -50,12 +47,12 @@ final UnitModification razorFang = UnitModification(name: 'Razor Fang Upgrade') ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Comms')), + createAddTraitToList(Trait.Comms()), description: '+Comms', ) ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SatUp')), + createAddTraitToList(Trait.SatUp()), description: '+SatUp', ); @@ -67,22 +64,22 @@ final UnitModification SRUpgrade = UnitModification(name: 'SR Upgrade Upgrade') description: '+SO') ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECM')), + createAddTraitToList(Trait.ECM()), description: '+ECM', ) ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM')), + createAddTraitToList(Trait.ECCM()), description: '+ECCM', ) ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Smoke')), + createAddTraitToList(Trait.Smoke()), description: '+Smoke', ) ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Stealth', isAux: true)), + createAddTraitToList(Trait.Stealth(isAux: true)), description: '+Stealth (Aux)', ) ..addMod( @@ -100,8 +97,7 @@ final UnitModification ruggedTerrain = UnitModification( ..addMod(UnitAttribute.weapons, createAddWeaponToList(buildWeapon('MCW', hasReact: true)!), description: '+MCW') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Climber')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Climber()), description: '+Climber'); final UnitModification copperheadArenaPilot = UnitModification( @@ -111,8 +107,7 @@ final UnitModification copperheadArenaPilot = UnitModification( ..addMod(UnitAttribute.weapons, createAddWeaponToList(buildWeapon('MVB', hasReact: true)!), description: '+MVB') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Shield')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Shield()), description: '+Shield'); final UnitModification longFang = UnitModification(name: 'Long Fang Upgrade') @@ -153,8 +148,7 @@ UnitModification diamondbackArenaPilot(Unit u) { return newList; }, description: '+LVB (Precise) or +LCW (Brawl:1)') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Brawl', level: 1)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Brawl(1)), description: '+Brawl:1'); } @@ -165,8 +159,7 @@ final UnitModification blackAdderArenaPilot = UnitModification( ..addMod(UnitAttribute.weapons, createAddWeaponToList(buildWeapon('MVB (Reach:1)', hasReact: true)!), description: '+MVB (Reach:1)') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Brawl', level: 2)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Brawl(2)), description: '+Brawl:2'); final UnitModification cobraRazorFang = @@ -176,12 +169,12 @@ final UnitModification cobraRazorFang = ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Comms')), + createAddTraitToList(Trait.Comms()), description: '+Comms', ) ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'SatUp')), + createAddTraitToList(Trait.SatUp()), description: '+SatUp', ); @@ -225,8 +218,7 @@ final UnitModification meleeSwap = UnitModification( final UnitModification boasArenaPilot = UnitModification(name: 'Arena Pilot') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV: +1') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'with Arena Pilot')) - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Brawl', level: 2)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Brawl(2)), description: '+Brawl:2'); final UnitModification barbed = UnitModification( @@ -251,11 +243,9 @@ final UnitModification mpCommand = UnitModification(name: 'Command Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), description: '+ECCM (Aux)'); final UnitModification fang = UnitModification( @@ -279,14 +269,11 @@ final UnitModification drakeCommand = UnitModification(name: 'Command Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), description: '+ECCM'); final UnitModification hooded = UnitModification( @@ -358,16 +345,13 @@ final UnitModification caimanCommand = UnitModification( ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Command')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW 5+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp') - ..addMod(UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECM()), description: '+ECM') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'ECCM', isAux: true)), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM(isAux: true)), description: '+ECCM (Aux)'); final UnitModification team = UnitModification(name: 'Team') diff --git a/lib/models/mods/unitUpgrades/universal.dart b/lib/models/mods/unitUpgrades/universal.dart index 5b057ecb..4e0b9d44 100644 --- a/lib/models/mods/unitUpgrades/universal.dart +++ b/lib/models/mods/unitUpgrades/universal.dart @@ -96,8 +96,7 @@ final UnitModification demolisher = UnitModification( ..addMod( UnitAttribute.traits, createReplaceTraitInList( - oldValue: const Trait(name: 'Brawl', level: 1), - newValue: const Trait(name: 'Brawl', level: 2)), + oldValue: Trait.Brawl(1), newValue: Trait.Brawl(2)), description: '-Brawl:1, +Brawl:2'); final UnitModification heavyChainswordSwap = UnitModification( @@ -277,8 +276,7 @@ final UnitModification paratrooper = UnitModification( ..addMod(UnitAttribute.piloting, createSetIntMod(3), description: 'PI:3+') ..addMod(UnitAttribute.roles, createAddRoleToList(Role(name: RoleType.SO)), description: '+SO') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Airdrop')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Airdrop()), description: '+Airdrop'); final UnitModification mountaineering = UnitModification( @@ -288,8 +286,7 @@ final UnitModification mountaineering = UnitModification( ..addMod(UnitAttribute.piloting, createSetIntMod(3), description: 'PI:3+') ..addMod(UnitAttribute.roles, createAddRoleToList(Role(name: RoleType.SO)), description: '+SO') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Climber')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Climber()), description: '+Climber'); final UnitModification frogmen = UnitModification(name: 'Frogmen Upgrade') @@ -298,7 +295,7 @@ final UnitModification frogmen = UnitModification(name: 'Frogmen Upgrade') ..addMod(UnitAttribute.roles, createAddRoleToList(Role(name: RoleType.SO)), description: '+SO') ..addMod(UnitAttribute.piloting, createSetIntMod(3), description: 'PI:3+') - ..addMod(UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Sub')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Sub()), description: '+Sub'); final UnitModification latm = UnitModification(name: 'LATM Upgrade') @@ -315,5 +312,5 @@ final UnitModification ecm = UnitModification(name: 'ECM Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') ..addMod(UnitAttribute.name, createSimpleStringMod(false, 'with ECM')) ..addMod(UnitAttribute.ew, createSetIntMod(5), description: 'EW:5+') - ..addMod(UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECM()), description: '+ECM'); diff --git a/lib/models/mods/unitUpgrades/utopia.dart b/lib/models/mods/unitUpgrades/utopia.dart index 9f50475e..a30fb5bc 100644 --- a/lib/models/mods/unitUpgrades/utopia.dart +++ b/lib/models/mods/unitUpgrades/utopia.dart @@ -21,8 +21,7 @@ final UnitModification vtol = UnitModification(name: 'VTOL Upgrade') ..addMod(UnitAttribute.movement, createSetMovementMod(Movement(type: 'W/H', rate: 10)), description: 'MR: W/H:10') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'VTOL')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.VTOL()), description: '+VTOL'); final UnitModification rocket = UnitModification(name: 'Rocket Upgrade') @@ -42,8 +41,7 @@ final UnitModification nlil = UnitModification(name: 'N-LIL Upgrade') description: 'MR: H:10') ..addMod(UnitAttribute.hull, createSetIntMod(4), description: 'H/S: 4/2') ..addMod(UnitAttribute.structure, createSetIntMod(2)) - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'VTOL')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.VTOL()), description: '+VTOL'); final UnitModification rocket2 = UnitModification(name: 'Rocket Upgrade') @@ -69,22 +67,19 @@ final UnitModification specialOperations = UnitModification( UnitAttribute.name, createSimpleStringMod(false, 'Special Operations')) ..addMod(UnitAttribute.roles, createAddRoleToList(Role(name: RoleType.SO)), description: '+SO') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Airdrop')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Airdrop()), description: '+Airdrop') - ..addMod(UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Stealth', isAux: true)), + ..addMod( + UnitAttribute.traits, createAddTraitToList(Trait.Stealth(isAux: true)), description: '+Stealth (Aux)'); final UnitModification pazu = UnitModification(name: 'Pazu Upgrade') ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') ..addMod(UnitAttribute.name, createSimpleStringMod(true, 'Node')) ..addMod(UnitAttribute.ew, createSetIntMod(4), description: 'EW 4+') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Comms')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Comms()), description: '+Comms') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'SatUp')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.SatUp()), description: '+SatUp'); final UnitModification gilgameshEngineering = UnitModification( @@ -97,11 +92,8 @@ final UnitModification gilgameshEngineering = UnitModification( oldValue: buildWeapon('2 x MRC (B)', hasReact: true)!, newValue: buildWeapon('HCW (B Link Reach:3)', hasReact: true)!), description: '-2 x MRC (B), +HCW (B Link Reach:3)') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Repair')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Repair()), description: '+Repair') - ..addMod( - UnitAttribute.traits, - createAddTraitToList(const Trait( - name: 'Transport', level: 4, type: 'N-KIDU or 1 Armiger')), + ..addMod(UnitAttribute.traits, + createAddTraitToList(Trait.Transport(4, '4 N-KIDI or 1 Armiger')), description: '+Transport: 4 N-KIDU or 1 Armiger'); diff --git a/lib/models/mods/veteranUpgrades/veteran_modification.dart b/lib/models/mods/veteranUpgrades/veteran_modification.dart index 66ab298c..27ed1945 100644 --- a/lib/models/mods/veteranUpgrades/veteran_modification.dart +++ b/lib/models/mods/veteranUpgrades/veteran_modification.dart @@ -103,8 +103,7 @@ class VeteranModification extends BaseModification { return rs.vetCheck(cg, u); }) ..addMod(UnitAttribute.tv, createSimpleIntMod(2), description: 'TV +2') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'Vet')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.Vet()), description: '+Vet'); } @@ -133,8 +132,7 @@ class VeteranModification extends BaseModification { return rs!.veteranModCheck(u, cg!, modID: eccmId); }) ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'ECCM')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.ECCM()), description: '+ECCM'); } @@ -151,7 +149,7 @@ class VeteranModification extends BaseModification { final react = u.reactWeapons; final List _options = []; - const traitToAdd = const Trait(name: 'Reach', level: 1); + final traitToAdd = Trait.Reach(1); final allowedWeaponMatch = RegExp(r'^(VB|SG|CW|ICW)$'); react.where((weapon) { return allowedWeaponMatch.hasMatch(weapon.code); @@ -267,7 +265,7 @@ class VeteranModification extends BaseModification { ) ..addMod( UnitAttribute.traits, - createAddTraitToList(const Trait(name: 'Field Armor')), + createAddTraitToList(Trait.FieldArmor()), description: '+Field Armor', ); } @@ -400,9 +398,7 @@ class VeteranModification extends BaseModification { (element) => element.name == 'Vuln' && element.type == 'H'); return createRemoveTraitFromList(oldTrait)(value); } else { - return createAddTraitToList( - const Trait(name: 'Resist', type: 'H'), - )(value); + return createAddTraitToList(Trait.ResistH())(value); } }, description: '${isVulnerable ? '-Vuln:H' : ' +Resist:H'}', @@ -444,8 +440,7 @@ class VeteranModification extends BaseModification { (element) => element.name == 'Vuln' && element.type == 'F'); return createRemoveTraitFromList(oldTrait)(value); } else { - return createAddTraitToList(const Trait(name: 'Resist', type: 'F'))( - value); + return createAddTraitToList(Trait.ResistF())(value); } }, description: '${isVulnerable ? '-Vuln:F' : ' +Resist:F'}', @@ -487,8 +482,7 @@ class VeteranModification extends BaseModification { (element) => element.name == 'Vuln' && element.type == 'C'); return createRemoveTraitFromList(oldTrait)(value); } else { - return createAddTraitToList(const Trait(name: 'Resist', type: 'C'))( - value); + return createAddTraitToList(Trait.ResistC())(value); } }, description: '${isVulnerable ? '-Vuln:C' : ' +Resist:C'}', @@ -558,7 +552,7 @@ class VeteranModification extends BaseModification { final RegExp weaponCheck = RegExp(r'^(P|SMG|AC|FC|FL|GL)'); final react = u.reactWeapons; final List _options = []; - const traitToAdd = const Trait(name: 'Link'); + final traitToAdd = Trait.Link(); final allWeapons = react.toList(); allWeapons @@ -713,8 +707,7 @@ class VeteranModification extends BaseModification { return rs!.veteranModCheck(u, cg!, modID: amsId); }) ..addMod(UnitAttribute.tv, createSimpleIntMod(1), description: 'TV +1') - ..addMod( - UnitAttribute.traits, createAddTraitToList(const Trait(name: 'AMS')), + ..addMod(UnitAttribute.traits, createAddTraitToList(Trait.AMS()), description: '+AMS'); } } diff --git a/lib/models/traits/trait.dart b/lib/models/traits/trait.dart index 41fc8869..300afaad 100644 --- a/lib/models/traits/trait.dart +++ b/lib/models/traits/trait.dart @@ -73,6 +73,7 @@ class Trait { type: original.type, level: level != null ? level : original.level, isAux: isAux != null ? isAux : original.isAux, + description: original.description, ); } @@ -103,17 +104,201 @@ class Trait { type = transportTypeCheck; } - return Trait( + final level = levelCheck != null ? int.parse(levelCheck) : 0; + + switch (nameCheck) { + case 'AA': + return Trait.AA(isAux: auxCheck); + case 'Advanced': + return Trait.Advanced(isAux: auxCheck); + case 'AOE': + return Trait.AOE(level, isAux: auxCheck); + case 'Agile': + return Trait.Agile(isAux: auxCheck); + case 'AI': + return Trait.AI(isAux: auxCheck); + case 'Airdrop': + return Trait.Airdrop(isAux: auxCheck); + case 'Amphib': + return Trait.Amphib(isAux: auxCheck); + case 'AMS': + return Trait.AMS(isAux: auxCheck); + case 'Apex': + return Trait.Apex(isAux: auxCheck); + case 'AP': + return Trait.AP(level, isAux: auxCheck); + case 'Auto': + return Trait.Auto(isAux: auxCheck); + case 'Aux': + return Trait.Aux(); + case 'B': + return Trait.B(isAux: auxCheck); + case 'Blast': + return Trait.Blast(isAux: auxCheck); + case 'Brace': + return Trait.Brace(isAux: auxCheck); + case 'Brawl': + return Trait.Brawl(level, isAux: auxCheck); + case 'Burst': + return Trait.Burst(level, isAux: auxCheck); + case 'Climber': + return Trait.Climber(isAux: auxCheck); + case 'Conscript': + return Trait.Conscript(isAux: auxCheck); + case 'CBS': + return Trait.CBS(isAux: auxCheck); + case 'Comms': + return Trait.Comms(isAux: auxCheck); + case 'Corrosion': + return Trait.Corrosion(isAux: auxCheck); + case 'Demo': + return Trait.Demo(level, isAux: auxCheck); + case 'Duelist': + return Trait.Duelist(); + case 'ECM': + return Trait.ECM(isAux: auxCheck); + case 'ECM+': + return Trait.ECMPlus(isAux: auxCheck); + case 'ECCM': + return Trait.ECCM(isAux: auxCheck); + case 'Field Armor': + return Trait.FieldArmor(isAux: auxCheck); + case 'Fire': + return Trait.Fire(level, isAux: auxCheck); + case 'Flak': + return Trait.Flak(isAux: auxCheck); + case 'Frag': + return Trait.Frag(isAux: auxCheck); + case 'Guided': + return Trait.Guided(isAux: auxCheck); + case 'Hand': + case 'Hands': + return Trait.Hands(isAux: auxCheck); + case 'Haywire': + return Trait.Haywire(isAux: auxCheck); + case 'Jetpack': + return Trait.Jetpack(level, isAux: auxCheck); + case 'Jump Jets': + return Trait.JumpJets(level, isAux: auxCheck); + case 'L': + return Trait.L(isAux: auxCheck); + case 'LA': + return Trait.LA(level, isAux: auxCheck); + case 'Link': + return Trait.Link(isAux: auxCheck); + case 'Lumbering': + return Trait.Lumbering(isAux: auxCheck); + case 'Medic': + return Trait.Medic(isAux: auxCheck); + case 'Mine': + return Trait.Mine(level, isAux: auxCheck); + case 'Occupancy': + if (type == null) { + print('Occupancy type is null'); + } + return Trait.Occupancy(level, type ?? 'Unknown', isAux: auxCheck); + case 'or': + case 'OR': + return Trait.Or(); + case 'Offroad': + return Trait.Offroad(isAux: auxCheck); + case 'Precise': + return Trait.Precise(isAux: auxCheck); + case 'Proximity': + return Trait.Proximity(isAux: auxCheck); + case 'R': + return Trait.R(isAux: auxCheck); + case 'Reach': + return Trait.Reach(level, isAux: auxCheck); + case 'React': + return Trait.React(isAux: auxCheck); + case 'React+': + return Trait.ReactPlus(isAux: auxCheck); + case 'Repair': + return Trait.Repair(isAux: auxCheck); + case 'Resist': + switch (type) { + case 'C': + return Trait.ResistC(isAux: auxCheck); + case 'F': + return Trait.ResistF(isAux: auxCheck); + case 'H': + return Trait.ResistH(isAux: auxCheck); + } + case 'Satup': + case 'SatUp': + return Trait.SatUp(isAux: auxCheck); + case 'Sensor Boom': + return Trait.SensorBoom(isAux: auxCheck); + case 'Sensors': + return Trait.Sensors(level, isAux: auxCheck); + case 'Shield': + return Trait.Shield(isAux: auxCheck); + case 'Shield+': + return Trait.ShieldPlus(isAux: auxCheck); + case 'Silent': + return Trait.Silent(isAux: auxCheck); + case 'Smoke': + return Trait.Smoke(isAux: auxCheck); + case 'SP': + return Trait.SP(level, isAux: auxCheck); + case 'Split': + return Trait.Split(isAux: auxCheck); + case 'Spray': + return Trait.Spray(isAux: auxCheck); + case 'Stable': + return Trait.Stable(isAux: auxCheck); + case 'Stationary': + return Trait.Stationary(isAux: auxCheck); + case 'Stealth': + return Trait.Stealth(isAux: auxCheck); + case 'Sub': + return Trait.Sub(isAux: auxCheck); + case 'Supply': + return Trait.Supply(isAux: auxCheck); + case 'TD': + return Trait.TD(isAux: auxCheck); + case 'Towed': + return Trait.Towed(isAux: auxCheck); + case 'Transport': + if (type == null) { + print('Transport type is null'); + } + return Trait.Transport(level, type ?? 'Unknown', isAux: auxCheck); + case 'T': + return Trait.T(isAux: auxCheck); + case 'Vet': + return Trait.Vet(); + case 'VTOL': + return Trait.VTOL(isAux: auxCheck); + case 'Vuln': + switch (type) { + case 'C': + return Trait.VulnC(); + case 'F': + return Trait.VulnF(); + case 'H': + return Trait.VulnH(); + } + default: + print('Unknown trait name [$nameCheck]'); + } + + final unknownTrait = Trait( name: nameCheck!, - level: levelCheck != null ? int.parse(levelCheck) : null, + level: levelCheck != null ? level : null, isAux: auxCheck, type: type, ); + + print('Trait was not captured by switch: $str'); + return unknownTrait; } - factory Trait.AA() { - return const Trait( + factory Trait.AA({bool isAux = false}) { + return Trait( name: 'AA', + isAux: isAux, description: 'Weapons with the AA trait receive +1D6 for ranged attacks' + ' against elevated VTOLs and airstrike counters. This model' + ' may retaliate against an airstrike counter when they' + @@ -121,85 +306,95 @@ class Trait { ); } - factory Trait.Advanced() { - return const Trait( + factory Trait.Advanced({bool isAux = false}) { + return Trait( name: 'Advanced', + isAux: isAux, description: 'When a weapon with the Advanced trait attacks, add +1 ' + ' to the result rolled (+1 R)', ); } - factory Trait.AOE(int level) { + factory Trait.AOE(int level, {bool isAux = false}) { return Trait( name: 'AOE', level: level, + isAux: isAux, description: 'Weapons with the AOE:X trait may be used to attack an ' + ' area with a radius of X inches around a target point.', ); } - factory Trait.Agile() { - return const Trait( + factory Trait.Agile({bool isAux = false}) { + return Trait( name: 'Agile', + isAux: isAux, description: 'Attacks targeting this model will miss on a margin' + ' of success of zero', ); } - factory Trait.AI() { - return const Trait( + factory Trait.AI({bool isAux = false}) { + return Trait( name: 'AI', + isAux: isAux, description: 'Weapons with the AI trait may deal more than two damage' + ' to infantry on a successful attack. These weapons also' + ' have a bonus of +1D6 against infantry and cavalry models.', ); } - factory Trait.Airdrop() { - return const Trait( + factory Trait.Airdrop({bool isAux = false}) { + return Trait( name: 'Airdrop', + isAux: isAux, description: 'Combat groups composed entirely of models with the' + ' Airdrop trait may deploy using the airdrop deployment' + ' option. See Airdrop Deployment.', ); } - factory Trait.Amphib() { - return const Trait( + factory Trait.Amphib({bool isAux = false}) { + return Trait( name: 'Amphib', + isAux: isAux, description: 'This model may move over water terrain at its full MR.', ); } - factory Trait.AMS() { - return const Trait( + factory Trait.AMS({bool isAux = false}) { + return Trait( name: 'AMS', + isAux: isAux, description: 'This model may reroll defense rolls against all' + ' indirect attacks and airstrikes.', ); } - factory Trait.Apex() { - return const Trait( + factory Trait.Apex({bool isAux = false}) { + return Trait( name: 'Apex', + isAux: isAux, description: 'Add +1 to this weapon’s base damage. Multiple sources' + ' of Apex are cumulative.', ); } - factory Trait.AP(int level) { + factory Trait.AP(int level, {bool isAux = false}) { return Trait( name: 'AP', level: level, + isAux: isAux, description: 'Armor piercing weapons are able to do damage on a' + ' successful attack even when the damage does not exceed' + ' the enemy’s armor.', ); } - factory Trait.Auto() { - return const Trait( + factory Trait.Auto({bool isAux = false}) { + return Trait( name: 'Auto', + isAux: isAux, description: 'A weapon with this trait may be used for retaliation' + ' once per round without spending an action point. If this is a' + ' combination weapon, then only one of the weapons may' + @@ -207,18 +402,28 @@ class Trait { ); } - factory Trait.B() { + factory Trait.Aux() { return const Trait( + name: 'Aux', + description: 'Weapons and traits with the aux trait may not be used' + + ' when the model is crippled or haywired', + ); + } + + factory Trait.B({bool isAux = false}) { + return Trait( name: 'B', + isAux: isAux, description: 'Weapons with this trait can only be fired at targets' + ' within this model’s back arc (the back 180 degrees of the' + ' model).', ); } - factory Trait.Blast() { - return const Trait( + factory Trait.Blast({bool isAux = false}) { + return Trait( name: 'Blast', + isAux: isAux, description: '* If an attacking model has LOS to a target, indirect' + ' attacks with this weapon ignore the bonus defense' + ' dice for cover.\n' + @@ -228,17 +433,19 @@ class Trait { ); } - factory Trait.Brace() { - return const Trait( + factory Trait.Brace({bool isAux = false}) { + return Trait( name: 'Brace', + isAux: isAux, description: 'This weapon may only be fired if the model is braced.', ); } - factory Trait.Brawl(int level) { + factory Trait.Brawl(int level, {bool isAux = false}) { return Trait( name: 'Brawl', level: level, + isAux: isAux, description: '* A Brawl:X trait on a weapon will modify attack rolls' + ' by XD6 when using that weapon.\n' + '* A Brawl:X trait on a model will modify all melee rolls' + @@ -246,18 +453,20 @@ class Trait { ); } - factory Trait.Burst(int level) { + factory Trait.Burst(int level, {bool isAux = false}) { return Trait( name: 'Burst', level: level, + isAux: isAux, description: 'Add a +XD6 modifier to any attack roll made with this' + ' weapon (generally +1D6 or +2D6).', ); } - factory Trait.Climber() { - return const Trait( + factory Trait.Climber({bool isAux = false}) { + return Trait( name: 'Climber', + isAux: isAux, description: 'This trait allows a model to climb terrain features at' + ' its full Movement Rate (MR).', ); @@ -282,9 +491,10 @@ class Trait { ); } - factory Trait.Conscript() { - return const Trait( + factory Trait.Conscript({bool isAux = false}) { + return Trait( name: 'Conscript', + isAux: isAux, description: 'If this model is not in formation with a commander, all' + ' of its skills are +1 TN. This model may not be a commander and' + ' commanders may never take upgrades that give them the Conscript' + @@ -293,17 +503,19 @@ class Trait { ); } - factory Trait.CBS() { - return const Trait( + factory Trait.CBS({bool isAux = false}) { + return Trait( name: 'CBS', + isAux: isAux, description: 'A model with the CBS trait may use a counterstrike' + ' reaction. See Counterstrike (Reaction).', ); } - factory Trait.Comms() { - return const Trait( + factory Trait.Comms({bool isAux = false}) { + return Trait( name: 'Comms', + isAux: isAux, description: 'Commanders with the Comms trait do not need to roll' + ' for orders, when all the recipients of the order are in' + ' formation with this model. They will still have to roll an' + @@ -318,9 +530,10 @@ class Trait { ); } - factory Trait.Corrosion() { - return const Trait( + factory Trait.Corrosion({bool isAux = false}) { + return Trait( name: 'Corrosion', + isAux: isAux, description: 'When an attack with the Corrosion trait hits a model,' + ' apply damage as normal and then place a corrosion token next' + ' to the model.\n' + @@ -333,10 +546,11 @@ class Trait { ); } - factory Trait.Demo(int level) { + factory Trait.Demo(int level, {bool isAux = false}) { return Trait( name: 'Demo', level: level, + isAux: isAux, description: 'A weapon with the Demo:X trait will allow certain ' + ' weapons to damage buildings, terrain and fortifications more' + ' efficiently than other weapons.\n' + @@ -356,9 +570,10 @@ class Trait { ); } - factory Trait.ECM() { - return const Trait( + factory Trait.ECM({bool isAux = false}) { + return Trait( name: 'ECM', + isAux: isAux, description: 'This model possesses an electronic counter-measure' + ' system. A model with this trait may use the following trait' + ' enabled actions and reactions:\n' + @@ -368,9 +583,10 @@ class Trait { ); } - factory Trait.ECMPlus() { - return const Trait( + factory Trait.ECMPlus({bool isAux = false}) { + return Trait( name: 'ECM+', + isAux: isAux, description: 'This model has an enhanced electronic counter-measure' + ' system. A model with the ECM+ trait performs all functions of' + ' the ECM trait, but its ECM defense is always in effect unless' + @@ -378,9 +594,10 @@ class Trait { ); } - factory Trait.ECCM() { - return const Trait( + factory Trait.ECCM({bool isAux = false}) { + return Trait( name: 'ECCM', + isAux: isAux, description: 'This model is equipped with an electronic' + ' counter-countermeasure system. This model and all friendly' + ' models within 6 inches gain +1D6 to all EW rolls. This effect' + @@ -390,9 +607,10 @@ class Trait { ); } - factory Trait.FieldArmor() { - return const Trait( + factory Trait.FieldArmor({bool isAux = false}) { + return Trait( name: 'Field Armor', + isAux: isAux, description: 'This model suffers one less damage from each attack to' + ' a minimum of one damage. Field Armor reduces damage from the' + ' Armor Piercing trait, but it does not apply to other effects' + @@ -400,10 +618,11 @@ class Trait { ); } - factory Trait.Fire(int level) { + factory Trait.Fire(int level, {bool isAux = false}) { return Trait( name: 'Fire', level: level, + isAux: isAux, description: 'When an attack with the Fire:X trait hits, apply damage' + ' as normal, then roll XD6. For each die that meets or exceeds a' + ' threshold of 4+, apply one additional damage. After this roll' + @@ -411,42 +630,47 @@ class Trait { ); } - factory Trait.Flak() { - return const Trait( + factory Trait.Flak({bool isAux = false}) { + return Trait( name: 'Flak', + isAux: isAux, description: 'Weapons with the Flak trait add a +2D6 modifier to' + ' attack rolls targeting elevated VTOLs and airstrike counters.', ); } - factory Trait.Frag() { - return const Trait( + factory Trait.Frag({bool isAux = false}) { + return Trait( name: 'Frag', + isAux: isAux, description: 'Weapons with the Frag trait will add a +2D6 modifier to' + ' its attack rolls.', ); } - factory Trait.Guided() { - return const Trait( + factory Trait.Guided({bool isAux = false}) { + return Trait( name: 'Guided', + isAux: isAux, description: 'This weapon has increased accuracy when used for a fire' + ' mission with a target designator. See the Target Designator' + ' trait.', ); } - factory Trait.Hands() { - return const Trait( + factory Trait.Hands({bool isAux = false}) { + return Trait( name: 'Hands', + isAux: isAux, description: 'This model has additional upgrade options available and' + ' limited climbing ability. See Climbing.', ); } - factory Trait.Haywire() { - return const Trait( + factory Trait.Haywire({bool isAux = false}) { + return Trait( name: 'Haywire', + isAux: isAux, description: 'When an attack with the Haywire trait hits, apply' + ' damage as normal, then place a haywire token next to the model' + ' and roll 1D6. On a result of 4 or better, the model takes one' + @@ -459,10 +683,11 @@ class Trait { ); } - factory Trait.Jetpack(int level) { + factory Trait.Jetpack(int level, {bool isAux = false}) { return Trait( name: 'Jetpack', level: level, + isAux: isAux, description: 'This model can launch into the air, replacing a normal' + 'Move with a jetpack move.\n' + '* You must move in a straight line horizontally up to X inches.\n' + @@ -478,10 +703,11 @@ class Trait { ); } - factory Trait.JumpJets(int level) { + factory Trait.JumpJets(int level, {bool isAux = false}) { return Trait( name: 'Jump Jets', level: level, + isAux: isAux, description: 'This model can execute a powered jump over obstacles' + ' while using another movement type. You may not perform Actions' + ' in the middle of a jump.\n' + @@ -490,35 +716,49 @@ class Trait { ); } - factory Trait.LA(int level) { + factory Trait.L({bool isAux = false}) { + return Trait( + name: 'L', + isAux: isAux, + description: 'A weapon with this trait can only be fired at targets' + + ' within this model’s left arc (the left 180 degrees of the' + + ' model).', + ); + } + + factory Trait.LA(int level, {bool isAux = false}) { return Trait( name: 'LA', level: level, + isAux: isAux, description: 'Weapons with the LA:X trait may only be fired X times' + ' before running out of ammunition. Mark this model with a token' + ' to indicate the ammunition remaining.', ); } - factory Trait.Link() { - return const Trait( + factory Trait.Link({bool isAux = false}) { + return Trait( name: 'Link', + isAux: isAux, description: 'Weapons with the Link trait add a +1D6 modifier to any' + ' attack roll made with this weapon.', ); } - factory Trait.Lumbering() { - return const Trait( + factory Trait.Lumbering({bool isAux = false}) { + return Trait( name: 'Lumbering', + isAux: isAux, description: 'This model does not receive the +1D6 defense roll' + ' modifier for being at top speed.', ); } - factory Trait.Medic() { - return const Trait( + factory Trait.Medic({bool isAux = false}) { + return Trait( name: 'Medic', + isAux: isAux, description: 'Medics may use the patch action. A medic may not use an' + ' attack action, be a forward observer, use ECM or ECCM traits' + ' for ECM attacks, ECM jamming and firewalls, or perform detailed' + @@ -531,10 +771,11 @@ class Trait { ); } - factory Trait.Mine(int level) { + factory Trait.Mine(int level, {bool isAux = false}) { return Trait( name: 'Mine', level: level, + isAux: isAux, description: 'A model with the Mine:X trait may plant mines on the' + ' battlefield. The model has X number of mines. Planted mines use' + ' 40mm round markers or bases. See Mines and Minefields for how' + @@ -543,11 +784,12 @@ class Trait { ); } - factory Trait.Occupancy(int level, String type) { + factory Trait.Occupancy(int level, String type, {bool isAux = false}) { return Trait( name: 'Occupancy', level: level, type: type, + isAux: isAux, description: 'The Occupancy:X trait is used during deployment.' + ' Buildings with this trait will specify the type and amount of' + ' other models which may be inside it during its deployment. By' + @@ -561,9 +803,10 @@ class Trait { ); } - factory Trait.Offroad() { - return const Trait( + factory Trait.Offroad({bool isAux = false}) { + return Trait( name: 'Offroad', + isAux: isAux, description: 'Models with this trait may travel over difficult' + ' surfaces at their full MR. This does not apply to water terrain' + ' and does not benefit climbing.', @@ -579,9 +822,10 @@ class Trait { ); } - factory Trait.Precise() { - return const Trait( + factory Trait.Precise({bool isAux = false}) { + return Trait( name: 'Precise', + isAux: isAux, description: 'Ranged weapons with the Precise trait add +1 to the' + ' result rolled (+1 R) when in optimal range.\n' + 'Melee weapons with the Precise trait add +1 to the result rolled' + @@ -590,9 +834,10 @@ class Trait { ); } - factory Trait.Proximity() { - return const Trait( + factory Trait.Proximity({bool isAux = false}) { + return Trait( name: 'Proximity', + isAux: isAux, description: 'Weapons with the Prox trait may be used to perform a' + ' direct attack against all models around this model, within the' + ' weapon’s listed range.\n' + @@ -607,36 +852,40 @@ class Trait { ); } - factory Trait.R() { - return const Trait( + factory Trait.R({bool isAux = false}) { + return Trait( name: 'R', + isAux: isAux, description: 'A weapon with this trait can only be fired at targets' + ' within this model’s right arc (the right 180 degrees of the' + ' model).', ); } - factory Trait.Reach(int level) { + factory Trait.Reach(int level, {bool isAux = false}) { return Trait( name: 'Reach', level: level, + isAux: isAux, description: 'This melee weapon can attack a target X inches from' + ' its base. This is not a ranged attack', ); } - factory Trait.React() { - return const Trait( + factory Trait.React({bool isAux = false}) { + return Trait( name: 'React', + isAux: isAux, description: 'Weapons listed under the React Weapons Column of' + ' a model table are considered to have the React trait. A weapon' + ' with this trait can be used for retaliations.', ); } - factory Trait.ReactPlus() { - return const Trait( + factory Trait.ReactPlus({bool isAux = false}) { + return Trait( name: 'React+', + isAux: isAux, description: 'This model may perform a Reaction once per round' + ' without spending an action point.\n' + 'You may also use this trait to focus. To focus, spend 1' + @@ -646,51 +895,57 @@ class Trait { ); } - factory Trait.Repair() { - return const Trait( + factory Trait.Repair({bool isAux = false}) { + return Trait( name: 'Repair', + isAux: isAux, description: 'This model may use the patch action.', ); } - factory Trait.ResistC() { - return const Trait( + factory Trait.ResistC({bool isAux = false}) { + return Trait( name: 'Resist', type: 'C', + isAux: isAux, description: 'This model does not receive the extra damage that comes' + ' from the Corrosion trait.', ); } - factory Trait.ResistF() { - return const Trait( + factory Trait.ResistF({bool isAux = false}) { + return Trait( name: 'Resist', type: 'F', + isAux: isAux, description: 'This model does not receive the extra damage that comes' + ' from the Fire trait.', ); } - factory Trait.ResistH() { - return const Trait( + factory Trait.ResistH({bool isAux = false}) { + return Trait( name: 'Resist', type: 'H', + isAux: isAux, description: 'This model does not roll for additional damage after' + ' being haywired. However, it still suffers the haywired status.', ); } - factory Trait.SatUp() { - return const Trait( + factory Trait.SatUp({bool isAux = false}) { + return Trait( name: 'SatUp', + isAux: isAux, description: 'Increase this model’s EW skill by one for all independent' + ' EW rolls. This is not cumulative with additional SatUps.', ); } - factory Trait.SensorBoom() { - return const Trait( + factory Trait.SensorBoom({bool isAux = false}) { + return Trait( name: 'Sensor Boom', + isAux: isAux, description: 'This model may check LOS and sensor lock from a point up' + ' to 1” away from its silhouette. This only applies to indirect' + ' attacks, forward observations, ECM attacks, ECM jamming and' + @@ -698,10 +953,11 @@ class Trait { ); } - factory Trait.Sensors(int level) { + factory Trait.Sensors(int level, {bool isAux = false}) { return Trait( name: 'Sensors', level: level, + isAux: isAux, description: 'This model has two features in addition to the regular' + ' sensor rules noted in the Sensor Lock Chapter.\n' + '* This model has a sensor range of “X” inches.\n' + @@ -710,17 +966,19 @@ class Trait { ); } - factory Trait.Shield() { - return const Trait( + factory Trait.Shield({bool isAux = false}) { + return Trait( name: 'Shield', + isAux: isAux, description: 'This model may reroll defense rolls if the attack' + ' originated from within its front arc.', ); } - factory Trait.ShieldPlus() { - return const Trait( + factory Trait.ShieldPlus({bool isAux = false}) { + return Trait( name: 'Shield+', + isAux: isAux, description: 'This model may reroll defense rolls if the attack' + ' originated from within its front arc. Shield+ also adds +1D6 to' + ' defensive rolls from attacks originating from the front arc. The' + @@ -728,35 +986,39 @@ class Trait { ); } - factory Trait.Silent() { - return const Trait( + factory Trait.Silent({bool isAux = false}) { + return Trait( name: 'Silent', + isAux: isAux, description: 'Models do not lose the hidden status when attacking with' + ' a weapon that has the Silent trait.', ); } - factory Trait.Smoke() { - return const Trait( + factory Trait.Smoke({bool isAux = false}) { + return Trait( name: 'Smoke', + isAux: isAux, description: 'A model with the Smoke trait may spend an action point to' + ' discharge smoke. See Discharge Smoke.', ); } - factory Trait.SP(int level) { + factory Trait.SP(int level, {bool isAux = false}) { return Trait( name: 'SP', level: level, + isAux: isAux, description: 'This model will gain one Skill Point (SP) in addition to' + ' any it may have from other sources. If the model is a commander,' + ' it will instead gain one Command Point (CP).', ); } - factory Trait.Split() { - return const Trait( + factory Trait.Split({bool isAux = false}) { + return Trait( name: 'Split', + isAux: isAux, description: 'When attacking with this weapon, this model may target' + ' two separate models.\n' + '* Treat each target as a primary target.\n' + @@ -765,35 +1027,39 @@ class Trait { ); } - factory Trait.Spray() { - return const Trait( + factory Trait.Spray({bool isAux = false}) { + return Trait( name: 'Spray', + isAux: isAux, description: 'Models attacked with this weapon do not gain defense' + ' modifiers from partial cover. This weapon cannot be fired through' + ' full light cover.', ); } - factory Trait.Stable() { - return const Trait( + factory Trait.Stable({bool isAux = false}) { + return Trait( name: 'Stable', + isAux: isAux, description: 'This model receives +1D6 to direct and indirect attack' + ' rolls while at combat speed or at top speed.\nMultiple sources of' + ' Stable are not cumulative.', ); } - factory Trait.Stationary() { - return const Trait( + factory Trait.Stationary({bool isAux = false}) { + return Trait( name: 'Stationary', + isAux: isAux, description: 'This model is always braced, cannot move or turn, and may' + ' not perform hide actions or evade reactions.', ); } - factory Trait.Stealth() { - return const Trait( + factory Trait.Stealth({bool isAux = false}) { + return Trait( name: 'Stealth', + isAux: isAux, description: 'Enemy models cannot sensor lock this model until it is' + ' within half their sensor range. For example, a model with a' + ' standard sensor range of 18 inches can only sensor lock a model' + @@ -801,9 +1067,10 @@ class Trait { ); } - factory Trait.Sub() { - return const Trait( + factory Trait.Sub({bool isAux = false}) { + return Trait( name: 'Sub', + isAux: isAux, description: 'This model uses its full MR through water. While in' + ' water, this model has partial cover.\n' + 'Models with the Sub trait may also used the submerged deployment' + @@ -811,18 +1078,20 @@ class Trait { ); } - factory Trait.Supply() { - return const Trait( + factory Trait.Supply({bool isAux = false}) { + return Trait( name: 'Supply', + isAux: isAux, description: 'Models with this trait may use the reload action to' + ' replenish ammunition for a weapon with the LA:X trait. See the' + ' Reload action.', ); } - factory Trait.TD() { - return const Trait( + factory Trait.TD({bool isAux = false}) { + return Trait( name: 'TD', + isAux: isAux, description: 'A target designator is a precision laser marking device' + ' which steers guided weapons to a target.\n' + 'In order to designate a target with the TD trait, a model must' + @@ -835,9 +1104,10 @@ class Trait { ); } - factory Trait.Towed() { - return const Trait( + factory Trait.Towed({bool isAux = false}) { + return Trait( name: 'Towed', + isAux: isAux, description: 'One model with this trait may be towed behind a gear,' + ' strider or vehicle with the W or G movement type. Models with' + ' the VTOL trait cannot be used to tow. Towing uses all the rules' + @@ -850,11 +1120,12 @@ class Trait { ); } - factory Trait.Transport(int level, String type) { + factory Trait.Transport(int level, String type, {bool isAux = false}) { return Trait( name: 'Transport', level: level, type: type, + isAux: isAux, description: 'Models with this trait will specify the amount (X) and' + ' type of other models which they are able to transport.\n' + 'Types:\n' + @@ -873,27 +1144,30 @@ class Trait { ); } - factory Trait.T() { - return const Trait( + factory Trait.T({bool isAux = false}) { + return Trait( name: 'T', + isAux: isAux, description: 'A turret mounted weapon has 360 degree rotation and can' + ' be used to fire within any arc. Turrets do not remove the back' + ' arc modifier when this model is attacked.', ); } - factory Trait.Vet() { - return const Trait( + factory Trait.Vet({bool isAux = false}) { + return Trait( name: 'Vet', + isAux: isAux, description: 'This model is considered a veteran. It has one Skill' + ' Point(SP) and may purchase upgrades from the standard and' + ' veteran upgrade lists.', ); } - factory Trait.VTOL() { - return const Trait( + factory Trait.VTOL({bool isAux = false}) { + return Trait( name: 'VTOL', + isAux: isAux, description: 'VTOLs like helicopters and hoppers can take to the air.' + ' Once per Move, models with the VTOL trait may choose whether to' + ' be elevated or at Nap Of the Earth (NOE).\n' + diff --git a/lib/models/weapons/weapon_modes.dart b/lib/models/weapons/weapon_modes.dart index d0510512..aaccd8ae 100644 --- a/lib/models/weapons/weapon_modes.dart +++ b/lib/models/weapons/weapon_modes.dart @@ -1,9 +1,9 @@ enum weaponModes { - Direct, - Indirect, - Melee, -} + Direct('Direct', 'D'), + Indirect('Indirect', 'I'), + Melee('Melee', 'M'); -String getWeaponModeName(weaponModes wm) { - return wm.toString().split('.').last; + const weaponModes(this.name, this.abbr); + final String abbr; + final String name; } diff --git a/lib/models/weapons/weapons.dart b/lib/models/weapons/weapons.dart index 6a785e59..fa4f7650 100644 --- a/lib/models/weapons/weapons.dart +++ b/lib/models/weapons/weapons.dart @@ -75,6 +75,9 @@ Weapon? _buildWeapon({ List traits = []; List alternativeTraits = []; + assert( + size == 'L' || size == 'M' || size == 'H' || size.isEmpty || size == 'B'); + switch (type.toUpperCase()) { case 'AAM': const damageMap = {'L': 7, 'M': 8, 'H': 9}; @@ -83,8 +86,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(12, 36, 72); traits = [ - const Trait(name: 'Flak'), - const Trait(name: 'Guided'), + Trait.Flak(), + Trait.Guided(), ]; break; case 'ABM': @@ -94,10 +97,10 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(24, 48, 96); traits = [ - const Trait(name: 'AI'), - const Trait(name: 'AOE', level: 3), - const Trait(name: 'Blast'), - const Trait(name: 'Guided'), + Trait.AI(), + Trait.AOE(3), + Trait.Blast(), + Trait.Guided(), ]; break; case 'AC': @@ -107,10 +110,10 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(6, 18, 36); traits = [ - const Trait(name: 'Burst', level: 1), - const Trait(name: 'Split'), + Trait.Burst(1), + Trait.Split(), ]; - alternativeTraits = [const Trait(name: 'Precise')]; + alternativeTraits = [Trait.Precise()]; break; case 'AG': const damageMap = {'L': 9, 'M': 10, 'H': 11}; @@ -119,10 +122,10 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(24, 48, 96); traits = [ - const Trait(name: 'AOE', level: 3), - const Trait(name: 'Blast'), - const Trait(name: 'AP', level: 1), - const Trait(name: 'Demo', level: 2), + Trait.AOE(3), + Trait.Blast(), + Trait.AP(1), + Trait.Demo(2), ]; break; case 'AM': @@ -132,10 +135,10 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(24, 48, 96); traits = [ - const Trait(name: 'AOE', level: 4), - const Trait(name: 'Blast'), - const Trait(name: 'AP', level: 1), - const Trait(name: 'Guided'), + Trait.AOE(4), + Trait.Blast(), + Trait.AP(1), + Trait.Guided(), ]; break; case 'APGL': @@ -145,9 +148,9 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(0, 3, null); traits = [ - const Trait(name: 'AI'), - const Trait(name: 'Frag'), - const Trait(name: 'Prox'), + Trait.AI(), + Trait.Frag(), + Trait.Proximity(), ]; break; case 'APR': @@ -157,8 +160,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(6, 18, 36); traits = [ - const Trait(name: 'AI'), - const Trait(name: 'AOE', level: 3), + Trait.AI(), + Trait.AOE(3), ]; break; case 'AR': @@ -168,8 +171,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(12, 36, 72); traits = [ - const Trait(name: 'AOE', level: 3), - const Trait(name: 'Demo', level: 2), + Trait.AOE(3), + Trait.Demo(2), ]; break; case 'ATM': @@ -180,8 +183,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(12, 36, 72); traits = [ - Trait(name: 'AP', level: apMap[size]), - const Trait(name: 'Guided'), + Trait.AP(apMap[size]!), + Trait.Guided(), ]; break; case 'AVM': @@ -191,8 +194,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(6, 18, 36); traits = [ - const Trait(name: 'AP', level: 1), - const Trait(name: 'Guided'), + Trait.AP(1), + Trait.Guided(), ]; break; case 'B': @@ -200,7 +203,7 @@ Weapon? _buildWeapon({ modes = [weaponModes.Direct]; damage = 8; range = Range(0, null, null); - traits = [const Trait(name: 'AOE', level: 4)]; + traits = [Trait.AOE(4)]; break; case 'BZ': const damageMap = {'L': 7, 'M': 8, 'H': 9}; @@ -210,7 +213,7 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(6, 12, 24); traits = [ - Trait(name: 'AP', level: apMap[size]), + Trait.AP(apMap[size]!), ]; break; case 'CW': @@ -220,7 +223,7 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(0, null, null, hasReach: true, increasableReach: true); traits = [ - const Trait(name: 'Demo', level: 2), + Trait.Demo(2), ]; break; case 'FC': @@ -231,12 +234,12 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(3, 9, 18); traits = [ - const Trait(name: 'Precise'), - Trait(name: 'AP', level: apMap[size]), + Trait.Precise(), + Trait.AP(apMap[size]!), ]; alternativeTraits = [ - const Trait(name: 'Frag'), - const Trait(name: 'AI'), + Trait.Frag(), + Trait.AI(), ]; break; case 'FG': @@ -247,11 +250,11 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(12, 24, 48); traits = [ - Trait(name: 'AP', level: apMap[size]), + Trait.AP(apMap[size]!), ]; alternativeTraits = [ - const Trait(name: 'AOE', level: 3), - const Trait(name: 'Blast'), + Trait.AOE(3), + Trait.Blast(), ]; break; case 'FL': @@ -262,10 +265,10 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(0, 9, 18); traits = [ - const Trait(name: 'AI'), - Trait(name: 'Fire', level: fireMap[size]), - const Trait(name: 'Burst', level: 1), - const Trait(name: 'Spray'), + Trait.AI(), + Trait.Fire(fireMap[size]!), + Trait.Burst(1), + Trait.Spray(), ]; break; case 'FM': @@ -275,8 +278,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(18, 36, 72); traits = [ - const Trait(name: 'AOE', level: 4), - const Trait(name: 'Blast'), + Trait.AOE(4), + Trait.Blast(), ]; break; case 'GL': @@ -286,10 +289,10 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(6, 12, 24); traits = [ - const Trait(name: 'AOE', level: 3), - const Trait(name: 'Blast'), - const Trait(name: 'AP', level: 1), - const Trait(name: 'Burst', level: 1), + Trait.AOE(3), + Trait.Blast(), + Trait.AP(1), + Trait.Burst(1), ]; break; case 'GM': @@ -299,9 +302,9 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(18, 36, 72); traits = [ - const Trait(name: 'AOE', level: 3), - const Trait(name: 'Blast'), - const Trait(name: 'Guided'), + Trait.AOE(3), + Trait.Blast(), + Trait.Guided(), ]; break; case 'HG': @@ -311,9 +314,9 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(3, 6, 9); traits = [ - const Trait(name: 'AOE', level: 3), - const Trait(name: 'Blast'), - const Trait(name: 'AP', level: 1), + Trait.AOE(3), + Trait.Blast(), + Trait.AP(1), ]; break; case 'ICW': @@ -322,7 +325,7 @@ Weapon? _buildWeapon({ modes = [weaponModes.Melee]; damage = damageMap[size]!; range = Range(0, null, null, hasReach: true, increasableReach: true); - traits = [const Trait(name: 'AI')]; + traits = [Trait.AI()]; break; case 'IGL': const damageMap = {'L': 5, 'M': 6, 'H': 7}; @@ -331,11 +334,11 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(3, 9, 18); traits = [ - const Trait(name: 'AOE', level: 2), - const Trait(name: 'Blast'), + Trait.AOE(2), + Trait.Blast(), ]; alternativeTraits = [ - const Trait(name: 'AP', level: 1), + Trait.AP(1), ]; break; case 'IL': @@ -345,9 +348,9 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(6, 18, 36); traits = [ - const Trait(name: 'AI'), - const Trait(name: 'Advanced'), - const Trait(name: 'Burst', level: 1), + Trait.AI(), + Trait.Advanced(), + Trait.Burst(1), ]; break; case 'IM': @@ -357,9 +360,9 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(12, 24, 48); traits = [ - const Trait(name: 'AOE', level: 2), - const Trait(name: 'Blast'), - const Trait(name: 'AI'), + Trait.AOE(2), + Trait.Blast(), + Trait.AI(), ]; break; case 'IR': @@ -369,8 +372,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(6, 24, 48); traits = [ - const Trait(name: 'Precise'), - const Trait(name: 'AI'), + Trait.Precise(), + Trait.AI(), ]; break; case 'IS': @@ -388,8 +391,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(0, 9, 18); traits = [ - const Trait(name: 'AI'), - const Trait(name: 'Burst', level: 1), + Trait.AI(), + Trait.Burst(1), ]; break; case 'LC': @@ -399,8 +402,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(12, 36, 72); traits = [ - const Trait(name: 'Precise'), - const Trait(name: 'Advanced'), + Trait.Precise(), + Trait.Advanced(), ]; break; case 'MG': @@ -410,9 +413,9 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(3, 9, 18); traits = [ - const Trait(name: 'AI'), - const Trait(name: 'Burst', level: 2), - const Trait(name: 'Split'), + Trait.AI(), + Trait.Burst(2), + Trait.Split(), ]; break; case 'P': @@ -422,7 +425,7 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(0, 12, 24); traits = [ - const Trait(name: 'Precise'), + Trait.Precise(), ]; break; case 'PA': @@ -432,8 +435,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(6, 24, 48); traits = [ - const Trait(name: 'Haywire'), - const Trait(name: 'Advanced'), + Trait.Haywire(), + Trait.Advanced(), ]; break; case 'PL': @@ -444,13 +447,13 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(6, 24, 48); traits = [ - const Trait(name: 'Burst', level: 1), - const Trait(name: 'Advanced'), + Trait.Burst(1), + Trait.Advanced(), ]; alternativeTraits = [ - Trait(name: 'AP', level: apMap[size]), - const Trait(name: 'Apex'), - const Trait(name: 'Advanced'), + Trait.AP(apMap[size]!), + Trait.Apex(), + Trait.Advanced(), ]; break; case 'PZ': @@ -461,7 +464,7 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(3, 6, 9); traits = [ - Trait(name: 'AP', level: apMap[size]), + Trait.AP(apMap[size]!), ]; break; case 'RC': @@ -471,8 +474,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(6, 18, 36); traits = [ - const Trait(name: 'Burst', level: 2), - const Trait(name: 'Split'), + Trait.Burst(2), + Trait.Split(), ]; break; case 'RF': @@ -482,7 +485,7 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(12, 36, 72); traits = [ - const Trait(name: 'Precise'), + Trait.Precise(), ]; break; case 'RG': @@ -493,9 +496,9 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(12, 48, 96); traits = [ - const Trait(name: 'Precise'), - const Trait(name: 'Advanced'), - Trait(name: 'AP', level: apMap[size]), + Trait.Precise(), + Trait.Advanced(), + Trait.AP(apMap[size]!), ]; break; case 'RL': @@ -505,9 +508,9 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(6, 18, 36); traits = [ - const Trait(name: 'Advanced'), - const Trait(name: 'Burst', level: 2), - const Trait(name: 'Split'), + Trait.Advanced(), + Trait.Burst(2), + Trait.Split(), ]; break; case 'RP': @@ -517,8 +520,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(6, 18, 36); traits = [ - const Trait(name: 'AOE', level: 3), - const Trait(name: 'AP', level: 1), + Trait.AOE(3), + Trait.AP(1), ]; break; case 'SC': @@ -529,8 +532,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(3, 9, 18); traits = [ - Trait(name: 'AP', level: apMap[size]), - const Trait(name: 'Demo', level: 3), + Trait.AP(apMap[size]!), + Trait.Demo(3), ]; break; case 'SE': @@ -541,9 +544,9 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(0, null, null, hasReach: true); traits = [ - Trait(name: 'AP', level: apMap[size]), - const Trait(name: 'Demo', level: 4), - const Trait(name: 'Brawl', level: -1), + Trait.AP(apMap[size]!), + Trait.Demo(4), + Trait.Brawl(-1), ]; break; case 'SG': @@ -554,7 +557,7 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(0, null, null, hasReach: true, increasableReach: true); traits = [ - Trait(name: 'AP', level: apMap[size]), + Trait.AP(apMap[size]!), ]; break; case 'SMG': @@ -564,7 +567,7 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(0, 9, 18); traits = [ - const Trait(name: 'Burst', level: 2), + Trait.Burst(2), ]; break; case 'TG': @@ -575,8 +578,8 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(12, 36, 72); traits = [ - Trait(name: 'AP', level: apMap[size]), - const Trait(name: 'Demo', level: 2), + Trait.AP(apMap[size]!), + Trait.Demo(2), ]; break; case 'VB': @@ -587,7 +590,7 @@ Weapon? _buildWeapon({ damage = damageMap[size]!; range = Range(0, null, null, hasReach: true, increasableReach: true); traits = [ - Trait(name: 'AP', level: apMap[size]), + Trait.AP(apMap[size]!), ]; break; default: diff --git a/lib/screens/roster/pdf/pdf.dart b/lib/screens/roster/pdf/pdf.dart index e486a0da..9ec828d0 100644 --- a/lib/screens/roster/pdf/pdf.dart +++ b/lib/screens/roster/pdf/pdf.dart @@ -3,6 +3,7 @@ import 'dart:typed_data'; import 'package:file_selector/file_selector.dart'; import 'package:gearforce/models/roster/roster.dart'; import 'package:gearforce/screens/roster/pdf/record_sheet/record_sheet.dart'; +import 'package:gearforce/screens/roster/pdf/record_sheet/traits_sheet.dart'; import 'package:gearforce/screens/roster/pdf/unit_cards/unit_cards.dart'; import 'package:pdf/pdf.dart'; import 'package:pdf/widgets.dart' as pw; @@ -50,19 +51,39 @@ Future buildPdf(PdfPageFormat format, UnitRoster roster, ); final unitCards = buildUnitCards(font, roster, version: version); - List cardRows = _buildCardRows(unitCards); - // Add unit cards, they should be aligned in a 3 x 3 layout on each page + // Add unit cards doc.addPage(pw.MultiPage( pageTheme: pageTheme, + mainAxisAlignment: pw.MainAxisAlignment.start, + crossAxisAlignment: pw.CrossAxisAlignment.center, build: (pw.Context context) { - return cardRows; + return [ + pw.Padding( + padding: pw.EdgeInsets.only(), + child: pw.Wrap( + children: unitCards, + spacing: _unitCardMargins * 2, + runSpacing: _unitCardMargins, + ), + ) + ]; }, footer: (pw.Context context) { return _buildFooter(context, version, roster.rulesVersion); }, )); + // Add Trait reference page + doc.addPage(pw.MultiPage( + pageTheme: pageTheme, + build: (context) { + return [buildTraitSheet(font, roster.getAllUnits())]; + }, + footer: (pw.Context context) { + return _buildFooter(context, version, roster.rulesVersion); + })); + // Build and return the final Pdf file data return doc.save(); } @@ -72,8 +93,6 @@ pw.Widget _buildFooter( final footerStyle = pw.Theme.of(context) .defaultTextStyle .copyWith(color: PdfColors.grey, fontSize: 10); -// TODO Instead of manually placing cards to print into rows, put them into a -// pw.grid like the hull and structure boxes used to use. return pw.Row( mainAxisAlignment: pw.MainAxisAlignment.spaceBetween, @@ -101,48 +120,6 @@ pw.Widget _buildFooter( ); } -List _buildCardRows(List unitCards) { - final List cardRows = []; - - for (var i = 0; i < unitCards.length; i++) { - final leftCard = pw.Padding( - padding: pw.EdgeInsets.all(_unitCardMargins), - child: unitCards[i], - ); - - pw.Widget? middleCard; - var nextCardIndex = i + 1; - if (nextCardIndex < unitCards.length) { - middleCard = pw.Padding( - padding: pw.EdgeInsets.all(_unitCardMargins), - child: unitCards[nextCardIndex], - ); - i++; - } - - pw.Widget? rightCard; - nextCardIndex = nextCardIndex + 1; - if (nextCardIndex < unitCards.length) { - rightCard = pw.Padding( - padding: pw.EdgeInsets.all(_unitCardMargins), - child: unitCards[nextCardIndex], - ); - i++; - } - cardRows.add( - pw.Row( - mainAxisAlignment: pw.MainAxisAlignment.center, - children: [ - leftCard, - middleCard ?? pw.Container(), - rightCard ?? pw.Container(), - ], - ), - ); - } - return cardRows; -} - Future downloadPDF(UnitRoster roster, {required String version}) async { final pdf = await buildPdf( PdfPageFormat.letter, diff --git a/lib/screens/roster/pdf/record_sheet/traits_sheet.dart b/lib/screens/roster/pdf/record_sheet/traits_sheet.dart new file mode 100644 index 00000000..9ca36c63 --- /dev/null +++ b/lib/screens/roster/pdf/record_sheet/traits_sheet.dart @@ -0,0 +1,67 @@ +import 'package:gearforce/models/unit/unit.dart'; +import 'package:pdf/widgets.dart' as pw; + +const double _headerTextSize = 12; +const double _standardTextSize = 10; + +pw.Widget buildTraitSheet(pw.Font font, List units) { + const tableHeaders = [ + 'Trait', + 'Description', + ]; + + final Map allTraits = Map(); + units.forEach((unit) { + unit.traits.forEach((trait) { + allTraits[trait.toString()] = trait.description ?? ''; + }); + unit.weapons.forEach((weapon) { + weapon.traits.forEach((trait) { + allTraits[trait.toString()] = trait.description ?? ''; + }); + }); + }); + + final sortedTraits = allTraits.keys.toList(); + sortedTraits.sort(); + + var table = pw.TableHelper.fromTextArray( + cellStyle: pw.TextStyle( + font: font, + fontSize: _standardTextSize, + ), + columnWidths: { + 0: const pw.FixedColumnWidth(200.0), + }, + headers: tableHeaders, + headerStyle: pw.TextStyle( + font: font, + fontSize: _headerTextSize, + fontWeight: pw.FontWeight.bold, + ), + data: List>.generate( + sortedTraits.length, + (row) => List.generate(tableHeaders.length, (col) { + final traitName = sortedTraits[row]; + switch (col) { + case 0: + return traitName; + case 1: + return allTraits[traitName] ?? ''; + default: + return ''; + } + }), + ), + ); + + return pw.Padding( + padding: pw.EdgeInsets.only( + left: 10.0, + right: 10.0, + top: 10.0, + bottom: 10.0, + ), + child: table, + ); +} diff --git a/lib/screens/roster/pdf/unit_cards/unit_cards.dart b/lib/screens/roster/pdf/unit_cards/unit_cards.dart index 5a3afc8a..5e47fd30 100644 --- a/lib/screens/roster/pdf/unit_cards/unit_cards.dart +++ b/lib/screens/roster/pdf/unit_cards/unit_cards.dart @@ -3,7 +3,6 @@ import 'package:gearforce/models/traits/trait.dart'; import 'package:gearforce/models/unit/command.dart'; import 'package:gearforce/models/unit/unit.dart'; import 'package:gearforce/models/weapons/weapon.dart'; -import 'package:gearforce/models/weapons/weapon_modes.dart'; import 'package:pdf/pdf.dart'; import 'package:pdf/widgets.dart' as pw; @@ -552,7 +551,7 @@ pw.Widget _buildWeaponTraits(pw.Font font, Weapon w) { pw.Widget _buildWeaponModes(pw.Font font, Weapon w) { final modeField = _buildWeaponField( - font, w.modes.map((e) => getWeaponModeName(e)[0]).join(', '), + font, w.modes.map((m) => m.abbr).join(', '), textAlign: pw.TextAlign.center); return modeField; diff --git a/lib/screens/roster/roster.dart b/lib/screens/roster/roster.dart index 81d535ad..6ca70e7f 100644 --- a/lib/screens/roster/roster.dart +++ b/lib/screens/roster/roster.dart @@ -18,7 +18,7 @@ import 'package:url_launcher/url_launcher_string.dart'; const double _leftPanelWidth = 670.0; const double _titleHeight = 40.0; const double _menuTitleHeight = 50.0; -const String _version = '0.99.0'; +const String _version = '0.100.0'; const String _bugEmailAddress = 'gearforce@metadiversions.com'; const String _dp9URL = 'https://www.dp9.com/'; const String _sourceCodeURL = 'https://github.com/Ariemeth/gearforce-flutter'; diff --git a/lib/screens/unit/unit_card.dart b/lib/screens/unit/unit_card.dart index a2691653..0933e58d 100644 --- a/lib/screens/unit/unit_card.dart +++ b/lib/screens/unit/unit_card.dart @@ -1,17 +1,19 @@ import 'package:flutter/material.dart'; +import 'package:gearforce/models/traits/trait.dart'; import 'package:gearforce/models/unit/command.dart'; import 'package:gearforce/models/unit/unit.dart'; import 'package:gearforce/models/weapons/weapon.dart'; -import 'package:gearforce/models/weapons/weapon_modes.dart'; +import 'package:gearforce/widgets/settings.dart'; +import 'package:provider/provider.dart'; const _horizontalBorder = const BorderSide(); const _primaryStatSectionWidth = 70.0; const _primaryStatNameWidth = 35.0; -const _secondaryStatNameWidth = 35.0; +const _secondaryStatNameWidth = 38.0; const _secondaryStatRightStatValueWidth = 25.0; const _weaponCodeWidth = 50.0; const _weaponRangeWidth = 60.0; -const _weaponDamageWidth = 15.0; +const _weaponDamageWidth = 20.0; const _reactSymbol = '»'; class UnitCard extends StatelessWidget { @@ -233,24 +235,15 @@ class UnitCard extends StatelessWidget { ); } -// TODO Add tooltips with trait info Widget _TraitsRow(BuildContext context) { return Container( child: Padding( padding: const EdgeInsets.only(left: 5.0, right: 5.0, bottom: 3.0), - child: Row( - children: [Text(unit.traits.join(', '))], - ), + child: _buildTraitList(context, unit.traits), ), - decoration: BoxDecoration( - border: Border( - bottom: _horizontalBorder, - )), ); } -// TODO Add tooltips with weapon trait info -// TODO Add tooltips for weapon modes Widget _WeaponsRow(BuildContext context) { final weaponTable = Table( children: [ @@ -279,7 +272,7 @@ class UnitCard extends StatelessWidget { _buildWeaponCode(w), _buildWeaponRange(w), _buildWeaponDamage(w), - _buildWeaponTraits(w), + _buildWeaponTraits(context, w), _buildWeaponMode(w), ], )); @@ -289,7 +282,7 @@ class UnitCard extends StatelessWidget { _buildWeaponCode(w.combo!), _buildWeaponRange(w.combo!), _buildWeaponDamage(w.combo!), - _buildWeaponTraits(w.combo!), + _buildWeaponTraits(context, w.combo!), _buildWeaponMode(w.combo!), ], )); @@ -300,7 +293,13 @@ class UnitCard extends StatelessWidget { padding: const EdgeInsets.only(left: 5.0, right: 5.0, bottom: 5.0), child: weaponTable); - return layout; + return Container( + child: layout, + decoration: BoxDecoration( + border: Border( + top: _horizontalBorder, + )), + ); } } @@ -318,15 +317,55 @@ Widget _buildWeaponDamage(Weapon w) { return Text('${w.damage}'); } -Widget _buildWeaponTraits(Weapon w) { - final traits1 = w.traits.join(', '); - final traits2 = w.alternativeTraits.join(', '); - return Text('${traits2.isEmpty ? traits1 : '[$traits1] or [$traits2]'}'); +Widget _buildWeaponTraits(BuildContext context, Weapon w) { + final traits1 = _buildTraitList(context, w.traits); + final traits2 = _buildTraitList(context, w.alternativeTraits); + return Wrap( + children: [ + w.alternativeTraits.isEmpty ? Container() : Text('['), + traits1, + w.alternativeTraits.isEmpty ? Container() : Text(']'), + w.alternativeTraits.isNotEmpty + ? Tooltip( + message: Trait.Or().description, + child: Text(' or '), + ) + : Container(), + w.alternativeTraits.isEmpty ? Container() : Text('['), + w.alternativeTraits.isNotEmpty ? traits2 : Container(), + w.alternativeTraits.isEmpty ? Container() : Text(']'), + ], + ); } Widget _buildWeaponMode(Weapon w) { - return Text( - '${w.modes.map((m) => getWeaponModeName(m)[0]).toList().join(', ')}', - textAlign: TextAlign.center, + return Tooltip( + child: Text( + '${w.modes.map((m) => m.abbr).toList().join(', ')}', + textAlign: TextAlign.center, + ), + message: w.modes.map((m) => m.name).toList().join('\n'), + ); +} + +Widget _buildTraitList(BuildContext context, List traits) { + if (traits.isEmpty) { + return Row(); + } + final settings = context.read(); + + final List traitList = []; + final lastTrait = traits.last; + + traits.forEach((trait) { + var traitStr = trait.toString() + (trait == lastTrait ? '' : ', '); + traitList.add(Tooltip( + child: Text(traitStr), + message: trait.description ?? '', + waitDuration: settings.tooltipDelay, + )); + }); + return Wrap( + children: traitList, ); } diff --git a/pubspec.yaml b/pubspec.yaml index 8bf59675..0f102f40 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.99.0 +version: 0.100.0 environment: sdk: ">=3.0.0" diff --git a/test/models/combatGroups/combat_groups_test.dart b/test/models/combatGroups/combat_groups_test.dart index e7732f53..bb6eeb47 100644 --- a/test/models/combatGroups/combat_groups_test.dart +++ b/test/models/combatGroups/combat_groups_test.dart @@ -66,7 +66,7 @@ Unit createDefaultUnit() { piloting: 6, ew: 2, weapons: [], - traits: [const Trait(name: 'hands')], + traits: [Trait.Hands()], type: ModelType.Gear, height: '1.5')); } diff --git a/test/models/mods/mods_test.dart b/test/models/mods/mods_test.dart index fb720ed2..8653e822 100644 --- a/test/models/mods/mods_test.dart +++ b/test/models/mods/mods_test.dart @@ -40,7 +40,7 @@ void main() { }); test('test createAddToList mod adds Comms to list', () { - const trait = const Trait(name: 'Comms'); + final trait = Trait.Comms(); final mod = createAddTraitToList(trait); final List traits = [const Trait(name: 'something')]; expect(mod(traits), contains(trait)); @@ -50,7 +50,7 @@ void main() { }); test('test createAddToList mod adds Comms to list with existing +', () { - const trait = const Trait(name: 'Comms'); + final trait = Trait.Comms(); final mod = createAddTraitToList(trait); final List traits = [const Trait(name: 'Comms+')]; expect(mod(traits), contains(trait)); @@ -61,7 +61,7 @@ void main() { }); test('test createAddToList mod does not duplicate Comms', () { - const trait = const Trait(name: 'Comms'); + final trait = Trait.Comms(); final mod = createAddTraitToList(trait); final List traits = [trait]; expect(mod(traits), contains(trait)); @@ -71,8 +71,8 @@ void main() { }); test('test createReplaceInList mod adds Brawl:2 to list removes Brawl:1', () { - const traitOld = const Trait(name: 'Brawl', level: 1); - const traitNew = const Trait(name: 'Brawl', level: 2); + final traitOld = Trait.Brawl(1); + final traitNew = Trait.Brawl(2); final mod = createReplaceTraitInList(oldValue: traitOld, newValue: traitNew); final List traits = [traitOld]; @@ -86,8 +86,8 @@ void main() { test( 'test createReplaceInList mod adds Brawl:2 to list removes Brawl:1 when Brawl:1 dne', () { - const traitOld = const Trait(name: 'Brawl', level: 1); - const traitNew = const Trait(name: 'Brawl', level: 2); + final traitOld = Trait.Brawl(1); + final traitNew = Trait.Brawl(2); final mod = createReplaceTraitInList(oldValue: traitOld, newValue: traitNew); final List traits = []; diff --git a/test/models/mods/standardUpgrades/standard_modification_test.dart b/test/models/mods/standardUpgrades/standard_modification_test.dart index 68b38d3c..5730d530 100644 --- a/test/models/mods/standardUpgrades/standard_modification_test.dart +++ b/test/models/mods/standardUpgrades/standard_modification_test.dart @@ -72,17 +72,17 @@ void main() { final faction = roster.factionNotifier.value.factionType; cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); @@ -95,12 +95,9 @@ void main() { test('test handGrenade (LHG) requirement check with 1 in group already', () { var cg = CombatGroup('test1') - ..primary.addUnit( - Unit(core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))) - ..primary.addUnit( - Unit(core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))) - ..primary.addUnit(Unit( - core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))); + ..primary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))) + ..primary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))) + ..primary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))); final roster = UnitRoster(data)..addCG(cg); var u = cg.primary.allUnits().last; @@ -116,17 +113,17 @@ void main() { final faction = roster.factionNotifier.value.factionType; cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); @@ -142,12 +139,9 @@ void main() { 'test handGrenade (LHG) requirement check with 1 MHG already added to other group', () { var cg = CombatGroup('test1') - ..primary.addUnit( - Unit(core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))) - ..secondary.addUnit( - Unit(core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))) - ..secondary.addUnit(Unit( - core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))); + ..primary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))) + ..secondary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))) + ..secondary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))); final roster = UnitRoster(data)..addCG(cg); var u = cg.primary.allUnits().last; @@ -165,13 +159,13 @@ void main() { final faction = roster.factionNotifier.value.factionType; cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); @@ -190,18 +184,18 @@ void main() { cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); cg.primary.addUnit(Unit( core: UnitCore.test( name: 'test3', - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); @@ -222,18 +216,18 @@ void main() { cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); cg.primary.addUnit(Unit( core: UnitCore.test( name: 'test3', - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); @@ -251,18 +245,18 @@ void main() { cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); cg.primary.addUnit(Unit( core: UnitCore.test( - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); cg.primary.addUnit(Unit( core: UnitCore.test( name: 'test3', - traits: const [const Trait(name: 'Hands')], + traits: [Trait.Hands()], faction: faction, ))); @@ -276,12 +270,9 @@ void main() { 'test handGrenade (MHG) requirement check with 1 MHG already added to other group', () { var cg = CombatGroup('test1') - ..primary.addUnit( - Unit(core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))) - ..secondary.addUnit( - Unit(core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))) - ..secondary.addUnit(Unit( - core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))); + ..primary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))) + ..secondary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))) + ..secondary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))); final first = cg.primary.allUnits().first; first.addUnitMod(StandardModification.handGrenadeMHG(first, cg)); @@ -291,12 +282,9 @@ void main() { }); test('test handGrenade (MHG) cost with only 1 mod', () { var cg = CombatGroup('test1') - ..primary.addUnit( - Unit(core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))) - ..primary.addUnit( - Unit(core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))) - ..primary.addUnit(Unit( - core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))); + ..primary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))) + ..primary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))) + ..primary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))); var u = cg.primary.allUnits().last; final mod = StandardModification.handGrenadeMHG(u, cg); @@ -306,12 +294,9 @@ void main() { test('test handGrenade (MHG) cost with 2 mods', () { var cg = CombatGroup('test1') - ..primary.addUnit( - Unit(core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))) - ..primary.addUnit( - Unit(core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))) - ..primary.addUnit(Unit( - core: UnitCore.test(traits: const [const Trait(name: 'Hands')]))); + ..primary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))) + ..primary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))) + ..primary.addUnit(Unit(core: UnitCore.test(traits: [Trait.Hands()]))); final u = cg.primary.allUnits().last; u.addUnitMod(StandardModification.handGrenadeMHG(u, cg)); diff --git a/test/models/mods/unitUpgrades/unit_upgrades_test.dart b/test/models/mods/unitUpgrades/unit_upgrades_test.dart index 351711e4..1476139e 100644 --- a/test/models/mods/unitUpgrades/unit_upgrades_test.dart +++ b/test/models/mods/unitUpgrades/unit_upgrades_test.dart @@ -24,18 +24,18 @@ void main() { test('test headhunter mod adds Comms to list', () { final mod = headHunter; - final List traits = [const Trait(name: 'Comms+')]; + final List traits = []; final List result = mod.applyMods(UnitAttribute.traits, traits); - expect(result.any((element) => element.name == 'Comms+'), isTrue, - reason: 'check Comms+ exists'); - expect(mod.applyMods(UnitAttribute.traits, traits), hasLength(2)); + expect(result.any((element) => element.name == 'Comms'), isTrue, + reason: 'check Comms exists'); + expect(mod.applyMods(UnitAttribute.traits, traits), hasLength(1)); }); test('test headhunter mod does not duplicate Comms', () { final mod = headHunter; - final List traits = [const Trait(name: "Comms")]; - expect(mod.applyMods(UnitAttribute.traits, traits), - contains(const Trait(name: "Comms"))); + final List traits = [Trait.Comms()]; + expect( + mod.applyMods(UnitAttribute.traits, traits), contains(Trait.Comms())); expect(traits, hasLength(1), reason: 'original list should not have changed in length'); expect(mod.applyMods(UnitAttribute.traits, traits), hasLength(1)); diff --git a/test/models/weapons/weapon_modes_test.dart b/test/models/weapons/weapon_modes_test.dart index 8eaffbcf..ddc18d9b 100644 --- a/test/models/weapons/weapon_modes_test.dart +++ b/test/models/weapons/weapon_modes_test.dart @@ -3,14 +3,14 @@ import 'package:test/test.dart'; void main() { test('test converting weaponMode to string for Direct', () { - expect(getWeaponModeName(weaponModes.Direct), equals('Direct')); + expect(weaponModes.Direct.name, equals('Direct')); }); test('test converting weaponMode to string for Indirect', () { - expect(getWeaponModeName(weaponModes.Indirect), equals('Indirect')); + expect(weaponModes.Indirect.name, equals('Indirect')); }); test('test converting weaponMode to string for Melee', () { - expect(getWeaponModeName(weaponModes.Melee), equals('Melee')); + expect(weaponModes.Melee.name, equals('Melee')); }); } diff --git a/test/models/weapons/weapons_test.dart b/test/models/weapons/weapons_test.dart index 16cd3bcd..d3cf2ad4 100644 --- a/test/models/weapons/weapons_test.dart +++ b/test/models/weapons/weapons_test.dart @@ -692,16 +692,16 @@ void main() { expect(l?.toString(), equals('LAC/LGL (Auto)'), reason: 'check toString'); }); - test('test building standard BB', () { + test('test building standard LB', () { final modes = [weaponModes.Direct]; final range = Range(0, null, null); const damage = 8; final traits = [const Trait(name: 'AOE', level: 4)]; const name = 'Bomb'; - final l = buildWeapon('BB'); + final l = buildWeapon('LB'); expect(l, isNotNull, reason: 'weapon should not be null'); - expect(l?.abbreviation, 'BB', reason: 'check weapon code'); + expect(l?.abbreviation, 'LB', reason: 'check weapon code'); expect(l?.name, equals(name), reason: 'check name'); expect(l?.modes, equals(modes), reason: 'check modes'); expect(l?.damage, equals(damage), reason: 'check damage');