9 votes

Simuler "Heart : La ville en dessous" à l'aide d'Anydice

J'aime concevoir des systèmes et décortiquer des jeux pour apprendre des choses, et Anydice est un outil formidable que j'utilise depuis un certain temps. Cependant, je suis en train de regarder quelques jets de cœur et il semble qu'Anydice me donne des résultats erronés, certainement de ma faute.

Je cherche plus particulièrement à savoir si les jets sont risqués/dangereux et comment cela influe sur les chances de réussite. En gros pour ceux qui ne connaissent pas, Heart utilise un pool de d10 pour les tests de compétences, et un 8, 9, ou 10 est un succès pur et simple. Le pool théorique maximum est de 4d10 je crois, peut être 5 si vous le poussez avec certaines capacités du personnage. Un jet risqué enlève le dé le plus élevé, et un jet dangereux enlève les deux dés les plus élevés.

Voici comment je l'ai rédigé à l'heure actuelle :

output [count {8, 9, 10} in [lowest 1 of 2d10]] named "Domain or Skill"
output [count {8, 9, 10} in [lowest 2 of 3d10]] named "Domain and Skill"
output [count {8, 9, 10} in [lowest 3 of 4d10]] named "All and Mastery"

Il semble cependant me donner des résultats erronés, car il montre que la dernière sortie a un taux de réussite inférieur à la deuxième sortie, et qu'aucune d'entre elles n'a plus d'un succès alors que les sorties 2 et 3 en sont techniquement capables, même si c'est assez improbable. Il y a donc quelque chose qui ne va pas. Comment faire pour que cela se passe correctement ?

16voto

Dale M Points 183702

Ne réfléchissons pas trop

Si j'ai bien compris, lors d'un jet normal, on prend le dé le plus élevé, lors d'un jet risqué, on prend le deuxième plus élevé, et lors d'un jet dangereux, on prend le troisième plus élevé. Anydice vous permet de les obtenir directement :

output 1@3d10 named "Normal"
output 2@3d10 named "Risky"
output 3@3d10 named "Dangerous"

Bien sûr, nous pouvons éviter de jouer avec les d10 et simplement mettre en place un succès mourir :

HEART: {0:7, 1:3}

output 1@3dHEART named "Normal"
output 2@3dHEART named "Risky"
output 3@3dHEART named "Dangerous"

10voto

trjh Points 11

Mise à jour : Après avoir vérifié le fonctionnement de la mécanique de succès dans "Heart : The City Beneath", il semble que le mécanisme de réussite de Réponse de Dale M est la bonne.

Ma réponse ci-dessous, et Réponse de Groody Les deux montrent comment faire fonctionner le code de l'OP comme on peut le supposer : compter le nombre de jets de 8 ou plus après avoir enlevé un certain nombre de jets les plus élevés. Mais ce n'est pas ainsi que fonctionne le mécanisme de réussite dans Heart.

Par souci d'exhaustivité, je laisse ma réponse originale ci-dessous, mais sachez qu'il s'agit de la bonne réponse à la mauvaise question. Et s'il vous plaît, allez voter pour la réponse de Dale.


Oui, cela ne marchera pas.

Le premier problème est que la fonction lowest NUMBER of DICE renvoie le somme de la plus basse NUMBER et non une séquence contenant ces valeurs. Le deuxième problème est que, même s'il a fait retourner une séquence, en essayant de l'appliquer à un groupe de dés comme Nd10 ferait en sorte qu'AnyDice additionne la séquence retournée de toute façon (pour la transformer en un seul nombre, et ensuite rassembler tous ces nombres dans un dé pondéré).

Mais vous pouvez écrire votre propre count VALUES in lowest NUMBER of DICE qui fait ce que vous voulez. De manière pratique, la bibliothèque de fonctions d'AnyDice contient des exemples "à faire soi-même" des deux types de fonctions suivantes count VALUES in SEQUENCE y lowest NUMBER of DICE et il n'est pas difficile de combiner les deux :

\ "Do it yourself" examples from AnyDice's function library: \

function: count VALUES:s in SEQUENCE:s {
  COUNT: 0
  loop P over {1..#VALUES} {
    COUNT: COUNT + (P@VALUES = SEQUENCE)
  }
  result: COUNT
}

function: lowest NUMBER:n of DICE:d {
  result: {(#DICE - NUMBER + 1)..#DICE}@DICE
}

\ Combined custom function: \

function: count VALUES:s in lowest NUMBER:n of DICE:s {
  COUNT: 0
  loop P over {(#DICE - NUMBER + 1) .. #DICE} {
    COUNT: COUNT + (P@DICE = VALUES)
  }
  result: COUNT
}

Un changement pratique que j'ai dû apporter est que je boucle sur les dés et compare chacun d'entre eux aux valeurs recherchées, plutôt que l'inverse comme dans l'exemple de mise en œuvre AnyDice de count VALUES in SEQUENCE ne. De plus, j'ai dû faire en sorte que le DICE une séquence, puisque je ne peux pas faire de boucle avec elle autrement. Cela signifie que, lorsque vous passez un groupe de dés, AnyDice appellera la fonction avec tous les résultats possibles (triés) du lancer de dés comme une séquence et additionnera automatiquement les résultats (ce qui est exactement ce que vous voulez).

En programme terminé se présente donc comme suit :

function: count VALUES:s in lowest NUMBER:n of DICE:s {
  COUNT: 0
  loop P over {(#DICE - NUMBER + 1) .. #DICE} {
    COUNT: COUNT + (P@DICE = VALUES)
  }
  result: COUNT
}

output [count {8, 9, 10} in lowest 1 of 2d10] named "Domain or Skill"
output [count {8, 9, 10} in lowest 2 of 3d10] named "Domain and Skill"
output [count {8, 9, 10} in lowest 3 of 4d10] named "All and Mastery"

5voto

Je pense que votre problème est que vous développez d'abord les dés en une séquence avec la fonction le plus bas donc au moment où vous comparez avec les nombres que vous considérez comme des succès, vous comparez avec les totaux de ce résultat, et non avec les dés individuels.

Il n'est pas aussi élégant que Réponse d'Ilmaris Mais un moyen facile de contourner ce problème est de définir un dé de réussite. Vous ne vous souciez pas vraiment des succès que vous ignorez, après tout, tant que vous ignorez un succès. Par exemple, pour un d10 qui a des succès sur 8, 9 ou 10 :

SUCCESS: d10 >= 8

Vous pouvez alors utiliser ce dé de réussite dans votre formule, pour ignorer une ou plusieurs de ces réussites.

output [lowest 1 of 2dSUCCESS] named "Domain or Skill"
output [lowest 2 of 3dSUCCESS] named "Domain and Skill"
output [lowest 3 of 4dSUCCESS] named "All and Mastery"

Addendum :

Si les règles sont les suivantes Guybrush dit Dans ce cas, vous ne prenez en compte que le résultat le plus élevé pour le normal, le deuxième pour le risqué et le troisième pour le dangereux. Il y a également quatre niveaux de réussite : une réussite spectaculaire sur un 10, une réussite totale sur un 8 ou un 9, une réussite au prix d'un 6 ou d'un 7, et un échec sur un 5 ou moins. Vous pouvez modéliser cela comme suit (sur la base de la Exemple de Blades in the Dark ), remplacez RISKY dans le résultat par NORMAL ou DANGEROUS pour voir la distribution pour d'autres niveaux de risque :

NORMAL: 1
RISKY: 2
DANGEROUS: 3

function: heart RISK:n ROLL:s {
 L: RISK@ROLL 
 if L > 7 {
  result: 2 + (L=10)
 }
 result: L >= 6
}

loop P over {2..4} {
 output [heart DANGEROUS Pd10] named "[P]d10"
}

AlleGamers.com

AlleGamers est une communauté de gamers qui cherche à élargir la connaissance des jeux vidéo.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X