[Skript] newBeach Transformation

Entwicklung und Vorstellung von LUA Skripten für ASC oder den Mapeditor

Moderator: Moderatoren2

Benutzeravatar
GAMER
General
General
Beiträge: 8852
Registriert: Sa 7. Mär 2009, 14:49
Einheitenset: Teccnols - SY

[Skript] newBeach Transformation

Beitrag von GAMER »

Das Skript, transformiert Karten mit ASC-Blauwasser und alten Objekt-BlauWasserküsten auf die neue UniStrandKüste/UniSteilKüste. Daneben kann es auch als "Smoth Coast" Funktion eingesetzt werden, wenn noch gar keine Küsten vorhanden sind. Das Script Checkt ebenfalls die Wasserabstufungen und korrigiert diese, wenn z.B. neben vsw, deep_water ist.
Funktioniert nur mit ASC v...105 und Beta 6-2010 oder ab z82 .


to do:
- Auswahl Transformation der verschiedenen Wasserarten(Türkis/GrünGrau)
- Auswahl Transformations-Radius der einzelnen Wassertiefen der Smoth-Funktion
- Auswahl Smoth-Water und/oder Beachtransformation

Code: Alles auswählen

-- This scripts places beach objects on land fields which have a sea-field nearby.
-- It also does some additional nonsense just to show off ;-)
--
-- Available in: mapeditor

--asc.infoMessage( 'Dieses Script wandelt alte ASC Objektküsten und Objekt-River in Wasserterrain und UNi-Küste/Strand. Fehlende Küstenfelder werden ergänzt. Das Script kann auch als "Smoth-Coast" Funktion verwendet werden.')


ovswater = asc.getObjectType( 2507 )
oswater  = asc.getObjectType( 2502 )
owater   = asc.getObjectType( 2503 )
odwater  = asc.getObjectType( 2509 )
oowater  = asc.getObjectType( 2504 )
orwater  = asc.getObjectType( 2500 )

tvswater = asc.getTerrainType( 2004 )
tswater  = asc.getTerrainType( 2002 )
twater   = asc.getTerrainType( 2001 )
tdwater  = asc.getTerrainType( 2003 )
towater  = asc.getTerrainType( 2000 )
-- Strand      
beach = asc.getObjectType( 2689 )
-- Wellen
waves = asc.getObjectType( 2690 )
-- Klippen alt
cliffs = asc.getObjectType ( 2401 )
-- Klippen neu
newcliffs = asc.getObjectType ( 2691 )

waterIDs = { 2004, 2002, 2001, 2003, 2000 }
waterTerr = { tvswater, tswater, twater, tdwater, towater }

-- ------------------------------------------------
-- Notwendige Funktionen
-- ------------------------------------------------

-- Funktion überprüfen von bestimmten Objekten
function ObjectCheck( Typ, position )
   local map = asc.getActiveMap()
   local field = map:getField(position)

   if not field then
      return false
   end

   obj1 = field:checkForObject( Typ )
   if obj1 ~= nil then
      return true
   end
   return false
end

-- Funktion überprüfen auf Wasser
function isWaterTerrain ( position , rand )
   local map = asc.getActiveMap()

   local field = map:getField(position)

   if rand == 'mit' then
      if not field then
         return true
      end
   else
      if not field then
         return false
      end
   end

   -- an array holding the names of terrain properties   
--   local waterFields = { 2004, 2002, 2001, 2003, 2000 }

   if  field:getTerrainType():getID() == 2004 then
      return true
   end
   if  field:getTerrainType():getID() == 2002 then
      return true
   end
   if  field:getTerrainType():getID() == 2001 then
      return true
   end
   if  field:getTerrainType():getID() == 2003 then
      return true
   end
   if  field:getTerrainType():getID() == 2000 then
      return true
   end
   -- we didn't find any water in the loop
   return false
end

-- ----------------------------------------------------------------------------------
-- ----------------------------------------------------------------------------------
map = asc.getActiveMap();
      
-- 1. Löschen von überflüssigen Objekten, einfache Kartentransformation

for y = 0, map:height()-1 do
   for x = 0, map:width()-1 do 
      posi = asc.MapCoordinate(x,y)
      field = map:getField(posi)
            
     -- Wasserobjekte unterhalb von Bergen löschen und in Wasserterrain und Wellen umwandeln

     --- very_shallow_water
     if ObjectCheck( ovswater, posi ) == true then
        if field:hasProperty ( 'mountains' ) then
           field:removeObject( ovswater )
        else
           field:changeTerrainType( tvswater )  
           asc.placeObject( map, posi, waves, true )
           field:removeObject( ovswater )
        end
     end

     --- shallow_water
     if ObjectCheck( oswater, posi ) == true then
        if field:hasProperty ( 'mountains' ) then
           field:removeObject( oswater )
        else
           field:changeTerrainType( tswater )  
           asc.placeObject( map, posi, waves, true )
           field:removeObject( oswater )
        end
     end

     --- water
     if ObjectCheck( owater, posi ) == true then
        if field:hasProperty ( 'mountains' ) then
           field:removeObject( owater )
        else
           field:changeTerrainType( twater )  
           asc.placeObject( map, posi, waves, true )
           field:removeObject( owater )
        end
     end

     --- deep_water
     if ObjectCheck( odwater, posi ) == true then
        if field:hasProperty ( 'mountains' ) then
           field:removeObject( odwater )
        else
           field:changeTerrainType( twater )  
           asc.placeObject( map, posi, waves, true )
           field:removeObject( odwater )
        end
     end

     --- ocean_water
     if ObjectCheck( oowater, posi ) == true then
        if field:hasProperty ( 'mountains' ) then
           field:removeObject( oowater )
        else
           field:changeTerrainType( twater )  
           asc.placeObject( map, posi, waves, true )
           field:removeObject( oowater )
        end
     end

     --- river
     if ObjectCheck( orwater, posi ) == true then
           field:changeTerrainType( twater )
           c = 0  
           for i = 0,5 do
              -- getting the field next to cursorpos in direction i
              p = asc.getNeighbouringFieldCoordinate( posi , i )
        
              if isWaterTerrain( p , 'mit' ) then
                 c = c + 1
              end
        
           end

           if c ~= 6 then
              asc.placeObject( map, posi, waves, true )
           end

           field:removeObject( orwater )
     end

     --- cliff
     if ObjectCheck( cliffs, posi ) == true then
           field:removeObject( cliffs )
           asc.placeObject( map, posi, newcliffs, true )
           asc.placeObject( map, posi, beach, true )
     end

   end
end

-- UniKüste Strand vervollständigen
for y = 0, map:height()-1 do
   for x = 0, map:width()-1 do 
      posi = asc.MapCoordinate(x,y)
      field = map:getField(posi)

      if isWaterTerrain( posi , 'ohne' ) == false then
      
         waterFoundOnNextField = false
      
         -- Felder rund herum auf Wasser prüfen
         for i = 0,5 do
            p = asc.getNeighbouringFieldCoordinate( posi, i )

            if isWaterTerrain( p , 'ohne' ) == true then
               waterFoundOnNextField = true
            end
            if ObjectCheck( waves , p ) == true then
               waterFoundOnNextField = true
            end
         end
      
         if waterFoundOnNextField == true then
            asc.placeObject( map, posi, beach, true )
         end
      
      end
   end
end

-- UniKüste Wellen vervollständigen und überflüssige entfernen
for y = 0, map:height()-1 do
   for x = 0, map:width()-1 do 
      posi = asc.MapCoordinate(x,y)
      field = map:getField(posi)
      truebeach = false
      truewaves = false

      -- (Wenn Cursorfeld Wasser ist)
      if isWaterTerrain( posi , ohne ) == true then
          -- (Felder rund herum auf beach prüfen !)
          for i = 0,5 do
             p = asc.getNeighbouringFieldCoordinate( posi, i )
             -- (Wenn Strand gefunden wurde ...)
             if ObjectCheck( beach , p ) == true then
                truebeach = true
             end
          end
          -- (Prüfen ob Wellen schon da sind)
          if ObjectCheck( waves, posi ) == true then
             truewaves = true
          end
          -- (Setzen der Wellen wenn Strand gefunden und keine Wellen vorhanden sind)
          if truebeach == true and truewaves == false then
             asc.placeObject( map, posi, waves, true )
          -- (Löschen der Wellen wenn kein Strand da ist, aber Wellen vorhanden)
          elseif truebeach == false and truewaves == true then
             field:removeObject( waves )
          end
      end

   end
end

-- Wasser homogenisieren
-- vsw 2004, sw 2002, w 2001, dw 2003, o 2000 }
for w = 1, 3 do

for y = 0, map:height()-1 do
   for x = 0, map:width()-1 do 
      posi = asc.MapCoordinate(x,y)
      field = map:getField(posi)

      -- auf Wasserabstufung vsw-sw prüfen
      if  field:getTerrainType():getID() == waterIDs[w] then
         -- Felder rund herum prüfen
         for i = 0,5 do
            p = asc.getNeighbouringFieldCoordinate( posi, i )
            nfield = map:getField(p)
            if not nfield then
               -- do nothing
            else
               if  nfield:getTerrainType():getID() == waterIDs[w+2] or nfield:getTerrainType():getID() == waterIDs[w+3] or nfield:getTerrainType():getID() == waterIDs[w+4] then
                  nfield:changeTerrainType( waterTerr[w+1] )
               end
            end
         end
      end
      
      -- auf Wasserabstufung sw-w prüfen
      if  field:getTerrainType():getID() == waterIDs[w+1] then
         -- Felder rund herum prüfen
         for i = 0,5 do
            p = asc.getNeighbouringFieldCoordinate( posi, i )
            nfield = map:getField(p)
            if not nfield then
               -- do nothing
            else
               if  nfield:getTerrainType():getID() == waterIDs[w+3] or nfield:getTerrainType():getID() == waterIDs[w+4] then
                  nfield:changeTerrainType( waterTerr[w+2] )
               end
            end
         end
      end

      -- auf Wasserabstufung w-dw prüfen 2 Felder
      if  field:getTerrainType():getID() == waterIDs[w+2] then
         -- Felder rund herum prüfen
         for i = 0,5 do
            p = asc.getNeighbouringFieldCoordinate( posi, i )
            nfield = map:getField(p)
            if not nfield then
               -- do nothing
            else
               if  nfield:getTerrainType():getID() == waterIDs[w+4] then
                  nfield:changeTerrainType( waterTerr[w+3] )
               end
               for i = 0,5 do
                  p2 = asc.getNeighbouringFieldCoordinate( p, i )
                  n2field = map:getField(p2)
                  if not n2field then
                     -- do nothing
                  else
                     if  n2field:getTerrainType():getID() == waterIDs[w+4] then
                        n2field:changeTerrainType( waterTerr[w+3] )
                     end
                  end -- if
               end -- for
            end -- if
         end  -- for
      end -- if

   end
end
  
end
[enjoy the future!]
Hanni
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 2898
Registriert: Sa 31. Jan 2009, 13:04
Einheitenset: Cromoner MK4
Wohnort: Leipzig

Re: [Skript] newBeach Transformation

Beitrag von Hanni »

Gute Sache das Skript.

Bei einem Test ist mir aufgefallen, das Flüsse zu "medium Water" umgebaut werden. Ist das so gewollt?

(Getestet mit alten Karten von Gnesho und Aquarius)

Grüße,
Hanni
Die DIN 16554 regelt, dass eine Kugelschreibermine einen 200 m langen Strich ziehen können muss.
----------
Beiträge in meiner Funktion als Admin haben diese Farbe!
Benutzeravatar
GAMER
General
General
Beiträge: 8852
Registriert: Sa 7. Mär 2009, 14:49
Einheitenset: Teccnols - SY

Re: [Skript] newBeach Transformation

Beitrag von GAMER »

Im neuen Uni-System gibt es kein spezielles River Objekt mehr. Wasser mit 1 oder 2 Feldern Breite wird automatisch zu "River", da die seeseitige Küste das River-Bit setzt. Die seeseitige Küste filtert "water" und "deep_water" heraus. Die Schiffe habe ich bereits an dieses System angepasst, große Pötte können nicht auf vsw oder sw. Durch dieses Prinzip ist es nun möglich mit Verwendung einer Küstenart unterschiedlich tiefe Flüsse zu erzeugen. Sie beginnen an der Quelle mit vsw und können dann immer tiefer werden bis maximal "river".

Aus Kompatibilitätsgründen habe ich war auch eine neuen Uni-Steilküste integriert, aber mit Berg und Plateau können auf der neuen Uni-Beach-Küste viel schönere Steilküsten geschaffen werden, da diese einen homogenen seitlichen Abschuss haben.
[enjoy the future!]
Hanni
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 2898
Registriert: Sa 31. Jan 2009, 13:04
Einheitenset: Cromoner MK4
Wohnort: Leipzig

Re: [Skript] newBeach Transformation

Beitrag von Hanni »

Da hast du sicher recht. Aber dennoch werden einige Karten im Charakter nicht unerheblich verändert. Um dieses zu dokumentieren habe ich einmal 2 Screenshots angehangen.

Es fällt auf, das zum einem der Fluss optisch nicht mehr zum Wasser passt und zum anderem die Steilküsten und Riffe quasi verschwunden sind ...

Vielleicht siehst du ja eine Möglichkeit dein Skript entsprechend anzupassen (und etwas zu dokumentieren ... damit man auch versteht, was da passiert ;)).

Grüße,
Hanni
Dateianhänge
Nach der Umwandlung
Nach der Umwandlung
Vor der Umwandlung
Vor der Umwandlung
Die DIN 16554 regelt, dass eine Kugelschreibermine einen 200 m langen Strich ziehen können muss.
----------
Beiträge in meiner Funktion als Admin haben diese Farbe!
Benutzeravatar
GAMER
General
General
Beiträge: 8852
Registriert: Sa 7. Mär 2009, 14:49
Einheitenset: Teccnols - SY

Re: [Skript] newBeach Transformation

Beitrag von GAMER »

Wie ich oben schon geschrieben habe, es funktioniert nur mit Version z82 ! In der Beta 5 fehlen noch einige Dinge. Die Datenfiles von z82 sind ab morgen verfügbar.

Der River passte auch vorher nicht zum Wasser daneben, denn er ist in dem Beispiel "tiefer" als das offene Gewässer (shallow_water) daneben. Es passt zwar optisch einigermaßen, aber technisch nicht. Das Script offenbart hier nur eine Designschwäche der Karte selbst.
Die Wassertiefe des Flusslauf selbst muß in jedem Fall nachbearbeitet werden, dass läßt sich nicht automatisieren.
[enjoy the future!]
Hanni
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 2898
Registriert: Sa 31. Jan 2009, 13:04
Einheitenset: Cromoner MK4
Wohnort: Leipzig

Re: [Skript] newBeach Transformation

Beitrag von Hanni »

Und ich dachte, die aktuellsten Nightly Builds würden ausreichen .....

Naja, aber sie tun es wohl nicht, wenn die Änderungen nicht (rechtzeitig?) ins CVS eingecheckt werden ....

Grüße,
Hanni
Die DIN 16554 regelt, dass eine Kugelschreibermine einen 200 m langen Strich ziehen können muss.
----------
Beiträge in meiner Funktion als Admin haben diese Farbe!
Benutzeravatar
GAMER
General
General
Beiträge: 8852
Registriert: Sa 7. Mär 2009, 14:49
Einheitenset: Teccnols - SY

Re: [Skript] newBeach Transformation

Beitrag von GAMER »

Ich hatte die Uni-Steilküste vergessen im CVS hinzuzufügen, was ich heute morgen im Zug des z82-Update-Check nachgeholt habe.

Hinweis, es gibt kein "Riff". Das war nur ein optischer Effekt der Steilküste, wenn Wasser rund herum war. Im Uni-Küsten-Prinzip, ist das so nicht machbar, da Wassereffekte auch nur auf Wasserfeldern möglich sind, bzw. eine Küste immer aus 2 Objekten besteht.
Vieleicht baut ja noch jemand eine flache "Steinige Küste", dann kann die den Strand unterhalb der Steilküste ersetzen.
[enjoy the future!]
Hanni
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 2898
Registriert: Sa 31. Jan 2009, 13:04
Einheitenset: Cromoner MK4
Wohnort: Leipzig

Re: [Skript] newBeach Transformation

Beitrag von Hanni »

GAMER hat geschrieben:Ich hatte die Uni-Steilküste vergessen im CVS hinzuzufügen, was ich heute morgen im Zug des z82-Update-Check nachgeholt habe.
Macht ja nichts. Da das Problem jetzt bekannt ist, ist es ja keins mehr. Eine allgemeine Frage habe ich noch: Wie funktionieren die "Uni-Küsten" nun genau? Was muss wo platziert werden, damit es gut aussieht?

Vielleicht kannst du dazu ja 2-3 Worte verlieren. Weil gut aussehen tun sie ja ;)

Grüße,
Hanni
Die DIN 16554 regelt, dass eine Kugelschreibermine einen 200 m langen Strich ziehen können muss.
----------
Beiträge in meiner Funktion als Admin haben diese Farbe!
Benutzeravatar
GAMER
General
General
Beiträge: 8852
Registriert: Sa 7. Mär 2009, 14:49
Einheitenset: Teccnols - SY

Re: [Skript] newBeach Transformation

Beitrag von GAMER »

hm, dachte, das Prinzip hätte ich schon ausreichend erklärt.

Die Unit Küste (egal was sie darstellt) besteht aus 2 selbstverbindenden Objekten. Eines ist "Wasserseitig" und stellt überwiegend "brechende Wellen" dar eines ist landseitig und stellt überwiegend den Strand dar( oder irgend eine andere Küstenform, Steine, Mauer oder was auch immer). Wasser bleibt Wasser und Land bleibt Land. Der Kartenersteller kann damit seine Landmasse einfach ins Wasser zeichnen, bzw. das Wasser einfach in die Landmasse. Ein Nachbearbeiten der Küstenlinien wie bei den den alten reinen Wasserküstenobjekten ist nicht mehr notwendig.

Da die alte Steilküste Wasseranteile enthält, war sie in der Form nicht mehr nutzbar. Ich habe den Wasseranteil entfernt, und nun kann sie einfach auf den "Strand" gepackt werden. Die Steilküste endet auso nicht mehr direkt im Wasser, sondern hat noch einen kleinen Strand unten dran.
Mit einem Berg und einem Plateau daneben, kann ebenfalls Steilküste erzeugt werden, die ist dann noch "höher" ausgeprägt.
[enjoy the future!]
Hanni
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 2898
Registriert: Sa 31. Jan 2009, 13:04
Einheitenset: Cromoner MK4
Wohnort: Leipzig

Re: [Skript] newBeach Transformation

Beitrag von Hanni »

Also auf ein Wasserfeld kommen die Wellen, auf ein Landfeld kommt der Strand und auf den Strand kommt die Steilküste, oder?

Habe ich irgendetwas vergessen?

Noch ne Frage: Ein Feld mit "River" Bit gibt es dann gar nicht mehr, oder?

Grüße,
Hanni
Die DIN 16554 regelt, dass eine Kugelschreibermine einen 200 m langen Strich ziehen können muss.
----------
Beiträge in meiner Funktion als Admin haben diese Farbe!
Antworten