diff --git a/src/main/kotlin/com/dowstats/controllers/AbilityController.kt b/src/main/kotlin/com/dowstats/controllers/AbilityController.kt new file mode 100644 index 0000000..fc04de8 --- /dev/null +++ b/src/main/kotlin/com/dowstats/controllers/AbilityController.kt @@ -0,0 +1,31 @@ +package com.dowstats.controllers + +import com.dowstats.data.dto.controllers.WeaponDto +import com.dowstats.data.dto.controllers.ability.AbilityDto +import com.dowstats.data.dto.controllers.building.BuildingFullDto +import com.dowstats.data.dto.controllers.building.RaceBuildings +import com.dowstats.data.dto.controllers.research.ResearchDto +import com.dowstats.data.repositories.BuildingRepository +import com.dowstats.service.datamaps.AbilityService +import com.dowstats.service.datamaps.DowBuildingMappingService +import com.dowstats.service.datamaps.ResearchService +import com.dowstats.service.datamaps.WeaponService +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.web.bind.annotation.DeleteMapping +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + + +@RestController +@RequestMapping("api/v1/ability") +class AbilityController @Autowired constructor( + val abilityService: AbilityService, +) { + + @GetMapping("/{modId}/{abilityId}") + fun getById(@PathVariable abilityId: Long, @PathVariable modId: Long): AbilityDto { + return abilityService.getAbilityDto(abilityId, modId) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/controllers/UnitsController.kt b/src/main/kotlin/com/dowstats/controllers/UnitsController.kt index 5606fd6..29145aa 100644 --- a/src/main/kotlin/com/dowstats/controllers/UnitsController.kt +++ b/src/main/kotlin/com/dowstats/controllers/UnitsController.kt @@ -2,7 +2,6 @@ package com.dowstats.controllers import com.dowstats.data.dto.controllers.RaceUnits import com.dowstats.data.dto.controllers.UnitFullDto -import com.dowstats.data.entities.DowUnit import com.dowstats.data.repositories.UnitRepository import com.dowstats.service.datamaps.DowUnitMappingService import org.springframework.beans.factory.annotation.Autowired diff --git a/src/main/kotlin/com/dowstats/data/dto/AreaEffect.kt b/src/main/kotlin/com/dowstats/data/dto/AreaEffect.kt index 6e88f69..f370e05 100644 --- a/src/main/kotlin/com/dowstats/data/dto/AreaEffect.kt +++ b/src/main/kotlin/com/dowstats/data/dto/AreaEffect.kt @@ -1,5 +1,7 @@ package com.dowstats.data.dto +import com.dowstats.data.entities.weapon.WeaponModifiers + data class AreaEffect( val minDamage: Double, val maxDamage: Double, @@ -10,4 +12,6 @@ data class AreaEffect( val moraleDamage: Double, val weaponDmgMap: Map, val defaultArmorPiercing: Double, + val areaType: String?, + val filterType: String?, ) \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/data/dto/BuildingDataToSave.kt b/src/main/kotlin/com/dowstats/data/dto/BuildingDataToSave.kt index 4300e1a..622cf11 100644 --- a/src/main/kotlin/com/dowstats/data/dto/BuildingDataToSave.kt +++ b/src/main/kotlin/com/dowstats/data/dto/BuildingDataToSave.kt @@ -1,7 +1,7 @@ package com.dowstats.data.dto import com.dowstats.data.entities.building.Building -import com.dowstats.data.entities.Weapon +import com.dowstats.data.entities.weapon.Weapon data class BuildingDataToSave( val building: Building, diff --git a/src/main/kotlin/com/dowstats/data/dto/UnitDataToSave.kt b/src/main/kotlin/com/dowstats/data/dto/UnitDataToSave.kt index 8c13d59..8c8104a 100644 --- a/src/main/kotlin/com/dowstats/data/dto/UnitDataToSave.kt +++ b/src/main/kotlin/com/dowstats/data/dto/UnitDataToSave.kt @@ -1,8 +1,8 @@ package com.dowstats.data.dto -import com.dowstats.data.entities.DowUnit -import com.dowstats.data.entities.Sergeant -import com.dowstats.data.entities.Weapon +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.sergant.Sergeant +import com.dowstats.data.entities.weapon.Weapon data class WeaponsData( val hardpoint: Int, diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/AbilityArmorPiercingDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/AbilityArmorPiercingDto.kt new file mode 100644 index 0000000..9602750 --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/AbilityArmorPiercingDto.kt @@ -0,0 +1,8 @@ +package com.dowstats.data.dto.controllers + +import java.math.BigDecimal + +data class AbilityArmorPiercingDto( + val armorType: ArmorTypeDto?, + val piercingValue: BigDecimal, +) diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/EntityCompressDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/EntityCompressDto.kt index e3cbe9c..f948bf0 100644 --- a/src/main/kotlin/com/dowstats/data/dto/controllers/EntityCompressDto.kt +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/EntityCompressDto.kt @@ -1,9 +1,9 @@ package com.dowstats.data.dto.controllers import com.dowstats.data.entities.building.Building -import com.dowstats.data.entities.DowUnit -import com.dowstats.data.entities.Sergeant -import com.dowstats.data.entities.Weapon +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.sergant.Sergeant +import com.dowstats.data.entities.weapon.Weapon data class EntityCompressDto( diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/ModifierDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/ModifierDto.kt index 9e78e49..743b226 100644 --- a/src/main/kotlin/com/dowstats/data/dto/controllers/ModifierDto.kt +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/ModifierDto.kt @@ -6,4 +6,8 @@ data class ModifierDto ( val usageType: String?, val value: Double?, val target: String? = null, + val maxLifeTime: Double? = null, + val applicationType: String? = null, + val probabilityOfApplying: Double? = null, + val exclusive: Boolean? = null, ) diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/SergeantDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/SergeantDto.kt index 2935e7a..709e55c 100644 --- a/src/main/kotlin/com/dowstats/data/dto/controllers/SergeantDto.kt +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/SergeantDto.kt @@ -1,5 +1,6 @@ package com.dowstats.data.dto.controllers +import com.dowstats.data.dto.controllers.ability.AbilityShortDto import com.dowstats.data.dto.controllers.research.ResearchShortDto @@ -23,12 +24,18 @@ data class SergeantDto( val armour: Double?, val healthRegeneration: Double?, val moraleDeathPenalty: Int?, + val moraleIncomeMax: Double?, + val moraleIncomeRate: Double?, val mass: Int?, val upTime: Double?, val sightRadius: Int?, val detectRadius: Int?, val icon: String?, val weapons: List?, + val abilities: Set?, val affectedResearches: Set, + val modifiers: List, + var affectedData: AffectedDataDto, val requirements: RequirementDto?, + val hotkey: String?, ) diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/SergeantUnitShortDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/SergeantUnitShortDto.kt index 0cb65e5..714f8e1 100644 --- a/src/main/kotlin/com/dowstats/data/dto/controllers/SergeantUnitShortDto.kt +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/SergeantUnitShortDto.kt @@ -1,7 +1,7 @@ package com.dowstats.data.dto.controllers import com.dowstats.data.dto.controllers.EntityCompressDtoObject.compressDto -import com.dowstats.data.entities.Sergeant +import com.dowstats.data.entities.sergant.Sergeant data class SergeantUnitShortDto( val id: Long?, diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/UnitFullDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/UnitFullDto.kt index a8c0c61..bb10e65 100644 --- a/src/main/kotlin/com/dowstats/data/dto/controllers/UnitFullDto.kt +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/UnitFullDto.kt @@ -1,7 +1,9 @@ package com.dowstats.data.dto.controllers +import com.dowstats.data.dto.controllers.ability.AbilityShortDto import com.dowstats.data.dto.controllers.building.BuildingAddonShortDto import com.dowstats.data.dto.controllers.research.ResearchShortDto +import com.dowstats.data.entities.ability.Ability data class UnitFullDto( @@ -52,8 +54,12 @@ data class UnitFullDto( val modId: Long, val sergeants: Set?, val weapons: Set?, + val abilities: Set?, val haveReinforceMenu: Boolean, val affectedResearches: Set, val affectedAddons: Set, + val modifiers: List, + var affectedData: AffectedDataDto, val requirements: RequirementDto?, + val hotkey: String?, ) \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/WeaponDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/WeaponDto.kt index 6c729a8..5765723 100644 --- a/src/main/kotlin/com/dowstats/data/dto/controllers/WeaponDto.kt +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/WeaponDto.kt @@ -33,5 +33,7 @@ data class WeaponDto( val weaponArmorPiercing: List, val affectedResearches: Set, val affectedAddons: Set, + val modifiers: List, val requirements: RequirementDto?, + val hotkey: String?, ) diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/WeaponUnitShortDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/WeaponUnitShortDto.kt index c976454..e04a144 100644 --- a/src/main/kotlin/com/dowstats/data/dto/controllers/WeaponUnitShortDto.kt +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/WeaponUnitShortDto.kt @@ -1,7 +1,7 @@ package com.dowstats.data.dto.controllers import com.dowstats.data.dto.controllers.EntityCompressDtoObject.compressDto -import com.dowstats.data.entities.Weapon +import com.dowstats.data.entities.weapon.Weapon data class WeaponUnitShortDto( val id: Long?, diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/ability/AbilityDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/ability/AbilityDto.kt new file mode 100644 index 0000000..e1286cf --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/ability/AbilityDto.kt @@ -0,0 +1,45 @@ +package com.dowstats.data.dto.controllers.ability + +import com.dowstats.data.dto.controllers.AbilityArmorPiercingDto +import com.dowstats.data.dto.controllers.AffectedDataDto +import com.dowstats.data.dto.controllers.ArmorTypeDto +import com.dowstats.data.dto.controllers.ModifierDto +import com.dowstats.data.dto.controllers.RequirementDto + +data class AbilityDto( + val id: Long?, + val modId: Long?, + val filename: String?, + val name: String?, + val description: String?, + val costRequisition: Double?, + val costPower: Double?, + val costFaith: Double?, + val costSouls: Double?, + val icon: String?, + val uiIndexHint: Int, + val hotkey: String?, + val childAbility: AbilityDto?, + val initialDelayTime: Double?, + val range: Double?, + val rechargeTime: Double?, + val rechargeTimerGlobal: Boolean?, + val refreshTime: Double?, + val durationTime: Double?, + val spawnedEntityName: String?, + val radius: Double?, + val minDamage: Double?, + val minDamageValue: Double?, + val maxDamage: Double?, + val moraleDamage: Double?, + val throwForceMin: Double?, + val throwForceMax: Double?, + val activation: String?, + val areaEffect: String?, + val areaFilter: String?, + val modifiers: List, + val requirements: RequirementDto?, + var affectedData: AffectedDataDto, + val targetFilter: List, + val piercings: List +) \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/ability/AbilityShortDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/ability/AbilityShortDto.kt new file mode 100644 index 0000000..c7a8bca --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/ability/AbilityShortDto.kt @@ -0,0 +1,10 @@ +package com.dowstats.data.dto.controllers.ability + +data class AbilityShortDto( + val id: Long?, + val name: String?, + val fileName: String?, + val icon: String?, + val uiIndexHint: Int?, + val activationType: String?, +) \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/building/BuildingAddonDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/building/BuildingAddonDto.kt index a0c56be..02710d7 100644 --- a/src/main/kotlin/com/dowstats/data/dto/controllers/building/BuildingAddonDto.kt +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/building/BuildingAddonDto.kt @@ -17,6 +17,7 @@ data class BuildingAddonDto( val affectedData: AffectedDataDto, val addonRequirement: RequirementDto?, val icon: String?, + val hotkey: String?, ) data class BuildingAddonShortDto( diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/building/BuildingFullDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/building/BuildingFullDto.kt index 63e91e0..a79e027 100644 --- a/src/main/kotlin/com/dowstats/data/dto/controllers/building/BuildingFullDto.kt +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/building/BuildingFullDto.kt @@ -1,7 +1,9 @@ package com.dowstats.data.dto.controllers.building import com.dowstats.data.dto.controllers.* +import com.dowstats.data.dto.controllers.ability.AbilityShortDto import com.dowstats.data.dto.controllers.research.ResearchShortDto +import com.dowstats.data.entities.ability.Ability data class BuildingFullDto( var id: Long?, @@ -29,6 +31,7 @@ data class BuildingFullDto( var icon: String?, var modId: Long?, var addons: List?, + val abilities: Set?, var researches: List?, var modifiers: List, var affectedData: AffectedDataDto, @@ -36,4 +39,5 @@ data class BuildingFullDto( val weapons: Set, val requirements: RequirementDto?, val affectedResearches: Set, + val hotkey: String?, ) diff --git a/src/main/kotlin/com/dowstats/data/dto/controllers/research/ResearchDto.kt b/src/main/kotlin/com/dowstats/data/dto/controllers/research/ResearchDto.kt index 20b62e7..29a850b 100644 --- a/src/main/kotlin/com/dowstats/data/dto/controllers/research/ResearchDto.kt +++ b/src/main/kotlin/com/dowstats/data/dto/controllers/research/ResearchDto.kt @@ -19,4 +19,5 @@ data class ResearchDto( val icon: String?, val uiIndexHint : Int, val modId: Long?, + val hotkey: String? ) \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/data/entities/Activation.kt b/src/main/kotlin/com/dowstats/data/entities/Activation.kt new file mode 100644 index 0000000..cf8ecbb --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/entities/Activation.kt @@ -0,0 +1,15 @@ +package com.dowstats.data.entities + +import jakarta.persistence.* + + +@Entity +@Table(name = "activation") +class Activation { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + var id: String? = null + var name: String? = null + +} diff --git a/src/main/kotlin/com/dowstats/data/entities/AreaEffect.kt b/src/main/kotlin/com/dowstats/data/entities/AreaEffect.kt new file mode 100644 index 0000000..1e8b561 --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/entities/AreaEffect.kt @@ -0,0 +1,15 @@ +package com.dowstats.data.entities + +import jakarta.persistence.* + + +@Entity +@Table(name = "area_effect") +class AreaEffect { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + var id: String? = null + var name: String? = null + +} diff --git a/src/main/kotlin/com/dowstats/data/entities/AreaFilter.kt b/src/main/kotlin/com/dowstats/data/entities/AreaFilter.kt new file mode 100644 index 0000000..4ff0671 --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/entities/AreaFilter.kt @@ -0,0 +1,15 @@ +package com.dowstats.data.entities + +import jakarta.persistence.* + + +@Entity +@Table(name = "area_filter") +class AreaFilter { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + var id: String? = null + var name: String? = null + +} diff --git a/src/main/kotlin/com/dowstats/data/entities/ModifiersBase.kt b/src/main/kotlin/com/dowstats/data/entities/ModifiersBase.kt index 23f185e..cd49991 100644 --- a/src/main/kotlin/com/dowstats/data/entities/ModifiersBase.kt +++ b/src/main/kotlin/com/dowstats/data/entities/ModifiersBase.kt @@ -1,7 +1,11 @@ package com.dowstats.data.entities -import com.dowstats.data.dto.controllers.EntityCompressDtoObject.compressDto -import com.dowstats.data.dto.controllers.SergeantUnitShortDto +import com.dowstats.data.dto.controllers.ModifierDto +import com.dowstats.data.rgd.RgdData +import com.dowstats.data.rgd.RgdDataUtil.getBooleanByName +import com.dowstats.data.rgd.RgdDataUtil.getDoubleByName +import com.dowstats.data.rgd.RgdDataUtil.getRgdTableByName +import com.dowstats.data.rgd.RgdDataUtil.getStringByName import jakarta.persistence.GeneratedValue import jakarta.persistence.GenerationType import jakarta.persistence.Id @@ -17,6 +21,22 @@ open class ModifiersBase { var target: String? = null var usageType: String? = null var value: Double? = null + var applicationType: String? = null + var probabilityOfApplying: Double? = null + var exclusive: Boolean? = null + + fun toDto(): ModifierDto { + return ModifierDto( + id = id!!, + reference = reference, + usageType = usageType, + value = value, + target = target, + applicationType = applicationType, + probabilityOfApplying = probabilityOfApplying, + exclusive = exclusive + ) + } companion object ModifiersBaseCompanion { @@ -26,6 +46,17 @@ open class ModifiersBase { it.usageType == "type_modifierusagetype\\tp_mod_usage_multiplication.lua" && it.value == 1.0 } + fun T.fillDataFromRgdTable(rgdData: List): T { + this.reference = rgdData.getStringByName("\$REF") + this.target = rgdData.getStringByName("target_type_name") + this.usageType = rgdData.getRgdTableByName("usage_type")?.getStringByName("\$REF") + this.value = try{ rgdData.getDoubleByName("value") } catch (e: Exception) { null } + this.applicationType = rgdData.getRgdTableByName("application_type")?.getStringByName("\$REF") + this.exclusive = try { rgdData.getBooleanByName("exclusive") } catch (e: Exception) { false } + this.probabilityOfApplying = rgdData.getDoubleByName("probability_of_applying") + return this + } + } } diff --git a/src/main/kotlin/com/dowstats/data/entities/ability/Ability.kt b/src/main/kotlin/com/dowstats/data/entities/ability/Ability.kt new file mode 100644 index 0000000..07ab554 --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/entities/ability/Ability.kt @@ -0,0 +1,166 @@ +package com.dowstats.data.entities.ability + +import com.dowstats.data.dto.controllers.AbilityArmorPiercingDto +import com.dowstats.data.dto.controllers.AffectedDataDto +import com.dowstats.data.dto.controllers.EntityCompressDtoObject.compressDto +import com.dowstats.data.dto.controllers.RequirementDto +import com.dowstats.data.dto.controllers.SergeantUnitShortDtoObject.toShortDtoSet +import com.dowstats.data.dto.controllers.WeaponUnitShortDtoObject.toShortDtoSet +import com.dowstats.data.dto.controllers.ability.AbilityDto +import com.dowstats.data.dto.controllers.ability.AbilityShortDto +import com.dowstats.data.entities.Activation +import com.dowstats.data.entities.AreaEffect +import com.dowstats.data.entities.AreaFilter +import com.dowstats.data.entities.ArmorType +import com.dowstats.data.entities.building.Building +import com.dowstats.data.entities.sergant.Sergeant +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.weapon.Weapon +import jakarta.persistence.* +import java.math.BigDecimal + + +@Entity +@Table(name = "abilities") +class Ability { + + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null + + var modId: Long? = null + var filename: String? = null + var name: String? = null + + var description: String? = null + + var costRequisition: Double? = null + var costPower: Double? = null + var costFaith: Double? = null + var costSouls: Double? = null + var icon: String? = null + + var uiIndexHint: Int = 0 + var uiHotkeyName: String? = null + var childAbilityName: String? = null + var initialDelayTime: Double? = null + var radius: Double? = null + var minDamage: Double? = null + var minDamageValue: Double? = null + var maxDamage: Double? = null + var moraleDamage: Double? = null + var throwForceMin: Double? = null + var throwForceMax: Double? = null + + var range: Double? = null + var rechargeTime: Double? = null + var rechargeTimerGlobal: Boolean? = null + var refreshTime: Double? = null + var durationTime: Double? = null + + var spawnedEntityName: String? = null + + @ManyToOne + @JoinColumn(name = "activation_id") + var activation: Activation? = null + + @ManyToOne + @JoinColumn(name = "area_effect_id") + var areaEffect: AreaEffect? = null + + @ManyToOne + @JoinColumn(name = "area_filter_id") + var areaFilter: AreaFilter? = null + + @ManyToMany + @JoinTable(name = "unit_abilities", + joinColumns = [JoinColumn(name = "ability_id")], + inverseJoinColumns = [JoinColumn(name = "unit_id")]) + var unitsUse: MutableSet? = null + + @OneToMany(mappedBy = "ability", cascade = [CascadeType.ALL]) + var abilityModifiers: MutableSet = mutableSetOf() + + @OneToMany(mappedBy = "ability", cascade = [CascadeType.ALL]) + var abilityRequirements: MutableSet = mutableSetOf() + + @OneToMany(mappedBy = "ability", cascade = [CascadeType.ALL]) + var abilityPiercings: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "ability_affected_units", + joinColumns = [JoinColumn(name = "ability_id")], + inverseJoinColumns = [JoinColumn(name = "unit_id")]) + var affectedOnUnits: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "ability_affected_sergeants", + joinColumns = [JoinColumn(name = "ability_id")], + inverseJoinColumns = [JoinColumn(name = "sergeant_id")]) + var affectedOnSergeants: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "ability_affected_buildings", + joinColumns = [JoinColumn(name = "ability_id")], + inverseJoinColumns = [JoinColumn(name = "building_id")]) + var affectedOnBuildings: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable( name = "ability_affected_weapons", + joinColumns = [JoinColumn(name = "ability_id")], + inverseJoinColumns = [JoinColumn(name = "weapon_id")]) + var affectedOnWeapons: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "ability_target_filter", + joinColumns = [JoinColumn(name = "ability_id")], + inverseJoinColumns = [JoinColumn(name = "armor_type_id")]) + var abilityTargetFilters: MutableSet = mutableSetOf() + + fun toShortDto() = AbilityShortDto(id, name, filename, icon, uiIndexHint, activation?.name) + + fun toDto(requirements: RequirementDto?, childAbility: AbilityDto?): AbilityDto = AbilityDto( + id = id, + modId = modId, + filename = filename, + name = name, + description = description, + costRequisition = costRequisition, + costPower = costPower, + costFaith = costFaith, + costSouls = costSouls, + icon = icon, + uiIndexHint = uiIndexHint, + hotkey = uiHotkeyName, + childAbility = childAbility, + initialDelayTime = initialDelayTime, + range = range, + rechargeTime = rechargeTime, + rechargeTimerGlobal = rechargeTimerGlobal, + refreshTime = refreshTime, + durationTime = durationTime, + spawnedEntityName = spawnedEntityName, + radius = radius, + minDamage = minDamage, + minDamageValue = minDamageValue, + maxDamage = maxDamage, + moraleDamage = moraleDamage, + throwForceMin = throwForceMin, + throwForceMax = throwForceMax, + activation = activation?.name, + areaEffect = areaEffect?.name, + areaFilter = areaFilter?.name, + modifiers = abilityModifiers.map { it.toDto().copy(maxLifeTime = it.maxLifeTime) }.sortedBy { it.target }, + requirements = requirements, + affectedData = AffectedDataDto( + affectedOnUnits.map { it.compressDto() }.toSet(), + affectedOnSergeants.toShortDtoSet(), + affectedOnBuildings.map { it.compressDto() }.toSet(), + affectedOnWeapons.toShortDtoSet(), + ), + targetFilter = abilityTargetFilters.map { it.toDto() }, + piercings = abilityPiercings.map { AbilityArmorPiercingDto(it.armorType?.toDto(), it.piercingValue ?: BigDecimal.ZERO) } + ) + +} diff --git a/src/main/kotlin/com/dowstats/data/entities/ability/AbilityArmorPiercing.kt b/src/main/kotlin/com/dowstats/data/entities/ability/AbilityArmorPiercing.kt new file mode 100644 index 0000000..52a9dbf --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/entities/ability/AbilityArmorPiercing.kt @@ -0,0 +1,26 @@ +package com.dowstats.data.entities.ability + +import com.dowstats.data.entities.ArmorType +import com.fasterxml.jackson.annotation.JsonIgnore +import java.math.BigDecimal +import jakarta.persistence.* + +@Entity +@Table(name = "ability_armors_piercing") +class AbilityArmorPiercing { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null + + @ManyToOne + @JsonIgnore + @JoinColumn(name = "ability_id") + var ability: Ability? = null + + @ManyToOne + @JoinColumn(name = "armor_type_id") + var armorType: ArmorType? = null + + var piercingValue: BigDecimal? = null +} diff --git a/src/main/kotlin/com/dowstats/data/entities/ability/AbilityModifiers.kt b/src/main/kotlin/com/dowstats/data/entities/ability/AbilityModifiers.kt new file mode 100644 index 0000000..3f08ef9 --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/entities/ability/AbilityModifiers.kt @@ -0,0 +1,17 @@ +package com.dowstats.data.entities.ability + +import com.dowstats.data.entities.ModifiersBase +import com.fasterxml.jackson.annotation.JsonIgnore +import jakarta.persistence.* + +@Entity +@Table(name = "ability_modifiers") +class AbilityModifiers : ModifiersBase() { + + @ManyToOne + @JoinColumn(name = "ability_id", nullable = false) + @JsonIgnore + var ability: Ability? = null + + var maxLifeTime: Double? = null +} diff --git a/src/main/kotlin/com/dowstats/data/entities/ability/AbilityRequirements.kt b/src/main/kotlin/com/dowstats/data/entities/ability/AbilityRequirements.kt new file mode 100644 index 0000000..e81514c --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/entities/ability/AbilityRequirements.kt @@ -0,0 +1,15 @@ +package com.dowstats.data.entities.ability + +import com.dowstats.data.entities.RequirementBase +import com.fasterxml.jackson.annotation.JsonIgnore +import jakarta.persistence.* + +@Entity +@Table(name = "ability_requirements") +class AbilityRequirements : RequirementBase() { + + @ManyToOne + @JoinColumn(name = "ability_id", nullable = false) + @JsonIgnore + var ability: Ability? = null +} diff --git a/src/main/kotlin/com/dowstats/data/entities/addon/AddonModifiers.kt b/src/main/kotlin/com/dowstats/data/entities/addon/AddonModifiers.kt index aedf8dd..f26c94e 100644 --- a/src/main/kotlin/com/dowstats/data/entities/addon/AddonModifiers.kt +++ b/src/main/kotlin/com/dowstats/data/entities/addon/AddonModifiers.kt @@ -14,14 +14,4 @@ class AddonModifiers : ModifiersBase() { @JoinColumn(name = "addon_id", nullable = false) @JsonIgnore var addon: BuildingAddon? = null - - fun toDto(): ModifierDto { - return ModifierDto( - id = id!!, - reference = reference, - usageType = usageType, - value = value, - target = target, - ) - } } diff --git a/src/main/kotlin/com/dowstats/data/entities/addon/BuildingAddon.kt b/src/main/kotlin/com/dowstats/data/entities/addon/BuildingAddon.kt index 9825e30..c7115b2 100644 --- a/src/main/kotlin/com/dowstats/data/entities/addon/BuildingAddon.kt +++ b/src/main/kotlin/com/dowstats/data/entities/addon/BuildingAddon.kt @@ -8,9 +8,9 @@ import com.dowstats.data.dto.controllers.WeaponUnitShortDtoObject.toShortDtoSet import com.dowstats.data.dto.controllers.building.BuildingAddonDto import com.dowstats.data.dto.controllers.building.BuildingAddonShortDto import com.dowstats.data.entities.building.Building -import com.dowstats.data.entities.DowUnit -import com.dowstats.data.entities.Sergeant -import com.dowstats.data.entities.Weapon +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.sergant.Sergeant +import com.dowstats.data.entities.weapon.Weapon import com.fasterxml.jackson.annotation.JsonIgnore import jakarta.persistence.* @@ -69,6 +69,7 @@ class BuildingAddon { var affectedWeapons: MutableSet = mutableSetOf() var uiIndexHint: Int = 0 + var uiHotkeyName: String? = null var icon: String? = null var modId: Long? = null @@ -91,7 +92,9 @@ class BuildingAddon { affectedWeapons.toShortDtoSet(), ), addonRequirement = addonRequirementDto, - icon = icon + icon = icon, + hotkey = uiHotkeyName + ) fun toShortDto(): BuildingAddonShortDto = BuildingAddonShortDto( diff --git a/src/main/kotlin/com/dowstats/data/entities/building/Building.kt b/src/main/kotlin/com/dowstats/data/entities/building/Building.kt index bf775a0..b838ef2 100644 --- a/src/main/kotlin/com/dowstats/data/entities/building/Building.kt +++ b/src/main/kotlin/com/dowstats/data/entities/building/Building.kt @@ -10,12 +10,13 @@ import com.dowstats.data.dto.controllers.building.BuildingAddonDto import com.dowstats.data.dto.controllers.building.BuildingFullDto import com.dowstats.data.dto.controllers.research.ResearchShortDto import com.dowstats.data.entities.ArmorType -import com.dowstats.data.entities.DowUnit -import com.dowstats.data.entities.DowUnitObject.toUnitDto +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.unit.DowUnitObject.toUnitDto import com.dowstats.data.entities.Race -import com.dowstats.data.entities.Sergeant -import com.dowstats.data.entities.Weapon -import com.dowstats.data.entities.Weapon.HardpointPosition +import com.dowstats.data.entities.ability.Ability +import com.dowstats.data.entities.sergant.Sergeant +import com.dowstats.data.entities.weapon.Weapon +import com.dowstats.data.entities.weapon.Weapon.HardpointPosition import com.dowstats.data.entities.addon.BuildingAddon import com.dowstats.data.entities.research.Research import jakarta.persistence.* @@ -59,6 +60,7 @@ class Building { var detectRadius: Int? = null var repairMax: Int? = null var uiIndexHint: Int = 0 + var uiHotkeyName: String? = null var advancedBuildOption: Boolean = false var icon: String? = null var modId: Long? = null @@ -130,6 +132,30 @@ class Building { inverseJoinColumns = [JoinColumn(name = "building_id")]) var affectedBuildings: MutableSet = mutableSetOf() + @ManyToMany + @JoinTable(name = "ability_affected_buildings", + joinColumns = [JoinColumn(name = "building_id")], + inverseJoinColumns = [JoinColumn(name = "ability_id")]) + var affectedAbilities: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "sergeant_affected_buildings", + joinColumns = [JoinColumn(name = "building_id")], + inverseJoinColumns = [JoinColumn(name = "sergeant_id")]) + var affectedSergeants: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "unit_affected_buildings", + joinColumns = [JoinColumn(name = "building_id")], + inverseJoinColumns = [JoinColumn(name = "unit_id")]) + var affectedUnits: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "building_abilities", + joinColumns = [JoinColumn(name = "building_id")], + inverseJoinColumns = [JoinColumn(name = "ability_id")]) + var abilities: MutableSet = mutableSetOf() + @OneToMany(mappedBy = "building", cascade = [CascadeType.ALL]) var buildingRequirements: MutableSet = mutableSetOf() @@ -163,6 +189,7 @@ class Building { icon, modId!!, buildingAddons, + abilities.map { it.toShortDto() }.toSet(), researches, modifiers.map { it.toDto() }, AffectedDataDto( @@ -175,6 +202,7 @@ class Building { weapons, requirement, affectedResearches.map { it.toResearchShortDto() }.toSet(), + uiHotkeyName, ) diff --git a/src/main/kotlin/com/dowstats/data/entities/building/BuildingModifiers.kt b/src/main/kotlin/com/dowstats/data/entities/building/BuildingModifiers.kt index 795a817..f1e8deb 100644 --- a/src/main/kotlin/com/dowstats/data/entities/building/BuildingModifiers.kt +++ b/src/main/kotlin/com/dowstats/data/entities/building/BuildingModifiers.kt @@ -15,13 +15,4 @@ class BuildingModifiers : ModifiersBase() { @JsonIgnore var building: Building? = null - fun toDto(): ModifierDto { - return ModifierDto( - id = id!!, - reference = reference, - usageType = usageType, - value = value, - target = target, - ) - } } diff --git a/src/main/kotlin/com/dowstats/data/entities/building/BuildingWeapon.kt b/src/main/kotlin/com/dowstats/data/entities/building/BuildingWeapon.kt index a997bba..976a8cb 100644 --- a/src/main/kotlin/com/dowstats/data/entities/building/BuildingWeapon.kt +++ b/src/main/kotlin/com/dowstats/data/entities/building/BuildingWeapon.kt @@ -1,7 +1,7 @@ package com.dowstats.data.entities.building import com.dowstats.data.dto.controllers.WeaponSlotDto -import com.dowstats.data.entities.Weapon +import com.dowstats.data.entities.weapon.Weapon import com.fasterxml.jackson.annotation.JsonIgnore import jakarta.persistence.* import java.io.Serializable diff --git a/src/main/kotlin/com/dowstats/data/entities/research/Research.kt b/src/main/kotlin/com/dowstats/data/entities/research/Research.kt index dccd523..543ece5 100644 --- a/src/main/kotlin/com/dowstats/data/entities/research/Research.kt +++ b/src/main/kotlin/com/dowstats/data/entities/research/Research.kt @@ -9,9 +9,9 @@ import com.dowstats.data.dto.controllers.WeaponUnitShortDtoObject.toShortDtoSet import com.dowstats.data.dto.controllers.research.ResearchDto import com.dowstats.data.dto.controllers.research.ResearchShortDto import com.dowstats.data.entities.building.Building -import com.dowstats.data.entities.DowUnit -import com.dowstats.data.entities.Sergeant -import com.dowstats.data.entities.Weapon +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.sergant.Sergeant +import com.dowstats.data.entities.weapon.Weapon import jakarta.persistence.* @@ -32,6 +32,7 @@ class Research { var costSouls: Double? = null var costTime: Int? = null var uiIndexHint: Int = 0 + var uiHotkeyName: String? = null var icon: String? = null var modId: Long? = null @@ -91,15 +92,7 @@ class Research { costFaith = costFaith, costSouls = costSouls, costTime = costTime, - modifiers = researchModifiers.map { - ModifierDto( - it.id!!, - it.reference, - it.usageType, - it.value, - it.target, - ) - }.sortedBy { it.target }, + modifiers = researchModifiers.map { it.toDto() }.sortedBy { it.target }, requirements = requirements, affectedData = AffectedDataDto( affectedUnits.map { it.compressDto() }.toSet(), @@ -108,5 +101,6 @@ class Research { affectedWeapons.toShortDtoSet(), ), modId = modId, + hotkey = uiHotkeyName ) } diff --git a/src/main/kotlin/com/dowstats/data/entities/research/ResearchModifiers.kt b/src/main/kotlin/com/dowstats/data/entities/research/ResearchModifiers.kt index deec5cf..8d861de 100644 --- a/src/main/kotlin/com/dowstats/data/entities/research/ResearchModifiers.kt +++ b/src/main/kotlin/com/dowstats/data/entities/research/ResearchModifiers.kt @@ -15,13 +15,4 @@ class ResearchModifiers : ModifiersBase() { @JsonIgnore var research: Research? = null - fun toDto(): ModifierDto { - return ModifierDto( - id = id!!, - reference = reference, - usageType = usageType, - value = value, - target = target, - ) - } } diff --git a/src/main/kotlin/com/dowstats/data/entities/Sergant.kt b/src/main/kotlin/com/dowstats/data/entities/sergant/Sergant.kt similarity index 50% rename from src/main/kotlin/com/dowstats/data/entities/Sergant.kt rename to src/main/kotlin/com/dowstats/data/entities/sergant/Sergant.kt index 2c34d07..d3a4685 100644 --- a/src/main/kotlin/com/dowstats/data/entities/Sergant.kt +++ b/src/main/kotlin/com/dowstats/data/entities/sergant/Sergant.kt @@ -1,12 +1,20 @@ -package com.dowstats.data.entities +package com.dowstats.data.entities.sergant +import com.dowstats.data.dto.controllers.AffectedDataDto +import com.dowstats.data.dto.controllers.EntityCompressDtoObject.compressDto import com.dowstats.data.dto.controllers.RequirementDto import com.dowstats.data.dto.controllers.SergeantDto +import com.dowstats.data.dto.controllers.SergeantUnitShortDtoObject.toShortDtoSet import com.dowstats.data.dto.controllers.WeaponSlotDto -import com.dowstats.data.entities.Weapon.HardpointPosition +import com.dowstats.data.dto.controllers.WeaponUnitShortDtoObject.toShortDtoSet +import com.dowstats.data.entities.ArmorType +import com.dowstats.data.entities.ability.Ability +import com.dowstats.data.entities.weapon.Weapon.HardpointPosition import com.dowstats.data.entities.addon.BuildingAddon import com.dowstats.data.entities.building.Building import com.dowstats.data.entities.research.Research +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.weapon.Weapon import com.fasterxml.jackson.annotation.JsonIgnore import jakarta.persistence.* @@ -44,25 +52,33 @@ class Sergeant { var health: Int? = null var armour: Double? = null var healthRegeneration: Double? = null + var moraleIncomeMax: Double? = null + var moraleIncomeRate: Double? = null var moraleDeathPenalty: Int? = null var mass: Int? = null var upTime: Double? = null var sightRadius: Int? = null var detectRadius: Int? = null var icon: String? = null + var uiHotkeyName: String? = null var faithIncome: Double? = null var powerIncome: Double? = null var requisitionIncome: Double? = null var modId: Long? = null - @Transient var weaponHardpoints: MutableSet = mutableSetOf() @OneToMany(mappedBy = "sergeant", cascade = [CascadeType.ALL]) var weapons: MutableSet? = null + @ManyToMany + @JoinTable(name = "sergeant_abilities", + joinColumns = [JoinColumn(name = "sergeant_id")], + inverseJoinColumns = [JoinColumn(name = "ability_id")]) + var abilities: MutableSet = mutableSetOf() + @ManyToMany @JoinTable(name = "researches_affected_sergeants", joinColumns = [JoinColumn(name = "sergeant_id")], @@ -81,6 +97,52 @@ class Sergeant { inverseJoinColumns = [JoinColumn(name = "building_id")]) var affectedBuildings: MutableSet = mutableSetOf() + @ManyToMany + @JoinTable(name = "ability_affected_sergeants", + joinColumns = [JoinColumn(name = "sergeant_id")], + inverseJoinColumns = [JoinColumn(name = "ability_id")]) + var affectedAbilities: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "sergeant_affected_sergeants", + joinColumns = [JoinColumn(name = "sergeant_id_affected")], + inverseJoinColumns = [JoinColumn(name = "sergeant_id")]) + var affectedSergeants: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "units_affected_sergeants", + joinColumns = [JoinColumn(name = "sergeant_id")], + inverseJoinColumns = [JoinColumn(name = "unit_id")]) + var affectedUnits: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "sergeant_affected_units", + joinColumns = [JoinColumn(name = "sergeant_id")], + inverseJoinColumns = [JoinColumn(name = "unit_id")]) + var affectedOnUnits: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "sergeant_affected_sergeants", + joinColumns = [JoinColumn(name = "sergeant_id")], + inverseJoinColumns = [JoinColumn(name = "sergeant_id_affected")]) + var affectedOnSergeants: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "sergeant_affected_buildings", + joinColumns = [JoinColumn(name = "sergeant_id")], + inverseJoinColumns = [JoinColumn(name = "building_id")]) + var affectedOnBuildings: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable( name = "sergeant_affected_weapons", + joinColumns = [JoinColumn(name = "sergeant_id")], + inverseJoinColumns = [JoinColumn(name = "weapon_id")]) + var affectedOnWeapons: MutableSet = mutableSetOf() + + + @OneToMany(mappedBy = "sergeant", cascade = [CascadeType.ALL]) + var sergeantModifiers: MutableSet = mutableSetOf() + @OneToMany(mappedBy = "sergeant", cascade = [CascadeType.ALL]) var sergeantRequirements: MutableSet = mutableSetOf() @@ -105,13 +167,24 @@ class Sergeant { armour, healthRegeneration, moraleDeathPenalty, + moraleIncomeMax, + moraleIncomeRate, mass, upTime, sightRadius, detectRadius, icon, weapons.toList(), + abilities.sortedWith ( compareBy { it.activation?.id }.thenBy{ it.uiIndexHint.let { 0 - it } }).map { it.toShortDto() }.toSet(), affectedResearches.map { it.toResearchShortDto() }.toSet(), - requirements + sergeantModifiers.map { it.toDto() }.sortedBy { it.target }, + AffectedDataDto( + affectedOnUnits.map { it.compressDto() }.toSet(), + affectedOnSergeants.toShortDtoSet(), + affectedOnBuildings.map { it.compressDto() }.toSet(), + affectedOnWeapons.toShortDtoSet(), + ), + requirements, + uiHotkeyName, ) } diff --git a/src/main/kotlin/com/dowstats/data/entities/SergantWeapon.kt b/src/main/kotlin/com/dowstats/data/entities/sergant/SergantWeapon.kt similarity index 91% rename from src/main/kotlin/com/dowstats/data/entities/SergantWeapon.kt rename to src/main/kotlin/com/dowstats/data/entities/sergant/SergantWeapon.kt index 47b0d55..67111b1 100644 --- a/src/main/kotlin/com/dowstats/data/entities/SergantWeapon.kt +++ b/src/main/kotlin/com/dowstats/data/entities/sergant/SergantWeapon.kt @@ -1,7 +1,7 @@ -package com.dowstats.data.entities +package com.dowstats.data.entities.sergant -import com.dowstats.data.dto.controllers.RequirementDto import com.dowstats.data.dto.controllers.WeaponSlotDto +import com.dowstats.data.entities.weapon.Weapon import com.fasterxml.jackson.annotation.JsonIgnore import java.io.Serializable import jakarta.persistence.* diff --git a/src/main/kotlin/com/dowstats/data/entities/sergant/SergeantModifiers.kt b/src/main/kotlin/com/dowstats/data/entities/sergant/SergeantModifiers.kt new file mode 100644 index 0000000..bab569b --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/entities/sergant/SergeantModifiers.kt @@ -0,0 +1,20 @@ +package com.dowstats.data.entities.sergant + +import com.dowstats.data.dto.controllers.ModifierDto +import com.dowstats.data.entities.ModifiersBase +import com.dowstats.data.entities.building.Building +import com.dowstats.data.entities.unit.DowUnit +import com.fasterxml.jackson.annotation.JsonIgnore +import jakarta.persistence.* + + +@Entity +@Table(name = "sergeant_modifiers") +class SergeantModifiers : ModifiersBase() { + + @ManyToOne + @JoinColumn(name = "sergeant_id", nullable = false) + @JsonIgnore + var sergeant: Sergeant? = null + +} diff --git a/src/main/kotlin/com/dowstats/data/entities/SergeantRequirements.kt b/src/main/kotlin/com/dowstats/data/entities/sergant/SergeantRequirements.kt similarity index 81% rename from src/main/kotlin/com/dowstats/data/entities/SergeantRequirements.kt rename to src/main/kotlin/com/dowstats/data/entities/sergant/SergeantRequirements.kt index 2809d70..55ad2af 100644 --- a/src/main/kotlin/com/dowstats/data/entities/SergeantRequirements.kt +++ b/src/main/kotlin/com/dowstats/data/entities/sergant/SergeantRequirements.kt @@ -1,5 +1,6 @@ -package com.dowstats.data.entities +package com.dowstats.data.entities.sergant +import com.dowstats.data.entities.RequirementBase import com.fasterxml.jackson.annotation.JsonIgnore import jakarta.persistence.Entity import jakarta.persistence.JoinColumn diff --git a/src/main/kotlin/com/dowstats/data/entities/DowUnit.kt b/src/main/kotlin/com/dowstats/data/entities/unit/DowUnit.kt similarity index 62% rename from src/main/kotlin/com/dowstats/data/entities/DowUnit.kt rename to src/main/kotlin/com/dowstats/data/entities/unit/DowUnit.kt index b85e8d2..05966b5 100644 --- a/src/main/kotlin/com/dowstats/data/entities/DowUnit.kt +++ b/src/main/kotlin/com/dowstats/data/entities/unit/DowUnit.kt @@ -1,9 +1,18 @@ -package com.dowstats.data.entities +package com.dowstats.data.entities.unit import com.dowstats.data.dto.controllers.* +import com.dowstats.data.dto.controllers.EntityCompressDtoObject.compressDto +import com.dowstats.data.dto.controllers.SergeantUnitShortDtoObject.toShortDtoSet +import com.dowstats.data.dto.controllers.WeaponUnitShortDtoObject.toShortDtoSet +import com.dowstats.data.entities.ArmorType +import com.dowstats.data.entities.Race +import com.dowstats.data.entities.ability.Ability +import com.dowstats.data.entities.sergant.Sergeant import com.dowstats.data.entities.addon.BuildingAddon import com.dowstats.data.entities.building.Building import com.dowstats.data.entities.research.Research +import com.dowstats.data.entities.research.ResearchModifiers +import com.dowstats.data.entities.weapon.Weapon import jakarta.persistence.* @@ -72,6 +81,7 @@ class DowUnit { var requisitionIncome: Double? = null var haveReinforceMenu: Boolean = false var uiIndexHint: Int = 0 + var uiHotkeyName: String? = null var icon: String? = null var modId: Long? = null @@ -81,6 +91,12 @@ class DowUnit { @OneToMany(mappedBy = "unit", cascade = [CascadeType.ALL]) var weapons: MutableSet? = null + @ManyToMany + @JoinTable(name = "unit_abilities", + joinColumns = [JoinColumn(name = "unit_id")], + inverseJoinColumns = [JoinColumn(name = "ability_id")]) + var abilities: MutableSet = mutableSetOf() + @ManyToMany @JoinTable(name = "researches_affected_units", joinColumns = [JoinColumn(name = "unit_id")], @@ -99,6 +115,52 @@ class DowUnit { inverseJoinColumns = [JoinColumn(name = "building_id")]) var affectedBuildings: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "unit_affected_units", + joinColumns = [JoinColumn(name = "unit_id_affected")], + inverseJoinColumns = [JoinColumn(name = "unit_id")]) + var affectedUnits: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "sergeant_affected_units", + joinColumns = [JoinColumn(name = "unit_id")], + inverseJoinColumns = [JoinColumn(name = "sergeant_id")]) + var affectedSergeants: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "ability_affected_units", + joinColumns = [JoinColumn(name = "unit_id")], + inverseJoinColumns = [JoinColumn(name = "ability_id")]) + var affectedAbilities: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "unit_affected_units", + joinColumns = [JoinColumn(name = "unit_id")], + inverseJoinColumns = [JoinColumn(name = "unit_id_affected")]) + var affectedOnUnits: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "units_affected_sergeants", + joinColumns = [JoinColumn(name = "unit_id")], + inverseJoinColumns = [JoinColumn(name = "sergeant_id")]) + var affectedOnSergeants: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "unit_affected_buildings", + joinColumns = [JoinColumn(name = "unit_id")], + inverseJoinColumns = [JoinColumn(name = "building_id")]) + var affectedOnBuildings: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable( name = "unit_affected_weapons", + joinColumns = [JoinColumn(name = "unit_id")], + inverseJoinColumns = [JoinColumn(name = "weapon_id")]) + var affectedOnWeapons: MutableSet = mutableSetOf() + + @OneToMany(mappedBy = "unit", cascade = [CascadeType.ALL]) + var unitModifiers: MutableSet = mutableSetOf() + @OneToMany(mappedBy = "unit", cascade = [CascadeType.ALL]) var unitRequirements: MutableSet = mutableSetOf() @@ -151,10 +213,19 @@ class DowUnit { modId!!, sergeantsDtos, weapons, + abilities.sortedWith ( compareBy { it.activation?.id }.thenBy{ it.uiIndexHint.let { 0 - it } }).map { it.toShortDto() }.toSet(), haveReinforceMenu, affectedResearches.map { it.toResearchShortDto() }.toSet(), affectedAddons.map { it.toShortDto() }.toSet(), + unitModifiers.map { it.toDto() }.sortedBy { it.target }, + AffectedDataDto( + affectedOnUnits.map { it.compressDto() }.toSet(), + affectedOnSergeants.toShortDtoSet(), + affectedOnBuildings.map { it.compressDto() }.toSet(), + affectedOnWeapons.toShortDtoSet(), + ), requirementDto, + uiHotkeyName, ) } diff --git a/src/main/kotlin/com/dowstats/data/entities/unit/UnitModifiers.kt b/src/main/kotlin/com/dowstats/data/entities/unit/UnitModifiers.kt new file mode 100644 index 0000000..a33a087 --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/entities/unit/UnitModifiers.kt @@ -0,0 +1,21 @@ +package com.dowstats.data.entities.unit + +import com.dowstats.data.dto.controllers.ModifierDto +import com.dowstats.data.entities.ModifiersBase +import com.dowstats.data.entities.building.Building +import com.fasterxml.jackson.annotation.JsonIgnore +import jakarta.persistence.* + + +@Entity +@Table(name = "unit_modifiers") +class UnitModifiers : ModifiersBase() { + + @ManyToOne + @JoinColumn(name = "unit_id", nullable = false) + @JsonIgnore + var unit: DowUnit? = null + + var maxLifeTime: Double? = null + +} diff --git a/src/main/kotlin/com/dowstats/data/entities/UnitRequirements.kt b/src/main/kotlin/com/dowstats/data/entities/unit/UnitRequirements.kt similarity index 81% rename from src/main/kotlin/com/dowstats/data/entities/UnitRequirements.kt rename to src/main/kotlin/com/dowstats/data/entities/unit/UnitRequirements.kt index e3a80e4..5ea6f73 100644 --- a/src/main/kotlin/com/dowstats/data/entities/UnitRequirements.kt +++ b/src/main/kotlin/com/dowstats/data/entities/unit/UnitRequirements.kt @@ -1,12 +1,12 @@ -package com.dowstats.data.entities +package com.dowstats.data.entities.unit +import com.dowstats.data.entities.RequirementBase import com.fasterxml.jackson.annotation.JsonIgnore import jakarta.persistence.Entity import jakarta.persistence.JoinColumn import jakarta.persistence.ManyToOne import jakarta.persistence.Table - @Entity @Table(name = "unit_requirements") class UnitRequirements: RequirementBase() { @@ -15,4 +15,4 @@ class UnitRequirements: RequirementBase() { @JoinColumn(name = "unit_id", nullable = false) @JsonIgnore var unit: DowUnit? = null -} +} \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/data/entities/UnitWeapon.kt b/src/main/kotlin/com/dowstats/data/entities/unit/UnitWeapon.kt similarity index 91% rename from src/main/kotlin/com/dowstats/data/entities/UnitWeapon.kt rename to src/main/kotlin/com/dowstats/data/entities/unit/UnitWeapon.kt index be410b7..a612bfa 100644 --- a/src/main/kotlin/com/dowstats/data/entities/UnitWeapon.kt +++ b/src/main/kotlin/com/dowstats/data/entities/unit/UnitWeapon.kt @@ -1,7 +1,7 @@ -package com.dowstats.data.entities +package com.dowstats.data.entities.unit -import com.dowstats.data.dto.controllers.RequirementDto import com.dowstats.data.dto.controllers.WeaponSlotDto +import com.dowstats.data.entities.weapon.Weapon import com.fasterxml.jackson.annotation.JsonIgnore import java.io.Serializable import jakarta.persistence.* diff --git a/src/main/kotlin/com/dowstats/data/entities/Weapon.kt b/src/main/kotlin/com/dowstats/data/entities/weapon/Weapon.kt similarity index 74% rename from src/main/kotlin/com/dowstats/data/entities/Weapon.kt rename to src/main/kotlin/com/dowstats/data/entities/weapon/Weapon.kt index 25ed290..f1e1c4c 100644 --- a/src/main/kotlin/com/dowstats/data/entities/Weapon.kt +++ b/src/main/kotlin/com/dowstats/data/entities/weapon/Weapon.kt @@ -1,12 +1,17 @@ -package com.dowstats.data.entities +package com.dowstats.data.entities.weapon import com.dowstats.data.dto.controllers.RequirementDto import com.dowstats.data.dto.controllers.WeaponDto import com.dowstats.data.dto.controllers.WeaponShortDto +import com.dowstats.data.entities.ability.Ability +import com.dowstats.data.entities.sergant.SergeantWeapon import com.dowstats.data.entities.addon.BuildingAddon import com.dowstats.data.entities.building.Building import com.dowstats.data.entities.building.BuildingWeapon import com.dowstats.data.entities.research.Research +import com.dowstats.data.entities.sergant.Sergeant +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.unit.UnitWeapon import jakarta.persistence.* @@ -39,6 +44,7 @@ class Weapon { var isMeleeWeapon: Boolean = true var canAttackAir: Boolean = true var canAttackGround: Boolean = true + var uiHotkeyName: String? = null var icon: String? = null var showInReinforce: Boolean = true var modId: Long? = null @@ -61,6 +67,24 @@ class Weapon { inverseJoinColumns = [JoinColumn(name = "building_id")]) var affectedBuildings: MutableSet = mutableSetOf() + @ManyToMany + @JoinTable(name = "ability_affected_weapons", + joinColumns = [JoinColumn(name = "weapon_id")], + inverseJoinColumns = [JoinColumn(name = "ability_id")]) + var affectedAbilities: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "sergeant_affected_weapons", + joinColumns = [JoinColumn(name = "weapon_id")], + inverseJoinColumns = [JoinColumn(name = "sergeant_id")]) + var affectedSergeants: MutableSet = mutableSetOf() + + @ManyToMany + @JoinTable(name = "unit_affected_weapons", + joinColumns = [JoinColumn(name = "weapon_id")], + inverseJoinColumns = [JoinColumn(name = "unit_id")]) + var affectedUnits: MutableSet = mutableSetOf() + @OneToMany(mappedBy = "weapon", cascade = [CascadeType.ALL]) var unitsUse: MutableSet? = null @@ -73,6 +97,9 @@ class Weapon { // for many-to-many persistance data class HardpointPosition(val weaponId: Long, val hardpoint: Int, val order: Int) + @OneToMany(mappedBy = "weapon", cascade = [CascadeType.ALL]) + var weaponModifiers: MutableSet = mutableSetOf() + @OneToMany(mappedBy = "weapon", cascade = [CascadeType.ALL]) var weaponRequirements: MutableSet = mutableSetOf() @@ -110,7 +137,9 @@ class Weapon { weaponPiercings.map { it.toDto() }, affectedResearches.map { it.toResearchShortDto() }.toSet(), affectedAddons.map { it.toShortDto() }.toSet(), + weaponModifiers.map { mod -> mod.toDto().copy(maxLifeTime = mod.maxLifeTime) }, requirementDto, + uiHotkeyName, ) fun toShortDto() = WeaponShortDto( diff --git a/src/main/kotlin/com/dowstats/data/entities/WeaponDamage.kt b/src/main/kotlin/com/dowstats/data/entities/weapon/WeaponArmorPiercing.kt similarity index 89% rename from src/main/kotlin/com/dowstats/data/entities/WeaponDamage.kt rename to src/main/kotlin/com/dowstats/data/entities/weapon/WeaponArmorPiercing.kt index 651bf67..d419113 100644 --- a/src/main/kotlin/com/dowstats/data/entities/WeaponDamage.kt +++ b/src/main/kotlin/com/dowstats/data/entities/weapon/WeaponArmorPiercing.kt @@ -1,6 +1,7 @@ -package com.dowstats.data.entities +package com.dowstats.data.entities.weapon import com.dowstats.data.dto.controllers.WeaponArmorPiercingDto +import com.dowstats.data.entities.ArmorType import com.fasterxml.jackson.annotation.JsonIgnore import java.math.BigDecimal import jakarta.persistence.* diff --git a/src/main/kotlin/com/dowstats/data/entities/weapon/WeaponModifiers.kt b/src/main/kotlin/com/dowstats/data/entities/weapon/WeaponModifiers.kt new file mode 100644 index 0000000..23b9cb1 --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/entities/weapon/WeaponModifiers.kt @@ -0,0 +1,22 @@ +package com.dowstats.data.entities.weapon + +import com.dowstats.data.dto.controllers.ModifierDto +import com.dowstats.data.entities.ModifiersBase +import com.dowstats.data.entities.building.Building +import com.dowstats.data.entities.unit.DowUnit +import com.fasterxml.jackson.annotation.JsonIgnore +import jakarta.persistence.* + + +@Entity +@Table(name = "weapon_modifiers") +class WeaponModifiers : ModifiersBase() { + + @ManyToOne + @JoinColumn(name = "weapon_id", nullable = false) + @JsonIgnore + var weapon: Weapon? = null + + var maxLifeTime: Double? = null + +} diff --git a/src/main/kotlin/com/dowstats/data/entities/WeaponRequirements.kt b/src/main/kotlin/com/dowstats/data/entities/weapon/WeaponRequirements.kt similarity index 81% rename from src/main/kotlin/com/dowstats/data/entities/WeaponRequirements.kt rename to src/main/kotlin/com/dowstats/data/entities/weapon/WeaponRequirements.kt index 3404ee6..33786ef 100644 --- a/src/main/kotlin/com/dowstats/data/entities/WeaponRequirements.kt +++ b/src/main/kotlin/com/dowstats/data/entities/weapon/WeaponRequirements.kt @@ -1,5 +1,6 @@ -package com.dowstats.data.entities +package com.dowstats.data.entities.weapon +import com.dowstats.data.entities.RequirementBase import com.fasterxml.jackson.annotation.JsonIgnore import jakarta.persistence.Entity import jakarta.persistence.JoinColumn diff --git a/src/main/kotlin/com/dowstats/data/repositories/AbilityRepository.kt b/src/main/kotlin/com/dowstats/data/repositories/AbilityRepository.kt new file mode 100644 index 0000000..8f5ce4e --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/repositories/AbilityRepository.kt @@ -0,0 +1,14 @@ +package com.dowstats.data.repositories + +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.Race +import com.dowstats.data.entities.ability.Ability +import org.springframework.data.jpa.repository.Query +import org.springframework.data.repository.* + +interface AbilityRepository : CrudRepository { + + fun findAllByModId(modId: Long): List + + fun deleteAllByModId(modId: Long) +} \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/data/repositories/ActivationRepository.kt b/src/main/kotlin/com/dowstats/data/repositories/ActivationRepository.kt new file mode 100644 index 0000000..d18d1ab --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/repositories/ActivationRepository.kt @@ -0,0 +1,10 @@ +package com.dowstats.data.repositories + +import com.dowstats.data.entities.Activation +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.Race +import com.dowstats.data.entities.ability.Ability +import org.springframework.data.jpa.repository.Query +import org.springframework.data.repository.* + +interface ActivationRepository : CrudRepository \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/data/repositories/AreaEffectRepository.kt b/src/main/kotlin/com/dowstats/data/repositories/AreaEffectRepository.kt new file mode 100644 index 0000000..931682e --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/repositories/AreaEffectRepository.kt @@ -0,0 +1,6 @@ +package com.dowstats.data.repositories + +import com.dowstats.data.entities.AreaEffect +import org.springframework.data.repository.CrudRepository + +interface AreaEffectRepository : CrudRepository \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/data/repositories/AreaFilterRepository.kt b/src/main/kotlin/com/dowstats/data/repositories/AreaFilterRepository.kt new file mode 100644 index 0000000..0f6f194 --- /dev/null +++ b/src/main/kotlin/com/dowstats/data/repositories/AreaFilterRepository.kt @@ -0,0 +1,6 @@ +package com.dowstats.data.repositories + +import com.dowstats.data.entities.AreaFilter +import org.springframework.data.repository.CrudRepository + +interface AreaFilterRepository : CrudRepository \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/data/repositories/ResearchRepository.kt b/src/main/kotlin/com/dowstats/data/repositories/ResearchRepository.kt index b1f851b..dd4ba9b 100644 --- a/src/main/kotlin/com/dowstats/data/repositories/ResearchRepository.kt +++ b/src/main/kotlin/com/dowstats/data/repositories/ResearchRepository.kt @@ -1,8 +1,5 @@ package com.dowstats.data.repositories -import com.dowstats.data.entities.DowUnit -import com.dowstats.data.entities.Weapon -import com.dowstats.data.entities.addon.BuildingAddon import com.dowstats.data.entities.research.Research import org.springframework.data.repository.* diff --git a/src/main/kotlin/com/dowstats/data/repositories/SergeantRepository.kt b/src/main/kotlin/com/dowstats/data/repositories/SergeantRepository.kt index 663b02c..b709426 100644 --- a/src/main/kotlin/com/dowstats/data/repositories/SergeantRepository.kt +++ b/src/main/kotlin/com/dowstats/data/repositories/SergeantRepository.kt @@ -1,7 +1,6 @@ package com.dowstats.data.repositories -import com.dowstats.data.entities.Sergeant -import com.dowstats.data.entities.Weapon +import com.dowstats.data.entities.sergant.Sergeant import org.springframework.data.repository.CrudRepository interface SergeantRepository : CrudRepository{ diff --git a/src/main/kotlin/com/dowstats/data/repositories/UnitRepository.kt b/src/main/kotlin/com/dowstats/data/repositories/UnitRepository.kt index e66a350..506fab2 100644 --- a/src/main/kotlin/com/dowstats/data/repositories/UnitRepository.kt +++ b/src/main/kotlin/com/dowstats/data/repositories/UnitRepository.kt @@ -1,6 +1,6 @@ package com.dowstats.data.repositories -import com.dowstats.data.entities.DowUnit +import com.dowstats.data.entities.unit.DowUnit import com.dowstats.data.entities.Race import org.springframework.data.jpa.repository.Query import org.springframework.data.repository.* diff --git a/src/main/kotlin/com/dowstats/data/repositories/WeaponRepository.kt b/src/main/kotlin/com/dowstats/data/repositories/WeaponRepository.kt index f205c0f..b1e6a21 100644 --- a/src/main/kotlin/com/dowstats/data/repositories/WeaponRepository.kt +++ b/src/main/kotlin/com/dowstats/data/repositories/WeaponRepository.kt @@ -1,8 +1,6 @@ package com.dowstats.data.repositories -import com.dowstats.data.entities.DowUnit -import com.dowstats.data.entities.Weapon -import com.dowstats.data.entities.research.Research +import com.dowstats.data.entities.weapon.Weapon import org.springframework.data.repository.* interface WeaponRepository : CrudRepository{ diff --git a/src/main/kotlin/com/dowstats/service/datamaps/AbilityService.kt b/src/main/kotlin/com/dowstats/service/datamaps/AbilityService.kt new file mode 100644 index 0000000..d11e8cd --- /dev/null +++ b/src/main/kotlin/com/dowstats/service/datamaps/AbilityService.kt @@ -0,0 +1,36 @@ +package com.dowstats.service.datamaps + +import com.dowstats.data.dto.controllers.RequirementDto +import com.dowstats.data.dto.controllers.ability.AbilityDto +import com.dowstats.data.dto.controllers.research.ResearchDto +import com.dowstats.data.entities.ability.Ability +import com.dowstats.data.repositories.AbilityRepository +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service + +@Service +class AbilityService @Autowired constructor( + val abilityRepository: AbilityRepository, + val requirementsMappingComponent: RequirementsMappingComponent, +) { + + fun getAbilityDto(id: Long, modId: Long): AbilityDto { + val ability = abilityRepository.findById(id).get() + val requirements = requirementsMappingComponent + .getRequirements(ability.abilityRequirements.toList() , + modId) + + if(ability.childAbilityName == null) return ability.toDto(requirements, null) else { + val allAbilities = abilityRepository.findAllByModId(modId) + return toDtoWithChild(requirements, allAbilities, ability) + } + } + + fun toDtoWithChild(requirements: RequirementDto?, allAbilities: List, ability: Ability): AbilityDto = + if(ability.childAbilityName == null || ability.childAbilityName == "") ability.toDto(requirements, null) else { + ability.toDto(requirements, + toDtoWithChild(requirements, allAbilities, + allAbilities.first { it.filename?.replace(".rgd", "") == ability.childAbilityName }) + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/dowstats/service/datamaps/CommonMapping.kt b/src/main/kotlin/com/dowstats/service/datamaps/CommonMapping.kt index 06f7a58..19a07c2 100644 --- a/src/main/kotlin/com/dowstats/service/datamaps/CommonMapping.kt +++ b/src/main/kotlin/com/dowstats/service/datamaps/CommonMapping.kt @@ -2,7 +2,7 @@ package com.dowstats.service.datamaps import com.dowstats.data.dto.controllers.building.BuildingShortDto import com.dowstats.data.entities.building.Building -import com.dowstats.data.entities.DowUnitObject.toUnitDto +import com.dowstats.data.entities.unit.DowUnitObject.toUnitDto object CommonMapping { fun List.toBuildingShortDto(withoutUnits: Boolean = false): List = diff --git a/src/main/kotlin/com/dowstats/service/datamaps/DowUnitMappingService.kt b/src/main/kotlin/com/dowstats/service/datamaps/DowUnitMappingService.kt index 5bfe69a..d3c63da 100644 --- a/src/main/kotlin/com/dowstats/service/datamaps/DowUnitMappingService.kt +++ b/src/main/kotlin/com/dowstats/service/datamaps/DowUnitMappingService.kt @@ -3,10 +3,10 @@ package com.dowstats.service.datamaps import com.dowstats.data.dto.controllers.RaceUnits import com.dowstats.data.dto.controllers.SergeantDto import com.dowstats.data.dto.controllers.UnitFullDto -import com.dowstats.data.entities.DowUnit -import com.dowstats.data.entities.DowUnitObject.toUnitDto +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.unit.DowUnitObject.toUnitDto import com.dowstats.data.entities.Race -import com.dowstats.data.entities.Sergeant +import com.dowstats.data.entities.sergant.Sergeant import com.dowstats.data.repositories.RaceRepository import com.dowstats.data.repositories.UnitRepository import org.springframework.beans.factory.annotation.Autowired diff --git a/src/main/kotlin/com/dowstats/service/datamaps/WeaponService.kt b/src/main/kotlin/com/dowstats/service/datamaps/WeaponService.kt index fdeaf92..284be33 100644 --- a/src/main/kotlin/com/dowstats/service/datamaps/WeaponService.kt +++ b/src/main/kotlin/com/dowstats/service/datamaps/WeaponService.kt @@ -1,15 +1,6 @@ package com.dowstats.service.datamaps -import com.dowstats.data.dto.controllers.RaceUnits -import com.dowstats.data.dto.controllers.SergeantDto -import com.dowstats.data.dto.controllers.UnitFullDto import com.dowstats.data.dto.controllers.WeaponDto -import com.dowstats.data.entities.DowUnit -import com.dowstats.data.entities.DowUnitObject.toUnitDto -import com.dowstats.data.entities.Race -import com.dowstats.data.entities.Sergeant -import com.dowstats.data.repositories.RaceRepository -import com.dowstats.data.repositories.UnitRepository import com.dowstats.data.repositories.WeaponRepository import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service diff --git a/src/main/kotlin/com/dowstats/service/postparsing/PostParsingService.kt b/src/main/kotlin/com/dowstats/service/postparsing/PostParsingService.kt index 215834a..9139f25 100644 --- a/src/main/kotlin/com/dowstats/service/postparsing/PostParsingService.kt +++ b/src/main/kotlin/com/dowstats/service/postparsing/PostParsingService.kt @@ -1,9 +1,13 @@ package com.dowstats.service.postparsing import com.dowstats.data.entities.* +import com.dowstats.data.entities.ability.Ability import com.dowstats.data.entities.addon.BuildingAddon import com.dowstats.data.entities.building.Building import com.dowstats.data.entities.research.Research +import com.dowstats.data.entities.sergant.Sergeant +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.weapon.Weapon import com.dowstats.data.repositories.* import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Autowired @@ -15,6 +19,7 @@ class PostParsingService @Autowired constructor( val researchRepository: ResearchRepository, val addonRepository: AddonRepository, val unitRepository: UnitRepository, + val abilityRepository: AbilityRepository, val sergeantRepository: SergeantRepository, val buildingRepository: BuildingRepository, val weaponRepository: WeaponRepository, @@ -27,6 +32,7 @@ class PostParsingService @Autowired constructor( val modId = mod.id!! val researches = researchRepository.findAllByModId(modId) val addons = addonRepository.findAllByModId(modId) + val abilities = abilityRepository.findAllByModId(modId) val units = unitRepository.findByModIdAndRace(modId, null) val sergeants = sergeantRepository.findAllByModId(modId) val buildings = buildingRepository.findByModIdAndRace(modId, null) @@ -47,6 +53,21 @@ class PostParsingService @Autowired constructor( bindBuildingToAffectedBuildings(buildings) bindBuildingWeapons(weapons, buildings) + bindAbilityUnits(units, abilities) + bindAbilitySergeants(sergeants, abilities) + bindAbilityBuildings(buildings, abilities) + bindAbilityWeapons(weapons, abilities) + + bindSergeantUnits(units, sergeants) + bindSergeantSergeants(sergeants) + bindSergeantBuildings(buildings, sergeants) + bindSergeantWeapons(weapons, sergeants) + + bindUnitUnits(units) + bindUnitSergeants(sergeants, units) + bindUnitBuildings(buildings, units) + bindUnitWeapons(weapons, units) + } catch (e: Exception) { log.warn("Error occurred during bind researches", e) } @@ -232,4 +253,181 @@ class PostParsingService @Autowired constructor( weaponRepository.saveAll(weaponsWithBindings) log.info("Successfully bind buildings to weapons") } + + // ------------------------------------------------------------ + + private fun bindAbilityUnits(units: List, abilities: List) { + val unitsWithBindings: List = abilities.flatMap { ability -> + ability.abilityModifiers.mapNotNull { modifier -> + units.find { + it.filenameSquad?.replace(".rgd", "") == modifier.target || + it.filenameUnit?.replace(".rgd", "") == modifier.target + } + ?.let { + it.affectedAbilities.add(ability) + it + } + } + } + unitRepository.saveAll(unitsWithBindings) + log.info("Successfully bind abilities to units") + } + + private fun bindAbilitySergeants(sergeants: List, abilities: List) { + val sergeantsWithBindings: List = abilities.flatMap { ability -> + ability.abilityModifiers.mapNotNull { modifier -> + sergeants.find { it.filename.replace(".rgd", "") == modifier.target }?.let { + it.affectedAbilities.add(ability) + it + } + } + } + sergeantRepository.saveAll(sergeantsWithBindings) + log.info("Successfully bind abilities to sergeants") + } + + private fun bindAbilityBuildings(buildings: List, abilities: List) { + val buildingsWithBindings: List = abilities.flatMap { ability -> + ability.abilityModifiers.mapNotNull { modifier -> + buildings.find { it.filename?.replace(".rgd", "") == modifier.target }?.let { + it.affectedAbilities.add(ability) + it + } + } + } + buildingRepository.saveAll(buildingsWithBindings) + log.info("Successfully bind abilities to buildings") + } + + private fun bindAbilityWeapons(weapons: List, abilities: List) { + val weaponsWithBindings: List = abilities.flatMap { ability -> + ability.abilityModifiers.mapNotNull { modifier -> + weapons.find { it.filename?.replace(".rgd", "") == modifier.target }?.let { + it.affectedAbilities.add(ability) + it + } + } + } + weaponRepository.saveAll(weaponsWithBindings) + log.info("Successfully bind abilities to weapons") + } + + // ------------------------------------------------------------ + + private fun bindSergeantUnits(units: List, sergeants: List) { + val unitsWithBindings: List = sergeants.flatMap { sergeant -> + sergeant.sergeantModifiers.mapNotNull { modifier -> + units.find { + it.filenameSquad?.replace(".rgd", "") == modifier.target || + it.filenameUnit?.replace(".rgd", "") == modifier.target + } + ?.let { + it.affectedSergeants.add(sergeant) + it + } + } + } + unitRepository.saveAll(unitsWithBindings) + log.info("Successfully bind sergeants to units") + } + + private fun bindSergeantSergeants(sergeants: List) { + val sergeantsWithBindings: List = sergeants.flatMap { sergeant -> + sergeant.sergeantModifiers.mapNotNull { modifier -> + sergeants.find { it.filename.replace(".rgd", "") == modifier.target }?.let { + it.affectedSergeants.add(sergeant) + it + } + } + } + sergeantRepository.saveAll(sergeantsWithBindings) + log.info("Successfully bind sergeants to sergeants") + } + + private fun bindSergeantBuildings(buildings: List, sergeants: List) { + val buildingsWithBindings: List = sergeants.flatMap { sergeant -> + sergeant.sergeantModifiers.mapNotNull { modifier -> + buildings.find { it.filename?.replace(".rgd", "") == modifier.target }?.let { + it.affectedSergeants.add(sergeant) + it + } + } + } + buildingRepository.saveAll(buildingsWithBindings) + log.info("Successfully bind sergeants to buildings") + } + + private fun bindSergeantWeapons(weapons: List, sergeants: List) { + val weaponsWithBindings: List = sergeants.flatMap { sergeant -> + sergeant.sergeantModifiers.mapNotNull { modifier -> + weapons.find { it.filename?.replace(".rgd", "") == modifier.target }?.let { + it.affectedSergeants.add(sergeant) + it + } + } + } + weaponRepository.saveAll(weaponsWithBindings) + log.info("Successfully bind sergeants to weapons") + } + + + + // ------------------------------------------------------------ + + private fun bindUnitUnits(units: List) { + val unitsWithBindings: List = units.flatMap { unit -> + unit.unitModifiers.mapNotNull { modifier -> + units.find { + it.filenameSquad?.replace(".rgd", "") == modifier.target || + it.filenameUnit?.replace(".rgd", "") == modifier.target + } + ?.let { + it.affectedUnits.add(unit) + it + } + } + } + unitRepository.saveAll(unitsWithBindings) + log.info("Successfully bind units to units") + } + + private fun bindUnitSergeants(sergeants: List, units: List) { + val sergeantsWithBindings: List = units.flatMap { unit -> + unit.unitModifiers.mapNotNull { modifier -> + sergeants.find { it.filename.replace(".rgd", "") == modifier.target }?.let { + it.affectedUnits.add(unit) + it + } + } + } + sergeantRepository.saveAll(sergeantsWithBindings) + log.info("Successfully bind units to sergeants") + } + + private fun bindUnitBuildings(buildings: List, units: List) { + val buildingsWithBindings: List = units.flatMap { unit -> + unit.unitModifiers.mapNotNull { modifier -> + buildings.find { it.filename?.replace(".rgd", "") == modifier.target }?.let { + it.affectedUnits.add(unit) + it + } + } + } + buildingRepository.saveAll(buildingsWithBindings) + log.info("Successfully bind units to buildings") + } + + private fun bindUnitWeapons(weapons: List, units: List) { + val weaponsWithBindings: List = units.flatMap { unit -> + unit.unitModifiers.mapNotNull { modifier -> + weapons.find { it.filename?.replace(".rgd", "") == modifier.target }?.let { + it.affectedUnits.add(unit) + it + } + } + } + weaponRepository.saveAll(weaponsWithBindings) + log.info("Successfully bind units to weapons") + } + } diff --git a/src/main/kotlin/com/dowstats/service/w40k/AbilityRgdExtractService.kt b/src/main/kotlin/com/dowstats/service/w40k/AbilityRgdExtractService.kt new file mode 100644 index 0000000..e65f89e --- /dev/null +++ b/src/main/kotlin/com/dowstats/service/w40k/AbilityRgdExtractService.kt @@ -0,0 +1,166 @@ +package com.dowstats.service.w40k + +import com.dowstats.Metadata +import com.dowstats.data.dto.BuildCost +import com.dowstats.data.entities.Activation +import com.dowstats.data.entities.AreaEffect +import com.dowstats.data.entities.AreaFilter +import com.dowstats.data.entities.ArmorType +import com.dowstats.data.entities.Mod +import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.fillDataFromRgdTable +import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.filterUseless +import com.dowstats.data.entities.ability.Ability +import com.dowstats.data.entities.ability.AbilityArmorPiercing +import com.dowstats.data.entities.ability.AbilityModifiers +import com.dowstats.data.entities.ability.AbilityRequirements +import com.dowstats.data.rgd.RgdData +import com.dowstats.data.rgd.RgdDataUtil.getBooleanByName +import com.dowstats.data.rgd.RgdDataUtil.getDoubleByName +import com.dowstats.data.rgd.RgdDataUtil.getIntByName +import com.dowstats.data.rgd.RgdDataUtil.getRgdTableByName +import com.dowstats.data.rgd.RgdDataUtil.getStringByName +import org.slf4j.LoggerFactory +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Service +import java.math.BigDecimal + +@Service +class AbilityRgdExtractService @Autowired constructor( + private val commonParseRgdService: CommonParseRgdService, +) { + + val log = LoggerFactory.getLogger(AbilityRgdExtractService::class.java) + + fun extractToAbilityEntity( + fileName: String, + abilityData: List, + mod: Mod, + activations: Set, + areaEffects: Set, + areaFilters: Set, + armorTypes: Set, + modFolderData: String, + modDictionary: Map + ): Ability? { + + val ability = Ability() + ability.filename = fileName + ability.modId = mod.id + + val activationValue = abilityData.getRgdTableByName("activation")?.getStringByName("\$REF")?.replace("type_abilityactivation\\tp_","")?.replace(".lua","") + ability.activation = activations.firstOrNull { it.id == activationValue } + + // UI Info & Basic Data + val uiInfo = abilityData.getRgdTableByName("ui_info") + val uiData = uiInfo?.let{ commonParseRgdService.getUiInfo(uiInfo, modDictionary, modFolderData, mod, log, ability.activation?.id == "ability_activation_toggled")} + + ability.name = uiData?.name + ability.description = uiData?.description + ability.icon = uiData?.iconPath + ability.uiIndexHint = abilityData.getIntByName("ui_index_hint") ?: 0 + ability.uiHotkeyName = abilityData.getStringByName("ui_hotkey_name") + + // Costs + val fireCost = abilityData.getRgdTableByName("fire_cost") + ability.costRequisition = fireCost?.getDoubleByName("requisition") + ability.costPower = fireCost?.getDoubleByName("power") + ability.costFaith = fireCost?.getDoubleByName("faith") + ability.costSouls = fireCost?.getDoubleByName("souls") + + // Ability Specific Params + ability.childAbilityName = abilityData.getStringByName("child_ability_name") + ability.initialDelayTime = abilityData.getDoubleByName("initial_delay_time") + + ability.range = abilityData.getDoubleByName("range") + ability.rechargeTime = abilityData.getDoubleByName("recharge_time") + ability.rechargeTimerGlobal = abilityData.getBooleanByName("recharge_timer_global") + ability.refreshTime = abilityData.getDoubleByName("refresh_time") + ability.durationTime = abilityData.getDoubleByName("duration_time") + + ability.spawnedEntityName = abilityData.getStringByName("spawn_entity_name") + + + // Damage & Area Effect + val areaEffectTable = abilityData.getRgdTableByName("area_effect") + if (areaEffectTable != null) { + val areaEffectData = commonParseRgdService.getAreaEffectData(areaEffectTable) + + val targetFilter = areaEffectTable + .getRgdTableByName("area_effect_information") + ?.getRgdTableByName("target_filter") + ?.mapNotNull { m -> + if (m.name.contains("entry_")) { + val target = m.value as List + val armorType = target.getStringByName("\$REF")?.replace("type_armour\\tp_","")?.replace(".lua","") + armorTypes.firstOrNull { it.id == armorType } + } else null + } ?: emptyList() + + ability.abilityTargetFilters = targetFilter.toMutableSet() + + ability.radius = areaEffectData.damageRadius + ability.minDamage = areaEffectData.minDamage + ability.minDamageValue = areaEffectData.minDamageValue + ability.maxDamage = areaEffectData.maxDamage + ability.moraleDamage = areaEffectData.moraleDamage + ability.throwForceMin = areaEffectData.throwForceMin + ability.throwForceMax = areaEffectData.throwForceMax + + ability.areaEffect = areaEffects.firstOrNull { it.id == areaEffectData.areaType } + ability.areaFilter = areaFilters.firstOrNull { it.id == areaEffectData.filterType } + + // Armor Piercings + ability.abilityPiercings = armorTypes.map { armorType -> + AbilityArmorPiercing().also { + it.ability = ability + it.armorType = armorType + val piercingValue = (areaEffectData.weaponDmgMap[armorType.id] ?: areaEffectData.defaultArmorPiercing)?.toBigDecimal() + it.piercingValue = piercingValue?.let { pv -> if (pv <= BigDecimal(100)) pv else BigDecimal(100) } + } + }.toMutableSet() + } + + // Modifiers & Requirements + ability.abilityModifiers = getAbilityModifiers(ability, abilityData).toMutableSet() + ability.abilityRequirements = getAbilityRequirements(ability, abilityData).toMutableSet() + + return ability + } + + private fun getAbilityModifiers(ability: Ability, abilityData: List): List { + return abilityData + .getRgdTableByName("area_effect") + ?.getRgdTableByName("weapon_damage") + ?.getRgdTableByName("modifiers")?.mapNotNull { m -> + if (m.name.contains("modifier_")) { + val mTable = m.value as List + if (mTable.getStringByName("\$REF") == "modifiers\\no_modifier.lua") null else { + val mTable = m.value as List + val modifier = mTable.getRgdTableByName("modifier") + val maxLifetime = mTable.getDoubleByName("max_lifetime") + if (modifier?.getStringByName("\$REF") == "modifiers\\no_modifier.lua" || modifier == null) null else { + AbilityModifiers().also { + it.ability = ability + it.maxLifeTime = maxLifetime + }.fillDataFromRgdTable(modifier) + } + } + } else null + }?.filterUseless() ?: emptyList() + } + + private fun getAbilityRequirements(ability: Ability, abilityData: List): List { + return abilityData.getRgdTableByName("requirements")?.mapNotNull { r -> + if (r.name.contains("required_")) { + val rTable = r.value as List + if (rTable.getStringByName("\$REF") == Metadata.Requirements.REFERENCE_REQUIREMENT_NONE) null else { + AbilityRequirements().also { + it.ability = ability + it.reference = rTable.getStringByName("\$REF") + it.value = commonParseRgdService.getRequirementReference(it.reference, rTable, ability.filename!!, log) + } + } + } else null + } ?: emptyList() + } +} diff --git a/src/main/kotlin/com/dowstats/service/w40k/BuildingAddonRgdExtractService.kt b/src/main/kotlin/com/dowstats/service/w40k/BuildingAddonRgdExtractService.kt index c654e26..e21843d 100644 --- a/src/main/kotlin/com/dowstats/service/w40k/BuildingAddonRgdExtractService.kt +++ b/src/main/kotlin/com/dowstats/service/w40k/BuildingAddonRgdExtractService.kt @@ -2,6 +2,7 @@ package com.dowstats.service.w40k import com.dowstats.Metadata import com.dowstats.data.entities.* +import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.fillDataFromRgdTable import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.filterUseless import com.dowstats.data.entities.addon.AddonModifiers import com.dowstats.data.entities.addon.AddonRequirements @@ -40,6 +41,7 @@ class BuildingAddonRgdExtractService @Autowired constructor( addon.name = uiInfo.name addon.description = uiInfo.description addon.uiIndexHint = addonRgdData.getIntByName("ui_index_hint") ?: 0 + addon.uiHotkeyName = addonRgdData.getStringByName("ui_hotkey_name") addon.icon = uiInfo.iconPath addon.filename = fileName @@ -66,11 +68,7 @@ class BuildingAddonRgdExtractService @Autowired constructor( if (mTable.getStringByName("\$REF") == "modifiers\\no_modifier.lua") null else { AddonModifiers().also { it.addon = addon - it.reference = mTable.getStringByName("\$REF") - it.target = mTable.getStringByName("target_type_name") - it.usageType = mTable.getRgdTableByName("usage_type")?.getStringByName("\$REF") - it.value = mTable.getDoubleByName("value") - } + }.fillDataFromRgdTable(mTable) } } else null }?.filterUseless() ?: emptyList() diff --git a/src/main/kotlin/com/dowstats/service/w40k/BuildingRgdExtractService.kt b/src/main/kotlin/com/dowstats/service/w40k/BuildingRgdExtractService.kt index 4ca2328..7e256c0 100644 --- a/src/main/kotlin/com/dowstats/service/w40k/BuildingRgdExtractService.kt +++ b/src/main/kotlin/com/dowstats/service/w40k/BuildingRgdExtractService.kt @@ -3,11 +3,15 @@ package com.dowstats.service.w40k import com.dowstats.Metadata import com.dowstats.data.dto.BuildingDataToSave import com.dowstats.data.entities.* +import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.fillDataFromRgdTable import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.filterUseless +import com.dowstats.data.entities.ability.Ability import com.dowstats.data.entities.building.Building import com.dowstats.data.entities.building.BuildingModifiers import com.dowstats.data.entities.building.BuildingRequirements import com.dowstats.data.entities.research.Research +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.weapon.Weapon import com.dowstats.data.rgd.RgdData import com.dowstats.data.rgd.RgdDataUtil.getBooleanByName import com.dowstats.data.rgd.RgdDataUtil.getDoubleByName @@ -44,6 +48,7 @@ class BuildingRgdExtractService @Autowired constructor( modDictionary: Map, buildingData: List, weapons: Set, + abilities: Set, researches: Set, units: List, race: Race, @@ -61,13 +66,14 @@ class BuildingRgdExtractService @Autowired constructor( building.armorType2 = getBuildingArmourType(buildingData, armorTypes, "type_armour_2") building.filename = fileName - val buildingUiInfo = buildingData.getRgdTableByName("ui_ext") - ?.getRgdTableByName("ui_info") ?: throw Exception("Could not find ui_info at $fileName") + val uiExt = buildingData.getRgdTableByName("ui_ext") ?: throw Exception("Could not find ui_ext at $fileName") + val buildingUiInfo = uiExt.getRgdTableByName("ui_info") ?: throw Exception("Could not find ui_info at $fileName") val buildingUiData = commonParseRgdService.getUiInfo(buildingUiInfo, modDictionary, modFolderData, mod, log) building.name = buildingUiData.name building.description = buildingUiData.description building.icon = buildingUiData.iconPath - building.uiIndexHint = buildingData.getRgdTableByName("ui_ext")?.getIntByName("ui_index_hint") ?: 0 + building.uiIndexHint = uiExt.getIntByName("ui_index_hint") ?: 0 + building.uiHotkeyName = uiExt.getStringByName("ui_hotkey_name") building.advancedBuildOption = buildingData.getRgdTableByName("structure_buildable_ext")?.getBooleanByName("advanced_build_option") ?: false val buildCost = commonParseRgdService.getBuildCost(buildingData.getRgdTableByName("cost_ext")?.getRgdTableByName("time_cost")) @@ -101,6 +107,8 @@ class BuildingRgdExtractService @Autowired constructor( building.buildingRequirements = getBuildingRequirements(building, buildingData).toMutableSet() + building.abilities = commonParseRgdService.getAbilities(buildingData, abilities).toMutableSet() + val addons = getAddons(buildingData) building.addons = addons?.mapNotNull {addonFileName -> val addonRgdData = addonsRgdData[addonFileName] @@ -172,7 +180,7 @@ class BuildingRgdExtractService @Autowired constructor( if (it != "") { WeaponsData(hardpointValue, weapon.name.replace("weapon_", "").toInt(), - it.replace("weapon\\", "").replace(".lua", "")) + it.replace("weapon\\", "").replace(".lua", "").replace(".rgd", "")) } else null } } @@ -226,11 +234,7 @@ class BuildingRgdExtractService @Autowired constructor( if (mTable.getStringByName("\$REF") == "modifiers\\no_modifier.lua" || mTable.getStringByName("\$REF") == "modifiers\\enable_infiltration.lua" ) null else { BuildingModifiers().also { it.building = building - it.reference = mTable.getStringByName("\$REF") - it.target = mTable.getStringByName("target_type_name") - it.usageType = mTable.getRgdTableByName("usage_type")?.getStringByName("\$REF") - it.value = mTable.getDoubleByName("value") - } + }.fillDataFromRgdTable(mTable) } } else null }.filterUseless() diff --git a/src/main/kotlin/com/dowstats/service/w40k/CommonParseRgdService.kt b/src/main/kotlin/com/dowstats/service/w40k/CommonParseRgdService.kt index de40d8b..ce0bb35 100644 --- a/src/main/kotlin/com/dowstats/service/w40k/CommonParseRgdService.kt +++ b/src/main/kotlin/com/dowstats/service/w40k/CommonParseRgdService.kt @@ -6,6 +6,7 @@ import com.dowstats.data.dto.BuildCost import com.dowstats.data.dto.ResourceIncome import com.dowstats.data.dto.UiInfo import com.dowstats.data.entities.Mod +import com.dowstats.data.entities.ability.Ability import com.dowstats.data.rgd.RgdData import com.dowstats.data.rgd.RgdDataUtil.getBooleanByName import com.dowstats.data.rgd.RgdDataUtil.getDoubleByName @@ -67,7 +68,7 @@ class CommonParseRgdService @Autowired constructor( } - fun getUiInfo(uiInfoRgdData: List, modDictionary: Map, modFolderData: String, mod: Mod, log: Logger): UiInfo { + fun getUiInfo(uiInfoRgdData: List, modDictionary: Map, modFolderData: String, mod: Mod, log: Logger, isOnOfAbility: Boolean = false): UiInfo { val nameRef = uiInfoRgdData?.getStringByName("screen_name_id")?.replace("$", "") val name = nameRef?.let { try { modDictionary[it.toInt()] } catch (e: Exception) { it } } @@ -89,7 +90,9 @@ class CommonParseRgdService @Autowired constructor( } val icon = try { - val iconPath = uiInfoRgdData.getStringByName("icon_name") + val iconPath = if (isOnOfAbility) { + uiInfoRgdData.getStringByName("icon_name") + "_off" + } else uiInfoRgdData.getStringByName("icon_name") iconPath?.let { modAttribPathService.getIconPath(modFolderData, iconPath) } ?.let { iconsService.convertTgaToJpegImage(iconPath, it, mod.name) } @@ -101,19 +104,29 @@ class CommonParseRgdService @Autowired constructor( return UiInfo(name, description, icon) } - fun getAreaEffectData(weaponData: List): AreaEffect { - val areaEffect = weaponData.getRgdTableByName("area_effect") + fun getAreaEffectData(areaEffectData: List): AreaEffect { - val areaEffectInformation = areaEffect?.getRgdTableByName("area_effect_information") - val cantHaveRadius = areaEffectInformation?.getRgdTableByName("area_type")?.getStringByName("\$REF")?.contains("tp_area_effect_point") == true + val areaEffectInformation = areaEffectData.getRgdTableByName("area_effect_information") + + val areaType = areaEffectInformation?.getRgdTableByName("area_type") + ?.getStringByName("\$REF") + ?.replace("type_areaeffect\\tp_","") + ?.replace(".lua","") + + val filterType = areaEffectInformation?.getRgdTableByName("filter_type") + ?.getStringByName("\$REF") + ?.replace("type_areafilter\\tp_","") + ?.replace(".lua","") + + val cantHaveRadius = areaEffectInformation?.equals("area_effect_point") == true val damageRadius = if(cantHaveRadius) 0.0 else areaEffectInformation?.getDoubleByName("radius") ?: 0.0 - val throwData = areaEffect?.getRgdTableByName("throw_data") + val throwData = areaEffectData.getRgdTableByName("throw_data") val forceMin = throwData?.getDoubleByName("force_min") ?: 0.0 val forceMax = throwData?.getDoubleByName("force_max") ?: 0.0 - val armourDamage = areaEffect - ?.getRgdTableByName("weapon_damage") + val armourDamage = areaEffectData + .getRgdTableByName("weapon_damage") ?.getRgdTableByName("armour_damage") val minDamage = armourDamage?.getDoubleByName("min_damage") ?: 0.0 val maxDamage = armourDamage?.getDoubleByName("max_damage") ?: 0.0 @@ -121,6 +134,7 @@ class CommonParseRgdService @Autowired constructor( val moraleDamage = armourDamage?.getDoubleByName("morale_damage") ?: 0.0 + val defaultArmourPiercing = armourDamage?.getDoubleByName("armour_piercing") ?: 0.0 val weaponDmgMap: Map = armourDamage?.getRgdTableByName("armour_piercing_types")?.mapNotNull { armour_piercing -> @@ -134,9 +148,33 @@ class CommonParseRgdService @Autowired constructor( - return AreaEffect(minDamage, maxDamage, damageRadius, forceMin, forceMax, minDamageValue, moraleDamage, weaponDmgMap, defaultArmourPiercing) + return AreaEffect( + minDamage, + maxDamage, + damageRadius, + forceMin, + forceMax, + minDamageValue, + moraleDamage, + weaponDmgMap, + defaultArmourPiercing, + areaType, + filterType + ) } + fun getAbilities(modelData: List?, abilities: Set): List = modelData + ?.getRgdTableByName("ability_ext") + ?.getRgdTableByName("abilities") + ?.mapNotNull { ability -> + if (ability.name.contains("ability_")) { + val abilityFileName = (ability.value as String?)?.let{ + it.replace("abilities\\", "").replace(".lua", "").replace(".rgd", "") + } + abilities.find { it.filename?.replace(".rgd", "") == abilityFileName } + } else null + } ?: emptyList() + } diff --git a/src/main/kotlin/com/dowstats/service/w40k/ModAttribPathService.kt b/src/main/kotlin/com/dowstats/service/w40k/ModAttribPathService.kt index 275edf5..345b265 100644 --- a/src/main/kotlin/com/dowstats/service/w40k/ModAttribPathService.kt +++ b/src/main/kotlin/com/dowstats/service/w40k/ModAttribPathService.kt @@ -26,6 +26,9 @@ class ModAttribPathService @Autowired constructor( fun getWeaponAttribsPath(modFolderData: String): String = "$modFolderData${File.separator}attrib${File.separator}weapon" + fun getAbilitiesAttribsPath(modFolderData: String): String = + "$modFolderData${File.separator}attrib${File.separator}abilities" + fun getResearchAttribsPath(modFolderData: String): String = "$modFolderData${File.separator}attrib${File.separator}research" diff --git a/src/main/kotlin/com/dowstats/service/w40k/ModParserService.kt b/src/main/kotlin/com/dowstats/service/w40k/ModParserService.kt index de4dcf2..a4e0dcb 100644 --- a/src/main/kotlin/com/dowstats/service/w40k/ModParserService.kt +++ b/src/main/kotlin/com/dowstats/service/w40k/ModParserService.kt @@ -1,9 +1,15 @@ package com.dowstats.service.w40k import com.dowstats.data.entities.* +import com.dowstats.data.entities.ability.Ability import com.dowstats.data.entities.building.BuildingWeapon import com.dowstats.data.entities.building.BuildingWeaponKey import com.dowstats.data.entities.research.Research +import com.dowstats.data.entities.sergant.SergeantWeapon +import com.dowstats.data.entities.sergant.SergeantWeaponKey +import com.dowstats.data.entities.unit.UnitWeapon +import com.dowstats.data.entities.unit.UnitWeaponKey +import com.dowstats.data.entities.weapon.Weapon import com.dowstats.data.repositories.* import com.dowstats.data.rgd.RgdData import com.dowstats.service.postparsing.PostParsingService @@ -24,8 +30,13 @@ class ModParserService @Autowired constructor( val researchRgdExtractService: ResearchRgdExtractService, val raceRepository: RaceRepository, val armorTypeRepository: ArmorTypeRepository, + val areaEffectRepository: AreaEffectRepository, + val areaFilterRepository: AreaFilterRepository, + val activationRepository: ActivationRepository, val unitRepository: UnitRepository, val sergeantRepository: SergeantRepository, + val abilityRgdExtractService: AbilityRgdExtractService, + val abilityRepository: AbilityRepository, val weaponRgdExtractService: WeaponRgdExtractService, val weaponRepository: WeaponRepository, val modAttribPathService: ModAttribPathService, @@ -76,6 +87,10 @@ class ModParserService @Autowired constructor( armorTypeRepository.findByIsUa(true).toSet() else armorTypeRepository.findByIsClassic(true).toSet() + val areaEffects = areaEffectRepository.findAll().toSet() + val areaFilters = areaFilterRepository.findAll().toSet() + val activations = activationRepository.findAll().toSet() + racesList.forEach { unitRepository.deleteAllByModIdAndRaceId(mod.id!!, it) } @@ -87,9 +102,10 @@ class ModParserService @Autowired constructor( val enrichedModDictionary = defaultDictionary + modDictionary val weapons = saveWeapons(modFolderData, mod, armorTypes, enrichedModDictionary) + val abilities = saveAbilities(modFolderData, mod, activations, areaEffects, areaFilters, armorTypes, enrichedModDictionary) val researches = saveResearches(modFolderData, mod, enrichedModDictionary) - saveUnits(modFolderData, weapons, racesList, armorTypes, mod, enrichedModDictionary) - saveBuildings(modFolderData, weapons, researches, racesList, armorTypes, mod, enrichedModDictionary) + saveUnits(modFolderData, weapons, abilities, racesList, armorTypes, mod, enrichedModDictionary) + saveBuildings(modFolderData, weapons, abilities, researches, racesList, armorTypes, mod, enrichedModDictionary) modRepository.removeCampaignEntities(mod.id!!) postParsingService.bindResearch(mod) @@ -170,6 +186,7 @@ class ModParserService @Autowired constructor( private fun saveUnits( modFolderData: String, weapons: Set, + abilities: Set, racesList: List, armorTypes: Set, mod: Mod, @@ -235,6 +252,7 @@ class ModParserService @Autowired constructor( squadRgdData.value, unitRgdData, weapons, + abilities, raceFolder, modFolderData, mod, @@ -298,6 +316,7 @@ class ModParserService @Autowired constructor( private fun saveBuildings( modFolderData: String, weapons: Set, + abilities: Set, researches: Set, racesList: List, armorTypes: Set, @@ -342,6 +361,7 @@ class ModParserService @Autowired constructor( modDictionary, structure.value, weapons, + abilities, researches, raceUnits, race, @@ -417,6 +437,39 @@ class ModParserService @Autowired constructor( } } + private fun saveAbilities(modFolderData: String, + mod: Mod, + activations: Set, + areaEffects: Set, + areaFilters: Set, + armorTypes: Set, modDictionary: Map): Set { + + val classicAbilities = + rgdParserService.parseFolderToRgdFiles("${modAttribPathService.pathToWanilaData}/attrib/abilities") + + val modAbilities = + rgdParserService.parseFolderToRgdFiles(modAttribPathService.getAbilitiesAttribsPath(modFolderData)) + + val allAbilities = classicAbilities + modAbilities + + val abilitiesToSave = allAbilities.mapNotNull { + abilityRgdExtractService.extractToAbilityEntity(it.key, it.value, mod, + activations, + areaEffects, + areaFilters, + armorTypes, + modFolderData, + modDictionary + ) + } + + return try { + abilityRepository.saveAll(abilitiesToSave).toSet() + } catch (e: Exception) { + throw e + } + } + } diff --git a/src/main/kotlin/com/dowstats/service/w40k/ResearchRgdExtractService.kt b/src/main/kotlin/com/dowstats/service/w40k/ResearchRgdExtractService.kt index 37933b3..be55e30 100644 --- a/src/main/kotlin/com/dowstats/service/w40k/ResearchRgdExtractService.kt +++ b/src/main/kotlin/com/dowstats/service/w40k/ResearchRgdExtractService.kt @@ -2,11 +2,13 @@ package com.dowstats.service.w40k import com.dowstats.Metadata import com.dowstats.data.entities.* +import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.fillDataFromRgdTable import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.filterUseless import com.dowstats.data.entities.research.Research import com.dowstats.data.entities.research.ResearchModifiers import com.dowstats.data.entities.research.ResearchRequirements import com.dowstats.data.rgd.RgdData +import com.dowstats.data.rgd.RgdDataUtil.getBooleanByName import com.dowstats.data.rgd.RgdDataUtil.getDoubleByName import com.dowstats.data.rgd.RgdDataUtil.getIntByName import com.dowstats.data.rgd.RgdDataUtil.getRgdTableByName @@ -38,6 +40,7 @@ class ResearchRgdExtractService @Autowired constructor( research.name = researchUiInfo.name research.description = researchUiInfo.description research.uiIndexHint = researchData.getIntByName("ui_index_hint") ?: 0 + research.uiHotkeyName = researchData.getStringByName("ui_hotkey_name") research.icon = researchUiInfo.iconPath val cost = commonParseRgdService.getBuildCost(researchData.getRgdTableByName("time_cost")) @@ -63,11 +66,7 @@ class ResearchRgdExtractService @Autowired constructor( if (mTable.getStringByName("\$REF") == "modifiers\\no_modifier.lua") null else { ResearchModifiers().also { it.research = research - it.reference = mTable.getStringByName("\$REF") - it.usageType = mTable.getRgdTableByName("usage_type")?.getStringByName("\$REF") - it.target = mTable.getStringByName("target_type_name") - it.value = mTable.getDoubleByName("value") - } + }.fillDataFromRgdTable(mTable) } } else null }?.filterUseless() ?: emptyList() diff --git a/src/main/kotlin/com/dowstats/service/w40k/SergantRgdExtractService.kt b/src/main/kotlin/com/dowstats/service/w40k/SergantRgdExtractService.kt index 217a56f..7c621c6 100644 --- a/src/main/kotlin/com/dowstats/service/w40k/SergantRgdExtractService.kt +++ b/src/main/kotlin/com/dowstats/service/w40k/SergantRgdExtractService.kt @@ -3,6 +3,13 @@ package com.dowstats.service.w40k import com.dowstats.Metadata import com.dowstats.data.dto.BuildCost import com.dowstats.data.entities.* +import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.fillDataFromRgdTable +import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.filterUseless +import com.dowstats.data.entities.ability.Ability +import com.dowstats.data.entities.sergant.Sergeant +import com.dowstats.data.entities.sergant.SergeantModifiers +import com.dowstats.data.entities.sergant.SergeantRequirements +import com.dowstats.data.entities.weapon.Weapon import com.dowstats.data.rgd.RgdData import com.dowstats.data.rgd.RgdDataUtil.getDoubleByName import com.dowstats.data.rgd.RgdDataUtil.getIntByName @@ -44,6 +51,7 @@ class SergeantRgdExtractService @Autowired constructor( mod: Mod, sergeantData: List, weapons: Set, + abilities: Set, modFolderData: String, buildCost: BuildCost, armorTypes: Set, @@ -62,13 +70,14 @@ class SergeantRgdExtractService @Autowired constructor( sergeant.armorType2 = getUnitArmorType(sergeantData, armorTypes, "type_armour_2") sergeant.filename = fileName - val sergeantUiRgd = sergeantData.getRgdTableByName("ui_ext") - ?.getRgdTableByName("ui_info") ?: throw Exception("$fileName") + val uiExt = sergeantData.getRgdTableByName("ui_ext") ?: throw Exception("Could not find ui_ext at $fileName") + val sergeantUiRgd = uiExt.getRgdTableByName("ui_info") ?: throw Exception("Could not find ui_info at $fileName") val sergeantUiInfo = commonParseRgdService.getUiInfo(sergeantUiRgd, modDictionary, modFolderData, mod, log) sergeant.name = sergeantUiInfo.name sergeant.description = sergeantUiInfo.description sergeant.icon = sergeantUiInfo.iconPath + sergeant.uiHotkeyName = uiExt.getStringByName("ui_hotkey_name") val healthData = getHealthAndMoraleDeathPenaltyData(sergeantData) sergeant.health = healthData.hitpoints?.toInt() @@ -76,6 +85,10 @@ class SergeantRgdExtractService @Autowired constructor( sergeant.healthRegeneration = healthData.regeneration sergeant.moraleDeathPenalty = healthData.moraleDeathPenalty?.toInt() + val moraleInc = sergeantData.getRgdTableByName("morale_add_ext") + sergeant.moraleIncomeMax = moraleInc?.getDoubleByName("inc_morale_max") + sergeant.moraleIncomeRate = moraleInc?.getDoubleByName("inc_morale_rate") + val incomeData = commonParseRgdService.getResourceIncome(sergeantData.getRgdTableByName("resource_ext")) sergeant.faithIncome = incomeData.faith sergeant.powerIncome = incomeData.power @@ -90,8 +103,11 @@ class SergeantRgdExtractService @Autowired constructor( sergeant.modId = mod.id!! + sergeant.sergeantModifiers = getSergeantModifiers(sergeant, sergeantData).toMutableSet() sergeant.sergeantRequirements = getSergeantRequirements(sergeant, sergeantData).toMutableSet() + sergeant.abilities = commonParseRgdService.getAbilities(sergeantData, abilities).toMutableSet() + val sergeantWeapons = getSergeantWeapons(sergeantData)?.mapNotNull { weaponData -> weapons.find { it.filename == weaponData.weaponFilename + ".rgd" @@ -166,6 +182,18 @@ class SergeantRgdExtractService @Autowired constructor( } else null }?.flatten() + private fun getSergeantModifiers(sergeant: Sergeant, sergeantData: List): List = + sergeantData.getRgdTableByName("modifier_apply_ext")?.getRgdTableByName("modifiers")?.mapNotNull { m -> + if (m.name.contains("modifier_")) { + val mTable = m.value as List + if (mTable.getStringByName("\$REF") == "modifiers\\no_modifier.lua") null else { + SergeantModifiers().also { + it.sergeant = sergeant + }.fillDataFromRgdTable(mTable) + } + } else null + }?.filterUseless() ?: emptyList() + private fun getSergeantRequirements(sergeant: Sergeant, sergeantData: List): List { val requirements = sergeantData.getRgdTableByName("requirement_ext")?.getRgdTableByName("requirements") return requirements?.mapNotNull { r -> diff --git a/src/main/kotlin/com/dowstats/service/w40k/UnitRgdExtractService.kt b/src/main/kotlin/com/dowstats/service/w40k/UnitRgdExtractService.kt index 42cd0f5..3800cc9 100644 --- a/src/main/kotlin/com/dowstats/service/w40k/UnitRgdExtractService.kt +++ b/src/main/kotlin/com/dowstats/service/w40k/UnitRgdExtractService.kt @@ -5,6 +5,15 @@ import com.dowstats.data.dto.BuildCost import com.dowstats.data.dto.UnitDataToSave import com.dowstats.data.dto.WeaponsData import com.dowstats.data.entities.* +import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.fillDataFromRgdTable +import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.filterUseless +import com.dowstats.data.entities.ability.Ability +import com.dowstats.data.entities.sergant.Sergeant +import com.dowstats.data.entities.unit.DowUnit +import com.dowstats.data.entities.unit.UnitModifiers +import com.dowstats.data.entities.unit.UnitRequirements +import com.dowstats.data.entities.weapon.Weapon +import com.dowstats.data.entities.weapon.WeaponModifiers import com.dowstats.data.rgd.RgdData import com.dowstats.data.rgd.RgdDataUtil.getBooleanByName import com.dowstats.data.rgd.RgdDataUtil.getDoubleByName @@ -60,6 +69,7 @@ class UnitRgdExtractService @Autowired constructor( squadData: List, unitData: List, weapons: Set, + abilities: Set, race: String, modFolderData: String, mod: Mod, @@ -84,6 +94,7 @@ class UnitRgdExtractService @Autowired constructor( unit.filenameSquad = fileNameSquad unit.filenameUnit = fileNameUnit unit.uiIndexHint = unitData.getRgdTableByName("ui_ext")?.getIntByName("ui_index_hint") ?: 0 + unit.uiHotkeyName = unitData.getRgdTableByName("ui_ext")?.getStringByName("ui_hotkey_name") unit.haveReinforceMenu = squadData.getRgdTableByName("squad_reinforce_ext") != null val buildCost = getBuildCost(unitData, squadData) @@ -141,7 +152,9 @@ class UnitRgdExtractService @Autowired constructor( unit.reinforceCostSouls = reinforceCostData.souls unit.reinforceTime = reinforceCostData.time + unit.unitModifiers = geUnitModifiers(unit, unitData, squadData).toMutableSet() unit.unitRequirements = getUnitRequirements(unit, squadData).toMutableSet() + unit.abilities = commonParseRgdService.getAbilities(unitData, abilities).toMutableSet() val sergeantsData = getSergeantsData(squadData) @@ -156,6 +169,7 @@ class UnitRgdExtractService @Autowired constructor( mod, sergeantRgdData, weapons, + abilities, modFolderData, sergeantData.cost, armorTypes @@ -304,7 +318,7 @@ class UnitRgdExtractService @Autowired constructor( .getRgdTableByName("squad_reinforce_ext") ?.getRgdTableByName("cost") - private fun getUnitWeapons(reinforceData: List?, weapons: Set): List? = reinforceData + private fun getUnitWeapons(unitData: List?, weapons: Set): List? = unitData ?.getRgdTableByName("combat_ext") ?.getRgdTableByName("hardpoints") ?.mapNotNull { hardpoint -> @@ -318,7 +332,7 @@ class UnitRgdExtractService @Autowired constructor( it.mapNotNull { weapon -> (weapon.value as? List)?.getStringByName("weapon")?.let { if (it != "") { - val weaponFileName = it.replace("weapon\\", "").replace(".lua", "") + val weaponFileName = it.replace("weapon\\", "").replace(".rgd", "").replace(".lua", "") val weaponEntity = weapons.find { it.filename?.replace(".rgd", "") == weaponFileName } @@ -339,6 +353,8 @@ class UnitRgdExtractService @Autowired constructor( } else null }?.flatten() + + private fun getSergeantsData(squadData: List?): Pair?, Int?> { val squadTable = squadData @@ -365,6 +381,40 @@ class UnitRgdExtractService @Autowired constructor( return Pair(sergeantsData, maxSergeants) } + private fun geUnitModifiers(unit: DowUnit, unitData: List, squadData: List): List { + + fun getUnitModifiersFromTable(table: List?) : List = table?.mapNotNull { m -> + if (m.name.contains("modifier_")) { + val mTable = m.value as List + if (mTable.getStringByName("\$REF") == "modifiers\\no_modifier.lua") null else { + UnitModifiers().also { + it.unit = unit + }.fillDataFromRgdTable(mTable) + } + } else null + }?.filterUseless() ?: emptyList() + + fun getSquadModifiersFromTable(table: List?) : List = table?.mapNotNull { m -> + if (m.name.contains("modifier_")) { + val mTable = m.value as List + val modifier = mTable.getRgdTableByName("modifier") + val maxLifetime = mTable.getDoubleByName("max_lifetime") + if (modifier?.getStringByName("\$REF") == "modifiers\\no_modifier.lua" || modifier == null) null else { + UnitModifiers().also { + it.unit = unit + it.maxLifeTime = maxLifetime + }.fillDataFromRgdTable(modifier) + } + } else null + }?.filterUseless() ?: emptyList() + + val unitModifiersTable = unitData.getRgdTableByName("modifier_apply_ext")?.getRgdTableByName("modifiers") + val squadModifiersTable = squadData.getRgdTableByName("squad_modifier_apply_ext")?.getRgdTableByName("modifiers") + + return getUnitModifiersFromTable(unitModifiersTable) + getSquadModifiersFromTable(squadModifiersTable) + + } + private fun getUnitRequirements(unit: DowUnit, squadData: List): List { val requirements = squadData.getRgdTableByName("squad_requirement_ext")?.getRgdTableByName("requirements") return requirements?.mapNotNull { r -> diff --git a/src/main/kotlin/com/dowstats/service/w40k/WeaponRgdExtractService.kt b/src/main/kotlin/com/dowstats/service/w40k/WeaponRgdExtractService.kt index 88bc3df..24acd9c 100644 --- a/src/main/kotlin/com/dowstats/service/w40k/WeaponRgdExtractService.kt +++ b/src/main/kotlin/com/dowstats/service/w40k/WeaponRgdExtractService.kt @@ -1,7 +1,14 @@ package com.dowstats.service.w40k import com.dowstats.Metadata -import com.dowstats.data.entities.* +import com.dowstats.data.entities.ArmorType +import com.dowstats.data.entities.Mod +import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.fillDataFromRgdTable +import com.dowstats.data.entities.ModifiersBase.ModifiersBaseCompanion.filterUseless +import com.dowstats.data.entities.weapon.Weapon +import com.dowstats.data.entities.weapon.WeaponArmorPiercing +import com.dowstats.data.entities.weapon.WeaponModifiers +import com.dowstats.data.entities.weapon.WeaponRequirements import com.dowstats.data.rgd.RgdData import com.dowstats.data.rgd.RgdDataUtil.getBooleanByName import com.dowstats.data.rgd.RgdDataUtil.getDoubleByName @@ -32,6 +39,7 @@ class WeaponRgdExtractService @Autowired constructor( weapon.icon = weaponUiData?.iconPath weapon.description = weaponUiData?.description weapon.showInReinforce = weaponUiInfo?.getBooleanByName("show_in_reinforce") ?: false + weapon.uiHotkeyName = weaponData.getStringByName("ui_hotkey_name") val cost = commonParseRgdService.getBuildCost(weaponData.getRgdTableByName("cost")) weapon.costRequisition = cost.requisition ?: 0.0 @@ -49,26 +57,34 @@ class WeaponRgdExtractService @Autowired constructor( weapon.canAttackGround = weaponData.getBooleanByName("can_attack_ground_units") ?: true - val areaEffectData = commonParseRgdService.getAreaEffectData(weaponData) + val areaEffectTable = weaponData.getRgdTableByName("area_effect") - val armoursPiercing = armorTypes.map { - val weaponArmourPiercing = WeaponArmorPiercing() - weaponArmourPiercing.weapon = weapon - weaponArmourPiercing.armorType = it - val piercingValue = (areaEffectData.weaponDmgMap[it.id] ?: areaEffectData.defaultArmorPiercing).toBigDecimal() - weaponArmourPiercing.piercingValue = piercingValue.let {pv -> if(pv <= BigDecimal(100)) pv else BigDecimal(100) } - weaponArmourPiercing + if (areaEffectTable != null) { + val areaEffectData = commonParseRgdService.getAreaEffectData(areaEffectTable) + + val armoursPiercing = armorTypes.map { + val weaponArmourPiercing = WeaponArmorPiercing() + weaponArmourPiercing.weapon = weapon + weaponArmourPiercing.armorType = it + val piercingValue = + (areaEffectData.weaponDmgMap[it.id] ?: areaEffectData.defaultArmorPiercing).toBigDecimal() + weaponArmourPiercing.piercingValue = + piercingValue.let { pv -> if (pv <= BigDecimal(100)) pv else BigDecimal(100) } + weaponArmourPiercing + } + + weapon.minDamageValue = areaEffectData.minDamageValue + weapon.minDamage = areaEffectData.minDamage + weapon.maxDamage = areaEffectData.maxDamage + weapon.throwForceMin = areaEffectData.throwForceMin + weapon.throwForceMax = areaEffectData.throwForceMax + weapon.moraleDamage = areaEffectData.moraleDamage + weapon.weaponPiercings = armoursPiercing + weapon.damageRadius = areaEffectData.damageRadius } - weapon.minDamageValue = areaEffectData.minDamageValue - weapon.minDamage = areaEffectData.minDamage - weapon.maxDamage = areaEffectData.maxDamage - weapon.throwForceMin = areaEffectData.throwForceMin - weapon.throwForceMax = areaEffectData.throwForceMax - weapon.moraleDamage = areaEffectData.moraleDamage - weapon.weaponPiercings = armoursPiercing - weapon.damageRadius = areaEffectData.damageRadius weapon.modId = mod.id + weapon.weaponModifiers = getWeaponModifiers(weapon, weaponData).toMutableSet() weapon.weaponRequirements = getWeaponRequirements(weapon, weaponData).toMutableSet() return if(weapon.minDamage == 0.0 && weapon.maxDamage == 0.0 && weapon.moraleDamage == 0.0){ @@ -76,6 +92,24 @@ class WeaponRgdExtractService @Autowired constructor( } else weapon } + private fun getWeaponModifiers(weapon: Weapon, weaponData: List?): List = + weaponData?.getRgdTableByName("area_effect") + ?.getRgdTableByName("weapon_damage") + ?.getRgdTableByName("modifiers") + ?.mapNotNull { m -> + if (m.name.contains("modifier_")) { + val mTable = m.value as List + val modifier = mTable.getRgdTableByName("modifier") + val maxLifetime = mTable.getDoubleByName("max_lifetime") + if (modifier?.getStringByName("\$REF") == "modifiers\\no_modifier.lua" || modifier == null) null else { + WeaponModifiers().also { + it.weapon = weapon + it.maxLifeTime = maxLifetime + }.fillDataFromRgdTable(modifier) + } + } else null + }?.filterUseless() ?: emptyList() + private fun getWeaponRequirements(weapon: Weapon, weaponData: List): List { return try{ val requirements = weaponData.getRgdTableByName("requirements") diff --git a/src/main/resources/db/0.0.3/schema/building_affected_weapons.json b/src/main/resources/db/0.0.3/schema/building_affected_weapons.json index 868c626..33a6fa5 100644 --- a/src/main/resources/db/0.0.3/schema/building_affected_weapons.json +++ b/src/main/resources/db/0.0.3/schema/building_affected_weapons.json @@ -44,7 +44,7 @@ "baseTableName": "building_affected_weapons", "constraintName": "fk_buildings_buildings_affected_weapons", "referencedColumnNames": "id", - "referencedTableName": "researches", + "referencedTableName": "buildings", "onDelete": "CASCADE" } }, diff --git a/src/main/resources/db/0.0.4/data/activation.json b/src/main/resources/db/0.0.4/data/activation.json new file mode 100644 index 0000000..0eb00d0 --- /dev/null +++ b/src/main/resources/db/0.0.4/data/activation.json @@ -0,0 +1,98 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Fill activation table", + "author": "anibus", + "changes": [ + { + "insert": { + "tableName": "activation", + "columns": [ + { + "column": { + "name": "id", + "value": "ability_activation_always_on" + } + },{ + "column": { + "name": "name", + "value": "Passive ability" + } + } + ] + } + },{ + "insert": { + "tableName": "activation", + "columns": [ + { + "column": { + "name": "id", + "value": "ability_activation_meleehit" + } + },{ + "column": { + "name": "name", + "value": "Active when receiving melee hit" + } + } + ] + } + },{ + "insert": { + "tableName": "activation", + "columns": [ + { + "column": { + "name": "id", + "value": "ability_activation_targeted" + } + },{ + "column": { + "name": "name", + "value": "Target ability" + } + } + ] + } + },{ + "insert": { + "tableName": "activation", + "columns": [ + { + "column": { + "name": "id", + "value": "ability_activation_timed" + } + },{ + "column": { + "name": "name", + "value": "Timed ability" + } + } + ] + } + },{ + "insert": { + "tableName": "activation", + "columns": [ + { + "column": { + "name": "id", + "value": "ability_activation_toggled" + } + },{ + "column": { + "name": "name", + "value": "On/off ability" + } + } + ] + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/db/0.0.4/data/area_effect.json b/src/main/resources/db/0.0.4/data/area_effect.json new file mode 100644 index 0000000..32888e2 --- /dev/null +++ b/src/main/resources/db/0.0.4/data/area_effect.json @@ -0,0 +1,81 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Fill area_effect table", + "author": "anibus", + "changes": [ + { + "insert": { + "tableName": "area_effect", + "columns": [ + { + "column": { + "name": "id", + "value": "area_effect_circle" + } + },{ + "column": { + "name": "name", + "value": "Circle" + } + } + ] + } + },{ + "insert": { + "tableName": "activation", + "columns": [ + { + "column": { + "name": "id", + "value": "area_effect_pie" + } + },{ + "column": { + "name": "name", + "value": "Pie" + } + } + ] + } + },{ + "insert": { + "tableName": "activation", + "columns": [ + { + "column": { + "name": "id", + "value": "area_effect_point" + } + },{ + "column": { + "name": "name", + "value": "Point" + } + } + ] + } + },{ + "insert": { + "tableName": "activation", + "columns": [ + { + "column": { + "name": "id", + "value": "area_effect_squad" + } + },{ + "column": { + "name": "name", + "value": "Squad" + } + } + ] + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/db/0.0.4/data/area_filter.json b/src/main/resources/db/0.0.4/data/area_filter.json new file mode 100644 index 0000000..aa07203 --- /dev/null +++ b/src/main/resources/db/0.0.4/data/area_filter.json @@ -0,0 +1,81 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Fill area_filter table", + "author": "anibus", + "changes": [ + { + "insert": { + "tableName": "area_filter", + "columns": [ + { + "column": { + "name": "id", + "value": "area_filter_all" + } + },{ + "column": { + "name": "name", + "value": "All" + } + } + ] + } + },{ + "insert": { + "tableName": "area_filter", + "columns": [ + { + "column": { + "name": "id", + "value": "area_filter_allied" + } + },{ + "column": { + "name": "name", + "value": "Allied" + } + } + ] + } + },{ + "insert": { + "tableName": "area_filter", + "columns": [ + { + "column": { + "name": "id", + "value": "area_filter_enemy" + } + },{ + "column": { + "name": "name", + "value": "Enemy" + } + } + ] + } + },{ + "insert": { + "tableName": "area_filter", + "columns": [ + { + "column": { + "name": "id", + "value": "area_filter_own" + } + },{ + "column": { + "name": "name", + "value": "Own" + } + } + ] + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/db/0.0.4/schema/abilities.json b/src/main/resources/db/0.0.4/schema/abilities.json new file mode 100644 index 0000000..1024063 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/abilities.json @@ -0,0 +1,215 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Start new year 2026 work with abilities", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "ui_hotkey_name", + "type": "varchar(255)" + } + }, + { + "column": { + "name": "child_ability_name", + "type": "varchar(255)" + } + }, + { + "column": { + "name": "initial_delay_time", + "type": "varchar(255)" + } + },{ + "column": { + "name": "radius", + "type": "number" + } + },{ + "column": { + "name": "min_damage", + "type": "number" + } + },{ + "column": { + "name": "min_damage_value", + "type": "number" + } + },{ + "column": { + "name": "max_damage", + "type": "number" + } + },{ + "column": { + "name": "morale_damage", + "type": "number" + } + },{ + "column": { + "name": "throw_force_min", + "type": "number" + } + },{ + "column": { + "name": "throw_force_max", + "type": "number" + } + },{ + "column": { + "name": "activation_id", + "type": "varchar(255)" + } + },{ + "column": { + "name": "area_effect_id", + "type": "varchar(255)" + } + },{ + "addForeignKeyConstraint": + { + "constraintName": "fk_ability_activation", + "baseColumnNames": "activation_id", + "baseTableName": "abilities", + "referencedColumnNames": "id", + "referencedTableName": "activation" + } + },{ + "addForeignKeyConstraint": + { + "constraintName": "fk_ability_area_effect", + "baseColumnNames": "area_effect_id", + "baseTableName": "abilities", + "referencedColumnNames": "id", + "referencedTableName": "area_effect" + } + } + ], + "tableName": "abilities" + } + } + ] + } + }, + { + "changeSet": { + "id": "Add area_filter column", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "area_filter_id", + "type": "varchar(255)" + } + },{ + "addForeignKeyConstraint": + { + "constraintName": "fk_ability_area_filter", + "baseColumnNames": "area_filter_id", + "baseTableName": "abilities", + "referencedColumnNames": "id", + "referencedTableName": "area_filter" + } + } + ], + "tableName": "abilities" + } + } + ] + } + }, + { + "changeSet": { + "id": "Add ui_index_hint column", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "ui_index_hint", + "type": "int", + "value": 0, + "constraints": { + "nullable": false + } + } + } + ], + "tableName": "abilities" + } + } + ] + } + }, + { + "changeSet": { + "id": "Add range, recharge_time, recharge_timer_global, refresh_time, duration_time, spawned_entity_name columns", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "range", + "type": "number" + } + },{ + "column": { + "name": "recharge_time", + "type": "number" + } + },{ + "column": { + "name": "recharge_timer_global", + "type": "boolean" + } + },{ + "column": { + "name": "refresh_time", + "type": "number" + } + },{ + "column": { + "name": "duration_time", + "type": "number" + } + },{ + "column": { + "name": "spawned_entity_name", + "type": "varchar(1024)" + } + } + ], + "tableName": "abilities" + } + } + ] + } + },{ + "changeSet": { + "id": "Change abilities name data type to Text column", + "author": "anibus", + "changes": [ + { + "modifyDataType": { + "columnName": "name", + "newDataType": "text", + "tableName": "abilities" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/ability_affected_buildings.json b/src/main/resources/db/0.0.4/schema/ability_affected_buildings.json new file mode 100644 index 0000000..3f869dd --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/ability_affected_buildings.json @@ -0,0 +1,60 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ability_affected_buildings table", + "author": "ai_assistant", + "changes": [ + { + "createTable": { + "tableName": "ability_affected_buildings", + "columns": [ + { + "column": { + "name": "ability_id", + "type": "int", + "constraints": { "nullable": false } + } + }, + { + "column": { + "name": "building_id", + "type": "int", + "constraints": { "nullable": false } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "ability_id, building_id", + "constraintName": "uc_ability_affected_buildings", + "tableName": "ability_affected_buildings" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "ability_id", + "baseTableName": "ability_affected_buildings", + "constraintName": "fk_ability_aff_build_ability", + "referencedColumnNames": "id", + "referencedTableName": "abilities", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "building_id", + "baseTableName": "ability_affected_buildings", + "constraintName": "fk_ability_aff_build_building", + "referencedColumnNames": "id", + "referencedTableName": "buildings", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/ability_affected_sergeants.json b/src/main/resources/db/0.0.4/schema/ability_affected_sergeants.json new file mode 100644 index 0000000..2b95d94 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/ability_affected_sergeants.json @@ -0,0 +1,60 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ability_affected_sergeants table", + "author": "ai_assistant", + "changes": [ + { + "createTable": { + "tableName": "ability_affected_sergeants", + "columns": [ + { + "column": { + "name": "ability_id", + "type": "int", + "constraints": { "nullable": false } + } + }, + { + "column": { + "name": "sergeant_id", + "type": "int", + "constraints": { "nullable": false } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "ability_id, sergeant_id", + "constraintName": "uc_ability_affected_sergeants", + "tableName": "ability_affected_sergeants" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "ability_id", + "baseTableName": "ability_affected_sergeants", + "constraintName": "fk_ability_aff_serg_ability", + "referencedColumnNames": "id", + "referencedTableName": "abilities", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "sergeant_id", + "baseTableName": "ability_affected_sergeants", + "constraintName": "fk_ability_aff_serg_sergeant", + "referencedColumnNames": "id", + "referencedTableName": "sergeants", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/ability_affected_units.json b/src/main/resources/db/0.0.4/schema/ability_affected_units.json new file mode 100644 index 0000000..154646e --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/ability_affected_units.json @@ -0,0 +1,60 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ability_affected_units table", + "author": "ai_assistant", + "changes": [ + { + "createTable": { + "tableName": "ability_affected_units", + "columns": [ + { + "column": { + "name": "ability_id", + "type": "int", + "constraints": { "nullable": false } + } + }, + { + "column": { + "name": "unit_id", + "type": "int", + "constraints": { "nullable": false } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "ability_id, unit_id", + "constraintName": "uc_ability_affected_units", + "tableName": "ability_affected_units" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "ability_id", + "baseTableName": "ability_affected_units", + "constraintName": "fk_ability_aff_units_ability", + "referencedColumnNames": "id", + "referencedTableName": "abilities", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "unit_id", + "baseTableName": "ability_affected_units", + "constraintName": "fk_ability_aff_units_unit", + "referencedColumnNames": "id", + "referencedTableName": "units", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/ability_affected_weapons.json b/src/main/resources/db/0.0.4/schema/ability_affected_weapons.json new file mode 100644 index 0000000..a87738b --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/ability_affected_weapons.json @@ -0,0 +1,60 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ability_affected_weapons table", + "author": "ai_assistant", + "changes": [ + { + "createTable": { + "tableName": "ability_affected_weapons", + "columns": [ + { + "column": { + "name": "ability_id", + "type": "int", + "constraints": { "nullable": false } + } + }, + { + "column": { + "name": "weapon_id", + "type": "int", + "constraints": { "nullable": false } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "ability_id, weapon_id", + "constraintName": "uc_ability_affected_weapons", + "tableName": "ability_affected_weapons" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "ability_id", + "baseTableName": "ability_affected_weapons", + "constraintName": "fk_ability_aff_weap_ability", + "referencedColumnNames": "id", + "referencedTableName": "abilities", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "weapon_id", + "baseTableName": "ability_affected_weapons", + "constraintName": "fk_ability_aff_weap_weapon", + "referencedColumnNames": "id", + "referencedTableName": "weapons", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/ability_armors_piercing.json b/src/main/resources/db/0.0.4/schema/ability_armors_piercing.json new file mode 100644 index 0000000..d493f69 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/ability_armors_piercing.json @@ -0,0 +1,76 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ability_armors_piercing table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "ability_armors_piercing", + "columns": [{ + "column": { + "name": "id", + "type": "int", + "autoIncrement": true, + "constraints": { + "primaryKey": true, + "nullable": false + } + } + }, + { + "column": { + "name": "ability_id", + "type": "int", + "constraints": { + "primaryKey": true, + "nullable": false + } + } + }, + { + "column": { + "name": "armor_type_id", + "type": "varchar(50)", + "constraints": { + "primaryKey": true, + "nullable": false + } + } + },{ + "column": { + "name": "piercing_value", + "type": "number", + "constraints": { + "nullable": false + } + } + },{ + "addForeignKeyConstraint": + { + "constraintName": "fk_ability_ability_armors_piercing", + "baseColumnNames": "ability_id", + "baseTableName": "ability_armors_piercing", + "referencedColumnNames": "id", + "referencedTableName": "abilities", + "onDelete": "CASCADE" + } + },{ + "addForeignKeyConstraint": + { + "constraintName": "fk_armor_types_armors_damage_weapons", + "baseColumnNames": "armor_type_id", + "baseTableName": "ability_armors_piercing", + "referencedColumnNames": "id", + "referencedTableName": "armor_types" + } + } + ] + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/ability_modifiers.json b/src/main/resources/db/0.0.4/schema/ability_modifiers.json new file mode 100644 index 0000000..f5b1617 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/ability_modifiers.json @@ -0,0 +1,105 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ability_modifiers table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "ability_modifiers", + "columns": [ + { + "column": { + "name": "id", + "type": "int", + "autoIncrement": true, + "constraints": { + "primaryKey": true, + "nullable": false + } + } + },{ + "column": { + "name": "reference", + "type": "varchar(255)" + } + },{ + "column": { + "name": "usage_type", + "type": "varchar(255)" + } + },{ + "column": { + "name": "value", + "type": "number" + } + },{ + "column": { + "name": "target", + "type": "varchar(255)" + } + },{ + "column": { + "name": "probability_of_applying", + "type": "number" + } + },{ + "column": { + "name": "exclusive", + "type": "boolean" + } + },{ + "column": { + "name": "application_type", + "type": "varchar(255)" + } + },{ + "column": { + "name": "ability_id", + "type": "int", + "constraints": { + "nullable": false + } + } + } + ] + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "ability_id", + "baseTableName": "ability_modifiers", + "constraintName": "fk_ability_ability_modifiers", + "referencedColumnNames": "id", + "referencedTableName": "abilities", + "onDelete": "CASCADE" + } + } + ] + } + }, + { + "changeSet": { + "id": "Add max_life_time to ability_modifiers", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "max_life_time", + "type": "number" + } + } + ], + "tableName": "ability_modifiers" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/ability_requirements.json b/src/main/resources/db/0.0.4/schema/ability_requirements.json new file mode 100644 index 0000000..4edebcb --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/ability_requirements.json @@ -0,0 +1,59 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ability_requirements table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "ability_requirements", + "columns": [ + { + "column": { + "name": "id", + "type": "int", + "autoIncrement": true, + "constraints": { + "primaryKey": true, + "nullable": false + } + } + },{ + "column": { + "name": "reference", + "type": "varchar(255)" + } + },{ + "column": { + "name": "value", + "type": "varchar(255)" + } + },{ + "column": { + "name": "ability_id", + "type": "int", + "constraints": { + "nullable": false + } + } + } + ] + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "ability_id", + "baseTableName": "ability_requirements", + "constraintName": "fk_ability_ability_requirements", + "referencedColumnNames": "id", + "referencedTableName": "abilities", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/ability_target_filter.json b/src/main/resources/db/0.0.4/schema/ability_target_filter.json new file mode 100644 index 0000000..fb7645e --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/ability_target_filter.json @@ -0,0 +1,58 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ability_target_filter table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "ability_target_filter", + "columns": [ + { + "column": { + "name": "ability_id", + "type": "int", + "constraints": { + "primaryKey": true, + "nullable": false + } + } + }, + { + "column": { + "name": "armor_type_id", + "type": "varchar(50)", + "constraints": { + "primaryKey": true, + "nullable": false + } + } + },{ + "addForeignKeyConstraint": + { + "constraintName": "fk_ability_ability_target_filter", + "baseColumnNames": "ability_id", + "baseTableName": "ability_target_filter", + "referencedColumnNames": "id", + "referencedTableName": "abilities", + "onDelete": "CASCADE" + } + },{ + "addForeignKeyConstraint": + { + "constraintName": "fk_armor_type_ability_target_filter", + "baseColumnNames": "armor_type_id", + "baseTableName": "ability_target_filter", + "referencedColumnNames": "id", + "referencedTableName": "armor_types" + } + } + ] + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/activation.json b/src/main/resources/db/0.0.4/schema/activation.json new file mode 100644 index 0000000..db6ca0a --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/activation.json @@ -0,0 +1,34 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add activation table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "activation", + "columns": [ + { + "column": { + "name": "id", + "type": "varchar(255)", + "constraints": { + "primaryKey": true, + "nullable": false + } + } + },{ + "column": { + "name": "name", + "type": "varchar(255)" + } + } + ] + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/addon_modifiers.json b/src/main/resources/db/0.0.4/schema/addon_modifiers.json new file mode 100644 index 0000000..6a180ae --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/addon_modifiers.json @@ -0,0 +1,35 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add probability_of_applying, exclusive and application_type to addon modifiers", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "probability_of_applying", + "type": "number" + } + },{ + "column": { + "name": "exclusive", + "type": "boolean" + } + },{ + "column": { + "name": "application_type", + "type": "varchar(255)" + } + } + ], + "tableName": "addon_modifiers" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/area_effect.json b/src/main/resources/db/0.0.4/schema/area_effect.json new file mode 100644 index 0000000..c711fac --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/area_effect.json @@ -0,0 +1,34 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add area_effect table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "area_effect", + "columns": [ + { + "column": { + "name": "id", + "type": "varchar(255)", + "constraints": { + "primaryKey": true, + "nullable": false + } + } + },{ + "column": { + "name": "name", + "type": "varchar(255)" + } + } + ] + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/area_filter.json b/src/main/resources/db/0.0.4/schema/area_filter.json new file mode 100644 index 0000000..99d6b53 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/area_filter.json @@ -0,0 +1,34 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add area_filter table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "area_filter", + "columns": [ + { + "column": { + "name": "id", + "type": "varchar(255)", + "constraints": { + "primaryKey": true, + "nullable": false + } + } + },{ + "column": { + "name": "name", + "type": "varchar(255)" + } + } + ] + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/building_abilities.json b/src/main/resources/db/0.0.4/schema/building_abilities.json new file mode 100644 index 0000000..a9db7dd --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/building_abilities.json @@ -0,0 +1,66 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add building_abilities table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "building_abilities", + "columns": [ + { + "column": { + "name": "building_id", + "type": "int", + "constraints": { + "nullable": false + } + } + }, + { + "column": { + "name": "ability_id", + "type": "int", + "constraints": { + "nullable": false + } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "building_id, ability_id", + "constraintName": "uc_building_ability", + "tableName": "building_abilities" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "building_id", + "baseTableName": "building_abilities", + "constraintName": "fk_buildings_building_abilities", + "referencedColumnNames": "id", + "referencedTableName": "buildings", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "ability_id", + "baseTableName": "building_abilities", + "constraintName": "fk_abilities_building_abilities", + "referencedColumnNames": "id", + "referencedTableName": "abilities", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/building_addons.json b/src/main/resources/db/0.0.4/schema/building_addons.json new file mode 100644 index 0000000..7f11aef --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/building_addons.json @@ -0,0 +1,25 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ui_hotkey_name column to building_addons", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "ui_hotkey_name", + "type": "varchar(255)" + } + } + ], + "tableName": "building_addons" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/building_modifiers.json b/src/main/resources/db/0.0.4/schema/building_modifiers.json new file mode 100644 index 0000000..b36baf2 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/building_modifiers.json @@ -0,0 +1,35 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add probability_of_applying, exclusive and application_type to building_modifiers", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "probability_of_applying", + "type": "number" + } + },{ + "column": { + "name": "exclusive", + "type": "boolean" + } + },{ + "column": { + "name": "application_type", + "type": "varchar(255)" + } + } + ], + "tableName": "building_modifiers" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/buildings.json b/src/main/resources/db/0.0.4/schema/buildings.json new file mode 100644 index 0000000..950e771 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/buildings.json @@ -0,0 +1,25 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ui_hotkey_name column to buildings", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "ui_hotkey_name", + "type": "varchar(255)" + } + } + ], + "tableName": "buildings" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/research_modifiers.json b/src/main/resources/db/0.0.4/schema/research_modifiers.json new file mode 100644 index 0000000..8a9b823 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/research_modifiers.json @@ -0,0 +1,35 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add probability_of_applying and exclusive to research_modifiers", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "probability_of_applying", + "type": "number" + } + },{ + "column": { + "name": "exclusive", + "type": "boolean" + } + },{ + "column": { + "name": "application_type", + "type": "varchar(255)" + } + } + ], + "tableName": "research_modifiers" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/researches.json b/src/main/resources/db/0.0.4/schema/researches.json new file mode 100644 index 0000000..e9ae2a5 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/researches.json @@ -0,0 +1,25 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ui_hotkey_name column to researches", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "ui_hotkey_name", + "type": "varchar(255)" + } + } + ], + "tableName": "researches" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/sergeant_abilities.json b/src/main/resources/db/0.0.4/schema/sergeant_abilities.json new file mode 100644 index 0000000..91ecc47 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/sergeant_abilities.json @@ -0,0 +1,66 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add sergeant_abilities table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "sergeant_abilities", + "columns": [ + { + "column": { + "name": "sergeant_id", + "type": "int", + "constraints": { + "nullable": false + } + } + }, + { + "column": { + "name": "ability_id", + "type": "int", + "constraints": { + "nullable": false + } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "sergeant_id, ability_id", + "constraintName": "uc_sergeant_ability", + "tableName": "sergeant_abilities" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "sergeant_id", + "baseTableName": "sergeant_abilities", + "constraintName": "fk_sergeants_sergeant_abilities", + "referencedColumnNames": "id", + "referencedTableName": "sergeants", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "ability_id", + "baseTableName": "sergeant_abilities", + "constraintName": "fk_abilities_sergeant_abilities", + "referencedColumnNames": "id", + "referencedTableName": "abilities", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/sergeant_affected_buildings.json b/src/main/resources/db/0.0.4/schema/sergeant_affected_buildings.json new file mode 100644 index 0000000..e9f8ae3 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/sergeant_affected_buildings.json @@ -0,0 +1,60 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add sergeant_affected_buildings table", + "author": "ai_assistant", + "changes": [ + { + "createTable": { + "tableName": "sergeant_affected_buildings", + "columns": [ + { + "column": { + "name": "sergeant_id", + "type": "int", + "constraints": { "nullable": false } + } + }, + { + "column": { + "name": "building_id", + "type": "int", + "constraints": { "nullable": false } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "sergeant_id, building_id", + "constraintName": "uc_sergeant_affected_buildings", + "tableName": "sergeant_affected_buildings" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "sergeant_id", + "baseTableName": "sergeant_affected_buildings", + "constraintName": "fk_sergeant_aff_build_sergeant", + "referencedColumnNames": "id", + "referencedTableName": "sergeants", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "building_id", + "baseTableName": "sergeant_affected_buildings", + "constraintName": "fk_sergeant_aff_build_building", + "referencedColumnNames": "id", + "referencedTableName": "buildings", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/sergeant_affected_sergeants.json b/src/main/resources/db/0.0.4/schema/sergeant_affected_sergeants.json new file mode 100644 index 0000000..47e3a89 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/sergeant_affected_sergeants.json @@ -0,0 +1,60 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add sergeant_affected_sergeants table", + "author": "ai_assistant", + "changes": [ + { + "createTable": { + "tableName": "sergeant_affected_sergeants", + "columns": [ + { + "column": { + "name": "sergeant_id", + "type": "int", + "constraints": { "nullable": false } + } + }, + { + "column": { + "name": "sergeant_id_affected", + "type": "int", + "constraints": { "nullable": false } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "sergeant_id, sergeant_id_affected", + "constraintName": "uc_sergeant_affected_sergeants", + "tableName": "sergeant_affected_sergeants" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "sergeant_id", + "baseTableName": "sergeant_affected_sergeants", + "constraintName": "fk_sergeant_aff_serg_main", + "referencedColumnNames": "id", + "referencedTableName": "sergeants", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "sergeant_id_affected", + "baseTableName": "sergeant_affected_sergeants", + "constraintName": "fk_sergeant_aff_serg_target", + "referencedColumnNames": "id", + "referencedTableName": "sergeants", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/sergeant_affected_units.json b/src/main/resources/db/0.0.4/schema/sergeant_affected_units.json new file mode 100644 index 0000000..443be83 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/sergeant_affected_units.json @@ -0,0 +1,60 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add sergeant_affected_units table", + "author": "ai_assistant", + "changes": [ + { + "createTable": { + "tableName": "sergeant_affected_units", + "columns": [ + { + "column": { + "name": "sergeant_id", + "type": "int", + "constraints": { "nullable": false } + } + }, + { + "column": { + "name": "unit_id", + "type": "int", + "constraints": { "nullable": false } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "sergeant_id, unit_id", + "constraintName": "uc_sergeant_affected_units", + "tableName": "sergeant_affected_units" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "sergeant_id", + "baseTableName": "sergeant_affected_units", + "constraintName": "fk_sergeant_aff_units_sergeant", + "referencedColumnNames": "id", + "referencedTableName": "sergeants", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "unit_id", + "baseTableName": "sergeant_affected_units", + "constraintName": "fk_sergeant_aff_units_unit", + "referencedColumnNames": "id", + "referencedTableName": "units", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/sergeant_affected_weapons.json b/src/main/resources/db/0.0.4/schema/sergeant_affected_weapons.json new file mode 100644 index 0000000..6b39193 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/sergeant_affected_weapons.json @@ -0,0 +1,60 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add sergeant_affected_weapons table", + "author": "ai_assistant", + "changes": [ + { + "createTable": { + "tableName": "sergeant_affected_weapons", + "columns": [ + { + "column": { + "name": "sergeant_id", + "type": "int", + "constraints": { "nullable": false } + } + }, + { + "column": { + "name": "weapon_id", + "type": "int", + "constraints": { "nullable": false } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "sergeant_id, weapon_id", + "constraintName": "uc_sergeant_affected_weapons", + "tableName": "sergeant_affected_weapons" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "sergeant_id", + "baseTableName": "sergeant_affected_weapons", + "constraintName": "fk_sergeant_aff_weap_sergeant", + "referencedColumnNames": "id", + "referencedTableName": "sergeants", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": { + "baseColumnNames": "weapon_id", + "baseTableName": "sergeant_affected_weapons", + "constraintName": "fk_sergeant_aff_weap_weapon", + "referencedColumnNames": "id", + "referencedTableName": "weapons", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/sergeant_modifiers.json b/src/main/resources/db/0.0.4/schema/sergeant_modifiers.json new file mode 100644 index 0000000..1f2fd1c --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/sergeant_modifiers.json @@ -0,0 +1,84 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add sergeant_modifiers table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "sergeant_modifiers", + "columns": [ + { + "column": { + "name": "id", + "type": "int", + "autoIncrement": true, + "constraints": { + "primaryKey": true, + "nullable": false + } + } + },{ + "column": { + "name": "reference", + "type": "varchar(255)" + } + },{ + "column": { + "name": "usage_type", + "type": "varchar(255)" + } + },{ + "column": { + "name": "value", + "type": "number" + } + },{ + "column": { + "name": "target", + "type": "varchar(255)" + } + },{ + "column": { + "name": "probability_of_applying", + "type": "number" + } + },{ + "column": { + "name": "exclusive", + "type": "boolean" + } + },{ + "column": { + "name": "application_type", + "type": "varchar(255)" + } + },{ + "column": { + "name": "sergeant_id", + "type": "int", + "constraints": { + "nullable": false + } + } + } + ] + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "sergeant_id", + "baseTableName": "sergeant_modifiers", + "constraintName": "fk_sergeant_sergeant_modifiers", + "referencedColumnNames": "id", + "referencedTableName": "sergeants", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/sergeants.json b/src/main/resources/db/0.0.4/schema/sergeants.json new file mode 100644 index 0000000..3f746b2 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/sergeants.json @@ -0,0 +1,52 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ui_hotkey_name column to sergeants", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "ui_hotkey_name", + "type": "varchar(255)" + } + } + ], + "tableName": "sergeants" + } + } + ] + } + }, + { + "changeSet": { + "id": "Add morale data to sergeants", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "morale_income_max", + "type": "number" + } + }, + { + "column": { + "name": "morale_income_rate", + "type": "number" + } + } + ], + "tableName": "sergeants" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/unit_abilities.json b/src/main/resources/db/0.0.4/schema/unit_abilities.json new file mode 100644 index 0000000..6274b4a --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/unit_abilities.json @@ -0,0 +1,66 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add unit_abilities table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "unit_abilities", + "columns": [ + { + "column": { + "name": "unit_id", + "type": "int", + "constraints": { + "nullable": false + } + } + }, + { + "column": { + "name": "ability_id", + "type": "int", + "constraints": { + "nullable": false + } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "unit_id, ability_id", + "constraintName": "uc_unit_ability", + "tableName": "unit_abilities" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "unit_id", + "baseTableName": "unit_abilities", + "constraintName": "fk_units_unit_abilities", + "referencedColumnNames": "id", + "referencedTableName": "units", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "ability_id", + "baseTableName": "unit_abilities", + "constraintName": "fk_abilities_unit_abilities", + "referencedColumnNames": "id", + "referencedTableName": "abilities", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/unit_affected_buildings.json b/src/main/resources/db/0.0.4/schema/unit_affected_buildings.json new file mode 100644 index 0000000..a52b263 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/unit_affected_buildings.json @@ -0,0 +1,66 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add unit_affected_buildings table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "unit_affected_buildings", + "columns": [ + { + "column": { + "name": "unit_id", + "type": "int", + "constraints": { + "nullable": false + } + } + }, + { + "column": { + "name": "building_id", + "type": "int", + "constraints": { + "nullable": false + } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "unit_id, building_id", + "constraintName": "uc_unit_affected_buildings_unit_id_building_id", + "tableName": "unit_affected_buildings" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "unit_id", + "baseTableName": "unit_affected_buildings", + "constraintName": "fk_researches_researches_affected_buildings", + "referencedColumnNames": "id", + "referencedTableName": "units", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "building_id", + "baseTableName": "unit_affected_buildings", + "constraintName": "fk_buildings_researches_affected_buildings", + "referencedColumnNames": "id", + "referencedTableName": "buildings", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/unit_affected_sergeants.json b/src/main/resources/db/0.0.4/schema/unit_affected_sergeants.json new file mode 100644 index 0000000..3a978f2 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/unit_affected_sergeants.json @@ -0,0 +1,66 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add units_affected_sergeants table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "units_affected_sergeants", + "columns": [ + { + "column": { + "name": "unit_id", + "type": "int", + "constraints": { + "nullable": false + } + } + }, + { + "column": { + "name": "sergeant_id", + "type": "int", + "constraints": { + "nullable": false + } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "unit_id, sergeant_id", + "constraintName": "uc_units_affected_sergeants_unit_id_sergeant_id", + "tableName": "units_affected_sergeants" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "unit_id", + "baseTableName": "units_affected_sergeants", + "constraintName": "fk_units_units_affected_sergeants", + "referencedColumnNames": "id", + "referencedTableName": "units", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "sergeant_id", + "baseTableName": "units_affected_sergeants", + "constraintName": "fk_sergeants_units_affected_sergeants", + "referencedColumnNames": "id", + "referencedTableName": "sergeants", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/unit_affected_units.json b/src/main/resources/db/0.0.4/schema/unit_affected_units.json new file mode 100644 index 0000000..fa54f77 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/unit_affected_units.json @@ -0,0 +1,66 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add unit_affected_units table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "unit_affected_units", + "columns": [ + { + "column": { + "name": "unit_id", + "type": "int", + "constraints": { + "nullable": false + } + } + }, + { + "column": { + "name": "unit_id_affected", + "type": "int", + "constraints": { + "nullable": false + } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "unit_id, unit_id_affected", + "constraintName": "uc_unit_affected_units_unit_id_unit_id_affected", + "tableName": "unit_affected_units" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "unit_id", + "baseTableName": "unit_affected_units", + "constraintName": "fk_unit_affected_units_units", + "referencedColumnNames": "id", + "referencedTableName": "units", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "unit_id_affected", + "baseTableName": "unit_affected_units", + "constraintName": "fk_unit_affected_units_units_2", + "referencedColumnNames": "id", + "referencedTableName": "units", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/unit_affected_weapons.json b/src/main/resources/db/0.0.4/schema/unit_affected_weapons.json new file mode 100644 index 0000000..1ac6898 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/unit_affected_weapons.json @@ -0,0 +1,66 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add unit_affected_weapons table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "unit_affected_weapons", + "columns": [ + { + "column": { + "name": "unit_id", + "type": "int", + "constraints": { + "nullable": false + } + } + }, + { + "column": { + "name": "weapon_id", + "type": "int", + "constraints": { + "nullable": false + } + } + } + ] + } + }, + { + "addUniqueConstraint": { + "columnNames": "unit_id, weapon_id", + "constraintName": "uc_unit_affected_weapons_unit_id_weapon_id", + "tableName": "unit_affected_weapons" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "unit_id", + "baseTableName": "unit_affected_weapons", + "constraintName": "fk_unit_affected_weapons_units", + "referencedColumnNames": "id", + "referencedTableName": "units", + "onDelete": "CASCADE" + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "weapon_id", + "baseTableName": "unit_affected_weapons", + "constraintName": "fk_unit_affected_weapons_weapons", + "referencedColumnNames": "id", + "referencedTableName": "weapons", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/unit_modifiers.json b/src/main/resources/db/0.0.4/schema/unit_modifiers.json new file mode 100644 index 0000000..b08c46d --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/unit_modifiers.json @@ -0,0 +1,105 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add unit_modifiers table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "unit_modifiers", + "columns": [ + { + "column": { + "name": "id", + "type": "int", + "autoIncrement": true, + "constraints": { + "primaryKey": true, + "nullable": false + } + } + },{ + "column": { + "name": "reference", + "type": "varchar(255)" + } + },{ + "column": { + "name": "usage_type", + "type": "varchar(255)" + } + },{ + "column": { + "name": "value", + "type": "number" + } + },{ + "column": { + "name": "target", + "type": "varchar(255)" + } + },{ + "column": { + "name": "probability_of_applying", + "type": "number" + } + },{ + "column": { + "name": "exclusive", + "type": "boolean" + } + },{ + "column": { + "name": "application_type", + "type": "varchar(255)" + } + },{ + "column": { + "name": "unit_id", + "type": "int", + "constraints": { + "nullable": false + } + } + } + ] + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "unit_id", + "baseTableName": "unit_modifiers", + "constraintName": "fk_unit_unit_modifiers", + "referencedColumnNames": "id", + "referencedTableName": "units", + "onDelete": "CASCADE" + } + } + ] + } + }, + { + "changeSet": { + "id": "Add max_life_time to unit_modifiers", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "max_life_time", + "type": "number" + } + } + ], + "tableName": "unit_modifiers" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/units.json b/src/main/resources/db/0.0.4/schema/units.json new file mode 100644 index 0000000..e8914ec --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/units.json @@ -0,0 +1,25 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ui_hotkey_name column to units", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "ui_hotkey_name", + "type": "varchar(255)" + } + } + ], + "tableName": "units" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/weapon_modifiers.json b/src/main/resources/db/0.0.4/schema/weapon_modifiers.json new file mode 100644 index 0000000..cb340b3 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/weapon_modifiers.json @@ -0,0 +1,89 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add weapon_modifiers table", + "author": "anibus", + "changes": [ + { + "createTable": { + "tableName": "weapon_modifiers", + "columns": [ + { + "column": { + "name": "id", + "type": "int", + "autoIncrement": true, + "constraints": { + "primaryKey": true, + "nullable": false + } + } + },{ + "column": { + "name": "reference", + "type": "varchar(255)" + } + },{ + "column": { + "name": "usage_type", + "type": "varchar(255)" + } + },{ + "column": { + "name": "value", + "type": "number" + } + },{ + "column": { + "name": "target", + "type": "varchar(255)" + } + },{ + "column": { + "name": "probability_of_applying", + "type": "number" + } + },{ + "column": { + "name": "exclusive", + "type": "boolean" + } + },{ + "column": { + "name": "application_type", + "type": "varchar(255)" + } + },{ + "column": { + "name": "max_life_time", + "type": "number" + } + },{ + "column": { + "name": "weapon_id", + "type": "int", + "constraints": { + "nullable": false + } + } + } + ] + } + }, + { + "addForeignKeyConstraint": + { + "baseColumnNames": "weapon_id", + "baseTableName": "weapon_modifiers", + "constraintName": "fk_weapon_weapon_modifiers", + "referencedColumnNames": "id", + "referencedTableName": "weapons", + "onDelete": "CASCADE" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/0.0.4/schema/weapons.json b/src/main/resources/db/0.0.4/schema/weapons.json new file mode 100644 index 0000000..53c09a0 --- /dev/null +++ b/src/main/resources/db/0.0.4/schema/weapons.json @@ -0,0 +1,25 @@ +{ + "databaseChangeLog": [ + { + "changeSet": { + "id": "Add ui_hotkey_name column to weapons", + "author": "anibus", + "changes": [ + { + "addColumn": { + "columns": [ + { + "column": { + "name": "ui_hotkey_name", + "type": "varchar(255)" + } + } + ], + "tableName": "weapons" + } + } + ] + } + } + ] +} diff --git a/src/main/resources/db/changelog-master.json b/src/main/resources/db/changelog-master.json index 58d8816..b96527d 100644 --- a/src/main/resources/db/changelog-master.json +++ b/src/main/resources/db/changelog-master.json @@ -237,6 +237,158 @@ "include": { "file": "db/0.0.3/schema/building_affected_weapons.json" } + },{ + "include": { + "file": "db/0.0.4/schema/addon_modifiers.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/building_modifiers.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/research_modifiers.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/unit_modifiers.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/sergeant_modifiers.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/weapon_modifiers.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/buildings.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/researches.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/sergeants.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/units.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/weapons.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/abilities.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/ability_modifiers.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/ability_requirements.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/ability_armors_piercing.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/unit_abilities.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/building_abilities.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/sergeant_abilities.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/activation.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/area_effect.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/area_filter.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/building_addons.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/ability_affected_buildings.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/ability_affected_sergeants.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/ability_affected_units.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/ability_affected_weapons.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/sergeant_affected_buildings.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/sergeant_affected_sergeants.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/sergeant_affected_units.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/sergeant_affected_weapons.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/unit_affected_buildings.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/unit_affected_sergeants.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/unit_affected_units.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/unit_affected_weapons.json" + } + },{ + "include": { + "file": "db/0.0.4/schema/ability_target_filter.json" + } + },{ + "include": { + "file": "db/0.0.4/data/activation.json" + } + },{ + "include": { + "file": "db/0.0.4/data/area_effect.json" + } + },{ + "include": { + "file": "db/0.0.4/data/area_filter.json" + } } ] }