Bei LoA werden wir es vermutlich optional einbauen, wenn wir dazu kommen. Hauptsächlich haben wir nicht die Kapazität, dafür ein eigenes Balancing abzustimmen. Schwierigkeit des Bogenschießens und Anzahl benötigter Pfeile ändern sich ja schon. Letzteres kann insbesondere problematisch sein, wenn es "besondere" Pfeile in begrenzter Stückzahl gibt. Daher würden wir vermutlich die Option nutzen, dass Pfeile nicht wieder eingesammelt werden können. (Dafür gab es doch eine ganz einfache Variable, die wir umstellen können?)
Ein Grund ist natürlich auch, dass wir nicht (zusätzliches) Fehlerpotential einbauen wollen. Daher haben wir es nicht direkt bei uns eingebaut sondern warten erst mal das Feedback auf deine Mod ab. Zu gegebener Zeit würden wir das dann auswerten und die aktuellste Version einbauen (ist noch eine Weile hin, bis LoA ganz fertig ist). Sollte es zu dem Zeitpunkt schwerwiegende Fehler geben, würden wir es wohl nicht einbauen. (Dieser Punkt ist aber allgemein und auf kein bestehendes Problem bezogen, für dich im Moment also vermutlich wenig nützlich. Vielleicht erklärt er aber, wieso nicht ganz so viel Feedback kam, falls andere Projekte eine ähnliche Strategie gewählt haben.)
Hi, I use to hero and NPC's custom LeGo bars for HP that colored to green when its poisoned. For NPC's I get other.attribute[ATR_HITPOINTS], other.attribute[ATR_HITPOINTS_MAX] and other aivar for poison status from Loop functioun with "if(Hlp_Is_oCNpc(her.focus_vob))" or "if(Npc_GetTarget(hero))", that work before I start use free aim. When I start aiming with bow, crossbow or magic, function don't get other attributes to custom bars. How I can solved this problem?
That's because Free Aim is using a helper vob (I think), which obviously is a zCVob, not an oCNpc.
The cleanest solution would be to hook at the point the bar is drawn and just use the corresponding NPC. That does require reading the assembly to figure out which register he's hiding in, though...
Danke schonmal für das Feedback zu möglichen Verbesserungen. Die sind sehr hilfreich.
Dazu schon mal ein paar Worte: Eine Unterstützung für die Gothic 2 Steuerung ist schon (fast) fehlerfrei implementiert. Ebenso einige andere Bugfixes (Performance, Schussverhalten, AI), dazu habe ich in Post 140 Häkchen neben die Auflistung gesetzt um zu zeigen was schon verbessert ist.
Zitat von Dada
Ansonsten fände ich es gut, wenn man die "Fokusreichweite" einstellen könnte, also die Entfernung auf die Namen und Lebensbalken angezeigt werden
Bei Zaubern läuft das nach wie vor über deren einzeln anpassbare Eigenschaft C_Spell.targetCollectRange (siehe z.B. Todeshauch), für den Fernkampf kann man diese diese Konstante anpassen. Standardmässig habe ich sie auf 50 Meter eingestellt. Ohne freies Zielen ist in Gothic die Standard-Fokusreichweite 35 Meter. Ich habe 50 Meter gewählt, weil man tatsächlich weiter schiessen kann, egal wie weit nun die Fokuserfassung reicht. Die Konstante in eine Variable zu ändern würde erlauben, die Fokuserfassung während des Spiels anzupassen (z.B. durch Talente). Allerdings fände ich das etwas unglücklich, weil man ja schon weit genug schauen und schiessen kann - die Fokusreichweite zu verringern würde den Spieler also nur "nerven".
Zitat von Milky-Way
Bei LoA werden wir es vermutlich optional einbauen, wenn wir dazu kommen. Hauptsächlich haben wir nicht die Kapazität, dafür ein eigenes Balancing abzustimmen. Schwierigkeit des Bogenschießens und Anzahl benötigter Pfeile ändern sich ja schon. Letzteres kann insbesondere problematisch sein, wenn es "besondere" Pfeile in begrenzter Stückzahl gibt. Daher würden wir vermutlich die Option nutzen, dass Pfeile nicht wieder eingesammelt werden können. (Dafür gab es doch eine ganz einfache Variable, die wir umstellen können?)
Danke für den Einblick in den - ich nenn es mal - Entscheidungsprozess. Das hilft mir das ganze besser zu verstehen. Tatsächlich muss ich zugeben, dass das sehr gerechtfertigte Einwände sind. Hier schon mal ein paar Gedanken dazu, was bisher schon möglich ist und was ich verbessern will:
Die Option Pfeile aufzusammeln (siehe diese Konstante in der Config) lässt sich tatsächlich ausstellen.
Die Pfeile aufsammeln zu können ist allerdings ein übergreifendes Feature, dass auch aktiv ist, wenn man freies Zielen im Menu deaktiviert. Das bedeutet, man könnte Pfeile aufsammelbar machen und - weil es nicht über das Menu an- und ausstellbar ist - ergeben sich dadurch keine weiteren Balancingprobleme (weil es immer an ist).
Unter welchen Umständen Pfeile aufsammelbar sind, kann man in der Config hier (Kollision mit Welt/Objekten) und hier (Kollision mit NPCs) genaustens definieren. Wie dort schon beispielhaft eingebaut, kann man dort einen Zufallswert, oder eine Abhängigkeit von Oberflächenmaterial und -textur abfragen. Genauso könnte man dort auch festlegen, dass "besondere" Pfeile immer beim Aufprall zerstört werden, um sie als "Einwegpfeile" zu definieren und deren übermässigen Einsatz zu kontrollieren/balancieren.
Auf der anderen Seite ist es aber auch richtig, dass man im bisherigen Zustand mit freiem Zielen wesentlich häufiger trifft als ohne. Wie die Streuung mit dem Bogen-/Armbrusttalent zusammenhängt überarbeite ich gerade und will die Trefferchance mit ohne-freies-Zielen abgleichen, um das Balanceproblem zwischen freiem Zielen und normalem Zielen auszuräumen.
Generell will ich G2FreeAim so verbessern, dass es technisch keine Imbalance mehr zwischen freiem Zielen und ohne-freiem-Zielen gibt. Das sollte das nahtlose Einbauen in ein Modprojekt dann einfacher machen.
Zitat von ukur
Hi, I use to hero and NPC's custom LeGo bars for HP that colored to green when its poisoned. For NPC's I get other.attribute[ATR_HITPOINTS], other.attribute[ATR_HITPOINTS_MAX] and other aivar for poison status from Loop functioun with "if(Hlp_Is_oCNpc(her.focus_vob))" or "if(Npc_GetTarget(hero))", that work before I start use free aim. When I start aiming with bow, crossbow or magic, function don't get other attributes to custom bars. How I can solved this problem?
Zitat von Lehona
That's because Free Aim is using a helper vob (I think), which obviously is a zCVob, not an oCNpc.
Although Lehona is right about the helper vob, this does not affect the focus vob. her.focus_vob is maintained and it should work (after all the npc you are aiming at still appears in the focus). Npc_GetTarget, however, is always set to zero by G2FreeAim for different reasons. I could look into reworking that. Can you confirm that "if(Hlp_Is_oCNpc(her.focus_vob))" does actually work?
Nevertheless, I think Lehona's suggestion for hooking the healthbars directly might be more elegant and reliable anyway.
I try "if(Npc_GetTarget(hero))", then "if(Hlp_Is_oCNpc(her.focus_vob))", both don't working with free aim.
That block working if I don't freeaim mode.
I cannot reproduce your problem. For me it works. This is the code I used, called every frame by FrameFunction (yours is grey):
Code:
FF_ApplyOnce(ff_herFocus); // In INIT_Global
/* ... */
func void ff_herFocus() {
var int NPC_HPBarShow;
var int NPC_HPBar;
if(!Hlp_IsValidHandle(NPC_HPBar)) {
NPC_HPBar = Bar_Create(GothicBar@);
};
var oCNpc her; her = Hlp_GetNpc(hero);
if(Hlp_Is_oCNpc(her.focus_vob))
{
var c_npc targetNpc; targetNpc = MEM_PtrToInst(her.focus_vob);
MEM_Info(targetNpc.name); // DEBUG
Bar_SetMax(NPC_HPBar, targetNpc.attribute[ATR_HITPOINTS_MAX]);
Bar_SetValue(NPC_HPBar, targetNpc.attribute[ATR_HITPOINTS]);
if(NPC_HPBarShow == FALSE)
{
Bar_Show(NPC_HPBar);
NPC_HPBarShow = TRUE;
};
//if(targetNpc.aivar[AIV_NPCIsPoisoned] > 0)
//{
// Bar_SetBarTex(NPC_HPBar, "Bar_Poison_Mod.tga");
//}
//else
//{
// Bar_SetBarTex(NPC_HPBar, "Bar_Health_Mod.tga");
//};
} else if (NPC_HPBarShow) {
Bar_Hide(NPC_HPBar);
NPC_HPBarShow = FALSE;
};
};
You could add this debugging output (marked in green) to your code, to check whether the problem doesn't lie somewhere else. Maybe you could provide more context when your function is called. Is it called every frame, is it a hook, etc.?
I cannot reproduce your problem. For me it works. This is the code I used, called every frame by FrameFunction (yours is grey)
I use that function FF_ApplyOnce(B_GlobalLoop); in first dialog with first NPC.
Zitat von mud-freak
You could add this debugging output (marked in green) to your code, to check whether the problem doesn't lie somewhere else. Maybe you could provide more context when your function is called. Is it called every frame, is it a hook, etc.?
Name NPC in focus write in LOG, but i also see custom NPC HP bar while I not use aiming.
"[i] [....2354...]
[i] 00:17 Info: 0 Q: Диего
[i] 00:17 Info: 0 Q: Диего
[i] 00:17 Info: 0 Q: Диего
[i] 00:17 Info: 0 Q: Диего
[i] 00:17 Info: 0 Q: Диего
[i] 00:17 Info: 0 Q: Диего
[i] 00:17 Info: 0 Q: Диего
[i] 00:17 Info: 0 Q: Диего
[i] 00:17 Info: 0 Q: Диего
[i] 00:17 Info: 0 Q: Диего
[i] 00:17 Info: 0 Q: Диего
[i] 00:17 Info: 0 Q: Диего
[i] 00:17 Info: 0 Q: Диего"
UPD!
Thank you very much for your help! The mistake was in my carelessness in big lines functions. I use script for show NPC HP bar with new condition if(Hlp_Is_oCNpc(her.focus_vob))
but i forgot old condition if(Npc_GetTarget(hero)) to hide NPC HP bar.
Now i use Show and Hide condition with if(Hlp_Is_oCNpc(her.focus_vob)) and HP NPC bar normal functions!
Ich habe zwar seit März nicht daran weiterarbeiten können und werde dazu auch bis auf weiteres erst einmal keine Zeit für haben, aber hier ein wenig alte Neuigkeiten.
Weil ich einige Änderungen seit v0.1.2 als wichtig erachte, wollte ich mittels eines "Pre-Releases" darauf hinweisen. Vielleicht hat sogar jemand Lust die vermerkten Änderungen anzutesten. Dieses Pre-Release ist ein Vorgeschmack auf einige weitere nette Verbesserungen, die ca. im Juni/Juli in v1.0.0 erscheinen werden.
Wichtig:
Diesmal (auch aus Gründen des Zeitmangels) ist kein automatisches Setup dabei. Das auch aus dem Grund, weil sich die Dateistruktur komplett geändert hat. Eine Abwärtskompatibilität ist also nur aufgrund der Funktionsnamen, nicht aber auf den Dateinamen gewährleistet. Die bisherigen G2 Free Aim Content-Skripte sollten also entfernt werden. Dazu reicht es lediglich den Ordner _work\data\Scripts\Content\freeAim zu löschen. Mögliche Änderungen in der Config sollten vorher gesichert werden und können problemlos in den gleichnamigen Funktionen anschliessend wieder eingetragen werden. Die Config ist nun aufgeteilten in verschiedene Dateien, die sich im Unterordner freeAim\config befinden.
Die Änderungen enthalten einige Bug-Fixes, Verbesserungen und eine erste Unterstützung der Gothic 2 Steuerung. Ich empfehle diese neuen Skripte besonders wegen eines enormen Performance-Boosts.
Code in verschiedene Dateien aufgeteilt (bessere Lesbarkeit)
Erste Implementierung für Gothic 2 Steuerung (Stabilität bisher nicht vollständig getestet)
Verbesserter Umgang mit Trace Rays (ca. zehn-facher Performance-Boost)
Zauber stoppen nun nicht mehr mitten in der Luft (siehe Post)
Flugbahn von Projektilen korrigiert (diese fliegen nun vernünftig aufs Fadenkreuz zu)
Neue kritische Trefferzonen für (fast) alle Gothic 2 Wesen (siehe hier für eine Liste) - alles Headshots. Bisher war die Trefferzone zu gross und nicht für jedes Wesen angepasst.
Bugfix für nicht reagierende KI, wenn man aus zu weiter Entfernung schiesst (siehe Post)
Da es sich nur um ein "Pre-Release" handelt, sind die Änderungen nicht ausgiebig getestet. Wenn also jemand einen Bug entdeckt würde ich mich über Feedback freuen.
Echt toll, dass du immer noch am Freien Zielen weiterarbeitest!
Leider bin ich was Scripts betrifft, nie weit über Quests, Startup und PFX hinausgekommen.
D.h. wenn ich was testen sollte, bräuchte ich Ikarus und LeGo - kann ich sonst noch was falsch machen? Gut möglich, dass ich ansonsten Bugs reporte, die nur meiner unzureichenden Fähigkeiten zuzuschreiben sind.
Echt toll, dass du immer noch am Freien Zielen weiterarbeitest!
Leider bin ich was Scripts betrifft, nie weit über Quests, Startup und PFX hinausgekommen.
D.h. wenn ich was testen sollte, bräuchte ich Ikarus und LeGo - kann ich sonst noch was falsch machen? Gut möglich, dass ich ansonsten Bugs reporte, die nur meiner unzureichenden Fähigkeiten zuzuschreiben sind.
Danke. Das ist gut zu hören!
Du kannst dich mal dran versuchen. Hier gibt es eine Installationsanleitung, die, wie ich mittlerweile finde, sehr kompliziert wirkt. Sollte ich dann auch mal ändern. Ab Punkt vier sind die Anweisung etwas umständlich. Falls es also nicht hinhaut, meld dich ruhig hier noch einmal. Im Grunde ist die Installation nicht so wild.
EDIT:
Hier ein paar Anstösse für dich zum Vergleichen.
Am Ende sollte der Anfang deiner Gothic.src ca. so aussehen:
Was die Menü-Skripte angeht, weiss ich das gerade nicht auswendig und kann das leider gerade nicht genau nachschauen. Zur Not kannst du alles ab Punkt vier in der Installationsanleitung weglassen - dort wird nur die Menü-Option zum An- und Ausschalten eingepflegt. Obwohl das fürs Testen nicht ganz unwichtig wäre (z.B. ob an- und ausschalten auch mit aktivierter Gothic 2 Steuerung funktioniert).
Vielleicht kann dort jemand aushelfen, wie das Skript _work\data\Scripts\System\Menu\Menu_Opt_Game.d anschliessend aussieht.
Geändert von mud-freak (25.04.2017 um 12:20 Uhr)
Grund: Installationshinweise hinzugefügt
[Bild: spineSignature.php?name=Migos]
Entwickler von Jharkendar-Online Deathmatch & Roleplay (zu finden in Spine).
Komm doch auf unseren Discord und lerne unsere nette Community kennen.
Mal gucken, was gerade entwickelt wird? Hier ist unsere Roadmap.
Hallo, ich habe eine Frage und würde mich sehr über Meinungen und Ideen freuen.
Sorry für diesen langen Post. Ich habe versucht mein Problem möglichst einfach zu erklären, dass jeder seinen Senf dazu geben kann. Bitte teilt doch eure Gedanken und Ideen dazu, denn ich steh komplett auf dem Schlauch und weiss da echt nicht weiter.
Wer möchte kann es als Rätsel oder Knobelaufgabe beachten. Vielen Dank an alle, die sich die Zeit nehmen, den Text durchzulesen.
Ein bisher verbleibender Nachteil beim freien Zielen ist es, dass sich das Bogentalent nicht mit der Trefferchance übereinstimmen lässt. Im Charaktermenu bedeutet 10% Bogentalent klassisch, dass 10% aller Schüsse treffen. Im Original wird das einfach per Zufallszahl gewährleistet, beim freien Zielen sieht man aber wie ein Pfeil physikalisch trifft oder nicht. Das freie Zielen muss also wirklich 10% der Pfeile treffen lassen, gleichzeitig aber auch 100% der Pfeile bei 100% Bogentalent.
Nun wo ist das Problem?
Gothics Hitregistration (also wann ein Pfeil einen NPC trifft oder nicht) hängt nicht vom Model, sondern rein von den Boundingboxen ab. Ein Gegner ist also eine riesen Zielscheibe, da die Boundingbox sehr grosszügig gross ist. Pfeile bei 10% Bogentalent müssen also mit sehr grosser Streuung verschickt werden, damit wirklich nur 10% der Pfeile treffen und auch wieder 100% der Pfeile bei 100% Bogentalent. Also einfach alles hochskalieren.
Problem gelöst?
Leider nicht, denn damit auch wirklich erst bei 100% alle Pfeile treffen und nicht schon bei 80% oder 90% muss die Streuung bis zu letzt eine gewisse Grösse haben. Das führt aber dazu, dass kritische Treffer komplett nutzlos werden, denn bei 100% ist die Streuung noch so gross, dass es viel zu schwer wird einen kritischen Treffer (z.B. einen Kopfschuss) verlässlich zu landen. Das kann man nicht als 100% Talent verkaufen (sieht auch dumm aus, wenn man mit 100% immer noch nicht genau dahin schiesst wo man hinzielt).
Ein Beispiel-video im Spiel kann ich leider gerade nicht entwerfen aber hier einige Illustrationen:
[Bild: freeAimScattering.png]
Im ersten Bild links seht ihr das Szenario mit der Streuung. Ein Schuss kann, je nach Bogentalent, mit bestimmten Winklen (grün und blau) von der perfekten Flugbahn abweichen und in dem grauen Umkreis mit entsprechendem Radius landen. (Oben drüber steht noch mal die Angabe von 15 Metern um es mit den Originaltrefferchancen zu vergleichen. Nicht so wichtig.)
Rechts im ersten Bild sind zwei Fälle (A und B) mit exemplarischen Werten gelistet.
In A stimmt das Bogentalent mit der Trefferchance überein (grün), aber kritische Treffer sind selbst bei 100% Bogentalent noch sehr schwierig, wegen zu grosser Streuung (2° in alle Richtungen, rot).
In B sind kritische Treffer mit 100% Bogentalent wirklich verlässlich zu treffen (fast 0° Abweichung vom perfekten Schuss, grün), dafür entspricht das Bogentalent nicht der Trefferchance (man trifft viel zu häufig, da die Streuung insgesamt zu klein ist).
[Bild: figureScatter_AB.png]
Im zweiten Bild sind diese beiden Fälle A und B noch einmal anders visualisiert. Für vier verschiedene Bogentalente (10%, 40%, 75% und 100%) sind in blau die Treffer markiert und in rot verfehlte Schüsse (500 "Schüsse" insgesamt). Der graue Kreis zeigt, welcher Radius als Treffer behandelt wird, was durchschnittlich ziemlich gut mit der Grösse der Boundingboxen übereinstimmt.
In B (unten im zweiten Bild) ist das Bogentalent auch so mit den Treffern skaliert, dass genau alles so trifft wie es soll, nur eben mit viel viel kleinerer Streuung. Dadurch trifft man mit 100% Bogentalent genau wo man hinzielt, allerdings treffen Bogentalente wie 10% viel zu häufig, da die Hitregistrierung bei NPCs halt sehr grob ist.
Theoretisch ließe sich eine 10% Treffer-Wahrscheinlichkeit ja auch so einbauen:
Mit 10% Wahrscheinlichkeit landet der Pfeil genau dort, wo man hinzielt.
Mit 90% Wahrscheinlichkeit verzieht er sehr stark (sagen wir mal, jeweils 10-20 Grad daneben nach links / rechts und oben / unten).
Deine bisherige Methode scheint mir ja eher in die Richtung zu gehen, dass es einen kleiner werdenden Kreis gibt, in den man schießt und dann innerhalb des Kreises zufällig getroffen wird, so dass insgesamt die Trefferwahrscheinlichkeit in etwa passend ist.
Ich könnte mir vorstellen, dass eine Kombination der beiden Methoden im Spiel akzeptabel wäre. Im Spiel wäre es dann bei 90% so, dass man eben ab und an mal mit dem Bogen abgerutscht ist oder zum falschen Zeitpunkt geatmet oder sonst wie gezittert hat.
Das ganze so auszutarieren, dass die Trefferwahrscheinlichkeit überall (sowohl mit 10% als auch mit 90%) in etwa hinkommt, ist natürlich ein Gefummel, aber im Großen und Ganzen denke ich, dass es möglich sein sollte. Dabei sollte man, um dein Problem tatsächlich zu lösen, vermutlich dafür sorgen, dass die "groben Schnitzer" bei hohem Bogentalent tatsächlich für alle Fehlschüsse zuständig sind und sonstige Treffer sehr präzise sind. Bei geringem Bogentalent hingegen ist es eine Mischung aus beidem: öfter mal geht der Pfeil ganz daneben, ab auch die große Streuung sorgt für Fehlschüsse.
Wir haben uns gedanklich auch schon mit dem Thema beschäftigt, da uns das Freie Zielen auch etwas zu stark vorkam. Das eigentliche Balancing-Problem ist ja derzeit, dass man praktisch kein Bogentalent braucht.
Wir haben uns daher entschieden, eher etwas an dem Balancing der Bögen zu drehen, um das Bogentalent trotzdem nützlich zu machen. Dafür planen wir, die Schadenswerte aller Bögen zu halbieren und den Prozentsatz des Bogentalentes als kritische Trefferwahrscheinlichkeit einzuführen. 10% Bogentalent bedeutet in diesem Fall eine 10%ige Wahrscheinlichkeit auf doppelten Schaden. Wenn man 100% Bogentalent hat, trifft man demzufolge immer mit doppeltem Schaden und hat so wieder normal starke Bögen. Das ganze gilt dann natürlich analog für Armbrüste.
Das ist natürlich keine richtige Lösung für dein Problem, ich wollte nur mal aufzeigen, was wir derzeit geplant hatten. Sorry, dass ich dir nicht mit Mathe oder irgendwelchen anderen Ratschlägen zur Hilfe eilen kann.
Wir haben uns gedanklich auch schon mit dem Thema beschäftigt, da uns das Freie Zielen auch etwas zu stark vorkam. Das eigentliche Balancing-Problem ist ja derzeit, dass man praktisch kein Bogentalent braucht.
Wir haben uns daher entschieden, eher etwas an dem Balancing der Bögen zu drehen, um das Bogentalent trotzdem nützlich zu machen. Dafür planen wir, die Schadenswerte aller Bögen zu halbieren und den Prozentsatz des Bogentalentes als kritische Trefferwahrscheinlichkeit einzuführen. 10% Bogentalent bedeutet in diesem Fall eine 10%ige Wahrscheinlichkeit auf doppelten Schaden. Wenn man 100% Bogentalent hat, trifft man demzufolge immer mit doppeltem Schaden und hat so wieder normal starke Bögen. Das ganze gilt dann natürlich analog für Armbrüste.
Das ist natürlich keine richtige Lösung für dein Problem, ich wollte nur mal aufzeigen, was wir derzeit geplant hatten. Sorry, dass ich dir nicht mit Mathe oder irgendwelchen anderen Ratschlägen zur Hilfe eilen kann.
Ich habe mich bewusst nun doch für "Freies Zielen" entschieden. Ich habe extra dafür eine neue Schadensberechnung eingefügt.
Die Lösung für das Problem ist es, den Abschuss-Winkel nicht aus einem gleichverteilten Intervall zufällig zu berechnen,
sondern unterschiedliche Wahrscheinlichkeiten für unterschiedliche Winkel-Bereiche (Intervalle) zu nutzen.
Ausgeblendete Probleme:
- Unterschiedliche Ziele haben unterschiedlich große Bounding-Boxen
- Die Crit-Bounding-Box befindet sich nicht exakt in der Mitte der Bounding-Box
In Pseudo-Mathe:
Spoiler:(zum lesen bitte Text markieren)
Annahme: Der Spieler zielt entweder exakt in die Mitte der Bounding-Box, oder in die Mitte der Crit-Bounding-Box
Abweich-Winkel eines ausgeführten Schusses ("Fehler"), den wir ausrechnen wollen:= r
Maximaler Abweich-Winkel:= rmax
Für Hit benötigter Winkel:= rhit (festgelegt durch Bounding-Box des Ziels, wenn Spieler in deren Mitte zielt)
Für Crit benötigter Winkel:= rcrit (festgelegt durch Crit-Bounding-Box des Ziels, wenn Spieler in deren Mitte zielt)
Es gilt: 0 < rcrit < rhit < rmax < 180
Bogentalent:= skill (1 = 100%, frei wählbar, bestimmt, wie einfach es werden soll, einen Hitzu landen)
Wahrscheinlichkeit, einen Hit zu landen:= phit
Wahrscheinlichkeit, einen Crit zu landen:= pcrit
Wahrscheinlichkeit, dass ein Hit ein Crit ist:= critchance (frei wählbar, bestimmt wie einfach es werden soll, einen Crit zu landen)
Zufallsfunktion:= rand(r1, r2)
Berechnet eine Zufallszahl zwischen r1 und r2 (gleichverteilt)
Ziele (folgendes soll wahr sein):
Spoiler:(zum lesen bitte Text markieren)
phit = skill
pcrit = phit * critchance
Einfache Möglichkeiten, r zu berechnen, die aber alle nicht das Ziel erfüllen:
Offensichtlich sind alle diese Lösungen zu simpel und erfüllen nicht das Ziel (bzw. müsste man ständig die Bounding-Boxen an skill und critchance anpassen, damit die Ziele erfüllt werden).
Korrekte Art, r zu berechnen (Aufteilen des Winkels r in mehrere Zonen):
Spoiler:(zum lesen bitte Text markieren)
rZoneCrit = rand(0, rcrit) => grantiertert crit
rZoneHit = rand(rcrit, rhit) => garantiert hit, aber kein crit
rZoneMiss = rand(rhit, rmax) => garantiert weder hit noch crit (= miss)
Jetzt brauchen wir brauchen eine nicht-gleichverteilte Wahrscheinlichkeit, die wir uns leicht aus einer gleichverteilten basteln können, um daraus zu entscheiden, aus welcher Zone wir den zufälligen Winkel berechnen:
zone = rand(0, 1)
r = {
rZoneCrit if 0 < zone < pcrit,
rZoneHit if pcrit < zone < phit,
rZoneMiss if phit < zone < 1
}
Jetz nur noch pcrit und phit ausrechnen (siehe Ziele) und fertig.
Jetzt fliegen die Pfeile mit exakt der richtigen Wahrscheinlichkeit in die entsprechenden Winkel-bereiche.
Auch schön ist, dass man rmax frei wählen kann. Solange rmax groß genug ist, dass man auch wirklich nicht trifft,
wenn rZoneMiss berechnet wird, kann man fmax nach ästhetischen Gesichtspunkten auswählen.
Edit:
Zeug korrigiert.
PS: Das nächste schwierige Problem ist dann, rhit und rcrit zu bestimmen. Letztendlich läuft es darauf hinaus, dass man große Dinge viel einfacher treffen können wird als kleine Dinge. Aber so funktioniert nunmal die Realität auch^^.
Edit2:
Mit der gleichen Methode kann man auch noch mehr Zonen hinzufügen, um z.B. zwischen knappen und starken Danebenschießen zu unterschieden (z.B. mit rZoneNearMiss und rZoneFarMiss), und kann die Wahrscheinlichkeiten dann auch wieder von skill abhängig machen, sodass man mit höherem Skill, wenn man nich trifft, wenigstens knapper daneben schießt.
Wenn man das weiterdenkt, kommt man irgendwann zu dem Punkt, wo man unendlich viele Zonen mit unterschiedlichen Wahrscheinlichkeiten haben möchte (d.h. einfach, dass der Übergang zwischen den Wahrscheinlichkeiten fließend ist), und das ganze ohne den Bounding-Box Kram machen will. Dann definiert man einfach eine Umverteilungsfunktion:
zone = rand(0, 1);
r = zone^(1,5 - skill) * rmax
=>
- skill = 0 => exponentielle Verteilung, d.h. man es ist viel wahrscheinlicher dass man stark daneben schießt als dass man knapp daneben schießt/trifft.
- skill = 0.5 => lineare Verteilung, also alle Winkel zwischen 0 und rmax sind gleich wahrscheinlich
- skill = 1 => Wurzel-Verteilung bei , d.h. es ist viel wahrscheinlicher dass man genau trifft als ungenau/gar nicht
Die Funktion kann man sich natürlich so zurechtbiegen, wie man das halt haben möchte.
habe mal ne Frage zu deinem Script. In dem video auf Youtube ist der Stand des Helden beim Abschuss der Pfeile ja immer wie der, des Anfängers. Gleichzeitig muss man einen Augenblick den Bogen gespannt lassen, damit der Cursor "enger" wird und die Treffergenauigkeit erhöht ist.
Ist es möglich das bei anderem Overlay (z.b. Meister) die Geschwindigkeit des verkleinern des Cursor beschleunigt wird? Also man schneller Pfeile mit höherer Genauigkeit schießen kann?
Dann würde ich das Script nämlich gerne nutzen wollen. Habe mir auch eine neue Schadensberechnung erstellt. Damit würde dieses Script sehr viel sinn machen.
beste Grüße
EDIT:
Nochmal in Kurz:
Untrainierter Schütze = längere Phase in der der Cursor enger wird.
besser trainierter Schütze = kürzere Phase in der der Cursor enger wird.