// 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 RZ_DBCTRL_SHEET_H #define RZ_DBCTRL_SHEET_H // nel #include "nel/misc/types_nl.h" #include "nel/misc/smart_ptr.h" // client #include "reflect.h" #include "ctrl_base.h" #include "interface_expr.h" #include "action_handler.h" #include "sphrase_manager.h" // game share #include "game_share/brick_types.h" #include "game_share/trade_slot_type.h" #include "game_share/skills.h" #include "game_share/slot_types.h" #include "game_share/rm_family.h" // #include "../time_client.h" class CItemSheet; class CPactSheet; class CDBCtrlSheet; class CMacroCmd; class IListSheetBase; class CSBrickSheet; class CSPhraseSheet; class COutpostBuildingSheet; class CViewRenderer; // *************************************************************************** /** Common info for CDBCtrlSheet and CDBGroupListSheet */ class CCtrlSheetInfo { public: enum TSheetType { // Items. sheetId points to a CItemSheet via SheetMngr SheetType_Item, // A pact SheetType_Pact, // A skill SheetType_Skill, // Special : the type of the sheet is automatically deduced from its sheet, it drawn like an item SheetType_Auto, // A macro (ie:'open window inventory + dock bag1') SheetType_Macro, // Flag of a guild SheetType_GuildFlag, // A mission SheetType_Mission, // New Sabrina Brick SheetType_SBrick, // New Sabrina Phrase. Index in the PhraseBook SheetType_SPhraseId, // New Sabrina Phrase. Complete phrase used for bot chat sentence (sheet id represent a CSPhraseSheet) SheetType_SPhrase, // A teleport location (just the slot bitmap) SheetType_Teleport_Location, // A guild teleport type SheetType_ElevatorDestination, // An outpost building SheetType_OutpostBuilding, }; CCtrlSheetInfo(); enum TBrickSheetSize { BrickSheetWidth= 24, BrickSheetHeight= 24, }; public: TSheetType _Type; // If it is a brick or a spell, give all the brick type this slot accepts. // Each bit is for the associated BRICK_TYPE::EBrickType enum (unnknown bit 0 etc...) // Default is ALL (ie 0xFFFFFFFF) uint32 _BrickTypeBitField; // display. sint32 _DispNoSheetBmpId; // Texture to display when no sheet (==0) sint32 _SheetSelectionGroup; // group for sheet selection, or -1 if none // Events IActionHandler *_AHOnLeftClick; CStringShared _AHLeftClickParams; IActionHandler *_AHOnRightClick; CStringShared _AHRightClickParams; // IActionHandler *_AHOnCanDrag; CStringShared _AHCanDragParams; IActionHandler *_AHOnDrag; CStringShared _AHDragParams; IActionHandler *_AHOnCanDrop; CStringShared _AHCanDropParams; IActionHandler *_AHOnDrop; CStringShared _AHDropParams; IActionHandler *_AHOnCannotDrop; CStringShared _AHCannotDropParams; CStringShared _ListMenuLeft; CStringShared _ListMenuRight; CStringShared _ListMenuRightEmptySlot; // bool _InterfaceColor : 1; // Color given by the interface ? bool _Dragable : 1; bool _UseQuantity : 1; // is the quantity read and displayed ? bool _ReadQuantityFromSheet : 1; // Read quantity from sheet rather than from database bool _UseQuality : 1; // is the quality read and displayed ? bool _DisplayItemQuality : 1; // Do we have to display the quality for the item (false for Cosmetics and Teleport and if _UseQuality==fasle)? bool _DuplicateOnDrag : 1; // when dragged, the item is shown twice : one version at the mouse position. // and another in the source slot. Useful for items to buy that are in infinite quantity. bool _AutoGrayed : 1; // if true then gray the ctrlSheeet if: 1/ Items: Is the Item Locked. 2/ Bricks: is the brick Latent. bool _HasTradeSlotType : 1; // true is the SLOT_TYPE DB field should be taken in account bool _BrickOverable : 1; // if Type is Brick, display like a button (because LeftClickable). bool _DragCopy : 1; // true if support copy drag bool _ForceItemBackGroundGeneric : 1; // For an Item only, this tells what item type this slot accept. Undefined means ALL SLOTTYPE::TSlotType _ItemSlot; public: bool parseCtrlInfo(xmlNodePtr cur, CInterfaceGroup * parentGroup); // Context menu accessor/ One for each button void setListMenuLeft (const std::string &cm) { _ListMenuLeft = cm; } void setListMenuRight (const std::string &cm) { _ListMenuRight = cm; } void setListMenuBoth (const std::string &cm) { _ListMenuLeft= _ListMenuRight= cm; } const std::string &getListMenuLeft () { return _ListMenuLeft; } const std::string &getListMenuRight () { return _ListMenuRight; } const std::string &getListMenuRightEmptySlot () {return _ListMenuRightEmptySlot;} }; // *************************************************************************** /** * Class representing base for items that are described in Georges forms * \author Matthieu 'TrapII' Besson * \author Nevrax France * \date 2002 */ class CDBCtrlSheet : public CCtrlBase, protected CCtrlSheetInfo { public: DECLARE_UI_CLASS(CDBCtrlSheet) // Release fucking statics static void release (); enum TSheetCategory { Item = 0, Pact, Skill, GuildFlag, Mission, Phrase, DontKnow }; public: CDBCtrlSheet(const TCtorParam ¶m); ~CDBCtrlSheet(); virtual bool parse(xmlNodePtr cur, CInterfaceGroup * parentGroup); virtual void updateCoords(); virtual void draw(); void drawSheet (sint32 scrX, sint32 scrY, bool draging, bool showSelectionBorder = true); virtual bool handleEvent (const CEventDescriptor &event); void setActionOnLeftClick (const std::string &ActionHandlerName) { _AHOnLeftClick = getAH(ActionHandlerName, _AHLeftClickParams); } void setActionOnRightClick (const std::string &ActionHandlerName) { _AHOnRightClick = getAH(ActionHandlerName, _AHRightClickParams); } void setActionOnDrop (const std::string &ActionHandlerName) { _AHOnDrop = getAH(ActionHandlerName, _AHDropParams); } void setParamsOnLeftClick (const std::string &ParamsHandlerName) { _AHLeftClickParams = ParamsHandlerName; } void setParamsOnRightClick (const std::string &ParamsHandlerName) { _AHRightClickParams = ParamsHandlerName; } void setParamsOnDrop (const std::string &ParamsHandlerName) { _AHDropParams = ParamsHandlerName; } const std::string &getActionOnLeftClick () const { return getAHName(_AHOnLeftClick); } const std::string &getActionOnRightClick () const { return getAHName(_AHOnRightClick); } const std::string &getActionOnDrop () const { return getAHName(_AHOnDrop); } const std::string &getParamsOnLeftClick () const { return _AHLeftClickParams; } const std::string &getParamsOnRightClick () const { return _AHRightClickParams; } const std::string &getParamsOnDrop () const { return _AHDropParams; } void setListMenuLeft (const std::string &cm) { CCtrlSheetInfo::setListMenuLeft(cm); } void setListMenuRight (const std::string &cm) { CCtrlSheetInfo::setListMenuRight(cm); } void setListMenuBoth (const std::string &cm) { CCtrlSheetInfo::setListMenuBoth(cm); } const std::string &getListMenuLeft () { return CCtrlSheetInfo::getListMenuLeft(); } const std::string &getListMenuRight () { return CCtrlSheetInfo::getListMenuRight(); } const std::string &getListMenuRightEmptySlot () {return CCtrlSheetInfo::getListMenuRightEmptySlot();} void setCanDrop (bool cd) { _CanDrop = cd; } bool getCanDrop () const { return _CanDrop; } bool isDragable() { return _Dragable; } bool isDraging() { return _Draging; } sint32 getDeltaDragX() {return _DeltaDragX;} sint32 getDeltaDragY() {return _DeltaDragY;} // For "oncandrag" action handlers only, which would want to avoid the drag void setTempCanDrag(bool cd) {_TempCanDrag= cd;} // called when a setCapturePointerLeft(NULL) is made for instance void abortDraging(); CCtrlSheetInfo::TSheetType getType () const; void setType (CCtrlSheetInfo::TSheetType type); // Swap the content with an other ctrl_sheet (debug): SheetId, Quantity and Quality void swapSheet(CDBCtrlSheet *other); void setSheetId(sint32 val) {_SheetId.setSInt32(val);} void setQuality(sint32 val) {_Quality.setSInt32(val);} void setQuantity(sint32 val) {_Quantity.setSInt32(val);} void setItemNameId(uint32 val) {_NameId.setSInt32(val);} void setEnchant(sint32 val) {_Enchant.setSInt32(val);} // get sheet info. sint32 getSheetId() const { return (sint32)_SheetId.getSInt32(); } sint32 getQuality() const { return _UseQuality ? (sint32)_Quality.getSInt32() : 0; } sint32 getEnchant() const { return _Enchant.getSInt32(); } sint32 getQuantity() const { return (sint32)_Quantity.getSInt32(); } uint32 getItemNameId() const { return (uint32)_NameId.getSInt32();} // New Stack Size sint32 getStackable() const { return (_Stackable>1) ? 999 : 1; } // get non locked quantity (can be zero) sint32 getNonLockedQuantity() const; const CItemSheet *asItemSheet() const; const CPactSheet *asPactSheet() const; const CSBrickSheet *asSBrickSheet() const; const CSPhraseSheet *asSPhraseSheet() const; const COutpostBuildingSheet *asOutpostBuildingSheet() const; // Operation on the link between the sheet and database. the string is the branch root of SHEET.... std::string getSheet() const; void setSheet (const std::string &dbBranchId); void setSheetFast( const std::string &dbParentBranchId, int sheetNum, int slotNum ); REFLECT_EXPORT_START(CDBCtrlSheet, CCtrlBase) REFLECT_STRING("sheet", getSheet, setSheet); REFLECT_RGBA("color", getSheetColor, setSheetColor); REFLECT_RGBA("color1", getGuildColor1, setGuildColor1); REFLECT_RGBA("color2", getGuildColor2, setGuildColor2); REFLECT_SINT32("back", getGuildBack, setGuildBack); REFLECT_SINT32("symbol", getGuildSymbol, setGuildSymbol); REFLECT_BOOL("invert_symbol", getInvertGuildSymbol, setInvertGuildSymbol); REFLECT_LUA_METHOD("getHpBuff", luaGetHpBuff) REFLECT_LUA_METHOD("getSapBuff", luaGetSapBuff) REFLECT_LUA_METHOD("getFocusBuff", luaGetFocusBuff) REFLECT_LUA_METHOD("getStaBuff", luaGetStaBuff) REFLECT_LUA_METHOD("getName", luaGetName) REFLECT_LUA_METHOD("buildCrystallizedSpellListBrick", luaBuildCrystallizedSpellListBrick) REFLECT_EXPORT_END int luaGetHpBuff(CLuaState &ls); int luaGetSapBuff(CLuaState &ls); int luaGetFocusBuff(CLuaState &ls); int luaGetStaBuff(CLuaState &ls); int luaGetName(CLuaState &ls); int luaBuildCrystallizedSpellListBrick(CLuaState &ls); // hardcode creation. User must setup other CtrlBase value (parent etc...) void initSheet(const std::string &dbValue, const CCtrlSheetInfo &ctrlInfo); void initSheetFast( const std::string &dbParentBranchId, int sheetNum, int slotNum, const CCtrlSheetInfo &ctrlInfo ); // get the selection group for this ctrl sheet, or -1 if none sint getSelectionGroup() const { return _SheetSelectionGroup; } // get the selection group for this ctrl sheet as a string, or "" if none const std::string &getSelectionGroupAsString() const; // get the currently selected sheet (only one at a time) static CDBCtrlSheet *getCurrSelection() { return _CurrSelection; } // set the currently selected sheet. static void setCurrSelection(CDBCtrlSheet *selected); // get the root branch containing the properties for that sheet CCDBNodeBranch *getRootBranch() const; /** If the branch in setSheet(branch) is of the form ...:# (where # is a number), return this number. * The value is hence modified by setSheet(). return 0 if not of this form. */ uint32 getIndexInDB() const {return _IndexInDB;} /** If the branch in setSheet(branch) is of the form ...:#:# (where # are numbers), return this number. * The value is hence modified by setSheet(). return 0 if not of this form. */ uint32 getSecondIndexInDB() const {return _SecondIndexInDB;} // synonym for getSecondIndexInDB(). uint32 getInventoryIndex() const {return getSecondIndexInDB();} // determine the inventory slot from the database branch id static uint getInventorySlot( const std::string &dbBranchId ); // Get the last dropped sheet. The pointer is only valid during the call of the event handler static CDBCtrlSheet *getDraggedSheet() { return _LastDraggedSheet; } /* Get the last selected sheet that have been draged or right clicked (should be use by menu to get their caller) * It is used by the item actions like destroy, move etc.. */ static CDBCtrlSheet *getCurrSelSheet() { return _CurrMenuSheet; } static void setCurrSelSheet(CDBCtrlSheet *sheet) { _CurrMenuSheet = sheet; } /// \name SBrick / SPhrase // @{ // true if the ctrl_sheet is a Sabrina brick bool isSBrick() const {return getType() ==SheetType_SBrick;} // true if magic sentence is a Sabrina phrase bool isSPhraseId() const {return getType()==SheetType_SPhraseId;} // true if magic sentence is a Sabrina phrase bool isSPhrase() const {return getType()==SheetType_SPhrase;} // true if brick or magic sentence bool isSBrickOrSPhraseId() const { CCtrlSheetInfo::TSheetType type= getType(); return type==SheetType_SBrick || type==SheetType_SPhraseId; } bool isSPhraseIdMemory() const; // special for macro and Memories bool isMacroMemory() const; // return the phrase slot from database. sint32 getSPhraseId() const; /// true if it is a shortcut bool isShortCut() const {return _ShortCut;} // @} /// Setup the alpha of the sheet drawn void setSheetColor(NLMISC::CRGBA color) {_SheetColor= color;} NLMISC::CRGBA getSheetColor() const {return _SheetColor;} /// Special ContextHelp for ctrl sheet. virtual void getContextHelp(ucstring &help) const; /** true if an item of an other ctrlSheet can be dropped on this slot. * also return true if src is 0, or if _ItemSlot==UNDEFINED */ bool canDropItem(CDBCtrlSheet *src) const; /// Force the item/brick to be grayed. NB: no effect if "auto_grayed" is true void setGrayed(bool state) { _Grayed= state;} bool getGrayed() const { // If The Item sheet or phrase is 0, assume never grayed if(_SheetId.getNodePtr() && getSheetId() == 0) return false; // NB: if a macro, getNodePtr()==NULL else return _Grayed; } // Additional gray for items. The item is finally grayed if one of this void setItemWeared(bool state) {_ItemWeared= state;} bool getItemWeared() const { return _ItemWeared;} void setItemBeastGrayed(bool state) {_ItemBeastGrayed= state;} bool getItemBeastGrayed() const { return _ItemBeastGrayed;} void setUseQuality(bool use) { if(use!=_UseQuality) { _UseQuality= use; _NeedSetup= true;} } void setUseQuantity(bool use) { if(use!=_UseQuantity) { _UseQuantity= use; _NeedSetup= true;} } bool getUseQuality() const { return _UseQuality; } bool getUseQuantity() const { return _UseQuantity; } // void setReadQuantityFromSheetFlag(bool on) { _ReadQuantityFromSheet = on; } bool getReadQuantityFromSheetFlag() const { return _ReadQuantityFromSheet; } // test if the sheet is a skill sheet bool isSkill() const { return _HasTradeSlotType ? _TradeSlotType.getSInt32() == TRADE_SLOT_TYPE::Skill : false; } // test if the sheet is a mission sheet bool isMission() const; // If the sheet is a skill, just get it SKILLS::ESkills getSkill() const { return isSkill() ? (SKILLS::ESkills) getSheetId() : SKILLS::unknown; } // set special behaviour void setBehaviour(TRADE_SLOT_TYPE::TTradeSlotType type); TRADE_SLOT_TYPE::TTradeSlotType getBehaviour() const { return _HasTradeSlotType ? (TRADE_SLOT_TYPE::TTradeSlotType) _TradeSlotType.getSInt32() : TRADE_SLOT_TYPE::StandardBehaviour; } SLOTTYPE::TSlotType getItemSlot() { return _ItemSlot; } void setItemSlot(SLOTTYPE::TSlotType slot) { _ItemSlot = slot; } void setTextureNoItem(sint32 nTxID) { _DispNoSheetBmpId = nTxID; } sint32 getTextureNoItem() { return _DispNoSheetBmpId; } // copy the aspect of this sheet (not the handlers) void copyAspect(CDBCtrlSheet *dest); // true if same aspects. bool sameAspect(CDBCtrlSheet *dest) const; // get the sheet category TSheetCategory getSheetCategory() const; // get the ListSheet parent. NB: different code from CDBGroupListSheet and CDBGroupListSheetTrade. NULL if not found IListSheetBase *getListSheetParent() const; // get the index of this sheet in its parent list, or -1 if there's no such list sint getIndexInParent() const; // get the 'LOCKED' field in the db CCDBNodeLeaf *getLockValuePtr() { return _GrayedLink; } /// \name Macro // @{ void readFromMacro(const CMacroCmd &mc); // Macro To ControlSheet void writeToMacro(CMacroCmd &mc); // ControlSheet To Macro void setMacroBack(uint8 nb); void setMacroIcon(uint8 nb); void setMacroOver(uint8 nb); void setMacroText(const std::string &mcText); sint32 getMacroId() const {return _MacroID;} bool isMacro() const {return getType()==SheetType_Macro;} // @} /** According to ActualType, return true if the sheet is valid. eg: getSheetId()!=0 and brick exist * for sheet type brucks. Always for Macros and skills. */ bool isSheetValid() const; /// \name Guild Flag // @{ NLMISC::CRGBA getGuildColor1() const; NLMISC::CRGBA getGuildColor2() const; sint32 getGuildBack() const; sint32 getGuildSymbol() const; bool getInvertGuildSymbol() const; void setGuildColor1(NLMISC::CRGBA col); void setGuildColor2(NLMISC::CRGBA col); void setGuildBack(sint32 n); void setGuildSymbol(sint32 n); void setInvertGuildSymbol(bool b); // @} /// \name For teleport location // @{ void setSlot(const std::string &textureName); void initSheetSize(); // @} CCDBNodeLeaf *getSlotType() const { return _TradeSlotType.getNodePtr(); } // get item weight uint16 getItemWeight() const; CCDBNodeLeaf *getItemWeightPtr() const; // set item weight void setItemWeight(uint16 weight); // get item info version uint8 getItemInfoVersion() const; CCDBNodeLeaf *getItemInfoVersionPtr() const; // set item info version void setItemInfoVersion(uint8 infoVersion); // get item Locked state uint16 getItemLocked() const; CCDBNodeLeaf *getItemLockedPtr() const; // set item locked state void setItemLocked(uint16 lock); // get item PRICE. 0 if no DB sint32 getItemPrice() const; CCDBNodeLeaf *getItemPricePtr() const; // set item PRICE void setItemPrice(sint32 price); // get item RESALE_FLAG. 0 if no DB sint32 getItemResaleFlag() const; CCDBNodeLeaf *getItemResaleFlagPtr() const; // set item RESALE_FLAG void setItemResaleFlag(sint32 rf); // get item SELLER_TYPE. 0 if no DB sint32 getItemSellerType() const; CCDBNodeLeaf *getItemSellerTypePtr() const; // set item SELLER_TYPE void setItemSellerType(sint32 rf); // get item FABER_QUALITY. 0 if no DB RM_CLASS_TYPE::TRMClassType getItemRMClassType() const; CCDBNodeLeaf *getItemRMClassTypePtr() const {return _ItemRMClassType;} // set item FABER_QUALITY void setItemRMClassType(sint32 fq); // get item FABER_STAT_TYPE. 0 if no DB RM_FABER_STAT_TYPE::TRMStatType getItemRMFaberStatType() const; CCDBNodeLeaf *getItemRMFaberStatTypePtr() const {return _ItemRMFaberStatType;} // set item FABER_STAT_TYPE void setItemRMFaberStatType(sint32 fss); // get item PREREQUISIT_VALID. true of no DB bool getItemPrerequisitValid() const; CCDBNodeLeaf *getItemPrerequisitValidPtr() const; // set item PREREQUISIT_VALID void setItemPrerequisitValid(bool prv); // get color index of item (return -1 if no color available) sint32 getItemColor() const {if(_UserColor) return _UserColor->getValue32(); else return -1;} // set item color (if possible) void setItemColor(sint32 val) {if(_UserColor) _UserColor->setValue32(val);} // Get the Actual item name. Localized version of SheetId, or given by server through NAMEID. ucstring getItemActualName() const; /// true if support drag copy (with CTRL). action handler has to check control. bool canDragCopy() const {return _DragCopy;} // special for items, call it at initInGame() static void initArmourColors(); // true if an item that respect Carac requirement. NB: still return true if not an item bool checkItemRequirement(); virtual void serial(NLMISC::IStream &f); // From CCtrlBase, for phrases, we use a special, enhanced tooltip window virtual std::string getContextHelpWindowName() const; // For auras, powers, etc. set the range of ticks during which regen occurs void setRegenTickRange(const CTickRange &tickRange); const CTickRange &getRegenTickRange() const { return _RegenTickRange; } // start notify anim (at the end of regen usually) void startNotifyAnim(); protected: void setupItem(); void setupPact(); void setupMacro(); void setupGuildFlag(); void setupMission(); void setupSBrick(); void setupSPhrase(); void setupSPhraseId(); void setupOutpostBuilding(); // optSheet is for special faber void setupDisplayAsSBrick(sint32 sheet, sint32 optSheet= 0); // setup icon from phrases void setupDisplayAsPhrase(const std::vector &bricks, const ucstring &phraseName); // draw a number and returns the width of the drawn number sint32 drawNumber(sint32 x, sint32 y, sint32 wSheet, sint32 hSheet, NLMISC::CRGBA color, sint32 value, bool rightAlign=true); protected: // Root branch of the DB std::string _DbBranchName; // items db entries CInterfaceProperty _SheetId; CInterfaceProperty _NameId; CInterfaceProperty _Quantity; CInterfaceProperty _Quality; CInterfaceProperty _TradeSlotType; CInterfaceProperty _Enchant; CInterfaceProperty _PrerequisitValid; CInterfaceProperty _Worned; // if true means that item is worned (red cross, no longer usable unless it's a tool) // As node leaf for backward compatibilities CCDBNodeLeaf *_ItemRMClassType; CCDBNodeLeaf *_ItemRMFaberStatType; mutable sint32 _LastSheetId; /// Display sint32 _DispSlotBmpId; // Display slot bitmap id sint32 _DispSelSlotId; sint32 _DispBackBmpId; // Back Icon sint32 _DispSheetBmpId; // Main Icon sint32 _DispOverBmpId; // Over Icon sint32 _DispOver2BmpId; // Over Icon N0 2 for bricks / items. Useful for items when _DispOverBmpId is used to paint user color on the item. // Level Brick or Quality union { sint32 _DispQuality; sint32 _DispLevel; }; // Quantity for items sint32 _DispQuantity; sint32 _Stackable; sint32 _TextureIdOver; uint32 _IndexInDB; uint32 _SecondIndexInDB; // For SBrick only. Display level? bool _MustDisplayLevel : 1; /// Events bool _Draging : 1; bool _CanDrop : 1; bool _Over : 1; /// Is a TaskBar shortcut bool _ShortCut : 1; /// Draw the slot ? bool _DrawSlot : 1; /// Is the Item/Brick as to be grayed? bool _ItemBeastGrayed : 1; // This is an item in a pack animal / beast, that is unavailable bool _ItemWeared : 1; // Item weared (for bags item) bool _Grayed : 1; bool _Useable : 1; // if false, means more than grayed: "red-ed" we cannot get or use it. SBrick, SPhrase and SItem /// Init after parse() bool _SetupInit : 1; /// true if need a full setup in setupItem() ... mutable bool _NeedSetup : 1; // Temp for oncandrag AH bool _TempCanDrag : 1; // For ArmourColorFromDB bool _ArmourColorFromDB : 1; // True if the Armour Color Bitmaps have been setuped bool _ArmourColorBmpOk : 1; // Bkup of Armour Color index. -1 or 0..7 sint8 _ArmourColorIndex; CTickRange _RegenTickRange; /// D'n'd sint32 _DragX, _DragY; sint32 _DeltaDragX, _DeltaDragY; sint32 _IconW, _IconH; // Global color of the control. NLMISC::CRGBA _SheetColor; // Special colors (item/bricks) NLMISC::CRGBA _IconBackColor; NLMISC::CRGBA _IconColor; NLMISC::CRGBA _IconOverColor; NLMISC::CRGBA _IconOver2Color; // Item only: Special armour color. black(0) if is not an armour uint32 _PackedArmourColor; // For an Item only. Usefull for LeftHand Filtering: must have a pointer to the right hand CDBCtrlSheet *_OtherHandItemFilter; // This String is optionnal and usage dependent for Item, Macro, or Sentence std::string _OptString; CCDBNodeLeaf *_GrayedLink; // Macro or sentence String compiled as texture Ids and positions, from the _OptString. struct CCharBitmap { sint32 X,Y; sint32 Id; }; std::vector _CharBitmaps; // Macro Id sint32 _MacroID; // Guild Flag NL3D::UTextureFile *_GuildBack; NL3D::UTextureFile *_GuildSymb; static NL3D::UMaterial _GuildMat; bool _UseGuildIcon; NLMISC::CSheetId _GuildIcon; // SPhrase version sint32 _LastPhraseVersion; // special for items : colour of armour static NLMISC::CRGBA _ArmourColor[8]; // special for items. Carac Requirement CHARACTERISTICS::TCharacteristics _ItemCaracReqType; sint32 _ItemCaracReqValue; // Special for Armour CCDBNodeLeaf *_UserColor; // keep pointer on item sheet const CItemSheet *_ItemSheet; // unique persistent phrase exposed to lua script static NLMISC::CSmartPtr _PhraseAdapter; sint64 _NotifyAnimEndTime; private: mutable TSheetType _ActualType; static CDBCtrlSheet *_CurrSelection; static CDBCtrlSheet *_LastDraggedSheet; static CDBCtrlSheet *_CurrMenuSheet; private: void updateActualType() const; void updateIconSize(); void resetAllTexIDs(); void setupInit(); void setupCharBitmaps(sint32 maxW, sint32 maxLine, sint32 maxWChar= 1000, bool topDown= false); void resetCharBitmaps(); void displayCharBitmaps(sint32 rdrLayer, sint32 x, sint32 y, NLMISC::CRGBA color); // special for items void updateItemCharacRequirement(sint32 sheetId); // update armour color, and cache void updateArmourColor(sint8 col); // setup sheet DB. _DbBranchName must be ok, and _SecondIndexInDb and _IndexInDb as well void setupSheetDbLinks (); // 'regen' rendering // convert from uv coordinates in the [0, 1] x [0, 1] range to screen coords inline void uvToScreen(float x, float y, NLMISC::CVector &screenPos, uint texSize) const; // from an angle in the [0, 1] range, return both uv & screen coords for that angle // (angle is projected on the side of rectangle of the 'regen' texture) void buildPieCorner(float angle, NLMISC::CUV &uv, NLMISC::CVector &pos, uint texSize) const; // from a start and end angle in the [0, 1] range, build the set of uv mapped triangles necessary // to display that 'pie' // NB : output are indeed quads, at the time ofthis writing, uv mappedtri randering not available ... // so we turn them into quad for conveniency ... uint buildPie(NLMISC::CQuadUV *quv, float startAngle, float endAngle, uint texSize); // gelper to draw the notify animation void drawRotatedQuad(CViewRenderer &vr, float angle, float scale, uint renderLayer, uint32 textureId, sint32 texWidth, sint32 texHeight); }; /** User type (used with expression system of the interface, see interface_expr.h, that contains a pointer to a CDBCtrlSheet */ struct CDBCtrlSheetPtrUserType : public CInterfaceExprUserType { CDBCtrlSheet *Sheet; // pointer to a sheet // ctor CDBCtrlSheetPtrUserType(CDBCtrlSheet *sheet = NULL) : Sheet(sheet) {} // from CInterfaceExprUserType virtual CInterfaceExprUserType *clone() const { return new CDBCtrlSheetPtrUserType(*this); } }; #endif // RZ_DBCTRL_SHEET_H /* End of dbctrl_sheet.h */