Trophies = { } -- Global function, so you can access it from other files
Trophies. __trophies = { }
function Trophies. GetAll( ) -- Returns all trophies
return Trophies. __trophies
end
function Trophies. Add( T) -- Adds a trophy, 2 different trophies with same ID cannot exist, newer one overwrites older one
Trophies. __trophies[ T. ID] = T
end
function Trophies. GetByID( ID) -- Returns trophy by ID
return Trophies. __trophies[ ID]
end
function Trophies. IsTrophy( T) -- Checks if a table is trophy
if getmetatable ( T) == TrophySkeleton then return true end
return false
end
TrophySkeleton = { } -- "Base class" of every new trophy
TrophySkeleton. __index = TrophySkeleton
setmetatable ( TrophySkeleton, { __call = function ( _, ... ) return TrophySkeleton. New( ... ) end } ) -- Allows you to use TrophySkeleton(A,B) instead of TrophySkeleton.New(A,B)
TrophySkeleton. __TrophyLastID = 0 -- Automatic ID managment
function TrophySkeleton. New( nID, name, desc)
if ( nID == nil ) then
TrophySkeleton. __TrophyLastID = TrophySkeleton. __TrophyLastID + 1
while ( Trophies. GetByID( TrophySkeleton. __TrophyLastID) ~= nil ) do
TrophySkeleton. __TrophyLastID = TrophySkeleton. __TrophyLastID + 1
end
end
local T = setmetatable ( {
ID = nID or TrophySkeleton. __TrophyLastID,
Name = name or "" ,
Desc = desc or "" ,
Test = function ( this)
return ( "ID: " .. tostring ( this. ID) .. ", Name: " .. this. Name .. ", Desc: " .. this. Desc)
end
-- Add custom fields and methods here, like in this example, to call methods you need to do TROPHY:METHOD() or TROPHY.METHOD(TROPHY)
} , TrophySkeleton) -- Creates new
Trophies. Add( T)
return T
end
local A = TrophySkeleton. New( nil , "A" , "Test One" )
print ( A. ID, A. Name, A. Desc)
local B = TrophySkeleton( 2 , "B" , "Test Two" )
print ( B. ID, B. Name, B. Desc)
local C = TrophySkeleton. New( nil , "C" , "Test Three" )
print ( C. ID, C. Name, C. Desc)
print ( )
local TROPHY_2 = Trophies. GetByID( 2 )
print ( TROPHY_2. ID, TROPHY_2. Name, TROPHY_2. Desc)
print ( Trophies. GetByID( 1 ) : Test( ) )
print ( )
print ( "A is trophy: " .. tostring ( Trophies. IsTrophy( A) ) )
print ( "{} is trophy: " .. tostring ( Trophies. IsTrophy( { } ) ) )
VHJvcGhpZXMgPSB7fSAtLSBHbG9iYWwgZnVuY3Rpb24sIHNvIHlvdSBjYW4gYWNjZXNzIGl0IGZyb20gb3RoZXIgZmlsZXMKVHJvcGhpZXMuX190cm9waGllcyA9IHt9CgpmdW5jdGlvbiBUcm9waGllcy5HZXRBbGwoKSAtLSBSZXR1cm5zIGFsbCB0cm9waGllcwogICAgcmV0dXJuIFRyb3BoaWVzLl9fdHJvcGhpZXMKZW5kCgpmdW5jdGlvbiBUcm9waGllcy5BZGQoVCkgLS0gQWRkcyBhIHRyb3BoeSwgMiBkaWZmZXJlbnQgdHJvcGhpZXMgd2l0aCBzYW1lIElEIGNhbm5vdCBleGlzdCwgbmV3ZXIgb25lIG92ZXJ3cml0ZXMgb2xkZXIgb25lCiAgICBUcm9waGllcy5fX3Ryb3BoaWVzW1QuSURdID0gVAplbmQKCmZ1bmN0aW9uIFRyb3BoaWVzLkdldEJ5SUQoSUQpIC0tIFJldHVybnMgdHJvcGh5IGJ5IElECiAgICByZXR1cm4gVHJvcGhpZXMuX190cm9waGllc1tJRF0KZW5kCgpmdW5jdGlvbiBUcm9waGllcy5Jc1Ryb3BoeShUKSAtLSBDaGVja3MgaWYgYSB0YWJsZSBpcyB0cm9waHkKICAgIGlmIGdldG1ldGF0YWJsZShUKSA9PSBUcm9waHlTa2VsZXRvbiB0aGVuIHJldHVybiB0cnVlIGVuZAogICAgcmV0dXJuIGZhbHNlCmVuZAoKVHJvcGh5U2tlbGV0b24gPSB7fSAtLSAiQmFzZSBjbGFzcyIgb2YgZXZlcnkgbmV3IHRyb3BoeQpUcm9waHlTa2VsZXRvbi5fX2luZGV4ID0gVHJvcGh5U2tlbGV0b24Kc2V0bWV0YXRhYmxlKFRyb3BoeVNrZWxldG9uLCB7IF9fY2FsbCA9IGZ1bmN0aW9uKF8sIC4uLikgcmV0dXJuIFRyb3BoeVNrZWxldG9uLk5ldyguLi4pIGVuZCB9KSAtLSBBbGxvd3MgeW91IHRvIHVzZSBUcm9waHlTa2VsZXRvbihBLEIpIGluc3RlYWQgb2YgVHJvcGh5U2tlbGV0b24uTmV3KEEsQikKVHJvcGh5U2tlbGV0b24uX19Ucm9waHlMYXN0SUQgPSAwIC0tIEF1dG9tYXRpYyBJRCBtYW5hZ21lbnQKCmZ1bmN0aW9uIFRyb3BoeVNrZWxldG9uLk5ldyhuSUQsIG5hbWUsIGRlc2MpCiAgICBpZiAobklEID09IG5pbCkgdGhlbgogICAgICAgIFRyb3BoeVNrZWxldG9uLl9fVHJvcGh5TGFzdElEID0gVHJvcGh5U2tlbGV0b24uX19Ucm9waHlMYXN0SUQgKyAxCiAgICAgICAgd2hpbGUgKFRyb3BoaWVzLkdldEJ5SUQoVHJvcGh5U2tlbGV0b24uX19Ucm9waHlMYXN0SUQpIH49IG5pbCkgZG8KICAgICAgICAgICAgVHJvcGh5U2tlbGV0b24uX19Ucm9waHlMYXN0SUQgPSBUcm9waHlTa2VsZXRvbi5fX1Ryb3BoeUxhc3RJRCArIDEKICAgICAgICBlbmQKICAgIGVuZAogICAgbG9jYWwgVCA9IHNldG1ldGF0YWJsZSh7CgogICAgICAgIElEID0gbklEIG9yIFRyb3BoeVNrZWxldG9uLl9fVHJvcGh5TGFzdElELAogICAgICAgIE5hbWUgPSBuYW1lIG9yICIiLAogICAgICAgIERlc2MgPSBkZXNjIG9yICIiLAogICAgICAgIFRlc3QgPSBmdW5jdGlvbih0aGlzKQogICAgICAgICAgICByZXR1cm4gKCJJRDogIiAuLiB0b3N0cmluZyh0aGlzLklEKSAuLiAiLCBOYW1lOiAiIC4uIHRoaXMuTmFtZSAuLiAiLCBEZXNjOiAiIC4uIHRoaXMuRGVzYykKICAgICAgICBlbmQKCiAgICAgICAgLS0gQWRkIGN1c3RvbSBmaWVsZHMgYW5kIG1ldGhvZHMgaGVyZSwgbGlrZSBpbiB0aGlzIGV4YW1wbGUsIHRvIGNhbGwgbWV0aG9kcyB5b3UgbmVlZCB0byBkbyBUUk9QSFk6TUVUSE9EKCkgb3IgVFJPUEhZLk1FVEhPRChUUk9QSFkpCgogICAgfSwgVHJvcGh5U2tlbGV0b24pIC0tIENyZWF0ZXMgbmV3IAogICAgVHJvcGhpZXMuQWRkKFQpCiAgICByZXR1cm4gVAplbmQKCmxvY2FsIEEgPSBUcm9waHlTa2VsZXRvbi5OZXcobmlsLCAiQSIsICJUZXN0IE9uZSIpCnByaW50KEEuSUQsIEEuTmFtZSwgQS5EZXNjKQoKbG9jYWwgQiA9IFRyb3BoeVNrZWxldG9uKDIsICJCIiwgIlRlc3QgVHdvIikKcHJpbnQoQi5JRCwgQi5OYW1lLCBCLkRlc2MpCgpsb2NhbCBDID0gVHJvcGh5U2tlbGV0b24uTmV3KG5pbCwgIkMiLCAiVGVzdCBUaHJlZSIpCnByaW50KEMuSUQsIEMuTmFtZSwgQy5EZXNjKQoKcHJpbnQoKQoKbG9jYWwgVFJPUEhZXzIgPSBUcm9waGllcy5HZXRCeUlEKDIpCnByaW50KFRST1BIWV8yLklELCBUUk9QSFlfMi5OYW1lLCBUUk9QSFlfMi5EZXNjKQpwcmludChUcm9waGllcy5HZXRCeUlEKDEpOlRlc3QoKSkKCnByaW50KCkKCnByaW50KCJBIGlzIHRyb3BoeTogIiAuLiB0b3N0cmluZyhUcm9waGllcy5Jc1Ryb3BoeShBKSkpCnByaW50KCJ7fSBpcyB0cm9waHk6ICIgLi4gdG9zdHJpbmcoVHJvcGhpZXMuSXNUcm9waHkoe30pKSk=