anodyne/intra/source/helper/Achievements.hx

254 lines
7.6 KiB
Haxe

package helper
{
import com.amanitadesign.steam.FRESteamWorks;
import com.amanitadesign.steam.SteamConstants;
import com.amanitadesign.steam.SteamEvent;
import flash.desktop.NativeApplication;
import flash.utils.ByteArray<Dynamic>;
import global.Registry;
import org.flixel.FlxG;
import org.flixel.FlxGame;
class Achievements
{
private static var IS_NEWGROUNDS:Bool=false;
public static var IS_KONG:Bool=false;
public static var KONG_LOADED:Bool=false;
public static var IS_STEAM:Bool=true;
public static inline var Card_1:Int=0;
public static inline var Card_7:Int=1;
public static inline var Extra_health_1:Int=2;
public static inline var Fast_fields:Int=3;
public static inline var No_damage_sunguy:Int=4;
public static inline var Trophy_1:Int=5;
public static inline var Greenlit:Int=6;
public static inline var Website:Int=7;
public static inline var A_GET_BROOM:Int=8;
public static inline var A_GET_WINDMILL_CARD:Int=9;
public static inline var A_DEFEAT_BRIAR:Int=10;
public static inline var A_100_PERCENT_ANY_TIME:Int=11;
public static inline var A_200_PERCENT:Int=12;
public static inline var A_GET_RED_CUBE:Int=13;
public static inline var A_GET_GREEN_CUBE:Int=14;
public static inline var A_GET_BLUE_CUBE:Int=15;
public static inline var A_GET_BW_CUBES:Int=16;
public static inline var A_CONSOLE:Int=17;
public static inline var A_GET_GOLDEN_POO:Int=18;
public static inline var A_GET_48_CARDS:Int=19;
public static inline var A_GET_49TH_CARD:Int=20;
public static inline var A_ENDING_SUB_15_M:Int=21;
public static inline var A_100_PERCENT_SUB_3_HR:Int=22;
public static inline var achvname:Dynamic={ 8:"broom", 9:"windmill", 10:"briar",
11:"100" , 12:"200" , 13:"red", 14:"green", 15:"blue", 16:"bw",
17:"console", 18:"poo", 19:"48", 20:"49", 21:"fast", 22:"100fast"};
public static var Steamworks:FRESteamWorks;
private static var did_init:Bool=false;
public static var DEBUG_TEXT:String="";
public static function init(root:Dynamic):Void {
if(did_init)return;
did_init=true;
}
public static function kong_loaded():Void {
KONG_LOADED=true;
}
public static function init_steam():Void {
DEBUG_TEXT +="In Init Steam\n";
if(IS_STEAM && Steamworks==null){
if(Intra.IS_LINUX){
//return;
}
DEBUG_TEXT +="LOADING STEAM\n";
Steamworks=new FRESteamWorks();
Steamworks.addEventListener(SteamEvent.STEAM_RESPONSE, onSteamResponse);
if(Steamworks.init()){
if(Steamworks.isReady){
if(false==Intra.IS_LINUX){
Steamworks.setCloudEnabledForApp(true);
}
DEBUG_TEXT +="STEAM LOADED\n";
}
//DEBUG_TEXT=DEBUG_TEXT + "atest:" + Steamworks.setAchievement("ACH_WIN_ONE_GAME").toString()+ "\n";
//Steamworks.clearAchievement("ACH_WIN_ONE_GAME");
//Steamworks.setStatFloat('FeetTraveled', 42.42);
//Steamworks.storeStats();
//DEBUG_TEXT=DEBUG_TEXT + Steamworks.getStatFloat('FeetTraveled').toString()+ "\n";
//
} else {
DEBUG_TEXT +="FAILED\n";
}
}
}
public static function get_completion_rate():Int {
// 36 Cards(+2)=72
// 10 health ups(+1)=10
// 4 broom upgrades(+4)=16
// Jump shoes(+2)=2
// 12 Cards
// 13 weird items - all + 5
var rate:Int=0;
for(i in 0...48){
if(Registry.card_states[i]==1){
if(i<36){
rate +=2;
} else {
rate +=4;
}
}
}
rate +=(Registry.MAX_HEALTH - 6);
if(Registry.inventory[Registry.IDX_BROOM])rate +=4;
if(Registry.inventory[Registry.IDX_WIDEN])rate +=4;
if(Registry.inventory[Registry.IDX_LENGTHEN])rate +=4;
if(Registry.inventory[Registry.IDX_TRANSFORMER])rate +=4;
if(Registry.inventory[Registry.IDX_JUMP])rate +=2;
for(i in 11...Registry.IDX_WHITE+1){
if(Registry.inventory[i]){
rate +=4;
}
}
Achievements.DEBUG_TEXT +=rate.toString()+ "\n";
return rate;
}
public static function set_steam_achievements():Void {
if(IS_STEAM && Steamworks !=null && Steamworks.isReady){
trace("Steam achievement state:", Registry.achivement_state);
for(i in 8...23){
if(Registry.achivement_state[i]){
Steamworks.setAchievement(achvname[i]);
}
}
}
}
public static function writeFileToCloud(fileName:String, data:Dynamic):Bool {
var dataOut:ByteArray<Dynamic>=new ByteArray();
dataOut.writeObject(data);
return Steamworks.fileWrite(fileName, dataOut);
}
public static function readFileFromCloud(fileName:String):Dynamic {
var dataIn:ByteArray<Dynamic>=new ByteArray();
var dataOut:Dynamic=new Dynamic();
dataIn.position=0;
dataIn.length=Steamworks.getFileSize(fileName);
DEBUG_TEXT +=dataIn.length.toString();
if(dataIn.length>0 && Steamworks.fileRead(fileName,dataIn)){
return dataIn.readObject();
}
return null;
}
public static function is_100_percent():Bool {
if(Registry.MAX_HEALTH>=16 && Registry.inventory[Registry.IDX_TRANSFORMER] && Registry.inventory[Registry.IDX_WIDEN] && Registry.inventory[Registry.IDX_LENGTHEN] && Registry.nr_growths>=37){
Achievements.unlock(Achievements.A_100_PERCENT_ANY_TIME);
if(Registry.playtime<3 * 60 * 60){
Achievements.unlock(Achievements.A_100_PERCENT_SUB_3_HR);
}
return true;
}
return false;
}
public static function is_200_percent():Bool {
var a:Array<Dynamic>=Registry.inventory;
if(is_100_percent()&& Registry.nr_growths>=49 && a[Registry.IDX_BLUE] && a[Registry.IDX_GREEN] && a[Registry.IDX_RED] && a[Registry.IDX_BLACK] && a[Registry.IDX_WHITE] && a[Registry.IDX_KITTY] && a[Registry.IDX_POO] && a[Registry.IDX_AUS_HEART] && a[Registry.IDX_ELECTRIC] && a[Registry.IDX_MARINA] && a[Registry.IDX_MELOS] && a[Registry.IDX_MISSINGNO] && a[Registry.IDX_SPAM]){
Achievements.unlock(Achievements.A_200_PERCENT);
return true;
}
return false;
}
public static function onSteamResponse(e:SteamEvent):Void {
//Achievements.DEBUG_TEXT=DEBUG_TEXT + "STEAMresponse type:" + e.req_type + " response:" + e.response + "\n";
switch(e.req_type){
case SteamConstants.RESPONSE_OnUserStatsStored:
//DEBUG_TEXT=DEBUG_TEXT + "RESPONSE_OnUserStatsStored:" + e.response + "\n";
break;
case SteamConstants.RESPONSE_OnUserStatsReceived:
//DEBUG_TEXT=DEBUG_TEXT + "RESPONSE_OnUserStatsReceived:" + e.response + "\n";
break;
case SteamConstants.RESPONSE_OnAchievementStored:
//DEBUG_TEXT=DEBUG_TEXT + "RESPONSE_OnAchievementStored:" + e.response + "\n";
break;
case 3:
//case SteamConstants.RESPONSE_OnGameOverlayActivated:
//FlxGame.HARD_PAUSED=!FlxGame.HARD_PAUSED;// This is probably not the right hting to do.
break;
default:
}
}
public static function unlock_all():Void {
for(i in 8...23){
unlock(i);
}
}
public static function unlock(id:Int):Void {
if(!IS_STEAM && false==Intra.is_web)return;
if(IS_STEAM){
trace("Achievement:", id, achvname[id]);
if(Steamworks !=null && Steamworks.isReady){
switch(id){
case A_GET_BROOM://**
Registry.achivement_state[id]=true;
Steamworks.setAchievement(achvname[id]);
break;
case A_GET_WINDMILL_CARD://**
Registry.achivement_state[id]=true;
Steamworks.setAchievement(achvname[id]);
break;
Registry.achivement_state[id]=true;
Steamworks.setAchievement(achvname[id]);
break;
case A_100_PERCENT_ANY_TIME:// **
Registry.achivement_state[id]=true;
Steamworks.setAchievement(achvname[id]);
break;
case A_100_PERCENT_SUB_3_HR:// **
Registry.achivement_state[id]=true;
Steamworks.setAchievement(achvname[id]);
break;
case A_GET_48_CARDS://
Registry.achivement_state[id]=true;
Steamworks.setAchievement(achvname[id]);
break;
}
}
}
}
}