[[http://www.siedler-games.de|{{:sg-link.jpg|}}]]
====== Leben ins Dorf ======
An diesem Beispiel kann man sehen, wie man ein Dorf beleben kann.
Wie man Dinge übergeben kann (Schlüssel, Briefing, was auch immer)
Das Beispiel ist mit 100 Serfs. Man kann natürlich alles x-beliebige in das Table packen.
Ist ja nur ein Beispiel. \\ \\
Hier ein {{:utilmaps:legendenleereversuchskarte.rar|Beispiel}}, was irre ist. Aber fragt mich nicht, wie ich das geschafft habe. Ich weiß es nicht mehr 8-O \\ **Kroßes Garte prauchen**
Die Kommentare sollten schon (fast) alles sagen.
---------------------------------------------------------------------------------
-- MapName:Zufälliges Übergeben (Hier der NPC-Marker)
-- Autor: Peermanent(Idee) & Robert (Ausführung)
----------------------------------------------------------------------------------------------------
Script.Load( Folders.MapTools.."Main.lua" )
IncludeGlobals("MapEditorTools")
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
function InitResources()
----------------------------------------------------------------------------------------------------
AddGold (1000)
AddSulfur(0)
AddIron (0)
AddWood (11000)
AddStone (1000)
AddClay (1000)
AddGold (2,5000)
end
function InitDiplomacy()
SetHostile(1,2)
end
----------------------------------------------------------------------------------------------------
function InitTechnologies()
----------------------------------------------------------------------------------------------------
end
----------------------------------------------------------------------------------------------------
function InitWeatherGfxSets()
----------------------------------------------------------------------------------------------------
end
----------------------------------------------------------------------------------------------------
function InitWeather()
----------------------------------------------------------------------------------------------------
end
----------------------------------------------------------------------------------------------------
function InitPlayerColorMapping()
----------------------------------------------------------------------------------------------------
end
----------------------------------------------------------------------------------------------------
function FirstMapAction()
----------------------------------------------------------------------------------------------------
Tools.ExploreArea( -1, -1, 900 )-- Der Herr sprach es werde Licht
xWorld,yWorld =Logic.WorldGetSize() -- Wie groß ist die Karte
xWorld=xWorld-200 -- Sicherheit abziehen
yWorld=yWorld-200 -- Sicherheit abziehen
nUeberGabeZeit=10 -- wieviel sekunden muß gewartet werden bis eine neue Übergabe stattfinden kann
ueberGabeZeit=nUeberGabeZeit -- Übergabezähler hochsetzten
nWarteZeit=4 -- wie lange wartet er, wenn er den Punkt erreicht hat
abzaehlen = false
idWechseln=false -- wenn statt dem Marker die Id geändert werden soll ==> true
serfs={}
nPlayer=3
===== Alternative 1 =====
Hier wie oben gesagt 100 Serfs
for i= 1, 100 do -- 100 zufällige Serfs erzeugen
local _punkt=MachRandomPunkt()
CreateEntity(3 ,Entities.PU_Serf,_punkt,"Serf"..i)
table.insert(serfs,{"Serf"..i,_punkt,_punkt,0})
end
===== Alternative 2 =====
Hier eigen gewählte Entities
local entry={
"Willi", -- steht drin
{X=5000, Y=5000}, -- steht drin
{X=5000, Y=5000}, -- steht drin
0, -- WarteZähler. Soll 0 sein
}
CreateEntity(nPlayer ,Entities.PU_Serf,entry[2],entry[1])
table.insert(serfs,entry)
entry={
"Otto", -- steht drin
{X=5500, Y=5500}, -- steht drin
{X=5500, Y=5500}, -- steht drin
0, -- WarteZähler. Soll 0 sein
}
CreateEntity(nPlayer ,Entities.PU_Serf,entry[2],entry[1])
table.insert(serfs,entry)
-- und so weiter
===== Weiter in der FistMapAction =====
markerTraeger=1 -- Nummer des Serfs, der den Marker hat
if idWechseln then
ChangePlayer(serfs[markerTraeger][1],1)
else
EnableNpcMarker(serfs[markerTraeger][1])
end
Camera.FollowEntity(GetEntityId(serfs[markerTraeger][1]))
StartSimpleJob("Ueberwachen2")-- ab die Post
end
function Ueberwachen2()
for i = 1, table.getn(serfs) do
if (not (i == markerTraeger))and IsNear(serfs[markerTraeger][1],serfs[i][1],500) and (not abzaehlen)then
-- ist er es nicht selbst (i)
-- ist er in der Nähe eines Kumpels
-- hat nicht gerade eine Übergabe stattgefunden
if ueberGabeZeit == nUeberGabeZeit then -- nach einer Übergabe erneute Übergabe erstmal blockiert
if idWechseln then
ChangePlayer(serfs[markerTraeger][1],nPlayer)
ChangePlayer(serfs[i][1],1)
else
EnableNpcMarker(serfs[i][1])-- bisheriger Träger bekommt die Sache entzogen (hier NPC-Marker)
DisableNpcMarker(serfs[markerTraeger][1])-- er bekommt sie (hier NPC-Marker)
end
markerTraeger=i -- das ist der Träger
Camera.FollowEntity(GetEntityId(serfs[markerTraeger][1]))
abzaehlen=true -- es wird abgezählt. Solange keine Übergabe möglich
end
end
if (not Logic.IsEntityMoving(serfs[i][1])) then -- steht der Serf?
if serfs[i][2] == serfs[i][3] then -- ist er auf seinem Bestimmungsord angekommen?
-- neuer Punkt
serfs[i][5]=0 -- Zähler fürs Warten runtersetzten
serfs[i][2]=GetPosition(serfs[i][1]) ---Wo ist er jetzt
serfs[i][3]=MachRandomPunkt() -- Neuen Zufallspunkt erzeugen
Move(serfs[i][1],serfs[i][3]) -- ab dahin
else -- ist noch nicht angekommen
if serfs[i][4] < nWarteZeit then --etwas warten, kann ja durch andere blokiert sein
serfs[i][4]=serfs[i][4]+1
else
-- dauert zu lange ==> neuer Punkt
serfs[i][5]=0 -- Wartezeit wieder runtersetzten
serfs[i][2]=GetPosition(serfs[i][1])---Wo ist er jetzt
serfs[i][3]=MachRandomPunkt()-- Neuen Zufallspunkt erzeugen
Move(serfs[i][1],serfs[i][3])-- ab dahin
end
end
else
if serfs[i][5]~=0 then
serfs[i][5]=0 -- Wartezeit wieder runtersetzten falls er aufgehalten wurde
end
end
end
if abzaehlen then -- nach einer Übergabe erneute Übergabe erstmal blockiert
ueberGabeZeit=ueberGabeZeit-1
Message(ueberGabeZeit)
if ueberGabeZeit == 0 then
abzaehlen=false -- jetzt darf wieder übergeben werden
ueberGabeZeit = nUeberGabeZeit
end
end
end
---------------------------------------------------------------------------------------------
function MachRandomPunkt() -- Zufälligen Punkt erzeugen
randomX=math.random (xWorld)+100
randomY=math.random (yWorld) +100
return {X=randomX,Y=randomY}
end