[Skript] newBeach Transformation
Verfasst: Fr 2. Apr 2010, 09:44
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
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