[[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