Spaces:
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 โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
SPAWN (Crรฉation) โโ> Harvester produit depuis HQ (pas Refinery!) Coรปt: 200 crรฉdits
IDLE (Repos) โโ> Cherche automatiquement le minerai le plus proche Variables: gathering=False, ore_target=None
SEARCHING (Recherche) โโ> find_nearest_ore() trouve ORE ou GEM Variables: gathering=True, ore_target=Position(x, y)
MOVING TO ORE (Dรฉplacement vers minerai) โโ> Se dรฉplace vers ore_target Vitesse: 1.0 tiles/tick
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
CARGO CHECK (Vรฉrification cargaison) โโ> Si cargo >= 180 (90% de 200) โ Variables: returning=True
RETURNING (Retour base) โโ> find_nearest_depot() trouve Refinery ou HQ Se dรฉplace vers le dรฉpรดt
DEPOSITING (Dรฉpรดt) โโ> ร proximitรฉ du dรฉpรดt (< TILE_SIZE*2) player.credits += unit.cargo cargo = 0 Variables: returning=False, gathering=False
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: (x40+20, y40+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_SIZE2) โ โ โ 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_SIZE3 โ โ โ 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." ๐๐ฐ