Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Base STR auf 0 setzen



Expresseon
03.08.2008, 12:01
Uff, wieder ein neuer Thread...


#--------------------------------------------------------------------------
# * Get Basic Strength
#--------------------------------------------------------------------------
def base_str
n = $data_actors[@actor_id].parameters[2, @level]
weapon = $data_weapons[@weapon_id]
armor1 = $data_armors[@armor1_id]
armor2 = $data_armors[@armor2_id]
armor3 = $data_armors[@armor3_id]
armor4 = $data_armors[@armor4_id]
n += weapon != nil ? weapon.str_plus : 0
n += armor1 != nil ? armor1.str_plus : 0
n += armor2 != nil ? armor2.str_plus : 0
n += armor3 != nil ? armor3.str_plus : 0
n += armor4 != nil ? armor4.str_plus : 0
return [[n, 1].max, 999].min
end

Obiges definiert bekannterweise den Strenght-Wert eines Charakters. Dieser ist ohne Ausrüstung mindestens 1. Ich möchte den Wert auf 0 setzen, bin aber mal wieder verzweifelt. Es hat irgendwas mit dem return-Befehl zu tun, ich weiß aber nicht, was.

-KD-
03.08.2008, 12:24
[[n, 1].max, 999].min
ist doch nichts anderes als der mathematische Ausdruck:

minimum(maximum(n, 1), 999)
und heißt: Der str-Wert ist mindestens 1 und maximal 999. Brauchst doch also nur die 1 durch eine 0 zu ersetzen. Dann ist der Wert mindestens 0.

Expresseon
03.08.2008, 19:25
Was? Das habe ich natürlich schon versucht, aber Wirkung zeigt es nicht. Also so schlau war ich zumindest auch...

joshy150
03.08.2008, 20:21
#--------------------------------------------------------------------------
# * Get Basic Strength
#--------------------------------------------------------------------------


Hier steht eindeutig Basic. Also der Wert der dem Held im Maker gegeben worden ist.

Unter Game_Battler 1 in der Methode str musst du die beide einsen zu nullen machen, dann sollte es funktionieren(nicht getestet)

gRuFtY
04.08.2008, 07:59
@joshy150: Prinzipiell hast du recht, dass das Script den STR-Wert des Heros übermittelt, aber als minimun wird immer 1 übermittelt, wenn die return-zeile unbearbeitet bleibt.

Das heißte, die Lösung ist es, den Hero-STR-Wert auf 0 zu setzen (sofern das überhaupt möglich ist, denke fast, auch dort liegt das minimum bei 1, habs aber nicht getestet) und die return-zeile zu modifizieren.
Sollte es bei der eingebe des Hero-STR-Wertes ein minimum geben, sollte der Wert noch vom return abgezogen werden, also z.B.
return [[n, 1].max, 999].min -1

Ebenfalls ungetestet, evtl. kann auch Joshys ansatz funktionieren, hab das script nicht vor augen.

MFG
gRuFtY

[EDIT:]Beide scripte müssen modifiziert werden. Ich hab gerade mal nachgeguckt und folgendes festgestellt:
1) Der minimale STR-Wert ist in der Database 1. Wenn man ihn auf 0 setzt, wird er automatisch auf 1 erhöht. Also muss im erstem script die return zeile lauten:

return [[n-1, 0].max, 999].min (hab meine angabe von oben nochmals ein wenig modifiziert, diese ist noch schöner)
2) Dieser Wert wird auch im Battler1-Script nochmal auf 1 erhöht, sollte er kleiner sein. Allso müssen auch die von Joshy vorgeschlagenen änderungen durchgeführt werden.

Expresseon
04.08.2008, 10:42
Vielen Dank, an Game_Battler hatte ich gar nicht gedacht. ;)

Da ich nicht schon wieder einen Thread öffnen will, poste ich mal weiter.
Ich versuche derzeit, Scene_Item so umzuschreiben, dass das Auswahlfenster wegfällt, d.h., wenn man ein Item benutzt, wird nicht ausgewählt, wer z.B. geheilt wird, sondern es wird sofort das 1. Teammitglied geheilt. Leider finde ich nicht die Stelle, an der die Benutzung des Items ausgelöst wird, denn dann wäre alles viel einfacher.

-KD-
04.08.2008, 12:32
# Activate target window
@item_window.active = false
@target_window.x = (@item_window.index + 1) % 2 * 304
@target_window.visible = true
@target_window.active = true
# Set cursor position to effect scope (single / all)
if @item.scope == 4 || @item.scope == 6
@target_window.index = -1
else
@target_window.index = 0
end
Das Stück Code aktiviert die Charakterauswahl und muss durch den Einsatz des Items ersetzt werden. Der sieht folgendermaßen aus:

#Wenn Item alle Partymitglieder betreffen soll:
used = if @item.scope == 4 || @item.scope == 6
$game_party.actors.inject {|b, actor| b |= actor.item_effect(@item)}
else #wenn nur ein Partymitglied betroffen sein soll
#das Item wirkt auf den erstmöglichen Charakter
!!$game_party.actors.find {|actor| actor.item_effect(@item)}
end
#Wenn Item verwendet wurde
if used then
#Spiel Soundeffekt ab
$game_system.se_play(@item.menu_se)
#Verbrauche Item falls notwendig
$game_party.lose_item(@item.id, 1) if @item.consumable?
#Falls Item die Party umgebracht hat (suizid?) beende Spiel
$scene = Game_Over.new if $game_party.all_dead?
else #falls Item nicht verwendet wurde
#Spiele Soundeffekt ab
$game_system.se_play($data_system.buzzer_se)
end

Expresseon
04.08.2008, 17:16
Problem ist,

$game_party.lose_item(@item.id, 1) if @item.consumable?
dass ein "no method"-Fehler für 'consumable' ausgegeben wird. Das kann ich selber nicht nachvollziehen, da es sich um die gleiche Definition wie einige Zeilen weiter unten handelt:

if @item.consumable
# Decrease used items by 1
$game_party.lose_item(@item.id, 1)
Ich setze halt meist Items mit consumable = no ein, aus technischen Gründen. Versucht man das mit deinem Ausschnitt, kommt leider der Fehler.

-KD-
04.08.2008, 18:08
sry, muss consumable statt consumable? heißen.

Expresseon
05.08.2008, 10:14
Da passiert aber nichts. An den Gegenstand ist ein Common Event gekettet, welches nicht ausgelöst wird.

-KD-
05.08.2008, 11:30
Hab ich vergessen:

if @item.common_event_id > 0
$game_temp.common_event_id = @item.common_event_id
$scene = Scene_Map.new
end
müsste noch über das if used

Expresseon
05.08.2008, 11:44
Danke, klappt jetzt.