343 lines
7.8 KiB
GDScript
343 lines
7.8 KiB
GDScript
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;
|