Atrybuty do obliczania trafienia w grze turowej lub Roguelikes

22

Próbuję znaleźć dobrą formułę określania trafienia, gdy gracz atakuje wroga w Roguelike. Chciałbym wymyślić coś prostego, ale nadal wiernego temu, co dzieje się w D&D lub popularnych Roguelikes, takich jak AngBand lub NetHack.

Do tej pory dodałem różnice między atrybutami gracza i wroga oraz losową liczbą całkowitą:

if ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + random_integer_below_6()) >= 10) {
    hit(enemy);
}

To powoduje nienaturalną rozgrywkę: gracz nigdy nie tęskni za słabymi wrogami i na odwrót za silnych. Czy ktoś zna przewodnik po walce opartej na atrybutach używanej w grach turowych itp.? Czy powinienem (i czy mogę) kopiować zasady D&D dosłownie?

jdeseno
źródło

Odpowiedzi:

18

Zastanawiam się, jakie są szanse na „gwarantowane uderzenie” i „gwarantowane spóźnienie” (tj. Szanse, że kotek trafi smoka, a smok - kotka). Zapisz swój losowy wynik, a przed zastosowaniem różnic mocy zaznacz trafienie, jeśli mieści się w tych granicach. Zapobiegnie to problemowi szansy na trafienie w 100% ... chociaż istnieje jeszcze jedna opcja zapewniania szansy na trafienie, opisana poniżej.

D&D to „płaski” system, w którym prawdopodobieństwo rozkłada się równomiernie na możliwe wyniki rzutów. Inne systemy wykorzystują bardziej zakrzywiony rozkład, zwykle osiągany przez rzucanie wieloma kostkami i dodawanie ich. Łatwo jest stworzyć taką krzywą (przychodzi mi na myśl rand () + rand ()) / 2).

Inną możliwością jest „eksplodowanie kości”. W systemach takich jak Shadowrun i Savage Worlds, rzucenie maksymalnym możliwym wynikiem kości pozwala przerzucić tę kość i dodać nowy wynik. W swojej grze sprawdzasz, czy Twój losowy wynik przekracza określony próg, a jeśli tak, to rzucasz ponownie. Jeśli pozwolisz kościom eksplodować w nieskończoność, nawet najgorszy goblin ma szansę trafić boga i nie potrzebujesz wyraźnej mechaniki „gwarantowanego trafienia”.

Tak więc jednym możliwym podejściem z zakrzywionym rzutem, gwarantowaną szansą na brak i wybuchem kości byłoby coś takiego:

function getRoll():Number
{
  var result:Number = (rand() + rand()) * 3; //Curved result from 0 to 6
  if(result > 5.75) result += getRoll(); //Explode over a certain threshold, recursively
  return result;
}

function attackHits():Boolean
{
  var roll:Number = getRoll();
  if(roll < 0.25) return false; //Guaranteed chance of miss
  else return ((player.dex - enemy.dex) + (player.speed - enemy.speed) +
    (player.luck - enemy.luck) + roll) >= 10; //Your original test.
}

Oczywiście jest to niesprawdzone i niezrównoważone; chciałbyś dopasować wszystkie te magiczne liczby, dopóki nie poczują się dobrze.

Jeśli chodzi o kopiowanie reguł dosłownie, istnieją z tym prawne i etyczne problemy. Wciąż czerpiesz inspirację z D&D i innych gier stołowych; właśnie w ten sposób wszystkie zostały zaprojektowane. Nie musisz też pokazywać graczowi dokładnie, jak działają reguły, i może się okazać, że użycie gładkiej krzywej zmiennoprzecinkowej kości daje lepsze wyczucie niż ograniczanie się do całkowitych ograniczeń kości fizycznych.

Gregory Avery-Weir
źródło
3
co to za język z zabawnym typem deklaracji? A może to tylko pseudokod?
tenpn
2
Myślę, że może to być ActionScript lub Javascript, ale nie trzymaj mnie tego.
Kaczka komunistyczna
To jest ActionScript 3. Jestem programistą Flash.
Gregory Avery-Weir
6

Zakładam, że jest to pytanie o równowagę gry, a nie o kodowanie, i istnieje wiele sposobów, aby sobie z tym poradzić. Z twojego istniejącego algorytmu podejrzewam, że komplikujesz go bardziej niż trzeba (trzy atrybuty ORAZ liczba losowa tworzą wyjątkowo błotnisty system z perspektywy gracza). Moim pierwszym instynktem jest uproszczenie!

Preferuj atrybuty, które wykonują wiele czynności, a nie wyniki, które są określane przez wiele atrybutów. DEX działa dobrze jako główny wyznacznik szansy na trafienie; dodanie wszystkiego innego służy jedynie utrudnieniu równowagi. Pomyśl o tym w ten sposób: oczekiwane obrażenia gracza przy każdym trafieniu to jego% trafienia pomnożony przez ich średnie obrażenia po trafieniu. Jak planujesz obliczyć „oczekiwany” lub „typowy”% trafienia przy tak wielu zmiennych?

Widzę inny problem, polegający na tym, że formuła nie skaluje się i prawdopodobnie tego właśnie doświadczasz. Zakładając, że DEX, LUCK i SPEED mają tendencję do zwiększania się w trakcie gry, różnice między graczem i potworem w tych statystykach również będą się zwiększać. Przykładowo, jeśli DEX gracza we wczesnej fazie gry mieści się w zakresie od 4 do 6, podobnie jak potwory, jest to modyfikator 10-20% do trafienia. Jeśli w późniejszych etapach gry zasięg wynosi od 10 do 20, oznacza to 100% modyfikator.

Jednym ze sposobów, aby to naprawić, jest utrzymanie stałych statystyk. Zasięg graczy i potworów jest taki sam w trakcie gry, a uzyskanie czegoś takiego jak +1 DEX to ogromna sprawa, niezwykle rzadka i traktowana jako taka (jeśli w ogóle istnieje). Wtedy twoja formuła będzie dobrze działać przez całą grę, a zobaczysz gracza z taką samą szansą na trafienie przez cały czas.

Innym sposobem jest zmiana tej zakodowanej „10” na skalowaną wraz z poziomem, więc może to „10 + poziom potwora” lub „10 + poziom lochu” lub coś takiego, co powoduje niewielki wzrost trudności w miarę postępu gry, chyba że gracz awansuje na wyższy poziom odpowiednio ich statystyki.

Trzeci sposób, jak powiedzieli inni, to ustawienie twardych limitów na najwyższy i najniższy dopuszczalny% trafień i po prostu powiedzenie „jeśli obliczona wartość jest mniejsza niż X, zamiast tego użyj X”.

Ze względu na kompletność zaznaczę, że nie ma absolutnego prawa, że ​​MUSISZ uwzględniać przede wszystkim rzut na trafienie. Nieefektywne działanie w grze nie jest szczególnie zabawne i naprawdę nie wzbogaca doświadczenia, z wyjątkiem rzadkich przypadków. Alternatywą jest pozwolenie graczom ZAWSZE uderzać i po prostu zadzierać z zasięgiem obrażeń, aby czasami zadawali o wiele mniej obrażeń niż inni. Pamiętaj, że złożone systemy są bardziej zabawne dla projektanta niż dla gracza.

Ian Schreiber
źródło
To świetna odpowiedź.
seanicus
3

Możesz dodać trafienia krytyczne (zazwyczaj nie możesz przegapić, dodatkowe obrażenia) i krytyczne chybienia (płaska szansa na spudłowanie bez względu na wszystko, być może oszałamia gracza).

koderanger
źródło
0

Wiele gier wykorzystuje pięcioprocentową zmianę trafienia niezależnie od wszystkich czynników oprócz normalnej formuły trafień.

EddieC
źródło