mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	MoveArtifact, BulkMoveArtifacts PlayerColor player field
This commit is contained in:
		| @@ -191,7 +191,7 @@ public: | ||||
| 	bool giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact * artType, ArtifactPosition pos) override {return false;} | ||||
| 	bool putArtifact(const ArtifactLocation & al, const CArtifactInstance * art, std::optional<bool> askAssemble) override {return false;}; | ||||
| 	void removeArtifact(const ArtifactLocation & al) override {}; | ||||
| 	bool moveArtifact(const ArtifactLocation & al1, const ArtifactLocation & al2) override {return false;}; | ||||
| 	bool moveArtifact(const PlayerColor & player, const ArtifactLocation & al1, const ArtifactLocation & al2) override {return false;}; | ||||
|  | ||||
| 	void heroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero) override {}; | ||||
| 	void visitCastleObjects(const CGTownInstance * obj, const CGHeroInstance * hero) override {}; | ||||
|   | ||||
| @@ -290,8 +290,8 @@ void ApplyClientNetPackVisitor::visitMoveArtifact(MoveArtifact & pack) | ||||
| 			callInterfaceIfPresent(cl, player, &IGameEventsReceiver::askToAssembleArtifact, pack.dst); | ||||
| 	}; | ||||
|  | ||||
| 	moveArtifact(LOCPLINT->playerID); | ||||
| 	if(cl.getOwner(pack.src.artHolder) != cl.getOwner(pack.dst.artHolder)) | ||||
| 	moveArtifact(pack.interfaceOwner); | ||||
| 	if(pack.interfaceOwner != cl.getOwner(pack.dst.artHolder)) | ||||
| 		moveArtifact(cl.getOwner(pack.dst.artHolder)); | ||||
|  | ||||
| 	cl.invalidatePaths(); // hero might have equipped/unequipped Angel Wings | ||||
| @@ -305,7 +305,7 @@ void ApplyClientNetPackVisitor::visitBulkMoveArtifacts(BulkMoveArtifacts & pack) | ||||
| 		{ | ||||
| 			auto srcLoc = ArtifactLocation(pack.srcArtHolder, slotToMove.srcPos); | ||||
| 			auto dstLoc = ArtifactLocation(pack.dstArtHolder, slotToMove.dstPos); | ||||
| 			MoveArtifact ma(&srcLoc, &dstLoc, pack.askAssemble); | ||||
| 			MoveArtifact ma(pack.interfaceOwner, srcLoc, dstLoc, pack.askAssemble); | ||||
| 			visitMoveArtifact(ma); | ||||
| 		} | ||||
| 	}; | ||||
|   | ||||
| @@ -42,11 +42,11 @@ CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack() | ||||
| 	initAOHbackpack(visibleCapacityMax, backpackCap < 0 || visibleCapacityMax < backpackCap); | ||||
| } | ||||
|  | ||||
| void CArtifactsOfHeroBackpack::scrollBackpack(int offset) | ||||
| void CArtifactsOfHeroBackpack::onSliderMoved(int newVal) | ||||
| { | ||||
| 	if(backpackListBox) | ||||
| 		backpackListBox->resize(getActiveSlotRowsNum()); | ||||
| 	backpackPos += offset; | ||||
| 	backpackPos += newVal; | ||||
| 	auto slot = ArtifactPosition::BACKPACK_START + backpackPos; | ||||
| 	for(auto artPlace : backpack) | ||||
| 	{ | ||||
| @@ -99,7 +99,7 @@ void CArtifactsOfHeroBackpack::initAOHbackpack(size_t slots, bool slider) | ||||
| 		}; | ||||
| 		CListBoxWithCallback::MovedPosCallback posMoved = [this](size_t pos) -> void | ||||
| 		{ | ||||
| 			scrollBackpack(static_cast<int>(pos) * slotsColumnsMax - backpackPos); | ||||
| 			onSliderMoved(static_cast<int>(pos) * slotsColumnsMax - backpackPos); | ||||
| 		}; | ||||
| 		backpackListBox = std::make_shared<CListBoxWithCallback>( | ||||
| 			posMoved, onCreate, Point(0, 0), Point(0, 0), slotsRowsMax, 0, 0, 1, | ||||
|   | ||||
| @@ -24,7 +24,7 @@ class CArtifactsOfHeroBackpack : public CArtifactsOfHeroBase | ||||
| public: | ||||
| 	CArtifactsOfHeroBackpack(size_t slotsColumnsMax, size_t slotsRowsMax); | ||||
| 	CArtifactsOfHeroBackpack(); | ||||
| 	void scrollBackpack(int offset); | ||||
| 	void onSliderMoved(int newVal); | ||||
| 	void updateBackpackSlots() override; | ||||
| 	size_t getActiveSlotRowsNum(); | ||||
| 	size_t getSlotsNum(); | ||||
|   | ||||
| @@ -110,7 +110,7 @@ public: | ||||
| 	virtual bool giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact * artType, ArtifactPosition pos) = 0; | ||||
| 	virtual bool putArtifact(const ArtifactLocation & al, const CArtifactInstance * art, std::optional<bool> askAssemble = std::nullopt) = 0; | ||||
| 	virtual void removeArtifact(const ArtifactLocation &al) = 0; | ||||
| 	virtual bool moveArtifact(const ArtifactLocation &al1, const ArtifactLocation &al2) = 0; | ||||
| 	virtual bool moveArtifact(const PlayerColor & player, const ArtifactLocation & al1, const ArtifactLocation & al2) = 0; | ||||
|  | ||||
| 	virtual void heroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero)=0; | ||||
| 	virtual void visitCastleObjects(const CGTownInstance * obj, const CGHeroInstance * hero)=0; | ||||
|   | ||||
| @@ -1030,10 +1030,11 @@ struct DLL_LINKAGE EraseArtifact : CArtifactOperationPack | ||||
| struct DLL_LINKAGE MoveArtifact : CArtifactOperationPack | ||||
| { | ||||
| 	MoveArtifact() = default; | ||||
| 	MoveArtifact(ArtifactLocation * src, ArtifactLocation * dst, bool askAssemble = true) | ||||
| 		: src(*src), dst(*dst), askAssemble(askAssemble) | ||||
| 	MoveArtifact(const PlayerColor & interfaceOwner, const ArtifactLocation & src, ArtifactLocation & dst, bool askAssemble = true) | ||||
| 		: interfaceOwner(interfaceOwner), src(src), dst(dst), askAssemble(askAssemble) | ||||
| 	{ | ||||
| 	} | ||||
| 	PlayerColor interfaceOwner; | ||||
| 	ArtifactLocation src; | ||||
| 	ArtifactLocation dst; | ||||
| 	bool askAssemble = true; | ||||
| @@ -1043,6 +1044,7 @@ struct DLL_LINKAGE MoveArtifact : CArtifactOperationPack | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler & h) | ||||
| 	{ | ||||
| 		h & interfaceOwner; | ||||
| 		h & src; | ||||
| 		h & dst; | ||||
| 		h & askAssemble; | ||||
| @@ -1069,13 +1071,15 @@ struct DLL_LINKAGE BulkMoveArtifacts : CArtifactOperationPack | ||||
| 		} | ||||
| 	}; | ||||
|  | ||||
| 	PlayerColor interfaceOwner; | ||||
| 	ObjectInstanceID srcArtHolder; | ||||
| 	ObjectInstanceID dstArtHolder; | ||||
| 	std::optional<SlotID> srcCreature; | ||||
| 	std::optional<SlotID> dstCreature; | ||||
|  | ||||
| 	BulkMoveArtifacts() | ||||
| 		: srcArtHolder(ObjectInstanceID::NONE) | ||||
| 		: interfaceOwner(PlayerColor::NEUTRAL) | ||||
| 		, srcArtHolder(ObjectInstanceID::NONE) | ||||
| 		, dstArtHolder(ObjectInstanceID::NONE) | ||||
| 		, swap(false) | ||||
| 		, askAssemble(false) | ||||
| @@ -1083,8 +1087,9 @@ struct DLL_LINKAGE BulkMoveArtifacts : CArtifactOperationPack | ||||
| 		, dstCreature(std::nullopt) | ||||
| 	{ | ||||
| 	} | ||||
| 	BulkMoveArtifacts(const ObjectInstanceID srcArtHolder, const ObjectInstanceID dstArtHolder, bool swap) | ||||
| 		: srcArtHolder(std::move(srcArtHolder)) | ||||
| 	BulkMoveArtifacts(const PlayerColor & interfaceOwner, const ObjectInstanceID srcArtHolder, const ObjectInstanceID dstArtHolder, bool swap) | ||||
| 		: interfaceOwner(interfaceOwner) | ||||
| 		, srcArtHolder(std::move(srcArtHolder)) | ||||
| 		, dstArtHolder(std::move(dstArtHolder)) | ||||
| 		, swap(swap) | ||||
| 		, askAssemble(false) | ||||
| @@ -1104,6 +1109,7 @@ struct DLL_LINKAGE BulkMoveArtifacts : CArtifactOperationPack | ||||
|  | ||||
| 	template <typename Handler> void serialize(Handler & h) | ||||
| 	{ | ||||
| 		h & interfaceOwner; | ||||
| 		h & artsPack0; | ||||
| 		h & artsPack1; | ||||
| 		h & srcArtHolder; | ||||
|   | ||||
| @@ -2690,7 +2690,7 @@ bool CGameHandler::garrisonSwap(ObjectInstanceID tid) | ||||
|  | ||||
| // With the amount of changes done to the function, it's more like transferArtifacts. | ||||
| // Function moves artifact from src to dst. If dst is not a backpack and is already occupied, old dst art goes to backpack and is replaced. | ||||
| bool CGameHandler::moveArtifact(const ArtifactLocation & src, const ArtifactLocation & dst) | ||||
| bool CGameHandler::moveArtifact(const PlayerColor & player, const ArtifactLocation & src, const ArtifactLocation & dst) | ||||
| { | ||||
| 	const auto srcArtSet = getArtSet(src); | ||||
| 	const auto dstArtSet = getArtSet(dst); | ||||
| @@ -2733,7 +2733,7 @@ bool CGameHandler::moveArtifact(const ArtifactLocation & src, const ArtifactLoca | ||||
| 	if(src.slot == dstSlot && src.artHolder == dst.artHolder) | ||||
| 		COMPLAIN_RET("Won't move artifact: Dest same as source!"); | ||||
| 	 | ||||
| 	BulkMoveArtifacts ma(src.artHolder, dst.artHolder, false); | ||||
| 	BulkMoveArtifacts ma(player, src.artHolder, dst.artHolder, false); | ||||
| 	ma.srcCreature = src.creature; | ||||
| 	ma.dstCreature = dst.creature; | ||||
| 	 | ||||
| @@ -2756,7 +2756,7 @@ bool CGameHandler::moveArtifact(const ArtifactLocation & src, const ArtifactLoca | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| bool CGameHandler::bulkMoveArtifacts(ObjectInstanceID srcId, ObjectInstanceID dstId, bool swap, bool equipped, bool backpack) | ||||
| bool CGameHandler::bulkMoveArtifacts(const PlayerColor & player, ObjectInstanceID srcId, ObjectInstanceID dstId, bool swap, bool equipped, bool backpack) | ||||
| { | ||||
| 	// Make sure exchange is even possible between the two heroes. | ||||
| 	if(!isAllowedExchange(srcId, dstId)) | ||||
| @@ -2767,7 +2767,7 @@ bool CGameHandler::bulkMoveArtifacts(ObjectInstanceID srcId, ObjectInstanceID ds | ||||
| 	if((!psrcSet) || (!pdstSet)) | ||||
| 		COMPLAIN_RET("bulkMoveArtifacts: wrong hero's ID"); | ||||
|  | ||||
| 	BulkMoveArtifacts ma(srcId, dstId, swap); | ||||
| 	BulkMoveArtifacts ma(player, srcId, dstId, swap); | ||||
| 	auto & slotsSrcDst = ma.artsPack0; | ||||
| 	auto & slotsDstSrc = ma.artsPack1; | ||||
|  | ||||
| @@ -2857,12 +2857,12 @@ bool CGameHandler::bulkMoveArtifacts(ObjectInstanceID srcId, ObjectInstanceID ds | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| bool CGameHandler::scrollBackpackArtifacts(const ObjectInstanceID heroID, bool left) | ||||
| bool CGameHandler::scrollBackpackArtifacts(const PlayerColor & player, const ObjectInstanceID heroID, bool left) | ||||
| { | ||||
| 	auto artSet = getArtSet(heroID); | ||||
| 	COMPLAIN_RET_FALSE_IF(artSet == nullptr, "scrollBackpackArtifacts: wrong hero's ID"); | ||||
|  | ||||
| 	BulkMoveArtifacts bma(heroID, heroID, false); | ||||
| 	BulkMoveArtifacts bma(player, heroID, heroID, false); | ||||
|  | ||||
| 	const auto backpackEnd = ArtifactPosition(ArtifactPosition::BACKPACK_START + artSet->artifactsInBackpack.size() - 1); | ||||
| 	if(backpackEnd > ArtifactPosition::BACKPACK_START) | ||||
|   | ||||
| @@ -128,9 +128,9 @@ public: | ||||
| 	bool giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact * artType, ArtifactPosition pos = ArtifactPosition::FIRST_AVAILABLE) override; | ||||
| 	bool putArtifact(const ArtifactLocation & al, const CArtifactInstance * art, std::optional<bool> askAssemble) override; | ||||
| 	void removeArtifact(const ArtifactLocation &al) override; | ||||
| 	bool moveArtifact(const ArtifactLocation & src, const ArtifactLocation & dst) override; | ||||
| 	bool bulkMoveArtifacts(ObjectInstanceID srcId, ObjectInstanceID dstId, bool swap, bool equipped, bool backpack); | ||||
| 	bool scrollBackpackArtifacts(const ObjectInstanceID heroID, bool left); | ||||
| 	bool moveArtifact(const PlayerColor & player, const ArtifactLocation & src, const ArtifactLocation & dst) override; | ||||
| 	bool bulkMoveArtifacts(const PlayerColor & player, ObjectInstanceID srcId, ObjectInstanceID dstId, bool swap, bool equipped, bool backpack); | ||||
| 	bool scrollBackpackArtifacts(const PlayerColor & player, const ObjectInstanceID heroID, bool left); | ||||
| 	bool eraseArtifactByClient(const ArtifactLocation & al); | ||||
| 	void synchronizeArtifactHandlerLists(); | ||||
|  | ||||
|   | ||||
| @@ -136,7 +136,7 @@ void ApplyGhNetPackVisitor::visitExchangeArtifacts(ExchangeArtifacts & pack) | ||||
| { | ||||
| 	if(gh.getHero(pack.src.artHolder)) | ||||
| 		gh.throwIfWrongPlayer(&pack, gh.getOwner(pack.src.artHolder)); //second hero can be ally | ||||
| 	result = gh.moveArtifact(pack.src, pack.dst); | ||||
| 	result = gh.moveArtifact(pack.player, pack.src, pack.dst); | ||||
| } | ||||
|  | ||||
| void ApplyGhNetPackVisitor::visitBulkExchangeArtifacts(BulkExchangeArtifacts & pack) | ||||
| @@ -145,7 +145,7 @@ void ApplyGhNetPackVisitor::visitBulkExchangeArtifacts(BulkExchangeArtifacts & p | ||||
| 		gh.throwIfWrongOwner(&pack, pack.srcHero); | ||||
| 	if(pack.swap) | ||||
| 		gh.throwIfWrongOwner(&pack, pack.dstHero); | ||||
| 	result = gh.bulkMoveArtifacts(pack.srcHero, pack.dstHero, pack.swap, pack.equipped, pack.backpack); | ||||
| 	result = gh.bulkMoveArtifacts(pack.player, pack.srcHero, pack.dstHero, pack.swap, pack.equipped, pack.backpack); | ||||
| } | ||||
|  | ||||
| void ApplyGhNetPackVisitor::visitManageBackpackArtifacts(ManageBackpackArtifacts & pack) | ||||
| @@ -153,9 +153,9 @@ void ApplyGhNetPackVisitor::visitManageBackpackArtifacts(ManageBackpackArtifacts | ||||
| 	if(gh.getPlayerRelations(pack.player, gh.getOwner(pack.artHolder)) != PlayerRelations::ENEMIES) | ||||
| 	{ | ||||
| 		if(pack.cmd == ManageBackpackArtifacts::ManageCmd::SCROLL_LEFT) | ||||
| 			result = gh.scrollBackpackArtifacts(pack.artHolder, true); | ||||
| 			result = gh.scrollBackpackArtifacts(pack.player, pack.artHolder, true); | ||||
| 		else if(pack.cmd == ManageBackpackArtifacts::ManageCmd::SCROLL_RIGHT) | ||||
| 			result = gh.scrollBackpackArtifacts(pack.artHolder, false); | ||||
| 			result = gh.scrollBackpackArtifacts(pack.player, pack.artHolder, false); | ||||
| 		else | ||||
| 		{ | ||||
| 			gh.throwIfWrongOwner(&pack, pack.artHolder); | ||||
|   | ||||
| @@ -206,6 +206,9 @@ bool OpenWindowQuery::blocksPack(const CPack *pack) const | ||||
| 		if(dynamic_ptr_cast<BulkExchangeArtifacts>(pack) != nullptr) | ||||
| 			return false; | ||||
|  | ||||
| 		if(dynamic_ptr_cast<ManageBackpackArtifacts>(pack) != nullptr) | ||||
| 			return false; | ||||
|  | ||||
| 		if(dynamic_ptr_cast<AssembleArtifacts>(pack)) | ||||
| 			return false; | ||||
|  | ||||
|   | ||||
| @@ -70,7 +70,7 @@ public: | ||||
| 	bool giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact * artType, ArtifactPosition pos) override {return false;} | ||||
| 	bool putArtifact(const ArtifactLocation & al, const CArtifactInstance * art, std::optional<bool> askAssemble) override {return false;} | ||||
| 	void removeArtifact(const ArtifactLocation &al) override {} | ||||
| 	bool moveArtifact(const ArtifactLocation &al1, const ArtifactLocation &al2) override {return false;} | ||||
| 	bool moveArtifact(const PlayerColor & player, const ArtifactLocation & al1, const ArtifactLocation & al2) override {return false;} | ||||
|  | ||||
| 	void heroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero) override {} | ||||
| 	void stopHeroVisitCastle(const CGTownInstance * obj, const CGHeroInstance * hero) override {} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user