Runden-Kampfsystem Tutorial

Das Board für Schwierigkeiten beim Adventure-Machen und zum Melden von Bugs
Post Reply
parkiii
An Adventure Creator
Posts: 276
Joined: 30 Jun 2009, 13:58
Location: Austria

Runden-Kampfsystem Tutorial

Post: # 78447Post parkiii
09 Aug 2011, 22:52

Ist zwar nicht mein Problem, aber mich haben schon einige Leute danach gefragt und deshalb poste ich es einfach mal hier rein.

Folgender Post beschreibt mein rundenbasiertes Kampfsystem in "Releven" anhand eines Beispiels.

parkiii
An Adventure Creator
Posts: 276
Joined: 30 Jun 2009, 13:58
Location: Austria

Re: Runden-Kampfsystem Tutorial

Post: # 78448Post parkiii
09 Aug 2011, 22:52

ich habe einen kampfbeginn-script der den kampf einleitet und einen kampfende-script, der ausgelöst wird, wenn der gegner besiegt wird.

KAMPF-BEGINN: "Kampf 002 - Dieb"

Code: Select all

(*Überall-Objekte entfernen*)
setobj (Einstellungen-Symbol ; 0)
setobj (neuerQuest ; 0)
setobj (Dummy 10x200 ; 0)
setobj (Dummy 10x20 ; 0)
setobj (Status-Menü ; 0)
setobj (Inventar-Menü ; 0)
setobj (Tagebuch-Menü ; 0)
setobj (Optionen-Menü ; 0)
moveobj (Status-Menü ; 630 ; 18 ; 0)
moveobj (Inventar-Menü ; 630 ; 53 ; 0)
moveobj (Tagebuch-Menü ; 630 ; 88 ; 0)
moveobj (Optionen-Menü ; 630 ; 123 ; 0)

(*Kampfraum laden*)
loadroom (001 - Talkämpfe)
beamto (self ; 001 - Talkämpfe ; 7 ; 16 ; 3)
beamto (Dieb ; 001 - Talkämpfe ; 20 ; 16 ; 4)

wait (0,05)

(*Kampfmenü anzeigen*)
subroom (Kampfmenü)
setobj (Kampfmenüauswahl ; 1)
textout (20 ; Angriff ; 70 ; 390 ; 2)
textout (21 ; Item ; 285 ; 390 ; 2)
textout (22 ; Aufgeben ; 450 ; 390 ; 2)

enablemenu (false)

enablemouse (true)

(*Wertefestlegung*)
setnum (Gegnertyp ; 2)  (* <<<--------- bestimmt Attacken *)

setstring (besiegt ; 002 - Dieb) (*um das richtige kampf-ende skript aufzurufen*)
setstring (Gegnername ; Dieb Lawrence)
setstring (Gegnerspezies ; Mensch)

setnum (LVL Gegner ; 1)
setnum (HP_max Gegner ; 180)
setnum (HP Gegner ; 180)
setnum (MP_max Gegner ; 0)
setnum (MP Gegner ; 0)
setnum (ATK Gegner ; 120)
setnum (DEF Gegner ; 40)
setnum (MAG Gegner ; 0)
setnum (MDEF Gegner ; 40)

setnum (Analysepunkte ; 20)


(*Anzeigen*)
textout (1 ; HP: [HP]/[HP_max] ; 45 ; 65 ; 3)
textout (2 ; MP: [MP]/[MP_max] ; 45 ; 83 ; 3)

textout (3 ; HP: [HP Gegner]/[HP_max Gegner] ; 430 ; 65 ; 3)
textout (4 ; MP: [MP Gegner]/[MP_max Gegner] ; 430 ; 83 ; 3)

textout (5 ; [Charaktername] ; 45 ; 11 ; 3)
textout (6 ; Level:[LVL] ; 45 ; 30 ; 3 ; 220 ; 175 ; 100)

(*EXP-Anzeige platzieren, da größere Zahlen mehr Platz brauchen*)
if_num (EXP ; <10)
textout (7 ; [EXP]/[EXP_lvlup] ; 180 ; 30 ; 3)

if_num (EXP ; >9)
{
if_num (EXP ; <100)
{
if_num (EXP_lvlup ; <100)
textout (7 ; [EXP]/[EXP_lvlup] ; 170 ; 30 ; 3)
}
}

if_num (EXP ; >9)
{
if_num (EXP ; <100)
{
if_num (EXP_lvlup ; >99)
textout (7 ; [EXP]/[EXP_lvlup] ; 160 ; 30 ; 3)
}
}

if_num (EXP ; >99)
{
if_num (EXP ; <1000)
{
if_num (EXP_lvlup ; <1000)
textout (7 ; [EXP]/[EXP_lvlup] ; 150 ; 30 ; 3)
}
}

if_num (EXP ; >99)
{
if_num (EXP ; <1000)
{
if_num (EXP_lvlup ; >999)
textout (7 ; [EXP]/[EXP_lvlup] ; 140 ; 30 ; 3)
}
}

if_num (EXP ; >999)
{
if_num (EXP ; <10000)
{
if_num (EXP_lvlup ; <10000)
textout (7 ; [EXP]/[EXP_lvlup] ; 130 ; 30 ; 3)
}
}

if_num (EXP ; >999)
{
if_num (EXP ; <10000)
{
if_num (EXP_lvlup ; >9999)
textout (7 ; [EXP]/[EXP_lvlup] ; 120 ; 30 ; 3)
}
}

textout (8 ; [Gegnername] ; 417 ; 11 ; 3)
textout (9 ; Level:[LVL Gegner] ; 417 ; 30 ; 3 ; 220 ; 175 ; 100)

-----------------------------------------

KAMPF-ENDE: "Besiegt 002 - Dieb"

Code: Select all

texthide (1)
texthide (2)
texthide (3)
texthide (4)

enablemouse (false)

setnum (HP Gegner ; 0)

   texthide (1)
   texthide (2)
   texthide (3)
   texthide (4)
   texthide (5)
   texthide (6)
   texthide (7)
   texthide (8)
   texthide (9)

subroom (Gegner besiegt)

(*Wieviel Geld und EXP bekommt man?*)
setnum (Gold erhalten ; 5)
setnum (EXP erhalten ; 3)

textout (60 ; Sieg! ; 280 ; 100 ; 2)
textout (61 ; Beute: ; 230 ; 150 ; 1)
textout (62 ; [EXP erhalten] EXP ; 230 ; 200 ; 6)
textout (63 ; [Gold erhalten] Gold ; 230 ; 223 ; 6)

setnum (EXP ; +[EXP erhalten])
setnum (Gold ; + [Gold erhalten])

stopskip ()
wait (3)

(*aus dem Kampfraum raus*)
hidealltext ()
return ()

loadroom (007 - Route 1)
beamto (Dieb ; BESIEGTE GEGNER ; 1 ; 1 ; 1) (*immer bei jedem neuen Gegner +2*)
                                            (*bei x=31 die y-Koordinate +1 und x=1*)
                                            (*bei x=31 und y=24 neuer Raum benötigt*)
beamto (self ; 007 - Route 1 ; 21 ; 13 ; 2)

(*Aktionen außerhalb des Kampfraumes*)

(*Statusboni rückgängig machen*)
setnum (DEF Bonus ; 0)
setnum (ATK Bonus ; 0)
setnum (MDEF Bonus ; 0)
setnum (MAG Bonus ; 0)

setnum (DEF Gegner Bonus ; 0)
setnum (ATK Gegner Bonus ; 0)
setnum (MDEF Gegner Bonus ; 0)
setnum (MAG Gegner Bonus ; 0)

setnum (DEF Status Symbol ; 0)
setnum (ATK Status Symbol ; 0)
setnum (MDEF Status Symbol ; 0)
setnum (MAG Status Symbol ; 0)

setnum (DEF Status Symbol Gegner; 0)
setnum (ATK Status Symbol Gegner; 0)
setnum (MDEF Status Symbol Gegner; 0)
setnum (MAG Status Symbol Gegner; 0)

(*Statusveränderungen zurücksetzen*)
(*GIFT*)
setobj (Statussymbol Gift ; 0)
setbool (Vergiftung selbst ; false)
setnum (Vergiftung selbst ; 0)
setobj (Statussymbol Gift1 ; 0)
setbool (Vergiftung Gegner ; false)
setnum (Vergiftung Gegner ; 0)
(*Analyse*)
setnum (Analysestatus ; 0)
setnum (Analyseprozent ; 0)
setobj (Statussymbol Analyse ; 0)

(*Gehen verfügbar machen*)
ifnot_num (EXP ; >[EXP_lvlup]-1)
{
setbool (Gehen verfügbar ; true)
enablemouse (true)
}

(*LEVEL UP*)
if_num (EXP ; >[EXP_lvlup]-1)
{
function (Level up)
}

(*Überall-Objekte wieder freischalten*)
setobj (Einstellungen-Symbol ; 1)
if_bool (neuerQuest ; true)
 setobj (neuerQuest ; 1)
---------------------------------------

mit dem kampfbeginn-script wird der kampfraum und das kampfmenü (als subroom) geladen, und wenn man dann den angriff-button klickt öffnet sich die attacken-auswahl als textszene (somit kann man leicht neue attacken "lernen", indem man einfach die neue attacke in der textszene freischaltet).

bei auswahl einer attacke spielt sich dann das jeweilige skript ab. hier beispielsweise das magie-skript "fulgor minor":

Code: Select all

(*MP abziehen*)
setnum (MP ; -10)

(*Angriffswert berechnen*)
setnum (Abweichung ; [MAG]/10)
setnum (Minimumattacke ; [MAG]-[Abweichung])
setnum (Korrektur ; [Minimumattacke]-1)

randomnum (ZufallsMAG ; [MAG]-[Minimumattacke]+1)
setnum (ZufallsMAG ; +[Korrektur])

(*----------Magiestärke miteinberechnen!!!----------*)
setnum (Magiekraft ; 30)

setnum (Angriffswert ; [ZufallsMAG]+[Magiekraft]+[MAG Bonus]-[MDEF Gegner]-[MDEF Gegner Bonus])

 if_num (Angriffswert ; <1)
 setnum (Angriffswert ; 0)

(*Attackenanzeige*)
textout (24 ; Fulgor Minor! ; 55 ; 310 ; 1 ; 0 ; 150 ; 255)
wait (1)

(*Angriffswert anzeigen / berechnen*)
textout (50 ; -[Angriffswert] ; 390 ; 240 ; 1 ; 255 ; 0 ; 0)
wait (1)
setnum (HP Gegner ; -[Angriffswert])
 if_num (HP Gegner ; <0)
 setnum (HP Gegner ; 0)
wait (1)
texthide (50)
texthide (24)



(*Gegner besiegt*)

 (*Butler Training*)
  if_num (Gegnertyp ; 1)
  {
   if_num (ButlerTraining ; 2)
   if_num (HP Gegner ; <4700)
   cutscene (Besiegt 001 - Butler - Zwischensequenz2)
   if_num (ButlerTraining ; 3)
   if_num (HP Gegner ; <4400)
   cutscene (Besiegt 001 - Butler - Zwischensequenz3)
  }
  
 (*alle anderen Gegner*)
  ifnot_num (Gegnertyp ; 1)
  {
   if_num (HP Gegner ; <1)
   cutscene (Besiegt [besiegt]) (*"besiegt"-string wird in kampf-beginn festgelegt)
  }


(*Vergiftung*)
if_num (HP Gegner ; >0)
if_bool (Vergiftung Gegner ; true)
cutscene (Vergiftung Gegner)

  
(*Gegnerische Runde*)
if_num (HP Gegner ; >0)
cutscene (Gegner Attacke)
nach dem angriff setzt der gegner seine attacke ein (sofern seine hp größer 0 sind, wenn hp kleiner 0, wird das kampf-ende skript aufgerufen)

GEGNER-ATTACKE:

Code: Select all

textout (23 ; Gegnerische Runde! ; 118 ; 355 ; 2 ; 255 ; 0 ; 0)

wait (2)
(*Gegnerische Runde! ausblenden*)
texthide (23)


(*---------------Hofmeister Training---------------*)
if_num (Gegnertyp ; 1)
 {
 if_num (ButlerTraining ; 1)  (*Normale Angriffe lernen*)
  {
  function (Gegner Hieb)
  wait (3,5)
  }
  
 if_num (ButlerTraining ; 2)  (*Magische Angriffe lernen*)
  {
  function (Gegner Fulgor Minor)
  wait (3,5)
  }
  
 if_num (ButlerTraining ; 3)  (*Spezialangriffe lernen*)
  {
  randomnum (Attackenart ; 2)
  if_num (Attackenart ; 1)
   {
   function (Gegner Hieb)
   wait (3,5)
   }
  if_num (Attackenart ; 2)
   {
   function (Gegner Fulgor Minor)
   wait (3,5)
   }
  }
 }
(*---------------Hofmeister Training Ende---------------*)




(*---------------GEGNERTYP 2---------------*)
if_num (Gegnertyp ; 2)
 {
 randomnum (Attackenart ; 2)
 
 setnum (Berechnung HP Stand ; [HP]/[HP_max])
 setnum (Berechnung HP Stand ; *100)
 if_num (Berechnung HP Stand ; <10)
 setnum (Attackenart ; 1)
 
  (*HIEB*)
 if_num (Attackenart ; 1)
  {
  function (Gegner Hieb)
  wait (3,5)
  }

  (*DOLCHSTOSS*)
 if_num (Attackenart ; 2)
  {
  function (Gegner Dolchstoß)
  wait (4)
  }
}
(*---------------GEGNERTYP 2 Ende---------------*)



(*---------------GEGNERTYP 3---------------*)
if_num (Gegnertyp ; 3)
 {
 if_num (MP Gegner ; 0)
  {
  randomnum (Attackenart ; 2)

  setnum (Berechnung HP Stand ; [HP]/[HP_max])
  setnum (Berechnung HP Stand ; *100)
  if_num (Berechnung HP Stand ; <10)
  setnum (Attackenart ; 1)

  (*HIEB*)
  if_num (Attackenart ; 1)
   {
   function (Gegner Hieb)
   wait (3,5)
   }

  (*DOLCHSTOSS*)
  if_num (Attackenart ; 2)
   {
   function (Gegner Dolchstoß)
   wait (4)
   }
  }

 (*MAGISCHE ATTACKE*)
 if_num (MP Gegner ; >0)
  {
  function (Gegner Fulgor Minor)
  wait (3,5)
  }
 }
(*---------------GEGNERTYP 3 Ende---------------*)



(*---------------GEGNERTYP 4---------------*)
if_num (Gegnertyp ; 4)
 {
 randomnum (Attackenart ; 4)
 if_num (MP Gegner ; 0)
 randomnum (Attackenart ; 2)
 
 setnum (Berechnung HP Stand ; [HP]/[HP_max])
 setnum (Berechnung HP Stand ; *100)
 if_num (Berechnung HP Stand ; <10)
 setnum (Attackenart ; 1)

 (*HIEB*)
 if_num (Attackenart ; 1)
  {
  function (Gegner Hieb)
  wait (3,5)
  }

 (*DOLCHSTOSS*)
 if_num (Attackenart ; 2)
  {
  function (Gegner Dolchstoß)
  wait (4)
  }

 (*MAGISCHE ATTACKE*)
 if_num (Attackenart ; >2)
  {
  function (Gegner Fulgor Minor)
  wait (3,5)
  }
 }
(*---------------GEGNERTYP 4 Ende---------------*)




(*Vergiftung selbst*)
if_bool (Vergiftung selbst ; true)
cutscene (Vergiftung selbst)



(*Runde des Spielers*)
subroom (Kampfmenü)
setobj (Kampfmenüauswahl ; 1)
setobj (Dummy Kampfmenü ; 1)
setobj (Dummy Kampfmenü1 ; 1)
setobj (Dummy Kampfmenü2 ; 1)
setbool (Kampfmenü Item offen ; false)
textout (20 ; Angriff ; 70 ; 390 ; 2)
textout (21 ; Item ; 285 ; 390 ; 2)
textout (22 ; Aufgeben ; 450 ; 390 ; 2)

enablemouse (true)
--> (hier sind nicht alle gegnertypen aufgelistet)

die verschiedenen gegnertypen ermöglichen verschiedene attacken und verschiedene verhaltensmuster:
zB:
• abwechselnd magische und physische attacken
• nur physische attacken
• nur magische attacken, bis MP nicht mehr ausreichen, dann physische attacken
• zufällig physische oder magische attacken
• immer die stärkste magische attacke, bis MP nicht mehr reichen, dann schwächere magische attacken
• stärkere attacken, sobald hp des gegners eine bestimmte grenze unterschreiten
• stärkere attacken, sobald eigene hp eine bestimmte grenze unterschreiten


und zu guter letzt laufen im main-skript folgende korrekturen und die hp-abfrage, falls der spieler verliert:

MAIN-SKRIPT-AUSZUG:

Code: Select all

(*HP unter 1*)
if_num (HP ; <1)
{
textout (1 ; HP: 0/[HP_max] ; 45 ; 65 ; 3)
return ()
hidealltext ()
enablemouse (false)
setfocus (none)
loadroom (Game over)
setnum (HP ; 1)
}


(*Werte größer als max.*)
if_num (HP ; >[HP_max])
setnum (HP ; [HP_max])
if_num (MP ; >[MP_max])
setnum (MP ; [MP_max])

(*Statuswerte berechnen*)
setnum (ATK ; [BasisATK]+[EquipATK])
setnum (DEF ; [BasisDEF]+[EquipDEF])
setnum (MAG ; [BasisMAG]+[EquipMAG])
setnum (MDEF ; [BasisMDEF]+[EquipMDEF])

(*Itemmaximum 99*)
if_num (HP Haselnuss ; >99)
setnum (HP Haselnuss ; 99)
if_num (HP Apfel ; >99)
setnum (HP Apfel ; 99)
if_num (HP Tropfen des Lebens ; >99)
setnum (HP Tropfen des Leben ; 99)
if_num (HP Essenz des Lebens ; >99)
setnum (HP Essenz des Leben ; 99)
if_num (HP Elixier des Lebens ; >99)
setnum (HP Elixier des Leben ; 99)
if_num (MP Heilblatt ; >99)
setnum (MP Heilblatt ; 99)
if_num (MP Heilkraut ; >99)
setnum (MP Heilkraut ; 99)
if_num (MP Tropfen der Magie ; >99)
setnum (MP Tropfen der Magie ; 99)
if_num (MP Essenz der Magie ; >99)
setnum (MP Essenz der Magie ; 99)
if_num (MP Elixier der Magie ; >99)
setnum (MP Elixier der Magie ; 99)

(*Gegner HP unter 0, um negative HP zu vermeiden*)
if_num (HP Gegner ; <0)
setnum (HP Gegner ; 0)

Humus Humanus
An Adventure Creator
Posts: 372
Joined: 07 Jun 2006, 15:17
Location: Eschweiler (NRW)
Contact:

Re: Runden-Kampfsystem Tutorial

Post: # 78449Post Humus Humanus
09 Aug 2011, 22:58

Nicht schlecht, nicht schlecht :D Da muss man ja echt einiges bedenken. Ich selbst würde das so wohl nie gut hinbekommen. Ich baue in ein anderes Parallel-Projekt (nicht das "Witzige" mit mir als Character :ugly2: ) auch grad ein Kampfsystem ein, löse das aber über "Quick-Time" Events (ist aber auch kein RPG und nutzt auch keine Maker-Grafik, ist gezeichnet).
An irgendetwas werde ich wohl gerade arbeiten, ja, doch. :D

parkiii
An Adventure Creator
Posts: 276
Joined: 30 Jun 2009, 13:58
Location: Austria

Re: Runden-Kampfsystem Tutorial

Post: # 78450Post parkiii
09 Aug 2011, 23:24

nun ja, der skriptaufwand steigt mit jedem extra, das man einbaut ^^
quick-time kämpfe sind auch gut zu skripten mit dem pacdk und bieten natürlich viel mehr action als mein rundenbasiertes ks.
zwar kann man die verschiedenen ks-arten kaum vergleichen, aber ich glaube, mit rundenbasierten ks kann man den taktischen aspekt am besten verwirklichen.

TheWae
Tutorial Reader
Posts: 53
Joined: 05 Nov 2011, 12:10

Re: Runden-Kampfsystem Tutorial

Post: # 82962Post TheWae
18 Feb 2016, 21:55

Hat jemand damit mal etwas gemacht? Würde es gerne in Action sehen :-)

Zimond
Der Engine Papa
Posts: 3420
Joined: 06 Apr 2003, 19:34
Location: Krefeld
Contact:

Re: Runden-Kampfsystem Tutorial

Post: # 82965Post Zimond
19 Feb 2016, 01:03

Sehr geil. Daumen Hoch. :thumbup:
Image

Post Reply