Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # =============================================================================
- # TheoAllen - Enhanced Enemy AI
- # Version : 1.0
- # Contact : www.rpgmakerid.com (or) http://theolized.blogspot.com
- # (This script documentation is written in informal indonesian language)
- # =============================================================================
- ($imported ||= {})[:Theo_EnemyAI] = true
- # =============================================================================
- # Change Logs:
- # -----------------------------------------------------------------------------
- # 2014.01.15 - Finished script
- # =============================================================================
- =begin
- ----------------------------------------------------------------------------
- Perkenalan :
- Secara default, kamu hanya bisa memilih kondisi action pattern di dalam
- database hanya satu. Lalu bagaimana caranya kita gunain dua kondisi secara
- bersamaan? Atawa gunain kondisi sendiri seperti script call? Script ini
- menjawab pertanyaanmu
- ----------------------------------------------------------------------------
- Cara penggunaan :
- Pasang script ini di bawah material namun di atas main
- Gunakan tag seperti ini pada notebox enemy di database
- AI: NamaKey
- Dimana "NamaKey" adalah key untuk custom AI kamu
- Edit konfigurasinya untuk menambahkan custom AI
- ----------------------------------------------------------------------------
- Paduan untuk membuat kondisi script :
- Agar kamu bisa menggunakan kondisi default dalam action pattern default, kamu
- harus memanggil script call seperti ini di dalam penulisan kondisi scriptnya
- - conditions_met_turns?(start, diff) # Turn
- - conditions_met_hp?(rate1, rate2) # HP
- - conditions_met_mp?(rate1, rate2) # MP
- - conditions_met_state?(state_id) # State
- - conditions_met_party_level?(level) # Party level
- - conditions_met_switch?(switch_id) # Switch
- Contoh :
- Jika kamu menginginkan suatu enemy akan melakukan healing di setiap 3 turn
- sekali dan jika hanya HP dibawah 50%, kamu bisa menuliskan seperti ini.
- Wa asumsiin skill_id untuk healing adalah 12
- "Heal" => [12,10,"conditions_met_turns?(1,3) && conditions_met_hp?(0.0,0.5)"]
- Operand && artinya adalah "AND" dimana jika keduanya benar maka kondisinya
- akan bernilai benar. (Kalo dah diajarin logika matematika pasti dah ngerti)
- Kemudian, kamu tinggal menuliskan seperti ini pada notebox
- AI: Heal
- Kamu juga bisa mendefinisikan kondisi kamu sendiri. Semisal enemy akan perform
- suatu skill jika nilai suatu variable tertentu mencapai nilai tertentu.
- Contoh :
- "Skill-X" => [99, 10, "$game_variables[10] > 999"],
- ----------------------------------------------------------------------------
- Terms of Use :
- Credit gw, TheoAllen. Kalo semisal u bisa ngedit2 script gw trus jadi lebih
- keren, terserah. Ane bebasin. Asal ngga ngeklaim aja. Kalo semisal mau
- dipake buat komersil, jangan lupa, gw dibagi gratisannya.
- ----------------------------------------------------------------------------
- Okay, wa akui script ini ribet. Aslinya cuman buat personal use doang sih :v
- =end
- # =============================================================================
- # Konfigurasi
- # =============================================================================
- module Theo
- module AI
- List = { # < --- jangan disentuh
- # =========================================================================
- # Definisikan custom AI kamu disini
- # -------------------------------------------------------------------------
- # Formatnya adalah :
- # "key" => [skill_id, rating, "script eval"]
- #
- # "key" nantinya akan dipanggil untuk notebox
- # Contoh di notebox
- # AI: key
- # -------------------------------------------------------------------------
- "HealWave" => [41,6,"hp_rate <= 0.65 && conditions_met_turns?(1,2)"],
- "Barrier" => [42,5,"hp_rate <= 0.75 && !state?(14)"],
- "Barrier50" => [42,5,"hp_rate <= 0.50 && !state?(14)"],
- "FSkin" => [56,8,"conditions_met_turns?(1,4) && !state?(15)"],
- "Barrier+" => [71,6,"conditions_met_turns?(1,2) && !state?(28)"],
- "Barrier++" => [71,10,"conditions_met_turns?(3,4) && !state?(28)"],
- # tambahin sendiri disini
- # dan disini
- # dan seterusnya
- # =========================================================================
- } # < --- jangan disentuh
- Notetag = /ai\s*:\s*(.+)/i
- # Ga usah diubah-ubah
- end
- end
- # =============================================================================
- # Akhir dari konfigurasi
- # =============================================================================
- class RPG::Enemy
- def load_custom_ai
- note.split(/[\r\n]+/).each do |line|
- if line =~ Theo::AI::Notetag
- db = Theo::AI::List[$1.to_s]
- if db
- act = RPG::Enemy::Action.new
- act.condition_type = 7
- act.skill_id = db[0]
- act.rating = db[1]
- act.condition_param1 = db[2]
- actions.push(act)
- else
- msgbox "Uninitialize AI constant #{$1.to_s} for \n" +
- "Enemy #{name}"
- exit
- end
- end
- end
- end
- end
- class << DataManager
- alias theo_enemy_ai_load_db load_database
- def load_database
- theo_enemy_ai_load_db
- load_custom_ai
- end
- def load_custom_ai
- $data_enemies.compact.each do |enemy|
- enemy.load_custom_ai
- end
- end
- end
- class Game_Action
- alias theo_custom_ai_prepare prepare
- def prepare
- theo_custom_ai_prepare
- # ------------------------------------------------------------------------
- # Refresh enemy action. Make sure current action is conditionally valid.
- # Two times or more action often performed an action whether the current
- # action is conditionally valid or not
- # ------------------------------------------------------------------------
- if subject.enemy? && !forcing
- skill = subject.enemy_action
- set_enemy_action(skill)
- subject.performed_item.push(item) # mainly aimed for script eval condition
- end
- end
- end
- class Game_Enemy
- attr_reader :performed_item
- alias theo_custom_ai_init initialize
- def initialize(*args)
- theo_custom_ai_init(*args)
- @performed_item = []
- end
- # --------------------------------------------------------------------------
- # Overwrite conditions met
- # --------------------------------------------------------------------------
- def conditions_met?(action)
- method_table = {
- 1 => :conditions_met_turns?,
- 2 => :conditions_met_hp?,
- 3 => :conditions_met_mp?,
- 4 => :conditions_met_state?,
- 5 => :conditions_met_party_level?,
- 6 => :conditions_met_switch?,
- 7 => :conditions_met_script?,
- }
- method_name = method_table[action.condition_type]
- if method_name
- send(method_name, action.condition_param1, action.condition_param2)
- else
- true
- end
- end
- def conditions_met_script?(param1, param2)
- eval(param1)
- end
- def enemy_action
- action_list = enemy.actions.select {|a| action_valid?(a) }
- return if action_list.empty?
- rating_max = action_list.collect {|a| a.rating }.max
- rating_zero = rating_max - 3
- action_list.reject! {|a| a.rating <= rating_zero }
- return select_enemy_action(action_list, rating_zero)
- end
- #~ alias theo_custom_ai_turn_end on_turn_end
- #~ def on_turn_end
- #~ theo_custom_ai_turn_end
- #~ @performed_item.clear
- #~ end
- end
Advertisement
Add Comment
Please, Sign In to add comment