• Anmelden

1

Dienstag, 14. September 2010, 12:49

Defensiv-Werte per Skript ändern

Hi,

ich suche eine Möglichkeit, die pdef- und mdef-Werte per Skript manuell zu ändern.
Hintergrundgedanke: Der Spieler soll einen Bonus erhalten, wenn er alle Teile eines Ausrüstungs-Satzes trägt (z.B. "Eisenhelm", "Eisenschild" und "Eisenrüstung").
Mein Ansatz ist folgender (ein editiertes Skript, das, wenn ich mich richtig erinnere, jemand aus dem Forum hier für mich geschrieben hatte - bitte nicht böse sein, ich weiß nicht mehr, wer das war!):

Spoiler: Skriptteil

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Scene_Equip
  alias main2 main
  def main
	main2
 
#-------------------- Ausrüstungs-Satz: Eisen
if @actor.armor3_id == 43 and @actor.armor1_id == 44 and @actor.armor2_id == 45 #die IDs des Helms, Schilds und der Rüstung
  $data_armors[@armor3_id].mdef = 75 #hier soll etwas stehen, dass den mdef-Wert des Charakters, der diese Ausrüstung trägt, erhöht
else
$data_armors[@armor3_id].mdef = 0
end
#--------------------
 
end
end
zum Lesen den Text mit der Maus markieren


Mein Ansatz funktioniert so (wie immer) aber nicht... Hat jemand eine Idee?

Wie genau der mdef-Wert erhöht wird, ist mir relativ egal, da ich die mdef für nichts anderes als diesen Bonus benutze.
Mir fallen da zwei Möglichkeiten ein:
- der base_mdef-Wert des Charakters wird erhöht
- ein Ausrüstungsteil erhält einen mdef-Wert, der dann logischerweise für den Charakter wirkt

Das sind nur Ideen. Wie das funktioniert, ist mir wie gesagt relativ egal.

Kann mir jemand helfen?

Motto: ich bin der brennende schinken

  • Nachricht senden

2

Dienstag, 14. September 2010, 13:22

In der klasse Game_Actor kannst du eine menge methoden finden wie diese hier:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Game_Actor
  #--------------------------------------------------------------------------
  # * Get Basic Magic Defense
  #--------------------------------------------------------------------------
  def base_mdef
    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]
    mdef1 = weapon != nil ? weapon.mdef : 0
    mdef2 = armor1 != nil ? armor1.mdef : 0
    mdef3 = armor2 != nil ? armor2.mdef : 0
    mdef4 = armor3 != nil ? armor3.mdef : 0
    mdef5 = armor4 != nil ? armor4.mdef : 0
    return mdef1 + mdef2 + mdef3 + mdef4 + mdef5
  end
end


Dort würde ich raten deine Mods vorzunehmen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Game_Actor
  #--------------------------------------------------------------------------
  # * Get Basic Magic Defense
  #--------------------------------------------------------------------------
  def base_mdef
    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]
    mdef1 = weapon != nil ? weapon.mdef : 0
    mdef2 = armor1 != nil ? armor1.mdef : 0
    mdef3 = armor2 != nil ? armor2.mdef : 0
    mdef4 = armor3 != nil ? armor3.mdef : 0
    mdef5 = armor4 != nil ? armor4.mdef : 0
    if armor3_id == 43 and armor1_id == 44 and armor2_id == 45 #die IDs des Helms, Schilds und der Rüstung
      mod_val = 75 #hier soll etwas stehen, dass den mdef-Wert des Charakters, der diese Ausrüstung trägt, erhöht
    else
      mod_val = 0
    end
    return mdef1 + mdef2 + mdef3 + mdef4 + mdef5 + mod_val
  end
end
;( :jagen:

Neo-Bahamut

Himmelsgleicher

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

3

Dienstag, 14. September 2010, 13:42

In der Zeit in der ich ein Skript geschreiben hab hat Genocide schon geantwortet x(

Pastebin: http://wurstinator.pastebin.com/F0vveyTL

Spoiler

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class Game_Actor
 
  EQ_SET_BONUS = {
	# Proc.new {|actor| ...}
	# This is the code where you ask whether the set is equipped.
	# You need some Ruby/RGSS knowledge but this provides way more possibilities.
 
	# => {:atk => 20, :eva = 5}
	# Write the bonus values
 
	# Example Sets:
	# Set 1, anything (just any item, but not "nothing")
	Proc.new do |actor|
  	actor.weapon_id != 0 and actor.armor1_id != 0 and actor.armor2_id != 0 and
  	actor.armor3_id != 0 and actor.armor4_id != 0
	end => {:pdef => 20},
	# Set 2, Bronze Power (any four "Bronze" items)
	Proc.new do |actor|
  	actor.armor1_id == 1 and actor.armor2_id == 5 and 
  	[13, 17].include?(actor.armor3_id) and
  	[1, 5, 9, 13, 17, 21, 25, 29].include?(actor.weapon_id)
	end => {:mdef => 100}
  }
 
  # STOP EDITING HERE ---------------------
 
  EQ_SET_BONUS.each_value do |hash|
	hash.default = 0
  end
 
  alias_method :nb_aliasmethod_game_actor_setup_eqsets, :setup
  def setup(id)
	nb_aliasmethod_game_actor_setup_eqsets(id)
	refresh_equipment_sets
  end
 
  alias_method :nb_aliasmethod_game_actor_equip_eqsets, :equip
  def equip(type, id)
	nb_aliasmethod_game_actor_equip_eqsets(type, id)
	refresh_equipment_sets
  end
 
  def refresh_equipment_sets
	sets = []
	EQ_SET_BONUS.each do |key, value|
  	sets.push(value) if key.call(self)
	end
	@equipment_sets = sets
  end
 
  def get_equipment_sets
	return @equipment_sets
  end
 
  ['atk', 'pdef', 'mdef', 'eva'].each do |i|
	string = "def #{i};  n = super();  sets = get_equipment_sets;" + 
  	"  sets.each {|s|  n += s[:#{i}]};  return n;end"
	eval(string)
  end
end
zum Lesen den Text mit der Maus markieren
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

4

Dienstag, 14. September 2010, 13:56

Vielen Dank, ihr zwei.

@Genocide: Hast du deinen Beiträg editiert?
Als ich den Code kopiert habe, sah der anders aus:
Spoiler: Skript

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Game_Battler
  def mdef
	n = base_mdef
	for i in @states
  	n = $data_states[i].mdef_rate / 100.0
	end
 
	schuhe = armor1_id
	helm = armor2_id
	rüstung = armor3_id
 
	# Liste der Ausrüstungs-Sätze
 
	# Eisen
	if rüstung == 43 and schuhe == 44 and helm == 45
  	n = 75
	else
  	n = 0
	end
	# ---
 
	return Integer(n)
  end
end
zum Lesen den Text mit der Maus markieren

Bei dem "*" bei der Stelle "n = $data_states.mdef_rate / 100.0" und bei dem "+" kurz über dem "else" hat er gemeckert, da habe ich beide gelöscht.

Scheint trotzdem zu funktionieren... Oder verbau ich mir damit irgendwas, was ich jetzt noch nicht merke (außer der mdef, die brauche ich wie gesagt sonst gar nicht)?

Neo-Bahamut

Himmelsgleicher

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

5

Dienstag, 14. September 2010, 13:59

Zitat

Bei dem "*" bei der Stelle "n = $data_states.mdef_rate / 100.0" und bei dem "+" kurz über dem "else" hat er gemeckert, da habe ich beide gelöscht.

Scheint trotzdem zu funktionieren... Oder verbau ich mir damit irgendwas, was ich jetzt noch nicht merke (außer der mdef, die brauche ich wie gesagt sonst gar nicht)?
Ja, du "verbaust" dir ne Menge ;)
Deinen Code löscht du am besten sofort wieder :P

Mit Genocides Vorschlag sollte es gehen, wobei meiner natürlich viel besser, schöner und cooler ist x) *schubs*
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

Motto: ich bin der brennende schinken

  • Nachricht senden

6

Dienstag, 14. September 2010, 14:27

Ich hab es editiert da ich mit den neuen code die wurzel anfass.

Quellcode

1
2
3
4
	n = base_mdef
	for i in @states
  	n = $data_states[i].mdef_rate / 100.0
	end

Mit beispiel werten:

Quellcode

1
2
3
4
5
  	n = 34
	for i in [12,33,12,1]
          n = i / 100.0
	end
        p n #=> 0.01 weil 1/100

Du verwendest überall =
und nicht *+-/ dh du ersetzt die zahl und modifizierst sie nicht.
Benutzt am besten das von NB.
;( :jagen:

7

Dienstag, 14. September 2010, 14:39

@Genocide: Dein editiertes Skript oben funktioniert bei mir nicht... Vielleicht, weil ich in den Standard-Skripten schon etwas herumgespielt habe.

@Neo: Dein Skript macht Probleme mit einem anderen Skript, das glaube ich auch du für mich geschrieben hast und das die pdef in maxsp umwandelt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
class Game_Actor
  if method_defined?(:maxsp)
	alias_method :nb_lycosa_pdef_to_maxsp, :maxsp
	def maxsp
  	return [[Integer(nb_lycosa_pdef_to_maxsp + pdef + mdef), 0].max, 9999].min
	end
  else
	def maxsp
  	return [[Integer(super + pdef + mdef), 0].max, 9999].min
	end
  end
end

In Zeile 5 ist angeblich "each" nicht definiert.

Hab das Skript jetzt nochmal etwas geändert:
Was genau mach ich mir denn damit kaputt (außer wie gesagt die mdef, aber die brauch ich eh nicht)?
Spoiler: Skript

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Game_Battler
  def mdef
n = base_mdef
for i in @states
  n = $data_states[i].mdef_rate / 100.0
end
 
schuhe = armor1_id
helm = armor2_id
rüstung = armor3_id
 
# Liste der Ausrüstungs-Sätze
 
 # Eisen
if rüstung == 7 and schuhe == 4 and helm == 3
  n = 39
else
 # ...
 # Alle anderen Ausrüstungs-Sätze
else
 # Nichts
 n = 0
   end
 end
 
return Integer(n)
end
end
zum Lesen den Text mit der Maus markieren

Bisher hab ich noch keine Probleme damit entdeckt...

Neo-Bahamut

Himmelsgleicher

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

8

Dienstag, 14. September 2010, 14:50

Zitat

In Zeile 5 ist angeblich "each" nicht definiert.
lolwut?
Da steht doch gar nix mit each Oo
Hast du schon probiert, die Reihenfolge meiner beiden Skripte zu tauschen?

Zitat

Was genau mach ich mir denn damit kaputt (außer wie gesagt die mdef, aber die brauch ich eh nicht)?
Die mdef :P
Ich weiß nicht, wie viel du noch bei anderen Sachen geändert hast, aber eigentlich müsste es abstürzen, sobald du einen Zauber auf einen Gegner benutzt.
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

9

Dienstag, 14. September 2010, 15:14

Das dachte ich mir auch... Deswegen hab ich die Fehlermeldung auch nicht wirklich verstanden.

Wegen der mdef: Deswegen meinte ich ja, dass ich die mdef für sonst nichts brauche ;) . Ich habe das KS ziemlich editiert, die mdef spielt keine Rolle mehr.

Wenn das Skript sonst (außer der mdef) nichts zerstört, benutze ich das einfach weiterhin, bevor ich jetzt noch weiter dran rum bastle...

Trotzdem vielen Dank!

10

Donnerstag, 16. September 2010, 16:54

Ist zwar jetzt ein bisschen blöd, aber ich muss hier nochmal kurz etwas fragen. Ich hab nämlich jetzt doch ein Problem mit dem Skript :-| .

Ich hab ja in diesem Beitrag oben im Skript (das im Spoiler) in Zeile 5 das "*" raus genommen:
Vorher:

Quellcode

1
  n *= $data_states[i].mdef_rate / 100.0 

Jetzt:

Quellcode

1
  n = $data_states[i].mdef_rate / 100.0 

Dann hab ich festgestellt, dass ich das doch bräuchte... Aber sobald ich das rein tue (gilt auch für "+" oder "/"), meint er, dass die Methode für nil:NilClass nicht definiert ist.
Hat da jemand eine Idee, woher das kommt oder wie ich das lösen könnte?

@Neo: Ich hab die Reihenfolge der beiden Skripte vertauscht und wollte es nochmal versuchen, aber er besteht immer noch darauf, dass "each" in Zeile 5 nicht definiert ist.

EDIT: Hab herumexperimentiert und die Zeile mit dem "*" ziemlich an den Schluss des Skripts geschoben. Jetzt scheint es zu funktionieren, und es macht auch mehr Sinn (weil Zustände, die die mdef beeinflussen, auch diese Bonus-mdef beeinflussen sollen).

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Lycosa« (16. September 2010, 16:54)


Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

11

Donnerstag, 16. September 2010, 16:55

demnach müsste base_mdef nil zurückgeben damit n zu dem Zeitpunkt diesen Wert annimmt, Tippfehler seh ich gerade keine...
Such mal in deinen Scripts nach def base_mdef und poste mal den Code ab dem letzten gefundenen Treffer.

ED: Zu langsam... ...ich würd aber trotzdem mal überprüfen, welchen Wert n bei n = base_mdef genau annimmt... der NilClass-Fehler sollte eig. an der Stelle zu denken geben...

12

Donnerstag, 16. September 2010, 17:33

Vielen Dank, Irrlicht! Daran lag es.
Ich sollte echt vorsichtiger sein, wenn ich ohne eine Ahnung irgendwas im Code ändere...

Aber ich hoffe, mein Gedanke, dass der Code-Teil an den Schluss gehört, macht trotzdem Sinn. Dann lasse ich es nämlich so.

Ähnliche Themen

Social Bookmarks