Benutzerinformationen überspringen
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.
Neue Kampfformeln für das SBS
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.

Kommen wir zu der Formeltabelle:

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.
- Kleine Indizes mit dem Buchstaben A bedeuten: Angreifer
- 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.
- Angriffe werden in zwei Klassen unterteilt: PHYSISCH und MAGISCH.
- 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%.
- Das Attribut, mit dem der Schaden skaliert, hängt von der Oberklasse des Charakters ab.
- 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.
- Skillangriffe können verfehlen.
- 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.
- Die Grundtrefferchance von Gegnern (also sozusagen die Trefferchance ihrer Waffen) ist bei allen Gegnern
- ATTACK- TABLE
- Ausweichen --> Treffen bzw. Verfehlen --> Treffer --> Kritisch Treffer --> Schmetternd
- 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
- Jeder kritische Treffer hat ein Chance von 10% der kritischen phyischen bzw. magischen Trefferchance
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*...
-
Projekte -
Tutorials & Hilfreiches aus der Eventtechnik
[Tutorial] Skills, Stats und Bosse - So erstellt ihr einen guten Bosskampf
[Tutorial] Kampf - Unendlich Gegner erscheinen lassen
[Tutorial] Kämpfe, Klassen und Balancing
[Tutorial] Entwickler Talk: Skalierungen

NPC verfolgt Held durch Türen

Pokemon- Fangskript

Monstergruppenführer

Automatisches prioritätsgesteuertes Anordnen von Bildern

Doppelte Eventfunktionen auf Map

Objekte schieben & ziehen
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mitsch93« (25. September 2014, 18:03)
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.
|
|
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 |
|
|
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 |
|
|
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 |
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)
Benutzerinformationen überspringen
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.
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:
-
Projekte -
Tutorials & Hilfreiches aus der Eventtechnik
[Tutorial] Skills, Stats und Bosse - So erstellt ihr einen guten Bosskampf
[Tutorial] Kampf - Unendlich Gegner erscheinen lassen
[Tutorial] Kämpfe, Klassen und Balancing
[Tutorial] Entwickler Talk: Skalierungen

NPC verfolgt Held durch Türen

Pokemon- Fangskript

Monstergruppenführer

Automatisches prioritätsgesteuertes Anordnen von Bildern

Doppelte Eventfunktionen auf Map

Objekte schieben & ziehen
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)
Benutzerinformationen überspringen
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.
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.
-
Projekte -
Tutorials & Hilfreiches aus der Eventtechnik
[Tutorial] Skills, Stats und Bosse - So erstellt ihr einen guten Bosskampf
[Tutorial] Kampf - Unendlich Gegner erscheinen lassen
[Tutorial] Kämpfe, Klassen und Balancing
[Tutorial] Entwickler Talk: Skalierungen

NPC verfolgt Held durch Türen

Pokemon- Fangskript

Monstergruppenführer

Automatisches prioritätsgesteuertes Anordnen von Bildern

Doppelte Eventfunktionen auf Map

Objekte schieben & ziehen
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:
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.

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)
Benutzerinformationen überspringen
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.
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?
-
Projekte -
Tutorials & Hilfreiches aus der Eventtechnik
[Tutorial] Skills, Stats und Bosse - So erstellt ihr einen guten Bosskampf
[Tutorial] Kampf - Unendlich Gegner erscheinen lassen
[Tutorial] Kämpfe, Klassen und Balancing
[Tutorial] Entwickler Talk: Skalierungen

NPC verfolgt Held durch Türen

Pokemon- Fangskript

Monstergruppenführer

Automatisches prioritätsgesteuertes Anordnen von Bildern

Doppelte Eventfunktionen auf Map

Objekte schieben & ziehen
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mitsch93« (30. September 2014, 13:40)
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.
Benutzerinformationen überspringen
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.
Habe mir das eben mal angeschaut, aber weiß nicht genau, wo ich da die neuen
Formeln reinpacken kann.
Momentan sieht das Menü so aus:

Das Menü ist ja im Actor Advanced Status integriert:
|
|
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 |
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:
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.
-
Projekte -
Tutorials & Hilfreiches aus der Eventtechnik
[Tutorial] Skills, Stats und Bosse - So erstellt ihr einen guten Bosskampf
[Tutorial] Kampf - Unendlich Gegner erscheinen lassen
[Tutorial] Kämpfe, Klassen und Balancing
[Tutorial] Entwickler Talk: Skalierungen

NPC verfolgt Held durch Türen

Pokemon- Fangskript

Monstergruppenführer

Automatisches prioritätsgesteuertes Anordnen von Bildern

Doppelte Eventfunktionen auf Map

Objekte schieben & ziehen
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Mitsch93« (1. Oktober 2014, 20:27)
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:
|
|
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 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
Benutzerinformationen überspringen
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.
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:
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^^.
![]()
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
-
Projekte -
Tutorials & Hilfreiches aus der Eventtechnik
[Tutorial] Skills, Stats und Bosse - So erstellt ihr einen guten Bosskampf
[Tutorial] Kampf - Unendlich Gegner erscheinen lassen
[Tutorial] Kämpfe, Klassen und Balancing
[Tutorial] Entwickler Talk: Skalierungen

NPC verfolgt Held durch Türen

Pokemon- Fangskript

Monstergruppenführer

Automatisches prioritätsgesteuertes Anordnen von Bildern

Doppelte Eventfunktionen auf Map

Objekte schieben & ziehen
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mitsch93« (1. Oktober 2014, 22:43)
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)
Benutzerinformationen überspringen
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.
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.
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
-
Projekte -
Tutorials & Hilfreiches aus der Eventtechnik
[Tutorial] Skills, Stats und Bosse - So erstellt ihr einen guten Bosskampf
[Tutorial] Kampf - Unendlich Gegner erscheinen lassen
[Tutorial] Kämpfe, Klassen und Balancing
[Tutorial] Entwickler Talk: Skalierungen

NPC verfolgt Held durch Türen

Pokemon- Fangskript

Monstergruppenführer

Automatisches prioritätsgesteuertes Anordnen von Bildern

Doppelte Eventfunktionen auf Map

Objekte schieben & ziehen

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)
Benutzerinformationen überspringen
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.
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.
-
Projekte -
Tutorials & Hilfreiches aus der Eventtechnik
[Tutorial] Skills, Stats und Bosse - So erstellt ihr einen guten Bosskampf
[Tutorial] Kampf - Unendlich Gegner erscheinen lassen
[Tutorial] Kämpfe, Klassen und Balancing
[Tutorial] Entwickler Talk: Skalierungen

NPC verfolgt Held durch Türen

Pokemon- Fangskript

Monstergruppenführer

Automatisches prioritätsgesteuertes Anordnen von Bildern

Doppelte Eventfunktionen auf Map

Objekte schieben & ziehen
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:
|
|
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 |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Irrlicht« (3. Oktober 2014, 00:16)
Benutzerinformationen überspringen
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.
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?
-
Projekte -
Tutorials & Hilfreiches aus der Eventtechnik
[Tutorial] Skills, Stats und Bosse - So erstellt ihr einen guten Bosskampf
[Tutorial] Kampf - Unendlich Gegner erscheinen lassen
[Tutorial] Kämpfe, Klassen und Balancing
[Tutorial] Entwickler Talk: Skalierungen

NPC verfolgt Held durch Türen

Pokemon- Fangskript

Monstergruppenführer

Automatisches prioritätsgesteuertes Anordnen von Bildern

Doppelte Eventfunktionen auf Map

Objekte schieben & ziehen
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mitsch93« (6. Oktober 2014, 19:26)
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:
|
|
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 |
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)
Benutzerinformationen überspringen
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.
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 |
-
Projekte -
Tutorials & Hilfreiches aus der Eventtechnik
[Tutorial] Skills, Stats und Bosse - So erstellt ihr einen guten Bosskampf
[Tutorial] Kampf - Unendlich Gegner erscheinen lassen
[Tutorial] Kämpfe, Klassen und Balancing
[Tutorial] Entwickler Talk: Skalierungen

NPC verfolgt Held durch Türen

Pokemon- Fangskript

Monstergruppenführer

Automatisches prioritätsgesteuertes Anordnen von Bildern

Doppelte Eventfunktionen auf Map

Objekte schieben & ziehen
Ähnliche Themen
-
Einsteigerhilfe »-
Fragen zum Kampfsystem
(23. November 2012, 19:48)
-
RGSS 1 Probleme & Talk »-
Frage zum Tankentai Sideview script
(16. April 2011, 16:18)
-
RGSS 1 Probleme & Talk »-
Enu SBS Tankentai wil meine skills nicht anerkennen
(26. Juli 2010, 14:31)
-
RGSS 1 Probleme & Talk »-
Sbs Tanketai für den RmXP WAffen Sprites
(12. März 2010, 20:49)
-
Skript-Anfragen »-
Standanimationen
(30. Oktober 2009, 17:29)

