Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

Berka's NPC Generator

NPC Generator
Version: 2.1
By: Berka


Introduction
This script allows you to create characters during play and randomly, without knowing Ruby. Your game will be more realistic and alive.

Features
  • random checked position
  • name generator
  • random dialog generator
  • dialogs, item/gold/armor gains...

Screenshots
none

Demo
here

Script
Code:
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

#                           NPC Generator

#  by berka                                         rgss2

#                         [url=http://www.rpgmakervx-fr.com  ]http://www.rpgmakervx-fr.com  [/url]                                     

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

#  Rgss 2                 v 2.1     based on mithos & pipo work

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

#                         -Instructions-

# Write in an event, call a script command:

#

# minumum required:

# [event]              # compulsory !

#  chara : "Actor01"    # name of the charset file or: chara : rand

#

# and optional settings:

#  x : 5                # x position, random if nothing

#  y : 10              # y position, random if nothing

#  nom : "Event01"    # event's name or nom: rand

#  c_index : 0        # charset's index

#  face : "Actor01"  # name of the faceset file or: face : true (=> same as chara)

#  f_index : 0        # faceset's index

#  dir : 2            # event direction

#  type_mov:0          # movement type

#  vit_mov:0            # movement speed

#  freq_mov:0          # muvement frequency 

#  texte:"bonjour"    # dialog or texte:rand (cf. list above)

#  trigger:0            # event trigger

#  prio_type:1        # priority

#  script: "print @a=1" # script command

#  combat: 1,true,false # battle: id_monster, esc, follow if defeated

#  or: 0,0,1000      # gold:      0/1 (add/rem),0/1 (Const/var),amount (nbr/var_id)

#  objet: 2,0,0,10    # item:   id,0/1 (add/rem),0/1 (Const/var),amount (nbr/var_id)

#  arme: 2,0,0,10      # weapon: id,0/1 (add/rem),0/1 (Const/var),amount (nbr/var_id)

#  bouclier: 2,0,0,10   # armor:  id,0/1 (add/rem),0/1 (Const/var),amount (nbr/var_id)

#  suppr : true      # erase this generated event

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

# Example:

#

# [event]

# chara:rand

# texte:rand

# type_mov : 1

#

#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

 

$characters="people" # series of charsets used to create random character

                     # people1, people2...

$chara_nbre=5        # nombre de fichiers people                   

# Random dialogs (too lazy to translate everything)                  

$dialogues=["Bonjour, il fait beau, nan ?","Comment allez vous ?","Partez d'ici !",

            "Je n'ai pas de temps à vous accorder !","Vous m'ennuyez...","Encore vous ?",

            "Ah! vous voilà, cher ami !","Tiens, vous semblez fatigué.","Grrrrr...",

            "Hors de ma vue !","Quelle belle journée!","Je me promène.","Vous êtes de retour ?",

            "Hihihi !","Rien.","Je ne veux plus vous parler.","Que faire ?","Mais c'est ¥N[1] !",

            "Le temps change...","Vous êtes mon idole...","Dieu, que vous êtes laid !",

            "Vous me rappelez quelqu'un...","Vous avez l'air sournois","Salut ¥N[1] !",

            "Je ne vous fais pas confiance...","Ne m'approchez pas !","Je suis souffrant",

            "Hé ! tu la connais celle là ?","Ahhahaharff...","Bonjour","Portez vous bien !",

            "Ravi de vous revoir","...Tousse...","Coucou!","Encore un étranger ?","Bouh !",

            "Je n'entends rien de ce que vous dites...","Articulez !","Parlez plus bas.",

            "J'ai fait route toute la journée.","Je suis d'accord.","Dégage, mendiant !",

            "Bonjour jeune homme","...snif...","Vous attirez le malheur ici !","Entendu.",

            "Ne me regardez pas comme ça !","Il faut qu'on se parle...","Venez déjeuner !",

            "Je suis content de vous connaitre."]

            # in-game: $dialogues << "You are now an heroe for me !"

            

$nom=[%w(Gw Ul Et Rh Ed Gr Dr Dw Tr Gh As Ar Ag Xor),            # name generator

      %w(ai ia eo ui yn or ul ur a e i o u y yr ya yl),

      %w(th rk dd gh z l mn lyr zar gor ryn nia lia )]

      

module Berka

  module Pnj_Gen

    Tag = "[event]"                                        # Tag of NPC generator

    Separateur = ":"                                          # Separator: cmd/value

    Index_Chara = 8                                        # Number of patterns 

    Commandes = {:face   => "[101,[@_face,@_f_index,0,2]]", # List of commands

                 :or       => "[125,[*@_or]]",

                 :objet => "[126,[*@_objet]]",

                 :arme   => "[127,[*@_arme]]",

                 :bouclier => "[128,[*@_bouclier]]",

                 :combat   => "[301,[0,*@_combat])]",

                 :script   => "[355,[@_script]]",

                 :suppr => "[214]",

                 :texte => "[401,[@_texte]]"

                }

    ProfCoord = 100                                        # Deep of x/y scan

  end

end

 

include Berka::Pnj_Gen

class Array

  def arand

    self[Kernel.rand(self.size)]

  end

end

class Object

  def rand?

    self == "?"

  end

end

class Game_Map 

  include RPG

  def check_event(x,y) 

    for event in @events.values

      return event.id if event.x==x&&event.y==y

    end 

    return nil 

  end 

  def make_event(com) 

    self.instance_variables.each{|v|eval("#{v}=nil") if v.include?("@_")}

    rand="?"

    com.each_with_index{|c,i|eval("@_#{c.first.id2name}=#{c[1]}")}

    set_rand

    set_options

    return if @_x.nil?||@_y.nil?

    if check_event(@_x,@_y).nil?

      @event=Event.new(@_x,@_y) 

      com.each{|c|c=c.first

        ajout_cmd(*eval("#{Commandes[c]}"))if Commandes.has_key?(c)

      }

      @event.id=creerid

      @event.name=@_nom

      @event.pages.first.graphic.character_name=@_chara

      @event.pages.first.graphic.character_index=@_c_index

      @event.pages.first.graphic.direction=@_dir

      @event.pages.first.move_type=@_type_mov

      @event.pages.first.move_frequency=@_freq_mov

      @event.pages.first.move_speed=@_vit_mov

      @event.pages.first.through=@_trav

      @event.pages.first.trigger=@_trigger

      @event.pages.first.priority_type=@_prio_type

      @events[@event.id]=Game_Event.new(@map_id,@event)

      @need_refresh=true

      $scene.refresh_spriteset  

    end 

  end 

  def set_rand

    rand="?"

    @_chara||=rand

    @_nom=aleatoire_nom if @_nom.nil?

    @_texte=$dialogues.arand if @_texte.rand?

    @_x,@_y=*aleatoire_pos if @_x.nil?||@_y.nil?

    @_pers=aleatoire_perso

    if @_chara.rand?||@_c_index.rand?

      @_face,@_f_index,@_chara,@_c_index=@_pers

    end

  end

  def set_options

    @_chara=@_pers.first if @chara.nil?

    @_c_index=@_pers[1] if @_c_index.nil?

    @_face,@_f_index = "",0 if @_face==false

    @_dir||=3

    @_type_mov||=0

    @_freq_mov||=3

    @_vit_mov||=3

    @_trav||=false

    @_trigger||=0

    @_prio_type||=1

  end

  def aleatoire_pos

    ProfCoord.times{

      x,y=Kernel.rand(width).to_i,Kernel.rand(height).to_i

      next if x==$game_player.x&&y==$game_player.y

      (return x,y) if passable?(x,y)&&!check_event(x,y) 

    }

    return nil,nil

  end

  def aleatoire_perso

    i=Kernel.rand(Index_Chara-1)

    res=$characters+(Kernel.rand($chara_nbre)+1).to_s

    return [res,i,res,i]

  end

  def aleatoire_nom

    n="#{$nom.first.arand}#{$nom[1].arand}#{$nom[2].arand}"

    n<<$nom[1].arand if rand(4)==1

    return n

  end

  def event_name(id)

    @events[id].name if !@events[id].nil?

  end 

  def creerid

    id=1

    id+=1 while @events.keys.include?(id)

    return id

  end

  def ajout_cmd(code,param=[],i=0)

    cmd=EventCommand.new

    cmd.code,cmd.parameters,cmd.indent=code,param,i

    @event.pages.first.list.insert(-2,cmd)

  end

end 

class Scene_Map<Scene_Base

  def refresh_spriteset 

    @spriteset.dispose;@spriteset=Spriteset_Map.new 

  end 

end 

class Game_Interpreter

  def eval(script)

    if script.include?(Tag)

      com=[];script.gsub!(Tag,'')

      list=script.split("\n")

      s=Separateur

      list.each_with_index{|e,i|e.gsub!(' '+s,s);e.gsub!(s+' ',s);f=e.split(s)

      com<<[f.first.to_sym,f[1]]if !f[1].nil?}

      $game_map.make_event(com)

      return

    end

    return Kernel.eval(script)

  end

end

Instructions
Read the comments at the begining of the script.
Do not use this script in parallel process !

FAQ
Place this script above main

Compatibility
No problem.
You may have problems with my video script

Credits and Thanks
Mithos and Pipo both famous French Scripters

Terms and Conditions

this script is totally free of use, but I need an apparent credit in your game and:
Do not post these scripts anywhere without my permission !

have fun.
Berka
 
i haven't tried this script yet (i'm at work) but i totally love the concept. this could be easily extended to anything from treasure chests to monsters, etc. really cool!
 
{FR} pourquoi tu colles le Kernel pour rand ? le module kernel est par defaut inclus dans la classe object, donc normalement t'as pas besoin de l'ecrire. A part la valeur educative que ca peut avoir pour expliquer d'ou viennent ses methodes "sans objet", je vois pas l'interet.{FR}
 
{Fr}Ca doit être un oubli: j'avais défini une methode rand pour l'instance et je voulais limiter la casse pour les doublons... A supprimer dans une prochaine version, merci !{/FR}
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top