Help with GC achievements? :D

Hello fellow developers,

I recently discovered that achievements in Game Center are not managed by Game Center. IE if I get an achievement for pressing a button, everytime I’ll press that button it’ll show that achievement again: Even if that achievement is already achieved.

What’s a good way to manage achievements? Do I have to check who has logged in and save an individual file which stores the achievements of this person?

I’m totally lost! Tips and ideas are welcome! [import]uid: 32882 topic_id: 24641 reply_id: 324641[/import]

So today I tried solving the above with loadAchievements(). It looks good, the requestCallback is called but I’m not getting any data back?! :confused: It’s freaking hard to test this as my device has no terminal! Can anyone see what I’m doing wrong?

[code]-- check the achievements
gameNetwork = require “gameNetwork”
loggedIntoGC = false

achievement1 = false
achievement2 = false
achievement3 = false
achievement4 = false
achievement5 = false
achievement6 = false
achievement7 = false
achievement8 = false
achievement9 = false
achievement10 = false
achievement11 = false
achievement12 = false
achievement13 = false

local function requestCallback( event )
if event.type == “loadAchievements” then
if event.data then
achievement1 = event.data[1].isCompleted
achievement2 = event.data[2].isCompleted
achievement3 = event.data[3].isCompleted
achievement4 = event.data[4].isCompleted
achievement5 = event.data[5].isCompleted
achievement6 = event.data[6].isCompleted
achievement7 = event.data[7].isCompleted
achievement8 = event.data[8].isCompleted
achievement9 = event.data[9].isCompleted
achievement10 = event.data[10].isCompleted
achievement11 = event.data[11].isCompleted
achievement12 = event.data[12].isCompleted
achievement13 = event.data[13].isCompleted
end
end
end

local function loadAchievements()
gameNetwork.request( “loadAchievements”, { listener=requestCallback } )
return true
end

– called after the “init” request has completed
local function initCallback( event )
if event.data then
loggedIntoGC = true
–native.showAlert( “Success!”, “User has logged into Game Center”, { “OK” } )
loadAchievements()
else
loggedIntoGC = false
–native.showAlert( “Fail”, “User is not logged into Game Center”, { “OK” } )
end
end

– function to listen for system events
local function onSystemEvent( event )
if event.type == “applicationStart” then
gameNetwork.init( “gamecenter”, { listener=initCallback } )
return true
end
end

function offlineAlert()
–native.showAlert( “Fail”, “User is not logged into Game Center”, { “OK” } )
end

Runtime:addEventListener( “system”, onSystemEvent )
[/code] [import]uid: 32882 topic_id: 24641 reply_id: 100045[/import]

I think I fixed it. loadAchievements() only returns the achievements which have been achieved. I expected 13 achievements when sometimes only 2 would return and sometimes even 0 if I reset the achievements. This seems to work.

[code]
– check the achievements
local function requestCallback( event )
if event.type == “loadAchievements” then
if event.data then

– Loop trough event.data
for i = 1, #event.data do
if (event.data[i].identifier == “helpingHand”) then
achievement1 = event.data[i].isCompleted;
elseif (event.data[i].identifier == “dolphinHero”) then
achievement2 = event.data[i].isCompleted;
elseif (event.data[i].identifier == “closeCall”) then
achievement3 = event.data[i].isCompleted;
elseif (event.data[i].identifier == “shocker”) then
achievement4 = event.data[i].isCompleted;
elseif (event.data[i].identifier == “crabLove”) then
achievement5 = event.data[i].isCompleted;
elseif (event.data[i].identifier == “inkiness”) then
achievement6 = event.data[i].isCompleted;
elseif (event.data[i].identifier == “driftWoodSlayer”) then
achievement7 = event.data[i].isCompleted;
elseif (event.data[i].identifier == “10FishUnharmed”) then
achievement8 = event.data[i].isCompleted;
elseif (event.data[i].identifier == “25FishUnharmed”) then
achievement9 = event.data[i].isCompleted;
elseif (event.data[i].identifier == “100FishUnharmed”) then
achievement10 = event.data[i].isCompleted;
elseif (event.data[i].identifier == “bronzeMedal”) then
achievement11 = event.data[i].isCompleted;
elseif (event.data[i].identifier == “silverMedal”) then
achievement12 = event.data[i].isCompleted;
elseif (event.data[i].identifier == “goldMedal”) then
achievement13 = event.data[i].isCompleted;
end
end
end
end
end

local function loadAchievements()
achievement1 = false
achievement2 = false
achievement3 = false
achievement4 = false
achievement5 = false
achievement6 = false
achievement7 = false
achievement8 = false
achievement9 = false
achievement10 = false
achievement11 = false
achievement12 = false
achievement13 = false

gameNetwork.request( “loadAchievements”, { listener=requestCallback } )
return true
end
[/code] [import]uid: 32882 topic_id: 24641 reply_id: 100070[/import]

Hi MCB,

I just recently discovered this issue too. In my game, I see certain achievements are awarded multiple times, even thought Game Center knows the achievement is already unlocked. Are you sure this is not a bug with how achievements are handled with Corona? Where did you find out that “achievements in Game Center are not managed by Game Center”?

(BTW, Regarding not having a terminal, if you connect your iPhone to your mac while running, print statements will be written to the Console application in OS X.)

Thanks!

-Aaron [import]uid: 122310 topic_id: 24641 reply_id: 100093[/import]

Aisaksen, thanks for that tip!

From what I’ve read on a day of forum sniffing GC does not handle it, I don’t think it’s a bug:

What I did: loadAchievements loads the achievements of current connected user (note that this only loads the unlocked achievements of this user, not the locked ones) > you read out the data from loadAchievement’s returned array: The data[i].identifier beeing the ID you gave on iTunes Connect. Store that in some booleans and only call an achievement if it’s completed boolean is false!
[import]uid: 32882 topic_id: 24641 reply_id: 100284[/import]

OK. thanks for the update. Its funny we found that same issue on almost exactly the same day!

I’m going a step further…i have an array of functions that check if the achievement needs to be awarded, and i’m removing those that GC already reports as unlocked. No reason to detect achievements if they are already unlocked.
[import]uid: 122310 topic_id: 24641 reply_id: 100311[/import]