// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef NL_ACTION_PHRASE_FABER_H #define NL_ACTION_PHRASE_FABER_H #include "nel/misc/types_nl.h" #include "inventory_manager.h" #include "game_share/rm_family.h" #include "game_share/brick_families.h" #include "game_share/item_origin.h" #include "skill_change_callback.h" // *************************************************************************** class CSBrickSheet; // *************************************************************************** // There is at max 10 requirement line: 5 item part, and 5 formula items #define MAX_ITEM_REQ_LINE 10 #define MAX_MP_SLOT 36 // *************************************************************************** /** * Faber Execution Manager * \author Lionel Berenguier * \author Nevrax France * \date 2003 */ class CActionPhraseFaber { public: /// Constructor CActionPhraseFaber(); /// open the window void launchFaberCastWindow(sint32 memoryLine, uint memoryIndex, CSBrickSheet *rootBrick); /// called when the window is closed void onCloseFaberCastWindow(); /// Fill the Faber Plan selection DB (no window opened) void fillFaberPlanSelection(const std::string &brickDB, uint maxSelection); /// Called when the user has selected the Plan. copy bag. the itemPlanBrick must have "FaberPlan" good infos. void validateFaberPlanSelection(CSBrickSheet *itemPlanBrick); /// Called when the user click on a slot (full or empty) void startMpSelection(uint itemReqLine, uint mpSlot); /// Called when the user validate click on a mp slot void validateMpSelection(uint selectId); /// Called when the user selected the mp quantity to change void validateMpSelectQuantity(); /// Validate the execution void validateExecution(); private: struct CItem { // Item Origin uint16 InventoryId; // INVENTORIES::TInventory uint16 IdInInventory; // Item State NLMISC::CSheetId Sheet; sint32 Quality; sint32 Quantity; sint32 UserColor; sint32 Weight; // BitField to know which itemReqLine has selected this Item uint Selected; // This is the original quantity in inventory sint32 OriginalQuantity; bool LockedByOwner; CItem() : Sheet(0) { Quality= 0; Quantity= 0; UserColor= 0; Weight= 0; Selected= 0; OriginalQuantity= 0; } void reset() { InventoryId= 0; IdInInventory= 0; Sheet= NLMISC::CSheetId::Unknown; Quality= 0; Quantity= 0; UserColor= 0; Weight= 0; Selected= 0; OriginalQuantity= 0; } }; // The observer in case of skill change class CSkillObserver : public ISkillChangeCallback { public: virtual void onSkillChange(); }; CSkillObserver _SkillObserver; friend class CSkillObserver; // For Selection/Validate uint _MpSelectionItemReqLine; std::vector _MpCurrentSelection; // For Change Quantity/Validate uint _MpChangeQuantitySlot; // the Launched Action sint32 _ExecuteFromMemoryLine; uint _ExecuteFromMemoryIndex; CSBrickSheet *_ExecuteFromItemPlanBrick; // The required brick family for the rootBrick std::vector _FaberPlanBrickFamilies; // The Inventory manipulated. std::vector _InventoryMirror; bool _InventoryObsSetup; class CDBInventoryObs : public NLMISC::ICDBNode::IPropertyObserver { public: virtual void update(NLMISC::ICDBNode* node); }; CDBInventoryObs _DBInventoryObs; friend class CDBInventoryObs; // The animals Status class CDBAnimalObs : public NLMISC::ICDBNode::IPropertyObserver { public: virtual void update(NLMISC::ICDBNode* node); }; CDBAnimalObs _DBAnimalObs; friend class CDBAnimalObs; // The Current MP Construction for a Line of Item Requirement class CMPBuild { public: // Different Type of requirement per line enum TReqLineType { ItemPartReq=0, // The line requires MPs that can craft a particular ItemPart SpecificItemReq, // The line requires specific MP NumReqLineType }; public: TReqLineType RequirementType; // Bkup from BrickPlan RM_FABER_TYPE::TRMFType FaberTypeRequired; // valid if RequirementType==ItemPartReq NLMISC::CSheetId SpecificItemRequired; // valid if RequirementType==SpecificItemReq // For each MpSlot, the Inventory index (points to _InventoryMirror), and the quantity selected uint Id[MAX_MP_SLOT]; // For each MpSlot, the quantity selected uint QuantitySelected[MAX_MP_SLOT]; // The quantity required for this line uint QuantityReq; // The number of mpSlot setuped (ie where quantity!=0) uint NumMpSlot; public: CMPBuild() { reset(); } void reset() { RequirementType= ItemPartReq; FaberTypeRequired= RM_FABER_TYPE::Unknown; SpecificItemRequired= NLMISC::CSheetId::Unknown; QuantityReq= 0; NumMpSlot= 0; // For all slot, reset the quantities setuped for(uint mpSlot=0;mpSlot &mps); void filterSelectionItemPart(std::vector &mps, RM_FABER_TYPE::TRMFType itemPartFilter, ITEM_ORIGIN::EItemOrigin originFilter); void filterSelectionItemSpecific(std::vector &mps, NLMISC::CSheetId specificItemWanted); uint getMaxQuantityChange(uint itemReqLine, uint mpSlot) const; uint getTotalQuantitySetuped(uint itemReqLine) const; void updateEmptySlot(uint itemReqLine, CInterfaceGroup *itemReqLineGroup=NULL); void updateQuantityView(uint itemReqLine); void updateValidButton(); void deleteMpSlot(uint itemReqLine, uint mpSlot); // When the inventory is modified, must do some checks on the current faber execution void onInventoryChange(); void removeMpSlotThatUseInvSlot(uint invSlot, uint quantityToRemove); // from an index in _InventoryMirror, get the ItemImage CItemImage *getInvMirrorItemImage(uint slotIndex, uint& invId, uint& indexInInv); bool isMpAvailable(CItemSheet *mpSheet, uint invId, uint slotIndex) const; void updateItemResult(); }; // *************************************************************************** // Called when click a Faber phrase extern void launchFaberCastWindow(sint32 memoryLine, uint memoryIndex, CSBrickSheet *rootBrick); // Called when select a Faber plan extern void fillFaberPlanSelection(const std::string &brickDB, uint maxSelection); // Called when the Faber plan is selected extern void validateFaberPlanSelection(CSBrickSheet *itemPlanBrick); // Called when something needs to close the crafting window (does nothing if not open) extern void closeFaberCastWindow(); #endif // NL_ACTION_PHRASE_FABER_H /* End of action_phrase_faber.h */