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.