Hilfe, erste Map und ich kann das Problem nicht lösen

» Siedler Map Source Forum » Siedler DEdK Script Forum » Hilfe, erste Map und ich kann das Problem nicht lösen

Seiten: 1

Nad3003
#1
29.10.2017 17:59
Beiträge: 3

Hilfe, erste Map und ich kann das Problem nicht lösen

Sehr geehrte Mapper,

neulich erst bin ich auf diese Seite gestoßen und so keimte in mir der Wunsch auf, selbst so eine Map zu erstellen. Ich hab schon tausende Tests gemacht, habe viel mit anderen Skripts verglichen bis ich nun Folgendes zustande brachte:

 --------------------------------------------------------------------------------
-- MapName: XXX
--
-- Author: XXX
--
--------------------------------------------------------------------------------

-- Include main function
Script.Load( Folders.MapTools.."Main.lua" )
IncludeGlobals("MapEditorTools")

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called from main script to initialize the diplomacy states
function InitDiplomacy()
  SetHostile(1,2)
  
  SetNeutral(1,4)
  SetNeutral(2,4)
  
  SetPlayerName(2,"Kerberos")
end


--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called from main script to init all resources for player(s)
function InitResources()
    -- set some resources
    AddGold  (600)
    AddSulfur(500)
    AddIron  (500)
    AddWood  (1000)	
    AddStone (1000)	
    AddClay  (1000)	
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called to setup Technology states on mission start
function InitTechnologies()
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start and after save game is loaded, setup your weather gfx
-- sets here
function InitWeatherGfxSets()
	SetupNormalWeatherGfxSet()
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start you should setup your weather periods here
function InitWeather()
	--AddPeriodicWinter(10)
	AddPeriodicSummer(1800)
	--AddPeriodicRain(120)
end

--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start and after save game to initialize player colors
function InitPlayerColorMapping()
  Display.SetPlayerColorMapping(1,FRIENDLY_COLOR3)
  Display.SetPlayerColorMapping(2,ROBBERS_COLOR)
end
	
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start after all initialization is done
function FirstMapAction()


  CreatePreludeBriefing()
  CreatePlayer2()
  CreateArmyOne()
  StartCountdown(20,OpenDoorHolz,false)
  --StartSimpleJob("OpenDoorHolz")
  StartSimpleJob("VictoryJob")
  StartSimpleJob("OpenDoorHolzTwo")
  Mission_InitMerchants()
end

function Mission_InitMerchants()

   local mercTent = Logic.GetEntityIDByName("MercTent")
  Logic.AddMercenaryOffer(mercTent, Entities.PU_LeaderBow4, 4, ResourceType.Gold, 500);
  --Logic.AddMercenaryOffer(mercTent, Entities.PU_LeaderRifle2, 4, ResourceType.Clay, 500);
  Logic.AddMercenaryOffer(mercTent, Entities.PU_LeaderSword3, 4, ResourceType.Wood, 500);
  --Logic.AddMercenaryOffer(mercTent, Entities.PU_LeaderHeavyCavalry1, 4, ResourceType.Iron, 450); --ich weiß noch nicht was ich alles anbieten möchte

end
  
  function CreatePreludeBriefing()
  
  Move("Kundschafter","Kamera",  10)
  LookAt("Kundschafter", "Dario")
  LookAt("Dario","Kundschafter")
 
  PreludeBriefing          = {} 
  PreludeBriefing.finished = PreludeBriefingFinished 
  page = 0 
   
 page = page + 1						
 PreludeBriefing[page]				= {}
 PreludeBriefing[page].title		= "Der Anfang"
 PreludeBriefing[page].position		= GetPosition("Kamera")
 PreludeBriefing[page].text			= ("Nach den langen Jahren des Krieges herrschte Friede im K\195\182nigreich. Kerberos sollte nie wieder ein Fu\195\159 ins Land setzen. Alles war gut...")  
 PreludeBriefing[page].dialogCamera 	= false;

	--Seite 3
 page = page + 1;
 PreludeBriefing[page] = {};
 PreludeBriefing[page].title 		  = "Kundschafter"; 
 PreludeBriefing[page].position 		= GetPosition("Kundschafter") 
 PreludeBriefing[page].text		   	= "Herr! @cr (keuch)   Kerberos wurde gesichtet! Er befindet sich trotz lebenslanger Vebannung wieder in Eurem Lande. @cr Kundschafter berichten, dass er Rache \195\188ben will. Er baut eine gro\195\159e Armee auf und wird Euch in naher Zukunft angreifen um Euch Euren Thron zu entrei\195\159en.";
 PreludeBriefing[page].npc		   	= {id = GetEntityId("Kundschafter"), isObserved 	= true }; 
 PreludeBriefing[page].dialogCamera	= true


 page = page + 1 
 PreludeBriefing[page] = {}
 PreludeBriefing[page].title        = "Missionsziel"
 PreludeBriefing[page].text         = "Haltet den Angriffen stand und schlagt zur\195\188ck, damit diesem Treiben f\195\188r allemal ein Ende gesetzt ist."
 
 PreludeBriefing[page].position     = GetPosition("Kamera") 
 PreludeBriefing[page].explore      = BRIEFING_EXPLORATION_RANGE
 
 PreludeBriefing[page].quest        = {}
 PreludeBriefing[page].quest.id     = 1
 PreludeBriefing[page].quest.type   = MAINQUEST_OPEN
 PreludeBriefing[page].quest.title  = "Besiege Kerberos"
 PreludeBriefing[page].quest.text   = "Baut schnell eine Siedlung mit einer guten Verteidigung auf und haltet den Angriffen stand. Sobald Ihr stark genug seid, schlagt selbst zur\195\188ck um Kerberos Rachefeldzug zu beenden"
 StartBriefing(PreludeBriefing)
	
end 

 function PreludeBriefingFinished()
 DestroyEntity("Kundschafter")
 end

function OpenDoorHolz()
        DestroyEntity ("door")   
end 

function OpenDoorHolzTwo()
     if IsDead("door") then 
	    ReplaceEntity( "door2", Entities.XD_PalisadeGate2) 
		return true
     else 
		 
	end
end 

function CreatePlayer2()
	player2 					= {}
	player2.id 					= 2
	local description 			= {serfLimit = 10}
	SetupPlayerAi(player2.id,description)
end

function CreateArmyOne()
    armyOne = {
        player      = 2,
        id          = 1,
        strength    = 4,
        position    = GetPosition("armyOne"),
        rodeLength  = 4000
    }
    SetupArmy(armyOne)
 
    local troopDescription = {
        maxNumberOfSoldiers = 8,
        minNumberOfSoldiers = 0,
        experiencePoints    = MEDIUM_EXPERIENCE,
        leaderType          = Entities.PU_LeaderSword3
    }
 
    for i = 1, 4 do
        EnlargeArmy(armyOne, troopDescription)
    end
 
    local troopDescription = {
        maxNumberOfSoldiers = 8,
        minNumberOfSoldiers = 0,
        experiencePoints    = HIGH_EXPERIENCE, 
        leaderType          = Entities.PU_LeaderBow3
    }
 
    for i = 1, 4 do
        EnlargeArmy(armyOne, troopDescription)
    end
 
    StartSimpleJob("ControlArmyOne")
end

function ControlArmyOne()

    if IsDead(armyOne) then
        CreateArmyTwo()
		Message("Der Angreifer ist besiegt")
       return true
    else
        Advance(armyOne)
    end
end

function CreateArmyTwo()
    armyTwo = {
        player      = 2,
        id          = 2,
        strength    = 4,
        position    = GetPosition("armyTwo"),
        rodeLength  = 4000
    }
    SetupArmy(armyTwo)
 
    local troopDescription = {
        maxNumberOfSoldiers = 8,
        minNumberOfSoldiers = 0,
        experiencePoints    = MEDIUM_EXPERIENCE,
        leaderType          = Entities.PU_LeaderRifle2
    }
 
    for i = 1, 4 do
        EnlargeArmy(armyTwo, troopDescription)
    end
 
    local troopDescription = {
        maxNumberOfSoldiers = 8,
        minNumberOfSoldiers = 0,
        experiencePoints    = HIGH_EXPERIENCE, 
        leaderType          = Entities.PU_LeaderBow3
    }
 
    for i = 1, 4 do
        EnlargeArmy(armyTwo, troopDescription)
    end

    StartSimpleJob("ControlArmyTwo")
end

function ControlArmyTwo()     	
     Advance(armyTwo)  
end

function VictoryJob()
   if IsDead("player2") then
      Victory()
        return true 
   end
end 

function StartCountdown(_Limit, _Callback, _Show)
    assert(type(_Limit) == "number")
    assert( not _Callback or type(_Callback) == "function" )
 
    Counter.Index = (Counter.Index or 0) + 1
    
    if _Show and CountdownIsVisisble() then
        assert(false, "StartCountdown: A countdown is already visible")
    end
    
    Counter["counter" .. Counter.Index] = {Limit = _Limit, TickCount = 0, Callback = _Callback, Show = _Show, Finished = false}
    
    if _Show then
        MapLocal_StartCountDown(_Limit)
    end
    
    if Counter.JobId == nil then
        Counter.JobId = StartSimpleJob("CountdownTick")
    end
    
    return Counter.Index
end
 
function StopCountdown(_Id)
    if Counter.Index == nil then
        return
    end
 
    if _Id == nil then
        for i = 1, Counter.Index do
            if Counter.IsValid("counter" .. i) then
                if Counter["counter" .. i].Show then
                    MapLocal_StopCountDown()
                end
                Counter["counter" .. i] = nil
            end
        end
    else
        if Counter.IsValid("counter" .. _Id) then
            if Counter["counter" .. _Id].Show then
                MapLocal_StopCountDown()
            end
            Counter["counter" .. _Id] = nil
        end
    end
end
 
function CountdownTick()
    local empty = true
    for i = 1, Counter.Index do
        if Counter.IsValid("counter" .. i) then
            if Counter.Tick("counter" .. i) then
                Counter["counter" .. i].Finished = true
            end
            
            if Counter["counter" .. i].Finished and not IsBriefingActive() then
                if Counter["counter" .. i].Show then
                    MapLocal_StopCountDown()
                end
                
                -- callback function
                if type(Counter["counter" .. i].Callback) == "function" then
                    Counter["counter" .. i].Callback()
                end
                
                Counter["counter" .. i] = nil
            end
            
            empty = false
        end
    end
    
    if empty then
        Counter.JobId = nil
        Counter.Index = nil
        return true
    end
end
 
function CountdownIsVisisble()
    for i = 1, Counter.Index do
        if Counter.IsValid("counter" .. i) and Counter["counter" .. i].Show then
            return true
        end
    end
    
    return false
end



-- Quest data
MapEditor_QuestTitle		= "erste Map"
MapEditor_QuestDescription 	= "erste Map"         



Es funktioniert soweit alles bis auf die Funktion ControlArmyOne. Hier erscheint armyOne an seinem Platz und greift mich an. Nur erscheint gleichzeitig armyTwo, obwohl ArmyOne noch nicht tot ist. Ich hab alles versucht aber bin nun mit meinem Latein am Ende und hoffe, dass mir jemand von euch sagen kann, wo der Fehler liegt.
Danke euch im Vorraus!

Liebe Grüße,
Nad3003

Dieser Beitrag wurde von Nad3003 am 29.10.2017 um 18:31 editiert.

Nad3003
#2
29.10.2017 18:03
Beiträge: 3

Ähm ok,
ich merke gerade erst wie die Formatierung leicht auseinander schießt. Tut mir Leid. Das macht die Fehlersuche natürlich viel schwieriger.

Wie kann ich mein Skript in der ursprünglichen Formatierung einfügen?
Wäre nett, wenn jemand das kurz erläutert.

mcb
#3
29.10.2017 18:24
Beiträge: 1472

[code] script [/code]
Sieht dann so aus:

 script 


(Kannst du auch noch in deinen Post Editieren)

Das Problem ist wahrscheinlich, das die Truppen nicht sofort erstellt werden, sondern erst mit einiger Verzögerung und so IsDead beim Aufruf des SimpleJobs noch true ergibt.
Einfachste Möglichkeit ist wohl, das ganze nicht so oft zu prüfen, Armeebefehle reichen auch alle 10 Sekunden :

function ControlArmyOne()
	if Counter.Tick2("controlArmyOne", 10) then
		if IsDead(armyOne) then
			CreateArmyTwo()
			Message("Der Angreifer ist besiegt")
			return true
		else
			Advance(armyOne)
		end
	end
end


Counter.Tick2(_name, _limit) gibt praktisch bei jedem 10. Aufruf true zurück, sonst false (unterschieden an _name). http://www.siedler-games.de/si...iki/doku.php/reference:counter
(Hab davon aber auch nur gelesen, verwende selber keine Standard-Armeen)

Nad3003
#4
29.10.2017 18:56
Beiträge: 3

Lieber mcb,

ich danke dir vielmals für deine Hilfe!

Seiten: 1

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum