extends Node var achievePath = OS.get_user_data_dir() + "/achievements.json"; var achieveObject = {} func _ready(): Init(); MakeSureArraysExist(); func Init(): var fileObj = File.new(); if not (fileObj.file_exists(achievePath)): CreateAchieve(); else : fileObj.open(achievePath, File.READ); var content = fileObj.get_as_text(); Deserialize(content); fileObj.close(); func MakeSureArraysExist(): var keys = ["cats", "minigame", "seenCharacters", "profileTexts", "deathAchievements", "sexAchievements", "killerAchievement", "yellowDeathAchievement", "numberDeathAchievement", ] var shouldUpdate = false; for i in keys: if not achieveObject.has(i): achieveObject[i] = []; shouldUpdate = true; if shouldUpdate: SaveToFile(); func CreateAchieve(): achieveObject = { "cats":[], "minigame":[], "seenCharacters":[], "profileTexts":[], "deathAchievements":[], "sexAchievements":[], "killerAchievement":[], "yellowDeathAchievement":[], "numberDeathAchievement":[], } SaveToFile(); func Deserialize(fileContent): achieveObject = str2var(fileContent); func SaveToFile(): var fileObj = File.new() fileObj.open(achievePath, File.WRITE) var content = var2str(achieveObject); fileObj.store_string(content); fileObj.close(); func AddCat(catNumber:int)->int: if not catNumber in achieveObject["cats"]: achieveObject["cats"].push_back(catNumber); SaveToFile(); return achieveObject["cats"].size(); return - 1; func GetMinigameClues(): return achieveObject["minigame"]; func AddMinigameClue(clue:String)->int: if not clue in achieveObject["minigame"]: achieveObject["minigame"].push_back(clue); SaveToFile(); return achieveObject["minigame"].size(); return - 1; func SetMinigameVariables(): isWindowPressed = Dialogic.get_variable("WindowPressed") == "1"; isCasketPressed = Dialogic.get_variable("CasketPressed") == "1"; isDrawerPressed = Dialogic.get_variable("DrawerPressed") == "1"; isBarrelPressed = Dialogic.get_variable("BarrelPressed") == "1"; isClosedTrapdoorPressed = Dialogic.get_variable("ClosedTrapdoorPressed") == "1"; var isWindowPressed:bool = false; func WindowPressed(): isWindowPressed = true; Dialogic.set_variable("WindowPressed", "1"); func IsWindowPressed()->bool: return isWindowPressed; var isCasketPressed:bool = false; func CasketPressed(): isCasketPressed = true; Dialogic.set_variable("CasketPressed", "1"); func IsCasketPressed()->bool: return isCasketPressed; var isDrawerPressed:bool = false; func DrawerPressed(): isDrawerPressed = true; Dialogic.set_variable("DrawerPressed", "1"); func IsDrawerPressed()->bool: return isDrawerPressed; var isBarrelPressed:bool = false; func BarrelPressed(): isBarrelPressed = true; Dialogic.set_variable("BarrelPressed", "1"); func IsBarrelPressed()->bool: return isBarrelPressed; var isClosedTrapdoorPressed:bool = false; func ClosedTrapdoorPressed(): isClosedTrapdoorPressed = true; Dialogic.set_variable("ClosedTrapdoorPressed", "1"); func IsClosedTrapdoorPressed()->bool: return isClosedTrapdoorPressed; func AddSeenCharacter(character:String): if not character in achieveObject["seenCharacters"]: achieveObject["seenCharacters"].push_back(character); SaveToFile(); return return func AddProfileText(stringText:String): if not stringText in achieveObject["profileTexts"]: achieveObject["profileTexts"].push_back(stringText); SaveToFile(); return return func GetSeenCharacters(): return achieveObject["seenCharacters"] func IsInSeenCharacters(name:String)->bool: return name in achieveObject["seenCharacters"]; func GetProfileText(): return achieveObject["profileTexts"] var allDeathAch = [ "Fall", "Knife", "Electrocute", "Explosion", "Poison", "Stairs", "Pillow", "Drowned", "Shot_boy", "Shot_girl", ] func AddDeathAchievement(achName): # Steam.set_achievement(achName); if not achName in achieveObject["deathAchievements"]: achieveObject["deathAchievements"].push_back(achName); SaveToFile(); for i in allDeathAch: if not i in achieveObject["deathAchievements"]: return ; # Steam.set_achievement("Immortal"); var allSexAch = [ "Orange_S", "Green_S", "Pink_S", "Blue_S", "Black_S", "Purple_S", ] func AddSexAchievement(achName): # Steam.set_achievement(achName); if not achName in achieveObject["sexAchievements"]: achieveObject["sexAchievements"].push_back(achName); SaveToFile(); for i in allSexAch: if not i in achieveObject["sexAchievements"]: return ; # Steam.set_achievement("Don_Juan"); func AddKillersAchievement(killer): if not killer in achieveObject["killerAchievement"]: achieveObject["killerAchievement"].push_back(killer); SaveToFile(); var killers = ["Blue", "Pink"]; for i in killers: if not i in achieveObject["killerAchievement"]: return ; # Steam.set_achievement("Two_killer"); func AddYellowDeathAchievement(achName): if not achName in achieveObject["yellowDeathAchievement"]: achieveObject["yellowDeathAchievement"].push_back(achName); SaveToFile(); var deaths = ["Electricity", "Fire"]; for i in deaths: if not i in achieveObject["yellowDeathAchievement"]: return ; # Steam.set_achievement("Boss_death"); func AddNumberDeathAchievement(death, boy): var achName = str(death, boy); if not achName in achieveObject["numberDeathAchievement"]: achieveObject["numberDeathAchievement"].push_back(achName); SaveToFile(); var deaths = CreateNumberDeathCheck(); for i in deaths: if not i in achieveObject["numberDeathAchievement"]: return ; # Steam.set_achievement("Definitely_not_me"); var numberDeathCheck = []; func CreateNumberDeathCheck()->Array: if numberDeathCheck.size() != 0: return numberDeathCheck; var numberDeath = ["3_Death_Electricity", "4_Death_Fire"]; var deathBoys = ["Red", "Yellow", "White", "Blue_M", "Gray"]; for i in numberDeath: for j in deathBoys: numberDeathCheck.push_back(str(i, j)); return numberDeathCheck; var slotLocation = [ Vector2(1478, 620), Vector2(2004, 700), Vector2(2504, 712), Vector2(1920, 961), Vector2(2440, 1008), Vector2(1256, 1248), Vector2(1876, 1308), Vector2(2454, 1322), Vector2(1036, 1704), Vector2(1676, 1672), Vector2(2328, 1728), ] var variables = [ {"variable":"Garage", "slot":10}, {"variable":"Office", "slot":11}, {"variable":"Kamin", "slot":8}, {"variable":"Room", "slot":3}, {"variable":"Smoking", "slot":2}, {"variable":"Kitchen", "slot":1}, {"variable":"Stairs", "slot":5}, {"variable":"Lighthouse", "slot":7}, {"variable":"Cliff", "slot":4}, {"variable":"Parking", "slot":9}, {"variable":"Pristan", "slot":4}, {"variable":"Podval", "slot":6}, {"variable":"Prichal", "slot":3}, {"variable":"Restaurant", "slot":8}, {"variable":"Tropa", "slot":9}, ]; var cachedEpilog:Array = []; func CreateEpilogMinigameImages()->Array: if cachedEpilog.size() != 0: return cachedEpilog; var available = {}; for i in range(1, 12): available[i] = 0; for i in variables: if Dialogic.get_variable(i["variable"]) == "1": cachedEpilog.push_back({"name":i["variable"], "status":true, "slot":i["slot"]}); available[i["slot"]] += 1; for i in available: if available[i] == 1: continue; if available[i] == 2: var firstAvailableSlot = FirstAvailableSlot(available); available[firstAvailableSlot] = 1; available[i] = 1; for j in cachedEpilog: if j["slot"] == i: j["slot"] = firstAvailableSlot; j["location"] = slotLocation[firstAvailableSlot - 1]; break for i in available: if available[i] == 1: continue; if available[i] == 0: for j in variables: if j["slot"] == i: cachedEpilog.push_back({"name":j["variable"], "status":false, "slot":j["slot"]}); break return cachedEpilog; func FirstAvailableSlot(dict:Dictionary)->int: for i in dict: var value = dict[i]; if value == 0: return i; return 1;