// Define qualquer item que o herói possa pegar e adicionar ao seu inventórioabstract class Collectable { String _Name; String _Desc; byte _Type; public: // chamado quando é colecionado byte OnCatch() { return (byte)true; } abstract String Desc(); // retorna descrição abstract String Name(); // retorna o nome abstract byte Type(); // retorna o tipo}// Um item consumível quer dizer que depois de usado, irá sumir de seu invenórioclass Consumable extends Collectable { // Implementamos os métodos de nossa classe abstrata/interface public void OnCatch() { } public String Desc() { return this->_Desc; } public String Name() { return this->_Name; } public byte Type() { return this->Type; } // Novo método! Chamado quando o item é utilizado // por exemplo, se fosse, sei lá, uma poção de cura, iria curar o heroi e tals abstract public void Use(Actor target);}// A tal poção de curaclass HealingPotion extends Consumable { protected int _Amount = 0; public HealingPotion(String name, String desc, byte type, byte val) { this->_Name = name; this->_Type = type; this->_Amount = val; } public void Use(Actor target) { target->Inflict(val, DMG_HEALING); }}// Esse tipo de item, ao invés de ser utilizado, pode ser equipado no personagemclass Equippable extends Collectable { public int OnCatch(); public String Desc() { return this->_Desc; } public String Name() { return this->_Name; } public byte Type() { return this->Type; } abstract public void OnEquip(); abstract public void OnUse();}// um Actor é qualquer coisa que pode interagir// Só está aqui pra mostrar de onde vem o Inflict()abstract class Actor { // Inflige um tipo de dano no alvo. Pode ser dano de ataque físico, mágico, cura, etc public int Inflict(int val, byte type);}