Console
Clique sur « Exécuter » pour lancer le programme.
Aucune exécutionCtrl+Entrée : exécuter · Échap : arrêter
Code CoddyRun
@ Réglages
MAX_U est un nombre
MAX_U vaut 80
X_NID est un nombre
X_NID vaut 46
X_SOURCE est un nombre
X_SOURCE vaut 380
Y_HAUT est un nombre
Y_HAUT vaut 150
Y_BAS est un nombre
Y_BAS vaut 296
@ État
ecran est une toile
dimension(ecran, 480, 500)
uAct est un tableau
uType est un tableau
uX est un tableau
uY est un tableau
uPV est un tableau
uTimer est un tableau
uPhase est un tableau
uDecalX est un tableau
uDecalY est un tableau
nourriture, pvNid, pvNidMax, recoltes est un nombre
spawnTimer, etat, tics, duree, nbOuvrieres, vagueCompteur est un nombre
tra1, tra2, tra3, resetTraite est un nombre
proI, proJ, proMeilleur, proDist, proType est un nombre
distX, distY, dTot, proSens est un nombre
cibleX, cibleY est un nombre
proC est un texte
dem1, dem2, dem3, resetDemande est un nombre
enJeu est un booleen
action, ptX, ptY est un nombre
dem1 vaut 0
dem2 vaut 0
dem3 vaut 0
resetDemande vaut 0
tra1 vaut 0
tra2 vaut 0
tra3 vaut 0
resetTraite vaut 0
enJeu vaut vrai
vagueCompteur vaut 0
pour proI de 0 à MAX_U - 1
uAct ajoute 0
uType ajoute 1
uX ajoute 0
uY ajoute 0
uPV ajoute 0
uTimer ajoute 0
uPhase ajoute 0
uDecalX ajoute 0
uDecalY ajoute 0
fin pour
@ Caractéristiques
fonction coutType(t)
si t = 1 alors
retourne 15
sinon si t = 2 alors
retourne 40
fin si
retourne 120
fin fonction
fonction pvType(t)
si t = 1 alors
retourne 25
sinon si t = 2 alors
retourne 180
sinon si t = 3 alors
retourne 500
sinon si t = 4 alors
retourne 130
sinon si t = 5 alors
retourne 420
sinon si t = 6 alors
retourne 90
fin si
retourne 100
fin fonction
fonction degatType(t)
si t = 2 alors
retourne 22
sinon si t = 3 alors
retourne 50
sinon si t = 4 alors
retourne 18
sinon si t = 5 alors
retourne 38
sinon si t = 6 alors
retourne 16
fin si
retourne 0
fin fonction
fonction porteeType(t)
si t = 2 alors
retourne 32
sinon si t = 3 alors
retourne 42
sinon si t = 4 alors
retourne 24
sinon si t = 5 alors
retourne 34
sinon si t = 6 alors
retourne 75
fin si
retourne 24
fin fonction
fonction cadenceType(t)
si t = 2 alors
retourne 14
sinon si t = 3 alors
retourne 16
sinon si t = 4 alors
retourne 18
sinon si t = 5 alors
retourne 20
sinon si t = 6 alors
retourne 22
fin si
retourne 18
fin fonction
fonction vitesseType(t)
si t = 1 alors
retourne 38
sinon si t = 2 alors
retourne 24
sinon si t = 3 alors
retourne 16
sinon si t = 4 alors
retourne 14
sinon si t = 5 alors
retourne 11
sinon si t = 6 alors
retourne 15
fin si
retourne 14
fin fonction
@ Mise en place
procédure creerUnite(t)
proJ vaut -1
pour proI de 0 à MAX_U - 1
si uAct[proI] = 0 et proJ < 0 alors
proJ vaut proI
fin si
fin pour
si proJ >= 0 alors
uAct[proJ] vaut 1
uType[proJ] vaut t
uPV[proJ] vaut pvType(t)
uTimer[proJ] vaut 0
uPhase[proJ] vaut sialors(t >= 4, 1, 0)
uY[proJ] vaut Y_HAUT + hasard(Y_BAS - Y_HAUT)
uDecalX[proJ] vaut hasard(24) - 12
uDecalY[proJ] vaut hasard(24) - 12
si t >= 4 alors
uX[proJ] vaut 500
sinon
uX[proJ] vaut X_NID + 14
fin si
fin si
fin procédure
procédure nouvellePartie()
nourriture vaut 100
pvNidMax vaut 1000
pvNid vaut pvNidMax
recoltes vaut 0
spawnTimer vaut 500
vagueCompteur vaut 0
etat vaut 0
duree vaut 0
pour proI de 0 à MAX_U - 1
uAct[proI] vaut 0
fin pour
fin procédure
@ Dessin
procédure dessinerFourmi(g, sx, sy, t, charge, pvActuel, sens)
si t = 4 ou t = 5 alors
rMain est un nombre
rMain vaut sialors(t = 5, 14, 10)
cMain est un texte
cMain vaut sialors(t = 5, #8A1A1A, #6A3A2A)
cTete est un texte
cTete vaut sialors(t = 5, #B02A2A, #7A4A34)
contour(g, #2A1A16, 2)
cercle(g, sx, sy, rMain, cMain)
cercle(g, sx + (8 * sens), sy - 2, rMain - 4, cTete)
contour(g, #0)
ligne(g, sx - (4 * sens), sy, sx - (16 * sens), sy - 10, #3A2218, 2)
ligne(g, sx - (4 * sens), sy, sx - (18 * sens), sy - 1, #3A2218, 2)
ligne(g, sx - (4 * sens), sy, sx - (16 * sens), sy + 9, #3A2218, 2)
ligne(g, sx + (4 * sens), sy, sx + (14 * sens), sy - 10, #3A2218, 2)
ligne(g, sx + (4 * sens), sy, sx + (16 * sens), sy - 1, #3A2218, 2)
ligne(g, sx + (4 * sens), sy, sx + (14 * sens), sy + 9, #3A2218, 2)
cercle(g, sx + (10 * sens), sy - 4, 2, #E05C5C)
cercle(g, sx + (6 * sens), sy - 5, 2, #E05C5C)
sinon si t = 6 alors
// Scarabée Bombardier
contour(g, #1A2A16, 2)
cercle(g, sx, sy, 9, #5C8A34)
cercle(g, sx + (6 * sens), sy, 5, #3A4A1A)
contour(g, #0)
ligne(g, sx - (2 * sens), sy, sx - (8 * sens), sy - 9, #1A2A16, 2)
ligne(g, sx - (2 * sens), sy, sx - (8 * sens), sy + 9, #1A2A16, 2)
ligne(g, sx + (4 * sens), sy, sx + (8 * sens), sy - 7, #1A2A16, 2)
ligne(g, sx + (4 * sens), sy, sx + (8 * sens), sy + 7, #1A2A16, 2)
cercle(g, sx + (8 * sens), sy - 3, 2, #E0E030)
sinon
si t = 1 alors
proC vaut rgb(58, 42, 28)
sinon si t = 2 alors
proC vaut rgb(150, 62, 34)
sinon
proC vaut rgb(40, 34, 60)
fin si
contour(g, #1A1208, 2)
cercle(g, sx - (7 * sens), sy, sialors(t = 3, 8, 6), proC)
cercle(g, sx, sy, sialors(t = 3, 6, 4), proC)
cercle(g, sx + (7 * sens), sy, sialors(t = 3, 6, 5), proC)
contour(g, #0)
ligne(g, sx - (2 * sens), sy, sx - (6 * sens), sy - 7, #1A1208, 2)
ligne(g, sx - (2 * sens), sy, sx - (6 * sens), sy + 7, #1A1208, 2)
ligne(g, sx + (2 * sens), sy, sx + (6 * sens), sy - 7, #1A1208, 2)
ligne(g, sx + (2 * sens), sy, sx + (6 * sens), sy + 7, #1A1208, 2)
ligne(g, sx + (10 * sens), sy - 2, sx + (16 * sens), sy - 8, #1A1208, 2)
ligne(g, sx + (10 * sens), sy + 2, sx + (16 * sens), sy + 8, #1A1208, 2)
si charge = 1 alors
contour(g, #4A3A18, 2)
cercle(g, sx + (12 * sens), sy - 8, 6, #E8C860)
contour(g, #0)
fin si
fin si
pvMax est un nombre
pvMax vaut pvType(t)
si pvActuel < pvMax et pvActuel > 0 alors
rectangle(g, sx - 10, sy - 14, 20, 3, #4A2A1A)
rectangle(g, sx - 10, sy - 14, 20 * (pvActuel / pvMax), 3, #6AE05A)
fin si
fin procédure
procédure carteUnite(g, cx, t, nom)
contour(g, #3A2A14, 2)
si nourriture >= coutType(t) alors
rectangle_arrondi(g, cx, 355, 142, 138, 12, #C8B07B)
sinon
rectangle_arrondi(g, cx, 355, 142, 138, 12, #948A7A)
fin si
label(g, cx + 10, 371, nom, #3A2A14, 11)
rectangle_arrondi(g, cx + 8, 376, 126, 52, 8, #F4EBDC)
contour(g, #0)
appelle dessinerFourmi(g, cx + 71, 402, t, 0, pvType(t), 1)
contour(g, #3A2A14, 2)
rectangle_arrondi(g, cx + 18, 434, 106, 32, 10, #FFFFFF)
contour(g, #0)
cercle(g, cx + 38, 450, 9, #E8C860)
cercle(g, cx + 38, 450, 6, #F4E09A)
label(g, cx + 54, 456, convertir_texte(coutType(t)), #3A2A14, 16)
fin procédure
procédure dessinerTout()
effacer(ecran)
rectangle(ecran, 0, 0, 480, 500, #82B258)
cercle(ecran, 40, 320, 14, #73A248)
cercle(ecran, 58, 315, 9, #73A248)
cercle(ecran, 210, 175, 18, #73A248)
cercle(ecran, 340, 315, 12, #73A248)
rectangle(ecran, 0, 0, 480, 100, #73A248)
cercle(ecran, 90, 96, 44, #66923C)
cercle(ecran, 300, 100, 52, #66923C)
rectangle(ecran, 0, 206, 480, 34, #D0B478)
rectangle(ecran, 0, 206, 480, 3, #A08448)
rectangle(ecran, 0, 237, 480, 3, #A08448)
// Le nid
contour(ecran, #3A2A14, 3)
cercle(ecran, X_NID, 223, 44, #B08A54)
contour(ecran, #0)
cercle(ecran, X_NID, 223, 39, #C29C64)
cercle(ecran, X_NID + 4, 221, 14, #3A2A14)
// Barre de vie du nid
contour(ecran, #2B1D14, 2)
rectangle_arrondi(ecran, 10, 154, 72 * pvNid / pvNidMax, 12, 3, #5CD048)
contour(ecran, #0)
label(ecran, 18, 164, "NID " + convertir_texte(arrondi((pvNid / pvNidMax) * 100)) + "%", #FFFFFF, 9)
// Réserve de nourriture
contour(ecran, #3A2A14, 3)
cercle(ecran, X_SOURCE + 20, 223, 26, #74B830)
contour(ecran, #0)
cercle(ecran, X_SOURCE + 14, 215, 8, #E8C860)
cercle(ecran, X_SOURCE + 28, 227, 7, #E8C860)
cercle(ecran, X_SOURCE + 18, 233, 6, #E8C860)
// Unités
pour proI de 0 à MAX_U - 1
si uAct[proI] = 1 alors
proSens vaut sialors(uPhase[proI] = 1, -1, 1)
appelle dessinerFourmi(ecran, uX[proI], uY[proI], uType[proI], uPhase[proI], uPV[proI], proSens)
fin si
fin pour
// Bandeau supérieur (HUD)
contour(ecran, #223414, 2)
rectangle_arrondi(ecran, 10, 8, 460, 42, 10, #344E20)
contour(ecran, #0)
label(ecran, 24, 34, convertir_texte(arrondi(duree / 16)) + " s", #FFFFFF, 15)
rectangle_arrondi(ecran, 175, 12, 130, 34, 8, #FFFFFF)
cercle(ecran, 196, 29, 10, #E8C860)
cercle(ecran, 196, 29, 6, #F4E09A)
label(ecran, 215, 36, convertir_texte(arrondi(nourriture)), #3A2A14, 18)
label(ecran, 320, 34, "Vag. " + convertir_texte(vagueCompteur) + " - " + convertir_texte(recoltes) + " rec.", #D2E8B8, 11)
si nbOuvrieres = 0 et nourriture < coutType(1) alors
label(ecran, 182, 60, "+1 secours...", #E8C860, 11)
fin si
appelle carteUnite(ecran, 14, 1, "OUVRIÈRE")
appelle carteUnite(ecran, 169, 2, "SOLDATE")
appelle carteUnite(ecran, 324, 3, "MAJOR")
si etat <> 0 alors
contour(ecran, #3A2A14, 3)
rectangle_arrondi(ecran, 60, 120, 360, 116, 16, #FFFFFF)
contour(ecran, #0)
label(ecran, 130, 170, "LE NID EST DÉTRUIT", #C03A3A, 24)
label(ecran, 116, 204, "tenu " + convertir_texte(arrondi(duree / 16)) + " s - " + convertir_texte(recoltes) + " récoltes", #5A4A2A, 16)
fin si
affiche ecran
fin procédure
@ Moteur (processus parallèle)
processus MoteurJeu()
tant que enJeu
tics vaut tics + 1
si resetTraite < resetDemande alors
resetTraite vaut resetTraite + 1
appelle nouvellePartie()
fin si
si tra1 < dem1 alors
tra1 vaut tra1 + 1
si etat = 0 et nourriture >= coutType(1) alors
nourriture vaut nourriture - coutType(1)
appelle creerUnite(1)
fin si
fin si
si tra2 < dem2 alors
tra2 vaut tra2 + 1
si etat = 0 et nourriture >= coutType(2) alors
nourriture vaut nourriture - coutType(2)
appelle creerUnite(2)
fin si
fin si
si tra3 < dem3 alors
tra3 vaut tra3 + 1
si etat = 0 et nourriture >= coutType(3) alors
nourriture vaut nourriture - coutType(3)
appelle creerUnite(3)
fin si
fin si
si etat = 0 alors
duree vaut duree + 1
nbOuvrieres vaut 0
pour proI de 0 à MAX_U - 1
si uAct[proI] = 1 et uType[proI] = 1 alors
nbOuvrieres vaut nbOuvrieres + 1
fin si
fin pour
si nbOuvrieres = 0 et nourriture < coutType(1) alors
si tics mod 18 = 0 alors
nourriture vaut nourriture + 1
fin si
fin si
// Apparition des vagues d'ennemis
spawnTimer vaut spawnTimer - 1
si spawnTimer <= 0 alors
vagueCompteur vaut vagueCompteur + 1
si vagueCompteur mod 5 = 0 alors
appelle creerUnite(5) // Araignée Élite
appelle creerUnite(4)
sinon si vagueCompteur mod 3 = 0 alors
appelle creerUnite(6) // Scarabée Bombardier
appelle creerUnite(6)
sinon
appelle creerUnite(4) // Araignée classique
si vagueCompteur > 4 alors
appelle creerUnite(4)
fin si
fin si
spawnTimer vaut limiter(480 - arrondi_inferieur(duree / 10), 60, 480)
fin si
pour proI de 0 à MAX_U - 1
si uAct[proI] = 1 alors
// Recherche de la cible la plus proche
proMeilleur vaut -1
proDist vaut 9999
pour proJ de 0 à MAX_U - 1
si uAct[proJ] = 1 alors
si (uType[proI] >= 4 et uType[proJ] <= 3) ou (uType[proI] <= 3 et uType[proJ] >= 4) alors
distX vaut absolue(uX[proJ] - uX[proI])
distY vaut absolue(uY[proJ] - uY[proI])
dTot vaut sialors(distX > distY, distX + distY / 2, distY + distX / 2)
si dTot < proDist alors
proDist vaut dTot
proMeilleur vaut proJ
fin si
fin si
fin si
fin pour
si uType[proI] >= 4 alors
distX vaut absolue(X_NID - uX[proI])
si distX < proDist alors
proDist vaut distX
proMeilleur vaut -2
fin si
fin si
// Comportements par rôle
si uType[proI] = 1 alors
// Ouvrière
si uPhase[proI] = 0 alors
uX[proI] vaut uX[proI] + vitesseType(1) / 10
si uX[proI] >= X_SOURCE alors
uPhase[proI] vaut 1
fin si
sinon
uX[proI] vaut uX[proI] - vitesseType(1) / 10
si uX[proI] <= X_NID alors
uPhase[proI] vaut 0
nourriture vaut nourriture + 15
recoltes vaut recoltes + 1
fin si
fin si
sinon si uType[proI] = 2 ou uType[proI] = 3 alors
// Soldates et Majors (Anti-empilement + Repli tactique)
si proMeilleur >= 0 et proDist <= porteeType(uType[proI]) alors
uTimer[proI] vaut uTimer[proI] + 1
si uTimer[proI] >= cadenceType(uType[proI]) alors
uTimer[proI] vaut 0
uPV[proMeilleur] vaut uPV[proMeilleur] - degatType(uType[proI])
si uPV[proMeilleur] <= 0 alors
uAct[proMeilleur] vaut 0
fin si
fin si
sinon si proMeilleur >= 0 alors
// Traque avec décalage individuel
cibleX vaut uX[proMeilleur] + uDecalX[proI]
cibleY vaut uY[proMeilleur] + uDecalY[proI]
si cibleX > uX[proI] alors
uX[proI] vaut uX[proI] + vitesseType(uType[proI]) / 10
uPhase[proI] vaut 0
sinon si cibleX < uX[proI] alors
uX[proI] vaut uX[proI] - vitesseType(uType[proI]) / 10
uPhase[proI] vaut 1
fin si
si cibleY > uY[proI] alors
uY[proI] vaut uY[proI] + vitesseType(uType[proI]) / 15
sinon si cibleY < uY[proI] alors
uY[proI] vaut uY[proI] - vitesseType(uType[proI]) / 15
fin si
sinon
// Repli dispersé au nid + Régénération
cibleX vaut X_NID + 24 + uDecalX[proI]
si uX[proI] > cibleX alors
uX[proI] vaut uX[proI] - vitesseType(uType[proI]) / 10
uPhase[proI] vaut 1
sinon
uPhase[proI] vaut 0
si uPV[proI] < pvType(uType[proI]) et tics mod 12 = 0 alors
uPV[proI] vaut uPV[proI] + 3
si uPV[proI] > pvType(uType[proI]) alors
uPV[proI] vaut pvType(uType[proI])
fin si
fin si
fin si
fin si
sinon
// Ennemis (Araignée, Élite, Scarabée)
si proMeilleur <> -1 et proDist <= porteeType(uType[proI]) alors
uTimer[proI] vaut uTimer[proI] + 1
si uTimer[proI] >= cadenceType(uType[proI]) alors
uTimer[proI] vaut 0
si proMeilleur = -2 alors
pvNid vaut pvNid - degatType(uType[proI])
si pvNid <= 0 alors
pvNid vaut 0
etat vaut 1
fin si
sinon
uPV[proMeilleur] vaut uPV[proMeilleur] - degatType(uType[proI])
si uPV[proMeilleur] <= 0 alors
uAct[proMeilleur] vaut 0
fin si
fin si
fin si
sinon si proMeilleur = -2 alors
uX[proI] vaut uX[proI] - vitesseType(uType[proI]) / 10
uPhase[proI] vaut 1
sinon si proMeilleur >= 0 alors
cibleX vaut uX[proMeilleur] + uDecalX[proI]
cibleY vaut uY[proMeilleur] + uDecalY[proI]
si cibleX > uX[proI] alors
uX[proI] vaut uX[proI] + vitesseType(uType[proI]) / 10
uPhase[proI] vaut 0
sinon
uX[proI] vaut uX[proI] - vitesseType(uType[proI]) / 10
uPhase[proI] vaut 1
fin si
si cibleY > uY[proI] alors
uY[proI] vaut uY[proI] + vitesseType(uType[proI]) / 15
sinon
uY[proI] vaut uY[proI] - vitesseType(uType[proI]) / 15
fin si
fin si
fin si
fin si
fin pour
fin si
appelle dessinerTout()
pause 60
fin tant que
fin processus
@ Programme principal
appelle nouvellePartie()
appelle dessinerTout()
MoteurJeu()
tant que enJeu
interagir ecran, ["1", "2", "3", "n", "p"] dans action, ptX, ptY
si non enJeu alors
arrête
fin si
si action = 0 alors
si clique(ptX, ptY, 14, 355, 142, 138) alors
dem1 vaut dem1 + 1
sinon si clique(ptX, ptY, 169, 355, 142, 138) alors
dem2 vaut dem2 + 1
sinon si clique(ptX, ptY, 324, 355, 142, 138) alors
dem3 vaut dem3 + 1
fin si
sinon si action = 1 alors
dem1 vaut dem1 + 1
sinon si action = 2 alors
dem2 vaut dem2 + 1
sinon si action = 3 alors
dem3 vaut dem3 + 1
sinon si action = 4 alors
resetDemande vaut resetDemande + 1
sinon
enJeu vaut faux
arrête
fin si
fin tant que
affiche "Colonie perdue - " + convertir_texte(arrondi(duree / 16)) + " s - " + convertir_texte(recoltes) + " récoltes"