• Anmelden

Joschie

Ankömmling

  • »Joschie« ist der Autor dieses Themas

Motto: Cola schmeckt besser als aus'm Glas.

  • Nachricht senden

1

Dienstag, 23. November 2010, 16:46

Neues Attribut

Ich suche ein Script mit einem weiteren Attribut.

Ich hätte gern ein Glücksattribut, je höher dieses Attribut desto wahrscheinlicher ist dann die Trefferchance und Krit-Chance erhöht, ebenso möcht ich bei gegnern Spezielle Items einstellen, die neben den normalen loots im Kampf geklaut werden können (am besten wie bei FF10 mit normalen items zum klauen und seltenen), aber das ist erstmal nebensache^^

Ich hab mir das so als kampfrechnung gedacht:
Standart: krit = 4 * attacker.dex / self.agi
neu: krit = 4 * (attacker.dex + (attacker.luk / 2)) / self.agi

Standart: eva = 8 * self.agi / attacker.dex + self.eva
neu: eva = 8 * (self.agi + (self.luk / 2)) / attacker.dex + self.eva

Aber da es das Glück nicht in der Database gibt, komm ich mit der Programmierung noch nicht so ganz klar^^
Muss ich dann die gesamte Actor-Seite der Database neu scripten oder geht es, dass das Glück-Attribut einzeln gescriptet wird?

Aktuelles Projekt


Spoiler

Name: Memories
Maker: :rmxp:
Story: Grundgerüst fertig, jetz geht's ans eingemachte :D
Scripts: ca. 70-80%
RTP: Noch Standard
Maps: Eins nach dem anderen
Gesamtfortschritt: ca. 5%
zum Lesen den Text mit der Maus markieren

Einschätzung meiner Fähigkeiten


Spoiler

Scripten: :star: :star: :star-half: :star-empty: :star-empty:
Story: :star: :star: :star-empty: :star-empty: :star-empty:
Mappen: :star: :star: :star-half: :star-empty: :star-empty:
Events: :star: :star: :star-half: :star-empty: :star-empty:
Pixeln: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
Musik: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
zum Lesen den Text mit der Maus markieren

Irrlicht

Leuchtendes Irgendwas

Motto: Keep shining!

  • Nachricht senden

2

Dienstag, 23. November 2010, 20:25

Das Aussehen der Database zu verändern wirst du mit dem Scripteditor nicht schaffen, dafür müsstest du schon den Maker hacken...

Allerdings könntest du dir dieses Attribut im Script einstellen.
Das könnte z.B. so aussehen:

Spoiler: Script Part 1 - Definition und Einstellung des Glück - Attributs

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
# $game_actors[ id ].luck += Menge
# Der Actor, der zum Index "id" gehört erhält permanente, zusätzliche 
# "Menge" Glück-Punkte.
 
class Game_Actor < Game_Battler
 
  #Grund-Glücksattribut der Actors:
  # Hier können die Grundwerte eingefügt werden, die jeder Actor am Anfang hat.
  # (vergl. Parameterkurve in der Database)
  #
  # Generell muss der Aufbau folgendermaßen aussehen:
  #
  # "Actor_Name" => [Parameterliste]
  # 
  # bei mehreren Einträgen müssen alle Einträge mit Kommata getrennt werden.
  #
  # Für "Actor_Name" gilt: 
  # Hat ein Actor in der Database den hier angegeben Namen, so wird ihm diese
  # Parameterliste zugewiesen. Dabei muss der Name mitsamt Groß- und Klein-
  # schreibung sowie allen Leer- und Sonderzeichen mit dem in "" stehenden
  # Schlüssel übereinstimmen. Es gilt immer der Name aus der Database, wird
  # der Name im Spiel geändert ändert sich nicht die ihm zugeteilte Liste.
  #
  # Für [Parameterliste] gilt:
  # Dieses Array speichert die Grundwerte für das Glücksattribut für jeden Level,
  # wie auch in der Database für andere Attribute einstellbar.
  # Der erste Eintrag gibt die Grund-Glücksmenge für Stufe 1 an, der zweite
  # für Stufe 2 etc.
  # Der Aufbau kann auf 3 verschiedene Arten vorgenommen werden:
  #
  # 1)
  #
  # [ Level1, Level2, Level3, ... , MAXLevel ]
  #
  # Die wohl unkomplizierteste, aber gleichzeitig aufwendigste Methode, da für
  # jede Stufe ein Eintrag gesetzt werden muss.
  #
  # 2)
  #
  # Array.new(99) { |i| Funktion(i) }
  # 
  # Diese Methode legt ein 99 Einträge langes Array an und füllt es mit den
  # in der Funktion errechneten Einträgen. Dabei ist i eine Variable, die für
  # den ersten Eintrag 0, für den 2ten 1, und für den letzten Eintrag 99-1 = 98
  # ist.
  # Beim Anwenden dieser Methode sollten die Grundrechenfunktionen in RGSS bekannt
  # sein.
  #
  # 3)
  #
  # [ "set", 40, 910, 1.0 ]
  #
  # Hat das Array diese Form wird der Grundwert anhand der Randwerte für
  # Stufe 1 (hier 40) und Stufe 99 (hier 910) bestimmt.
  # "set" dient dabei lediglich als Erkennung und darf mit beliebiger 
  # Groß-/Kleinschreibung geschrieben werden.
  #
  # Die 3te Zahl bestimmt den Verlauf: Bei einem Wert von 1.0 steigt der Wert
  # zwischen Stufe 1 und 99 linear an, bei niedrigeren Werten steigt er zunächst
  # langsamer und später schneller, bei höheren Werten zunächst schneller und 
  # später langsamer.
  # Dieser Wert darf ausgelassen werden, in dem Fall würde er als 1 betrachtet.
 
  BASE_LUCK = {
    "Aluxes" => [  14,  24,  34,  44,  54,  64,  74,  84,  94, 104, 114, 124,
                  134, 144, 154, 164, 174, 184, 194, 204, 214, 224, 234, 244,
                  254, 264, 274, 284, 294, 304, 314, 324, 334, 344, 354, 364,
                  374, 384, 394, 404, 414, 424, 434, 444, 454, 464, 474, 484,
                  494, 504, 514, 524, 534, 544, 554, 564, 574, 584, 594, 604,
                  614, 624, 634, 644, 654, 664, 674, 684, 694, 704, 714, 724,
                  734, 744, 754, 764, 774, 784, 794, 804, 814, 824, 834, 844,
                  854, 864, 874, 884, 894, 904, 914, 924, 934, 944, 954, 964,
                  974, 984, 994] ,
 
    "Basil"  => Array.new(99){ |i| 14 + i * 10 } ,
 
    "Gloria" => ["SET", 14, 994, 1.0] ,
 
    "Hilda"  => ["Set", 14, 994]
 
 
 
 
    }
 
  #Waffe: zusätzliches Glück (0 für alle nicht angegebenen)
  # Weapon_Name => menge
  WEAPON_ADD_LUCK = {
    "Bronze Sword" => +17,
    "Iron Sword"   => -2
 
 
    }
  WEAPON_ADD_LUCK.default = 0  
 
  #Rüstung: zusätzliches Glück (0 für alle nicht angegebenen)
  # Armor_Name => menge
  ARMOR_ADD_LUCK = {
    "Bronze Armor"  => +13,
    "Bronze Shield" => -19
 
 
  }
  ARMOR_ADD_LUCK.default = 0
 
  #Status: prozentuale Glücksrate (100 für alle nicht angegebenen)
  # STATE_Name => prozentuale Rate
  STATE_LUCKRATE = {
    "Fortunas Segen" => 150,
    "Fortunas Fluch" => 50
 
 
  }
 
################################################################################
# Zusätzliches:
 
  alias_method(:setup_ILC23112010, :setup) unless method_defined?(:setup_ILC23112010)
  def setup(actor_id)
    setup_ILC23112010(actor_id)
    @luck_plus = 0 # Setup wird um eine Variable erweitert: permenenter Glücksbonus
  end
 
  def base_luck # errechnen des Grund-Glücks des Actors
 
    actname = $data_actors[@actor_id].name
    if (a = BASE_LUCK[actname]).nil?                             # kein Eintrag
      base = 1
    elsif a[0].is_a?(String) and a[0].upcase == "SET"          # "SET" - Eintrag
      start = a[1]
      add = (a[2] - start).to_f
      ce = a[3].nil? ? 1 : a[3]
 
      base = start + (add * (@level-1) / 98 * (ce+(@level-2)*(1-ce)/97)).to_i 
    elsif (a = a[@level-1]).nil?                 # kein Eintrag für diese Stufe
      base = 1
    else                                                     # normaler Eintrag
      base = a
    end
 
    base += (a = $data_weapons[@weapon_id]).nil? ? 0 : WEAPON_ADD_LUCK[a.name]
    base += (a = $data_armors[@armor1_id]).nil? ? 0 : ARMOR_ADD_LUCK[a.name]
    base += (a = $data_armors[@armor2_id]).nil? ? 0 : ARMOR_ADD_LUCK[a.name]
    base += (a = $data_armors[@armor3_id]).nil? ? 0 : ARMOR_ADD_LUCK[a.name]
    base += (a = $data_armors[@armor4_id]).nil? ? 0 : ARMOR_ADD_LUCK[a.name]
    return [[999, base].min, 1].max
  end
 
  def luck=(luck) # Glück wird als permanenter Bonus hinzugefügt
    @luck_plus += luck - self.luck
  end
 
  def luck # errechnen des tatsächlichen Glücks des Actors (mit Einflüssen durch
           # Statuseffekte)
    base = self.base_luck
    base += @luck_plus
    @states.each do |i|
      statename = $data_states[i].name
      next if (a = STATE_LUCKRATE[statename]).nil?
      base *= a / 100.0
    end
    return [[999, base.to_i].min, 1].max
  end
end
 
 
 
class Game_Battler
 
  def luck # Glückswert für alle anderen Battler-Typen (Game_Enemy)
    return 1
  end
 
end
zum Lesen den Text mit der Maus markieren

Spoiler: Script Part 2 - Anpassungen der Schadensformel und des Statusmenüfensters

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
################################################################################
# Überarbeitungen:
 
  # Attack-Effekt wird von Glück beeinträchtigt (siehe #EING-Zeile(n))
  #--------------------------------------------------------------------------
  # * Applying Normal Attack Effects
  #     attacker : battler
  #--------------------------------------------------------------------------
class Game_Battler
  def attack_effect(attacker)
    # Clear critical flag
    self.critical = false
    # First hit detection
    hit_result = (rand(100) < attacker.hit)
    # If hit occurs
    if hit_result == true
      # Calculate basic damage
      atk = [attacker.atk - self.pdef / 2, 0].max
      self.damage = atk * (20 + attacker.str) / 20
      # Element correction
      self.damage *= elements_correct(attacker.element_set)
      self.damage /= 100
      # If damage value is strictly positive
      if self.damage > 0
        # Critical correction
        if rand(100) < 4 * (attacker.dex + attacker.luck / 2) / self.agi   #EING
          self.damage *= 2
          self.critical = true
        end
        # Guard correction
        if self.guarding?
          self.damage /= 2
        end
      end
      # Dispersion
      if self.damage.abs > 0
        amp = [self.damage.abs * 15 / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # Second hit detection
      eva = 8 * (self.agi + self.luck / 2) / attacker.dex + self.eva       #EING
      hit = self.damage < 0 ? 100 : 100 - eva
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(100) < hit)
    end
    # If hit occurs
    if hit_result == true
      # State Removed by Shock
      remove_states_shock
      # Substract damage from HP
      self.hp -= self.damage
      # State change
      @state_changed = false
      states_plus(attacker.plus_state_set)
      states_minus(attacker.minus_state_set)
    # When missing
    else
      # Set damage to "Miss"
      self.damage = "Miss"
      # Clear critical flag
      self.critical = false
    end
    # End Method
    return true
  end
 
 
  # Skilleffekt wird von Glück beeinträchtigt (siehe #EING-Zeile(n))
  #--------------------------------------------------------------------------
  # * Apply Skill Effects
  #     user  : the one using skills (battler)
  #     skill : skill
  #--------------------------------------------------------------------------
  def skill_effect(user, skill)     
    # Clear critical flag
    self.critical = false
    # If skill scope is for ally with 1 or more HP, and your own HP = 0,
    # or skill scope is for ally with 0, and your own HP = 1 or more
    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
       ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
      # End Method
      return false
    end
    # Clear effective flag
    effective = false
    # Set effective flag if common ID is effective
    effective |= skill.common_event_id > 0
    # First hit detection
    hit = skill.hit
    if skill.atk_f > 0
      hit *= user.hit / 100
    end
    hit_result = (rand(100) < hit)
    # Set effective flag if skill is uncertain
    effective |= hit < 100
    # If hit occurs
    if hit_result == true
      # Calculate power
      power = skill.power + user.atk * skill.atk_f / 100
      if power > 0
        power -= self.pdef * skill.pdef_f / 200
        power -= self.mdef * skill.mdef_f / 200
        power = [power, 0].max
      end
      # Calculate rate
      rate = 20
      rate += (user.str * skill.str_f / 100)
      rate += (user.dex * skill.dex_f / 100)
      rate += (user.agi * skill.agi_f / 100)
      rate += (user.int * skill.int_f / 100)
      # Calculate basic damage
      self.damage = power * rate / 20
      # Element correction
      self.damage *= elements_correct(skill.element_set)
      self.damage /= 100
      # If damage value is strictly positive
      if self.damage > 0
        # Guard correction
        if self.guarding?
          self.damage /= 2
        end
      end
      # Dispersion
      if skill.variance > 0 and self.damage.abs > 0
        amp = [self.damage.abs * skill.variance / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # Second hit detection
      eva = 8 * (self.agi + self.luck / 2) / user.dex + self.eva           #EING
      hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(100) < hit)
      # Set effective flag if skill is uncertain
      effective |= hit < 100
    end
    # If hit occurs
    if hit_result == true
      # If physical attack has power other than 0
      if skill.power != 0 and skill.atk_f > 0
        # State Removed by Shock
        remove_states_shock
        # Set to effective flag
        effective = true
      end
      # Substract damage from HP
      last_hp = self.hp
      self.hp -= self.damage
      effective |= self.hp != last_hp
      # State change
      @state_changed = false
      effective |= states_plus(skill.plus_state_set)
      effective |= states_minus(skill.minus_state_set)
      # If power is 0
      if skill.power == 0
        # Set damage to an empty string
        self.damage = ""
        # If state is unchanged
        unless @state_changed
          # Set damage to "Miss"
          self.damage = "Miss"
        end
      end
    # If miss occurs
    else
      # Set damage to "Miss"
      self.damage = "Miss"
    end
    # If not in battle
    unless $game_temp.in_battle
      # Set damage to nil
      self.damage = nil
    end
    # End Method
    return effective
  end
end
 
 
 
 
 
 
 
 
class Window_Status < Window_Base
 
  def refresh # Glück wird im Statusfenster eingefügt (löschen bei Inkompatibilität)
    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)
    draw_actor_parameter(@actor, 96, 192, 0)
    draw_actor_parameter(@actor, 96, 224, 1)
    draw_actor_parameter(@actor, 96, 256, 2)
    draw_actor_parameter(@actor, 96, 304 - 16, 3)                          #EING
    draw_actor_parameter(@actor, 96, 336 - 16, 4)                          #EING
    draw_actor_parameter(@actor, 96, 368 - 16, 5)                          #EING
    draw_actor_parameter(@actor, 96, 400 - 16, 6)                          #EING
    self.contents.font.color = system_color                                #EING
    self.contents.draw_text(96, 432 - 16, 120, 32, "Glück")                #EING
    self.contents.font.color = normal_color                                #EING
    self.contents.draw_text(96 + 120, 432 - 16, 36, 32, @actor.luck.to_s, 2)#EING
    self.contents.font.color = system_color
    self.contents.draw_text(320, 48, 80, 32, "EXP")
    self.contents.draw_text(320, 80, 80, 32, "NEXT")
    self.contents.font.color = normal_color
    self.contents.draw_text(320 + 80, 48, 84, 32, @actor.exp_s, 2)
    self.contents.draw_text(320 + 80, 80, 84, 32, @actor.next_rest_exp_s, 2)
    self.contents.font.color = system_color
    self.contents.draw_text(320, 160, 96, 32, "equipment")
    draw_item_name($data_weapons[@actor.weapon_id], 320 + 16, 208)
    draw_item_name($data_armors[@actor.armor1_id], 320 + 16, 256)
    draw_item_name($data_armors[@actor.armor2_id], 320 + 16, 304)
    draw_item_name($data_armors[@actor.armor3_id], 320 + 16, 352)
    draw_item_name($data_armors[@actor.armor4_id], 320 + 16, 400)
  end
end
zum Lesen den Text mit der Maus markieren

Dieser Beitrag wurde bereits 29 mal editiert, zuletzt von »Irrlicht« (24. November 2010, 19:30)


Joschie

Ankömmling

  • »Joschie« ist der Autor dieses Themas

Motto: Cola schmeckt besser als aus'm Glas.

  • Nachricht senden

3

Freitag, 26. November 2010, 15:57

Danke, ich werd das dann mal bei gelegenheit testen.

Zitat

Das Aussehen der Database zu verändern wirst du mit dem Scripteditor nicht schaffen, dafür müsstest du schon den Maker hacken...

ich meinte nicht das aussehen der database ändern, sondern, dass ich die Database völlig ignoriere und sämliche attrbute
via script mache, so wie das Glück Skript von dir^^

Mir ist klar das es verrückt klingt, aber anders macht man es z.B. mit 3D Game Studio auch nicht, da gib's keine Database^^
aber was das Scripten angeht muss ich noch einiges lernen, deswegen, arbeite ich mich mit dem RMXP, ja langsam hoch^^

Aktuelles Projekt


Spoiler

Name: Memories
Maker: :rmxp:
Story: Grundgerüst fertig, jetz geht's ans eingemachte :D
Scripts: ca. 70-80%
RTP: Noch Standard
Maps: Eins nach dem anderen
Gesamtfortschritt: ca. 5%
zum Lesen den Text mit der Maus markieren

Einschätzung meiner Fähigkeiten


Spoiler

Scripten: :star: :star: :star-half: :star-empty: :star-empty:
Story: :star: :star: :star-empty: :star-empty: :star-empty:
Mappen: :star: :star: :star-half: :star-empty: :star-empty:
Events: :star: :star: :star-half: :star-empty: :star-empty:
Pixeln: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
Musik: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
zum Lesen den Text mit der Maus markieren

Social Bookmarks