1. We have added a Gift Upgrades feature that allows you to gift an account upgrade to another member, just in time for the holiday season. You can see the gift option when going to the Account Upgrades screen, or on any user profile screen.
    Dismiss Notice

Cromcrom lua stuff and questions about terrain features attrition mod

Discussion in 'Civ6 - Creation & Customization' started by cromcrom, Mar 26, 2017.

  1. anansethespider

    anansethespider Warlord

    Joined:
    Oct 27, 2016
    Messages:
    289
    Gender:
    Male
    Mountain should be the highest risk/most damage, because it's not even passable terrain in the base game. Speaking as a citizen of Chicago, ice is dangerous but icy mountains are much, much more dangerous!
     
  2. cromcrom

    cromcrom Cernu

    Joined:
    Nov 11, 2005
    Messages:
    268
    Gender:
    Male
    Location:
    Chateauroux
    Code:
    function damageAndDestroyUnit(pPlayer,iUnit,minDam,maxDam)
     local tKillUnits = {}
     local pPlayerToCheck = Players[pPlayer]
     local pUnits = pPlayerToCheck:GetUnits()
     for i, pUnit in pUnits:Members() do
      if(tostring(pUnit:GetID()) == tostring(iUnit)) then
       local unitDamage = math.random(minDam,maxDam)
       if (pUnit:GetDamage() + unitDamage) >= 100 then
        table.insert(tKillUnits, pUnit)
       else
        pUnit:ChangeDamage(unitDamage)
        print("inflicted "..unitDamage.." to unit")
       end
      end
     end
     --now we've completed the iteration through table pUnits:Members() and can safely delete units listed as members
     for k,pUnit in pairs(tKillUnits) do
      pUnits:Destroy(pUnit)
      print("a unit was destroyed because of attrition")
     end   
    end
    function Attrition(PlayerID,UnitID,UnitX,UnitY)
     --local localPlayer        = Players[0]
     local BaseAttritionMin,BaseAttritionMax = 3,10
     
     local TerrainAttritionMul,CataChance,TerrainCataMul = 1,15,2
     
     local feedBack = false
     if PlayerID == 0 then feedBack = true end
     
     local plotToCheck = Map.GetPlot(UnitX,UnitY) 
     local tTerrain = GameInfo.Terrains[plotToCheck:GetTerrainType()].TerrainType
     print(tTerrain)
     if tTerrain == "TERRAIN_DESERT" then 
      TerrainAttritionMul = 3
      CataChance = 15
      TerrainCataMul = 5
     elseif tTerrain == "TERRAIN_DESERT_HILLS" then
      TerrainAttritionMul = 3
      CataChance = 25
      TerrainCataMul = 5
     elseif tTerrain == "TERRAIN_DESERT_MOUNTAIN" then
      TerrainAttritionMul = 4
      CataChance = 35
      TerrainCataMul = 7 
     elseif tTerrain == "TERRAIN_GRASS_MOUNTAIN" then
      TerrainAttritionMul = 3
      CataChance = 35
      TerrainCataMul = 5
     elseif tTerrain == "TERRAIN_PLAINS_MOUNTAIN" then
      TerrainAttritionMul = 3
      CataChance = 35
      TerrainCataMul = 5 
     elseif tTerrain == "TERRAIN_TUNDRA" then
      TerrainAttritionMul = 2
      CataChance = 15
      TerrainCataMul = 3 
     elseif tTerrain == "TERRAIN_TUNDRA_HILLS" then
      TerrainAttritionMul = 2
      CataChance = 25
      TerrainCataMul = 3 
     elseif tTerrain == "TERRAIN_TUNDRA_MOUNTAIN" then
      TerrainAttritionMul = 2
      CataChance = 45
      TerrainCataMul = 7 
     elseif tTerrain == "TERRAIN_SNOW" then
      TerrainAttritionMul = 3
      CataChance = 20
      TerrainCataMul = 4
     elseif tTerrain == "TERRAIN_SNOW_HILLS" then
      TerrainAttritionMul = 3
      CataChance = 30
      TerrainCataMul = 5
     elseif tTerrain == "TERRAIN_SNOW_MOUNTAIN" then
      TerrainAttritionMul = 3
      CataChance = 60
      TerrainCataMul = 8
     elseif tTerrain == "TERRAIN_COAST" then
      TerrainAttritionMul = 2
      CataChance = 30
      TerrainCataMul = 4
     elseif tTerrain == "TERRAIN_OCEAN" then
      TerrainAttritionMul = 2
      CataChance = 50
      TerrainCataMul = 5 
     end
     
     if plotToCheck:GetFeatureType() > -1 then 
      local plotFeature = GameInfo.Features[plotToCheck:GetFeatureType()].FeatureType
      print(plotFeature)  
      if plotFeature == "FEATURE_ICE" then
       TerrainAttritionMul = 3
       CataChance = 60
       TerrainCataMul = 6
      end
      if plotFeature == "FEATURE_JUNGLE" then
       TerrainAttritionMul = 4
       CataChance = 20
       TerrainCataMul = 5  
      end
      if plotFeature == "FEATURE_MARSH" then
       TerrainAttritionMul = 3
       CataChance = 30
       TerrainCataMul = 5  
      end
      if plotFeature == "FEATURE_OASIS" then
       TerrainAttritionMul = 1
       CataChance = 15
       TerrainCataMul = 4 
      end
     end
      -- if plotToCheck:isRoute() then
       -- print("There is a route here, so much less attrition.")
       -- CataChance = CataChance/5
       -- TerrainCataMul = 1
       -- TerrainAttritionMul = 0.1
      -- end 
      
      if math.random(1,100) <= CataChance then
       TerrainAttritionMul = TerrainCataMul
       if feedBack then
        Game.AddWorldViewText(0, "A catastrophe happened to this unit while moving", UnitX, UnitY, 0)
        print("A catastrophe happened to this unit while moving")
       end
      end
    
      
      BaseAttritionMin = BaseAttritionMin*TerrainAttritionMul
      BaseAttritionMax = BaseAttritionMax*TerrainAttritionMul 
      print(BaseAttritionMin,BaseAttritionMax)
      damageAndDestroyUnit(PlayerID,UnitID,BaseAttritionMin,BaseAttritionMax)
      
      -- local plotName = plotToCheck:GetTerrainType()
      -- local plotType = GameInfo.Terrains[plotToCheck:GetTerrainType()].TerrainType
      -- print(plotType)
      -- print(plotToCheck:GetFeatureType())
      -- if plotToCheck:GetFeatureType() > -1 then
      -- local plotFeature = GameInfo.Features[plotToCheck:GetFeatureType()].FeatureType
      -- print(plotFeature)
      -- end
     end
    
    Events.UnitMoved.Add(Attrition)
    
    This works as intended so far. Inflicts damage on moving units. Terrains mostly increase damage, and give a chance for a catastrophe to happen, that will increase damage even more. I have feedback on the map in case of catastrophe.

    I have an issue tho with roads, but it is quite late over here, I will have a better look tomorrow.

    I will make the mountains passable (should be easy with SQL and the great tuts here and there), and release the mod, hopefully in a few days. Cheers.
     
  3. cromcrom

    cromcrom Cernu

    Joined:
    Nov 11, 2005
    Messages:
    268
    Gender:
    Male
    Location:
    Chateauroux
    Released on Steam.

    Here is the lua code:
    Code:
    function damageAndDestroyUnit(pPlayer,iUnit,minDam,maxDam)
     local tKillUnits = {}
     local pPlayerToCheck = Players[pPlayer]
     local pUnits = pPlayerToCheck:GetUnits()
     for i, pUnit in pUnits:Members() do
      if(tostring(pUnit:GetID()) == tostring(iUnit)) then
       local unitDamage = math.random(minDam,maxDam)
       if (pUnit:GetDamage() + unitDamage) >= 100 then
        table.insert(tKillUnits, pUnit)
       else
        pUnit:ChangeDamage(unitDamage)
        print("inflicted "..unitDamage.." to unit")
       end
      end
     end
     --now we've completed the iteration through table pUnits:Members() and can safely delete units listed as members
     for k,pUnit in pairs(tKillUnits) do
      pUnits:Destroy(pUnit)
      print("a unit was destroyed because of attrition")
     end  
    end
    
    function Attrition(PlayerID,UnitID,UnitX,UnitY)
    
     -- set base values for variables
     local BaseAttritionMin,BaseAttritionMax = 1,6
     local TerrainAttritionMul,CataChance,TerrainCataMul = 1,15,2
     local experienceFromCata = false
     local feedBack = false
     
     -- give feedback only to player
     if PlayerID == 0 then feedBack = true end
     
     -- set values for terrains
     local plotToCheck = Map.GetPlot(UnitX,UnitY)
     local tTerrain = GameInfo.Terrains[plotToCheck:GetTerrainType()].TerrainType
     print(tTerrain)
     if tTerrain == "TERRAIN_DESERT" then
      TerrainAttritionMul = 3
      CataChance = 15
      TerrainCataMul = 5
     elseif tTerrain == "TERRAIN_DESERT_HILLS" then
      TerrainAttritionMul = 3
      CataChance = 25
      TerrainCataMul = 5
     elseif tTerrain == "TERRAIN_DESERT_MOUNTAIN" then
      TerrainAttritionMul = 4
      CataChance = 35
      TerrainCataMul = 7
     elseif tTerrain == "TERRAIN_GRASS_MOUNTAIN" then
      TerrainAttritionMul = 3
      CataChance = 35
      TerrainCataMul = 5
     elseif tTerrain == "TERRAIN_PLAINS_MOUNTAIN" then
      TerrainAttritionMul = 3
      CataChance = 35
      TerrainCataMul = 5
     elseif tTerrain == "TERRAIN_TUNDRA" then
      TerrainAttritionMul = 2
      CataChance = 15
      TerrainCataMul = 3
     elseif tTerrain == "TERRAIN_TUNDRA_HILLS" then
      TerrainAttritionMul = 2
      CataChance = 25
      TerrainCataMul = 3
     elseif tTerrain == "TERRAIN_TUNDRA_MOUNTAIN" then
      TerrainAttritionMul = 2
      CataChance = 45
      TerrainCataMul = 7
     elseif tTerrain == "TERRAIN_SNOW" then
      TerrainAttritionMul = 3
      CataChance = 20
      TerrainCataMul = 4
     elseif tTerrain == "TERRAIN_SNOW_HILLS" then
      TerrainAttritionMul = 3
      CataChance = 30
      TerrainCataMul = 5
     elseif tTerrain == "TERRAIN_SNOW_MOUNTAIN" then
      TerrainAttritionMul = 3
      CataChance = 60
      TerrainCataMul = 8
     elseif tTerrain == "TERRAIN_COAST" then
      TerrainAttritionMul = 2
      CataChance = 30
      TerrainCataMul = 4
     elseif tTerrain == "TERRAIN_OCEAN" then
      TerrainAttritionMul = 2
      CataChance = 50
      TerrainCataMul = 5
     end
     -- check features. Takes precedence on terrain.
     if plotToCheck:GetFeatureType() > -1 then
      local plotFeature = GameInfo.Features[plotToCheck:GetFeatureType()].FeatureType
      print(plotFeature) 
      if plotFeature == "FEATURE_ICE" then
       TerrainAttritionMul = 3
       CataChance = 60
       TerrainCataMul = 6
      end
      if plotFeature == "FEATURE_JUNGLE" then
       TerrainAttritionMul = 4
       CataChance = 20
       TerrainCataMul = 5 
      end
      if plotFeature == "FEATURE_MARSH" then
       TerrainAttritionMul = 3
       CataChance = 30
       TerrainCataMul = 5 
      end
      if plotFeature == "FEATURE_OASIS" then
       TerrainAttritionMul = 1
       CataChance = 15
       TerrainCataMul = 4
      end
     end
     -- reduce attrition and cata chance if road on plot.
     if plotToCheck:GetRouteType() > -1 then
      print("There is a route here, so much less attrition.")
      CataChance = CataChance/5
      TerrainCataMul = 1
      TerrainAttritionMul = 0.1
     end
     -- check cata chance
     if math.random(1,100) <= CataChance then
      experienceFromCata = true
      TerrainAttritionMul = TerrainCataMul
      if feedBack then
       Game.AddWorldViewText(0, "A catastrophe happened to this unit while moving", UnitX, UnitY, 0)
      end
     end
     -- deal damages
     BaseAttritionMin = BaseAttritionMin*TerrainAttritionMul
     BaseAttritionMax = BaseAttritionMax*TerrainAttritionMul
     damageAndDestroyUnit(PlayerID,UnitID,BaseAttritionMin,BaseAttritionMax)
     
     -- give XP if a cata happens. 
     if experienceFromCata then
      local pPlayerToCheck = Players[PlayerID]
      local pUnits = pPlayerToCheck:GetUnits()
      for i, pUnit in pUnits:Members() do
       if(tostring(pUnit:GetID()) == tostring(UnitID)) then
        local currentXP = pUnit:GetExperience()
        local currentXPPoints = currentXP:GetExperiencePoints()+5
        --currentXPPoints = currentXPPoints+5
        local experienceChangeAmount = math.random((BaseAttritionMin/10)+1,(BaseAttritionMax/10)+1)
        currentXP:ChangeExperience(experienceChangeAmount)
       end
      end
     end 
    end
    Events.UnitMoved.Add(Attrition)
    
    Now looking forward suggestions.
    I added a feature that gives a few XP to a unit if a catastrophe happens when the unit moves. For a little RPG feel :)
    Cheers.
     
    Last edited: Mar 28, 2017

Share This Page