Ergebnis 1 bis 14 von 14

Thema: [Ace] Wie speichere ich Einkaufs- und Verkaufsmengen im Shop?

  1. #1

    [Ace] Wie speichere ich Einkaufs- und Verkaufsmengen im Shop?

    Hey, Leute. Ich arbeite gerade an meinem Shop-Menü. Es handelt sich um den Standard-Shop, den der Ace mitliefert d.h. kein externes Script so far. Ich frag mich hier gerade folgendes: Wenn ich jetzt in diesem Shop zwei Heiltränke verkaufe und fünf Heiltränke später dazu kaufe... kann ich diese Werte dauerhaft in Variablen speichern, die ich verändern kann, sobald ich wieder kaufe oder verkaufe, und wenn ja, wie krieg ich das gedeichselt? Ich seh hier gerade im Maker selbst nur die Möglichkeit die Itemanzahl in Variablen zu speichern.

    Ich brauche Kauf und Verkauf pro Item jeweils in zwei unterschiedlichen Variablen. Es wäre auch nice zu wissen, welches Item ich in welchem Shop verkauft oder gekauft habe. Ich erläutere das eben.

    Beispiel 1:
    Verkaufe zwei Heiltränke
    V001 [Heiltränke Verkauft] - 2

    Kaufe fünf Heiltränke
    V002 [Heiltränke Gekauft] + 5

    Beispiel 2:
    Verkaufe acht Manatränke
    V003 [Manatränke Verkauft] - 8

    Kaufe vierundzwanzig Manatränke
    V004 [Manatränke Gekauft] + 24

    Hat hier jemand die nötige Knowledge, um mir zu sagen, wie das gehen kann? Es ist auch möglich, dass das hier ganz simpel umsetzbar ist und euer Kot-Ken hier gerade den Wald vor lauter Bäumen nicht sieht. So oder so finden wir möglicherweise eine Lösung.

    Ken der Lösungskot

    Geändert von Ken der Kot (09.01.2019 um 10:21 Uhr)

  2. #2
    Ich hab leider keine Ahnung, was der VX Ace da so an Möglichkeiten bietet - im 2k/3 würde ich das so lösen:

    Code:
    <>Set V[0001: Item-ID] = 1
    <>Set V[0002: Variablen-ID] = 4000
    <>Label :1
    <>If Switch[0001: Compare inventory] = OFF
      <>Set V[V[0002]] = Item ID V[0001]  amount owned
    :ELSE CASE
      <>Set V[V[0002]] - Item ID V[0001]  amount owned
    :END CASE
    <>Set Range V[0001-0002] + 1
    <>If V[0002] <= (ID des letzten Items in der Database)
      <>Jump to Label: 1
    :END CASE
    <>Toggle Switch [0001]
    Das speichert dir in die Variablen ab 4000 ein, wie oft der Spieler welches Item hat. Das rufst du als Common Event auf, nach vollbrachter Arbeit setzt das CE den Switch 0001 auf ON. Nun kauft der Spieler ein. Danach lässt du das selbe Script noch einmal laufen, aber diesmal ist der Switch bereits ON, das Script subtrahiert also diesmal den Bestand. Danach geben dir die Variablen ab 4000 genau aus, wie sich der Itembestand im Inventar durch den Einkauf verändert hat, wobei 4000 = Item 1 in der Database, 4001 = Item 2, usw.

    ...ich weiß bloß nicht, ob der VX Ace es erlaubt, Variablen über andere Variablen anzupointern ("Wähle die Variable aus, deren ID in Variable 0002 gespeichert ist"). Wenn nein, dann... ist das ein ziemlicher Aufwand. :'X

    Das größte Problem ist aber, dass, wenn du das für jeden Shop einzeln speichern willst, du eine ziemliche Menge an Variablen brauchst. Da gibt es auch Möglichkeiten, das noch einzugrenzen, da wird es aber dann etwas esoterisch.

    EDIT: Oder brauchst du das gar nicht aufgeschlüsselt für die einzelnen Items pro Shop, sondern nur wie viel insg. ge/verkauft wurde? Dann ist das ne recht simple Sache und man muss das Common Event da nur ein bisschen erweitern, bzw. du bräuchtest dann nur einen Satz Variablen gemäß der Zahl der Items in der Database + zwei(!) Variablen je Shop.

    Geändert von BDraw (09.01.2019 um 18:03 Uhr)

  3. #3
    Die "Billigvariante" ganz ohne Skript:
    Frage vor dem Shop-Aufruf die Anzahl der Items ab und nach dem Shopaufruf nochmal.
    Für verschiedene Shops musst du dann verschiedene Variablen nehmen; das wird dann schon relativ viel, weil du Items x Shops viele Variablen brauchst. Die Variablen kannst du dann später einfach zusammenzählen und kommst auf ein Gesamtergebnis.


    Das hat natürlich den Effekt, dass du nicht wirklich kaufen und verkaufen zählst. D.h. wenn ein Spieler einen Heiltrank verkauft und danach gleich wieder einen kauft, würde die Methode das hier nicht bemerken.
    Du kannst auch in den Skripten suchen, wo Items gekauft / verkauft werden und dort jeweils eine Variable hochzählen. Das wird aber auch unübersichtlich, weil du so wieder für jedes Item eine eigene Abfrage schreiben musst... Sofern du dich da nicht mit Arrays auskenns . Das ist aber schon etwas weiterführend; und ich weiß nicht, inwiefern du da schon in der Programmierung drin steckst.

    Geändert von Caledoriv (09.01.2019 um 18:02 Uhr)

  4. #4
    Wow, danke BDraw. Aber wenn ich ehrlich bin versteh ich nur ganz viel Bahnhof. Mann, und ich dachte ich hätte was drauf mit Events, aber hier steig ich kaum noch durch. Aber keine Sorge, ich probier das mal in aller Ruhe aus und schau, auf welche Reise mich dein Code schickt. Heißen Dank!

    Kann sein, dass ich nochmal auf dich zukomme, wenn es zwar funktioniert, ich aber noch eine Verständnisfrage hab, nachdem ich mir das in aller Ruhe reingezogen hab.

    Zitat Zitat von BDraw Beitrag anzeigen
    EDIT: Oder brauchst du das gar nicht aufgeschlüsselt für die einzelnen Items pro Shop, sondern nur wie viel insg. ge/verkauft wurde?
    Nee, leider brauch ich tatsächlich die erste (aufwendige) Methode. Ich würde mal mit 2 Items anfangen. Jeweils pro Shop. Daran seh ich dann, ob sich der Aufwand lohnt. Wenn das schon ausufern sollte, muss ich mir was überlegen.

    @ Caledoriv: Danke auch dir. Das Problem ist tatsächlich, dass ich konkret Verkauf und Kauf zählen muss pro Shop, da ich diese beiden Werte in Textboxen als Variable ausgeben muss. Deine Methode summiert hingegen Käufe und Verkäufe pro Shop auf, unterscheidet sie aber nicht. Zumindest wenn ich dich richtig verstehe. Sag mir gern, wenn ich mit meiner Interpretation deines Beitrags völlig daneben liege. Das kann zu gegebener Uhrzeit nämlich recht wahrscheinlich vorkommen.

    Zum Thema meiner Vorerfahrung mit Programmierung: Dank einigen netten Atelier-Menschen weiß ich zumindest was Arrays sind und ich kann Skripte (mit etwas Glück) zweckentfremden, sodass sie das tun, was ich eigentlich vorgesehen hab. Klingt nach mehr als es ist. Selbst schreiben is bei mir noch nicht. Da sind mir gefühlt alle um mehr als eine Armlänge voraus. Vielleicht krieg ich das eines Tages aber sogar auch noch auf die Kette.

  5. #5
    Im Prinzip ist es gar nicht sooo kompliziert - der springende Punkt (bzw. Punkte) hier ist, dass sowohl Items als auch Variablen IDs haben, über die man diese zumindest in den alten Makern auswählen kann. Ich hab gerade mal geschaut und dämlicherweise haben neuere Maker diese Funktion bei Variablen aus dem Baukastensystem entfernt, das Video hier zeigt aber, wie man das recht leicht mit einem kurzen Scriptbefehl umgehen kann.
    Heißt ausformuliert: "Setze die Variable, deren ID in Variable XY angegeben ist, auf diesen und jenen Wert". Das nennt man dann Pointer.

    Demnach wäre
    Code:
    <>Set V[V[0001]] = 200
    in deinem Fall
    Code:
    <>Script: Set $game_variables[$game_variables[1]] = 200
    Ähnlich ist das mit den Items, anstatt jedes mal abzufragen
    Code:
    <>Set V[0001] = Item [0001: Heiltrank] amount owned
    <>Set V[0002] = Item [0002: Manatrank] amount owned
    <>Set V[0003] = Item [0003: Eisenschwert] amount owned
    ...
    Kann man diese Items auch per Variable über ihre ID ansteuern. Das Ergebnis ist dasselbe, aber man hat bedeutend weniger Klickarbeit.

    Das was ich vorher andeutete mit dem Variablen-sparen ist hier übrigens tatsächlich besonders kompliziert da deine An-/Verkaufswerte ja auch negativ sein können, damit würde das nochmal ungünstiger. Ich würde vorschlagen du schaust einfach mal, wie viele Items du eigentlich hast bzw. brauchst und wie viele Läden es so geben soll - je nach dem, wo die neuen Maker inzwischen das Limit bei der Anzahl der einstellbaren Variablen ansetzen, kann man sich da die Holzhammermethode vielleicht auch einfach ersparen.

  6. #6
    @ BDraw

    Dass An-/Verkaufswerte ja auch negativ sein können hab ich gar nicht bedacht. Das sollen sie natürlich nicht werden. Bei 0 soll jeweils für beide Werte Schluss sein, sodass sie nicht in den negativen Zahlenbereich gehen können.

    Zitat Zitat
    Ich würde vorschlagen du schaust einfach mal, wie viele Items du eigentlich hast bzw. brauchst und wie viele Läden es so geben soll
    Zwei Items (also vier An- und Verkaufswerte) und Fünf Läden sollen es für den Anfang sein.

  7. #7
    Oh, da haben wir aneinander vorbeigeredet - ich meine mit "Items" schon wortwörtlich "Items" - Heiltrank, Manatrank, Eisenschwert, sowas. Da wird es wohl etwas mehr von geben. Die negativen Zahlen sind dabei hier noch kein Problem - eine positive Zahl heißt ja, dass der Spieler jetzt mehr hat als vorher (also hat er das Item x-mal beim letzten Shop-Besuch gekauft), negativ, er hat nun weniger davon (also hat er die Differenz verkauft).

    Wenn es in deiner Database 100 Items gibt und 5 Läden bräuchtest du also 100x5=500 Variablen. Das ist noch eine ganz humane Anzahl. Zusätzlich brauchst du noch einen Satz Variablen für die Abfrage im Script oben, da dieses bloß die Differenz für den aktuellen Ladenbesuch ermittelt, sprich herausfindet: "Wie hat sich der Itembestand des Spielers zwischen dem ersten und dem zweiten Aufruf des Common Events verändert?". Macht bei 100 möglichen (handelbaren) Items und 5 Läden 100x(5+1)=600 Variablen.

    Gehen wir einfach mal von diesen 100 handelbaren Items aus, bei denen dich die Verkaufswerte interessieren. Sagen wir V[4000] - V[4099] sind enthält die Vergleichszahlen, die das Script oben ermittelt, V[4100] - V[4199] dann die An-/Verkaufszahlen für jedes Item in Laden #1 insgesamt. Dann bräuchtest du zusätzlich zu dem Common Event oben (nennen wir es mal "Spieler-Inventur") noch ein zusätzliches Common Event ("Laden-Inventur"):

    Code:
    <>Set V[0002: Variablen-ID] = 4000
    <>Set V[0003] * 100
    <>Set V[0003] + 4099
    <>Set Label: 2
    <>Script: Set $game_variables[$game_variables[3]] + $game_variables[$game_variables[2]]
    <>Set Range V[0002-0003] + 1
    <>If V[0002] < 4100
      <>Jump to Label: 2
    :END CASE
    Mit V[0003] gibst du an, welchen Variablen-IDs angesteuert werden soll: Ist die V[3] = 1 wird das Script daraus 4100 machen (s. Annahme oben), bei 2 wäre das 4200, bei 3 dann 4300, usw., diese Variable musst du also vorher bestimmen. Dein Event fürs Einkaufen sähe dann so aus:

    Code:
    <>Call Event: "Spieler-Inventur"
    <>Show Shop Dialogue
    <>Call Event: "Spieler-Inventur"
    <>Set V[0003: Shop-ID] = 1
    <>Call Event: "Laden-Inventur"
    "Spieler-Inventur" schaut beim ersten Aufurf, wieviel der Spieler wovon im Inventar hat. Beim zweiten Aufruf wird die Differenz zum Zeitpunkt nach dem Ladenbesuch errechnet. Dann sagst du dem Maker, dass es um Laden #1 geht, bevor du "Laden-Inventur" aufrufst, welches diese Differenz mit vergangenen Werten für diesen Laden aufaddiert. Außerdem siehst du hier, warum es am besten ist, das ganze in Common Events zu packen: So kannst du neue Shop-Dialoge erstellen ohne jedes Mal erst wer weiß was an Code dranbasteln zu müssen.

    Insgesamt also alles keine großen Scripte, aber schon fortgeschrittener Kram was die Verwendung von Variablen im Maker angeht.

    Geändert von BDraw (10.01.2019 um 20:25 Uhr)

  8. #8
    Hey Ken, hab mich mal kurz an ein Script gesetzt. Wäre es das, was du brauchst?
    Code:
    class Game_System
      LDT_SHOP_VAR = 15 # Shop Variable
      LDT_ITEM_BOUGHT_VAR = 16 # Item Bought Variable
      LDT_ITEM_SOLD_VAR = 17 # Item Sold Variable
      attr_accessor :ldt_shopsys
      
      def get_item_shop_info(pitemid,pbought=nil,psold=nil)
        tshopv = $game_variables[LDT_SHOP_VAR]
        init_shopsys(tshopv,pitemid)
        $game_variables[pbought ? pbought : LDT_ITEM_BOUGHT_VAR] = @ldt_shopsys[tshopv][pitemid]["Bought"]
        $game_variables[psold ? psold : LDT_ITEM_SOLD_VAR] = @ldt_shopsys[tshopv][pitemid]["Sold"]
      end
      
      def init_shopsys(tshopv,pitemid)
        @ldt_shopsys = {} unless(@ldt_shopsys)
        @ldt_shopsys[tshopv] = {} unless(@ldt_shopsys[tshopv])
        @ldt_shopsys[tshopv][pitemid] = {"Bought"=>0,"Sold"=>0} unless( @ldt_shopsys[tshopv][pitemid])
      end
      
      def change_shop_item(ptype,pitemid,pnum)
        tshopv = $game_variables[LDT_SHOP_VAR]
        init_shopsys(tshopv,pitemid)
        @ldt_shopsys[tshopv][pitemid][ptype] = [@ldt_shopsys[tshopv][pitemid][ptype] + pnum,0].max
      end
    end
    
    class Scene_Shop
      
      alias ldt_do_buy do_buy
      def do_buy(number)
        $game_system.change_shop_item("Bought",@item.id,number) if(@item.is_a?(RPG::Item))
        ldt_do_buy(number)
      end
    
      alias ldt_do_sell do_sell
      def do_sell(number)
        $game_system.change_shop_item("Sold",@item.id,number) if(@item.is_a?(RPG::Item))
        ldt_do_sell(number)
      end
    end
    Im Script legst du 3 Variablen fest:
    LDT_SHOP_VAR = 15: Die Zahl gibt an, in welcher Variable der gewünschte Shop steht (in diesem Fall steht die Information in Variable Nummer 15). Bevor du einen Shop aufrufst, setzt du dann in Variable 15 die Shop ID (dein erster Shop wäre die 1, der zweite die 2, usw.). Wenn jetzt in diesem Shop gekauft/verkauft wird, wird es mit der Shop ID gespeichert.

    LDT_ITEM_BOUGHT_VAR = 16: In dieser Variable wird die Anzahl der gekauften Items geschrieben (damit du diese in Ausgaben/Abfragen verwenden kannst)
    LDT_ITEM_SOLD_VAR = 17: In dieser Variable wird die Anzahl der verkauften Items geschrieben (damit du diese in Ausgaben/Abfragen verwenden kannst)

    Mit Befehl Skript(im Event) führst du dann folgendes aus (wobei die 1 in Klammern die Item ID ist):
    $game_system.get_item_shop_info(1)
    Dadurch wird die Anzahl der gekauften Items (hier ID 1) vom Shop, der in Variable 15 hinterlegt ist, in die Variable 16 geschrieben (und die anzahl verkaufter Items in Variable 17).
    Nachdem du diesen Befehl ausgeführt hast, kannst du also Variable 16 und 17 für Abfragen/Textausgaben verwenden.

    Beispiel:
    Wie läuft das Ganze also ab? Nehmen wir an, wir haben 2 verschiedene Shops. Im Shop 1 Event machst du (gemäß dem Beispiel)
    Code:
    Set Variable[15] = 1
    Open Shop (Heiltrank)
    Das Event vom anderen Shop:
    Code:
    Set Variable[15] = 2
    Open Shop (Heiltrank)
    Um das Ganze dann zu Testen ein drittes Event (angenommen, der Heiltrank hat die Item ID 1):
    Code:
    Set Variable[15] = 1
    Script: $game_system.get_item_shop_info(1)
    Message: Shop ID: \V[15]
                   Heiltrank gekauft: \V[16]
                   Heiltrank verkauft: \V[17]
    Set Variable[15] = 2
    Script: $game_system.get_item_shop_info(1)
    Message: Shop ID: \V[15]
                   Heiltrank gekauft: \V[16]
                   Heiltrank verkauft: \V[17]
    Edit: Ich habe mir nicht alle Posts hier durchgelesen. Diese Möglichkeit hat den Vorteil, dass sie dynamisch ist und für alle Items funktioniert. Damit verbrauchst du gerade mal 3 Variablen.
    Wenn gewünscht, kannst du statt der 2 fixen Variablen (16 und 17) auch beim Skriptaufruf auch 2 alternative Variablen übergeben:
    $game_system.get_item_shop_info(1,20,21)

    Das macht z.B. Sinn, wenn du mehrere Items gleichzeitig in verschiedene Variablen speichern willst:
    Code:
    $game_system.get_item_shop_info(1,20,21)
    $game_system.get_item_shop_info(2,22,23)
    $game_system.get_item_shop_info(3,24,25)
    Edit 2:
    Kleine Anpassung am Script, dass Equip nicht mitgezählt wird. Falls du das auch für Equip brauchst, sag bescheid, dann muss es nochmal minimal angepasst werden.

    Geändert von Linkey (11.01.2019 um 11:27 Uhr)

  9. #9
    Hey, Jungs. Vielen Dank für euren Einsatz! Wir kommen dem Ziel näher. Das was du gemacht hast, Linkey, ist klasse. Es ist auch fast perfekt. Ich brauche jedoch pro Shop jeweils eine Einkaufs- und Verkaufsvariable. Wenn ich 5 Shops hätte (beispielsweise) dann bräuchte ich somit insgesamt 2 Variablen (10 insgesamt für alle 5 Shops), die dem jeweiligen Shop zugeordnet sind, an denen ich ablesen kann, wie viel in Shop 1 gekauft und verkauft wurde, wie viel in Shop 2 gekauft und verkauft wurd usw. und die Zahlen dürfen nicht negativ werden, müssen de facto bei Null enden. Möchtest du das noch ergänzen? Oder geht das mit dem Script hier sogar bereits? Equip brauche ich nicht. Denk nach aktuellem Stand auch nicht, dass ich es brauchen werd.

    Dein Ken der Shoppingkot

    Geändert von Ken der Kot (11.01.2019 um 12:03 Uhr)

  10. #10
    Natürlich geht das mit dem Script. Alles was du machst, wird direkt im Spielstand gespeichert ($game_system.ldt_shopsys).

    Über den Aufruf:
    $game_system.get_item_shop_info(1,20,21)
    liest du das Item mit der ID 1 heraus und schreibst es in die Variablen 20 (Kaufmenge) und Variable 21 (Verkaufsmenge).

    Aus welchen Shop das liest, ist abhängig was in Variable 15 steht.

    Code:
    set Variable[15] = 1
    $game_system.get_item_shop_info(1,20,21)
    set Variable[15] = 2
    $game_system.get_item_shop_info(2,22,23)
    Der Code würde dir beispielsweise die Kaufmenge von Item1 aus dem ersten Shop in Variable 20 schreiben (und in 21 die Verkaufsmenge). Und anschließend die Kaufmenge von Item2 aus dem zweiten Shop in Variable 22.

  11. #11
    Alles klar, dann weiß ich Bescheid. Vielen Dank für die Erklärung. Ich teste das Skript direkt Morgen Früh, wenn ich das, was ich damit vorhabe, implementiere.

    Nur noch eine kurze Frage: Können die Zahlen auch negativ werden? Weil das sollen sie ja nicht.

  12. #12
    Wie sollte etwas negativ sein? Du kannst im Shop doch nicht -10 Tränke kaufen. Und auch nicht -10 verkaufen :'D

    Aber ja, habe das auch abgefangen mit dem Befehl:
    [@ldt_shopsys[tshopv][pitemid][ptype] + pnum,0].max

    [Wert1,Wert2, Wert N].max bedeutet, dass er den höchsten Wert von denen nimmt. Ist also Anzahl ver-/gekaufter Ware kleiner 0, wird der Wert zumindest 0 betragen.
    Falls du etwas im Script nicht verstehst, kann ich dir sonst auch ein Beispielprojekt hochladen.

  13. #13
    Zitat Zitat von Linkey Beitrag anzeigen
    Wie sollte etwas negativ sein? Du kannst im Shop doch nicht -10 Tränke kaufen. Und auch nicht -10 verkaufen :'D
    Naja, angenommen du bekommst die Tränke zB anderswo her als vom Shop. Aber alles gut, wollte das nur ausschließen. Vielen Dank.

    Zitat Zitat von Linkey Beitrag anzeigen
    Falls du etwas im Script nicht verstehst, kann ich dir sonst auch ein Beispielprojekt hochladen.
    Weißt du, was das wäre? Das wäre klasse!

  14. #14
    Ich speicher ja alles positiv weg. Du verkaufst bei Shop1 20 Heiltränke, dann wird in einer Variable "20" gespeichert.
    Habe dir den Link per PN geschickt - hoffentlich wird die Benutzung damit klarer.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •