Spaces:
Sleeping
Sleeping
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ ๐ HARVESTER LOGIC EXPLAINED - GUIDE COMPLET ๐ โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ๐ Date: 3 Octobre 2025 | |
| ๐ฎ Game: RTS Web - Red Alert Style | |
| ๐ Subject: Harvester, Refinery & Resource System | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ๐ฏ PROBLรME RAPPORTร | |
| "Harvester didn't go collect resource" | |
| Le Harvester ne collecte pas automatiquement les ressources. | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ๐ SYSTรME DE RESSOURCES - VUE D'ENSEMBLE | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ CYCLE COMPLET DU HARVESTER โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| 1. SPAWN (Crรฉation) | |
| โโ> Harvester produit depuis HQ (pas Refinery!) | |
| Coรปt: 200 crรฉdits | |
| 2. IDLE (Repos) | |
| โโ> Cherche automatiquement le minerai le plus proche | |
| Variables: gathering=False, ore_target=None | |
| 3. SEARCHING (Recherche) | |
| โโ> find_nearest_ore() trouve ORE ou GEM | |
| Variables: gathering=True, ore_target=Position(x, y) | |
| 4. MOVING TO ORE (Dรฉplacement vers minerai) | |
| โโ> Se dรฉplace vers ore_target | |
| Vitesse: 1.0 tiles/tick | |
| 5. HARVESTING (Rรฉcolte) | |
| โโ> ร proximitรฉ du minerai (< TILE_SIZE/2) | |
| ORE: +50 crรฉdits par tile | |
| GEM: +100 crรฉdits par tile | |
| Tile devient GRASS aprรจs rรฉcolte | |
| 6. CARGO CHECK (Vรฉrification cargaison) | |
| โโ> Si cargo >= 180 (90% de 200) | |
| โ Variables: returning=True | |
| 7. RETURNING (Retour base) | |
| โโ> find_nearest_depot() trouve Refinery ou HQ | |
| Se dรฉplace vers le dรฉpรดt | |
| 8. DEPOSITING (Dรฉpรดt) | |
| โโ> ร proximitรฉ du dรฉpรดt (< TILE_SIZE*2) | |
| player.credits += unit.cargo | |
| cargo = 0 | |
| Variables: returning=False, gathering=False | |
| 9. REPEAT (Recommence) | |
| โโ> Retour ร l'รฉtape 2 (IDLE) | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ๐ง CONSTANTES SYSTรME | |
| HARVESTER_CAPACITY = 200 # Capacitรฉ max cargo | |
| HARVEST_AMOUNT_PER_ORE = 50 # Crรฉdits par tile ORE | |
| HARVEST_AMOUNT_PER_GEM = 100 # Crรฉdits par tile GEM | |
| TILE_SIZE = 40 # Taille d'une tile en pixels | |
| MAP_WIDTH = 96 # Largeur carte en tiles | |
| MAP_HEIGHT = 72 # Hauteur carte en tiles | |
| Production: | |
| โโ Coรปt: 200 crรฉdits | |
| โโ Bรขtiment requis: HQ (pas Refinery!) | |
| โโ Santรฉ: 150 HP | |
| โโ Vitesse: 1.0 | |
| โโ Dรฉgรขts: 0 (sans arme) | |
| โโ Portรฉe: 0 | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ๐๏ธ BรTIMENTS IMPLIQUรS | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ 1. HQ (Headquarters / Quartier Gรฉnรฉral) โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ Rรดle: โ | |
| โ โข PRODUIT les Harvesters (pas le Refinery!) โ | |
| โ โข Sert de DรPรT pour dรฉposer les ressources โ | |
| โ โข Prรฉsent au dรฉmarrage du jeu โ | |
| โ โ | |
| โ Code: โ | |
| โ PRODUCTION_REQUIREMENTS = { โ | |
| โ UnitType.HARVESTER: BuildingType.HQ # โ Important! โ | |
| โ } โ | |
| โ โ | |
| โ Fonction dรฉpรดt: โ | |
| โ find_nearest_depot() retourne HQ OU Refinery โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ 2. REFINERY (Raffinerie) โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ Rรดle: โ | |
| โ โข NE PRODUIT PAS de Harvesters โ | |
| โ โข Sert de DรPรT pour dรฉposer les ressources โ | |
| โ โข Optionnel (HQ suffit) โ | |
| โ โข Coรปt construction: 600 crรฉdits โ | |
| โ โ | |
| โ Avantages: โ | |
| โ โข Peut รชtre construit prรจs des champs de minerai โ | |
| โ โข Rรฉduit le temps de trajet des Harvesters โ | |
| โ โข Optimise l'รฉconomie โ | |
| โ โ | |
| โ Fonction dรฉpรดt: โ | |
| โ find_nearest_depot() retourne HQ OU Refinery โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ๐ TYPES DE TERRAIN | |
| TerrainType.GRASS ๐ฉ Herbe (normal, traversable) | |
| TerrainType.ORE ๐จ Minerai (50 crรฉdits, devient GRASS aprรจs) | |
| TerrainType.GEM ๐ Gemme (100 crรฉdits, devient GRASS aprรจs) | |
| TerrainType.WATER ๐ฆ Eau (obstacle, non traversable) | |
| Gรฉnรฉration carte (init_map): | |
| โโ 15 patches d'ORE (5x5 tiles chacun, ~70% densitรฉ) | |
| โโ 5 patches de GEM (3x3 tiles chacun, ~50% densitรฉ) | |
| โโ 8 corps d'eau (7x7 tiles chacun) | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ๐ LOGIQUE HARVESTER - CODE DรTAILLร | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ update_harvester(unit: Unit) โ | |
| โ Appelรฉ chaque tick (50ms) pour chaque Harvester โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| def update_harvester(self, unit: Unit): | |
| """RED ALERT: Harvester AI - auto-collect resources!""" | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| # รTAT 1: RETURNING (Retour au dรฉpรดt avec cargaison) | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| if unit.returning: | |
| # Trouver le dรฉpรดt le plus proche (Refinery ou HQ) | |
| depot = self.find_nearest_depot(unit.player_id, unit.position) | |
| if depot: | |
| distance = unit.position.distance_to(depot.position) | |
| # Arrivรฉ au dรฉpรดt? | |
| if distance < TILE_SIZE * 2: # < 80 pixels | |
| # โ DรPOSER LA CARGAISON | |
| self.game_state.players[unit.player_id].credits += unit.cargo | |
| unit.cargo = 0 | |
| unit.returning = False | |
| unit.gathering = False | |
| unit.ore_target = None | |
| # โ Retour ร l'รฉtat IDLE (cherchera du minerai) | |
| else: | |
| # ๐ถ SE DรPLACER VERS LE DรPรT | |
| unit.target = Position(depot.position.x, depot.position.y) | |
| else: | |
| # โ PAS DE DรPรT (HQ dรฉtruit?) | |
| unit.returning = False | |
| return # โ Sortie de la fonction | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| # รTAT 2: AT ORE PATCH (Au minerai, en train de rรฉcolter) | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| if unit.ore_target: | |
| distance = ((unit.position.x - unit.ore_target.x) ** 2 + | |
| (unit.position.y - unit.ore_target.y) ** 2) ** 0.5 | |
| # Arrivรฉ au minerai? | |
| if distance < TILE_SIZE / 2: # < 20 pixels | |
| # Convertir position en coordonnรฉes de tile | |
| tile_x = int(unit.ore_target.x / TILE_SIZE) | |
| tile_y = int(unit.ore_target.y / TILE_SIZE) | |
| # Vรฉrifier limites carte | |
| if (0 <= tile_x < MAP_WIDTH and 0 <= tile_y < MAP_HEIGHT): | |
| terrain = self.game_state.terrain[tile_y][tile_x] | |
| # โ๏ธ RรCOLTER LE MINERAI | |
| if terrain == TerrainType.ORE: | |
| unit.cargo = min(HARVESTER_CAPACITY, | |
| unit.cargo + HARVEST_AMOUNT_PER_ORE) | |
| # Tile devient herbe | |
| self.game_state.terrain[tile_y][tile_x] = TerrainType.GRASS | |
| elif terrain == TerrainType.GEM: | |
| unit.cargo = min(HARVESTER_CAPACITY, | |
| unit.cargo + HARVEST_AMOUNT_PER_GEM) | |
| # Tile devient herbe | |
| self.game_state.terrain[tile_y][tile_x] = TerrainType.GRASS | |
| # Rรฉinitialiser รฉtat | |
| unit.ore_target = None | |
| unit.gathering = False | |
| # ๐ฆ CARGAISON PLEINE? | |
| if unit.cargo >= HARVESTER_CAPACITY * 0.9: # โฅ 180 | |
| unit.returning = True # โ Retour au dรฉpรดt | |
| unit.target = None | |
| else: | |
| # ๐ถ SE DรPLACER VERS LE MINERAI | |
| unit.target = unit.ore_target | |
| return # โ Sortie de la fonction | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| # รTAT 3: IDLE (Chercher du minerai) | |
| # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| if not unit.gathering and not unit.target: | |
| # ๐ CHERCHER LE MINERAI LE PLUS PROCHE | |
| nearest_ore = self.find_nearest_ore(unit.position) | |
| if nearest_ore: | |
| unit.ore_target = nearest_ore | |
| unit.gathering = True | |
| unit.target = nearest_ore | |
| # โ Passera ร l'รฉtat AT ORE PATCH au prochain tick | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ๐ FONCTIONS AUXILIAIRES | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ find_nearest_depot(player_id, position) โ Building | None โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ Trouve le dรฉpรดt le plus proche (Refinery OU HQ) du joueur โ | |
| โ โ | |
| โ Logique: โ | |
| โ 1. Parcourt tous les bรขtiments โ | |
| โ 2. Filtre par player_id โ | |
| โ 3. Filtre par type: REFINERY ou HQ โ | |
| โ 4. Calcule distance euclidienne โ | |
| โ 5. Retourne le plus proche โ | |
| โ โ | |
| โ Retour: โ | |
| โ โข Building si trouvรฉ โ | |
| โ โข None si aucun dรฉpรดt (HQ dรฉtruit et pas de Refinery) โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ find_nearest_ore(position) โ Position | None โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ Trouve le minerai (ORE ou GEM) le plus proche โ | |
| โ โ | |
| โ Logique: โ | |
| โ 1. Parcourt toutes les tiles de la carte (96ร72 = 6,912 tiles) โ | |
| โ 2. Filtre par terrain: ORE ou GEM โ | |
| โ 3. Calcule position centre tile: (x*40+20, y*40+20) โ | |
| โ 4. Calcule distance euclidienne โ | |
| โ 5. Retourne position du plus proche โ | |
| โ โ | |
| โ Retour: โ | |
| โ โข Position(x, y) si minerai trouvรฉ โ | |
| โ โข None si tout le minerai รฉpuisรฉ โ | |
| โ โ | |
| โ Performance: โ | |
| โ โข O(nยฒ) oรน n = taille carte โ | |
| โ โข Appelรฉ une fois quand Harvester devient idle โ | |
| โ โข Pas de cache (minerai change dynamiquement) โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ๐ PROBLรMES POSSIBLES & SOLUTIONS | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ PROBLรME 1: Harvester ne bouge pas du tout โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ Causes possibles: โ | |
| โ โ Harvester pas produit depuis HQ โ | |
| โ โ update_harvester() pas appelรฉ dans game loop โ | |
| โ โ Tout le minerai dรฉjร รฉpuisรฉ โ | |
| โ โ Variables Unit pas initialisรฉes (gathering, returning, etc.) โ | |
| โ โ | |
| โ Solutions: โ | |
| โ โ Vรฉrifier: UnitType.HARVESTER: BuildingType.HQ โ | |
| โ โ Vรฉrifier: if unit.type == UnitType.HARVESTER: โ | |
| โ โ Vรฉrifier terrain: print(self.game_state.terrain) โ | |
| โ โ Vรฉrifier init Unit: cargo=0, gathering=False, returning=False โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ PROBLรME 2: Harvester va au minerai mais ne rรฉcolte pas โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ Causes possibles: โ | |
| โ โ Distance check trop strict (< TILE_SIZE/2) โ | |
| โ โ Coordonnรฉes tile mal calculรฉes (int conversion) โ | |
| โ โ Terrain dรฉjร GRASS (autre Harvester a pris) โ | |
| โ โ Limites carte mal vรฉrifiรฉes โ | |
| โ โ | |
| โ Solutions: โ | |
| โ โ Augmenter distance: if distance < TILE_SIZE โ | |
| โ โ Debug: print(f"At ore: {tile_x},{tile_y} = {terrain}") โ | |
| โ โ Vรฉrifier race condition entre Harvesters โ | |
| โ โ Vรฉrifier: 0 <= tile_x < MAP_WIDTH โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ PROBLรME 3: Harvester ne retourne pas au dรฉpรดt โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ Causes possibles: โ | |
| โ โ Pas de Refinery ni HQ (dรฉtruit?) โ | |
| โ โ Cargo pas incrรฉmentรฉ (reste ร 0) โ | |
| โ โ Check cargo >= 180 jamais atteint โ | |
| โ โ Variable returning pas setรฉe โ | |
| โ โ | |
| โ Solutions: โ | |
| โ โ Vรฉrifier HQ existe: buildings[id].type == BuildingType.HQ โ | |
| โ โ Debug: print(f"Cargo: {unit.cargo}/200") โ | |
| โ โ Test manuel: unit.returning = True โ | |
| โ โ Construire Refinery prรจs du minerai โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ PROBLรME 4: Harvester au dรฉpรดt mais ne dรฉpose pas โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ Causes possibles: โ | |
| โ โ Distance check trop strict (< TILE_SIZE*2) โ | |
| โ โ Position dรฉpรดt mal calculรฉe โ | |
| โ โ Credits pas incrรฉmentรฉs cรดtรฉ player โ | |
| โ โ Variables pas rรฉinitialisรฉes aprรจs dรฉpรดt โ | |
| โ โ | |
| โ Solutions: โ | |
| โ โ Augmenter distance: if distance < TILE_SIZE*3 โ | |
| โ โ Debug: print(f"At depot: distance={distance}") โ | |
| โ โ Vรฉrifier: player.credits += unit.cargo โ | |
| โ โ Vรฉrifier: cargo=0, returning=False aprรจs dรฉpรดt โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ PROBLรME 5: Frontend ne montre pas le Harvester โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ Causes possibles: โ | |
| โ โ WebSocket state pas broadcast โ | |
| โ โ game.js ne render pas type "harvester" โ | |
| โ โ Harvester hors viewport (carte 96ร72) โ | |
| โ โ Cache cรดtรฉ client โ | |
| โ โ | |
| โ Solutions: โ | |
| โ โ Vรฉrifier broadcast: state_dict['units'] โ | |
| โ โ Vรฉrifier game.js: case 'harvester': ... โ | |
| โ โ Tester via curl /health (units count) โ | |
| โ โ F5 refresh browser โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ๐งช TESTS & DEBUGGING | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ TEST 1: Vรฉrifier crรฉation Harvester โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ curl http://localhost:7860/health โ | |
| โ โ | |
| โ Rรฉsultat attendu: โ | |
| โ { โ | |
| โ "status": "healthy", โ | |
| โ "units": 8, โ Devrait augmenter aprรจs production Harvester โ | |
| โ ... โ | |
| โ } โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ TEST 2: Vรฉrifier minerai sur la carte โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ Ajouter dans app.py: โ | |
| โ โ | |
| โ ore_count = sum(1 for row in self.terrain โ | |
| โ for tile in row โ | |
| โ if tile in [TerrainType.ORE, TerrainType.GEM]) โ | |
| โ print(f"Ore tiles remaining: {ore_count}") โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ TEST 3: Debug รฉtat Harvester โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ Ajouter dans update_harvester(): โ | |
| โ โ | |
| โ print(f"Harvester {unit.id[:8]}:") โ | |
| โ print(f" Position: ({unit.position.x:.0f}, {unit.position.y:.0f}")โ | |
| โ print(f" Cargo: {unit.cargo}/200") โ | |
| โ print(f" Gathering: {unit.gathering}") โ | |
| โ print(f" Returning: {unit.returning}") โ | |
| โ print(f" Ore target: {unit.ore_target}") โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ TEST 4: Vรฉrifier dรฉpรดts disponibles โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค | |
| โ Ajouter dans find_nearest_depot(): โ | |
| โ โ | |
| โ depots = [b for b in self.game_state.buildings.values() โ | |
| โ if b.player_id == player_id โ | |
| โ and b.type in [BuildingType.REFINERY, BuildingType.HQ]] โ | |
| โ print(f"Available depots for player {player_id}: {len(depots)}") โ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| โ CHECKLIST FONCTIONNEMENT HARVESTER | |
| Pour que le Harvester fonctionne correctement, vรฉrifier: | |
| โก 1. PRODUCTION | |
| โ HQ existe et appartient au joueur | |
| โ PRODUCTION_REQUIREMENTS: HARVESTER โ HQ | |
| โ Player a โฅ200 crรฉdits | |
| โ Commande WebSocket "build_unit" avec type="harvester" | |
| โก 2. CRรATION UNITร | |
| โ create_unit(UnitType.HARVESTER, player_id, position) | |
| โ Unit.cargo = 0 | |
| โ Unit.gathering = False | |
| โ Unit.returning = False | |
| โ Unit.ore_target = None | |
| โก 3. GAME LOOP | |
| โ update_game_state() appelle update_harvester(unit) | |
| โ Tick rate: 50ms (20 ticks/sec) | |
| โ Broadcast state inclut units | |
| โก 4. TERRAIN | |
| โ init_map() gรฉnรจre ORE et GEM | |
| โ โฅ15 patches d'ORE sur la carte | |
| โ Tiles accessibles (pas entourรฉes d'eau) | |
| โก 5. MOUVEMENT | |
| โ unit.target settรฉ correctement | |
| โ unit.speed = 1.0 | |
| โ Position mise ร jour chaque tick | |
| โ Distance calculรฉe correctement | |
| โก 6. RรCOLTE | |
| โ Distance < TILE_SIZE/2 pour rรฉcolter | |
| โ tile_x, tile_y calculรฉs correctement | |
| โ Terrain type vรฉrifiรฉ (ORE ou GEM) | |
| โ Cargo incrรฉmentรฉ | |
| โ Tile devient GRASS | |
| โก 7. RETOUR DรPรT | |
| โ cargo >= 180 โ returning = True | |
| โ find_nearest_depot() trouve HQ ou Refinery | |
| โ Distance < TILE_SIZE*2 pour dรฉposer | |
| โ player.credits += cargo | |
| โ cargo reset ร 0 | |
| โก 8. FRONTEND | |
| โ WebSocket connectรฉ | |
| โ game.js render type "harvester" | |
| โ Couleur/sprite dรฉfini | |
| โ Broadcast state reรงu | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ๐ MรTRIQUES PERFORMANCE | |
| Harvester optimal (temps pour 1 cycle): | |
| โโ Recherche minerai: ~1 sec (instant si proche) | |
| โโ Trajet vers minerai: Variable (dรฉpend distance) | |
| โโ Rรฉcolte 4 tiles: ~4 ticks = 0.2 sec | |
| โโ Trajet vers dรฉpรดt: Variable (dรฉpend distance) | |
| โโ Dรฉpรดt: ~1 tick = 0.05 sec | |
| โโ Total: ~10-30 sec par cycle | |
| Revenus par Harvester: | |
| โโ Cargo max: 200 crรฉdits | |
| โโ ORE: 4 tiles = 200 crรฉdits | |
| โโ GEM: 2 tiles = 200 crรฉdits | |
| โโ Cycles/min: 2-6 (selon distance) | |
| ROI (Return on Investment): | |
| โโ Coรปt: 200 crรฉdits | |
| โโ Premier cycle: Break-even | |
| โโ Profit net: Tous cycles suivants | |
| โโ Recommandรฉ: 2-3 Harvesters minimum | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| ๐ EXEMPLE SCรNARIO COMPLET | |
| Tick 0: Player construit HQ | |
| Tick 100: Player a 5000 crรฉdits | |
| Tick 101: Player envoie commande: build_unit("harvester") | |
| Tick 102: Check: HQ existe? โ Credits โฅ200? โ | |
| Tick 103: Credits: 5000 - 200 = 4800 | |
| Tick 104: Harvester crรฉรฉ ร position (HQ.x+80, HQ.y+80) | |
| Tick 105: update_harvester() appelรฉ | |
| รtat: IDLE (gathering=False, ore_target=None) | |
| Tick 106: find_nearest_ore() cherche minerai | |
| โ Trouve ORE ร (1200, 800) | |
| รtat: ore_target=(1200,800), gathering=True | |
| Tick 107-200: Se dรฉplace vers (1200, 800) | |
| Vitesse: 1.0 pixel/tick | |
| Tick 201: Arrivรฉ au minerai (distance < 20) | |
| tile_x=30, tile_y=20 | |
| terrain[20][30] = ORE | |
| Tick 202: Rรฉcolte: cargo += 50 โ cargo=50 | |
| terrain[20][30] = GRASS | |
| รtat: ore_target=None, gathering=False | |
| Tick 203: Cherche nouveau minerai proche | |
| โ Trouve ORE adjacent ร (1240, 800) | |
| Tick 204-220: Se dรฉplace et rรฉcolte 3 autres tiles ORE | |
| cargo: 50 โ 100 โ 150 โ 200 | |
| Tick 221: cargo=200 โฅ 180 โ returning=True | |
| Tick 222: find_nearest_depot() โ Trouve HQ ร (200, 200) | |
| Tick 223-350: Se dรฉplace vers HQ | |
| Tick 351: Arrivรฉ au HQ (distance < 80) | |
| Tick 352: Dรฉpรดt: player.credits += 200 โ 5000 | |
| cargo=0, returning=False | |
| Tick 353: รtat: IDLE โ Cherche nouveau minerai | |
| Tick 354: Cycle recommence... | |
| โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| Date: 3 Octobre 2025 | |
| Status: โ DOCUMENTATION COMPLรTE | |
| "The Harvester must flow." ๐๐ฐ | |