116 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma region License
 | |
| /*
 | |
| License (OLC-3)
 | |
| ~~~~~~~~~~~~~~~
 | |
| 
 | |
| Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
 | |
| 
 | |
| Redistribution and use in source and binary forms, with or without modification,
 | |
| are permitted provided that the following conditions are met:
 | |
| 
 | |
| 1. Redistributions or derivations of source code must retain the above copyright
 | |
| notice, this list of conditions and the following disclaimer.
 | |
| 
 | |
| 2. Redistributions or derivative works in binary form must reproduce the above
 | |
| copyright notice. This list of conditions and the following	disclaimer must be
 | |
| reproduced in the documentation and/or other materials provided with the distribution.
 | |
| 
 | |
| 3. Neither the name of the copyright holder nor the names of its contributors may
 | |
| be used to endorse or promote products derived from this software without specific
 | |
| prior written permission.
 | |
| 
 | |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS	"AS IS" AND ANY
 | |
| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | |
| OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
 | |
| SHALL THE COPYRIGHT	HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 | |
| INCIDENTAL,	SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 | |
| TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 | |
| BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | |
| CONTRACT, STRICT LIABILITY, OR TORT	(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 | |
| ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | |
| SUCH DAMAGE.
 | |
| 
 | |
| Portions of this software are copyright © 2024 The FreeType
 | |
| Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
 | |
| All rights reserved.
 | |
| */
 | |
| #pragma endregion
 | |
| #pragma once
 | |
| #include "safemap.h"
 | |
| #include <variant>
 | |
| #include <optional>
 | |
| 
 | |
| using namespace std::string_view_literals;
 | |
| 
 | |
| #define A(attr) get(attr)
 | |
| #define A_Read(attr) get_readOnly(attr)
 | |
| 
 | |
| class Player;
 | |
| class Monster;
 | |
| 
 | |
| class ItemAttribute{
 | |
| 	friend class AiL;
 | |
| 	std::string name;
 | |
| 	std::string originalName;
 | |
| 	bool isPct;
 | |
| 	bool showDecimal=false;
 | |
| 	std::string modifies="";
 | |
| 	std::optional<std::variant<Player*,Monster*>>target;
 | |
| 	static void Initialize();
 | |
| public:
 | |
| 	inline static safemap<std::string,ItemAttribute>attributes;
 | |
| 	ItemAttribute(std::string_view originalName,std::string_view name,bool isPct,bool showDecimal,std::string_view modifies=""sv);
 | |
| 	static ItemAttribute&Get(const std::string_view name,const std::optional<std::variant<Player*,Monster*>>target={});
 | |
| 	const std::string_view Name()const;
 | |
| 	const std::string_view ActualName()const;
 | |
| 	const std::string_view Modifies()const;
 | |
| 	const bool DisplayAsPercent()const;
 | |
| 	const bool ShowAsDecimal()const;
 | |
| 	const bool operator<(const ItemAttribute&rhs)const; //WARNING! Implemented for map sorting!!!
 | |
| 	friend float&operator+=(float&lhs,const ItemAttribute&rhs);
 | |
| 	friend float&operator-=(float&lhs,const ItemAttribute&rhs);
 | |
| 	const bool operator==(const ItemAttribute&rhs)const;
 | |
| };
 | |
| 
 | |
| struct Stats;
 | |
| 
 | |
| class ItemAttributable{
 | |
| 	friend class ItemInfo;
 | |
| protected:
 | |
| 	std::map<ItemAttribute,float>attributes;
 | |
| public:
 | |
| 	ItemAttributable&operator+=(ItemAttributable&rhs);
 | |
| 	ItemAttributable&operator+=(Stats&rhs);
 | |
| 
 | |
| 	//Returns a copy of all the attributes to be passed to a new instance easily / to sync values between both.
 | |
| 	inline void copyTo(ItemAttributable&target)const{
 | |
| 		target.attributes=attributes;
 | |
| 	}
 | |
| 	inline float&get(std::string_view a){
 | |
| 		return get(ItemAttribute::Get(a));
 | |
| 	}
 | |
| 	inline float&get(const ItemAttribute&a){
 | |
| 		return attributes[a];
 | |
| 	}
 | |
| 	inline const float&get_readOnly(std::string_view a)const{
 | |
| 		return get_readOnly(ItemAttribute::Get(a));
 | |
| 	}
 | |
| 	inline const float&get_readOnly(const ItemAttribute&a)const{
 | |
| 		static float DEFAULT=0;
 | |
| 		if(attributes.count(a)){
 | |
| 			return attributes.at(a);
 | |
| 		}
 | |
| 		return DEFAULT;
 | |
| 	}
 | |
| 	inline auto begin()const{
 | |
| 		return attributes.begin();
 | |
| 	}
 | |
| 	inline auto end()const{
 | |
| 		return attributes.end();
 | |
| 	}
 | |
| 	inline void clear(){
 | |
| 		attributes.clear();
 | |
| 	}
 | |
| };
 | |
| 
 |