User prompt
oyunda oynaya basınca geri tuşu yok
User prompt
Son kontrolleri yap
User prompt
YARIŞ TEK TUR OLSUN
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.horseData = flatHorseData;' Line Number: 2255 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
HADİ SON KONTROLLERİ YAP
User prompt
neyse yorgunluğu falan iptal et ya vazgeçtim eski ayara dön
User prompt
yarış diyince yarış başlamıyor piste gidip yarışması lazım atın birini seçip yarış diyip yarışömam lazım
User prompt
yarış tuşu çalışmıyor
User prompt
tamam cooldownu yapma yorgunluk olsun o zaman bir kere yarıştıktan sonra
User prompt
yarış bozuldu yarışı düzenle benim kastım yarış tuşuna basınca hangi atla yarışmamızı istediğimizi sorsun ama o yarıştan sonra bir daha seçemeyelim bir maç cooldown u olsun
User prompt
yarış pisti hala küçük biraz büyüt yarışan atlar arasındaki mesafeyi arttır yan yana bitişik gözüküyorlar bizim atlarımızı göstermek için üstünde sarı yıldız olsun yarış diyince bir atımızı seçebilelim ve yorgunluk olsun hep bir atı yarıştıramayalım kondisyon falan aynı zamanda tek turda bitmesin 3 turda bitsin yarışlar
User prompt
atlar çok birbirine giriyor ve karışık pisti güzelleştir atların yarışını güzelleştir birbiri arasındaki mesafeyi aç ve kendi atımızın üstünde işaret olsun
User prompt
pisti kendin yap ve atları ona göre koştur daire şeklinde
Code edit (1 edits merged)
Please save this source code
User prompt
atlar ters yuvarlak çiziyor ama benim pistime uygun şekilde koşturmuyorsun hala çok dıştan koşuyorlar
User prompt
pist yuvarlak olduğu için atlar piste göre yarışması lazım ona göre ayarla ve son dokunuşları yap bu güncellemeden sonra oyunu yayınlayacağım.
User prompt
oyun mantık veya mekanik hata var gibi duruyor. Yardım kısmını düzenle yazılar kayık falan ortala ekranı
User prompt
para kısmı hatalı turnuva oynuyorum bir at finish çizgisine değdiği anda param çok fazla artmaya başlıyor hatalı oluyor ayrıca yardım kısmını eklememişsin
User prompt
yardım diye bir yer de olsun oyunu anlatan ayrıca mekanikleri ve görsel kaliteyi arttır grafik kalitesini arttır oyunun amacı nedir falan yaz yardım kısmına tüm dillerde de çevirirsin
User prompt
Please fix the bug: 'Uncaught ReferenceError: titleText is not defined' in or related to this line: 'if (titleText) {' Line Number: 1185
User prompt
dil destekleri çok kötü türkçe yapsam sadece belli yerlerde türkçe oluyor diğer yerlerde ingilizce oluyor tam kapsamlı yap turnuva yerine giriyorum back diyemiyorum kodları kontrol et tamamen. Arayüzü güzelleştir
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'btn.text.style.fill = isSelected ? '#f1c40f' : '#ffffff';' Line Number: 570
User prompt
Mağazayı güncelle ve kodları iyileştir aynı zamanda ayarları güncelle dil seçenekleri kısmını güzelleştir assetleri güncelle ve yeni assetler yap güzelleştir aı ile asset yap onları koy.
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.achievements = achievementSystem.achievements;' Line Number: 1503 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
assets leri güncelle ve oyun kalitesini arttır oyun ekrana göre biraz küçük görünüyor ayrıca bir kaç dil desteği daha ekle ve oyunu geliştir ve 26 yeni özellik ekle ↪💡 Consider importing and using the following plugins: @upit/storage.v1
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Achievement = Container.expand(function () {
var self = Container.call(this);
self.achievements = {
firstWin: {
unlocked: false,
name: 'First Victory',
description: 'Win your first race'
},
tenWins: {
unlocked: false,
name: 'Champion',
description: 'Win 10 races'
},
firstBreed: {
unlocked: false,
name: 'Breeder',
description: 'Breed your first horse'
},
millionaire: {
unlocked: false,
name: 'Millionaire',
description: 'Earn $1,000,000'
},
collector: {
unlocked: false,
name: 'Collector',
description: 'Own 10 horses'
},
trainer: {
unlocked: false,
name: 'Master Trainer',
description: 'Train horses 50 times'
},
speedster: {
unlocked: false,
name: 'Speed Demon',
description: 'Have a horse with 100+ speed'
},
endurance: {
unlocked: false,
name: 'Endurance Master',
description: 'Have a horse with 100+ stamina'
}
};
self.checkAchievements = function () {
// Check first win
if (!self.achievements.firstWin.unlocked && LK.getScore() >= 1) {
self.unlockAchievement('firstWin');
}
// Check ten wins
if (!self.achievements.tenWins.unlocked && LK.getScore() >= 10) {
self.unlockAchievement('tenWins');
}
// Check millionaire
if (!self.achievements.millionaire.unlocked && totalEarnings >= 1000000) {
self.unlockAchievement('millionaire');
}
// Check collector
if (!self.achievements.collector.unlocked && horses.length >= 10) {
self.unlockAchievement('collector');
}
// Check trainer
if (!self.achievements.trainer.unlocked && trainingCount >= 50) {
self.unlockAchievement('trainer');
}
};
self.unlockAchievement = function (id) {
self.achievements[id].unlocked = true;
// Flatten achievements for storage
var flatAchievements = {};
for (var key in self.achievements) {
flatAchievements[key + '_unlocked'] = self.achievements[key].unlocked;
flatAchievements[key + '_name'] = self.achievements[key].name;
flatAchievements[key + '_description'] = self.achievements[key].description;
}
storage.achievements = flatAchievements;
LK.effects.flashScreen(0xffd700, 500);
};
return self;
});
var Horse = Container.expand(function (config) {
var self = Container.call(this);
config = config || {};
// Horse stats
self.name = config.name || 'Unnamed Horse';
self.speed = config.speed || Math.random() * 50 + 50;
self.stamina = config.stamina || Math.random() * 50 + 50;
self.temperament = config.temperament || Math.random() * 50 + 50;
self.age = config.age || 2;
self.raceWins = config.raceWins || 0;
self.value = config.value || 10000;
self.currentEnergy = 100;
self.maxEnergy = 100;
// Visual representation
var horseBody = self.attachAsset('horse', {
anchorX: 0.5,
anchorY: 0.5
});
var jockeySprite = self.attachAsset('jockey', {
anchorX: 0.5,
anchorY: 0.5,
y: -20
});
// Racing properties
self.racePosition = 0;
self.raceSpeed = 0;
self.isRacing = false;
self.train = function (type) {
switch (type) {
case 'speed':
self.speed += Math.random() * 5 + 2;
break;
case 'stamina':
self.stamina += Math.random() * 5 + 2;
break;
case 'temperament':
self.temperament += Math.random() * 5 + 2;
break;
}
self.currentEnergy = Math.max(0, self.currentEnergy - 20);
};
self.rest = function () {
self.currentEnergy = Math.min(self.maxEnergy, self.currentEnergy + 30);
};
self.breed = function (partner) {
var offspring = new Horse({
speed: (self.speed + partner.speed) / 2 + (Math.random() - 0.5) * 20,
stamina: (self.stamina + partner.stamina) / 2 + (Math.random() - 0.5) * 20,
temperament: (self.temperament + partner.temperament) / 2 + (Math.random() - 0.5) * 20,
age: 0,
name: 'Foal ' + Math.floor(Math.random() * 1000)
});
breedingCount++;
if (breedingCount === 1 && achievementSystem) {
achievementSystem.achievements.firstBreed.unlocked = true;
}
return offspring;
};
self.getRaceSpeed = function () {
var energyFactor = self.currentEnergy / self.maxEnergy;
return (self.speed * 0.6 + self.stamina * 0.4) * energyFactor;
};
self.update = function () {
if (self.isRacing) {
self.raceSpeed = self.getRaceSpeed() * (0.8 + Math.random() * 0.4);
self.racePosition += self.raceSpeed * 0.1;
self.x = self.racePosition;
// Energy drain during race
self.currentEnergy = Math.max(0, self.currentEnergy - 0.2);
}
};
return self;
});
var MainMenu = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('menuBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
var titleText = new Text2('', {
size: 80,
fill: '#ffffff'
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 500;
self.addChild(titleText);
var playBtn = self.attachAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1000
});
var playText = new Text2('', {
size: 50,
fill: '#ffffff'
});
playText.anchor.set(0.5, 0.5);
playText.x = 1024;
playText.y = 1000;
self.addChild(playText);
var tournamentBtn = self.attachAsset('tournamentButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1150
});
var tournamentText = new Text2('', {
size: 45,
fill: '#ffffff'
});
tournamentText.anchor.set(0.5, 0.5);
tournamentText.x = 1024;
tournamentText.y = 1150;
self.addChild(tournamentText);
var shopBtn = self.attachAsset('shopButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1300
});
var shopText = new Text2('', {
size: 45,
fill: '#ffffff'
});
shopText.anchor.set(0.5, 0.5);
shopText.x = 1024;
shopText.y = 1300;
self.addChild(shopText);
var settingsBtn = self.attachAsset('settingsButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1450
});
var settingsText = new Text2('', {
size: 45,
fill: '#ffffff'
});
settingsText.anchor.set(0.5, 0.5);
settingsText.x = 1024;
settingsText.y = 1450;
self.addChild(settingsText);
self.updateLanguage = function () {
titleText.setText(translations[currentLanguage].title);
playText.setText(translations[currentLanguage].play);
tournamentText.setText(translations[currentLanguage].tournament);
shopText.setText(translations[currentLanguage].shop);
settingsText.setText(translations[currentLanguage].settings);
};
self.down = function (x, y, obj) {
if (!obj || !obj.parent || !obj.parent.toGlobal) {
var localPos = {
x: x,
y: y
};
} else {
var localPos = self.toLocal(obj.parent.toGlobal(obj.position));
}
// Check play button
if (localPos.x >= 774 && localPos.x <= 1274 && localPos.y >= 940 && localPos.y <= 1060) {
currentView = 'stable';
updateView();
LK.getSound('buttonClick').play();
}
// Check tournament button
if (localPos.x >= 824 && localPos.x <= 1224 && localPos.y >= 1090 && localPos.y <= 1210) {
currentView = 'tournament';
updateView();
LK.getSound('buttonClick').play();
}
// Check shop button
if (localPos.x >= 824 && localPos.x <= 1224 && localPos.y >= 1240 && localPos.y <= 1360) {
currentView = 'shop';
updateView();
LK.getSound('buttonClick').play();
}
// Check settings button
if (localPos.x >= 799 && localPos.x <= 1249 && localPos.y >= 1390 && localPos.y <= 1510) {
currentView = 'settings';
updateView();
LK.getSound('buttonClick').play();
}
};
return self;
});
var RaceView = Container.expand(function () {
var self = Container.call(this);
// Create race track
var track = self.attachAsset('trackSegment', {
anchorX: 0,
anchorY: 0.5,
x: 0,
y: 1366
});
var finishLine = self.attachAsset('finish', {
anchorX: 0.5,
anchorY: 0.5,
x: 1900,
y: 1366
});
var raceTitle = new Text2('RACE IN PROGRESS', {
size: 50,
fill: '#ffffff'
});
raceTitle.anchor.set(0.5, 0.5);
raceTitle.x = 1024;
raceTitle.y = 200;
self.addChild(raceTitle);
self.raceHorses = [];
self.setupRace = function () {
// Clear existing race horses
for (var i = 0; i < self.raceHorses.length; i++) {
self.raceHorses[i].destroy();
}
self.raceHorses = [];
// Add player's horses and AI horses
var raceHorsesList = [];
// Add player horses
for (var i = 0; i < Math.min(horses.length, 3); i++) {
raceHorsesList.push(horses[i]);
}
// Add AI horses to fill up to 6 total
while (raceHorsesList.length < 6) {
var aiHorse = new Horse({
name: 'AI Horse ' + (raceHorsesList.length + 1),
speed: Math.random() * 40 + 60,
stamina: Math.random() * 40 + 60,
temperament: Math.random() * 40 + 60
});
raceHorsesList.push(aiHorse);
}
// Position horses at start line
for (var i = 0; i < raceHorsesList.length; i++) {
var horse = raceHorsesList[i];
horse.x = 50;
horse.y = 1200 + i * 70;
horse.racePosition = 0;
horse.isRacing = true;
horse.currentEnergy = horse.maxEnergy;
self.addChild(horse);
self.raceHorses.push(horse);
}
};
self.checkRaceFinish = function () {
for (var i = 0; i < self.raceHorses.length; i++) {
var horse = self.raceHorses[i];
if (horse.racePosition >= 1850) {
// Race finished
self.finishRace(horse);
return true;
}
}
return false;
};
self.finishRace = function (winner) {
// Stop all horses
for (var i = 0; i < self.raceHorses.length; i++) {
self.raceHorses[i].isRacing = false;
}
// Check if winner is player's horse
var isPlayerWinner = false;
for (var i = 0; i < horses.length; i++) {
if (horses[i] === winner) {
isPlayerWinner = true;
winner.raceWins++;
break;
}
}
if (isPlayerWinner) {
money += 10000;
LK.setScore(LK.getScore() + 1);
LK.getSound('crowdCheer').play();
} else {
money += 2000; // Participation prize
}
updateMoneyDisplay();
// Return to stable after 3 seconds
LK.setTimeout(function () {
currentView = 'stable';
updateView();
}, 3000);
};
return self;
});
var SettingsMenu = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('settingsBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
var panel = self.attachAsset('settingsPanel', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
var titleText = new Text2('', {
size: 80,
fill: '#ecf0f1'
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 300;
self.addChild(titleText);
var languageLabel = new Text2('', {
size: 50,
fill: '#3498db'
});
languageLabel.anchor.set(0.5, 0.5);
languageLabel.x = 1024;
languageLabel.y = 500;
self.addChild(languageLabel);
// Language data with flag colors
var languages = [{
name: 'English',
code: 'en',
flag: 0xff0000
}, {
name: 'Русский',
code: 'ru',
flag: 0x0080ff
}, {
name: 'Français',
code: 'fr',
flag: 0x0000ff
}, {
name: 'Türkçe',
code: 'tr',
flag: 0xff0000
}, {
name: 'Español',
code: 'es',
flag: 0xffff00
}, {
name: 'Deutsch',
code: 'de',
flag: 0x000000
}, {
name: '中文',
code: 'zh',
flag: 0xff0000
}, {
name: '日本語',
code: 'ja',
flag: 0xff0000
}, {
name: 'Italiano',
code: 'it',
flag: 0x00ff00
}, {
name: 'Português',
code: 'pt',
flag: 0x00ff00
}];
self.languageButtons = [];
for (var i = 0; i < languages.length; i++) {
var lang = languages[i];
var isSelected = currentLanguage === lang.code;
var btnAsset = isSelected ? 'selectedLanguage' : 'languageButton';
var langBtn = self.attachAsset(btnAsset, {
anchorX: 0.5,
anchorY: 0.5,
x: 350 + i % 4 * 350,
y: 700 + Math.floor(i / 4) * 150
});
var flagIcon = self.attachAsset('languageFlag', {
anchorX: 0.5,
anchorY: 0.5,
x: 250 + i % 4 * 350,
y: 700 + Math.floor(i / 4) * 150
});
flagIcon.tint = lang.flag;
var langText = new Text2(lang.name, {
size: 26,
fill: isSelected ? '#f1c40f' : '#ffffff'
});
langText.anchor.set(0.5, 0.5);
langText.x = 380 + i % 4 * 350;
langText.y = 700 + Math.floor(i / 4) * 150;
langText.langCode = lang.code;
self.addChild(langText);
self.languageButtons.push({
button: langBtn,
flag: flagIcon,
text: langText,
code: lang.code,
x: 350 + i % 4 * 350,
y: 700 + Math.floor(i / 4) * 150
});
}
// Audio settings
var audioLabel = new Text2('Audio Settings', {
size: 45,
fill: '#e67e22'
});
audioLabel.anchor.set(0.5, 0.5);
audioLabel.x = 1024;
audioLabel.y = 1400;
self.addChild(audioLabel);
var volumeLabel = new Text2('Master Volume: 100%', {
size: 35,
fill: '#95a5a6'
});
volumeLabel.anchor.set(0.5, 0.5);
volumeLabel.x = 1024;
volumeLabel.y = 1500;
self.addChild(volumeLabel);
var backBtn = self.attachAsset('backButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1700
});
var backText = new Text2('', {
size: 40,
fill: '#ffffff'
});
backText.anchor.set(0.5, 0.5);
backText.x = 1024;
backText.y = 1700;
self.addChild(backText);
self.updateLanguage = function () {
titleText.setText(translations[currentLanguage].settings || 'SETTINGS');
languageLabel.setText(translations[currentLanguage].language || 'Choose Language:');
backText.setText(translations[currentLanguage].back || 'BACK');
// Update button selection
for (var i = 0; i < self.languageButtons.length; i++) {
var btn = self.languageButtons[i];
var isSelected = currentLanguage === btn.code;
btn.text.fill = isSelected ? '#f1c40f' : '#ffffff';
}
};
self.down = function (x, y, obj) {
if (!obj || !obj.parent || !obj.parent.toGlobal) {
var localPos = {
x: x,
y: y
};
} else {
var localPos = self.toLocal(obj.parent.toGlobal(obj.position));
}
// Check language buttons
for (var i = 0; i < self.languageButtons.length; i++) {
var btn = self.languageButtons[i];
if (localPos.x >= btn.x - 210 && localPos.x <= btn.x + 210 && localPos.y >= btn.y - 60 && localPos.y <= btn.y + 60) {
if (currentLanguage !== btn.code) {
currentLanguage = btn.code;
storage.language = currentLanguage;
updateAllLanguages();
LK.getSound('buttonClick').play();
LK.effects.flashScreen(0x3498db, 200);
// Refresh UI to update selection
currentView = 'settings';
updateView();
}
break;
}
}
// Check back button
if (localPos.x >= 874 && localPos.x <= 1174 && localPos.y >= 1640 && localPos.y <= 1760) {
currentView = 'menu';
updateView();
LK.getSound('buttonClick').play();
}
};
return self;
});
var Shop = Container.expand(function () {
var self = Container.call(this);
self.currentCategory = 'basic';
self.categories = ['basic', 'premium', 'legendary'];
self.categoryButtons = [];
self.itemButtons = [];
self.items = {
basic: {
feed: {
name: 'Premium Feed',
price: 5000,
effect: 'energy',
description: 'Restores horse energy',
icon: 'speedBoost'
},
medicine: {
name: 'Energy Boost',
price: 8000,
effect: 'health',
description: 'Increases max energy',
icon: 'healthBoost'
},
vitamins: {
name: 'Vitamins',
price: 10000,
effect: 'stamina',
description: 'Improves stamina',
icon: 'staminaBoost'
}
},
premium: {
equipment: {
name: 'Racing Equipment',
price: 15000,
effect: 'speed',
description: 'Professional racing gear',
icon: 'speedBoost'
},
training: {
name: 'Advanced Training',
price: 20000,
effect: 'training',
description: 'Elite training program',
icon: 'staminaBoost'
},
superFeed: {
name: 'Super Feed',
price: 25000,
effect: 'superEnergy',
description: 'Premium nutrition boost',
icon: 'healthBoost'
}
},
legendary: {
geneticBoost: {
name: 'Genetic Enhancement',
price: 100000,
effect: 'genetic',
description: 'Permanent stat boost',
icon: 'gemIcon'
},
championGear: {
name: 'Champion Gear',
price: 150000,
effect: 'champion',
description: 'Legendary equipment set',
icon: 'speedBoost'
},
immortalElixir: {
name: 'Immortal Elixir',
price: 200000,
effect: 'immortal',
description: 'Stops aging process',
icon: 'healthBoost'
}
}
};
self.setupUI = function () {
var background = self.attachAsset('shopBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
var titleText = new Text2(translations[currentLanguage].shop || 'Elite Horse Shop', {
size: 90,
fill: '#ecf0f1'
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 250;
self.addChild(titleText);
// Category buttons
for (var i = 0; i < self.categories.length; i++) {
var category = self.categories[i];
var categoryBtn = self.attachAsset('shopButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 400 + i * 400,
y: 400
});
var categoryText = new Text2(category.toUpperCase(), {
size: 35,
fill: '#ffffff'
});
categoryText.anchor.set(0.5, 0.5);
categoryText.x = 400 + i * 400;
categoryText.y = 400;
categoryText.categoryId = category;
self.addChild(categoryText);
self.categoryButtons.push({
button: categoryBtn,
text: categoryText,
category: category
});
}
self.refreshItems();
var backBtn = self.attachAsset('backButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 2400
});
var backText = new Text2(translations[currentLanguage].back || 'Back', {
size: 45,
fill: '#ffffff'
});
backText.anchor.set(0.5, 0.5);
backText.x = 1024;
backText.y = 2400;
self.addChild(backText);
};
self.refreshItems = function () {
// Clear existing item buttons
for (var i = 0; i < self.itemButtons.length; i++) {
if (self.itemButtons[i].destroy) {
self.itemButtons[i].destroy();
}
}
self.itemButtons = [];
var items = self.items[self.currentCategory];
var yPos = 600;
var itemIndex = 0;
for (var itemId in items) {
var item = items[itemId];
var cardType = self.currentCategory === 'legendary' ? 'legendaryItem' : self.currentCategory === 'premium' ? 'premiumItem' : 'itemCard';
var itemCard = self.attachAsset(cardType, {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: yPos
});
var itemIcon = self.attachAsset(item.icon, {
anchorX: 0.5,
anchorY: 0.5,
x: 650,
y: yPos
});
var itemText = new Text2(item.name, {
size: 40,
fill: '#ffffff'
});
itemText.anchor.set(0, 0.5);
itemText.x = 750;
itemText.y = yPos - 30;
self.addChild(itemText);
var priceText = new Text2('$' + item.price, {
size: 35,
fill: '#f1c40f'
});
priceText.anchor.set(0, 0.5);
priceText.x = 750;
priceText.y = yPos;
self.addChild(priceText);
var descText = new Text2(item.description, {
size: 28,
fill: '#bdc3c7'
});
descText.anchor.set(0, 0.5);
descText.x = 750;
descText.y = yPos + 35;
self.addChild(descText);
self.itemButtons.push({
card: itemCard,
icon: itemIcon,
itemId: itemId,
y: yPos
});
yPos += 220;
itemIndex++;
}
};
self.purchaseItem = function (itemId) {
var item = self.items[self.currentCategory][itemId];
if (money >= item.price) {
money -= item.price;
totalEarnings += item.price;
self.applyItemEffect(item.effect, item);
updateMoneyDisplay();
LK.getSound('coinSound').play();
LK.effects.flashScreen(0x00ff00, 300);
return true;
}
return false;
};
self.applyItemEffect = function (effect, item) {
if (horses.length > 0) {
var horse = horses[selectedHorseIndex || 0];
switch (effect) {
case 'energy':
horse.currentEnergy = horse.maxEnergy;
break;
case 'health':
horse.maxEnergy += 15;
break;
case 'speed':
horse.speed += 8;
break;
case 'stamina':
horse.stamina += 8;
break;
case 'training':
horse.train('speed');
horse.train('stamina');
horse.train('temperament');
break;
case 'superEnergy':
horse.currentEnergy = horse.maxEnergy;
horse.maxEnergy += 25;
break;
case 'genetic':
horse.speed += 20;
horse.stamina += 20;
horse.temperament += 20;
break;
case 'champion':
horse.speed += 15;
horse.stamina += 15;
horse.value *= 2;
break;
case 'immortal':
horse.age = Math.max(2, horse.age - 5);
horse.maxEnergy += 50;
break;
}
}
};
self.down = function (x, y, obj) {
if (!obj || !obj.parent || !obj.parent.toGlobal) {
var localPos = {
x: x,
y: y
};
} else {
var localPos = self.toLocal(obj.parent.toGlobal(obj.position));
}
// Check category buttons
for (var i = 0; i < self.categoryButtons.length; i++) {
var btnX = 400 + i * 400;
var btnY = 400;
if (localPos.x >= btnX - 240 && localPos.x <= btnX + 240 && localPos.y >= btnY - 70 && localPos.y <= btnY + 70) {
self.currentCategory = self.categoryButtons[i].category;
self.refreshItems();
LK.getSound('buttonClick').play();
break;
}
}
// Check item buttons
for (var i = 0; i < self.itemButtons.length; i++) {
var item = self.itemButtons[i];
if (localPos.x >= 724 && localPos.x <= 1324 && localPos.y >= item.y - 100 && localPos.y <= item.y + 100) {
if (self.purchaseItem(item.itemId)) {
self.refreshItems();
}
break;
}
}
// Check back button
if (localPos.x >= 874 && localPos.x <= 1174 && localPos.y >= 2330 && localPos.y <= 2470) {
currentView = 'menu';
updateView();
LK.getSound('buttonClick').play();
}
};
return self;
});
var StableView = Container.expand(function () {
var self = Container.call(this);
var background = self.attachAsset('stableBox', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
var titleText = new Text2('Your Stable', {
size: 60,
fill: '#ffffff'
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 300;
self.addChild(titleText);
// Action buttons - First row
var breedBtn = self.attachAsset('breedButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 512,
y: 1800
});
var breedText = new Text2('BREED', {
size: 35,
fill: '#ffffff'
});
breedText.anchor.set(0.5, 0.5);
breedText.x = 512;
breedText.y = 1800;
self.addChild(breedText);
var trainBtn = self.attachAsset('trainButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1800
});
var trainText = new Text2('TRAIN', {
size: 35,
fill: '#ffffff'
});
trainText.anchor.set(0.5, 0.5);
trainText.x = 1024;
trainText.y = 1800;
self.addChild(trainText);
var raceBtn = self.attachAsset('raceButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1536,
y: 1800
});
var raceText = new Text2('RACE', {
size: 35,
fill: '#ffffff'
});
raceText.anchor.set(0.5, 0.5);
raceText.x = 1536;
raceText.y = 1800;
self.addChild(raceText);
// Action buttons - Second row
var vetBtn = self.attachAsset('vetButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 512,
y: 1950
});
var vetText = new Text2('VET', {
size: 35,
fill: '#ffffff'
});
vetText.anchor.set(0.5, 0.5);
vetText.x = 512;
vetText.y = 1950;
self.addChild(vetText);
var feedBtn = self.attachAsset('feedButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1950
});
var feedText = new Text2('FEED', {
size: 35,
fill: '#ffffff'
});
feedText.anchor.set(0.5, 0.5);
feedText.x = 1024;
feedText.y = 1950;
self.addChild(feedText);
var upgradeBtn = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1536,
y: 1950
});
var upgradeText = new Text2('UPGRADE', {
size: 35,
fill: '#ffffff'
});
upgradeText.anchor.set(0.5, 0.5);
upgradeText.x = 1536;
upgradeText.y = 1950;
self.addChild(upgradeText);
self.horseIcons = [];
self.updateHorseDisplay = function () {
// Clear existing icons
for (var i = 0; i < self.horseIcons.length; i++) {
self.horseIcons[i].destroy();
}
self.horseIcons = [];
// Add current horses
for (var i = 0; i < horses.length; i++) {
var horse = horses[i];
var icon = self.attachAsset('horseIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: 600 + i % 3 * 200,
y: 500 + Math.floor(i / 3) * 100
});
var nameText = new Text2(horse.name, {
size: 20,
fill: '#ffffff'
});
nameText.anchor.set(0.5, 0.5);
nameText.x = 600 + i % 3 * 200;
nameText.y = 550 + Math.floor(i / 3) * 100;
self.addChild(nameText);
var statsText = new Text2('Speed: ' + Math.floor(horse.speed) + ' Energy: ' + Math.floor(horse.currentEnergy), {
size: 16,
fill: '#ffffff'
});
statsText.anchor.set(0.5, 0.5);
statsText.x = 600 + i % 3 * 200;
statsText.y = 570 + Math.floor(i / 3) * 100;
self.addChild(statsText);
self.horseIcons.push(icon);
}
};
self.updateLanguage = function () {
titleText.setText(translations[currentLanguage].yourStable);
breedText.setText(translations[currentLanguage].breed);
trainText.setText(translations[currentLanguage].train);
raceText.setText(translations[currentLanguage].race);
vetText.setText(translations[currentLanguage].vet);
feedText.setText(translations[currentLanguage].feed);
upgradeText.setText(translations[currentLanguage].upgrade);
};
self.down = function (x, y, obj) {
// Safety check for obj.parent
if (!obj || !obj.parent || !obj.parent.toGlobal) {
var localPos = {
x: x,
y: y
};
} else {
var localPos = self.toLocal(obj.parent.toGlobal(obj.position));
}
// Check breed button
if (localPos.x >= 312 && localPos.x <= 712 && localPos.y >= 1740 && localPos.y <= 1860) {
if (horses.length >= 2) {
var offspring = horses[0].breed(horses[1]);
horses.push(offspring);
money -= 5000;
self.updateHorseDisplay();
updateMoneyDisplay();
LK.getSound('buttonClick').play();
}
}
// Check train button
if (localPos.x >= 824 && localPos.x <= 1224 && localPos.y >= 1740 && localPos.y <= 1860) {
if (horses.length > 0) {
horses[0].train('speed');
money -= 1000;
trainingCount++;
self.updateHorseDisplay();
updateMoneyDisplay();
LK.getSound('training').play();
}
}
// Check race button
if (localPos.x >= 1336 && localPos.x <= 1736 && localPos.y >= 1740 && localPos.y <= 1860) {
if (horses.length > 0) {
startRace();
}
}
// Check vet button
if (localPos.x >= 312 && localPos.x <= 712 && localPos.y >= 1890 && localPos.y <= 2010) {
if (horses.length > 0) {
currentView = 'vet';
updateView();
LK.getSound('buttonClick').play();
}
}
// Check feed button
if (localPos.x >= 824 && localPos.x <= 1224 && localPos.y >= 1890 && localPos.y <= 2010) {
if (horses.length > 0 && money >= 500) {
horses[0].currentEnergy = Math.min(horses[0].maxEnergy, horses[0].currentEnergy + 50);
money -= 500;
self.updateHorseDisplay();
updateMoneyDisplay();
LK.getSound('buttonClick').play();
}
}
// Check upgrade button
if (localPos.x >= 1336 && localPos.x <= 1736 && localPos.y >= 1890 && localPos.y <= 2010) {
if (horses.length > 0 && money >= 10000) {
horses[0].speed += 5;
horses[0].stamina += 5;
money -= 10000;
self.updateHorseDisplay();
updateMoneyDisplay();
LK.getSound('buttonClick').play();
}
}
};
return self;
});
var Tournament = Container.expand(function () {
var self = Container.call(this);
self.tournaments = [{
name: 'Spring Classic',
prize: 25000,
difficulty: 'easy',
entryFee: 2000
}, {
name: 'Summer Championship',
prize: 50000,
difficulty: 'medium',
entryFee: 5000
}, {
name: 'Grand Prix',
prize: 100000,
difficulty: 'hard',
entryFee: 10000
}, {
name: 'Ultimate Derby',
prize: 200000,
difficulty: 'extreme',
entryFee: 20000
}];
self.currentTournament = null;
self.tournamentProgress = 0;
self.titleText = null;
self.backText = null;
self.setupUI = function () {
var background = self.attachAsset('menuBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
self.titleText = new Text2(translations[currentLanguage].tournaments || 'Tournaments', {
size: 80,
fill: '#ffffff'
});
self.titleText.anchor.set(0.5, 0.5);
self.titleText.x = 1024;
self.titleText.y = 300;
self.addChild(self.titleText);
var yPos = 600;
for (var i = 0; i < self.tournaments.length; i++) {
var tournament = self.tournaments[i];
var tournamentBtn = self.attachAsset('tournamentButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: yPos
});
var tournamentText = new Text2(tournament.name + ' - Prize: $' + tournament.prize, {
size: 28,
fill: '#ffffff'
});
tournamentText.anchor.set(0.5, 0.5);
tournamentText.x = 1024;
tournamentText.y = yPos;
self.addChild(tournamentText);
yPos += 150;
}
var backBtn = self.attachAsset('backButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 2200
});
self.backText = new Text2(translations[currentLanguage].back || 'Back', {
size: 40,
fill: '#ffffff'
});
self.backText.anchor.set(0.5, 0.5);
self.backText.x = 1024;
self.backText.y = 2200;
self.addChild(self.backText);
};
self.updateLanguage = function () {
if (self.titleText) {
self.titleText.setText(translations[currentLanguage].tournaments || 'Tournaments');
}
if (self.backText) {
self.backText.setText(translations[currentLanguage].back || 'Back');
}
};
self.enterTournament = function (tournamentIndex) {
var tournament = self.tournaments[tournamentIndex];
if (money >= tournament.entryFee) {
money -= tournament.entryFee;
self.currentTournament = tournament;
self.tournamentProgress = 0;
updateMoneyDisplay();
return true;
}
return false;
};
self.completeTournament = function () {
if (self.currentTournament) {
money += self.currentTournament.prize;
totalEarnings += self.currentTournament.prize;
self.currentTournament = null;
updateMoneyDisplay();
LK.getSound('victory').play();
}
};
self.down = function (x, y, obj) {
if (!obj || !obj.parent || !obj.parent.toGlobal) {
var localPos = {
x: x,
y: y
};
} else {
var localPos = self.toLocal(obj.parent.toGlobal(obj.position));
}
// Check tournament buttons
var yPos = 600;
for (var i = 0; i < self.tournaments.length; i++) {
if (localPos.x >= 824 && localPos.x <= 1224 && localPos.y >= yPos - 60 && localPos.y <= yPos + 60) {
if (self.enterTournament(i)) {
currentView = 'race';
updateView();
LK.getSound('buttonClick').play();
}
break;
}
yPos += 150;
}
// Check back button
if (localPos.x >= 874 && localPos.x <= 1174 && localPos.y >= 2140 && localPos.y <= 2260) {
currentView = 'menu';
updateView();
LK.getSound('buttonClick').play();
}
};
return self;
});
var Veterinarian = Container.expand(function () {
var self = Container.call(this);
self.treatments = {
checkup: {
name: 'Health Checkup',
price: 1000,
effect: 'health'
},
energy: {
name: 'Energy Treatment',
price: 2000,
effect: 'energy'
},
performance: {
name: 'Performance Boost',
price: 5000,
effect: 'performance'
},
recovery: {
name: 'Recovery Therapy',
price: 3000,
effect: 'recovery'
}
};
self.titleText = null;
self.backText = null;
self.setupUI = function () {
var background = self.attachAsset('menuBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
self.titleText = new Text2(translations[currentLanguage].veterinarian || 'Veterinarian', {
size: 80,
fill: '#ffffff'
});
self.titleText.anchor.set(0.5, 0.5);
self.titleText.x = 1024;
self.titleText.y = 300;
self.addChild(self.titleText);
var yPos = 600;
for (var treatmentId in self.treatments) {
var treatment = self.treatments[treatmentId];
var treatmentBtn = self.attachAsset('vetButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: yPos
});
var treatmentText = new Text2(treatment.name + ' - $' + treatment.price, {
size: 30,
fill: '#ffffff'
});
treatmentText.anchor.set(0.5, 0.5);
treatmentText.x = 1024;
treatmentText.y = yPos;
self.addChild(treatmentText);
yPos += 150;
}
var backBtn = self.attachAsset('backButton', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 2200
});
self.backText = new Text2(translations[currentLanguage].back || 'Back', {
size: 40,
fill: '#ffffff'
});
self.backText.anchor.set(0.5, 0.5);
self.backText.x = 1024;
self.backText.y = 2200;
self.addChild(self.backText);
};
self.updateLanguage = function () {
if (self.titleText) {
self.titleText.setText(translations[currentLanguage].veterinarian || 'Veterinarian');
}
if (self.backText) {
self.backText.setText(translations[currentLanguage].back || 'Back');
}
};
self.performTreatment = function (treatmentId) {
var treatment = self.treatments[treatmentId];
if (money >= treatment.price && horses.length > 0) {
money -= treatment.price;
self.applyTreatment(treatment.effect);
updateMoneyDisplay();
return true;
}
return false;
};
self.applyTreatment = function (effect) {
if (horses.length > 0) {
var horse = horses[0];
switch (effect) {
case 'health':
horse.maxEnergy += 20;
break;
case 'energy':
horse.currentEnergy = horse.maxEnergy;
break;
case 'performance':
horse.speed += 10;
horse.stamina += 10;
break;
case 'recovery':
horse.currentEnergy = horse.maxEnergy;
horse.speed += 5;
break;
}
}
};
self.down = function (x, y, obj) {
if (!obj || !obj.parent || !obj.parent.toGlobal) {
var localPos = {
x: x,
y: y
};
} else {
var localPos = self.toLocal(obj.parent.toGlobal(obj.position));
}
// Check treatment buttons
var yPos = 600;
for (var treatmentId in self.treatments) {
if (localPos.x >= 824 && localPos.x <= 1224 && localPos.y >= yPos - 75 && localPos.y <= yPos + 75) {
if (self.performTreatment(treatmentId)) {
LK.getSound('buttonClick').play();
LK.effects.flashScreen(0x00ff00, 300);
}
break;
}
yPos += 150;
}
// Check back button
if (localPos.x >= 874 && localPos.x <= 1174 && localPos.y >= 2140 && localPos.y <= 2260) {
currentView = 'stable';
updateView();
LK.getSound('buttonClick').play();
}
};
return self;
});
var Weather = Container.expand(function () {
var self = Container.call(this);
self.conditions = ['sunny', 'rainy', 'cloudy', 'windy'];
self.currentWeather = 'sunny';
self.weatherIcon = null;
self.init = function () {
self.weatherIcon = self.attachAsset('weatherIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: 1900,
y: 150
});
self.updateWeather();
};
self.updateWeather = function () {
self.currentWeather = self.conditions[Math.floor(Math.random() * self.conditions.length)];
switch (self.currentWeather) {
case 'sunny':
self.weatherIcon.tint = 0xffff00;
break;
case 'rainy':
self.weatherIcon.tint = 0x0080ff;
break;
case 'cloudy':
self.weatherIcon.tint = 0x808080;
break;
case 'windy':
self.weatherIcon.tint = 0x90ee90;
break;
}
};
self.getSpeedModifier = function () {
switch (self.currentWeather) {
case 'sunny':
return 1.1;
case 'rainy':
return 0.9;
case 'cloudy':
return 1.0;
case 'windy':
return 0.95;
default:
return 1.0;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22
});
/****
* Game Code
****/
// Language translations
var translations = {
en: {
title: 'Thoroughbred Legacy',
play: 'PLAY',
settings: 'SETTINGS',
language: 'Language:',
back: 'BACK',
yourStable: 'Your Stable',
breed: 'BREED',
train: 'TRAIN',
race: 'RACE',
money: 'Money: $',
wins: 'Wins: '
},
ru: {
title: 'Наследие Чистокровных',
play: 'ИГРАТЬ',
settings: 'НАСТРОЙКИ',
language: 'Язык:',
back: 'НАЗАД',
yourStable: 'Ваша Конюшня',
breed: 'РАЗВЕДЕНИЕ',
train: 'ТРЕНИРОВКА',
race: 'ГОНКА',
money: 'Деньги: $',
wins: 'Побед: '
},
fr: {
title: 'Héritage Pur-Sang',
play: 'JOUER',
settings: 'PARAMÈTRES',
language: 'Langue:',
back: 'RETOUR',
yourStable: 'Votre Écurie',
breed: 'ÉLEVAGE',
train: 'ENTRAÎNER',
race: 'COURSE',
money: 'Argent: $',
wins: 'Victoires: '
},
tr: {
title: 'Safkan Mirası',
play: 'OYNA',
settings: 'AYARLAR',
language: 'Dil Seçimi:',
back: 'GERİ',
yourStable: 'Ahırınız',
breed: 'ÜRETME',
train: 'EĞİTİM',
race: 'YARIŞ',
money: 'Para: $',
wins: 'Galibiyet: ',
upgrade: 'GELİŞTİRME',
shop: 'ELİT AT MAĞAZASI',
tournament: 'TURNUVA',
vet: 'VETERİNER',
feed: 'BESLENME',
weather: 'Hava Durumu',
achievements: 'Başarılar',
statistics: 'İstatistikler',
basic: 'TEMEL',
premium: 'PREMİUM',
legendary: 'EFSANEVİ',
audio: 'Ses Ayarları',
volume: 'Ana Ses: %',
tournaments: 'Turnuvalar',
veterinarian: 'Veteriner Hekim',
selectHorse: 'At Seçin',
horseStats: 'At İstatistikleri',
speed: 'Hız',
stamina: 'Dayanıklılık',
energy: 'Enerji',
age: 'Yaş',
value: 'Değer',
raceWins: 'Yarış Zaferleri',
temperament: 'Mizaç'
},
es: {
title: 'Legado Pura Sangre',
play: 'JUGAR',
settings: 'CONFIGURACIÓN',
language: 'Idioma:',
back: 'VOLVER',
yourStable: 'Tu Establo',
breed: 'CRIAR',
train: 'ENTRENAR',
race: 'CARRERA',
money: 'Dinero: $',
wins: 'Victorias: ',
upgrade: 'MEJORAR',
shop: 'TIENDA',
tournament: 'TORNEO',
vet: 'VETERINARIO',
feed: 'ALIMENTAR',
weather: 'Clima',
achievements: 'Logros',
statistics: 'Estadísticas'
},
de: {
title: 'Vollblut Erbe',
play: 'SPIELEN',
settings: 'EINSTELLUNGEN',
language: 'Sprache:',
back: 'ZURÜCK',
yourStable: 'Dein Stall',
breed: 'ZÜCHTEN',
train: 'TRAINIEREN',
race: 'RENNEN',
money: 'Geld: $',
wins: 'Siege: ',
upgrade: 'VERBESSERN',
shop: 'LADEN',
tournament: 'TURNIER',
vet: 'TIERARZT',
feed: 'FÜTTERN',
weather: 'Wetter',
achievements: 'Erfolge',
statistics: 'Statistiken'
},
zh: {
title: '纯血传承',
play: '开始游戏',
settings: '设置',
language: '语言:',
back: '返回',
yourStable: '你的马厩',
breed: '繁殖',
train: '训练',
race: '比赛',
money: '金钱: $',
wins: '胜利: ',
upgrade: '升级',
shop: '商店',
tournament: '锦标赛',
vet: '兽医',
feed: '喂养',
weather: '天气',
achievements: '成就',
statistics: '统计'
},
ja: {
title: 'サラブレッドの遺産',
play: 'プレイ',
settings: '設定',
language: '言語:',
back: '戻る',
yourStable: 'あなたの厩舎',
breed: '繁殖',
train: '訓練',
race: 'レース',
money: 'お金: $',
wins: '勝利: ',
upgrade: 'アップグレード',
shop: 'ショップ',
tournament: 'トーナメント',
vet: '獣医',
feed: '餌やり',
weather: '天気',
achievements: '実績',
statistics: '統計'
},
it: {
title: 'Eredità Purosangue',
play: 'GIOCA',
settings: 'IMPOSTAZIONI',
language: 'Lingua:',
back: 'INDIETRO',
yourStable: 'La Tua Scuderia',
breed: 'ALLEVARE',
train: 'ALLENARE',
race: 'CORSA',
money: 'Denaro: $',
wins: 'Vittorie: ',
upgrade: 'MIGLIORARE',
shop: 'NEGOZIO',
tournament: 'TORNEO',
vet: 'VETERINARIO',
feed: 'NUTRIRE',
weather: 'Tempo',
achievements: 'Risultati',
statistics: 'Statistiche'
},
pt: {
title: 'Legado Puro Sangue',
play: 'JOGAR',
settings: 'CONFIGURAÇÕES',
language: 'Idioma:',
back: 'VOLTAR',
yourStable: 'Seu Estábulo',
breed: 'CRIAR',
train: 'TREINAR',
race: 'CORRIDA',
money: 'Dinheiro: $',
wins: 'Vitórias: ',
upgrade: 'MELHORAR',
shop: 'LOJA',
tournament: 'TORNEIO',
vet: 'VETERINÁRIO',
feed: 'ALIMENTAR',
weather: 'Tempo',
achievements: 'Conquistas',
statistics: 'Estatísticas'
}
};
// Load saved language or default to English
var currentLanguage = storage.language || 'en';
// Game state
var currentView = 'menu';
var horses = [];
var money = 50000;
var raceInProgress = false;
var totalEarnings = storage.totalEarnings || 0;
var trainingCount = storage.trainingCount || 0;
var breedingCount = storage.breedingCount || 0;
var selectedHorseIndex = 0;
var weatherSystem = null;
var achievementSystem = null;
var shopSystem = null;
var tournamentSystem = null;
var veterinarianSystem = null;
var currentWeather = 'sunny';
var gameTime = 0;
var seasonalBonus = 1.0;
// UI Elements
var moneyText = new Text2('Money: $' + money, {
size: 40,
fill: '#ffffff'
});
moneyText.anchor.set(0, 0);
moneyText.x = 150;
moneyText.y = 50;
LK.gui.topLeft.addChild(moneyText);
var scoreText = new Text2('Wins: ' + LK.getScore(), {
size: 40,
fill: '#ffffff'
});
scoreText.anchor.set(1, 0);
scoreText.x = -50;
scoreText.y = 50;
LK.gui.topRight.addChild(scoreText);
// Views
var mainMenu = new MainMenu();
var settingsMenu = new SettingsMenu();
var stableView = new StableView();
var raceView = new RaceView();
// Initialize game systems
weatherSystem = new Weather();
achievementSystem = new Achievement();
shopSystem = new Shop();
tournamentSystem = new Tournament();
veterinarianSystem = new Veterinarian();
// Setup weather system
weatherSystem.init();
game.addChild(weatherSystem);
// Load achievements from storage
if (storage.achievements) {
// Reconstruct achievements from flattened storage
var flatAchievements = storage.achievements;
for (var key in achievementSystem.achievements) {
if (flatAchievements[key + '_unlocked'] !== undefined) {
achievementSystem.achievements[key].unlocked = flatAchievements[key + '_unlocked'];
}
if (flatAchievements[key + '_name'] !== undefined) {
achievementSystem.achievements[key].name = flatAchievements[key + '_name'];
}
if (flatAchievements[key + '_description'] !== undefined) {
achievementSystem.achievements[key].description = flatAchievements[key + '_description'];
}
}
}
// Initialize with starter horses
horses.push(new Horse({
name: 'Thunder',
speed: 70,
stamina: 65,
temperament: 60
}));
horses.push(new Horse({
name: 'Lightning',
speed: 60,
stamina: 70,
temperament: 65
}));
function updateMoneyDisplay() {
moneyText.setText(translations[currentLanguage].money + money);
scoreText.setText(translations[currentLanguage].wins + LK.getScore());
}
function updateAllLanguages() {
updateMoneyDisplay();
if (mainMenu.parent) {
mainMenu.updateLanguage();
}
if (settingsMenu.parent) {
settingsMenu.updateLanguage();
}
if (stableView.parent) {
stableView.updateLanguage();
}
}
function updateView() {
// Remove all views
if (mainMenu.parent) {
game.removeChild(mainMenu);
}
if (settingsMenu.parent) {
game.removeChild(settingsMenu);
}
if (stableView.parent) {
game.removeChild(stableView);
}
if (raceView.parent) {
game.removeChild(raceView);
}
// Add current view
if (currentView === 'menu') {
game.addChild(mainMenu);
mainMenu.updateLanguage();
raceInProgress = false;
LK.playMusic('menuMusic');
} else if (currentView === 'settings') {
game.addChild(settingsMenu);
settingsMenu.updateLanguage();
raceInProgress = false;
} else if (currentView === 'stable') {
game.addChild(stableView);
stableView.updateHorseDisplay();
stableView.updateLanguage();
raceInProgress = false;
LK.playMusic('stableMusic');
} else if (currentView === 'race') {
game.addChild(raceView);
raceView.setupRace();
raceInProgress = true;
LK.getSound('hoofbeats').play();
LK.playMusic('raceMusic');
} else if (currentView === 'shop') {
shopSystem.setupUI();
game.addChild(shopSystem);
raceInProgress = false;
} else if (currentView === 'tournament') {
tournamentSystem.setupUI();
game.addChild(tournamentSystem);
if (tournamentSystem.updateLanguage) {
tournamentSystem.updateLanguage();
}
raceInProgress = false;
} else if (currentView === 'vet') {
veterinarianSystem.setupUI();
game.addChild(veterinarianSystem);
if (veterinarianSystem.updateLanguage) {
veterinarianSystem.updateLanguage();
}
raceInProgress = false;
}
}
function startRace() {
if (horses.length > 0) {
currentView = 'race';
updateView();
}
}
// Helper functions
function saveGameProgress() {
storage.money = money;
storage.totalEarnings = totalEarnings;
storage.trainingCount = trainingCount;
storage.breedingCount = breedingCount;
// Flatten achievements for storage
var flatAchievements = {};
for (var key in achievementSystem.achievements) {
flatAchievements[key + '_unlocked'] = achievementSystem.achievements[key].unlocked;
flatAchievements[key + '_name'] = achievementSystem.achievements[key].name;
flatAchievements[key + '_description'] = achievementSystem.achievements[key].description;
}
storage.achievements = flatAchievements;
// Flatten horse data for storage
var flatHorseData = [];
for (var i = 0; i < horses.length; i++) {
flatHorseData.push([horses[i].name, horses[i].speed, horses[i].stamina, horses[i].temperament, horses[i].age, horses[i].raceWins, horses[i].value, horses[i].currentEnergy, horses[i].maxEnergy]);
}
storage.horseData = flatHorseData;
}
function loadGameProgress() {
if (storage.money) money = storage.money;
if (storage.totalEarnings) totalEarnings = storage.totalEarnings;
if (storage.trainingCount) trainingCount = storage.trainingCount;
if (storage.breedingCount) breedingCount = storage.breedingCount;
if (storage.achievements) {
// Reconstruct achievements from flattened storage
var flatAchievements = storage.achievements;
for (var key in achievementSystem.achievements) {
if (flatAchievements[key + '_unlocked'] !== undefined) {
achievementSystem.achievements[key].unlocked = flatAchievements[key + '_unlocked'];
}
if (flatAchievements[key + '_name'] !== undefined) {
achievementSystem.achievements[key].name = flatAchievements[key + '_name'];
}
if (flatAchievements[key + '_description'] !== undefined) {
achievementSystem.achievements[key].description = flatAchievements[key + '_description'];
}
}
}
if (storage.horseData) {
horses = [];
for (var i = 0; i < storage.horseData.length; i++) {
var horseArray = storage.horseData[i];
horses.push(new Horse({
name: horseArray[0],
speed: horseArray[1],
stamina: horseArray[2],
temperament: horseArray[3],
age: horseArray[4],
raceWins: horseArray[5],
value: horseArray[6],
currentEnergy: horseArray[7],
maxEnergy: horseArray[8]
}));
}
}
}
function getWeatherBonus() {
return weatherSystem.getSpeedModifier() * seasonalBonus;
}
function generateRandomHorseName() {
var names = ['Thunder', 'Lightning', 'Storm', 'Blaze', 'Spirit', 'Shadow', 'Comet', 'Star', 'Flash', 'Dash', 'Wind', 'Fire', 'Rain', 'Snow', 'Frost', 'Dawn', 'Dusk', 'Moon', 'Sun', 'Sky'];
return names[Math.floor(Math.random() * names.length)] + ' ' + Math.floor(Math.random() * 1000);
}
// Load saved progress
loadGameProgress();
// Initialize view
updateView();
// Play background music
LK.playMusic('stableMusic');
// Main game loop
game.update = function () {
gameTime++;
// Update weather every 30 seconds (1800 ticks)
if (gameTime % 1800 === 0) {
weatherSystem.updateWeather();
currentWeather = weatherSystem.currentWeather;
}
// Update seasonal bonus
seasonalBonus = Math.sin(gameTime / 10800) * 0.2 + 1.0;
if (raceInProgress && raceView.parent) {
raceView.checkRaceFinish();
}
// Auto-rest horses when not racing
if (!raceInProgress) {
for (var i = 0; i < horses.length; i++) {
if (horses[i].currentEnergy < horses[i].maxEnergy) {
horses[i].currentEnergy = Math.min(horses[i].maxEnergy, horses[i].currentEnergy + 0.1);
}
}
}
// Update achievements
achievementSystem.checkAchievements();
// Save progress every 10 seconds
if (gameTime % 600 === 0) {
storage.totalEarnings = totalEarnings;
storage.trainingCount = trainingCount;
storage.breedingCount = breedingCount;
// Flatten achievements for storage
var flatAchievements = {};
for (var key in achievementSystem.achievements) {
flatAchievements[key + '_unlocked'] = achievementSystem.achievements[key].unlocked;
flatAchievements[key + '_name'] = achievementSystem.achievements[key].name;
flatAchievements[key + '_description'] = achievementSystem.achievements[key].description;
}
storage.achievements = flatAchievements;
}
// Enhanced win condition - 25 race wins
if (LK.getScore() >= 25) {
LK.showYouWin();
}
// Enhanced lose condition - out of money and no horses
if (money <= 0 && horses.length === 0) {
LK.showGameOver();
}
// Random events
if (gameTime % 3600 === 0 && Math.random() < 0.1) {
// Random bonus money
var bonus = Math.floor(Math.random() * 5000) + 1000;
money += bonus;
totalEarnings += bonus;
updateMoneyDisplay();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1085,23 +1085,25 @@
entryFee: 20000
}];
self.currentTournament = null;
self.tournamentProgress = 0;
+ self.titleText = null;
+ self.backText = null;
self.setupUI = function () {
var background = self.attachAsset('menuBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
- var titleText = new Text2(translations[currentLanguage].tournaments || 'Tournaments', {
+ self.titleText = new Text2(translations[currentLanguage].tournaments || 'Tournaments', {
size: 80,
fill: '#ffffff'
});
- titleText.anchor.set(0.5, 0.5);
- titleText.x = 1024;
- titleText.y = 300;
- self.addChild(titleText);
+ self.titleText.anchor.set(0.5, 0.5);
+ self.titleText.x = 1024;
+ self.titleText.y = 300;
+ self.addChild(self.titleText);
var yPos = 600;
for (var i = 0; i < self.tournaments.length; i++) {
var tournament = self.tournaments[i];
var tournamentBtn = self.attachAsset('tournamentButton', {
@@ -1125,23 +1127,23 @@
anchorY: 0.5,
x: 1024,
y: 2200
});
- var backText = new Text2(translations[currentLanguage].back || 'Back', {
+ self.backText = new Text2(translations[currentLanguage].back || 'Back', {
size: 40,
fill: '#ffffff'
});
- backText.anchor.set(0.5, 0.5);
- backText.x = 1024;
- backText.y = 2200;
- self.addChild(backText);
+ self.backText.anchor.set(0.5, 0.5);
+ self.backText.x = 1024;
+ self.backText.y = 2200;
+ self.addChild(self.backText);
};
self.updateLanguage = function () {
- if (titleText) {
- titleText.setText(translations[currentLanguage].tournaments || 'Tournaments');
+ if (self.titleText) {
+ self.titleText.setText(translations[currentLanguage].tournaments || 'Tournaments');
}
- if (backText) {
- backText.setText(translations[currentLanguage].back || 'Back');
+ if (self.backText) {
+ self.backText.setText(translations[currentLanguage].back || 'Back');
}
};
self.enterTournament = function (tournamentIndex) {
var tournament = self.tournaments[tournamentIndex];
@@ -1217,23 +1219,25 @@
price: 3000,
effect: 'recovery'
}
};
+ self.titleText = null;
+ self.backText = null;
self.setupUI = function () {
var background = self.attachAsset('menuBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
});
- var titleText = new Text2(translations[currentLanguage].veterinarian || 'Veterinarian', {
+ self.titleText = new Text2(translations[currentLanguage].veterinarian || 'Veterinarian', {
size: 80,
fill: '#ffffff'
});
- titleText.anchor.set(0.5, 0.5);
- titleText.x = 1024;
- titleText.y = 300;
- self.addChild(titleText);
+ self.titleText.anchor.set(0.5, 0.5);
+ self.titleText.x = 1024;
+ self.titleText.y = 300;
+ self.addChild(self.titleText);
var yPos = 600;
for (var treatmentId in self.treatments) {
var treatment = self.treatments[treatmentId];
var treatmentBtn = self.attachAsset('vetButton', {
@@ -1257,23 +1261,23 @@
anchorY: 0.5,
x: 1024,
y: 2200
});
- var backText = new Text2(translations[currentLanguage].back || 'Back', {
+ self.backText = new Text2(translations[currentLanguage].back || 'Back', {
size: 40,
fill: '#ffffff'
});
- backText.anchor.set(0.5, 0.5);
- backText.x = 1024;
- backText.y = 2200;
- self.addChild(backText);
+ self.backText.anchor.set(0.5, 0.5);
+ self.backText.x = 1024;
+ self.backText.y = 2200;
+ self.addChild(self.backText);
};
self.updateLanguage = function () {
- if (titleText) {
- titleText.setText(translations[currentLanguage].veterinarian || 'Veterinarian');
+ if (self.titleText) {
+ self.titleText.setText(translations[currentLanguage].veterinarian || 'Veterinarian');
}
- if (backText) {
- backText.setText(translations[currentLanguage].back || 'Back');
+ if (self.backText) {
+ self.backText.setText(translations[currentLanguage].back || 'Back');
}
};
self.performTreatment = function (treatmentId) {
var treatment = self.treatments[treatmentId];