| | |
| |
|
| | const EventEmitter = require('events'); |
| | const nekomaths = require('nekomaths'); |
| |
|
| | |
| | const DEFAULT_GAME_SETTINGS = { |
| | initialArmHealth: 100, |
| | crocoDamage: 25, |
| | initialCrocodiles: 1, |
| | crocoPerLevel: 1, |
| | crocoSpeedMultiplier: 1.1, |
| | levelUpThreshold: 5 |
| | }; |
| |
|
| | class CrocobrasGame extends EventEmitter { |
| | constructor(settings = {}) { |
| | super(); |
| | this.settings = { ...DEFAULT_GAME_SETTINGS, ...settings }; |
| |
|
| | this.armHealth = this.settings.initialArmHealth; |
| | this.currentLevel = 1; |
| | this.crocodilesRemaining = 0; |
| | this.crocodilesSpawnedThisLevel = 0; |
| | this.killedCrocodilesThisLevel = 0; |
| | this.isGameOver = false; |
| | this.isGameRunning = false; |
| |
|
| | |
| | |
| | |
| | this.activeCrocodiles = []; |
| |
|
| | this.initializeLevel(); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | initializeLevel(level = this.currentLevel) { |
| | this.currentLevel = level; |
| | this.killedCrocodilesThisLevel = 0; |
| | this.crocodilesSpawnedThisLevel = 0; |
| | |
| | |
| | |
| | |
| | this.crocodilesToSpawnTotal = this.settings.initialCrocodiles + (this.currentLevel - 1) * this.settings.crocoPerLevel; |
| | this.crocodilesRemaining = this.crocodilesToSpawnTotal; |
| |
|
| | this.emit('levelInitialized', { |
| | level: this.currentLevel, |
| | crocodilesToKill: this.crocodilesToSpawnTotal, |
| | armHealth: this.armHealth |
| | }); |
| | console.log(`[Crocobras] Niveau ${this.currentLevel} initialisé. Crocodiles à tuer : ${this.crocodilesToSpawnTotal}`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | startGame() { |
| | if (this.isGameRunning) { |
| | this.emit('gameAlreadyRunning'); |
| | return false; |
| | } |
| | this.isGameRunning = true; |
| | this.isGameOver = false; |
| | this.armHealth = this.settings.initialArmHealth; |
| | this.currentLevel = 1; |
| | this.initializeLevel(1); |
| | this.emit('gameStarted', { level: this.currentLevel, armHealth: this.armHealth }); |
| | console.log("[Crocobras] Partie démarrée !"); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | crocover() { |
| | if (this.isGameOver) return false; |
| | this.isGameOver = true; |
| | this.isGameRunning = false; |
| | this.emit('gameOver', { finalLevel: this.currentLevel, reason: 'Arm eaten' }); |
| | console.log("[Crocobras] GAME OVER ! Le bras a été mangé."); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | crocoreset() { |
| | this.armHealth = this.settings.initialArmHealth; |
| | this.currentLevel = 1; |
| | this.correctGuesses = 0; |
| | this.isGameOver = false; |
| | this.isGameRunning = false; |
| | this.killedCrocodilesThisLevel = 0; |
| | this.crocodilesSpawnedThisLevel = 0; |
| | this.activeCrocodiles = []; |
| | this.initializeLevel(1); |
| | this.emit('gameReset', { level: this.currentLevel, armHealth: this.armHealth }); |
| | console.log("[Crocobras] Jeu réinitialisé au niveau 1."); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocobouffe() { |
| | if (!this.isGameRunning || this.isGameOver) { |
| | console.log("[Crocobras] Ignoré: le jeu n'est pas en cours ou est terminé."); |
| | return; |
| | } |
| |
|
| | this.armHealth = nekomaths.neksub(this.armHealth, this.settings.crocoDamage); |
| | this.emit('armEaten', { |
| | currentHealth: this.armHealth, |
| | damageTaken: this.settings.crocoDamage |
| | }); |
| | console.log(`[Crocobras] Un crocodile a mangé le bras ! Vie restante : ${this.armHealth}`); |
| |
|
| | if (this.armHealth <= 0) { |
| | this.crocover(); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | crocotire() { |
| | if (!this.isGameRunning || this.isGameOver) { |
| | this.emit('gameNotRunning'); |
| | return; |
| | } |
| | this.emit('shotFired'); |
| | console.log("[Crocobras] Coup de feu tiré !"); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocokill() { |
| | if (!this.isGameRunning || this.isGameOver) { |
| | this.emit('gameNotRunning'); |
| | return false; |
| | } |
| | if (this.killedCrocodilesThisLevel < this.crocodilesToSpawnTotal) { |
| | this.killedCrocodilesThisLevel = nekomaths.nekadd(this.killedCrocodilesThisLevel, 1); |
| | this.crocodilesRemaining = nekomaths.neksub(this.crocodilesToSpawnTotal, this.killedCrocodilesThisLevel); |
| |
|
| | this.emit('crocoKilled', { |
| | killedCount: this.killedCrocodilesThisLevel, |
| | remainingCount: this.crocodilesRemaining, |
| | level: this.currentLevel |
| | }); |
| | console.log(`[Crocobras] Crocodile tué ! Restant : ${this.crocodilesRemaining}/${this.crocodilesToSpawnTotal}`); |
| |
|
| | if (this.killedCrocodilesThisLevel >= this.crocodilesToSpawnTotal) { |
| | this.levelUp(); |
| | } |
| | return true; |
| | } else { |
| | this.emit('noMoreCrocosToKill'); |
| | console.log("[Crocobras] Tous les crocodiles du niveau actuel sont déjà tués."); |
| | return false; |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | croconumber(targetCrocosPerLevel = DEFAULT_GAME_SETTINGS.levelUpThreshold) { |
| | |
| | |
| | |
| | |
| | |
| |
|
| | this.settings.levelUpThreshold = targetCrocosPerLevel; |
| | this.emit('levelUpThresholdUpdated', targetCrocosPerLevel); |
| | console.log(`[Crocobras] Seuil de crocos à tuer pour passer le niveau mis à jour : ${targetCrocosPerLevel}`); |
| | } |
| |
|
| |
|
| | |
| | |
| | |
| | |
| | levelUp() { |
| | if (this.isGameOver) { |
| | this.emit('gameNotRunning'); |
| | return; |
| | } |
| | this.currentLevel = nekomaths.nekadd(this.currentLevel, 1); |
| | this.emit('levelUp', { newLevel: this.currentLevel }); |
| | console.log(`[Crocobras] BRAVO ! Vous passez au niveau ${this.currentLevel} !`); |
| | this.initializeLevel(this.currentLevel); |
| | } |
| |
|
| | |
| | getGameState() { |
| | return { |
| | armHealth: this.armHealth, |
| | currentLevel: this.currentLevel, |
| | crocodilesRemaining: this.crocodilesRemaining, |
| | crocodilesToSpawnTotal: this.crocodilesToSpawnTotal, |
| | killedCrocodilesThisLevel: this.killedCrocodilesThisLevel, |
| | isGameOver: this.isGameOver, |
| | isGameRunning: this.isGameRunning |
| | }; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocofuls(customGunLogic) { |
| | if (typeof customGunLogic === 'function') { |
| | this.emit('customGunLogicDefined', customGunLogic); |
| | console.log("[Crocobras] Logique de tir personnalisée définie. Le développeur doit l'appeler !"); |
| | } else { |
| | throw new Error("crocofuls: L'argument doit être une fonction."); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocoanm(soundType) { |
| | this.emit('playAnimationSound', soundType); |
| | console.log(`[Crocobras] Événement de son émis : ${soundType}.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocustom(customization) { |
| | if (typeof customization === 'function') { |
| | customization(this); |
| | this.emit('gameCustomized', 'function'); |
| | } else if (typeof customization === 'object' && customization !== null) { |
| | Object.assign(this, customization); |
| | this.emit('gameCustomized', 'object'); |
| | } else { |
| | throw new Error("crocustom: L'argument doit être une fonction ou un objet."); |
| | } |
| | console.log("[Crocobras] Personnalisation avancée appliquée via crocustom."); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocopow(powerUpType, powerUpLogic, options = {}) { |
| | if (typeof powerUpLogic !== 'function') { |
| | throw new Error("crocopow: powerUpLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.customPowerUps) { |
| | this.customPowerUps = {}; |
| | } |
| | |
| | this.customPowerUps[powerUpType] = { |
| | logic: powerUpLogic, |
| | options: { duration: 5000, value: 1, ...options } |
| | }; |
| | |
| | this.emit('customPowerUpRegistered', { type: powerUpType, options }); |
| | console.log(`[Crocobras] Power-up personnalisé '${powerUpType}' enregistré.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | activatePowerUp(powerUpType) { |
| | if (!this.customPowerUps || !this.customPowerUps[powerUpType]) { |
| | console.warn(`[Crocobras] Power-up '${powerUpType}' non trouvé.`); |
| | return false; |
| | } |
| | |
| | const powerUp = this.customPowerUps[powerUpType]; |
| | powerUp.logic.call(this, powerUp.options); |
| | this.emit('powerUpActivated', { type: powerUpType, options: powerUp.options }); |
| | console.log(`[Crocobras] Power-up '${powerUpType}' activé !`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | crocoboost(boostType, value, duration, onExpire = null) { |
| | if (!this.activeBoosts) { |
| | this.activeBoosts = {}; |
| | } |
| | |
| | |
| | this.activeBoosts[boostType] = { |
| | value: value, |
| | startTime: Date.now(), |
| | duration: duration, |
| | onExpire: onExpire |
| | }; |
| | |
| | this.emit('boostActivated', { type: boostType, value, duration }); |
| | console.log(`[Crocobras] Boost '${boostType}' activé pour ${duration}ms avec valeur ${value}.`); |
| | |
| | |
| | setTimeout(() => { |
| | if (this.activeBoosts && this.activeBoosts[boostType]) { |
| | delete this.activeBoosts[boostType]; |
| | if (onExpire) onExpire(); |
| | this.emit('boostExpired', { type: boostType }); |
| | console.log(`[Crocobras] Boost '${boostType}' expiré.`); |
| | } |
| | }, duration); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | getActiveBoost(boostType) { |
| | return this.activeBoosts && this.activeBoosts[boostType] ? this.activeBoosts[boostType] : false; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocolife(crocoId, health, options = {}) { |
| | if (!this.crocodileHealths) { |
| | this.crocodileHealths = {}; |
| | } |
| | |
| | this.crocodileHealths[crocoId] = { |
| | currentHealth: health, |
| | maxHealth: options.maxHealth || health, |
| | regeneration: options.regeneration || 0, |
| | lastRegenTime: Date.now(), |
| | ...options |
| | }; |
| | |
| | this.emit('crocodileHealthSet', { crocoId, health, options }); |
| | console.log(`[Crocobras] Crocodile ${crocoId} a maintenant ${health} points de vie.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | damageCrocodile(crocoId, damage) { |
| | if (!this.crocodileHealths || !this.crocodileHealths[crocoId]) { |
| | |
| | return this.crocokill(); |
| | } |
| | |
| | const croco = this.crocodileHealths[crocoId]; |
| | croco.currentHealth = nekomaths.neksub(croco.currentHealth, damage); |
| | |
| | this.emit('crocodileDamaged', { crocoId, damage, remainingHealth: croco.currentHealth }); |
| | console.log(`[Crocobras] Crocodile ${crocoId} reçoit ${damage} dégâts. Vie restante: ${croco.currentHealth}`); |
| | |
| | if (croco.currentHealth <= 0) { |
| | delete this.crocodileHealths[crocoId]; |
| | this.emit('crocodileKilledByDamage', { crocoId }); |
| | return this.crocokill(); |
| | } |
| | |
| | return false; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocoarmure(crocoId, strength, strengthLogic = null) { |
| | if (!this.crocodileStrengths) { |
| | this.crocodileStrengths = {}; |
| | } |
| | |
| | this.crocodileStrengths[crocoId] = { |
| | baseStrength: strength, |
| | currentStrength: strength, |
| | strengthLogic: strengthLogic, |
| | lastUpdate: Date.now() |
| | }; |
| | |
| | this.emit('crocodileStrengthSet', { crocoId, strength }); |
| | console.log(`[Crocobras] Crocodile ${crocoId} a maintenant une force de ${strength}.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | updateCrocodileStrength(crocoId, context = {}) { |
| | if (!this.crocodileStrengths || !this.crocodileStrengths[crocoId]) return; |
| | |
| | const croco = this.crocodileStrengths[crocoId]; |
| | if (croco.strengthLogic) { |
| | const newStrength = croco.strengthLogic.call(this, croco.currentStrength, context); |
| | croco.currentStrength = newStrength; |
| | croco.lastUpdate = Date.now(); |
| | |
| | this.emit('crocodileStrengthUpdated', { crocoId, newStrength, context }); |
| | console.log(`[Crocobras] Force du crocodile ${crocoId} mise à jour: ${newStrength}`); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocorap(crocoId, speed, speedModifier = null) { |
| | if (!this.crocodileSpeeds) { |
| | this.crocodileSpeeds = {}; |
| | } |
| | |
| | this.crocodileSpeeds[crocoId] = { |
| | baseSpeed: speed, |
| | currentSpeed: speed, |
| | speedModifier: speedModifier, |
| | lastUpdate: Date.now() |
| | }; |
| | |
| | this.emit('crocodileSpeedSet', { crocoId, speed }); |
| | console.log(`[Crocobras] Crocodile ${crocoId} a maintenant une vitesse de ${speed}.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | updateCrocodileSpeed(crocoId, factors = {}) { |
| | if (!this.crocodileSpeeds || !this.crocodileSpeeds[crocoId]) return; |
| | |
| | const croco = this.crocodileSpeeds[crocoId]; |
| | if (croco.speedModifier) { |
| | const newSpeed = croco.speedModifier.call(this, croco.baseSpeed, factors); |
| | croco.currentSpeed = newSpeed; |
| | croco.lastUpdate = Date.now(); |
| | |
| | this.emit('crocodileSpeedUpdated', { crocoId, newSpeed, factors }); |
| | console.log(`[Crocobras] Vitesse du crocodile ${crocoId} mise à jour: ${newSpeed}`); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | crocopop(crocoId, danceType, danceLogic, options = {}) { |
| | if (typeof danceLogic !== 'function') { |
| | throw new Error("crocopop: danceLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.crocodileDances) { |
| | this.crocodileDances = {}; |
| | } |
| | |
| | if (!this.crocodileDances[crocoId]) { |
| | this.crocodileDances[crocoId] = {}; |
| | } |
| | |
| | this.crocodileDances[crocoId][danceType] = { |
| | logic: danceLogic, |
| | options: { duration: 1000, dodgeChance: 0.3, ...options }, |
| | isActive: false |
| | }; |
| | |
| | this.emit('crocodileDanceRegistered', { crocoId, danceType, options }); |
| | console.log(`[Crocobras] Danse '${danceType}' enregistrée pour le crocodile ${crocoId}.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | triggerCrocodileDance(crocoId, danceType) { |
| | if (!this.crocodileDances || !this.crocodileDances[crocoId] || !this.crocodileDances[crocoId][danceType]) { |
| | return false; |
| | } |
| | |
| | const dance = this.crocodileDances[crocoId][danceType]; |
| | if (dance.isActive) return false; |
| | |
| | dance.isActive = true; |
| | const result = dance.logic.call(this, crocoId, dance.options); |
| | |
| | this.emit('crocodileDanceTriggered', { crocoId, danceType, result }); |
| | console.log(`[Crocobras] Crocodile ${crocoId} exécute la danse '${danceType}'.`); |
| | |
| | |
| | setTimeout(() => { |
| | if (this.crocodileDances && this.crocodileDances[crocoId] && this.crocodileDances[crocoId][danceType]) { |
| | this.crocodileDances[crocoId][danceType].isActive = false; |
| | this.emit('crocodileDanceEnded', { crocoId, danceType }); |
| | } |
| | }, dance.options.duration); |
| | |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | crocoexplose(crocoId, explosionDamage, explosionRadius, explosionLogic = null) { |
| | const explosion = { |
| | damage: explosionDamage, |
| | radius: explosionRadius, |
| | logic: explosionLogic, |
| | source: crocoId |
| | }; |
| | |
| | |
| | if (explosionLogic && typeof explosionLogic === 'function') { |
| | explosionLogic.call(this, explosion); |
| | } else { |
| | |
| | this.handleDefaultExplosion(explosion); |
| | } |
| | |
| | this.emit('crocodileExploded', { |
| | crocoId, |
| | damage: explosionDamage, |
| | radius: explosionRadius |
| | }); |
| | console.log(`[Crocobras] Crocodile ${crocoId} explose ! Dégâts: ${explosionDamage}, Rayon: ${explosionRadius}`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | handleDefaultExplosion(explosion) { |
| | |
| | |
| | const armDamage = Math.floor(explosion.damage * 0.5); |
| | this.armHealth = nekomaths.neksub(this.armHealth, armDamage); |
| | |
| | this.emit('explosionDamageToArm', { |
| | damage: armDamage, |
| | source: explosion.source, |
| | currentArmHealth: this.armHealth |
| | }); |
| | |
| | console.log(`[Crocobras] L'explosion inflige ${armDamage} dégâts au bras. Vie restante: ${this.armHealth}`); |
| | |
| | if (this.armHealth <= 0) { |
| | this.crocover(); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | crocokillAdvanced(crocoId = null) { |
| | const killed = this.crocokill(); |
| | |
| | if (killed && crocoId) { |
| | |
| | if (this.crocodileHealths && this.crocodileHealths[crocoId]) { |
| | delete this.crocodileHealths[crocoId]; |
| | } |
| | if (this.crocodileStrengths && this.crocodileStrengths[crocoId]) { |
| | delete this.crocodileStrengths[crocoId]; |
| | } |
| | if (this.crocodileSpeeds && this.crocodileSpeeds[crocoId]) { |
| | delete this.crocodileSpeeds[crocoId]; |
| | } |
| | if (this.crocodileDances && this.crocodileDances[crocoId]) { |
| | delete this.crocodileDances[crocoId]; |
| | } |
| | |
| | this.emit('crocodileDataCleared', { crocoId }); |
| | } |
| | |
| | return killed; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocom(comboType, comboLogic, options = {}) { |
| | if (typeof comboLogic !== 'function') { |
| | throw new Error("crocom: comboLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.combos) { |
| | this.combos = {}; |
| | this.comboCounters = {}; |
| | } |
| | |
| | this.combos[comboType] = { |
| | logic: comboLogic, |
| | options: { |
| | threshold: 3, |
| | multiplier: 1.5, |
| | resetTime: 5000, |
| | maxLevel: 10, |
| | ...options |
| | }, |
| | isActive: false, |
| | level: 0 |
| | }; |
| | |
| | this.comboCounters[comboType] = 0; |
| | |
| | this.emit('comboRegistered', { type: comboType, options }); |
| | console.log(`[Crocobras] Combo '${comboType}' enregistré.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | triggerCombo(comboType, context = {}) { |
| | if (!this.combos || !this.combos[comboType]) return false; |
| | |
| | const combo = this.combos[comboType]; |
| | this.comboCounters[comboType]++; |
| | |
| | const result = combo.logic.call(this, this.comboCounters[comboType], combo.options, context); |
| | |
| | if (result && this.comboCounters[comboType] >= combo.options.threshold) { |
| | combo.isActive = true; |
| | combo.level = Math.min(combo.level + 1, combo.options.maxLevel); |
| | |
| | this.emit('comboTriggered', { |
| | type: comboType, |
| | level: combo.level, |
| | counter: this.comboCounters[comboType], |
| | result: result |
| | }); |
| | |
| | console.log(`[Crocobras] Combo '${comboType}' niveau ${combo.level} déclenché !`); |
| | |
| | |
| | setTimeout(() => { |
| | this.resetCombo(comboType); |
| | }, combo.options.resetTime); |
| | } |
| | |
| | return result; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | resetCombo(comboType) { |
| | if (this.combos && this.combos[comboType]) { |
| | this.combos[comboType].isActive = false; |
| | this.combos[comboType].level = 0; |
| | this.comboCounters[comboType] = 0; |
| | |
| | this.emit('comboReset', { type: comboType }); |
| | console.log(`[Crocobras] Combo '${comboType}' remis à zéro.`); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocomode(modeName, modeLogic, settings = {}) { |
| | if (typeof modeLogic !== 'function') { |
| | throw new Error("crocomode: modeLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.gameModes) { |
| | this.gameModes = {}; |
| | } |
| | |
| | this.gameModes[modeName] = { |
| | logic: modeLogic, |
| | settings: { |
| | timeLimit: null, |
| | objectives: [], |
| | rewards: {}, |
| | difficulty: 'normal', |
| | ...settings |
| | }, |
| | isActive: false, |
| | progress: {} |
| | }; |
| | |
| | this.emit('gameModeRegistered', { name: modeName, settings }); |
| | console.log(`[Crocobras] Mode de jeu '${modeName}' enregistré.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | activateGameMode(modeName, parameters = {}) { |
| | if (!this.gameModes || !this.gameModes[modeName]) { |
| | console.warn(`[Crocobras] Mode '${modeName}' non trouvé.`); |
| | return false; |
| | } |
| | |
| | const mode = this.gameModes[modeName]; |
| | mode.isActive = true; |
| | mode.progress = { startTime: Date.now(), ...parameters }; |
| | |
| | mode.logic.call(this, mode.settings, mode.progress); |
| | |
| | this.emit('gameModeActivated', { name: modeName, settings: mode.settings, progress: mode.progress }); |
| | console.log(`[Crocobras] Mode '${modeName}' activé !`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocorpes(armorType, properties, armorLogic = null) { |
| | if (!this.armors) { |
| | this.armors = {}; |
| | this.equippedArmor = null; |
| | } |
| | |
| | this.armors[armorType] = { |
| | properties: { |
| | defense: 0, |
| | resistance: {}, |
| | effects: [], |
| | durability: 100, |
| | ...properties |
| | }, |
| | logic: armorLogic, |
| | isEquipped: false |
| | }; |
| | |
| | this.emit('armorCreated', { type: armorType, properties }); |
| | console.log(`[Crocobras] Armure '${armorType}' créée.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | equipArmor(armorType) { |
| | if (!this.armors || !this.armors[armorType]) return false; |
| | |
| | |
| | if (this.equippedArmor) { |
| | this.armors[this.equippedArmor].isEquipped = false; |
| | } |
| | |
| | |
| | this.armors[armorType].isEquipped = true; |
| | this.equippedArmor = armorType; |
| | |
| | |
| | if (this.armors[armorType].logic) { |
| | this.armors[armorType].logic.call(this, this.armors[armorType].properties); |
| | } |
| | |
| | this.emit('armorEquipped', { type: armorType, properties: this.armors[armorType].properties }); |
| | console.log(`[Crocobras] Armure '${armorType}' équipée.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocodial(dialogueId, dialogueData, dialogueLogic = null) { |
| | if (!this.dialogues) { |
| | this.dialogues = {}; |
| | this.currentDialogue = null; |
| | } |
| | |
| | this.dialogues[dialogueId] = { |
| | data: { |
| | texts: [], |
| | choices: [], |
| | conditions: {}, |
| | speaker: 'narrator', |
| | ...dialogueData |
| | }, |
| | logic: dialogueLogic, |
| | isActive: false, |
| | currentStep: 0 |
| | }; |
| | |
| | this.emit('dialogueCreated', { id: dialogueId, data: dialogueData }); |
| | console.log(`[Crocobras] Dialogue '${dialogueId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | startDialogue(dialogueId, context = {}) { |
| | if (!this.dialogues || !this.dialogues[dialogueId]) return false; |
| | |
| | const dialogue = this.dialogues[dialogueId]; |
| | dialogue.isActive = true; |
| | dialogue.currentStep = 0; |
| | this.currentDialogue = dialogueId; |
| | |
| | if (dialogue.logic) { |
| | dialogue.logic.call(this, dialogue.data, context); |
| | } |
| | |
| | this.emit('dialogueStarted', { |
| | id: dialogueId, |
| | data: dialogue.data, |
| | context: context |
| | }); |
| | |
| | console.log(`[Crocobras] Dialogue '${dialogueId}' démarré.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocomise(missionId, missionData, missionLogic) { |
| | if (typeof missionLogic !== 'function') { |
| | throw new Error("crocomise: missionLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.missions) { |
| | this.missions = {}; |
| | this.activeMissions = []; |
| | this.completedMissions = []; |
| | } |
| | |
| | this.missions[missionId] = { |
| | data: { |
| | title: 'Mission sans titre', |
| | description: '', |
| | objectives: [], |
| | rewards: {}, |
| | difficulty: 'normal', |
| | timeLimit: null, |
| | ...missionData |
| | }, |
| | logic: missionLogic, |
| | status: 'available', |
| | progress: {}, |
| | startTime: null |
| | }; |
| | |
| | this.emit('missionCreated', { id: missionId, data: missionData }); |
| | console.log(`[Crocobras] Mission '${missionId}' créée.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | startMission(missionId) { |
| | if (!this.missions || !this.missions[missionId]) return false; |
| | |
| | const mission = this.missions[missionId]; |
| | if (mission.status !== 'available') return false; |
| | |
| | mission.status = 'active'; |
| | mission.startTime = Date.now(); |
| | mission.progress = {}; |
| | this.activeMissions.push(missionId); |
| | |
| | mission.logic.call(this, mission.data, mission.progress); |
| | |
| | this.emit('missionStarted', { |
| | id: missionId, |
| | data: mission.data, |
| | progress: mission.progress |
| | }); |
| | |
| | console.log(`[Crocobras] Mission '${missionId}' démarrée.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | completeMission(missionId, results = {}) { |
| | if (!this.missions || !this.missions[missionId]) return false; |
| | |
| | const mission = this.missions[missionId]; |
| | if (mission.status !== 'active') return false; |
| | |
| | mission.status = 'completed'; |
| | this.activeMissions = this.activeMissions.filter(id => id !== missionId); |
| | this.completedMissions.push(missionId); |
| | |
| | this.emit('missionCompleted', { |
| | id: missionId, |
| | data: mission.data, |
| | results: results, |
| | rewards: mission.data.rewards |
| | }); |
| | |
| | console.log(`[Crocobras] Mission '${missionId}' terminée !`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocomons(currencyName, shopData, purchaseLogic) { |
| | if (typeof purchaseLogic !== 'function') { |
| | throw new Error("crocomons: purchaseLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.economy) { |
| | this.economy = { |
| | currencies: {}, |
| | shop: {}, |
| | inventory: {}, |
| | transactions: [] |
| | }; |
| | } |
| | |
| | this.economy.currencies[currencyName] = { |
| | amount: shopData.startingAmount || 0, |
| | properties: shopData.currencyProperties || {} |
| | }; |
| | |
| | this.economy.shop[currencyName] = { |
| | items: shopData.items || [], |
| | logic: purchaseLogic, |
| | settings: shopData.settings || {} |
| | }; |
| | |
| | this.emit('economySystemCreated', { currency: currencyName, shopData }); |
| | console.log(`[Crocobras] Système économique '${currencyName}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | purchase(currencyName, itemId, quantity = 1) { |
| | if (!this.economy || !this.economy.shop[currencyName]) return false; |
| | |
| | const shop = this.economy.shop[currencyName]; |
| | const currency = this.economy.currencies[currencyName]; |
| | |
| | const result = shop.logic.call(this, { |
| | itemId: itemId, |
| | quantity: quantity, |
| | currency: currency, |
| | inventory: this.economy.inventory, |
| | shop: shop |
| | }); |
| | |
| | if (result.success) { |
| | this.economy.transactions.push({ |
| | timestamp: Date.now(), |
| | type: 'purchase', |
| | currencyName: currencyName, |
| | itemId: itemId, |
| | quantity: quantity, |
| | cost: result.cost |
| | }); |
| | |
| | this.emit('purchaseCompleted', { |
| | currencyName, |
| | itemId, |
| | quantity, |
| | result |
| | }); |
| | |
| | console.log(`[Crocobras] Achat réussi: ${quantity}x ${itemId}`); |
| | } |
| | |
| | return result; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocodym(environmentId, environmentData, environmentLogic) { |
| | if (typeof environmentLogic !== 'function') { |
| | throw new Error("crocodym: environmentLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.environments) { |
| | this.environments = {}; |
| | this.currentEnvironment = null; |
| | } |
| | |
| | this.environments[environmentId] = { |
| | data: { |
| | obstacles: [], |
| | effects: [], |
| | climate: 'normal', |
| | visibility: 1.0, |
| | ...environmentData |
| | }, |
| | logic: environmentLogic, |
| | isActive: false, |
| | lastUpdate: Date.now() |
| | }; |
| | |
| | this.emit('environmentCreated', { id: environmentId, data: environmentData }); |
| | console.log(`[Crocobras] Environnement '${environmentId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | activateEnvironment(environmentId, parameters = {}) { |
| | if (!this.environments || !this.environments[environmentId]) return false; |
| | |
| | |
| | if (this.currentEnvironment) { |
| | this.environments[this.currentEnvironment].isActive = false; |
| | } |
| | |
| | const environment = this.environments[environmentId]; |
| | environment.isActive = true; |
| | environment.lastUpdate = Date.now(); |
| | this.currentEnvironment = environmentId; |
| | |
| | environment.logic.call(this, environment.data, parameters); |
| | |
| | this.emit('environmentActivated', { |
| | id: environmentId, |
| | data: environment.data, |
| | parameters |
| | }); |
| | |
| | console.log(`[Crocobras] Environnement '${environmentId}' activé.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocopay(assetType, assetData, customizationLogic) { |
| | if (typeof customizationLogic !== 'function') { |
| | throw new Error("crocopay: customizationLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.assetCustomization) { |
| | this.assetCustomization = {}; |
| | this.equippedAssets = {}; |
| | } |
| | |
| | if (!this.assetCustomization[assetType]) { |
| | this.assetCustomization[assetType] = {}; |
| | } |
| | |
| | const assetId = assetData.id || `${assetType}_${Date.now()}`; |
| | |
| | this.assetCustomization[assetType][assetId] = { |
| | data: { |
| | name: assetData.name || 'Asset sans nom', |
| | rarity: assetData.rarity || 'common', |
| | unlocked: assetData.unlocked || false, |
| | price: assetData.price || 0, |
| | ...assetData |
| | }, |
| | logic: customizationLogic, |
| | isEquipped: false |
| | }; |
| | |
| | this.emit('assetCreated', { type: assetType, id: assetId, data: assetData }); |
| | console.log(`[Crocobras] Asset '${assetId}' de type '${assetType}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | equipAsset(assetType, assetId) { |
| | if (!this.assetCustomization || !this.assetCustomization[assetType] || !this.assetCustomization[assetType][assetId]) { |
| | return false; |
| | } |
| | |
| | const asset = this.assetCustomization[assetType][assetId]; |
| | if (!asset.data.unlocked) return false; |
| | |
| | |
| | if (this.equippedAssets[assetType]) { |
| | const currentAsset = this.assetCustomization[assetType][this.equippedAssets[assetType]]; |
| | if (currentAsset) currentAsset.isEquipped = false; |
| | } |
| | |
| | |
| | asset.isEquipped = true; |
| | this.equippedAssets[assetType] = assetId; |
| | |
| | asset.logic.call(this, asset.data); |
| | |
| | this.emit('assetEquipped', { type: assetType, id: assetId, data: asset.data }); |
| | console.log(`[Crocobras] Asset '${assetId}' équipé pour '${assetType}'.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | crocia(crocoId, aiType, aiLogic, aiSettings = {}) { |
| | if (typeof aiLogic !== 'function') { |
| | throw new Error("crocia: aiLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.crocodileAI) { |
| | this.crocodileAI = {}; |
| | } |
| | |
| | this.crocodileAI[crocoId] = { |
| | type: aiType, |
| | logic: aiLogic, |
| | settings: { |
| | aggressiveness: 0.5, |
| | intelligence: 0.5, |
| | adaptability: 0.3, |
| | memory: [], |
| | ...aiSettings |
| | }, |
| | state: 'idle', |
| | lastDecision: Date.now(), |
| | decisions: [] |
| | }; |
| | |
| | this.emit('crocodileAISet', { crocoId, aiType, settings: aiSettings }); |
| | console.log(`[Crocobras] IA '${aiType}' configurée pour le crocodile ${crocoId}.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | updateCrocodileAI(crocoId, context = {}) { |
| | if (!this.crocodileAI || !this.crocodileAI[crocoId]) return; |
| | |
| | const ai = this.crocodileAI[crocoId]; |
| | const gameState = this.getGameState(); |
| | |
| | const decision = ai.logic.call(this, { |
| | crocoId: crocoId, |
| | gameState: gameState, |
| | aiState: ai.state, |
| | settings: ai.settings, |
| | memory: ai.settings.memory, |
| | context: context |
| | }); |
| | |
| | if (decision) { |
| | ai.state = decision.newState || ai.state; |
| | ai.lastDecision = Date.now(); |
| | ai.decisions.push({ |
| | timestamp: Date.now(), |
| | decision: decision, |
| | context: context |
| | }); |
| | |
| | |
| | if (ai.decisions.length > 10) { |
| | ai.decisions.shift(); |
| | } |
| | |
| | this.emit('crocodileAIDecision', { |
| | crocoId, |
| | decision, |
| | aiType: ai.type, |
| | context |
| | }); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocohab(collectibleType, collectibleData, collectibleLogic) { |
| | if (typeof collectibleLogic !== 'function') { |
| | throw new Error("crocohab: collectibleLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.collectibles) { |
| | this.collectibles = {}; |
| | this.unlockedCollectibles = []; |
| | } |
| | |
| | if (!this.collectibles[collectibleType]) { |
| | this.collectibles[collectibleType] = {}; |
| | } |
| | |
| | const collectibleId = collectibleData.id || `${collectibleType}_${Date.now()}`; |
| | |
| | this.collectibles[collectibleType][collectibleId] = { |
| | data: { |
| | name: collectibleData.name || 'Collectible sans nom', |
| | description: collectibleData.description || '', |
| | rarity: collectibleData.rarity || 'common', |
| | rewards: collectibleData.rewards || {}, |
| | requirements: collectibleData.requirements || {}, |
| | ...collectibleData |
| | }, |
| | logic: collectibleLogic, |
| | isUnlocked: false, |
| | unlockedAt: null, |
| | progress: {} |
| | }; |
| | |
| | this.emit('collectibleCreated', { type: collectibleType, id: collectibleId, data: collectibleData }); |
| | console.log(`[Crocobras] Collectible '${collectibleId}' de type '${collectibleType}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | checkCollectibles(collectibleType, context = {}) { |
| | if (!this.collectibles || !this.collectibles[collectibleType]) return; |
| | |
| | Object.entries(this.collectibles[collectibleType]).forEach(([id, collectible]) => { |
| | if (!collectible.isUnlocked) { |
| | const result = collectible.logic.call(this, { |
| | collectibleData: collectible.data, |
| | gameState: this.getGameState(), |
| | context: context, |
| | progress: collectible.progress |
| | }); |
| | |
| | if (result && result.unlocked) { |
| | collectible.isUnlocked = true; |
| | collectible.unlockedAt = Date.now(); |
| | collectible.progress = result.progress || {}; |
| | this.unlockedCollectibles.push(`${collectibleType}:${id}`); |
| | |
| | this.emit('collectibleUnlocked', { |
| | type: collectibleType, |
| | id: id, |
| | data: collectible.data, |
| | rewards: collectible.data.rewards |
| | }); |
| | |
| | console.log(`[Crocobras] Collectible '${id}' débloqué !`); |
| | } |
| | } |
| | }); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocotive(messageType, messageData, messageLogic) { |
| | if (typeof messageLogic !== 'function') { |
| | throw new Error("crocotive: messageLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.creativeMessages) { |
| | this.creativeMessages = {}; |
| | } |
| | |
| | this.creativeMessages[messageType] = { |
| | data: { |
| | messages: messageData.messages || [], |
| | frequency: messageData.frequency || 'random', |
| | conditions: messageData.conditions || {}, |
| | speakers: messageData.speakers || [messageType], |
| | ...messageData |
| | }, |
| | logic: messageLogic, |
| | lastMessage: null, |
| | messageHistory: [] |
| | }; |
| | |
| | this.emit('creativeMessagesRegistered', { type: messageType, data: messageData }); |
| | console.log(`[Crocobras] Messages créatifs '${messageType}' enregistrés.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | triggerCreativeMessage(messageType, context = {}) { |
| | if (!this.creativeMessages || !this.creativeMessages[messageType]) return null; |
| | |
| | const messageSystem = this.creativeMessages[messageType]; |
| | const gameState = this.getGameState(); |
| | |
| | const result = messageSystem.logic.call(this, { |
| | messageData: messageSystem.data, |
| | gameState: gameState, |
| | context: context, |
| | history: messageSystem.messageHistory |
| | }); |
| | |
| | if (result && result.message) { |
| | messageSystem.lastMessage = { |
| | timestamp: Date.now(), |
| | message: result.message, |
| | speaker: result.speaker || messageType, |
| | context: context |
| | }; |
| | |
| | messageSystem.messageHistory.push(messageSystem.lastMessage); |
| | |
| | |
| | if (messageSystem.messageHistory.length > 20) { |
| | messageSystem.messageHistory.shift(); |
| | } |
| | |
| | this.emit('creativeMessageTriggered', { |
| | type: messageType, |
| | message: result.message, |
| | speaker: result.speaker, |
| | context: context |
| | }); |
| | |
| | console.log(`[Crocobras] Message créatif (${result.speaker}): ${result.message}`); |
| | return result; |
| | } |
| | |
| | return null; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | croconage(characterId, characterData, characterLogic) { |
| | if (typeof characterLogic !== 'function') { |
| | throw new Error("croconage: characterLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.customCharacters) { |
| | this.customCharacters = {}; |
| | this.activeCharacters = []; |
| | } |
| | |
| | this.customCharacters[characterId] = { |
| | data: { |
| | name: characterData.name || 'Personnage sans nom', |
| | type: characterData.type || 'neutral', |
| | health: characterData.health || 100, |
| | abilities: characterData.abilities || [], |
| | appearance: characterData.appearance || {}, |
| | personality: characterData.personality || {}, |
| | ...characterData |
| | }, |
| | logic: characterLogic, |
| | isActive: false, |
| | state: 'idle', |
| | interactions: [], |
| | lastUpdate: Date.now() |
| | }; |
| | |
| | this.emit('customCharacterCreated', { id: characterId, data: characterData }); |
| | console.log(`[Crocobras] Personnage personnalisé '${characterId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | spawnCharacter(characterId, spawnData = {}) { |
| | if (!this.customCharacters || !this.customCharacters[characterId]) return false; |
| | |
| | const character = this.customCharacters[characterId]; |
| | if (character.isActive) return false; |
| | |
| | character.isActive = true; |
| | character.state = spawnData.initialState || 'idle'; |
| | character.lastUpdate = Date.now(); |
| | |
| | if (!this.activeCharacters.includes(characterId)) { |
| | this.activeCharacters.push(characterId); |
| | } |
| | |
| | character.logic.call(this, { |
| | characterData: character.data, |
| | gameState: this.getGameState(), |
| | spawnData: spawnData, |
| | action: 'spawn' |
| | }); |
| | |
| | this.emit('characterSpawned', { |
| | id: characterId, |
| | data: character.data, |
| | spawnData: spawnData |
| | }); |
| | |
| | console.log(`[Crocobras] Personnage '${characterId}' apparu dans le jeu.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | updateCharacter(characterId, updateData = {}) { |
| | if (!this.customCharacters || !this.customCharacters[characterId] || !this.customCharacters[characterId].isActive) { |
| | return; |
| | } |
| | |
| | const character = this.customCharacters[characterId]; |
| | character.lastUpdate = Date.now(); |
| | |
| | const result = character.logic.call(this, { |
| | characterData: character.data, |
| | gameState: this.getGameState(), |
| | updateData: updateData, |
| | currentState: character.state, |
| | action: 'update' |
| | }); |
| | |
| | if (result) { |
| | character.state = result.newState || character.state; |
| | |
| | if (result.interaction) { |
| | character.interactions.push({ |
| | timestamp: Date.now(), |
| | interaction: result.interaction, |
| | context: updateData |
| | }); |
| | } |
| | |
| | this.emit('characterUpdated', { |
| | id: characterId, |
| | state: character.state, |
| | result: result |
| | }); |
| | } |
| | } |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocojom(questId, questData, questLogic) { |
| | if (typeof questLogic !== 'function') { |
| | throw new Error("crocojom: questLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.dynamicQuests) { |
| | this.dynamicQuests = {}; |
| | this.activeQuests = []; |
| | } |
| | |
| | this.dynamicQuests[questId] = { |
| | data: { |
| | title: questData.title || 'Quête dynamique', |
| | description: questData.description || '', |
| | branches: questData.branches || {}, |
| | currentBranch: questData.startBranch || 'start', |
| | playerChoices: [], |
| | rewards: questData.rewards || {}, |
| | conditions: questData.conditions || {}, |
| | ...questData |
| | }, |
| | logic: questLogic, |
| | isActive: false, |
| | progress: {} |
| | }; |
| | |
| | this.emit('dynamicQuestCreated', { questId, data: questData }); |
| | console.log(`[Crocobras] Quête dynamique '${questId}' créée.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | startDynamicQuest(questId, initialChoices = {}) { |
| | if (!this.dynamicQuests || !this.dynamicQuests[questId]) return false; |
| | |
| | const quest = this.dynamicQuests[questId]; |
| | quest.isActive = true; |
| | quest.data.playerChoices = [initialChoices]; |
| | quest.progress = { startTime: Date.now() }; |
| | |
| | this.activeQuests.push(questId); |
| | |
| | quest.logic.call(this, quest.data, quest.progress, 'start'); |
| | |
| | this.emit('dynamicQuestStarted', { questId, choices: initialChoices }); |
| | console.log(`[Crocobras] Quête dynamique '${questId}' démarrée.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | makeDynamicQuestChoice(questId, choice) { |
| | if (!this.dynamicQuests || !this.dynamicQuests[questId] || !this.dynamicQuests[questId].isActive) { |
| | return false; |
| | } |
| | |
| | const quest = this.dynamicQuests[questId]; |
| | quest.data.playerChoices.push(choice); |
| | |
| | const result = quest.logic.call(this, quest.data, quest.progress, 'choice', choice); |
| | |
| | if (result && result.newBranch) { |
| | quest.data.currentBranch = result.newBranch; |
| | } |
| | |
| | this.emit('dynamicQuestChoice', { questId, choice, result }); |
| | console.log(`[Crocobras] Choix effectué dans la quête '${questId}': ${JSON.stringify(choice)}`); |
| | return result; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocera(weatherId, weatherData, weatherLogic) { |
| | if (typeof weatherLogic !== 'function') { |
| | throw new Error("crocera: weatherLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.weatherSystems) { |
| | this.weatherSystems = {}; |
| | this.currentWeather = null; |
| | } |
| | |
| | this.weatherSystems[weatherId] = { |
| | data: { |
| | name: weatherData.name || 'Climat personnalisé', |
| | effects: weatherData.effects || {}, |
| | intensity: weatherData.intensity || 1.0, |
| | duration: weatherData.duration || 30000, |
| | crocodileEffects: weatherData.crocodileEffects || {}, |
| | armEffects: weatherData.armEffects || {}, |
| | visualEffects: weatherData.visualEffects || {}, |
| | ...weatherData |
| | }, |
| | logic: weatherLogic, |
| | isActive: false, |
| | startTime: null |
| | }; |
| | |
| | this.emit('weatherSystemCreated', { weatherId, data: weatherData }); |
| | console.log(`[Crocobras] Système climatique '${weatherId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | activateWeather(weatherId) { |
| | if (!this.weatherSystems || !this.weatherSystems[weatherId]) return false; |
| | |
| | |
| | if (this.currentWeather) { |
| | this.weatherSystems[this.currentWeather].isActive = false; |
| | } |
| | |
| | const weather = this.weatherSystems[weatherId]; |
| | weather.isActive = true; |
| | weather.startTime = Date.now(); |
| | this.currentWeather = weatherId; |
| | |
| | weather.logic.call(this, weather.data, this.getGameState()); |
| | |
| | this.emit('weatherActivated', { weatherId, data: weather.data }); |
| | console.log(`[Crocobras] Climat '${weatherId}' activé.`); |
| | |
| | |
| | if (weather.data.duration > 0) { |
| | setTimeout(() => { |
| | this.deactivateWeather(weatherId); |
| | }, weather.data.duration); |
| | } |
| | |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | deactivateWeather(weatherId) { |
| | if (!this.weatherSystems || !this.weatherSystems[weatherId]) return false; |
| | |
| | this.weatherSystems[weatherId].isActive = false; |
| | if (this.currentWeather === weatherId) { |
| | this.currentWeather = null; |
| | } |
| | |
| | this.emit('weatherDeactivated', { weatherId }); |
| | console.log(`[Crocobras] Climat '${weatherId}' désactivé.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocogiw(specialId, specialData, specialLogic) { |
| | if (typeof specialLogic !== 'function') { |
| | throw new Error("crocogiw: specialLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.specialElements) { |
| | this.specialElements = {}; |
| | } |
| | |
| | this.specialElements[specialId] = { |
| | data: { |
| | type: specialData.type || 'crocodile', |
| | triggerConditions: specialData.triggerConditions || {}, |
| | behavior: specialData.behavior || {}, |
| | rewards: specialData.rewards || {}, |
| | rarity: specialData.rarity || 'rare', |
| | cooldown: specialData.cooldown || 0, |
| | ...specialData |
| | }, |
| | logic: specialLogic, |
| | isActive: false, |
| | lastTriggered: null, |
| | triggerCount: 0 |
| | }; |
| | |
| | this.emit('specialElementCreated', { specialId, data: specialData }); |
| | console.log(`[Crocobras] Élément spécial '${specialId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | checkSpecialElements(gameContext = {}) { |
| | if (!this.specialElements) return; |
| | |
| | Object.entries(this.specialElements).forEach(([specialId, element]) => { |
| | if (element.isActive) return; |
| | |
| | const now = Date.now(); |
| | const cooldownPassed = !element.lastTriggered || |
| | (now - element.lastTriggered) >= element.data.cooldown; |
| | |
| | if (cooldownPassed) { |
| | const shouldTrigger = element.logic.call(this, element.data, { |
| | ...this.getGameState(), |
| | ...gameContext |
| | }); |
| | |
| | if (shouldTrigger) { |
| | this.triggerSpecialElement(specialId); |
| | } |
| | } |
| | }); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | triggerSpecialElement(specialId) { |
| | if (!this.specialElements || !this.specialElements[specialId]) return false; |
| | |
| | const element = this.specialElements[specialId]; |
| | element.isActive = true; |
| | element.lastTriggered = Date.now(); |
| | element.triggerCount++; |
| | |
| | this.emit('specialElementTriggered', { |
| | specialId, |
| | data: element.data, |
| | triggerCount: element.triggerCount |
| | }); |
| | |
| | console.log(`[Crocobras] Élément spécial '${specialId}' déclenché !`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocorin(crocoId, aiConfig, decisionLogic) { |
| | if (typeof decisionLogic !== 'function') { |
| | throw new Error("crocorin: decisionLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.advancedCrocodileAI) { |
| | this.advancedCrocodileAI = {}; |
| | } |
| | |
| | this.advancedCrocodileAI[crocoId] = { |
| | config: { |
| | learningRate: aiConfig.learningRate || 0.1, |
| | memorySize: aiConfig.memorySize || 50, |
| | decisionFrequency: aiConfig.decisionFrequency || 1000, |
| | personalityTraits: aiConfig.personalityTraits || {}, |
| | adaptiveRules: aiConfig.adaptiveRules || [], |
| | ...aiConfig |
| | }, |
| | decisionLogic: decisionLogic, |
| | memory: [], |
| | currentDecision: null, |
| | decisionHistory: [], |
| | learningData: {} |
| | }; |
| | |
| | this.emit('advancedAICreated', { crocoId, config: aiConfig }); |
| | console.log(`[Crocobras] IA avancée configurée pour le crocodile ${crocoId}.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | executeAdvancedAIDecision(crocoId, situation = {}) { |
| | if (!this.advancedCrocodileAI || !this.advancedCrocodileAI[crocoId]) return null; |
| | |
| | const ai = this.advancedCrocodileAI[crocoId]; |
| | const gameState = this.getGameState(); |
| | |
| | const decision = ai.decisionLogic.call(this, { |
| | crocoId: crocoId, |
| | config: ai.config, |
| | memory: ai.memory, |
| | gameState: gameState, |
| | situation: situation, |
| | learningData: ai.learningData |
| | }); |
| | |
| | if (decision) { |
| | ai.currentDecision = decision; |
| | ai.decisionHistory.push({ |
| | timestamp: Date.now(), |
| | decision: decision, |
| | situation: situation, |
| | gameState: { ...gameState } |
| | }); |
| | |
| | |
| | ai.memory.push({ |
| | timestamp: Date.now(), |
| | type: 'decision', |
| | data: decision, |
| | context: situation |
| | }); |
| | |
| | |
| | if (ai.memory.length > ai.config.memorySize) { |
| | ai.memory.shift(); |
| | } |
| | |
| | this.emit('advancedAIDecision', { crocoId, decision, situation }); |
| | console.log(`[Crocobras] Décision IA avancée pour crocodile ${crocoId}: ${JSON.stringify(decision)}`); |
| | } |
| | |
| | return decision; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocomp(analysisId, analysisConfig, analysisLogic) { |
| | if (typeof analysisLogic !== 'function') { |
| | throw new Error("crocomp: analysisLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.gameAnalytics) { |
| | this.gameAnalytics = {}; |
| | this.analyticsData = {}; |
| | } |
| | |
| | this.gameAnalytics[analysisId] = { |
| | config: { |
| | dataPoints: analysisConfig.dataPoints || [], |
| | updateInterval: analysisConfig.updateInterval || 5000, |
| | reportFormat: analysisConfig.reportFormat || 'simple', |
| | triggers: analysisConfig.triggers || [], |
| | ...analysisConfig |
| | }, |
| | logic: analysisLogic, |
| | lastUpdate: Date.now(), |
| | reports: [] |
| | }; |
| | |
| | this.analyticsData[analysisId] = {}; |
| | |
| | this.emit('gameAnalyticsCreated', { analysisId, config: analysisConfig }); |
| | console.log(`[Crocobras] Système d'analyse '${analysisId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | runGameAnalysis(analysisId, customData = {}) { |
| | if (!this.gameAnalytics || !this.gameAnalytics[analysisId]) return null; |
| | |
| | const analytics = this.gameAnalytics[analysisId]; |
| | const gameState = this.getGameState(); |
| | |
| | const report = analytics.logic.call(this, { |
| | config: analytics.config, |
| | gameState: gameState, |
| | analyticsData: this.analyticsData[analysisId], |
| | customData: customData, |
| | previousReports: analytics.reports |
| | }); |
| | |
| | if (report) { |
| | analytics.reports.push({ |
| | timestamp: Date.now(), |
| | report: report |
| | }); |
| | analytics.lastUpdate = Date.now(); |
| | |
| | this.emit('gameAnalysisCompleted', { analysisId, report }); |
| | console.log(`[Crocobras] Analyse '${analysisId}' terminée.`); |
| | } |
| | |
| | return report; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocotina(functionName, customFunction, options = {}) { |
| | if (typeof customFunction !== 'function') { |
| | throw new Error("crocotina: customFunction doit être une fonction."); |
| | } |
| | |
| | if (!this.customFunctions) { |
| | this.customFunctions = {}; |
| | } |
| | |
| | this.customFunctions[functionName] = { |
| | function: customFunction, |
| | options: { |
| | async: options.async || false, |
| | parameters: options.parameters || [], |
| | description: options.description || '', |
| | category: options.category || 'general', |
| | ...options |
| | }, |
| | callCount: 0, |
| | lastCalled: null |
| | }; |
| | |
| | this.emit('customFunctionRegistered', { functionName, options }); |
| | console.log(`[Crocobras] Fonction personnalisée '${functionName}' enregistrée.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | executeCustomFunction(functionName, ...args) { |
| | if (!this.customFunctions || !this.customFunctions[functionName]) { |
| | console.warn(`[Crocobras] Fonction personnalisée '${functionName}' non trouvée.`); |
| | return null; |
| | } |
| | |
| | const customFunc = this.customFunctions[functionName]; |
| | customFunc.callCount++; |
| | customFunc.lastCalled = Date.now(); |
| | |
| | try { |
| | const result = customFunc.function.call(this, ...args); |
| | |
| | this.emit('customFunctionExecuted', { |
| | functionName, |
| | args, |
| | result, |
| | callCount: customFunc.callCount |
| | }); |
| | |
| | console.log(`[Crocobras] Fonction personnalisée '${functionName}' exécutée.`); |
| | return result; |
| | } catch (error) { |
| | this.emit('customFunctionError', { functionName, error: error.message }); |
| | console.error(`[Crocobras] Erreur dans la fonction '${functionName}': ${error.message}`); |
| | return null; |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocofaf(quizId, quizData, quizLogic) { |
| | if (typeof quizLogic !== 'function') { |
| | throw new Error("crocofaf: quizLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.miniGames) { |
| | this.miniGames = {}; |
| | } |
| | |
| | this.miniGames[quizId] = { |
| | data: { |
| | title: quizData.title || 'Quiz Crocobras', |
| | questions: quizData.questions || [], |
| | rewards: quizData.rewards || {}, |
| | timeLimit: quizData.timeLimit || 30000, |
| | difficulty: quizData.difficulty || 'normal', |
| | categories: quizData.categories || ['general'], |
| | ...quizData |
| | }, |
| | logic: quizLogic, |
| | isActive: false, |
| | currentQuestion: 0, |
| | score: 0, |
| | startTime: null |
| | }; |
| | |
| | this.emit('miniGameCreated', { quizId, data: quizData }); |
| | console.log(`[Crocobras] Mini-jeu quiz '${quizId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | startMiniGame(quizId) { |
| | if (!this.miniGames || !this.miniGames[quizId]) return false; |
| | |
| | const quiz = this.miniGames[quizId]; |
| | quiz.isActive = true; |
| | quiz.currentQuestion = 0; |
| | quiz.score = 0; |
| | quiz.startTime = Date.now(); |
| | |
| | quiz.logic.call(this, quiz.data, 'start'); |
| | |
| | this.emit('miniGameStarted', { quizId, data: quiz.data }); |
| | console.log(`[Crocobras] Mini-jeu '${quizId}' démarré.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | answerQuizQuestion(quizId, answer) { |
| | if (!this.miniGames || !this.miniGames[quizId] || !this.miniGames[quizId].isActive) { |
| | return false; |
| | } |
| | |
| | const quiz = this.miniGames[quizId]; |
| | const result = quiz.logic.call(this, quiz.data, 'answer', { |
| | answer: answer, |
| | currentQuestion: quiz.currentQuestion, |
| | score: quiz.score |
| | }); |
| | |
| | if (result && result.correct) { |
| | quiz.score += result.points || 1; |
| | } |
| | |
| | quiz.currentQuestion++; |
| | |
| | this.emit('quizAnswered', { |
| | quizId, |
| | answer, |
| | result, |
| | score: quiz.score, |
| | question: quiz.currentQuestion |
| | }); |
| | |
| | return result; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocojup(messageId, messageData, messageLogic) { |
| | if (typeof messageLogic !== 'function') { |
| | throw new Error("crocojup: messageLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.temporaryMessages) { |
| | this.temporaryMessages = {}; |
| | this.activeMessages = []; |
| | } |
| | |
| | this.temporaryMessages[messageId] = { |
| | data: { |
| | text: messageData.text || '', |
| | duration: messageData.duration || 3000, |
| | style: messageData.style || {}, |
| | position: messageData.position || 'center', |
| | animation: messageData.animation || 'fade', |
| | triggers: messageData.triggers || [], |
| | ...messageData |
| | }, |
| | logic: messageLogic, |
| | isActive: false, |
| | displayCount: 0 |
| | }; |
| | |
| | this.emit('temporaryMessageCreated', { messageId, data: messageData }); |
| | console.log(`[Crocobras] Message temporaire '${messageId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | showTemporaryMessage(messageId, context = {}) { |
| | if (!this.temporaryMessages || !this.temporaryMessages[messageId]) return false; |
| | |
| | const message = this.temporaryMessages[messageId]; |
| | message.isActive = true; |
| | message.displayCount++; |
| | |
| | this.activeMessages.push(messageId); |
| | |
| | const result = message.logic.call(this, message.data, context); |
| | |
| | this.emit('temporaryMessageShown', { |
| | messageId, |
| | data: message.data, |
| | context, |
| | result, |
| | displayCount: message.displayCount |
| | }); |
| | |
| | console.log(`[Crocobras] Message temporaire '${messageId}' affiché.`); |
| | |
| | |
| | setTimeout(() => { |
| | this.hideTemporaryMessage(messageId); |
| | }, message.data.duration); |
| | |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | hideTemporaryMessage(messageId) { |
| | if (!this.temporaryMessages || !this.temporaryMessages[messageId]) return false; |
| | |
| | this.temporaryMessages[messageId].isActive = false; |
| | this.activeMessages = this.activeMessages.filter(id => id !== messageId); |
| | |
| | this.emit('temporaryMessageHidden', { messageId }); |
| | console.log(`[Crocobras] Message temporaire '${messageId}' masqué.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocodae(powerUpId, powerUpData, powerUpLogic) { |
| | if (typeof powerUpLogic !== 'function') { |
| | throw new Error("crocodae: powerUpLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.temporaryPowerUps) { |
| | this.temporaryPowerUps = {}; |
| | this.activePowerUps = []; |
| | } |
| | |
| | this.temporaryPowerUps[powerUpId] = { |
| | data: { |
| | name: powerUpData.name || 'Power-up temporaire', |
| | duration: powerUpData.duration || 10000, |
| | effects: powerUpData.effects || {}, |
| | stackable: powerUpData.stackable || false, |
| | cooldown: powerUpData.cooldown || 5000, |
| | rarity: powerUpData.rarity || 'common', |
| | ...powerUpData |
| | }, |
| | logic: powerUpLogic, |
| | isActive: false, |
| | activationTime: null, |
| | usageCount: 0 |
| | }; |
| | |
| | this.emit('temporaryPowerUpCreated', { powerUpId, data: powerUpData }); |
| | console.log(`[Crocobras] Power-up temporaire '${powerUpId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | activateTemporaryPowerUp(powerUpId, context = {}) { |
| | if (!this.temporaryPowerUps || !this.temporaryPowerUps[powerUpId]) return false; |
| | |
| | const powerUp = this.temporaryPowerUps[powerUpId]; |
| | |
| | |
| | if (powerUp.isActive && !powerUp.data.stackable) return false; |
| | |
| | powerUp.isActive = true; |
| | powerUp.activationTime = Date.now(); |
| | powerUp.usageCount++; |
| | |
| | if (!powerUp.data.stackable || !this.activePowerUps.includes(powerUpId)) { |
| | this.activePowerUps.push(powerUpId); |
| | } |
| | |
| | powerUp.logic.call(this, powerUp.data, context, 'activate'); |
| | |
| | this.emit('temporaryPowerUpActivated', { |
| | powerUpId, |
| | data: powerUp.data, |
| | context, |
| | usageCount: powerUp.usageCount |
| | }); |
| | |
| | console.log(`[Crocobras] Power-up temporaire '${powerUpId}' activé.`); |
| | |
| | |
| | setTimeout(() => { |
| | this.deactivateTemporaryPowerUp(powerUpId); |
| | }, powerUp.data.duration); |
| | |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | deactivateTemporaryPowerUp(powerUpId) { |
| | if (!this.temporaryPowerUps || !this.temporaryPowerUps[powerUpId]) return false; |
| | |
| | const powerUp = this.temporaryPowerUps[powerUpId]; |
| | powerUp.isActive = false; |
| | |
| | this.activePowerUps = this.activePowerUps.filter(id => id !== powerUpId); |
| | |
| | powerUp.logic.call(this, powerUp.data, {}, 'deactivate'); |
| | |
| | this.emit('temporaryPowerUpDeactivated', { powerUpId }); |
| | console.log(`[Crocobras] Power-up temporaire '${powerUpId}' désactivé.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocolog(logId, logConfig, logLogic) { |
| | if (typeof logLogic !== 'function') { |
| | throw new Error("crocolog: logLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.customLogs) { |
| | this.customLogs = {}; |
| | } |
| | |
| | this.customLogs[logId] = { |
| | config: { |
| | prefix: logConfig.prefix || '[LOG]', |
| | colors: logConfig.colors || {}, |
| | format: logConfig.format || 'simple', |
| | output: logConfig.output || 'console', |
| | shapes: logConfig.shapes || {}, |
| | filters: logConfig.filters || [], |
| | ...logConfig |
| | }, |
| | logic: logLogic, |
| | entries: [], |
| | lastLog: null |
| | }; |
| | |
| | this.emit('customLogCreated', { logId, config: logConfig }); |
| | console.log(`[Crocobras] Système de log personnalisé '${logId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | writeCustomLog(logId, message, data = {}) { |
| | if (!this.customLogs || !this.customLogs[logId]) return false; |
| | |
| | const logger = this.customLogs[logId]; |
| | const logEntry = { |
| | timestamp: Date.now(), |
| | message: message, |
| | data: data, |
| | level: data.level || 'info' |
| | }; |
| | |
| | logger.entries.push(logEntry); |
| | logger.lastLog = logEntry; |
| | |
| | const formattedLog = logger.logic.call(this, logger.config, logEntry); |
| | |
| | this.emit('customLogWritten', { logId, entry: logEntry, formatted: formattedLog }); |
| | |
| | |
| | if (logger.config.output === 'console') { |
| | console.log(formattedLog); |
| | } |
| | |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocojust(cloneId, cloneData, cloneLogic) { |
| | if (typeof cloneLogic !== 'function') { |
| | throw new Error("crocojust: cloneLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.crocodileCloning) { |
| | this.crocodileCloning = {}; |
| | } |
| | |
| | this.crocodileCloning[cloneId] = { |
| | data: { |
| | maxClones: cloneData.maxClones || 3, |
| | cloneCooldown: cloneData.cloneCooldown || 5000, |
| | cloneConditions: cloneData.cloneConditions || {}, |
| | cloneProperties: cloneData.cloneProperties || {}, |
| | invocationRules: cloneData.invocationRules || {}, |
| | ...cloneData |
| | }, |
| | logic: cloneLogic, |
| | activeClones: [], |
| | lastCloneTime: null |
| | }; |
| | |
| | this.emit('crocodileCloningCreated', { cloneId, data: cloneData }); |
| | console.log(`[Crocobras] Système de clonage '${cloneId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | cloneCrocodile(cloneId, sourceCrocoId, context = {}) { |
| | if (!this.crocodileCloning || !this.crocodileCloning[cloneId]) return false; |
| | |
| | const cloneSystem = this.crocodileCloning[cloneId]; |
| | const now = Date.now(); |
| | |
| | |
| | if (cloneSystem.activeClones.length >= cloneSystem.data.maxClones) return false; |
| | if (cloneSystem.lastCloneTime && (now - cloneSystem.lastCloneTime) < cloneSystem.data.cloneCooldown) { |
| | return false; |
| | } |
| | |
| | const cloneResult = cloneSystem.logic.call(this, cloneSystem.data, { |
| | sourceCrocoId: sourceCrocoId, |
| | gameState: this.getGameState(), |
| | context: context |
| | }); |
| | |
| | if (cloneResult && cloneResult.success) { |
| | const newCloneId = cloneResult.cloneId || Date.now(); |
| | cloneSystem.activeClones.push({ |
| | id: newCloneId, |
| | sourceId: sourceCrocoId, |
| | createdAt: now, |
| | properties: cloneResult.properties || {} |
| | }); |
| | |
| | cloneSystem.lastCloneTime = now; |
| | |
| | this.emit('crocodileCloned', { |
| | cloneId, |
| | sourceId: sourceCrocoId, |
| | newCloneId: newCloneId, |
| | result: cloneResult |
| | }); |
| | |
| | console.log(`[Crocobras] Crocodile ${sourceCrocoId} cloné avec l'ID ${newCloneId}.`); |
| | return newCloneId; |
| | } |
| | |
| | return false; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocorare(rareId, rareData, rareLogic) { |
| | if (typeof rareLogic !== 'function') { |
| | throw new Error("crocorare: rareLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.rareCrocodiles) { |
| | this.rareCrocodiles = {}; |
| | } |
| | |
| | this.rareCrocodiles[rareId] = { |
| | data: { |
| | name: rareData.name || 'Crocodile Rare', |
| | rarity: rareData.rarity || 'legendary', |
| | spawnChance: rareData.spawnChance || 0.01, |
| | specialAbilities: rareData.specialAbilities || [], |
| | rewards: rareData.rewards || {}, |
| | appearance: rareData.appearance || {}, |
| | behavior: rareData.behavior || {}, |
| | ...rareData |
| | }, |
| | logic: rareLogic, |
| | spawnCount: 0, |
| | lastSpawn: null, |
| | isActive: false |
| | }; |
| | |
| | this.emit('rareCrocodileCreated', { rareId, data: rareData }); |
| | console.log(`[Crocobras] Crocodile rare '${rareId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | checkRareCrocodileSpawn(spawnContext = {}) { |
| | if (!this.rareCrocodiles) return; |
| | |
| | Object.entries(this.rareCrocodiles).forEach(([rareId, rareCroco]) => { |
| | if (rareCroco.isActive) return; |
| | |
| | const shouldSpawn = Math.random() < rareCroco.data.spawnChance; |
| | |
| | if (shouldSpawn) { |
| | const spawnResult = rareCroco.logic.call(this, rareCroco.data, { |
| | ...this.getGameState(), |
| | ...spawnContext |
| | }); |
| | |
| | if (spawnResult && spawnResult.spawn) { |
| | rareCroco.isActive = true; |
| | rareCroco.spawnCount++; |
| | rareCroco.lastSpawn = Date.now(); |
| | |
| | this.emit('rareCrocodileSpawned', { |
| | rareId, |
| | data: rareCroco.data, |
| | spawnCount: rareCroco.spawnCount, |
| | result: spawnResult |
| | }); |
| | |
| | console.log(`[Crocobras] Crocodile rare '${rareId}' est apparu !`); |
| | } |
| | } |
| | }); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocomd(tutorialId, tutorialData, tutorialLogic) { |
| | if (typeof tutorialLogic !== 'function') { |
| | throw new Error("crocomd: tutorialLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.tutorials) { |
| | this.tutorials = {}; |
| | } |
| | |
| | this.tutorials[tutorialId] = { |
| | data: { |
| | title: tutorialData.title || 'Tutoriel', |
| | steps: tutorialData.steps || [], |
| | targetLevels: tutorialData.targetLevels || [1], |
| | dialogues: tutorialData.dialogues || [], |
| | rewards: tutorialData.rewards || {}, |
| | optional: tutorialData.optional || false, |
| | ...tutorialData |
| | }, |
| | logic: tutorialLogic, |
| | isActive: false, |
| | currentStep: 0, |
| | completed: false |
| | }; |
| | |
| | this.emit('tutorialCreated', { tutorialId, data: tutorialData }); |
| | console.log(`[Crocobras] Tutoriel '${tutorialId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | startTutorial(tutorialId) { |
| | if (!this.tutorials || !this.tutorials[tutorialId]) return false; |
| | |
| | const tutorial = this.tutorials[tutorialId]; |
| | tutorial.isActive = true; |
| | tutorial.currentStep = 0; |
| | |
| | tutorial.logic.call(this, tutorial.data, 'start'); |
| | |
| | this.emit('tutorialStarted', { tutorialId, data: tutorial.data }); |
| | console.log(`[Crocobras] Tutoriel '${tutorialId}' démarré.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | nextTutorialStep(tutorialId) { |
| | if (!this.tutorials || !this.tutorials[tutorialId] || !this.tutorials[tutorialId].isActive) { |
| | return false; |
| | } |
| | |
| | const tutorial = this.tutorials[tutorialId]; |
| | tutorial.currentStep++; |
| | |
| | if (tutorial.currentStep >= tutorial.data.steps.length) { |
| | tutorial.completed = true; |
| | tutorial.isActive = false; |
| | |
| | this.emit('tutorialCompleted', { tutorialId, rewards: tutorial.data.rewards }); |
| | console.log(`[Crocobras] Tutoriel '${tutorialId}' terminé !`); |
| | } else { |
| | tutorial.logic.call(this, tutorial.data, 'step', tutorial.currentStep); |
| | |
| | this.emit('tutorialStepChanged', { |
| | tutorialId, |
| | step: tutorial.currentStep, |
| | stepData: tutorial.data.steps[tutorial.currentStep] |
| | }); |
| | } |
| | |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocoglop(crocoId, customData, customLogic) { |
| | if (typeof customLogic !== 'function') { |
| | throw new Error("crocoglop: customLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.crocodileCustomization) { |
| | this.crocodileCustomization = {}; |
| | } |
| | |
| | this.crocodileCustomization[crocoId] = { |
| | data: { |
| | messages: customData.messages || [], |
| | messageInterval: customData.messageInterval || 2000, |
| | specialBehaviors: customData.specialBehaviors || {}, |
| | visualEffects: customData.visualEffects || {}, |
| | sounds: customData.sounds || {}, |
| | ...customData |
| | }, |
| | logic: customLogic, |
| | isActive: false, |
| | intervals: [], |
| | lastAction: Date.now() |
| | }; |
| | |
| | this.emit('crocodileCustomizationCreated', { crocoId, data: customData }); |
| | console.log(`[Crocobras] Personnalisation créée pour le crocodile ${crocoId}.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | activateCrocodileCustomization(crocoId) { |
| | if (!this.crocodileCustomization || !this.crocodileCustomization[crocoId]) return false; |
| | |
| | const customization = this.crocodileCustomization[crocoId]; |
| | customization.isActive = true; |
| | |
| | |
| | if (customization.data.messages.length > 0 && customization.data.messageInterval > 0) { |
| | const messageInterval = setInterval(() => { |
| | if (customization.isActive) { |
| | const randomMessage = customization.data.messages[ |
| | Math.floor(Math.random() * customization.data.messages.length) |
| | ]; |
| | |
| | this.emit('crocodileCustomMessage', { |
| | crocoId, |
| | message: randomMessage |
| | }); |
| | |
| | console.log(`[Crocobras] Crocodile ${crocoId}: ${randomMessage}`); |
| | } else { |
| | clearInterval(messageInterval); |
| | } |
| | }, customization.data.messageInterval); |
| | |
| | customization.intervals.push(messageInterval); |
| | } |
| | |
| | customization.logic.call(this, customization.data, 'activate'); |
| | |
| | this.emit('crocodileCustomizationActivated', { crocoId }); |
| | console.log(`[Crocobras] Personnalisation activée pour le crocodile ${crocoId}.`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocofarm(babyId, babyData, babyLogic) { |
| | if (typeof babyLogic !== 'function') { |
| | throw new Error("crocofarm: babyLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.babyCrocodiles) { |
| | this.babyCrocodiles = {}; |
| | } |
| | |
| | this.babyCrocodiles[babyId] = { |
| | data: { |
| | maxBabies: babyData.maxBabies || 5, |
| | spawnConditions: babyData.spawnConditions || {}, |
| | growthTime: babyData.growthTime || 15000, |
| | babyBehavior: babyData.babyBehavior || {}, |
| | parentInfluence: babyData.parentInfluence || {}, |
| | appearance: babyData.appearance || {}, |
| | ...babyData |
| | }, |
| | logic: babyLogic, |
| | activeBabies: [], |
| | totalSpawned: 0 |
| | }; |
| | |
| | this.emit('babyCrocodileSystemCreated', { babyId, data: babyData }); |
| | console.log(`[Crocobras] Système de bébés crocodiles '${babyId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | spawnBabyCrocodile(babyId, parentId = null, birthContext = {}) { |
| | if (!this.babyCrocodiles || !this.babyCrocodiles[babyId]) return false; |
| | |
| | const babySystem = this.babyCrocodiles[babyId]; |
| | |
| | if (babySystem.activeBabies.length >= babySystem.data.maxBabies) return false; |
| | |
| | const babyResult = babySystem.logic.call(this, babySystem.data, { |
| | action: 'spawn', |
| | parentId: parentId, |
| | gameState: this.getGameState(), |
| | context: birthContext |
| | }); |
| | |
| | if (babyResult && babyResult.success) { |
| | const newBabyId = babyResult.babyId || Date.now(); |
| | const baby = { |
| | id: newBabyId, |
| | parentId: parentId, |
| | birthTime: Date.now(), |
| | isGrown: false, |
| | properties: babyResult.properties || {} |
| | }; |
| | |
| | babySystem.activeBabies.push(baby); |
| | babySystem.totalSpawned++; |
| | |
| | this.emit('babyCrocodileSpawned', { |
| | babyId, |
| | baby: baby, |
| | parentId: parentId, |
| | result: babyResult |
| | }); |
| | |
| | console.log(`[Crocobras] Bébé crocodile ${newBabyId} né !`); |
| | |
| | |
| | setTimeout(() => { |
| | this.growBabyCrocodile(babyId, newBabyId); |
| | }, babySystem.data.growthTime); |
| | |
| | return newBabyId; |
| | } |
| | |
| | return false; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | growBabyCrocodile(babyId, babyInstanceId) { |
| | if (!this.babyCrocodiles || !this.babyCrocodiles[babyId]) return false; |
| | |
| | const babySystem = this.babyCrocodiles[babyId]; |
| | const baby = babySystem.activeBabies.find(b => b.id === babyInstanceId); |
| | |
| | if (!baby || baby.isGrown) return false; |
| | |
| | baby.isGrown = true; |
| | |
| | const growthResult = babySystem.logic.call(this, babySystem.data, { |
| | action: 'grow', |
| | baby: baby, |
| | gameState: this.getGameState() |
| | }); |
| | |
| | this.emit('babyCrocodileGrown', { |
| | babyId, |
| | baby: baby, |
| | result: growthResult |
| | }); |
| | |
| | console.log(`[Crocobras] Bébé crocodile ${babyInstanceId} a grandi !`); |
| | return true; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | crocenvie(desireId, desireData, desireLogic) { |
| | if (typeof desireLogic !== 'function') { |
| | throw new Error("crocenvie: desireLogic doit être une fonction."); |
| | } |
| | |
| | if (!this.crocodileDesires) { |
| | this.crocodileDesires = {}; |
| | } |
| | |
| | this.crocodileDesires[desireId] = { |
| | data: { |
| | desires: desireData.desires || ['eat', 'hunt', 'play', 'rest'], |
| | desireWeights: desireData.desireWeights || {}, |
| | satisfactionLevels: desireData.satisfactionLevels || {}, |
| | desireDecay: desireData.desireDecay || 0.1, |
| | influences: desireData.influences || {}, |
| | ...desireData |
| | }, |
| | logic: desireLogic, |
| | crocodileDesires: {}, |
| | lastUpdate: Date.now() |
| | }; |
| | |
| | this.emit('crocodileDesireSystemCreated', { desireId, data: desireData }); |
| | console.log(`[Crocobras] Système d'envies '${desireId}' créé.`); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | updateCrocodileDesires(desireId, crocoId, context = {}) { |
| | if (!this.crocodileDesires || !this.crocodileDesires[desireId]) return; |
| | |
| | const desireSystem = this.crocodileDesires[desireId]; |
| | |
| | if (!desireSystem.crocodileDesires[crocoId]) { |
| | desireSystem.crocodileDesires[crocoId] = {}; |
| | desireSystem.data.desires.forEach(desire => { |
| | desireSystem.crocodileDesires[crocoId][desire] = Math.random(); |
| | }); |
| | } |
| | |
| | const currentDesires = desireSystem.crocodileDesires[crocoId]; |
| | |
| | const result = desireSystem.logic.call(this, desireSystem.data, { |
| | crocoId: crocoId, |
| | currentDesires: currentDesires, |
| | gameState: this.getGameState(), |
| | context: context |
| | }); |
| | |
| | if (result) { |
| | |
| | Object.keys(currentDesires).forEach(desire => { |
| | if (result[desire] !== undefined) { |
| | currentDesires[desire] = Math.max(0, Math.min(1, result[desire])); |
| | } |
| | }); |
| | |
| | desireSystem.lastUpdate = Date.now(); |
| | |
| | this.emit('crocodileDesireUpdated', { |
| | desireId, |
| | crocoId, |
| | desires: currentDesires, |
| | result: result |
| | }); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | getCrocodileDesires(desireId, crocoId) { |
| | if (!this.crocodileDesires || !this.crocodileDesires[desireId]) return null; |
| | |
| | const desireSystem = this.crocodileDesires[desireId]; |
| | return desireSystem.crocodileDesires[crocoId] || null; |
| | } |
| | } |
| |
|
| | |
| | module.exports = CrocobrasGame; |
| |
|