• 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

Donnerstag, 25. September 2014, 18:03

Neue Kampfformeln für das SBS

Ahoi,

ich benötige einen Großmeister des Skriptens für eine neue Berechnung sämtlicher
Kampfresultate.
Genauer gesagt benötige ich sie für das Tankentai SBS.

Da ich auch einige Addons und Fixes dafür verwendet, hänge ich meine Skritpdatei
des Projekts im Anhang an.


Bevor ich zu den Formeln komme, werde ich erstmal die Attribute und deren Funktion
posten. Die Attribute an sich sind unverändert!
Alle exisiteren im Standart XP, auch wenn EVA nur selten verwendet wird.
Bild


Kommen wir zu der Formeltabelle:

Bild


Und zu ihrer Erklärung:
  • ALLGEMEINES
    • Kleine Indizes mit dem Buchstaben A bedeuten: Angreifer
    • Indizes mit V bedeuten Verteidiger, also derjenige, der gerade angegriffen wird.
    • Rüstung und Resistenz (PDEF/MDEF) verringern den erlittenen physischen bzw.
      magischen Schaden prozentual.
      Rüstung/Resistenz skaliert ab einer prozentualen Schadensverringerung ab 65% weniger optimal.

  • ANGRIFFSKLASSEN
    • Angriffe werden in zwei Klassen unterteilt: PHYSISCH und MAGISCH.
    • Physische Angriffe sind: Normale Angriffe, Skillangriffe mit MDEF = 0
    • Die kritische Trefferchance von sämtlichen physischen Angriffen wird durch die
      physische kritische Trefferchance beeinflusst.
    • Magische Angriffe: Skillangriffe mit PDEF = 0
    • Die kritische Trefferchance von sämtlichen magischen Angriffen wird durch die
      magische kritische Trefferchance beeinflusst.

  • NORMALE ANGRIFFE
    • Das Attribut, mit dem der Schaden skaliert, hängt von der Oberklasse des Charakters ab.
      Es gibt 4 Oberklassen:
      STR- KLASSEN, DEX- KLASSEN, AGI-KLASSEN, INT-KLASSEN
    • Der Schaden von STR-und INT-Klassen skaliert bei normalen Angriffen mit je 1,5*STR
    • Der Schaden von den übrigen Klassen skaliert nur einfach mit ihrem Hauptattribut.
    • Normale Angriffe können verfehlen.
    • Normalen Angriffen kann ausgewichen werden.
    • Normale Angriffe können kritisch treffen.
    • Kritische Treffer von normalen Angriffen verursachen den doppelten Schaden.
    • Die Streuung von normalen Angriffen gibt an, um wieviel Prozent der Schaden vom idealen Wert abweichen kann (+/-).
      Die Streuung beträgt standartmäßig bei allen normalen Angriffen 15%.

  • SKILLANGRIFFE
    • Skillangriffe können verfehlen.
    • Skillangriffen kann ausgewichen werden.
    • Skillangriffe können kritisch treffen.
    • Kritische Skilltreffer verursachen 1,5-fachen Schaden.
    • Die Variance eines Skillangriffs definiert seine Streuung in Prozent.
    • Die Hit-Rate eines Skillangriffs bestimmt seine Trefferquote.
    • Jeder STR- Punkt skaliert für STR- Klassen um 1,5 pro Punkt.
    • Jeder INT- Punkt skaliert für INT- Klassen um 1,5 pro Punkt.
    • Eine eigene Formel für die Berechnung des Skillschadens für je eine der 4 Hauptklassen ist nich nötig, da
      bspweise DEX- oder AGI- Klasseskills niemals mit STR oder INT skalieren.

    • "Rüstungsignorierung" (z.B. bei PDEF-F von 70 wäre die Rüstungsignorierung 30%):
      Skaliert ein Skillangriff mit weniger als 100% MDEF oder PDEF, so wird der Wert der Rüstungspunkte
      (nicht der Wert der prozentualen Schadensverringerung direkt um X% verringern!) verändert
      und danach seine jetzige Schadensverringerung in Prozent berechnet.

  • GEGNER
    • Die Grundtrefferchance von Gegnern (also sozusagen die Trefferchance ihrer Waffen) ist bei allen Gegnern
      standartmäßig 95%.
    • Das Level eines Gegners wird in eckigen Klammern hinter seinem Namen angegeben z.B. "Wolf [5]"
    • Die Oberklasse eines Gegners (STR, DEX, AGI, INT) muss festgelegt werden und für ihn gelten dann ebenso
      die entsprechenden Formeln wie für Spieler-Charaktere.

  • ATTACK- TABLE
    • Ausweichen --> Treffen bzw. Verfehlen --> Treffer --> Kritisch Treffer --> Schmetternd

  • SCHMETTERNDER TREFFER
    • Jeder kritische Treffer hat ein Chance von 10% der kritischen phyischen bzw. magischen Trefferchance
      (je nach physischen oder magischen Angriff), schmetternd zu treffen und damit nochmal 2-fache bzw. 1,5-fache seines
      kritischen Schadens anzurichten.

      Also kann ein schmetternder Angriff überhaupt nur möglich sein, wenn vorher ein kritischer Treffer
      überhaupt möglich war. Also es kann aus einem Treffer ein kritischer Treffer werden und aus einem
      kritischen Treffer ein schmetternder Treffer. Allerdings kann aus einem Treffer kein schmetternder Treffer
      werden, wenn dieser Treffer kein kritischer Treffer war!

    • Beispiel: Normaler Angriff,
      Schaden = 50,
      Kritische Chance = 5%
      Angreifer landet kritischen Treffer. Dieser hat nun die Chance von 0,5%, schmetternd zu treffen:
      Schaden schmetternd: 50*2*2=200
    • Beispiel: Phyischer Skill,
      Schaden = 100,
      Kritische Chance = 5%
      Angreifer landet kritischen Treffer. Dieser hat nun die Chance von 0,5%, schmetternd zu treffen:
      Schaden schmetternd: 100*1,5*1,5=225
    • Beispiel: Magischer Skill ,
      Schaden = 100, Kritische Chance = 3%
      Angreifer landet kritischen Treffer. Dieser hat nun die Chance von 0,3%, schmetternd zu treffen:
      Schaden schmetternd: 100*1,5*1,5=225





So das war jetzt ziemlich viel.
Aber ich hoffe wirklich ganz ganz doll, dass sich dem jemand annehmen würde! Habe sehr sehr viel Arbeit in den letzten
Tagen in die ganze Sache gesteckt.
Natürlich müsste noch geklärt werden, wie z.B. die Oberklassen- Unterteilung funktioniert ect.
Wäre erstmal froh, wenn es jemand gibt, der sagen würde "Ich mach das".
Wäre auf jeden Fall genial!


Mit diesen Worten hoffe ich auf einen Skript- Großmeister der sich in dieser Sache annimmt.

MfG
Mitsch93



Zitat


PS:
Habe gerade gesehen, dass die Formeln für den realten physischen Skillschaden fehlt.
Bei Bedarf werde ich sie posten, aber ich denke, dass es klar sein sollte, dass der einzige Unterschied
die physische Schadensverringerung in der Formel ist (statt der magischen).



Zitat


EDIT:
Habe bemerkt, dass ich doch eine unterschiedliche Skillschadensberechnung für jede Oberklasse benötige.
Also bei STR- Klassen wird STR*1,5 genommen, bei INT Klassen INT*1,5 und bei den restlichen Klassen alles normal mit 1*...

»Mitsch93« hat folgende Datei angehängt:
  • Scripts.rxdata (353,94 kB - 1 mal heruntergeladen - zuletzt: 23. September 2014, 20:23)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mitsch93« (25. September 2014, 18:03)


Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

2

Freitag, 26. September 2014, 03:16

Huhu,

Was genau ist mit "Attack-Table" gemeint?

Die Chance auf einen Schmettertreffer erscheint mir persönlich etwas niedrig.
Wenn ich dich richtig verstanden habe sollte die Chance auf einen Schmettertreffer bei einer kritischen Trefferchance von 5% bei 0,025% = 1:4000 liegen?

Ich nehme mal an in der zweiten Formel zur Schadensreduktion sollten noch 65 addiert werden?


Ansonsten hab ich mal versucht die Formeln einzubauen, mittlerweile auch einmal aktualisiert (EDIT).
Die Scriptteile sollten unter den Scripts "Sideview 2" sowie "Advanced Actor Status" eingefügt werden.

Spoiler: Formeln Teil 1

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#############
#
#  "Modifizierte Schadensformeln für Enus SBS" - Script  (Part 1/3)
#    version  1.0d <Beta>  (2nd October 2014)
#    by  Irrlicht <www.rpg-studio.org>
# 
# # Beschreibung: ------------------------------------------------------------
  #   Dieses Script verändert die Schadensberechnung.
  #   Füge es unter den Scripts "Advanced Actor Status" und "Sideview 2" ein.
  #   Zuätzliche Änderungen:
  #   - Battler haben nun eine Schadensklasse (Game_Battler#damage_type)
  #   - Battler können schmetternd getroffen werden (Game_Battler#crushing)
  #   - Trefferchance von Gegnern (Game_Enemy) ist auf 95% gesenkt             #
  #   - Gegner haben ein Level                                                 #
  # -------------------------------------------------------------- #############
 
 
module N01
 
  DAMAGE_CLASS_ELEMENT = 10  # Element ID zur Bestimmung der Schadensklasse
  POP_CRUSH = "Schmetternd"  # Textzusatz für Schmettertreffer
 
  USE_ADVANCED_ACTOR_STATUS = true  # "Advanced Actor Status" verwendet?
 
end
 
 
class Game_Battler
 
  # --------------------------------------------------------------------------
  # Mehrfach verwendete Formeln und Formelteile:
  # --------------------------------------------------------------------------
 
 
  # Schadensverringerung bei gegebenem Verteidigungswert (100% entspricht 1.0):
  def damage_reduction(defense_value)
    basis = 0.5 / (26 + 4 * self.level)
    value = basis * defense_value
    if value >= 0.65
      value = 0.65 + 0.58 / (26+16*self.level) * (defense_value - 0.65 / basis)
    end
    return [value, 1.0].min
  end    
 
 
  # Kritische Trefferchance bei gegebenem Attributwert (100% entspricht 1.0): 
  def action_crit_chance(user, crit_stat)
    0.01 * [user.crt - self.rcrt, 1].max * 0.2 * 
    (5.0 + user.eva / (0.5 * user.level) + crit_stat / (5.0 + user.level * 6.0))
  end
 
 
  # --------------------------------------------------------------------------
  # Angriffs-Formeln:
  # --------------------------------------------------------------------------
 
 
  # [Hauptformel] Angriffsschaden:
  def attack_damage_value(user)
    value = attack_base_damage(user)
    value *= (1 - damage_reduction(self.pdef))
    value *= 0.5  if user.second_attack  # weniger Schaden beim zweiten Treffer
    return value
  end
 
 
  # Grundschaden eines Angriffs:
  def attack_base_damage(user)
    case user.damage_type
    when :str  then user.weapon_atk + 1.5 * user.str
    when :dex  then user.weapon_atk + 1.0 * user.dex
    when :agi  then user.weapon_atk + 1.0 * user.agi
    when :int  then user.weapon_atk + 1.5 * user.str
    end
  end
 
 
  # [Hauptformel] Schadensbonus bei kritischem Treffer:
  def attack_crit_bonus(user)
    1.0 * self.damage * (user.dmg - self.rdmg) / 100.0
  end
 
 
  # [Hauptformel] Zusätzlicher Schadensbonus bei Schmettertreffer:
  def attack_crush_bonus(user)
    1.0 * self.damage
  end
 
  # ---
 
  # [Hauptformel] Trefferrate (100% entspricht 1.0)
  def attack_hit_chance(user)
    0.01 * (user.hit - 4.0 * self.agi / user.dex)
  end
 
 
  # [Hauptformel] Ausweichchance (100% entspricht 1.0)
  def attack_eva_chance(user)
    0.01 * (5.0 + self.eva / (0.5 * self.level) + self.agi / (5.0 * user.dex))
  end
 
 
  # [Hauptformel] Kritische Trefferchance (100% entspricht 1.0)
  def attack_crit_chance(user)
    action_crit_chance(user, user.dex)
  end
 
 
  # [Hauptformel] Schmettertrefferchance (100% entspricht 1.0)
  def attack_crush_chance(user)
    attack_crit_chance(user) / 10.0
  end  
 
 
  # --------------------------------------------------------------------------
  # Skill-Formeln:
  # --------------------------------------------------------------------------
 
 
  # Grundwirkung eines Skills:
  def skill_base_damage(user, skill)
    # - Power:
    value = skill.power.abs
    # - Attribute:
    value += user.atk * skill.atk_f / 100.0
    value += user.str * skill.str_f / 100.0
    value += user.dex * skill.dex_f / 100.0
    value += user.agi * skill.agi_f / 100.0
    value += user.int * skill.int_f / 100.0
    # - Bonus durch Schadensklasse:
    case user.damage_type
    when :str  then value += 0.5 * user.str * skill.str_f / 100.0
    when :int  then value += 0.5 * user.int * skill.int_f / 100.0
    end
    # - Vorzeichen wiederherstellen:
    value = -value  if skill.power < 0
    return value
  end
 
 
  # [Hauptformel] Skillschaden/heilung:
  def skill_damage_value(user, skill)
    # - Basiswirkung:
    value = skill_base_damage(user, skill)
    # - Schadensreduktion:
    if skill.pdef_f > 0
      value *= 1 - damage_reduction(self.pdef * skill.pdef_f / 100.0)
    end
    if skill.mdef_f > 0
      value *= 1 - damage_reduction(self.mdef * skill.mdef_f / 100.0)
    end
    return value
  end
 
 
  # [Hauptformel] Kritischer Schadensbonus:
  def skill_crit_bonus(user, skill)
    0.5 * attack_crit_bonus(user)
  end
 
 
  # [Hauptformel] Zusätzlicher Schadensbonus bei Schmettertreffer:
  def skill_crush_bonus(user, skill)
    0.5 * attack_crush_bonus(user)
  end
 
  # ---
 
  # [Hauptformel] Trefferchance (100% entspricht 1.0, ohne Hit-Rate des Skills):
  def skill_hit_chance(user, skill)
    if skill.magic?
      1.0
    else
      attack_hit_chance(user)
    end
  end
 
 
  # [Hauptformel] Ausweichchance (100% entspricht 1.0):
  def skill_eva_chance(user, skill)
    attack_eva_chance(user) * skill.eva_f / 100.0
  end
 
 
  # [Hauptformel] Kritische Trefferchance (100% entspricht 1.0):
  def skill_crit_chance(user, skill)
    crit_stat = skill.magic? ? user.int : user.dex
    return action_crit_chance(user, crit_stat)
  end
 
 
  # [Hauptformel] Schmettertrefferchance (100% entspricht 1.0):
  def skill_crush_chance(user, skill)
    skill_crit_chance(user, skill) / 10.0
  end
 
end
zum Lesen den Text mit der Maus markieren

Spoiler: Formeln Teil 2

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
#############
#
#  "Modifizierte Schadensformeln für Enus SBS" - Script  (Part 2/3)
#    version  1.0d <Beta>  (2nd October 2014)
#    by  Irrlicht <www.rpg-studio.org>
# 
# # Contents: ---------------------------------------------------------------
  #   Dieses Script verändert die Schadensberechnung.                          #
  #   Füge es unter den Scripts "Advanced Actor Status" und "Sideview 2" ein.  #
  # -------------------------------------------------------------- #############
 
 
#==============================================================================
# ** Game_Battler 
#------------------------------------------------------------------------------
#  EXTENSION: Redefine Damage Calculation Process
#==============================================================================
 
class Game_Battler
 
  attr_accessor :crushing  # Crushing Blow indicator flag
 
  #-------------------------------------------------------------------------
  # * Game_Battler#weapon_atk
  #  Determine the battlers current weapon based attack power.
  #-------------------------------------------------------------------------
  def weapon_atk
    result = base_weapon_atk
    @states.each { |id| result *= $data_states[id].atk_rate / 100.0 }
    return result.to_i
  end
 
  #-------------------------------------------------------------------------
  # * Game_Battler#base_weapon_atk
  #  Determine the battlers current basic weapon attack power.
  #-------------------------------------------------------------------------
  def base_weapon_atk
    if USE_ADVANCED_ACTOR_STATUS and actor? and weapons.length >= 2
      i = second_attack ? 1 : 0  # Weapon Index
      factor = Use_Old_Two_Sword_Beahave ? TWO_SWORDS_STYLE[i] : Dual_Attack_Power
      result = (weapons[i].atk + @set_atk / 2) * factor / 100.0
      return [[result.to_i, 0].max, Actor_Max_Atk].min
    else
      return base_atk
    end
  end
 
  #-------------------------------------------------------------------------
  # Stat Replacements when they are not defined by "Advanced Actor Status"
  #-------------------------------------------------------------------------
  define_method(:dmg) { 100 }  unless method_defined?(:dmg)
  define_method(:rdmg) { 0 }  unless method_defined?(:rdmg)
  define_method(:crt) { 5 }  unless method_defined?(:crt)
  define_method(:rcrt) { 0 }  unless method_defined?(:rcrt)
 
  #-------------------------------------------------------------------------
 
  #-------------------------------------------------------------------------
  # Game_Battler#clear_result_variables
  #   Clear effect result. Used within skill/attack effect calculations.
  #-------------------------------------------------------------------------
  def clear_result_variables
    self.critical = self.crushing = @missed = @evaded = false
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#success?
  #   Return current success status of an skill/attack effect.
  #-------------------------------------------------------------------------
  def success?
    not (@missed or @evaded)
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#correct_result_variables
  #   Correct damage value and critical flag after an attack/skill effect.
  #-------------------------------------------------------------------------
  def correct_result_variables
    self.critical = false  unless success?
    self.damage = POP_EVA  if @evaded
    self.damage = POP_MISS if @missed
    self.damage = nil      unless $game_temp.in_battle
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_second_attack
  #   Try to switch to the second weapon after an attack effect.
  #-------------------------------------------------------------------------
  def set_second_attack
    if USE_ADVANCED_ACTOR_STATUS and actor? 
      wset = weapons
      self.second_attack = true  if wset[0] != nil and wset[1] != nil
    end
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#normalize_damage
  #   Round fractional damage values.
  #-------------------------------------------------------------------------
  def normalize_damage
    self.damage = (self.damage + rand).to_i  if self.damage.is_a?(Numeric)
  end
 
  #-------------------------------------------------------------------------
 
  #-------------------------------------------------------------------------
  # Game_Battler#attack_effect
  #   REDEFINE: Use new formulas for calculation, fix evade.
  #-------------------------------------------------------------------------
  def attack_effect(attacker)  #EDIT
    process_attack_effect(attacker, false)
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#perfect_attack_effect
  #   REDEFINE: Use new formulas for calculation, fix evade.
  #-------------------------------------------------------------------------
  def perfect_attack_effect(attacker) #EDIT
    process_attack_effect(attacker, true)
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#process_attack_effect
  #   Replacement for the old attack effect.
  #-------------------------------------------------------------------------
  def process_attack_effect(attacker, perfect)
    clear_result_variables
    set_attack_first_hit(attacker)    unless perfect
    set_attack_result(attacker)       if success?
    @evaded = false                   if perfect
    set_attack_state_change(attacker) if success?
    correct_result_variables
    attacker.set_second_attack
    return true
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_attack_first_hit
  #-------------------------------------------------------------------------
  def set_attack_first_hit(attacker)
    @missed = (rand >= attack_hit_chance(attacker))
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_attack_damage_value
  #   REDEFINE
  #-------------------------------------------------------------------------
  def set_attack_damage_value(attacker)
    self.damage = attack_damage_value(attacker)
    self.damage *= elements_correct(attacker.element_set) / 100.0
    normalize_damage
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_attack_hit_value
  #   REDEFINE
  #-------------------------------------------------------------------------
  def set_attack_hit_value(attacker)
    @evaded = (self.damage >= 0 and not self.cant_evade?)
    @evaded &&= (rand < attack_eva_chance(attacker))
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_attack_critical
  #   REDEFINE
  #-------------------------------------------------------------------------
  def set_attack_critical(attacker)
    self.critical = (rand < attack_crit_chance(attacker))
    self.crushing = (critical and rand < attack_crush_chance(attacker))
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_critical_damage
  #   REDEFINE
  #-------------------------------------------------------------------------
  def set_critical_damage(attacker)
    self.damage += attack_crit_bonus(attacker)
    self.damage += attack_crush_bonus(attacker)  if self.crushing
    normalize_damage
  end
 
  #-------------------------------------------------------------------------
 
  #-------------------------------------------------------------------------
  # Game_Battler#skill_effect_n01
  #   REDEFINE: Use new formulas for calculation, fix evade.
  #   Modified Alias from the "Sideview 2" - script:
  #   def skill_effect(user, skill)
  #-------------------------------------------------------------------------
  def skill_effect_n01(user, skill)
    process_skill_effect(user, skill, false)
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#perfect_skill_effect_n01
  #   REDEFINE: Use new formulas for calculation, fix evade.
  #   Modified Alias from the "Sideview 2" - script:
  #   def perfect_skill_effect(user, skill)
  #-------------------------------------------------------------------------
  def perfect_skill_effect_n01(user, skill)  #EDIT
    process_skill_effect(user, skill, true)
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#process_skill_effect
  #-------------------------------------------------------------------------
  def process_skill_effect(user, skill, perfect)
    clear_result_variables
    return false  unless skill_valid?(skill)
    effective = (skill.common_event_id > 0)
    effective |= set_skill_first_hit(user, skill)  unless perfect
    effective |= set_skill_result(user, skill, effective)  if success?
    @evaded = false  if perfect
    effective |= set_skill_state_change(user, skill, effective)  if success?
    correct_result_variables
    return effective
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#skill_valid?
  #-------------------------------------------------------------------------
  def skill_valid?(skill)
    not (self.hp == 0 ? [3, 4] : [5, 6]).include?(skill.scope)
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_skill_first_hit
  #-------------------------------------------------------------------------
  def set_skill_first_hit(user, skill)
    miss_chance = 1 - set_skill_hit(user, skill) * skill.hit / 100.0
    @missed = (rand < miss_chance)
    return (miss_chance > 0)
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_skill_hit
  #   REDEFINE
  #-------------------------------------------------------------------------
  def set_skill_hit(user, skill)
    skill_hit_chance(user, skill)
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_skill_result
  #   REDEFINE
  #-------------------------------------------------------------------------
  def set_skill_result(user, skill, effective)  #EDIT
    set_skill_damage_value(user, skill)
    if self.damage > 0 
      self.damage /= 2 if self.guarding?
      set_skill_critical(user, skill) 
      set_skill_critical_damage(user, skill)  if self.critical
    end
    apply_variance(skill.variance) if skill.variance > 0 and self.damage.abs > 0
    effective |= set_skill_hit_value(user, skill, effective)
    return effective
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_skill_critical
  #-------------------------------------------------------------------------
  def set_skill_critical(user, skill)
    self.critical = (rand < skill_crit_chance(user, skill))
    self.crushing = (critical and rand < skill_crush_chance(user, skill))
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_skill_critical_damage
  #-------------------------------------------------------------------------
  def set_skill_critical_damage(user, skill)
    self.damage += skill_crit_bonus(user, skill)
    self.damage += skill_crush_bonus(user, skill)  if self.crushing
    normalize_damage
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_skill_damage_value
  #   REDEFINE
  #-------------------------------------------------------------------------
  def set_skill_damage_value(user, skill)
    self.damage = skill_damage_value(user, skill)
    self.damage *= elements_correct(skill.element_set) / 100.0
    normalize_damage
  end
 
  #-------------------------------------------------------------------------
  # Game_Battler#set_skill_hit_value
  #   REDEFINE
  #-------------------------------------------------------------------------
  def set_skill_hit_value(user, skill, effective)
    if self.damage < 0 or self.cant_evade?
      @evaded = false
      return effective
    else
      evade_chance = skill_eva_chance(user, skill)
      @evaded = (rand < evade_chance)
      return (effective or evade_chance > 0)
    end
  end
end
zum Lesen den Text mit der Maus markieren

Spoiler: Formeln Teil 3

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#############
#
#  "Modifizierte Schadensformeln für Enus SBS" - Script  (Part 3/3)
#    version  1.0d <Beta>  (2nd October 2014)
#    by  Irrlicht <www.rpg-studio.org>
# 
# # Contents: ---------------------------------------------------------------
  #   Dieses Script verändert die Schadensberechnung.                          #
  #   Füge es unter den Scripts "Advanced Actor Status" und "Sideview 2" ein.  #
  # -------------------------------------------------------------- #############
 
 
#==============================================================================
# ** Game_Battler 
#------------------------------------------------------------------------------
#  EXTENSION: Define a main damage class for each battler.
#==============================================================================
 
class Game_Battler
 
  #---------------------------------------------------------------------------
  # Game_Battler#damage_type
  #   Return the name of the attribute this battler is specialized on.
  #---------------------------------------------------------------------------
  def damage_type
    case element_rank(DAMAGE_CLASS_ELEMENT)
    when 3  then :str  # [C]
    when 4  then :dex  # [D]
    when 5  then :agi  # [E]
    when 6  then :int  # [F]
    else         :str  # Other
    end
  end
end
 
 
#==============================================================================
# ** Game_Enemy
#------------------------------------------------------------------------------
#  EXTENSION: Define level, change hit rate, element rank table access
#==============================================================================
 
class Game_Enemy
 
  #---------------------------------------------------------------------------
  # Game_Enemy#element_rank
  #   Return the specified element rank of the enemy.
  #---------------------------------------------------------------------------
  def element_rank(index)
    $data_enemies[@enemy_id].element_ranks[index]
  end
 
  #---------------------------------------------------------------------------
  # Game_Enemy#level
  #   Return an enemies level.
  #---------------------------------------------------------------------------
  def level
    $data_enemies[@enemy_id].level
  end
 
  #---------------------------------------------------------------------------
  # Game_Enemy#hit
  #   OVERRIDDEN: Change the enemies default hit chance to 95%
  #---------------------------------------------------------------------------
  def hit
    (super * 0.95).round
  end
end
 
 
#==============================================================================
# ** Game_Actor
#------------------------------------------------------------------------------
#  EXTENSION: element rank table access
#==============================================================================
 
class Game_Actor
 
  #---------------------------------------------------------------------------
  # Game_Actor#element_rank
  #   Return the specified element rank of the actor.
  #---------------------------------------------------------------------------
  def element_rank(index)
    $data_classes[@class_id].element_ranks[index]
  end
end
 
 
#==============================================================================
# ** RPG::Enemy
#------------------------------------------------------------------------------
#  EXTENSION: Define level
#==============================================================================
 
class RPG::Enemy
 
  attr_writer :level  # An enemies defined level
 
  #---------------------------------------------------------------------------
  # RPG::Enemy#name
  #   ALIASED: Extract the enemies level before returning the name.
  #---------------------------------------------------------------------------
  unless method_defined?(:name_ILC_extract_level)
    alias_method(:name_ILC_extract_level, :name)
  end
  def name
    extract_level_from_name  unless defined?(@level)
    name_ILC_extract_level
  end
 
  #---------------------------------------------------------------------------
  # RPG::Enemy#level
  #   Extract and return the enemies level.
  #---------------------------------------------------------------------------
  def level
    extract_level_from_name  unless defined?(@level)
    return @level
  end
 
  #---------------------------------------------------------------------------
  # RPG::Enemy#extract_level_from_name
  #   Try to extract the enemies new level from its name.
  #---------------------------------------------------------------------------
  def extract_level_from_name
    @name.slice!(/\s*\[\s*(\d+)\s*\]\s*/)
    @level = $1 != nil ? $1.to_i : 1
  end
end
 
 
#==============================================================================
# ** RPG::Enemy
#------------------------------------------------------------------------------
#  EXTENSION: Redefine Damage Popup
#==============================================================================
 
class RPG::Sprite
 
  attr_writer :critical_text  # Critical Text
 
  #---------------------------------------------------------------------------
  # RPG::Sprite#critical_text
  #   Return critical text message
  #---------------------------------------------------------------------------
  def critical_text
    @critical_text || POP_CRI
  end
 
  #---------------------------------------------------------------------------
  # RPG::Sprite#damage
  #   REDEFINE: Alter critical text message
  #---------------------------------------------------------------------------
  def damage(value, critical, sp_damage = nil)
    dispose_damage(0...@_damage_durations.size)
    @_damage_sprites = []
    if value.is_a?(Numeric)
      damage_string = value.abs.to_s
    else
      damage_string = value.to_s
    end
    @damage_size = 1 if !MULTI_POP
    @damage_size = damage_string.size if MULTI_POP
    for i in 0...@damage_size
      letter = damage_string[i..i] if MULTI_POP
      letter = damage_string if !MULTI_POP
      bitmap = Bitmap.new(160, 48)
      bitmap.font.name = DAMAGE_FONT
      bitmap.font.size = DMG_F_SIZE
      bitmap.font.color.set(0, 0, 0)
      bitmap.draw_text(-1, 12-1,160, 36, letter, 1)
      bitmap.draw_text(+1, 12-1,160, 36, letter, 1)
      bitmap.draw_text(-1, 12+1,160, 36, letter, 1)
      bitmap.draw_text(+1, 12+1,160, 36, letter, 1)
      if value.is_a?(Numeric) and value < 0
        bitmap.font.color.set(HP_REC_COLOR[0],HP_REC_COLOR[1],HP_REC_COLOR[2]) if !sp_damage
        bitmap.font.color.set(SP_REC_COLOR[0],SP_REC_COLOR[1],SP_REC_COLOR[2]) if sp_damage
      else
        bitmap.font.color.set(HP_DMG_COLOR[0],HP_DMG_COLOR[1],HP_DMG_COLOR[2]) if !sp_damage
        bitmap.font.color.set(SP_DMG_COLOR[0],SP_DMG_COLOR[1],SP_DMG_COLOR[2]) if sp_damage
        bitmap.font.color.set(CRT_DMG_COLOR[0],CRT_DMG_COLOR[1],CRT_DMG_COLOR[2]) if critical 
      end
      bitmap.draw_text(0, 12,160, 36, letter, 1)
      if critical and CRITIC_TEXT and i == 0
        x_pop = (MULTI_POP ? (damage_string.size - 1) * (DMG_SPACE / 2) : 0)
        bitmap.font.size = ((DMG_F_SIZE * 2) / 3).to_i
        bitmap.font.color.set(0, 0, 0)
        #bitmap.draw_text(-1 + x_pop, -1, 160, 20, POP_CRI, 1)
        #bitmap.draw_text(+1 + x_pop, -1, 160, 20, POP_CRI, 1)
        #bitmap.draw_text(-1 + x_pop, +1, 160, 20, POP_CRI, 1)
        #bitmap.draw_text(+1 + x_pop, +1, 160, 20, POP_CRI, 1)
        #bitmap.font.color.set(CRT_TXT_COLOR[0],CRT_TXT_COLOR[1],CRT_TXT_COLOR[2]) if critical 
        #bitmap.draw_text(0 + x_pop, 0, 160, 20, POP_CRI, 1)
        text = critical_text
        bitmap.draw_text(-1 + x_pop, -1, 160, 20, text, 1)
        bitmap.draw_text(+1 + x_pop, -1, 160, 20, text, 1)
        bitmap.draw_text(-1 + x_pop, +1, 160, 20, text, 1)
        bitmap.draw_text(+1 + x_pop, +1, 160, 20, text, 1)
        bitmap.font.color.set(CRT_TXT_COLOR[0],CRT_TXT_COLOR[1],CRT_TXT_COLOR[2]) if critical 
        bitmap.draw_text(0 + x_pop, 0, 160, 20, text, 1)
        #--- EDIT
      end
      if critical and CRITIC_FLASH
        $game_screen.start_flash(Color.new(255, 255, 255, 255),10)
      end
      @_damage_sprites[i] = ::Sprite.new(self.viewport)
      @_damage_sprites[i].bitmap = bitmap
      @_damage_sprites[i].ox = 80
      @_damage_sprites[i].oy = 20
      @_damage_sprites[i].x = self.x + i * DMG_SPACE
      @_damage_sprites[i].y = self.y - self.oy / 2
      @_damage_sprites[i].z = DMG_DURATION + 3000 + i * 2
    end
  end
end
 
 
#==============================================================================
# ** Sprite_Battler
#------------------------------------------------------------------------------
#  EXTENSION: Redefine Damage Popup
#==============================================================================
 
class Sprite_Battler
 
  #---------------------------------------------------------------------------
  # Sprite_Battler#damage_pop
  #   ALIASED: Alter critical damage text.
  #---------------------------------------------------------------------------
  unless method_defined?(:damage_pop_ILC_define_crit_text)
    alias_method(:damage_pop_ILC_define_crit_text, :damage_pop)
  end
  def damage_pop(*args)
    self.critical_text = POP_CRUSH  if @battler.crushing
    damage_pop_ILC_define_crit_text(*args)
    self.critical_text = nil
  end
end
zum Lesen den Text mit der Maus markieren


Einstellungsmöglichkeiten:
Einige Möglichkeiten zum anpassen der Schadensformeln finden sich im ersten Scriptteil, aufgeteilt in Angriffs- und Skill-Formeln. Der Angreifer ist dabei stets als user bezeichnet, der Verteidiger ist self.
Die geforderte Schadensklasse für Ziele wird duch ein Element festgelegt, dessen ID am Anfang des ersten Scriptteils bestimmt werden kann.
Die Anfälligkeiten der Gegner/Klassen entsprechen der gewählten Schadensklasse:
[C] => Str
[D] => Dex
[E] => Agi
[F] => Int

Ich werde nochmal darüberschauen, bisher wurde das Ganze praktisch nicht getestet und wird daher nicht fehlerfrei sein.
Update: Jetzt zumindest angetestet, ob die Formeln stimmen sollte evtl. auch nochmal an passenden Beispielen geprüft werden.

Dieser Beitrag wurde bereits 23 mal editiert, zuletzt von »Irrlicht« (3. Oktober 2014, 00:10)


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

3

Freitag, 26. September 2014, 16:08

Hey,

erstmal vielen vielen Dank, dass du dich dem Problem angenommen hast!
Werde sofort den Skript testen und Feedback geben.

Zum Attack- Table:
Ich sehe gerade, dass ich da einen Fehler drin habe^^.
Bevor ich da lange erkläre mache ich es lieber so:
Das mein ich mit Attack Table:

Bild

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

4

Freitag, 26. September 2014, 16:27

Huhu,

derzeit wirst du wohl noch nicht allzuviel Freude daran haben, im Moment sind wenigstens 2 fehlerverursachende Flüchtigkeitsfehler drin (wenn ein Actor angegriffen wird). Im Moment beißt sich das Ganze aber ohnehin noch mit dem "Actor Advanced Status", von daher ist das Script leider ohnehin noch nicht "fertig".
Ich werd aber noch im Laufe des Tages eine Korrektur verfassen.


Okay, die Abfragereihenfolge stimmt damit zumindest schon einmal, ich hatte mich bei "Attack-Table" etwas an WoW erinnert, wo die Trefferchancen meines Wissens nicht nacheinander, sondern nebeneinander ausgewürfelt wurden (d.h. wenn du eine 20% Kritchance hättest und zu 80% verfehlst würden diese die Tabelle vollständig füllen und keine normalen Treffer mehr zulassen, sofern mich meine Erinnerung nicht täuscht).


Ansonsten nochmal zum "Actor Advanced Status":
- verwendest du das Zwei-Waffen-System aus dem Script?
- verwendest du die Attribute zum beeinflussen der kritischen Trefferchance bzw. des kritischen Schadens? (crt, dmg, rcrt, rdmg)
- verwendest du alternative Waffen-Schadenstypen? (einstellbar in Weapon_Damage_Type)

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

5

Freitag, 26. September 2014, 17:21

Zitat


Okay, die Abfragereihenfolge stimmt damit zumindest schon einmal, ich hatte mich bei "Attack-Table" etwas an WoW erinnert, wo die Trefferchancen meines Wissens nicht nacheinander, sondern nebeneinander ausgewürfelt wurden (d.h. wenn du eine 20% Kritchance hättest und zu 80% verfehlst würden diese die Tabelle vollständig füllen und keine normalen Treffer mehr zulassen, sofern mich meine Erinnerung nicht täuscht).


Genau daher kam mir auch die Idee, dass ich so ein Attack- Table einbaue^^.
War mir nur nach alle den Jahren meiner Abstinenz nicht mehr so sicher, in welcher Reihenfolge es genau kam.

Zitat

-verwendest du das Zwei-Waffen-System aus dem Script?

Ja.
Allerdings gäbe es ein Problem mit dem Feature oder? Ich hatte mir erhofft, dass ich es so einstellen kann, dass
Zwei-Waffen-Klassen einen normalen Angriff zweimal Angreifen (also einmal mit der Haupthandwaffe mit 100% Schaden und eben
der ATK der Haupthandwaffe.
Und das zweite Mal mit der Nebenhandwaffe (und der ATK der Nebenhandwaffe) und dem eingestellten Schaden im Skript.)
Mit Skills sollte aber nur einmal angegriffen werden.
Ist das Problem im Skript leicht zu beheben? Ansonsten überleg ich mir eine andere Lösung.


Zitat

- verwendest du die Attribute zum beeinflussen der kritischen Trefferchance bzw. des kritischen Schadens? (crt, dmg, rcrt, rdmg)

Nein.

Zitat

verwendest du alternative Waffen-Schadenstypen? (einstellbar in Weapon_Damage_Type)

Noch benutze ich es. Aber ich denke, dass der Sinn dieses Features bei den neuen Waffen sowieso entfallen würde,
da dann ein AGI- Charakter sowieso mit AGI normalen Schaden austeilt und nicht mit STR.

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

6

Samstag, 27. September 2014, 14:52

Den vorherigen Post etwas korrigiert und ein paar Fehler beseitigt.
Die Scriptteile müssen nun unter dem "Advanced Actor Status" Script eingefügt werden damit Änderungen nicht davon überschrieben werden.

- Alle Einstellungsmöglichkeiten finden sich nun im ersten Scriptteil

- Ich habe versucht die Methoden für die Formeln möglichst einfach zu halten, allerdings bin ich mir nicht sicher ob es geglückt ist... Die relevanten Formeln beginnen dabei in Zeile 98 (normale Angriffe) bzw. 146 (Skills)

- Zusätzlich zu atk kann nun weapon_atk für die Angriffskraft der aktuellen Waffe verwendet werden

- Die Attribute crt, dmg, rcrt, rdmg sind in die Schadensformel integriert für den Fall dass sie doch einmal benötigt werden.

- Weapon_Damage_Type hat vorerst keine Wirkung mehr (es sei denn du baust es in die Schadensformeln ein)



Das Problem des doppelten Angriffs besteht allerdings immernoch, da ich abseits von der Schadensberechnung nicht allzuviel geändert habe. Bisher hab ich auch noch nicht herausgefunden was genau den zweiten Angriff überhaupt auslöst.
EDIT: Argh...^^
Du kannst im "SBS Config" - Script einstellen welche Attacken/Skills welche Aktionssequenzen haben. Normalerweise bekommen Skills mit ATK-F > 0 als Aktionssequenz die der normalen Attacke zugewiesen. Die Sequenz enthält auch Kommandos für einen zweiten Angriff.
Eine mögliche Lösung:
Spoiler
-> Ändere die Standard-Aktion für physische Skills in Zeile 1609 von
return "NORMAL_ATTACK" if self.atk_f > 0
in
return "NORMAL_ATTACK_SKILL" if self.atk_f > 0
Anschließend kopiere die Aktionssequenz von "NORMAL_ATTACK" aus Zeile 820-822.
Nenne die Kopie "NORMAL_ATTACK_SKILL" und entferne "WEAPON_SWING_VL","OBJ_ANIM_L","Two Wpn Only","16" aus der Sequenz. :)
zum Lesen den Text mit der Maus markieren



Ich weiß nicht ob du eine "Attack-Table" wie in World of Warcraft haben wolltest oder nicht, bisher wird daher nach Makerstandard verfahren (d.h. 5% kritische Trefferchance bedeutet dass 5% der erfolgreichen Angriffe kritisch sind).

Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von »Irrlicht« (28. September 2014, 01:37)


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

7

Dienstag, 30. September 2014, 13:40

Nochmal vielen Dank für die Arbeit!
Werde direkt heut Abend den Skript ausprobieren.

Zitat


EDIT:
Wegen den doppelten Angriff:
In Zeile 1609 im SBS Config befindet sich bei mir:

Ruby Quellcode

1
#                     The less current HP you have, the less damage.

Die gesuchte Stelle wäre bei mir 1581, wenn das korrekt ist.

Wenn ich dass dann so umändern und im Skript einstelle, dass die Nebenhandwaffe
z.B. nur 50% des Schadens austeilt, dann funktioniert das nun?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mitsch93« (30. September 2014, 13:40)


Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

8

Dienstag, 30. September 2014, 19:04

Jetzt wo du es erwähnst, an der Stelle war doch noch ein Schreibfehler...
Also nochmal eine Korrektur des 2ten Parts des Scripts:

- Schreibfehler in einem Konstantennamen korrigiert
- Hit-Chance von Skills korrigiert (war um den Faktor 100 zu hoch)
- Effektivität von Skills korrigiert (beträfe nur das Menü)

Ansonsten:
Was die Waffenwahl beim Angriff angeht hab ich die Vorlage des "Advanced Actor Status" weitgehend übernommen. Will heißen beim ersten Treffer eines normalen Angriffs wird die Haupthandwaffe verwendet (bei 2 Waffen), ab dem zweiten Treffer die Schildhandwaffe.
Allerdings könnte es unter Umständen sein dass diese Praxis durch das ATB-Script beeinflusst wird. Normalerweise wird durch das "Advanced Actor Status" - Script bei jedem Runden-/Aktionsende wieder auf die Haupthandwaffe zurückgewechselt. Da es im ATB kein festes Rundenende gibt könnte es sein dass zwischen dem ersten- und dem zweiten Angriff das Rundenende eintritt... Müsste ich aber auch nochmal nachprüfen...

Abgesehen davon sollten die unter TWO_SWORDS_STYLE bzw. Dual_Attack_Power eingestellten Werte berücksichtigt werden.

Die angegebene Zeile kann abweichen, je nach dem was du sonst noch an diesem Script angepasst hast. Die Zeile müsste sich in der Methode base_action der Klasse RPG::Skill befinden.
Alles in der Nähe von 1600 ist auf jeden Fall plausibel. :)

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

9

Mittwoch, 1. Oktober 2014, 20:27

Das einzige was jetzt noch fehlt, wäre die Aktualisierung im Statusmenü.
Habe mir das eben mal angeschaut, aber weiß nicht genau, wo ich da die neuen
Formeln reinpacken kann.

Momentan sieht das Menü so aus:
Bild

Das Menü ist ja im Actor Advanced Status integriert:
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#==============================================================================
# ■ Window_Status
#==============================================================================
class Window_Status < Window_Base
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    draw_actor_graphic(@actor, 40, 112)
    draw_actor_name(@actor, 4, 0)
    draw_actor_class(@actor, 4 + 144, 0)
    draw_actor_level(@actor, 96, 32)
    draw_actor_state(@actor, 96, 64)
    draw_actor_hp(@actor, 96, 112, 172)
    draw_actor_sp(@actor, 96, 144, 172)
    for i in 0..2
      draw_actor_parameter(@actor, 96, 164 + [(236/(Extra_Status.size + 6)), 20].max * i, i)
    end
    for i in 3..6
      draw_actor_parameter(@actor, 96, 168 + [(236/(Extra_Status.size + 6)), 20].max * i, i)
    end
    for i in 7..(Extra_Status.size + 6)
      draw_actor_parameter(@actor, 96, 172 + [(236/(Extra_Status.size + 6)), 20].max * i,
        Extra_Status[i - 7])
      end
    #
    self.contents.font.size = 14
    self.contents.font.color = system_color
    self.contents.draw_text(320, 48, 80, 32, 'EP')
    self.contents.draw_text(320, 80, 80, 32, 'Nächste Stufe:')
    self.contents.draw_text(400, 128, 128, 32, 'Ausrüstung:')
    self.contents.font.color = normal_color
#    self.contents.font.codraw_actor_hplor = normal_color
    self.contents.draw_text(400, 48, 84, 32, @actor.exp_s, 2)
    self.contents.draw_text(400, 80, 84, 32, @actor.next_rest_exp_s, 2)
    self.contents.font.color = system_color  
    #
    self.contents.font.size = 12
    data = []
    for i in 0...@actor.equip_kind.size
      id = @actor.equip_kind[i]
      if id == 0
        data.push($data_weapons[@actor.equip_id[i]])
      elsif id == 1 and @actor.two_swords_style
        data.push($data_weapons[@actor.equip_id[i]])
      elsif id != 0 or (id == 1 and not @actor.two_swords_style)
        data.push($data_armors[@actor.equip_id[i]])
      end
    end
    #
    self.contents.font.size = 14
    self.contents.font.color = system_color
    return if data.size == 0
    for i in 0...@actor.equip_names.size
      name = @actor.equip_names[i]
      self.contents.draw_text(320, 160 + [(280/data.size), 24].max * i, 92, 32, name)
    end
    for i in 0...data.size
      draw_item_name(data[i], 412, 160 + [(280/data.size), 24].max * i)
    end
  end
  #--------------------------------------------------------------------------
  def dummy
    self.contents.font.color = system_color
    self.contents.draw_text(400, 128, 128, 32, 'Ausrüstung')
    data = []
    for i in 0...@actor.equip_kind.size
      id = @actor.equip_kind[i]
      if id == 0
        data.push($data_weapons[@actor.equip_id[i]])
      elsif id == 1 and @actor.two_swords_style
        data.push($data_weapons[@actor.equip_id[i]])
      elsif id != 0 or (id == 1 and not @actor.two_swords_style)
        data.push($data_armors[@actor.equip_id[i]])
      end
    end
    self.contents.font.color = system_color
    return if data.size == 0
    for i in 0...@actor.equip_names.size
      name = @actor.equip_names[i]
      self.contents.draw_text(320, 160 + [(280/data.size), 24].max * i, 92, 32, name)
    end
    for i in 0...data.size
      draw_item_name(data[i], 412, 160 + [(280/data.size), 24].max * i)
    end
  end
end

zum Lesen den Text mit der Maus markieren


Im Statusmenü müsste nun TREFFERCHANCE und KRITISCH herausgenommen und folgende Attribute
eingebaut werden:
- Physische Schadensverringerung in %
- Magische Schadensverringerung in %
- Kritische Trefferchance in %
- Ausweichchance in %

Um die Attribute einzugliedern benötige ich dann ja noch ein Array, in dem ich die fiktiven GES und BEW Werte (je nach
Level des Chars) der Gegner einfügen kann (wird ja benötigt um zB Ausweichchance zu berechnen).

Das selbe habe ich schonmal in meinem letzten Projekt gemacht, im MOG Menü ging das auch ziemlich einfach, aber bei dem
hier traue ich mich nicht so wirklich ran.


Zitat


EDIT:

Habe schonmal die richtige Stelle in Window_Base gefunden.
Allerdings wird mir hierbei für den Parameter = 0 angezeigt.

Ruby Quellcode

1
2
3
4
5
6
when 8
      parameter_name = "Phys. Schadensverringerung %"
      parameter_value= (50/(26+4*actor.level))*actor.pdef
      if parameter_value >=65 then
          parameter_value= (58/(26+16*actor.level))*(actor.pdef-((26+4*actor.level)/50)*65)
      end



Zitat


EDIT #2:

Bin gerade beim Testen des 2-Hand- Stils.
Mir ist aufgefallen, dass mein Charakter Level 1 komplett ohne Ausrüstung trotzdem 10 ATK besitzt.
Steh ich gerade auf dem Schlauch oder woher kommt das? Müsste doch normalerweise 0 ATK sein.

~Fehler mit der ATK gefunden und behoben



Zitat


EDIT 3:

Folgendes Problem habe ich noch mit dem KS.
Manchmal bekomme ich folgenden Error:
Bild



Btw:
Wäre es möglich den Zweihandstil dahingehend umzuändern, dass
- die eingestellte Schwächung des Angriffs, die man unter Dual_Attack_Power
einstellen kann, nur wirkt, wenn wirklich in der Haupt- und Schildhand eine Waffe getragen wird.
D.h. wenn man nur eine Waffe in der Haupthand trägt (also eine Einhand oder eine Zweihandwaffe),
wird die Kraft des Angriffs mit Dual_Attack_Power nicht verändert.
Glaube am leichtesten ist das zu machen, indem man sagt die Waffe in der Haupthand -egal ob einhändig oder
zweihändig- fügt immer den normalen Schaden zu. Sollte man eine Waffe in der Schildhand tragen, so
fügt diese den abgeschwächten Schaden - den man unter
Dual_Attack_Power einstellen kann- zu.
- Zweihandklassen trotzdem Schilde tragen können.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Mitsch93« (1. Oktober 2014, 20:27)


Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

10

Mittwoch, 1. Oktober 2014, 21:12

Huhu,

erstmal nochmal zwei Kleinigkeiten im ersten Scriptteil:
Bei zwei Formeln sind noch Unstimmigkeiten drin:

Zeile 41 (Formel für die Schadensreduktion) sollte so aussehen:
value = 0.65 + 0.58 / (26 + 16 * self.level) * (defense_value - 0.65 / basis)

Zeile 95 (Formel für die Ausweichchance) sollte so aussehen:
0.01 * (5.0 + self.eva / (0.5 * self.level) + self.agi / (5.0 * user.dex))


Zum Zweihandstil:
Bisher sollte die Bestimmung der Angriffskraft folgende Rangfolge haben:
- Ist der Angreifer ein Gegner oder ein unbewaffneter Actor: normale ATK
- Hat der Angreifer keine zweite Waffe: ATK der ersten Waffe
- Sonst: ATK der ausgewählten Waffe, multipliziert entweder mit TWO_SWORDS_STYLE[Index] oder Dual_Attack_Power

Theoretisch sollte es also passen, wenn es das nicht tut schau ich nochmal.


Zur Fehlermeldung:
Interessant, die hatte ich nicht bekommen. Wie viele Treffer findest du wenn du die Scripts nach dem Methodennamen attack_crush_chance durchsuchst? (CTRL + SHIFT + F, vorrausgesetzt der Name steht in der besagten Zeile).
Kommt es vor dass ein normaler Angriff kritisch trifft ohne dass die Fehlermeldung vorher auftritt?

Ansonsten füge mal Testweise dieses Script ein, damit sollten alle aktiven Aufrufe angezeigt werden bevor der Fehler nocheinmal auftritt:
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
class Scene_Battle
 
  alias_method(:main_ILC_findStackTrace, :main)
  def main
    begin
      main_ILC_findStackTrace
    rescue SystemStackError
      print $!.backtrace.map { |string|
        match = string.match(/([^:]*):([^:]*)(?::([^:]*))?/)
        next "<Unresolved> #{string}"  unless match
        if (/Section(\d+)/) === match[1]
          set = $RGSS_SCRIPTS[$1.to_i]
          name = "Script #{$1.to_i} #{set ? "(#{set[1]})" : '<Unknown Script>'}"
        else
          name = match[1]
        end
        line = match[3] ? ", line #{match[2]}" : ""
        next "#{name}#{line} : #{match[3] || match[2]}"
      }.join("\n")
      raise $!
    end
  end
end
zum Lesen den Text mit der Maus markieren



*Zum Menü folgt noch was*
Der Grund warum bei deiner Menüformel 0 herauskommt dürfte sein dass du nur mit Ganzzahlen rechnet. Sind bei einer Division sowohl Divisor als Divident eine Ganzzahl, wird das Ergebnis ebenfalls in eine Ganzzahl konvertiert:
5 / 3 # => 1
5.0 / 3 # => 1.6666666667
5 / 3.0 # => 1.6666666667
5.0 / 3.0 # => 1.6666666667

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

11

Mittwoch, 1. Oktober 2014, 22:44

Zur Fehlermeldung:

attack_crush_chance kommt bei mir in
Skripteil 1 Zeile 105 und Teil 2 166 auf. Kann es auch sein, dass
das einfach nur ein Riesenfail von mir war, da ich vergessen habe ein Level
im Gegnernamen anzugeben?

Meine Reaktion, wenn meine Vermutung stimmt:
Spoiler

Bild
zum Lesen den Text mit der Maus markieren



Zum Zweihandstil:

Also hatte eben mal was ausprobiert: Zwei Waffen, eine Haupt- und eine Schildhand.
Beide die gleiche ATK. Beim Angreifen machen beide den ca den gleichen Schaden am Gegner.
-> eigentlich sollte ja Haupthand mehr Schaden machen und nur die Nebenhandwaffe sollte
durch die eingestellte Schwächung betroffen sein.

Nächster Versuch mit nur der Haupthandwaffe und diesmal keiner Waffe. Dabei macht sie den selben Schaden wie im ersten Versuch.

Zum Menü:

Mache es jetzt so, hatte vor ein paar Jahren mal ein Skript
zum aufrunden von Floats gefunden.

Ruby Quellcode

1
2
3
4
5
6
parameter_name = "Phys. Schadensverringerung %"
  	abw = (50.0/(26.0+4.0*actor.level))*actor.pdef
  	if abw >= 65 then
      	abw = (58/(26+16*actor.level))*(actor.pdef-((26+4*actor.level)/50)*65)
  	end
  	parameter_value = abw.round_to(2)


Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/ruby
 
puts "Content-type: text/html\n\n"
 
class Float
	def round_to(i)
    	f = (10 ** i).to_f
    	nr = self * f
    	return nr.round / f
	end
end





Zitat

EDIT:
Das Menü hab ich doch noch hinbekommen^^.

Bild


Hab die gegnerische DEX fix mit einer normalen Funktion gelöst.

Ruby Quellcode

1
2
3
4
5
6
when 12
  	@enemyy_dex = 20+@actor.level*1.5
  	parameter_name = "Ausweichchance %"
  	avoid = 5.0+actor.eva/(0.5*actor.level)+actor.agi/(@enemyy_dex*5.0)
  	parameter_value = avoid.round_to(2)
	end


Sollte das im Verlauf des Spieles zu ungenau werden, werde ich das mit case Versuchen.
Also

Ruby Quellcode

1
2
3
4
 case @actor.level 
  	when 1 then @enemyy_dex = 20
  	when 2 then @enemyy_dex = 22
  	end

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mitsch93« (1. Oktober 2014, 22:43)


Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

12

Donnerstag, 2. Oktober 2014, 00:10

Zur Fehlermeldung:

Wenn aus einem Gegnernamen kein Level herausgelesen werden kann bekommt der Gegner Level 1, sollte also kein Problem sein.
Was mich nach wie vor interessieren würde ist ob der Fehler bei dir jedes Mal auftritt wenn der Battler eigentlich kritisch treffen sollte.


Zum Zweiwaffenstil:

Ich muss zugeben ich habe mir die Beschreibung der Scripts weniger durchgelesen...
Soweit ich das verstanden habe hängt es davon ab welchen Wert du der Konstanten Use_Old_Two_Sword_Beahave gegeben hast. Bei <true> werden bei der Berechnung die Werte aus der Konstanten TWO_SWORDS_STYLE (aus dem SBS-Config-Script) berücksichtigt, bei <false> der Wert von Dual_Attack_Power.
Dual_Attack_Power wirkt sich dabei auf beide Waffen gleichermaßen aus wenn der Spieler 2 Waffen ausgerüstet hat.

Evtl. ist es etwas ungünstig dass sich dieser Faktor nur auf den ATK-Wert der Waffe auswirkt. Da bei deiner neuen Schadensformel alle Werte zusammenaddiert werden hat ein Faktor von 50% evtl. nicht mehr so große Auswirkung wie bei der normalen Schadensformel. Bei meinen Testkämpfen gab es aber durchaus Unterschiede in den Schadenszahlen (allerdings mit den XP-Standardcharakteren)

Die erweiterte ATK-Berechnungen für Skills hatte ich bisher nicht übernommen.

Falls du hier noch Änderungswünsche hast sag bescheid.


Zum Menü:

Freut mich dass du es hinbekommen hast. :)

Bei deiner geposteten Formel würde ich evtl. in diesem Teil (26+4*actor.level)/50) noch etwas "verfließkommazahlen" um Rundungsungenauigkeiten bei der Division zu vermeiden.

Wahlweise hättest du auch die Formel aus dem Script aufrufen können:
100 * @actor.damage_reduction(@actor.pdef)

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

13

Donnerstag, 2. Oktober 2014, 10:17

Zur Fehlermeldung:

Wollte gerade mal ausprobieren, ob sie auftritt, wenn ich kritisch treffe und habe daher einfach mal
dem Charakter eine Rüstung mit 100 EVA gegeben. Das hat dann auf Level 1 eine kritische Trefferchance von 206%
erzeugt (und eine ebenso hohe Ausweichchance).
Seltsam war jetzt, dass der Gegner allen Angriffen ausgewichen ist.

Glaube das war ein kleiner Fehler im Skript, habe die Formel jetzt so umgestellt.

Ruby Quellcode

1
2
3
4
def attack_eva_chance(user)
	#0.01 * (5.0 + user.eva / (0.5 * user.level) + self.agi / (5.0 * user.dex))
  	0.01 * (5.0 + self.eva / (0.5 * self.level) + self.agi / (5.0 * user.dex))
end


Jetzt trifft der Charakter nur noch kritisch und weicht allen Angriffen des Gegners aus - so wie
es mit 206% sein sollte^^.
Dabei habe ich aber keine Fehlermeldung bekommen.

Hab jetzt nochmal versucht, Fehler zu reproduzieren und mir scheint es so, als würde er dann auchtauchen, wenn
der Gegner den Charakter gerade angegriffen hat und kurz danach der Charakter (ca 1 Sekunde) am Zug ist und ebenfalls angreift.

Habe eben auch den Error bekommen, als der Gegner angegriffen hatte, Charakter wich aus und konnte direkt danach Aktion durchführen.
Beim Bestätigen der Aktion tauchte der Error auf.

Bei "Rascher Angriff" taucht der Error auch manchmal auf.

Könnte es damit zusammenhängen, dass ich wegen Testzwecken relativ schnell ENTER durchhaue im Kampf? Mir scheints nämlich damit
zusammenzuhängen. Wenn ich relativ gemütlich ENTER drücke, hatte ich bislang den Error noch nicht.

Spoiler

Bild
zum Lesen den Text mit der Maus markieren


Zum Zweihandstil:
Ah, hatte die englische Beschreibung falsch verstanden deshalb hab ich es auf true gesetzt.
Jetzt steht es auf false mit den Werten aus dem Config (100 für Haupthand, 50 für Schildhand).

Dazu bräuchte ich folgende Änderungen
  • Dual Wield Charaktere können Schilde tragen, wenn es ihre Klasse erlaubt
  • Dual Wield Charaktere können Zweihandwaffen tragen, wenn es ihre Klasse erlaubt
  • Wenn ein Dual Wield Charakter mit der Schildhandwaffe angreift, soll nicht die ATK sondern der gesamte Schaden um den eingestellten Wert (also hier: 50%) sinken

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

14

Donnerstag, 2. Oktober 2014, 10:51

Ja, da hatte ich mich mit der Formel etwas verschrieben. :)
Ein anderer Fehler steckte noch in der Formel zur Schadensreduktion (siehe Anfang des letzten Posts, bei dir dürften die Zeilenangaben um eine Zeile verschoben sein).

Beim Auftauchen der Fehlermeldung wird durch name_ILC_extract_level offenbar immer wieder die selbe Methode aufgerufen. Ein Grund dafür könnte sein dass die Zeile alias_method(:name_ILC_extract_level, :name) mehrmals ausgeführt wird, was passieren könnte wenn du das Spiel mit F12 zurücksetzt oder das Script versehendlich zweimal eingefügt hast.

Viele Scripte fangen daher doppelte Aliases ab. Hatte ich hier nicht getan und mich auf Lösungen wie diese verlassen. :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Irrlicht« (2. Oktober 2014, 14:04)


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

15

Donnerstag, 2. Oktober 2014, 15:55

Hatte es verpennt mit den Formeln <.<
Sind jetzt implementiert.

Zur Fehlermeldung:
Doppelt habe ich momentan keine Skripte drin.
Tatsächlich konnte ich den Error bisher noch nicht reproduzieren, wenn ich das Spiel "normal" neu gestartet (und nicht mit F12 neugestartet)
habe.

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

16

Donnerstag, 2. Oktober 2014, 23:54

Huhu,

Damit der Angriff nur die Hälfte des Schadens verursacht könntest du auch einen Faktor von 0.5 in die Schadensformel einbauen, wenn sich der Angreifer im zweiten Angriff befindet (if user.second_attack).
Für Skills ist diese Bedingung allerdings nicht anwendbar.

Ich hab die Scriptteile nochmal aktualisiert. Neben den Formelkorrekturen werden nun doppelte Aliases vorsichtshalber abgefangen.


Für die anderen zwei Punkte könntest du dieses Script verwenden.
Es ist nicht ganz hübsch, aber sollte hoffentlich seinen Zweck erfüllen:

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
#############
#
#  "Erweiterung für optionalen Zwei-Schwerter-Stil" - Script
#    Version  1.0 (2nd October 2014)
#    By  Irrlicht <www.rpg-studio.org>
# 
# # Beschreibung: ------------------------------------------------------------
  #   Dieses Script dient als Erweiterung für Atoas "Advanced Status" Script
  #   und sollte unter diesem eingefügt werden.
  #   Charaktere die als Zwei-Waffen-Kämpfer markiert wurden können damit
  #   wahlweise auch Schilde benutzen.
  #   Um das Feature manuell zu nutzen muss vor dem Ausrüsten eines Schildes   #
  #   das two_swords_style - Attribut des Actors auf false gesetzt werden.     #
  # -------------------------------------------------------------- #############
 
 
#==============================================================================
# ** Game_Actor
#------------------------------------------------------------------------------
#  EXTENSION: Add an accessible "two_swords_style" attribute.
#==============================================================================
 
class Game_Actor
 
  #-------------------------------------------------------------------------
  # * Game_Actor#initialize
  #  ALIASED: Initialize "two swords style" attribute.
  #-------------------------------------------------------------------------
  unless private_method_defined?(:initialize_ILC_initTwoSwords)
    alias_method(:initialize_ILC_initTwoSwords, :initialize)
  end
  def initialize(actor_id)
    @two_swords_style = false
    initialize_ILC_initTwoSwords(actor_id)
  end
 
  #-------------------------------------------------------------------------
  # * Game_Actor#two_swords_possible?
  #  Alias for the old 'two_swords_style' method, defined in "Advanced Status"
  #-------------------------------------------------------------------------
  # def two_swords_possible?
  unless method_defined?(:two_swords_possible?)
    alias_method(:two_swords_possible?, :two_swords_style)
  end
 
  #-------------------------------------------------------------------------
  # * Game_Actor#two_swords_style
  #  REDEFINED: Returns whether the offhand slot is used to carry a weapon.
  #-------------------------------------------------------------------------
  def two_swords_style
    @two_swords_style and two_swords_possible?
  end
 
  #-------------------------------------------------------------------------
  # * Game_Actor#two_swords_style=
  #  Set the "two_swords_style" attribute if possible.
  #-------------------------------------------------------------------------
  def two_swords_style=(verity)
    return  if verity and not two_swords_possible?
    remove_left_equip_actor  if @two_swords_style != verity
    @two_swords_style = verity
  end
end
 
 
#==============================================================================
# ** Window_EquipItem
#------------------------------------------------------------------------------
#  EXTENSION: Allow Dual Wield Actors to select Shield Type Items.
#==============================================================================
 
class Window_EquipItem
 
  #-------------------------------------------------------------------------
  # * Window_EquipItem#refresh
  #  REDEFINED: Add Shields and two-handed Weapons to the Shield Type Window
  #-------------------------------------------------------------------------
  def refresh
    self.contents.dispose  if self.contents != nil and not self.contents.disposed?
    @data = []
    # Weapons:
    if @equip_type == 0 or (@equip_type == 1 and @actor.two_swords_possible?)
      $data_classes[@actor.class_id].weapon_set.sort.each do |i|
        next  if $data_weapons[i] == nil
        next  if @equip_type == 1 and Right_Hand_Weapons.include?(i)
        next  if @equip_type == 0 and Left_Hand_Weapons.include?(i)
        @data.push($data_weapons[i])  if $game_party.weapon_number(i) > 0
      end
    end
    # Armors:
    if @equip_type > 0
      $data_classes[@actor.class_id].armor_set.sort.each do |i|
        next  if $data_armors[i] == nil
        next  if $data_armors[i].type_id != @equip_type
        @data.push($data_armors[i])  if $game_party.armor_number(i) > 0
      end
    end
    # Lock:
    @data.push(nil) unless @actor.lock_equip(@equip_type)
    @item_max = @data.size
    self.contents = Bitmap.new(width - 32, [row_max, 1].max * 32)
    self.opacity = Equip_Window_Opacity
    for i in 0...(@actor.lock_equip(@equip_type) ? @item_max : @item_max - 1)
      draw_item(i)
    end
  end
end
 
 
#==============================================================================
# ** Scene_Equip
#------------------------------------------------------------------------------
#  EXTENSION: Allow Dual Wield Actors to select Shield Type Items.
#==============================================================================
 
class Scene_Equip
 
  # Parameters for the left window:
  PARAMS = %w(atk pdef mdef str dex agi int eva crt dmg rcrt rdmg)\
  .map { |s| s.to_sym }.freeze
 
  #-------------------------------------------------------------------------
  # * Scene_Equip#equip_item
  #  Let the current Actor equip a specified item.
  #-------------------------------------------------------------------------
  def equip_item(index, item)
    if @actor.equip_kind[index] == 1
      if item.is_a?(RPG::Weapon) and Two_Hands_Weapons.include?(item.id)
        index = @actor.equip_kind.index(0)
        return  if index == nil
      else
        @actor.two_swords_style = item.is_a?(RPG::Weapon)
        return  if @actor.two_swords_style != item.is_a?(RPG::Weapon)
      end
    end
    @actor.equip(index, item == nil ? 0 : item.id)
    update_hands(item)
  end
 
  #-------------------------------------------------------------------------
  # * Scene_Equip#refresh
  #  REDEFINED: Allow switching between Weapons and Shield Type Equips.
  #-------------------------------------------------------------------------
  def refresh
    @help_window.opacity = Equip_Window_Opacity
    if @right_window.index > @right_window.data.size - 1
      @right_window.index = @right_window.data.size - 1
    end
    @actor.equip_kind.each_index do |i|
      window = instance_variable_get("@item_window#{i + 1}")
      window.visible = (@right_window.index == i)
      @item_window = window  if @right_window.index == i
    end
    item1 = @right_window.item
    @left_window.set_new_parameters if @right_window.active
    # Refresh Item:
    if @item_window.active
      @item2 = @item_window.item
      # Remember Actor Settings:
      last_hp = @actor.hp
      last_sp = @actor.sp
      last_two_swords = @actor.two_swords_style
      last_equips = @actor.equip_id.dup
      # Test-Equip new Item:
      equip_item(@right_window.index, @item2)
      set = PARAMS.map { |s| @actor.send(s) }
      # Restore Settings:
      @actor.two_swords_style = last_two_swords
      last_equips.each_with_index do |id, slot_index| 
        @actor.equip(slot_index, id)  if @actor.equip_id[slot_index] != id
      end
      @actor.hp = last_hp
      @actor.sp = last_sp
      # Show new Parameters:
      @left_window.set_new_parameters(*set)
    end
  end
 
  #-------------------------------------------------------------------------
  # * Scene_Equip#update_item
  #  REDEFINED: Adjust the "Two Swords Style" Status of Actors.
  #-------------------------------------------------------------------------
  def update_item
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @right_window.active = true
      @item_window.active = false
      @item_window.index = -1
      return
    end
    if Input.trigger?(Input::C)
      item = @item_window.item
      # ---
      equip_item(@right_window.index, item)
      #@actor.equip(@right_window.index, item == nil ? 0 : item.id)
      #update_hands(item)
      # ---
      @right_window.active = true
      @item_window.active = false
      @item_window.index = -1
      @right_window.refresh
      @item_window.refresh
      $game_system.se_play($data_system.equip_se)
      return
    end
  end
end
zum Lesen den Text mit der Maus markieren

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Irrlicht« (3. Oktober 2014, 00:16)


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

17

Montag, 6. Oktober 2014, 19:26

Läuft alles einwandfrei!

Habe nur gerade ein Problem mit den Bögen, was man im Addon einstellen kann, also
dass eine Bogenanimation angezeigt wird.
Das dafür zuständige Element ist Nr. 17. Die nötige Animation Nr 103 sowie der "Woodarrow" in den Charakter-Ordner
sind ebenfalls vorhanden. Eigentlich sollte es ausreichen, wenn ich bei dem Bogen Element 17 ankreuze und dann sollte
die Bogenanimation angezeigt werden. Das tut es aber irgendwie nicht. Momentan schlägt der Charakter mit den Bogen auf den Gegner ein^^

Zitat

EDIT:

Ich konnte das Problem eingrenzen, beheben allerdings noch nicht.
Ich vermute die Ursache liegt beim Advanced Actor Status Skript.

Habe folgendes ausprobiert:

1.)
Charakter hat zu Anfang keinen Bogen (also keine Waffe Starting Equipment eingestellt).
Gehe ich dann in einen Kampf, schlägt der Charakter unbewaffnet zu wie es sein soll.
Rüste ich dann den Charakter mit einem Bogen aus, schlägt er wieder unbewaffnet zu (ohne Bogen beim Angriff anzuzeigen).
Frage ich per Conditional Branch nach, ob der Bogen ausgerüstet ist, gibt er mir false zurück, obwohl der Charakter den Bogen trägt.
Selbst wenn ich den Bogen per Eventbefehl ausrüsten lassen, gibt die Bedingung mir false zurück.

2.)
Charakter hat zu Anfang den Bogen als Startwaffe.
Bogenanimation wird korrekt im Kampf angezeigt.
Lege ich den Bogen als Ausrüstung ab, greift der Charakter immer noch mit Bogen an (korrekte Animation).
Per Eventbefehl habe ich im Kampf nachgefragt, ob der Charakter mit dem Bogen ausgerüstet ist, und seltsamerweise
sagt er mir "Charakter ist mit Bogen ausgerüstet", selbst wenn ich vorher per Eventbefehl nochmal den Bogen als Ausrüstung entferne.
Selbst wenn ich den Bogen VERKAUFE, sodass er ganz aus Equipment verschwindet, gibt mir die Conditon True zurück und der Charakter
greift mit dem Bogen (und der korrekten Animation) an.



Also wie man sieht gibt es entweder das eine oder andere extrem - der Bogen ist zu Anfang ausgerüstet und damit wird auch
die Animation korrekt angezeigt, oder Bogen ist nicht am Anfang ausgerüstet und alles geht in die Hose.
Eine Idee?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mitsch93« (6. Oktober 2014, 19:26)


Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

18

Dienstag, 7. Oktober 2014, 00:30

Das Problem liegt daran dass das SBS zwar eine zweite Ausrüstungs-Abfrage-Möglichkeit etabliert, diese jedoch nicht konsequent verwendet wird. Das "Advanced Status" - Script ersetzt dabei das alte Ausrüstungssystem (welches stark an eine Waffe + 4 Rüstungen gebunden war), passt jedoch nur die zweite Abfrage-Möglichkeit an das neue System an.

Die Abfragen nach der XP-"Standardvariante" geben nach der Änderung durch "Advanced Status" immer die Werte der Startausrüstung des Actors zurück.


Dieses Script sollte den alten Abfragen zumindest sinnvolle Ergebnisse geben. Wenn du allerdings mehrere identische Slots hast wird der Inhalt des ersten solchen Ausrüstungsslots berücksichtigt. Trägt der Actor zwei Waffen liefert die Abfrage nach der ID des Schildes immer 0.
Außerdem werden durch das Script beim zweiten normalen Angriff die Animationen, Statusveränderungen und Elemente der Schildhandwaffe berücksichtigt:
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#############
#
#  "Equipment ID Fix for Atoas Advanced Status" - Script
#    Version  1.0 (5th October 2014)
#    By  Irrlicht <www.rpg-studio.org>
# 
# # Beschreibung: ------------------------------------------------------------
  #   Dieses Script dient als Erweiterung für Atoas "Advanced Status" Script.
  #   Die Aufrufe  weapon_id  und  armorX_id  sollten damit aktuelle Ergebnisse
  #   liefern, die zugehörigen Setter wurden jedoch nicht angepasst.
  #   Außerdem werden nun die Animationen, Statusveränderungen und Elemente
  #   einer ausgerüsteten Schildhandwaffe berücksichtigt während sich der Actor
  #   im zweiten Angriff befindet (actor.second_attack).
  #   Die Aktionssequenz des Angriffs wird jedoch weiterhin ausschließlich von #
  #   der Haupthandwaffe bestimmt.                                             #
  # -------------------------------------------------------------- #############
 
 
#==============================================================================
# ** Game_Actor
#------------------------------------------------------------------------------
#  EXTENSION: Correct some results regarding the Advanced Status' equip system.
#==============================================================================
 
class Game_Actor
 
  #--------------------------------------------------------------------------
  # * Game_Actor#equip_type_id
  #  Return the ID of an equipped item of the given equip type (0-4).
  #--------------------------------------------------------------------------
  def equip_type_id(type)
    return 0  if type == 1 and two_swords_style
    index = @equip_kind.index(type)
    return (index != nil and @equip_id[index] != nil) ? @equip_id[index] : 0
  end
 
  #--------------------------------------------------------------------------
  # * Game_Actor#weapon_id
  #  REDEFINED: Return the ID of the first equipped main hand weapon.
  #--------------------------------------------------------------------------
  def weapon_id
    return equip_type_id(0)
  end
 
  #--------------------------------------------------------------------------
  # * Game_Actor#armor1_id
  #  REDEFINED: Return the ID of the first equipped shield.
  #--------------------------------------------------------------------------
  def armor1_id
    return equip_type_id(1)
  end
 
  #--------------------------------------------------------------------------
  # * Game_Actor#armor2_id
  #  REDEFINED: Return the ID of the first equipped body armor.
  #--------------------------------------------------------------------------
  def armor2_id
    return equip_type_id(2)
  end
 
  #--------------------------------------------------------------------------
  # * Game_Actor#armor3_id
  #  REDEFINED: Return the ID of the first equipped helmet.
  #--------------------------------------------------------------------------
  def armor3_id
    return equip_type_id(3)
  end
 
  #--------------------------------------------------------------------------
  # * Game_Actor#armor4_id
  #  REDEFINED: Return the ID of the first equipped accessory item.
  #--------------------------------------------------------------------------
  def armor4_id
    return equip_type_id(4)
  end
 
  #--------------------------------------------------------------------------
  # * Game_Actor#selected_weapon
  #  Return the actors active weapon, depending on the second_attack - flag
  #--------------------------------------------------------------------------
  def selected_weapon
    wset = weapons
    return wset[(wset[1] != nil and second_attack) ? 1 : 0]
  end
 
  #--------------------------------------------------------------------------
  # * Game_Actor#element_set
  #  REDEFINED: Get Normal Attack Element by calling selected_weapon.
  #--------------------------------------------------------------------------
  def element_set
    weapon = selected_weapon
    return weapon != nil ? weapon.element_set : []
  end
 
  #--------------------------------------------------------------------------
  # * Game_Actor#plus_state_set
  #  REDEFINED: Get Normal Attack State Change (+)
  #--------------------------------------------------------------------------
  def plus_state_set
    weapon = selected_weapon
    return weapon != nil ? weapon.plus_state_set : []
  end
 
  #--------------------------------------------------------------------------
  # * Game_Actor#minus_state_set
  #  REDEFINED: Get Normal Attack State Change (-)
  #--------------------------------------------------------------------------
  def minus_state_set
    weapon = selected_weapon
    return weapon != nil ? weapon.minus_state_set : []
  end
 
  #--------------------------------------------------------------------------
  # * Game_Actor#animation1_id
  #  REDEFINED: Get Offensive Animation ID for Normal Attacks
  #--------------------------------------------------------------------------
  def animation1_id
    weapon = selected_weapon
    return weapon != nil ? weapon.animation1_id : 0
  end
 
  #--------------------------------------------------------------------------
  # * Game_Actor#animation2_id
  #  REDEFINED: Get Target Animation ID for Normal Attacks
  #--------------------------------------------------------------------------
  def animation2_id
    weapon = selected_weapon
    return weapon != nil ? weapon.animation2_id : 0
  end
end
zum Lesen den Text mit der Maus markieren


Wenn du allerdings vorhast über den Conditional Branch Befehl die Ausrüstung der Gruppenmitglieder abzufragen würde ich aus oben genannten Gründen im Zweifelsfall diese Scriptausrufe empfehlen (nur mit dem SBS möglich):

actor.weapons.include?($data_weapons[ID])
actor.armors.include?($data_armors[ID])

ID ersetzt die ID der Waffe bzw. des Rüstungsitems, statt actor kann
$game_actors[ID]
für den entsprechenden Database-Actor eingesetzt werden.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Irrlicht« (7. Oktober 2014, 03:12)


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

19

Dienstag, 7. Oktober 2014, 14:36

Klappt alles tiptop!

Zu guter letzt ist mir aufgefallen, dass ich ATK zu sehr vernachlässigt habe.
Daher will ich einfach das 1 Punkt den Schaden um 2 erhöht.

Habe ich die beiden Formeln richtig angepasst bzw. habe ich eine Formel vergessen?

Ruby Quellcode

1
2
3
4
5
6
7
8
9
  # Grundschaden eines Angriffs:
  def attack_base_damage(user)
	case user.damage_type
	when :str  then 2.0*user.weapon_atk + 1.5 * user.str
	when :dex  then 2.0*user.weapon_atk + 1.0 * user.dex
	when :agi  then 2.0*user.weapon_atk + 1.0 * user.agi
	when :int  then 2.0*user.weapon_atk + 1.5 * user.str
	end
  end


Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Grundwirkung eines Skills:
  def skill_base_damage(user, skill)
	# - Power:
	value = skill.power.abs
	# - Attribute:
	value += 2.0*user.atk * skill.atk_f / 100.0
	value += user.str * skill.str_f / 100.0
	value += user.dex * skill.dex_f / 100.0
	value += user.agi * skill.agi_f / 100.0
	value += user.int * skill.int_f / 100.0
	# - Bonus durch Schadensklasse:
	case user.damage_type
	when :str  then value += 0.5 * user.str * skill.str_f / 100.0
	when :int  then value += 0.5 * user.int * skill.int_f / 100.0
	end
	# - Vorzeichen wiederherstellen:
	value = -value  if skill.power < 0
	return value
  end

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

20

Mittwoch, 8. Oktober 2014, 01:21

Joa, das sollte so passen.

Freut mich dass es zu funktionieren scheint. :)

Social Bookmarks