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