|
dante | administrateur | | | 254 messages postés |
| Posté le 12-09-2005 à 17:46:00
| je vous présente un scrîpt unique et inédit : une IA de combat. En fait, ce n'est pas une vrai IA, mais un scrîpt qui permet au monstre de s'adapter aux statuts de l'équipe, au nombre de héros dans l'équipe, etc. De cette façon, si vous devez revenir à la fin du jeu dans une zone que vous avez visité au début, les monstres se seront adapté et vous ne combatterez pas des pauvres monstres minables à 3 HP ! ATTENTION : ce scrîpt implique de revoir TOUS les monstres que vous avez déjà créé pour votre jeu, car les valeurs de HP, SP, etc. ne sont pas des valeurs réelle, mais des vecteurs d'adaptation. Voilà les choses qui changeront : dans la création d'un monstre vous aviez : PV max PM max* Force Defence* Agilité * Intelligence* Attaque Def physique Def magique Esquive * Les données qui ont un * devant restent inchangées, vous choisissez ce que vous voulez, elles resteront stables tout au long au jeu. Maintenant voilà ce que deviennent les autres valeurs : PV max : c'est le pourcentage de la somme des PV max de l'équipe. Je m'explique : vous avez 2 héros de PV maximums 450 et 500. La somme est 950. Si vous mettez 10 dans les champ "PV max" du monstre" ça donnera : 950*10/100 (10% de la somme) = 95 Rien de vous empèche de mettre des grands nombres comme 200% pour un boss, mais je vous préviens : 80% cest déjà du gros monstre dure à battre ! Force : cette fois c'est le pourcentage de la moyenne des forces de l'équipe. Exemple : 2 héros de forces 30 et 50. Moyenne : 40 Vous placez par exemple 50 dans le champ "Force" du monstre, vous obtenez 40*50/100 = 20 L'attaque, la défence physique et la défence magique fonctionnent sur le même principe que la force, avec une moyenne des données de l'équipe, et non pas une somme comme pour les PVmax. Maintenant voici le scrîpt, il fonctionne théoriquement avec tous les scripts de combat vu qu'il ne touche qu'à Game_Enemy. Donc remplacez le scrîpt Game_Enemy par celui ci : # ■ Game_Enemy #------------------------------------------------------------------------------ # scrîpt créé par SunMat, les monstres s'adaptent aux données du héro # #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # fonction d'initialisation #-------------------------------------------------------------------------- def initialize(troop_id, member_index) super() @troop_id = troop_id @member_index = member_index troop = $data_troops[@troop_id] @enemy_id = troop.members[@member_index].enemy_id enemy = $data_enemies[@enemy_id] @battler_name = enemy.battler_name @battler_hue = enemy.battler_hue @hp = maxhp @sp = maxsp @hidden = troop.members[@member_index].hidden @immortal = troop.members[@member_index].immortal end #-------------------------------------------------------------------------- # ID #-------------------------------------------------------------------------- def id return @enemy_id end #-------------------------------------------------------------------------- # Index #-------------------------------------------------------------------------- def index return @member_index end #-------------------------------------------------------------------------- # Nom du monstre #-------------------------------------------------------------------------- def name return $data_enemies[@enemy_id].name end #-------------------------------------------------------------------------- # Max Hp = somme des maxHp des héros dans l'équipe # multiplié par le pourcentage défini #-------------------------------------------------------------------------- def base_maxhp hp = $game_actors[1].maxhp if $game_actors[2].hp != 0 hp += $game_actors[2].maxhp end if $game_actors[3].hp != 0 hp += $game_actors[3].maxhp end if $game_actors[4].hp != 0 hp += $game_actors[4].maxhp end hp *= $data_enemies[@enemy_id].maxhp hp /= 100 return hp end #-------------------------------------------------------------------------- # Max Sp définis dans l'absolue #-------------------------------------------------------------------------- def base_maxsp return $data_enemies[@enemy_id].maxsp end #-------------------------------------------------------------------------- # Force en fonction du pourcentage de la somme de la force de l'équipe #-------------------------------------------------------------------------- def base_str a = 1 frc = $game_actors[1].str if $game_actors[2].hp != 0 frc += $game_actors[2].str a +=1 end if $game_actors[3].hp != 0 frc += $game_actors[3].str a += 1 end if $game_actors[4].hp != 0 frc += $game_actors[4].str a += 1 end frc *= $data_enemies[@enemy_id].str frc /= (100*a) return frc end #-------------------------------------------------------------------------- # dextérité définie dans l'absolue #-------------------------------------------------------------------------- def base_dex return $data_enemies[@enemy_id].dex end #-------------------------------------------------------------------------- # agilité définie dans l'absolue #-------------------------------------------------------------------------- def base_agi return $data_enemies[@enemy_id].agi end #-------------------------------------------------------------------------- # intelligence définie dans l'absolue #-------------------------------------------------------------------------- def base_int return $data_enemies[@enemy_id].int end #-------------------------------------------------------------------------- # attaque définie en fonction de l'attaque de l'équipe et du pourcentage #-------------------------------------------------------------------------- def base_atk at = $game_actors[1].atk a = 1 if $game_actors[2].hp != 0 at += $game_actors[2].atk a += 1 end if $game_actors[3].hp != 0 at += $game_actors[3].atk a += 1 end if $game_actors[4].hp != 0 a += 1 at += $game_actors[4].atk end at *= $data_enemies[@enemy_id].atk at /= (100*a ) return at end #-------------------------------------------------------------------------- # défence définie en fonction du pourcentage moyen de la défence de l'équipe #-------------------------------------------------------------------------- def base_pdef df = $game_actors[1].pdef a = 1 if $game_actors[2].hp != 0 df += $game_actors[2].pdef a += 1 end if $game_actors[3].hp != 0 df += $game_actors[3].pdef a += 1 end if $game_actors[4].hp != 0 df += $game_actors[4].pdef a += 1 end df *= $data_enemies[@enemy_id].pdef df /= (100*a) return df end #-------------------------------------------------------------------------- # défence magique en fonction de la défence de l'équipe #-------------------------------------------------------------------------- def base_mdef mdf = $game_actors[1].mdef a = 1 if $game_actors[2].hp != 0 mdf += $game_actors[2].mdef a += 1 end if $game_actors[3].hp != 0 mdf += $game_actors[3].mdef a += 1 end if $game_actors[4].hp != 0 mdf += $game_actors[4].mdef a += 1 end mdf *= $data_enemies[@enemy_id].mdef mdf /= (100*a) return mdf end #-------------------------------------------------------------------------- # evasion non changée #-------------------------------------------------------------------------- def base_eva return $data_enemies[@enemy_id].eva end #-------------------------------------------------------------------------- #animation non changée #-------------------------------------------------------------------------- def animation1_id return $data_enemies[@enemy_id].animation1_id end #-------------------------------------------------------------------------- # animation non changée #-------------------------------------------------------------------------- def animation2_id return $data_enemies[@enemy_id].animation2_id end #-------------------------------------------------------------------------- # element_rate non changé #-------------------------------------------------------------------------- def element_rate(element_id) # 属性有効度に対応する数値を取得 table = [0,200,150,100,50,0,-100] result = table[$data_enemies[@enemy_id].element_ranks[element_id]] # ステートでこの属性が防御されている場合は半減 for i in @states if $data_states[i].guard_element_set.include?(element_id) result /= 2 end end # メソッド終了 return result end #-------------------------------------------------------------------------- # state_rank non changé #-------------------------------------------------------------------------- def state_ranks return $data_enemies[@enemy_id].state_ranks end #-------------------------------------------------------------------------- #state_guard non changé #-------------------------------------------------------------------------- def state_guard?(state_id) return false end #-------------------------------------------------------------------------- # element_set non changé #-------------------------------------------------------------------------- def element_set return [] end #-------------------------------------------------------------------------- # #-------------------------------------------------------------------------- def plus_state_set return [] end #-------------------------------------------------------------------------- # #-------------------------------------------------------------------------- def minus_state_set return [] end #-------------------------------------------------------------------------- # action non changé #-------------------------------------------------------------------------- def actions return $data_enemies[@enemy_id].actions end #-------------------------------------------------------------------------- # expérience donnée par une formule modifiable au gré du Maker # ici la formule est le produit de l'exp du monstre par le niveau du joueur 1 #-------------------------------------------------------------------------- def exp expe = $game_actors[1].level * $data_enemies[@enemy_id].exp return expe end #-------------------------------------------------------------------------- # ● ゴールドの取得 #-------------------------------------------------------------------------- def gold return $data_enemies[@enemy_id].gold end #-------------------------------------------------------------------------- # ● アイテム ID の取得 #-------------------------------------------------------------------------- def item_id return $data_enemies[@enemy_id].item_id end #-------------------------------------------------------------------------- # ● 武器 ID の取得 #-------------------------------------------------------------------------- def weapon_id return $data_enemies[@enemy_id].weapon_id end #-------------------------------------------------------------------------- # ● 防具 ID の取得 #-------------------------------------------------------------------------- def armor_id return $data_enemies[@enemy_id].armor_id end #-------------------------------------------------------------------------- # ● トレジャー出現率の取得 #-------------------------------------------------------------------------- def treasure_prob return $data_enemies[@enemy_id].treasure_prob end #-------------------------------------------------------------------------- # ● バトル画面 X 座標の取得 #-------------------------------------------------------------------------- def screen_x return $data_troops[@troop_id].members[@member_index].x end #-------------------------------------------------------------------------- # ● バトル画面 Y 座標の取得 #-------------------------------------------------------------------------- def screen_y return $data_troops[@troop_id].members[@member_index].y end #-------------------------------------------------------------------------- # ● バトル画面 Z 座標の取得 #-------------------------------------------------------------------------- def screen_z return screen_y end #-------------------------------------------------------------------------- # #-------------------------------------------------------------------------- def escape # ヒドゥンフラグをセット @hidden = true # カレントアクションをクリア self.current_action.clear end #-------------------------------------------------------------------------- # #-------------------------------------------------------------------------- def transform(enemy_id) # エネミー ID を変更 @enemy_id = enemy_id # バトラー グラフィックを変更 @battler_name = $data_enemies[@enemy_id].battler_name @battler_hue = $data_enemies[@enemy_id].battler_hue # アクション再作成 make_action end #-------------------------------------------------------------------------- # #-------------------------------------------------------------------------- #scrîpt amélioré par RPG Advocate def make_action self.current_action.clear unless self.movable? return end available_actions = [] rating_max = 0 for action in self.actions n = $game_temp.battle_turn a = action.condition_turn_a b = action.condition_turn_b if (b == 0 and n != a) or (b > 0 and (n < 1 or n < a or n % b != a % b)) next end if self.hp * 100.0 / self.maxhp > action.condition_hp next end if $game_party.max_level < action.condition_level next end switch_id = action.condition_switch_id if switch_id > 0 and $game_switches[switch_id] == false next end if exclude_pointless_actions(action) next end available_actions.push(action) if action.rating > rating_max rating_max = action.rating end end ratings_total = 0 for action in available_actions ratings_total += action.rating end if ratings_total > 0 choose_action = [] for action in available_actions for j in 1..action.rating choose_action.push(action) end end enemy_action = choose_action[rand(choose_action.size - 1)] self.current_action.kind = enemy_action.kind self.current_action.basic = enemy_action.basic self.current_action.skill_id = enemy_action.skill_id self.current_action.decide_random_target_for_enemy end end # -------------------------------- def exclude_pointless_actions(action) if action.kind == 0 return false end if action.kind == 1 s = action.skill_id if self.sp < $data_skills[s].sp_cost return true end if $data_skills[s].common_event_id > 0 return false end if $data_skills[s].scope == 0 || $data_skills[s].scope == 1 || $data_skills[s].scope == 2 return false end if $data_skills[s].scope == 3 || $data_skills[s].scope == 4 if $game_troop != nil fullhpflag = true statusflag = true for i in $game_troop.enemies if i.hp < i.maxhp && i.exist? fullhpflag = false end for j in $data_skills[s].plus_state_set if not i.state?(j) && i.exist? statusflag = false end end for j in $data_skills[s].minus_state_set if i.state?(j) && i.exist? statusflag = false end end end end if $data_skills[s].power == 0 && statusflag return true end if $data_skills[s].power < 0 && statusflag && fullhpflag return true end end if $data_skills[s].scope == 5 || $data_skills[s].scope == 6 nonedeadflag = true if $game_troop != nil for i in $game_troop.enemies if i.dead? and not i.hidden nonedeadflag = false end end end if nonedeadflag return true end end if $data_skills[s].scope == 7 if $game_troop != nil fullhpflag = true statusflag = true if self.hp < self.maxhp fullhpflag = false end for j in $data_skills[s].plus_state_set if not self.state?(j) statusflag = false end end for j in $data_skills[s].minus_state_set if self.state?(j) statusflag = false end end end if $data_skills[s].power == 0 && statusflag return true end if $data_skills[s].power < 0 && statusflag && fullhpflag return true end end end return false end end Précision : pour l'expérience donnée par le monstre, elle est égale au produit de l'expérience que vous avez inscrit dans le champs "expérience" du monstre, et du niveau du héro n°1 (uniquement). Mais cette relation est modifiables, si elle ne vous plait pas demandez moi je vous la modifierai. Exemple : un héro de level 34 combat un monstre censé donne 10 en exp, ça donne un total de 10*34 = 340 pts d'expérience. Ne mettez donc pas de trop grand nombre, de toute façon, puisqu'il s'adapte : au niveau 1 : le héro tue le monstre et gagne 10 pts au niveau 34 : le héro tu le monstre et gagne 340 pts ça parait normal, puisque plus le niveau monte, plus il faut de points pour passer au suivant.
Message édité le 14-09-2005 à 11:08:07 par dante |
|
myk22 | espion | | | 136 messages postés |
| Posté le 12-09-2005 à 18:06:32
| comme d'hab je pige rien :s |
|
dante | administrateur | | | 254 messages postés |
| Posté le 12-09-2005 à 18:11:41
| c'est pas grave question d'habitude |
|
myk22 | espion | | | 136 messages postés |
| Posté le 12-09-2005 à 18:13:33
| :'( celkui la ma l'air mega dur |
|
dante | administrateur | | | 254 messages postés |
| Posté le 12-09-2005 à 18:26:07
| pas dutout |
|
myk22 | espion | | | 136 messages postés |
| Posté le 12-09-2005 à 18:28:22
| tout de facon sont tous hard |
|
dante | administrateur | | | 254 messages postés |
| Posté le 12-09-2005 à 18:39:57
| non il suffit de s y mettre c'est tout |
|
myk22 | espion | | | 136 messages postés |
| Posté le 12-09-2005 à 18:50:37
| veut apprendre |
|
zelda mythologie | espion | | | 142 messages postés |
| Posté le 12-09-2005 à 18:51:25
| c'est bien ce script, ca fait FF8 |
|
myk22 | espion | | | 136 messages postés |
| Posté le 12-09-2005 à 18:52:49
| moi j'ai un script pour faire suivre les personnage de l'equipe quand y marche si ca vous interrese je le metr dan,s un topic |
|
zelda mythologie | espion | | | 142 messages postés |
| Posté le 12-09-2005 à 18:56:15
| moi aussi je l'ai il est bien aussi |
|
Ryu | administrateur | | | 264 messages postés |
| Posté le 13-09-2005 à 12:36:19
| oui, mais quand ça attaint 12 personage, le 13ème (et +) bug... |
|
zelda mythologie | espion | | | 142 messages postés |
| Posté le 13-09-2005 à 15:06:41
| ben c'est que le max c'est 12. tu sais, ce logiciel ne peut pas forcément lire une infinité de données |
|
dante | administrateur | | | 254 messages postés |
| Posté le 13-09-2005 à 16:24:33
| oui et en plus 12 c'est deja pas mal comme nombre de perso |
|
Ryu | administrateur | | | 264 messages postés |
| Posté le 13-09-2005 à 17:32:13
| j'en ais 16 pour mon jeux |
|
myk22 | espion | | | 136 messages postés |
| Posté le 13-09-2005 à 18:15:13
| lol ca va pouvoir devenir un jeu de combat |
|
dante | administrateur | | | 254 messages postés |
| Posté le 13-09-2005 à 19:45:34
| oui ca c'est sur |
|
zelda mythologie | espion | | | 142 messages postés |
| Posté le 14-09-2005 à 08:28:03
| tu peux rajouter une option "changer perso" . |
|
dante | administrateur | | | 254 messages postés |
| Posté le 14-09-2005 à 11:08:27
| oui c'est faisable |
|
Ryu | administrateur | | | 264 messages postés |
| Posté le 14-09-2005 à 12:51:04
| ce que tu veux dire par "changer personnage", c'est un événement qui enléve un de l'équipe pour en mettre un autre à la place (un perso qui se repose par exemple), c'est ça ? |
|
dante | administrateur | | | 254 messages postés |
| Posté le 14-09-2005 à 16:07:56
| dans un rpg de guerre si tu joue avec un perso tu peux le changer dans le menu si il est presque mort ou kk chose comme ca |
|
zelda mythologie | espion | | | 142 messages postés |
| Posté le 14-09-2005 à 17:28:52
| oui mon idée c'est plutôt l'évenement |
|
dante | administrateur | | | 254 messages postés |
| Posté le 15-09-2005 à 00:27:31
| oui l'evenement |
|
zelda mythologie | espion | | | 142 messages postés |
| Posté le 15-09-2005 à 10:39:40
| en evenement comun avec l'appuye dune touche par exemple |
|
dante | administrateur | | | 254 messages postés |
| Posté le 15-09-2005 à 11:16:24
| oui c'est possible mais le mieux c'est dans le menu il est pas mal non plus dans le menu |
|
|