소스 검색

Use ResourcePath for video accessing

Ivan Savenko 2 년 전
부모
커밋
97b7d44c88

+ 3 - 3
client/CMT.cpp

@@ -423,10 +423,10 @@ int main(int argc, char * argv[])
 //plays intro, ends when intro is over or button has been pressed (handles events)
 void playIntro()
 {
-	if(CCS->videoh->openAndPlayVideo("3DOLOGO.SMK", 0, 1, true, true))
+	if(CCS->videoh->openAndPlayVideo(VideoPath::builtin("3DOLOGO.SMK"), 0, 1, true, true))
 	{
-		if (CCS->videoh->openAndPlayVideo("NWCLOGO.SMK", 0, 1, true, true))
-			CCS->videoh->openAndPlayVideo("H3INTRO.SMK", 0, 1, true, true);
+		if (CCS->videoh->openAndPlayVideo(VideoPath::builtin("NWCLOGO.SMK"), 0, 1, true, true))
+			CCS->videoh->openAndPlayVideo(VideoPath::builtin("H3INTRO.SMK"), 0, 1, true, true);
 	}
 }
 

+ 9 - 10
client/CVideoHandler.cpp

@@ -70,30 +70,28 @@ CVideoPlayer::CVideoPlayer()
 	, doLoop(false)
 {}
 
-bool CVideoPlayer::open(std::string fname, bool scale)
+bool CVideoPlayer::open(const VideoPath & fname, bool scale)
 {
 	return open(fname, true, false);
 }
 
 // loop = to loop through the video
 // useOverlay = directly write to the screen.
-bool CVideoPlayer::open(std::string fname, bool loop, bool useOverlay, bool scale)
+bool CVideoPlayer::open(const VideoPath & fname, bool loop, bool useOverlay, bool scale)
 {
 	close();
 
-	this->fname = fname;
+	this->fname = fname.addPrefix("VIDEO/");
 	doLoop = loop;
 	frameTime = 0;
 
-	ResourcePath resource(std::string("Video/") + fname, EResType::VIDEO);
-
-	if (!CResourceHandler::get()->existsResource(resource))
+	if (!CResourceHandler::get()->existsResource(fname))
 	{
-		logGlobal->error("Error: video %s was not found", resource.getName());
+		logGlobal->error("Error: video %s was not found", fname.getName());
 		return false;
 	}
 
-	data = CResourceHandler::get()->load(resource);
+	data = CResourceHandler::get()->load(fname);
 
 	static const int BUFFER_SIZE = 4096;
 
@@ -382,7 +380,8 @@ void CVideoPlayer::update( int x, int y, SDL_Surface *dst, bool forceRedraw, boo
 
 void CVideoPlayer::close()
 {
-	fname.clear();
+	fname = VideoPath();
+
 	if (sws)
 	{
 		sws_freeContext(sws);
@@ -467,7 +466,7 @@ bool CVideoPlayer::playVideo(int x, int y, bool stopOnKey)
 	return true;
 }
 
-bool CVideoPlayer::openAndPlayVideo(std::string name, int x, int y, bool stopOnKey, bool scale)
+bool CVideoPlayer::openAndPlayVideo(const VideoPath & name, int x, int y, bool stopOnKey, bool scale)
 {
 	open(name, false, true, scale);
 	bool ret = playVideo(x, y,  stopOnKey);

+ 8 - 7
client/CVideoHandler.h

@@ -10,6 +10,7 @@
 #pragma once
 
 #include "../lib/Rect.h"
+#include "../lib/filesystem/ResourcePath.h"
 
 struct SDL_Surface;
 struct SDL_Texture;
@@ -17,7 +18,7 @@ struct SDL_Texture;
 class IVideoPlayer
 {
 public:
-	virtual bool open(std::string name, bool scale = false)=0; //true - succes
+	virtual bool open(const VideoPath & name, bool scale = false)=0; //true - succes
 	virtual void close()=0;
 	virtual bool nextFrame()=0;
 	virtual void show(int x, int y, SDL_Surface *dst, bool update = true)=0;
@@ -30,10 +31,10 @@ public:
 class IMainVideoPlayer : public IVideoPlayer
 {
 public:
-	std::string fname;  //name of current video file (empty if idle)
+	VideoPath fname;  //name of current video file (empty if idle)
 
 	virtual void update(int x, int y, SDL_Surface *dst, bool forceRedraw, bool update = true){}
-	virtual bool openAndPlayVideo(std::string name, int x, int y, bool stopOnKey = false, bool scale = false)
+	virtual bool openAndPlayVideo(const VideoPath & name, int x, int y, bool stopOnKey = false, bool scale = false)
 	{
 		return false;
 	}
@@ -49,7 +50,7 @@ public:
 	bool nextFrame() override {return false;};
 	void close() override {};
 	bool wait() override {return false;};
-	bool open(std::string name, bool scale = false) override {return false;};
+	bool open(const VideoPath & name, bool scale = false) override {return false;};
 };
 
 #ifndef DISABLE_VIDEO
@@ -85,14 +86,14 @@ class CVideoPlayer : public IMainVideoPlayer
 	bool doLoop;				// loop through video
 
 	bool playVideo(int x, int y, bool stopOnKey);
-	bool open(std::string fname, bool loop, bool useOverlay = false, bool scale = false);
+	bool open(const VideoPath & fname, bool loop, bool useOverlay = false, bool scale = false);
 
 public:
 	CVideoPlayer();
 	~CVideoPlayer();
 
 	bool init();
-	bool open(std::string fname, bool scale = false) override;
+	bool open(const VideoPath & fname, bool scale = false) override;
 	void close() override;
 	bool nextFrame() override;			// display next frame
 
@@ -101,7 +102,7 @@ public:
 	void update(int x, int y, SDL_Surface *dst, bool forceRedraw, bool update = true) override; //moves to next frame if appropriate, and blits it or blits only if redraw parameter is set true
 
 	// Opens video, calls playVideo, closes video; returns playVideo result (if whole video has been played)
-	bool openAndPlayVideo(std::string name, int x, int y, bool stopOnKey = false, bool scale = false) override;
+	bool openAndPlayVideo(const VideoPath & name, int x, int y, bool stopOnKey = false, bool scale = false) override;
 
 	//TODO:
 	bool wait() override {return false;};

+ 4 - 4
client/battle/BattleInterfaceClasses.cpp

@@ -581,7 +581,7 @@ BattleResultWindow::BattleResultWindow(const BattleResult & br, CPlayerInterface
 		}
 
 		CCS->musich->playMusic("Music/Win Battle", false, true);
-		CCS->videoh->open("WIN3.BIK");
+		CCS->videoh->open(VideoPath::builtin("WIN3.BIK"));
 		std::string str = CGI->generaltexth->allTexts[text];
 
 		const CGHeroInstance * ourHero = owner.cb->battleGetMyHero();
@@ -598,19 +598,19 @@ BattleResultWindow::BattleResultWindow(const BattleResult & br, CPlayerInterface
 	{
 		int text = 311;
 		std::string musicName = "Music/LoseCombat";
-		std::string videoName = "LBSTART.BIK";
+		VideoPath videoName = VideoPath::builtin("LBSTART.BIK");
 		switch(br.result)
 		{
 		case EBattleResult::NORMAL:
 			break;
 		case EBattleResult::ESCAPE:
 			musicName = "Music/Retreat Battle";
-			videoName = "RTSTART.BIK";
+			videoName = VideoPath::builtin("RTSTART.BIK");
 			text = 310;
 			break;
 		case EBattleResult::SURRENDER:
 			musicName = "Music/Surrender Battle";
-			videoName = "SURRENDER.BIK";
+			videoName = VideoPath::builtin("SURRENDER.BIK");
 			text = 309;
 			break;
 		default:

+ 1 - 1
client/mainmenu/CCampaignScreen.cpp

@@ -99,7 +99,7 @@ CCampaignScreen::CCampaignButton::CCampaignButton(const JsonNode & config)
 	pos.h = 116;
 
 	campFile = config["file"].String();
-	video = config["video"].String();
+	video = VideoPath::fromJson(config["video"]);
 
 	status = config["open"].Bool() ? CCampaignScreen::ENABLED : CCampaignScreen::DISABLED;
 

+ 1 - 1
client/mainmenu/CCampaignScreen.h

@@ -37,7 +37,7 @@ private:
 		CampaignStatus status;
 
 		std::string campFile; // the filename/resourcename of the campaign
-		std::string video; // the resource name of the video
+		VideoPath video; // the resource name of the video
 		std::string hoverText;
 
 		void clickReleased(const Point & cursorPosition) override;

+ 1 - 1
client/mainmenu/CMainMenu.cpp

@@ -116,7 +116,7 @@ void CMenuScreen::activate()
 {
 	CCS->musich->playMusic("Music/MainMenu", true, true);
 	if(!config["video"].isNull())
-		CCS->videoh->open(config["video"]["name"].String());
+		CCS->videoh->open(VideoPath::fromJson(config["video"]["name"]));
 	CIntObject::activate();
 }
 

+ 2 - 2
client/windows/CSpellWindow.cpp

@@ -397,13 +397,13 @@ void CSpellWindow::setCurrentPage(int value)
 void CSpellWindow::turnPageLeft()
 {
 	if(settings["video"]["spellbookAnimation"].Bool())
-		CCS->videoh->openAndPlayVideo("PGTRNLFT.SMK", pos.x+13, pos.y+15);
+		CCS->videoh->openAndPlayVideo(VideoPath::builtin("PGTRNLFT.SMK"), pos.x+13, pos.y+15);
 }
 
 void CSpellWindow::turnPageRight()
 {
 	if(settings["video"]["spellbookAnimation"].Bool())
-		CCS->videoh->openAndPlayVideo("PGTRNRGH.SMK", pos.x+13, pos.y+15);
+		CCS->videoh->openAndPlayVideo(VideoPath::builtin("PGTRNRGH.SMK"), pos.x+13, pos.y+15);
 }
 
 void CSpellWindow::keyPressed(EShortcut key)

+ 1 - 1
client/windows/GUIClasses.cpp

@@ -513,7 +513,7 @@ CTavernWindow::CTavernWindow(const CGObjectInstance * TavernObj)
 	if(LOCPLINT->castleInt)
 		CCS->videoh->open(LOCPLINT->castleInt->town->town->clientInfo.tavernVideo);
 	else
-		CCS->videoh->open("TAVERN.BIK");
+		CCS->videoh->open(VideoPath::builtin("TAVERN.BIK"));
 }
 
 void CTavernWindow::recruitb()

+ 1 - 1
lib/CTownHandler.cpp

@@ -884,7 +884,7 @@ void CTownHandler::loadClientData(CTown &town, const JsonNode & source) const
 	info.buildingsIcons = AnimationPath::fromJson(source["buildingsIcons"]);
 
 	info.guildBackground = ImagePath::fromJson(source["guildBackground"]);
-	info.tavernVideo = source["tavernVideo"].String();
+	info.tavernVideo = VideoPath::fromJson(source["tavernVideo"]);
 
 	loadTownHall(town,   source["hallSlots"]);
 	loadStructures(town, source["structures"]);

+ 1 - 1
lib/CTownHandler.h

@@ -304,7 +304,7 @@ public:
 		int icons[2][2];
 		std::string iconSmall[2][2]; /// icon names used during loading
 		std::string iconLarge[2][2];
-		std::string tavernVideo;
+		VideoPath tavernVideo;
 		std::string musicTheme;
 		ImagePath townBackground;
 		ImagePath guildBackground;

+ 4 - 4
lib/campaign/CampaignHandler.cpp

@@ -166,7 +166,7 @@ CampaignScenario CampaignHandler::readScenarioFromJson(JsonNode & reader)
 		ret.hasPrologEpilog = !identifier.isNull();
 		if(ret.hasPrologEpilog)
 		{
-			ret.prologVideo = identifier["video"].String();
+			ret.prologVideo = VideoPath::fromJson(identifier["video"]);
 			ret.prologMusic = identifier["music"].String();
 			ret.prologText = identifier["text"].String();
 		}
@@ -590,13 +590,13 @@ std::vector< std::vector<ui8> > CampaignHandler::getFile(std::unique_ptr<CInputS
 	return ret;
 }
 
-std::string CampaignHandler::prologVideoName(ui8 index)
+VideoPath CampaignHandler::prologVideoName(ui8 index)
 {
 	JsonNode config(JsonPath::builtin("CONFIG/campaignMedia"));
 	auto vids = config["videos"].Vector();
 	if(index < vids.size())
-		return vids[index].String();
-	return "";
+		return VideoPath::fromJson(vids[index]);
+	return VideoPath();
 }
 
 std::string CampaignHandler::prologMusicName(ui8 index)

+ 2 - 1
lib/campaign/CampaignHandler.h

@@ -10,6 +10,7 @@
 #pragma once
 
 #include "CampaignState.h" // Convenience include - not required for build, but required for any user of CampaignHandler
+#include "../filesystem/ResourcePath.h"
 
 VCMI_LIB_NAMESPACE_BEGIN
 
@@ -32,7 +33,7 @@ class DLL_LINKAGE CampaignHandler
 	/// headerOnly - only header will be decompressed, returned vector wont have any maps
 	static std::vector<std::vector<ui8>> getFile(std::unique_ptr<CInputStream> file, bool headerOnly);
 
-	static std::string prologVideoName(ui8 index);
+	static VideoPath prologVideoName(ui8 index);
 	static std::string prologMusicName(ui8 index);
 	static std::string prologVoiceName(ui8 index);
 

+ 3 - 1
lib/campaign/CampaignScenarioPrologEpilog.h

@@ -9,12 +9,14 @@
  */
 #pragma once
 
+#include "../filesystem/ResourcePath.h"
+
 VCMI_LIB_NAMESPACE_BEGIN
 
 struct DLL_LINKAGE CampaignScenarioPrologEpilog
 {
 	bool hasPrologEpilog = false;
-	std::string prologVideo; // from CmpMovie.txt
+	VideoPath prologVideo; // from CmpMovie.txt
 	std::string prologMusic; // from CmpMusic.txt
 	std::string prologText;
 

+ 6 - 0
lib/filesystem/ResourcePath.h

@@ -83,6 +83,11 @@ public:
 		return name == other.name && type == other.type;
 	}
 
+	inline bool operator!=(const ResourcePath & other) const
+	{
+		return name != other.name || type != other.type;
+	}
+
 	inline bool operator<(const ResourcePath & other) const
 	{
 		if (type != other.type)
@@ -171,6 +176,7 @@ using AnimationPath = ResourcePathTempl<EResType::ANIMATION>;
 using ImagePath = ResourcePathTempl<EResType::IMAGE>;
 using TextPath = ResourcePathTempl<EResType::TEXT>;
 using JsonPath = ResourcePathTempl<EResType::JSON>;
+using VideoPath = ResourcePathTempl<EResType::VIDEO>;
 
 namespace EResTypeHelper
 {