Benutzer-Werkzeuge

Webseiten-Werkzeuge


tutorials:waffenstillstand_ueber_tribute_festlegen

Dieses Script basiert auf dem Referenzscript. Es wurden Funktionen integriert, die die Festlegung der Waffenstillstandszeit im laufendem Spiel über das Tributemenü ermöglichen, sowie die freie Teamwahl für Spieler erlauben. Das normale, für jede Mehrspielerkarte automatisch generierte, Script kann durch dieses Script ersetzt werden. Die benötigten Comfort Funktionen aus dem Countdown / Zeitlimit Tutorial und dem Tribute Tutorial sind hier bereits integriert. Somit kann das Script ohne weitere Änderungen verwendet werden.

--------------------------------------------------------------------------------
-- MapName: XXX
--
-- Author:  a4f_twinking92
-- MP Reference Script Friedenszeit einstellen über Tribute
--------------------------------------------------------------------------------
function GameCallback_OnGameStart()     
    -- Der erste Teil diese Funktion ist für jede Karte identisch und sollte nicht verändert werden
 
    -- Include global tool script functions 
    Script.Load(Folders.MapTools.."Ai\\Support.lua")
    Script.Load( "Data\\Script\\MapTools\\MultiPlayer\\MultiplayerTools.lua" )  
    Script.Load( "Data\\Script\\MapTools\\Tools.lua" )  
    Script.Load( "Data\\Script\\MapTools\\WeatherSets.lua" )
    IncludeGlobals("Comfort")
 
    --Init local map stuff
    Mission_InitWeatherGfxSets()
    Mission_InitWeather()
    Mission_InitGroups()    
    Mission_InitLocalResources()
 
    -- Init  global MP stuff
    MultiplayerTools.InitCameraPositionsForPlayers()    
    MultiplayerTools.SetUpGameLogicOnMPGameConfig()
    --Diese Funktion muß wegen der freien Peacetime deaktiviert sein, sie wird erst später nach dem Ablauf der Peacetime gesetzt
    --MultiplayerTools.SetUpDiplomacyOnMPGameConfig()
 
    if XNetwork.Manager_DoesExist() == 0 then      
        for i = 1, 8 do
            MultiplayerTools.DeleteFastGameStuff(i)
        end
        local PlayerID = GUI.GetPlayerID()
        Logic.PlayerSetIsHumanFlag( PlayerID, 1 )
        Logic.PlayerSetGameStateToPlaying( PlayerID )
        Logic.SuspendAllEntities() --Hiermit wird festgelegt, das niemand seine Einheiten bewegen kann(alles andere waehre unfair für den Spieler der den Ws einstellen muss
    end
 
    -- Ab hier können Einstellungen vorgenommen oder eigener Code hinzugefügt werden
 
    -- Die Anzahl legt fest wieviel Helden der Spieler rekrutieren kann
    MultiplayerTools.GiveBuyableHerosToHumanPlayer( 3 )
 
    -- Hier wird die der Countdown für die Peacetime nicht gestartet , da diese erst nach einer Wahl im Tributemenue starten soll!
    --SetPeacetime(30 * 60);
 
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--Hier werden die Tributfunctionen aufgerufen   
    NewTribute1()
    NewTribute2()
    NewTribute3()
    NewTribute4()
 
--Hier starten wir ein Briefin damit auch jeder weiß wie man die Friedenszeit einstellen kann
    StartCountdown( 3, StartFriedenszeitBriefing, false )
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
 
 
    LocalMusic.UseSet = HIGHLANDMUSIC
    --Befehlsatz einfach Kommentierung durch entfernen der beiden Bindestriche rausnehmen
    -- nicht vergessen das jeweils nur ein Set gesetzt werden kann
    --LocalMusic.UseSet = EUROPEMUSIC
    --LocalMusic.UseSet = HIGHLANDMUSIC
    --LocalMusic.UseSet = MEDITERANEANMUSIC
    --LocalMusic.UseSet = DARKMOORMUSIC
    --LocalMusic.UseSet = EVELANCENUSIC
end
 
 
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start and after save game is loaded, setup your weather gfx
-- sets here
function Mission_InitWeatherGfxSets()
 
    -- Use gfx sets
    SetupHighlandWeatherGfxSet()
    --Befehlsatz einfach Kommentierung durch entfernen der beiden Bindestriche rausnehmen nicht vergessen das man nur ein setzten sollte
    --SetupNormalWeatherGfxSet()
    --SetupHighlandWeatherGfxSet()
    --SetupSteppeWeatherGfxSet()
    --SetupMoorWeatherGfxSet()
    --SetupEvelanceWeatherGfxSet()
 
end
 
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- This function is called on game start you should setup your weather periods here
function Mission_InitWeather()
 
    -- Hier wird der Wetterwechselfestgelegt Die Zahl 
    -- Beispiel 4 Min Sommer, dann 2 Minuten Winter, dann wieder alles von vorne
    AddPeriodicSummer(4 * 60) 
    AddPeriodicWinter(2 * 60) 
    --Befehlsatz einfach Kommentierung durch entfernen der beiden Bindestriche rausnehmen
    --AddPeriodicSummer(600) 
    --AddPeriodicWinter(300) 
    --AddPeriodicRain(120) 
end
 
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Build Groups and attach Leaders
function Mission_InitGroups()
end
 
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Limit the Technologies here. For example Weathermashine.
function Mission_InitTechnologies()
end
 
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Set local resources
function Mission_InitLocalResources()
    -- Startresourcen für die Spieler festlegen
    local InitGoldRaw     = 1000
    local InitClayRaw     = 1500
    local InitWoodRaw     = 1000
    local InitStoneRaw   = 1000
    local InitIronRaw     = 1000
    local InitSulfurRaw  = 1000
 
 
    --Add Players Resources
    local HumenPlayer = XNetwork.GameInformation_GetMapMaximumNumberOfHumanPlayer()
    for i = 1, 8, 1 do
        Tools.GiveResouces(i, InitGoldRaw , InitClayRaw, InitWoodRaw, InitStoneRaw, InitIronRaw, InitSulfurRaw)
 
        -- Hier werden die Technologien vorgegeben
        -- Beispiel Mathematik, Konstruktion und Sprengfähigkeit des Dieben
        ResearchTechnology(Technologies.GT_Mathematics,i)
        ResearchTechnology(Technologies.GT_Construction,i)  
        ResearchTechnology(Technologies.T_ThiefSabotage,i) 
 
        -- Es ist natürlich auch möglich, einzelne Technologien zu verbieten. Siehe dazu das entsprechende Tutorial
 
        --Befehlsatz einfach Kommentierung durch entfernen der beiden Bindestriche rausnehmen
        --Unitechnologien
 
        --ResearchTechnology(Technologies.GT_Mercenaries, i) -->Wehrpflicht 
        --ResearchTechnology(Technologies.GT_StandingArmy, i) -- -> stehendes Heer
        --ResearchTechnology(Technologies.GT_Tactics, i)--> Taktiken
        --ResearchTechnology(Technologies.GT_Strategies, i) ---> Pferdezucht
 
        --ResearchTechnology(Technologies.GT_Construction, i) ----> Konstruktion
        --ResearchTechnology(Technologies.GT_ChainBlock, i) --Flaschenzug
        --ResearchTechnology(Technologies.GT_GearWheel, i) --Zahnräder
        --ResearchTechnology(Technologies.GT_Architecture, i) --Architektur
 
        --ResearchTechnology(Technologies.GT_Alchemy, i) --Alchimie
        --ResearchTechnology(Technologies.GT_Alloying, i) --Legierungen
        --ResearchTechnology(Technologies.GT_Metallurgy, i) --Metallurgie
        --ResearchTechnology(Technologies.GT_Chemistry, i) --Chemie
 
 
        --ResearchTechnology(Technologies.GT_Taxation, i) --
        --ResearchTechnology(Technologies.GT_Trading, i) --Handelswesen
        --ResearchTechnology(Technologies.GT_Banking, i) --
        --ResearchTechnology(Technologies.GT_Gilds, i) --
 
        --ResearchTechnology(Technologies.GT_Literacy, i) --Bildung
        --ResearchTechnology(Technologies.GT_Printing, i) --Buchdruck
        --ResearchTechnology(Technologies.GT_Laws, i) --
        --ResearchTechnology(Technologies.GT_Library, i) --Büchereien
 
        --ResearchTechnology(Technologies.GT_Mathematics, i) --Mathematik
        --ResearchTechnology(Technologies.GT_Binocular, i) -- Ferngläser
        --ResearchTechnology(Technologies.GT_Matchlock, i) --Luntenschloss
        --ResearchTechnology(Technologies.GT_PulledBarrel, i) --gezogener Lauf
 
        --ResearchTechnology(Technologies.T_ChangeWeather, i)
        --ResearchTechnology(Technologies.T_WeatherForecast,i)
        --ResearchTechnology(Technologies.T_ThiefSabotage,i) 
    end
end 
 
function SetPeacetime( _seconds )
    ---hier wird die Funktion special peacetime gestartet
    SpecialPeacetime();
    StartCountdown( _seconds, CountdownAbgelaufen, true );
end
 
function CountdownAbgelaufen()
    --Festlegung des Diplomatistatus für die Zeit nach der Peacetime 
    MultiplayerTools.SetUpDiplomacyOnMPGameConfig()
    --Nun wird auch die dramatische Musik gespielt
    Sound.PlayGUISound( Sounds.OnKlick_Select_kerberos, 127 )
end
 
function SpecialPeacetime()
    -- Anzahl der menschlichen Spieler wird hier ermittelt
    local _humenPlayer = XNetwork.GameInformation_GetMapMaximumNumberOfHumanPlayer()
    -- Abfrage ob Standardsituation gegeben ist das jeder sich  mit jedem  verbünden kann 
    if XNetwork.GameInformation_GetFreeAlliancesFlag() == 1 then
        -- Feststellung wer mit wem verbündet ist und Festlegung des Diplomatistatus für die Peacetime 
        if _humenPlayer > 1 then
            for _teamplayerID = 1, _humenPlayer do
                local _teamplayer = XNetwork.GameInformation_GetLogicPlayerTeam( _teamplayerID )
                for _oppoPlayerID = 1, _humenPlayer do
                    if _teamplayerID ~= _oppoPlayerID then
                        local _oppoPlayer = XNetwork.GameInformation_GetLogicPlayerTeam( _oppoPlayerID )
                        if _teamplayer == _oppoPlayer then
                            Logic.SetDiplomacyState( _oppoPlayerID, _teamplayerID, Diplomacy.Friendly )       
                        else
                            Logic.SetDiplomacyState( _oppoPlayerID, _teamplayerID, Diplomacy.Neutral )
                        end
                    end
                end
            end
        end
    end 
end
 
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--+++++ Countdown Comfort Code ++++++++++++++++++++++++++++++++++++++++++++
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function StartCountdown(_Limit, _Callback, _Show)
    assert(type(_Limit) == "number")
 
    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
 
--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--++++++++++++++++++++++++++         Briefing         +++++++++++++++++++++
--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function StartFriedenszeitBriefing()
 
    local briefing = {};
 
    local AP = function(_page) table.insert(briefing, _page); return _page; end;
 
    AP{
        title        = "Friedenszeit",
        text         = "Spieler 1, druecke F3 um die Friedenszeit einzustellen"
    };
 
    StartBriefing(briefing);
end 
 
--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--++++++++++++++++++++++++++++             Tributfunktion           +++++++++++++++++++++++++++++++++++++++++++++++++
--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
--Dies ist der Tribute Comfort Code
 
function AddTribute( _tribute )
    assert( type( _tribute ) == "table", "Tribut muß ein Table sein" );
    assert( type( _tribute.text ) == "string", "Tribut.text muß ein String sein" );
    assert( type( _tribute.cost ) == "table", "Tribut.cost muß ein Table sein" );
    assert( type( _tribute.playerId ) == "number", "Tribut.playerId muß eine Nummer sein" );
    assert( not _tribute.Tribute , "Tribut.Tribute darf nicht vorbelegt sein");
 
    uniqueTributeCounter = uniqueTributeCounter or 1;
    _tribute.Tribute = uniqueTributeCounter;
    uniqueTributeCounter = uniqueTributeCounter + 1;
 
    local tResCost = {};
    for k, v in pairs( _tribute.cost ) do
        assert( ResourceType[k] );
        assert( type( v ) == "number" );
        table.insert( tResCost, ResourceType[k] );
        table.insert( tResCost, v );
    end
 
    Logic.AddTribute( _tribute.playerId, _tribute.Tribute, 0, 0, _tribute.text, unpack( tResCost ) );
    SetupTributePaid( _tribute );
 
    return _tribute.Tribute;
end  
 
--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--Hier werden unsere Tribute erstellt
--+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
--Tribut Packen WS0
 
function NewTribute1() 
    local tribute =  {};
    tribute.playerId = 1; --Angabe welcher Spieler den Tribut auswaelen darf. (Indem Fall Spieler 1)
    tribute.text = "Waehle die Friedenszeit: 0 Minuten"; -- Text der im Tributemenü angezeigt wird.
    tribute.cost = { Gold = 0}; --kosten für den Tribut(logisch ist bei uns 0)
    tribute.Callback = Tributcallback1; --Hier wird die function aufgerufen die gestartet werden soll wenn man diesen Tribut waehlt
    TributId1 = AddTribute( tribute ); --Hier wird festgelegt welche ID der Tribut hat.
end
 
function Tributcallback1()
   SetPeacetime( 0*60 ) --Hier wird nun unsere Peacetime gestartet
   Logic.RemoveTribute( 1, TributId2) --Hier wird der Tribut mit der ID2 gelöscht
   Logic.RemoveTribute( 1, TributId3) --Hier wird der Tribut mit der ID3 gelöscht
   Logic.RemoveTribute( 1, TributId4) --Hier wird der Tribut mit der ID4 gelöscht
   Logic.ResumeAllEntities() --Jetzt kann man alle Einheiten wieder bewegen
   Message("@color:255,255,0 Es wurden 0 Minuten Friedenszeit gewaehlt") --Und nun geben wir noch kurz ne Nachicht raus, damit jeder weiss, welcher WS denn nun gewaehlt wurde
end
 
 --Tribut Packen WS1
 
function NewTribute2() 
    local tribute =  {};
    tribute.playerId = 1;
    tribute.text = "Waehle die Friedenszeit: 15 Minuten";
    tribute.cost = { Gold = 0};
    tribute.Callback = Tributcallback2;
    TributId2 = AddTribute( tribute );
end
 
function Tributcallback2()
   SetPeacetime( 15*60 )
   StartCountdown( 15*60, Message2, false ) --hier wird nach 15 min(WS) die Message "Moege der Krieg beginnen ausgegeben"
   Logic.RemoveTribute( 1, TributId1)
   Logic.RemoveTribute( 1, TributId3)
   Logic.RemoveTribute( 1, TributId4)
   Logic.ResumeAllEntities()
   Message("@color:255,255,0 Es wurden 15 Minuten Friedenszeit gewaehlt")
end
 
function Message2()
	Message( "@color:255,255,0 Moege der Krieg beginnen !" )
end
 
--Tribut Packen WS2
 
function NewTribute3() 
    local tribute =  {};
    tribute.playerId = 1;
    tribute.text = "Waehle die Friedenszeit: 30 Minuten";
    tribute.cost = { Gold = 0};
    tribute.Callback = Tributcallback3;
    TributId3 = AddTribute( tribute );
end
 
function Tributcallback3()
   SetPeacetime( 30*60 )
   StartCountdown( 30*60, Message3, false )
   Logic.RemoveTribute( 1, TributId1)
   Logic.RemoveTribute( 1, TributId2)
   Logic.RemoveTribute( 1, TributId4)
   Logic.ResumeAllEntities()
   Message("@color:255,255,0 Es wurden 30 Minuten Friedenszeit gewaehlt")
end
 
function Message3()
	Message( "@color:255,255,0 Moege der Krieg beginnen !" )
end
 
--Tribut Packen WS3
 
function NewTribute4() 
    local tribute =  {};
    tribute.playerId = 1;
    tribute.text = "Waehle die Friedenszeit: 40 Minuten";
    tribute.cost = { Gold = 0};
    tribute.Callback = Tributcallback4;
    TributId4 = AddTribute( tribute );
end
 
function Tributcallback4()
   SetPeacetime( 40*60 )
   StartCountdown( 40*60, Message4, false )
   Logic.RemoveTribute( 1, TributId1)
   Logic.RemoveTribute( 1, TributId2)
   Logic.RemoveTribute( 1, TributId3)
   Logic.ResumeAllEntities()
   Message("@color:255,255,0 Es wurden 40 Minuten Friedenszeit gewaehlt")
end
 
 function Message4()
	Message( "@color:255,255,0 Moege der Krieg beginnen !" )
end
 
function GameCallback_FulfillTribute() --Im Multiplayer sind Tribute standardmäßig deaktiviert, daher muss man sie erst wieder aktivieren
    return 1
end

Hier hab ich noch eine kleine Beispielmap.

tutorials/waffenstillstand_ueber_tribute_festlegen.txt · Zuletzt geändert: 2021/09/18 19:16 (Externe Bearbeitung)