• Anmelden

Mitsch93

Drachentöter

  • »Mitsch93« ist der Autor dieses Themas

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Nachricht senden

1

Mittwoch, 10. August 2011, 17:03

Mehr Beute Skript

Hallo zusammen,

Nachdem ich erfolgreich meinen ersten Skript geschrieben habe ( :D ) , will ich mich
sofort an den nächsten begeben. Ich hatte da einen ,,Mehr Loot Skript" im Hinterkopf.
Mich nervt es ein wenig, dass man beim Maker pro Monster nur 1 Item einstellen kann, dass als Beute
fallen kann, deswegen kam ich auf die Idee.

Gedacht hatte ich das so, dass man in einer Art Array die MonsterIDs eingibt (nur von den Monstern, die auch Beute
fallen lassen). Außerdem werden in dem Array die Items und deren Dropchance angegeben (beliebig viele Items).
So z.B.
ID, Item1ID, Item1Wahr. , Item2ID, Item2Wahr. , ... usw.

Allerdings habe ich noch nichts gescriptet, was nichts mit Fenster bzw. Menüs zu tun habe.
Deshalb weiß ich erst garnicht wie ich anfangen soll und bräuchte "ein wenig" Hilfe :)

Ich verwende das RTAB Kampfscript, aber ich denke, dass es nicht allzuviel zu sagen hat, geht ja nur um die Beute.
RTAB-New Battle Script | RPG Studio
In Zeile 772 im KS beginnt die Lootausgabe.

2

Mittwoch, 10. August 2011, 20:37

Die Werte einfach so hintereinander in einen Array füllen würde ich persönlich nicht.

Im RPG Maker VX, bzw. RGSS2 gibt es eine Klasse RPG::Enemy::DropItem

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
module RPG
  class Enemy
    class DropItem
      def initialize
        @kind = 0       # Type of the drop item (0: none, 1: item, 2: weapon, 3: armor).
        @item_id = 1    # The item ID, when kind == 1.
        @weapon_id = 1  # The weapon ID, when kind == 2.
        @armor_id = 1   # The armor ID, when kind == 3.
        @denominator = 1 # N of the probability 1/N.
      end
      attr_accessor( :kind, :item_id, :weapon_id, :armor_id, :denominator )
    end
  end
end

So eine könntest du dir auch anlegen, um die Art des "DropItem"s zu speichern und die Wahrscheinlichkeit (1-100) mit der man es bekommt.
Diese Instanzen könntest du dann wiederum in einem Array speichern, falls du mehrere haben möchtest.

Ruby Quellcode

1
2
3
4
5
6
7
8
9
drop_items    = []
drop_items[0] = RPG::Enemy::DropItem.new
drop_items[0].kind = 1
drop_items[0].item_id = 1
drop_items[0].denominator = 50
drop_items[1] = RPG::Enemy::DropItem.new
drop_items[1].kind = 1
drop_items[1].item_id = 2
drop_items[1].denominator = 20

Und den Array mit der EnemyID des Gegners in Verbindung setzen, zum Beispiel in einem Hash.

Ruby Quellcode

1
Enemy_ItemDrop = { 4 => drop_items }
Und schon könntest du einfach in Scene_Battle darauf zugreifen, prüfen ob Items eingestellt sind, welcher Art, gegen die Wahrscheinlichkeit testen und so weiter.

Oder du machst es ganz anders, es gibt viele Möglichkeiten =)
Aber zu einer eigenen kleinen Klasse, um die DropItems zu speichern würde ich persönlich schon raten.

3

Mittwoch, 10. August 2011, 21:07

Öhm... ich unwissendes Wesen kann mich irren, aber willst du nicht einfach multiple Drops haben?
Google sagte, Blizzards Tons of Add-Ons würde helfen.
>Hier Klicken<
Habe gerade ins Script geschaut, und das soll wohl auch kompatibel mit dem RTAB sein.
(Musst nur das Zeug in Scriptpart 2 auf true stellen.)

Gruß,
Ryouko

Mitsch93

Drachentöter

  • »Mitsch93« ist der Autor dieses Themas

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Nachricht senden

4

Mittwoch, 10. August 2011, 21:55

Ich hab mir gerade mal die Addonsammlung angeguckt, scheint ziemlich viel drin zu sein und ist sehr komplex.
Leider kommen da Unmengen an Fehlermeldungen bei mir.
Aber trotzdem danke, der Skript sieht sehr interessant aus, vllt kann man da das ein oder andere herausbasteln.

@Playm:
Zum Verständnis: Mit folgendem Code könnte ich dann dem Monster zwei Items zuweisen?

Quellcode

1
2
3
4
5
6
7
8
drop_items[1] = RPG::Enemy::DropItem.new 
drop_items[1].kind = 1 
drop_items[1].item_id = 2 
drop_items[1].denominator = 20
drop_items[1] = RPG::Enemy::DropItem.new 
drop_items[1].kind = 2
drop_items[1].item_id = 3
drop_items[1].denominator = 50

5

Mittwoch, 10. August 2011, 23:17

Nein, mit dem Code steckst zu zwei Instanzen der Klasse RPG::Enemy::DropItem an Position 1 des Arrays der in der Variable drop_items gespeichert ist.

Ich habe dir jetzt kein fertigen Code gegeben, sondern nur ein paar Hinweise wie du es selber machen könntest. Ich habe das "ein wenig hilfe" so verstanden, dass du ein bisschen weißt und nur ein paar Tipps brauchst, wie man es angehen könnte.
Wenn du den Quellcode, der die Klasse RPG::Enemy::DropItem definiert in deinem Script Editor einfügst kannst du sie verwenden - das weißt du ja vermutlich schon. Diese Klasse wurde dafür ausgelegt ein Item, welches ein Gegner fallen lässt, zu speichern sowie die Wahrscheinlichkeit mit der dies geschieht.

Du kannst im Scripteditor dir nun eine Instanz dieser Klasse, also ein RPG::Enemy::DropItem-Objekt anlegen, so wie du ein Fensterobjekt erzeugen würdest:

Ruby Quellcode

1
2
3
neues_fenster = Window_Base.new( 0, 0, 320, 240 )
# analog
neues_drop_item = RPG::Enemy::DropItem.new()
Die Klasse RPG::Enemy::DropItem braucht beim Initialisieren keine Parameter im Gegensatz zur Klasse Window_Base. Die Attribute der Klasse (kind,item_id,denominator,...) stellst du später über dafür bereitgestellte getter- und setter-Methoden ein. Diese wurden in der Klasse durch attr_accessor(...) definiert.

Das Verwenden der DopItem Klasse, anstatt die Werte einfach so in einen Array zu schreiben hat den Vorteil der Übersichtlichkeit.
Bei einem Array würdest du mit eckigen Klammern auf den Wert zugreifen, und auf den ersten Blick erkennt man nicht was abgefragt wird, wenn du diesen Array dann nochmal in einen Array steckst, hast du zwei Klammerterme hintereinander was nicht sehr übersichtlich ist.
Bei der Verwendung der Klasse schreibst du einfach drop_item_objekt.kind und weißt, dass du abfragst welche Itemart fallengelassen wurde (Item/Weapon/Armor).

Du könntest die RPG::Enemy::DropItem Klasse auch verändern, dass du beim Initialisieren die Attribute festlegst.
Spoiler: Code Beispiel

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
module RPG
  class Enemy
    class DropItem
      def initialize( arg_kind=0, arg_id=1, arg_denominator=1)
        @kind = arg_kind # Type of the drop item (0: none, 1: item, 2: weapon, 3: armor).
        @item_id = (arg_kind == 1) ? arg_id : 1 # Trage hier die ID ein, wenn kind == 1 ist. Ansonsten trage 1 ein.
        @weapon_id = (arg_kind == 2) ? arg_id : 1 # Trage hier die ID ein, wenn kind == 2 ist. Ansonsten trage 1 ein.
        @armor_id = (arg_kind == 3) ? arg_id : 1 # Trage hier die ID ein, wenn kind == 3 ist. Ansonsten trage 1 ein.
        @denominator = arg_denominator # Wahrscheinlichkeit
      end
      attr_accessor( :kind, :item_id, :weapon_id, :armor_id, :denominator )
    end
  end
end
zum Lesen den Text mit der Maus markieren
Mit einer so veränderten Klasse, kannst du dann ein DropItem, welches einen großen Heiltrank darstellt (mit 75%) so erstellen:

Ruby Quellcode

1
neues_drop_item = RPG::Enemy::DropItem.new( 1, 3, 75 )
Ansonsten würdest du es halt so machen:

Ruby Quellcode

1
2
3
4
neues_drop_item = RPG::Enemy::DropItem.new()
neues_drop_item.kind = 1
neues_drop_item.item_id = 3
neues_drop_item.denominator = 75

Aber egal wie du es machst - dieses Item kannst du dir dann speichern.
Da es sich um eine konstante Speicherung handelt, würde ich zu einer Konstante raten (trivial). Da es aber etwas umständlich ist, für jeden Gegner in der Database eine eigene Konstante anzulegen, würde sich ein Array anbieten, wo die GegnerID der Index wäre (Also Gegner#1 hat an Indexposition 1 seine DropItems gespeichert und so weiter) - es seiden diese extra DropItems gelten nicht für alle, sondern nur für einige wenige Gegner - dann wäre ein Hash besser, der aber von aussen fast genauso zu benutzen ist wie ein Array.

Also legst du irgendwo im ScriptEditor ein Script an, wo du diese Zuweisungen speicherst:

Ruby Quellcode

1
2
3
4
5
Enemys_ItemDrop = Array.new()
Enemys_ItemDrop[ 1 ] = RPG::Enemy::DropItem.new( 2, 1,100 ) # BronzeSword, 100% Wahrscheinlichkeit
Enemys_ItemDrop[ 2 ] = RPG::Enemy::DropItem.new( 1, 3, 75 ) # großer Heiltrank, 75% Wahrscheinlichkeit
Enemys_ItemDrop[ 3 ] = RPG::Enemy::DropItem.new( 0 ) # kein Item
# und so weiter


Somit hast du nun schonmal die Werte - allerdings hast du jetzt wieder jedem Gegner nur ein Item zugewiesen. Du wolltest aber mehrere, dafür kann man wieder einen Array nehmen, bzw. einen pro Enemy:

Ruby Quellcode

1
2
3
4
5
Enemys_ItemDrop = Array.new()
Enemys_ItemDrop[ 1 ] = [ RPG::Enemy::DropItem.new( 2, 1,100 ), RPG::Enemy::DropItem.new( 3, 1,100 ) ]
Enemys_ItemDrop[ 2 ] = [ RPG::Enemy::DropItem.new( 1, 3, 75 ), RPG::Enemy::DropItem.new( 1, 3, 60 ) ]
Enemys_ItemDrop[ 3 ] = [ RPG::Enemy::DropItem.new( 0 ) ] # kein Item
# und so weiter


In der Scene_Battle, phase5 müsstest du dann erstmal pro Gegner auf die für den Gegner abgelegten Items zugreifen, indem du Enemys_ItemDrop als Index die EnemyID gibst, und dann durch den Array iterieren, und dann mit den Werten arbeiten.


Naja, keine Ahnung in wie weit dir das hilft ._." das ist jetzt nur eine Lösungsmöglichkeit die mir vorhin eingefallen war.
Du speicherst halt was fallen gelassen wird (am besten in einer eigenen Klasse, bzw. einer Instanz dieser), und irgendwo speicherst du halt wer das fallen lässt in einer Variable. Wenn ein Gegner mehreres falle lässt, dann speicher die mehreren Objekte am besten in einem Array.
Bei der vergabe der Kampfbeute guckst du halt nach, ob in der Variable für diese Gegner mehrere Gegenstände gespeichert sind, und gibst sie dann der Party.

Wenn du dir in Ruby noch unsicher bist, es gibt im BildScientia-Wiki einen guten Rubykurs von KaiD sowie eine recht brauchbare RGSS Dokumentation.

Social Bookmarks