Como uso o AnyDice com o Classic World of Darkness / 20º aniversário?

6

Como posso aproveitar o AnyDice com regras do 20º aniversário? Eu sou novo no AnyDice, mas estou muito interessado em usá-lo.

Eu gostaria de uma função de wrapper que aceite os seguintes parâmetros.

  • o número de dados a rolar
  • a dificuldade da ação
  • opcional : uma força de vontade sendo gasta para um sucesso.
  • opcional : um personagem com uma especialidade relevante, permitindo um segundo sucesso em 10's.

Se a parada de dados for maior do que a dificuldade que eu gostaria e indicação para sucesso automático .

Mecânica de dados

  • Jogue Xd10 contra a dificuldade alvo, dados iguais ou maiores que a dificuldade são sucessos .
  • Rolling 10's
    • são sempre sucessos .
    • conte como 2 sucessos , se o personagem tiver uma especialidade relevante.
  • Rolling 1's
    • cada 1 nega sucesso a falha .
    • se não houver sucessos , a ação é falha .
  • opcional : antes de rolar você pode gastar 1 força de vontade por um sucesso adicional.
    • você só pode gastar 1 de força de vontade por turno.
  • opcional : se Xd10 for maior que a dificuldade alvo, você pode executar a ação como um sucesso automático .
    • não utilizável em situações estressantes.
    • conta apenas para 1 sucesso .
    • você pode rolar ou tirar o sucesso automático , mas não os dois.

Resultados de sucesso

  • 5 fenomenal
  • 4 Excepcional
  • 3 Completo
  • 2 Moderado
  • 1 marginal
  • 0 Falha
  • -1: Botch (somente possível quando nenhum sucesso estiver presente)

Psuedocode (este é um esboço solto do que tenho em mente)

function roll(int POOL, int DIFFICULTY, bool WILLPOWER, bool SPECIALTY, bool AUTO_SUCCESS = true)
{
  int  _roll = 0;
  int  SUCCESS = 0;
  int  FAILURE = 0;
  bool BOTCH = false;

  if (WILLPOWER) SUCCESS++;

  for (int i = 0; i < POOL; i++)
  {
    _roll = 1d10;
    if (_roll >= DIFFICULTY) SUCCESS++;
    if (SPECIALTY && _roll == 10) SUCCESS++;
    if (_roll == 1) FAILURE++;
  }
  if (SUCCESS == 0 && FAILURE > 0) BOTCH == true;

  if (BOTCH)
    output "Botch!\t" + tally(SUCCESS, FAILURE);
  else if (SUCCESS > FAILURE)
    output "Pass.\t" + tally(SUCCESS, FAILURE);
  else
    output "Fail.\t" + tally(SUCCESS, FAILURE);
}

function string tally(int S, int F)
{
  return (SUCCESS - FAILURE) + "\t(" + SUCCESS + " - " + FAILURE + ")";
}
    
por redlamp 05.06.2014 / 23:22

3 respostas

Acabei recebendo um tweet do criador do AnyDice com uma solução otimizada. Os nomes das funções são claros e funcionam rapidamente.

@catlikecoding Ei Jasper, você poderia me ajudar com um # AnyDice ? Eu ainda estou aprendendo as cordas com o sistema. link

- Taylor Wright (@redlamp) 6 de junho de 2014

@redlamp Não use uma função mega, divida-a. link

- Jasper Flick (@catlikecoding) 6 de junho de 2014

O exemplo de código:

function: roll ROLL:s {
 if 1@ROLL < 1 & (#ROLL)@ROLL = -1 {
  result: -1
 }
 result: [highest of 0 and ROLL]
}

function: roll ROLL:n with willpower {
 result: [highest of 0 and ROLL + 1]
}

function: specialty N:n {
 if N = 10 { result: 2 }
 if N = 1 { result: -1 }
 result: N >= DIFFICULTY
}

DIFFICULTY: 7

NORMAL: d{-1:1, 0:(DIFFICULTY - 2), 1:(11 - DIFFICULTY)}

SPECIALTY: [specialty d10]

X: 4

output [roll X d NORMAL] named "normal"
output [roll X d SPECIALTY] named "speciality"
output [roll X d NORMAL with willpower] named "normal willpower"
output [roll X d SPECIALTY with willpower] named "speciality willpower"
\ automatic success is automatic, nothing to show \
    
03.08.2014 / 18:40

Eu acredito que o seguinte realiza o que você quer. Eu deixei de marcar o sucesso automático, já que é uma situação completamente diferente.

Aviso: isso é lento. 1d10 a 7d10 estão bem. 8d10 e 9d10 levam cerca de 30 segundos para mim. 10d10 nunca terminou. Eu não acho que pode ser otimizado ainda mais, dada a funcionalidade disponível no AnyDice.

Você pode experimentar esse código imediatamente no link

\ Old Storyteller rules (Original World of Darkness) die rolling       \

\ Created by Alan De Smet in 2014. Released into the public domain to  \
\ the fullest extent possible.  This comes WITHOUT ANY WARRANTY.  You  \
\ are asked, but not required, to credit Alan De Smet.                 \

\ Input:                                                               \
\ ROLL - Dice to roll. Only "<something>d10" is meaningful.            \
\ TARGET - the target number. Only "2-10" are meaningful.              \
\ SPECIALIZED - "1" if specialized, "0" if not                         \
\ WILLPOWER - "1" if willpower is spent, "0" if not                    \

\ Output:                                                              \
\ -1    Botch. No successes, at least one 1                            \
\  0    Failure                                                        \
\  1+   Number of successes after subtracting a success for each       \
\             1 rolled.  If at least one success was rolled, 1s cannot \
\             take this below 0.                                       \


\ Example:                                                             \
\ [owod roll 5d10 target 8 specialized 0]                              \

\ Limitations:                                                         \
\ Scales poorly to large numbers of dice. 9d10 takes about 30 seconds. \
\ 10d10 may not work at all.                                           \

function: owod roll ROLL:s target TARGET:n specialized SPECIALIZED:n willpower WILLPOWER:n {

  \ I use "BOTCH" to mean a roll of 1, which isn't how  Storyteller    \
  \ defines it. A super success is a roll of 10 when specialized.      \

  \ Build up lists of which numbers are successes, botches, and  \
  \ super successes.                                             \
  MAXSUCCESS: 10
  SUPERSUCCESSROLLS: {11}
  if SPECIALIZED {
    MAXSUCCESS: 9
    SUPERSUCCESSROLLS: {10}
  }
  SUCCESSROLLS: {TARGET..MAXSUCCESS}
  BOTCHROLLS: {1}

  \ Count how many of each type (successes, botches, super successes) \
  SUPERSUCCESSES: [count SUPERSUCCESSROLLS in ROLL]
  SUCCESSES: [count SUCCESSROLLS in ROLL]
  BOTCHES: [count BOTCHROLLS in ROLL]

  \ How many successes does this count as? \
  FINALSUCCESSES: SUCCESSES+(SUPERSUCCESSES*2)+WILLPOWER

  \ If zero successes and at least one botch, the roll is a botch \
  if (FINALSUCCESSES = 0) & (BOTCHES > 0) {
    \ If you want to know how badly you botched, uncomment the \
    \ next line: \
    \ result: -BOTCHES \
    result: -1
  }
  if BOTCHES > FINALSUCCESSES {
    \ If there are more botches than successes, then we simply fail \
    result: 0
  }
  result: FINALSUCCESSES-BOTCHES
}

output [owod roll 2d10 target 8 specialized 1 willpower 0]
output [owod roll 2d10 target 8 specialized 1 willpower 1]
    
06.06.2014 / 23:07

Não é uma solução perfeita, mas você pode começar com este programa: link

function: nwod R:n again N:n {
 if N >= R { result: 1 + [nwod R again d10] }
 result: N >= 8
}

NWOD: [nwod 10 again d10]

loop N over {1..10} {
 output [lowest of 10 and NdNWOD] named "[N]d"
}
    
06.06.2014 / 02:04