Cutscene-Erstellungs-Tools

Dieses Tool kann dazu verwendet werden, einfacher Cutscenes zu erstellen. Aktuelle Features: Zoom-, Rotations-, Zoom-Rotations-Einstellung, Ausgabe.

Der Modus wird über Escape aktiviert.

Der Code muss mit InitCutsceneCreatingTools() aktiviert werden (in der FirstMapAction() aufrufen)

Die nähere Steuerung wird dann im Kino-Modus angegeben (die Testflug-Steuerung 50 Sekunden nach Start des Modi).

Benötigter Code

function InitCutsceneCreatingTools()
	CutsceneCreatingTools = {
								EscapeOrig			= GameCallback_Escape,		--Esc
								CinematicMode		= false,
								Music				= Music.GetVolumeAdjustment(),
								MusicUpdateOrig		= LocalMusic_UpdateMusic,
								MusicEnd			= 0,
								MusicSet			= LocalMusic.SetBriefing,
								MusicTimes			= 5,
								MusicJob			= 0,
								ToggleMenu			= GUIAction_ToggleMenu,		--F1 - F5
								QuickSave			= QuickSave,				--F6
								QuickLoad			= QuickLoad,				--F7
								ToggleClock			= KeyBindings_ToggleClock,	--F8
								ToggleSound			= assert(KeyBindings_ToggleSound), --F12
								TogglePause			= KeyBindings_TogglePause,	--Break
								SelectTroops		= GroupSelection_SelectTroops,
								ZoomStart			= 4000,
								AngleStart			= 30,
								CinemaText1			= "@color:0,255,0 Pfeiltasten\t\tPositions-Einstellung @cr F1 + F2\t\tZoom-Einstellung @cr Entf + Einfg\t\tRotations-Einstellung @cr F3 + F4\t\tZoom-Rotations-Einstellung @cr Pause\t\tAusgabe @cr F5 - F8\t\tDauer einstellen @cr Aktuelle Dauer:\t\t",
								CinemaText2			= "@color:0,255,0 1\t\tPositionsspeicherung @cr 2\t\tL\195\182schen der letzten Positionsspeicherung @cr 3\t\tAusgabe der letzten Speicherung @cr F12\t\tStarten des Fluges @cr Aktuelle Dauer:\t\t",
								CurrentCinemaText 	= 1,
								SiteDuration		= 0,
								FlightSafe			= {},
								Flying				= false,
								CurrentFlight		= 0,
							}
	function GameCallback_Escape()
		CutsceneCreatingTools.EscapeOrig()
		CutsceneCreatingTools:ToggleCinematicMode()
	end
 
	function CutsceneCreatingTools:ToggleCinematicMode()
		if IsBriefingActive() or cutsceneIsActive or self.Flying then
			return
		end
		self.CinematicMode = not self.CinematicMode
 
		local flag = self.CinematicMode and 1 or 0
 
		Logic.SetGlobalInvulnerability(flag)
		Interface_SetCinematicMode(flag)
		XGUIEng.ShowWidget( "Cinematic_Headline", flag )
		XGUIEng.ShowWidget( "Cinematic_Text", flag )
		Display.SetFarClipPlaneMinAndMax(0, flag * 14000)
 
		GUI.SetFeedbackSoundOutputState( flag == 1 and 0 or 1 )
 
		if self.CinematicMode then
			Camera.SetControlMode(0)
			Music.SetVolumeAdjustment( self.Music * 0.5 )
			Sound.PlayFeedbackSound( 0, 0 )
			self.MusicEnd = 0
			LocalMusic_UpdateMusic = function() end
			self.MusicJob = StartSimpleJob( "CutsceneCreatingTools_Update" )
			Music.Stop()
			Counter.SetLimit( "CutsceneCreatingText", 50 )
		else
			Music.SetVolumeAdjustment( self.Music )
			LocalMusic_UpdateMusic = self.MusicUpdateOrig
			EndJob(self.MusicJob)
			LocalMusic.SongLength = Logic.GetTime() + 1
			self.MusicTimes = 5
			Counter.CutsceneCreatingText = nil
			self.FlightSafe = {}
		end
 
		CutsceneCreatingTools:ChangeButtons()
	end
 
	function CutsceneCreatingTools_Update()
		CutsceneCreatingTools:UpdateMusic()
		CutsceneCreatingTools:UpdateText()
	end
 
	function CutsceneCreatingTools:UpdateMusic()
		assert(type(self.MusicSet) == "table")
		if self.MusicEnd > Logic.GetTime() then return end
		LocalMusic.SongLength = Logic.GetTime() + 300
 
		local set = self.MusicSet
		if table.getn(set) == 0 then
			assert(type(set.summer) == "table" and type(set.rain) == "table" and type(set.snow) == "table")
			local weatherState = Logic.GetWeatherState()
			if weatherState == 1 then
				set = set.summer
			elseif weatherState == 2 then
				set = set.rain
			else
				set = set.snow
			end
		end
 
		assert(table.getn(set) > 0)
 
		local random = math.random(table.getn(set))
		local song = set[random]
		if self.MusicTimes == 0 then
			self.MusicEnd = Logic.GetTime() + song[2]
		else
			self.MusicTimes = self.MusicTimes - 1
		end
		Sound.StartMusic( "Music" .. string.char(92) .. song[1], song[2] )
	end
 
	function CutsceneCreatingTools:UpdateText()
		if self.Flying then return end
		if Counter.Tick( "CutsceneCreatingText" ) then
			Counter.SetLimit( "CutsceneCreatingText", 50 )
			self.CurrentCinemaText = self.CurrentCinemaText + 1
			if not self["CinemaText" .. self.CurrentCinemaText] then
				self.CurrentCinemaText = 1
			end
 
			PrintBriefingText( self["CinemaText" .. self.CurrentCinemaText] .. ( table.getn(self.FlightSafe) == 0 and "noch nicht m\195\182glich" or self.SiteDuration ) )
		end
	end
 
	function CutsceneCreatingTools:ChangeButtons()
		--F1 and F2 for zoom, F3 and F4 for rotation, F5 and F6 for angle
		if self.CinematicMode then
			PrintBriefingHeadline( "@color:255,250,200 Steuerung" )
			GUIAction_ToggleMenu = function( _menu, _flag )
										if _menu == gvGUI_WidgetID.MainMenuWindow then
											CutsceneCreatingTools:MainMenuWindowButton()
										elseif _menu == gvGUI_WidgetID.DiplomacyWindow then
											CutsceneCreatingTools:DiplomacyWindowButton()
										elseif _menu == gvGUI_WidgetID.TradeWindow then
											CutsceneCreatingTools:TributeWindowButton()
										elseif _menu == gvGUI_WidgetID.QuestWindow then
											CutsceneCreatingTools:QuestWindowButton()
										elseif _menu == gvGUI_WidgetID.StatisticsWindow then
											CutsceneCreatingTools:StatisticsWindowButton()
										end
									end
			QuickSave = function() CutsceneCreatingTools:QuickSaveButton() end
			KeyBindings_TogglePause = function() CutsceneCreatingTools:PrintCutsceneTable() end
			QuickLoad = function() CutsceneCreatingTools:QuickLoadButton() end
			KeyBindings_ToggleClock = function() CutsceneCreatingTools:ToggleClockButton() end
			KeyBindings_ToggleSound = function() CutsceneCreatingTools:ToggleSoundButton() end
			GroupSelection_SelectTroops = function(_number) CutsceneCreatingTools:TroopSelectionButtons(_number) end
			Camera.StopCameraFlight()
			Camera.ZoomSetDistance( self.ZoomStart )
			Camera.ZoomSetAngle( self.AngleStart )
			Camera.ScrollSetLookAt( Camera.ScrollGetLookAt() )
 
			PrintBriefingText(self.CinemaText1 .. "noch nicht m\195\182glich")
			self.CurrentCinemaText = 1
 
		else
			GUIAction_ToggleMenu = self.ToggleMenu
			QuickSave = self.QuickSave
			QuickLoad = self.QuickLoad
			KeyBindings_ToggleClock = self.ToggleClock
			self.ZoomStart = 4000
			self.AngleStart = 30
			KeyBindings_TogglePause = self.TogglePause
			KeyBindings_ToggleSound = self.ToggleSound
			GroupSelection_SelectTroops = self.SelectTroops
			self.SiteDuration = 0
		end
	end
 
	function CutsceneCreatingTools:MainMenuWindowButton()
		if self.Flying then return end
		self.ZoomStart = self.ZoomStart + 10
		Camera.StopCameraFlight()
		Camera.ZoomSetDistance( self.ZoomStart )
		Camera.ScrollSetLookAt( Camera.ScrollGetLookAt() )
	end
 
	function CutsceneCreatingTools:DiplomacyWindowButton()
		if self.Flying then return end
		self.ZoomStart = self.ZoomStart - 10
		Camera.StopCameraFlight()
		Camera.ZoomSetDistance( self.ZoomStart )
		Camera.ScrollSetLookAt( Camera.ScrollGetLookAt() )
	end
 
	function CutsceneCreatingTools:TributeWindowButton()
		if self.Flying then return end
		self.AngleStart = self.AngleStart + 1
		Camera.StopCameraFlight()
		Camera.ZoomSetAngle( self.AngleStart )
		Camera.ScrollSetLookAt( Camera.ScrollGetLookAt() )
	end
 
	function CutsceneCreatingTools:QuestWindowButton()
		if self.Flying then return end
		self.AngleStart = self.AngleStart - 1
		Camera.StopCameraFlight()
		Camera.ZoomSetAngle( self.AngleStart )
		Camera.ScrollSetLookAt( Camera.ScrollGetLookAt() )	
	end
 
	function CutsceneCreatingTools:StatisticsWindowButton()
		if self.Flying then return end
		if table.getn(self.FlightSafe) == 0 then return end
		self.SiteDuration = self.SiteDuration + 1
		PrintBriefingText(self["CinemaText" .. self.CurrentCinemaText] .. self.SiteDuration)
	end
 
	function CutsceneCreatingTools:QuickSaveButton()
		if self.Flying then return end
		if table.getn(self.FlightSafe) == 0 then return end
		if self.SiteDuration == 0 then return end
		self.SiteDuration = self.SiteDuration - 1
		if self.SiteDuration < 0 then self.SiteDuration = 0 end
		PrintBriefingText(self["CinemaText" .. self.CurrentCinemaText] .. self.SiteDuration)
	end
 
	function CutsceneCreatingTools:QuickLoadButton()
		if self.Flying or table.getn(self.FlightSafe) == 0 then return end
		self.SiteDuration = self.SiteDuration + 0.1
		PrintBriefingText(self["CinemaText" .. self.CurrentCinemaText] .. self.SiteDuration)
	end
 
	function CutsceneCreatingTools:ToggleClockButton()
		PrintBriefingText( "a call" )
		if self.Flying or table.getn(self.FlightSafe) == 0 or self.SiteDuration == 0 then return end
		self.SiteDuration = self.SiteDuration - 0.1
		if self.SiteDuration < 0.1 then
			self.SiteDuration = 0
		end
		PrintBriefingText(self["CinemaText" .. self.CurrentCinemaText] .. self.SiteDuration)
	end
 
 
	function CutsceneCreatingTools:PrintCutsceneTable()
		if self.Flying then return end
		local s = "\n{\n\tzoom = " .. self.ZoomStart .. ",\n\trotation = " .. Camera.RotGetAngle() .. ",\n\tangle = " .. self.AngleStart .. ",\n\tposition = { "
		local x,y = Camera.ScrollGetLookAt()
		s = s .. "X = " .. x .. ", Y = " .. y .. " },\n\tduration = " .. self.SiteDuration .. ",\n}"
		assert(false, s)
	end
 
	function CutsceneCreatingTools:TroopSelectionButtons(_number)
		if self.Flying then return end
		if _number == 1 then
			self:SavePositionAndDuration()
		elseif _number == 2 then
			self:DeleteLastSafe()
		elseif _number == 3 then
			self:PrintLastSafe()
		end
	end
 
	function CutsceneCreatingTools:SavePositionAndDuration()
		local x, y = Camera.ScrollGetLookAt()
		local entry = {
						  position = { X = x, Y = y },
						  duration = self.SiteDuration,
						  zoom = self.ZoomStart,
						  angle = self.AngleStart,
						  rotation = Camera.RotGetAngle(),
					  }
 
		table.insert( self.FlightSafe, entry )
		PrintBriefingText( self["CinemaText" .. self.CurrentCinemaText] .. self.SiteDuration )
	end
 
	function CutsceneCreatingTools:DeleteLastSafe()
		if table.getn( self.FlightSafe ) > 0 then
			table.remove( self.FlightSafe, table.getn(self.FlightSafe) )
			if table.getn( self.FlightSafe ) == 0 then
				PrintBriefingText( self["CinemaText" .. self.CurrentCinemaText] .. "noch nicht m\195\182glich" )
				self.SiteDuration = 0
			end
		end
	end
 
	function CutsceneCreatingTools:PrintLastSafe()
		local safe = self.FlightSafe[ table.getn(self.FlightSafe) ]
		local s = "\n{\n\tzoom = " .. safe.zoom .. ",\n\trotation = " .. safe.rotation .. ",\n\tangle = " .. safe.angle .. ",\n" ..
			"\tposition = { X = " .. safe.position.X .. ", Y = " ..safe.position.Y .. " },\n\tduration = " .. safe.duration .. ",\n}"
 
		assert(false, s)
	end
 
 
	function CutsceneCreatingTools:ToggleSoundButton()
		if self.Flying then return end
		if table.getn( self.FlightSafe) > 1 then
			self.Flying = true
			self.CurrentFlight = 2
			Camera.SetControlMode(1)
			Counter.SetLimit( "CutsceneFlightControl", -1 )
			local start = self.FlightSafe[1]
			Camera.StopCameraFlight()
			Camera.ZoomSetDistance( start.zoom )
			Camera.RotSetAngle( start.rotation )
			Camera.ZoomSetAngle( start.angle )
			Camera.ScrollSetLookAt( start.position.X, start.position.Y )
			local job = StartSimpleHiResJob( "CutsceneCreatingTools_ControlFlights" )
			if CutsceneCreatingTools_ControlFlights() then
				EndJob(job)
			end
		end
	end
 
	function CutsceneCreatingTools_ControlFlights()
		return CutsceneCreatingTools:ControlFlights()
	end
 
	function CutsceneCreatingTools:ControlFlights()
		if Counter.Tick( "CutsceneFlightControl" ) then
			PrintBriefingHeadline( "@color:255,250,200 Testflug" )
			PrintBriefingText( "@color:0,255,0 Flug " .. (self.CurrentFlight - 1) .. " von " .. (table.getn(self.FlightSafe) - 1) )
			local currFlight = self.FlightSafe[self.CurrentFlight]
			if not currFlight then
				self:FlightsDone()
				return true
			else
				assert(type(currFlight) == "table")
			end
 
			local duration = currFlight.duration
			if duration > 0 then
				Camera.InitCameraFlight()
				Camera.ZoomSetDistanceFlight( currFlight.zoom, duration )
				Camera.RotFlight( currFlight.rotation, duration )
				Camera.ZoomSetAngleFlight( currFlight.angle, duration )
				Camera.FlyToLookAt( currFlight.position.X, currFlight.position.Y, duration )
 
				Counter.SetLimit( "CutsceneFlightControl", math.floor(duration * 10) )
 
				self.CurrentFlight = self.CurrentFlight + 1
			else
				Camera.StopCameraFlight()
				Camera.ZoomSetDistance( currFlight.zoom )
				Camera.RotSetAngle( currFlight.rotation )
				Camera.ZoomSetAngle( currFlight.angle )
				Camera.ScrollSetLookAt( currFlight.position.X, currFlight.position.Y )
 
				self.CurrentFlight = self.CurrentFlight + 1
 
				Counter.SetLimit( "CutsceneFlightControl", 0 )
 
				return self:ControlFlights()
			end
 
		end
	end
 
	function CutsceneCreatingTools:FlightsDone()
		PrintBriefingHeadline( "@color:255,250,200 Steuerung" )
		PrintBriefingText( "@color:0,255,0 Testfl\195\188ge beendet, gehe zu normalem Cutscene-Erstellungs-Modus" )
		self.Flying = false
		Counter.CutsceneFlightControl = nil
 
		Camera.SetControlMode(0)
	end
 
end