mmofacts.com

Flexible Fähigkeiten

gepostet vor 14 Jahre, 11 Monate von BlackScorp

Hallo leute,

ich meinem BG wollte ich Fähigkeiten(Skills) hinzufügen. Wie könnte ich es am flexibelsten machen? habe erstmal an sowas in der art gedacht wie ein skillarray ungefair sowas:

$skills['Bash']= array(

'level'=>1

'costs'=>20,//mana Kosten

'effekts'=>array(

$gegenerHp-=10+$attackpower,

);

$skills['Heal']=array(

'level'=>1

'costs'=>5

'effekts'=>array(

$meineHp += 100;

);

was aber wenn ich zb ein Skill habe der zb Items von Monster klaut oder mich Teleportiert oder mein Status für 5 runden verändert(zb Blindheit)

dann müsste ich ja für effekts funktionen einfügen.

Also ich weis garnicht wie ich es angehen soll, vllt hat sich ja hier schon mal einer mit einem RPG spiel beschäftig und könnte mir tipps geben wie ich skills definieren kann

also ich habe vor ein kleine RPG zu erstellen in dem ich runden basiert gegen NPCs kämpfe(Final Fantasy like) nur halt nicht in 3d. angriffe finden immer abwechseln statt

MFG

gepostet vor 14 Jahre, 11 Monate von buhrmi

Das hab ich damals in meinem ersten Game in 4 Sachen aufgeteilt:

1. Ein Attributsystem für Monster/Charakter (Stärke, Hitpoints, etc.)

2. Skills und Trainings

4. Fähigketen

5. Effekte (Buffs / Debuffs / Zustände)

Im Attributsystem sammelst du in einem Array die Werte deines Charakters. Attribute kann der Charakter durch Skill, die er erlernt bekommen, aber auch durch angelegte Items, etc.

Skills liegen in der Datenbank und geben an, welche Attribute sie auf deinen Charakter draufaddieren, wenn du sie gelernt hast. Also Tabelle Skills mit dem Feld "Attribute" und eine Tabelle Trainings mit den Feldern "character_id" und "skill_id".

Fähigkeiten sind klassen, die ihre eigene Methode haben, um zu schauen, ob sie benutzbar sind. Jede Klasse hat ihre Methode "isAvailable()", deren implementierung in etwa so aussieht: return $character->hasAttribute('canDoCoolenSkill'). Zusätzlich hat eine Klasse noch eine execute() Methode, die ausgeführt wird wenn der Charakter die Aktion einsetzt. z.b. $enemy->doDamage(34).

Effekte (z.b. "betäubt") sind Klassen, die für eine gewissen Zeit die Attribute des Charakters modifizieren. Der Effekt "betäubt" könnte dem Charakter z.b. die Attriibute 'cannot_attack', 'cannot_cast', 'cannot_move' hinzufügen. Damit es auswirkungen hat, würde man bei einer Fähigkeit in ihre isAvailable() Methode noch beispielsweise die abfrage "&& !$character->hasAttribute('cannot_attack')" hinzufügen.

Sorry wenn es nicht so verständlich geschrieben ist, hab gerade wenig Zeit :) 

Es ist nicht die "beste" Lösung für ein flexibles Kampfsystem aber es war damals für den Anfang am einfachsten zu durchschauen. Vielleicht findest du ja ein paar Ansätze. Mittlerweile kommen dafür haufenweise Metaprogrammierung und eine eigene DSL wie sich die Attribute gegenseitig beeinflussen zum Einsatz, aber das braucht man für den Anfang alles nicht. 

gepostet vor 14 Jahre, 11 Monate von BlackScorp

vielen dank, werde mal sehen was ich da hinzaubern kann:D

gepostet vor 14 Jahre, 9 Monate von NeoArmageddon

Aloha,

ich beschäftige mich ebenfalls gerade mit einem ähnlichen System mit Fähigkeiten, Skills und Buffs. Wenn ich das richtig verstanden haben sollte, greift deine isAviable() bei jedem Aufruf auf div. Tabellen zu, sehe ich das richtig?

Ich mache es momentan so, Userstats, Skills und Buffs in seperaten Tabellen speichere, die Effekte jedoch bei jeder Ändeuerung direkt in der Usertabelle mit abgeändert werden. SO brauche ich im Kampf nur einmal die Usertable abfragen (was ich eh machen muss) und brauch mich um den Rest nicht kümmern, jedoch dienen sie mir als Wertekontrolle. Lohnt sich so ein System in Sachen Datenbankgeschwindigkeit/Anzahl der DB Zugriffe oder ist es dem Server eher egal, ob ich nun jede Aktion 2 oder 6 Datenbabkzugriffe habe?

Auf diese Diskussion antworten