XP 스크립트

아이템 조합 스크립트입니다.(별도로 데모는 첨부하지 않겠습니다.  SDK버전은 Near Fantastica의 SDK Test Bed에 들어있고, 스크립트 작동예시도 거기서 볼 수 있습니다)

  사용할 조합 레시피는
class Game_Temp
  def get_recipe_list
      ingredients = [33, 34] #조합에 사용할 아이템 ID
      ingredient_types = [0, 0] #조합에 사용할 아이템 타입(0:일반, 1:방어구, 2: 무기)
      quantities = [4, 1] #조합에 사용할 아이템 수량
      result = 4 #조합된 아이템 ID
      result_type = 2 #조합된 아이템 타입
      @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type)) #조합메뉴에 나타날 조합 레시피
    ..........
  end
......
식으로 정의하면 됩니다.  이벤트로 레시피를 익히게 하려면
$game_party.learn_recipe([아이템ID,아이템타입])

메뉴나 맵에서 불러내려면
$scene=Scene_Craft.new
를 사용하면 됩니다.(기본적으로는 나갔을 때 메뉴로 돌아감)


#================================
# CRAFTING PROGRAM
#----------------------------------------------------------------
#-written by Deke
#-yes_no window code created by Phsylomortis
#----------------------------------------------------------------
#================================

#updates to Game_Party class

class Game_Party
 
 attr_accessor      :recipes
 
 alias crafting_party_initialize initialize
 
 def initialize
  crafting_party_initialize
  @recipes=[]
 end
 
 #----------------------------------------------------------------------
 def know?(recipe, version = 1)
  unless recipe.is_a?(Game_Recipe)
    recipe = get_recipe_from_master_list(recipe, version)
  end
  return $game_party.recipes.include?(recipe)
 end
 
#----------------------------------------------------------------------
 def learn_recipe(recipe , version = 1)
  unless recipe.is_a?(Game_Recipe)
    recipe = get_recipe_from_master_list(recipe, version)
  end
  if recipe.is_a?(Game_Recipe)
    unless know?(recipe)
      @recipes.push(recipe)
    end
  end
 end
 
#----------------------------------------------------------------------
 def forget_recipe(recipe , version = 1)
  if !recipe.is_a?(Game_Recipe)
    recipe = get_recipe_from_master_list(recipe, version)
  end
  if recipe.is_a?(Game_Recipe)
    for i in 0...@recipes.size
      if recipe == @recipes[i]
        index = i
        break
      end
    end
    if index != nil
      @recipes.delete(@recipes[index])
    end
  end
 end
 
#----------------------------------------------------------------------
 def get_recipe_from_master_list(item, version)
  index = nil
  for i in 0...$game_temp.recipe_list.size
    if item[0] == $game_temp.recipe_list[i].result and item[1] ==$game_temp.recipe_list[i].result_type
      version -= 1
      if version == 0
        index = i
        break
      end
    end
  end
  if index.is_a?(Integer)
    return ($game_temp.recipe_list[index])
  else
    return false
  end
 end
 
end # of Game_Party updates

#================================
class Game_Recipe

 attr_reader :ingredients
 attr_reader :quantities
 attr_reader :result
 attr_reader :result_type
 attr_reader :ingredient_types
 
#----------------------------------------------------------------------
 def initialize( ingredients, ingredient_types, quantities, result, result_type)
  @ingredients = ingredients
  @ingredient_types = ingredient_types
  @quantities = quantities
  @result = result
  @result_type = result_type
 end
 
#----------------------------------------------------------------------
 def name
  case @result_type
    when 0
      name = $data_items[@result].name
    when 1
      name = $data_armors[@result].name
    when 2
      name = $data_weapons[@result].name
  end
  return name
 end

#----------------------------------------------------------------------
 def have
  have_all = true
  for i in 0...@ingredients.size
    case @ingredient_types[i]
      when 0
        if $game_party.item_number(@ingredients[i]) < @quantities[i]
          have_all=false
        end
      when 1
        if $game_party.armor_number(@ingredients[i]) < @quantities[i]
          have_all=false
        end
      when 2
        if $game_party.weapon_number(@ingredients[i]) < @quantities[i]
          have_all=false
        end
    end
  end
  return have_all
 end

#----------------------------------------------------------------------
 def decrement
  for i in 0...@ingredients.size
    case @ingredient_types[i]
    when 0
      $game_party.lose_item(@ingredients[i], @quantities[i])
    when 1
      $game_party.lose_armor(@ingredients[i], @quantities[i])
    when 2
      $game_party.lose_weapon(@ingredients[i], @quantities[i])
    end
  end
 end

#----------------------------------------------------------------------
 def make
  if have
    case @result_type
    when 0
      $game_party.gain_item(@result, 1)
    when 1
      $game_party.gain_armor(@result, 1)
    when 2
      $game_party.gain_weapon(@result, 1)
    end
    decrement
  end
 end
 
#----------------------------------------------------------------------
 def == (recipe)
  if recipe.is_a?(Game_Recipe)
    equal = true
    if recipe.ingredients != self.ingredients
      equal = false
    end
    if recipe.ingredient_types != self.ingredient_types
      equal = false
    end
    if recipe.quantities != self.quantities
      equal = false
    end
    if recipe.result != self.result
      equal=false
    end
    if recipe.result_type != self.result_type
      equal = false
    end
  else
    equal = false
  end
  return equal
 end
 
end # of Game_Recipe class

#===================================

class Window_Craft < Window_Selectable

 #--------------------------------------------------------------------------
 def initialize
  super(0, 64, 240, 416)
  @column_max = 1
  refresh
  self.index = 0
 end

 #--------------------------------------------------------------------------
 def recipe
  return @data[self.index]
 end

 #--------------------------------------------------------------------------
 def refresh
  if self.contents != nil
    self.contents.dispose
    self.contents = nil
  end
  @data = []
  for i in 0...$game_party.recipes.size
      @data.push($game_party.recipes[i])
  end
  @item_max = @data.size
  if @item_max > 0
    self.contents = Bitmap.new(width - 32, row_max * 32)
    self.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype
    self.contents.font.size = $fontsize.is_a?(Integer) ? $fontsize : $defaultfontsize
    for i in 0...@item_max
      draw_item(i)
    end
  end
 end

 #--------------------------------------------------------------------------
 def draw_item(index)
  recipe = @data[index]
  self.contents.font.color = recipe.have ? normal_color : disabled_color
  x = 16
  y = index * 32
  self.contents.draw_text(x , y, self.width-32, 32, recipe.name, 0)
 end

 #--------------------------------------------------------------------------
 def update_help
  current_recipe = recipe
  if current_recipe.is_a?(Game_Recipe)
  case current_recipe.result_type
    when 0
      description = $data_items[current_recipe.result].description
    when 1
      description = $data_armors[current_recipe.result].description
    when 2
      description = $data_weapons[current_recipe.result].description
    end
  else
    description = ""
  end
  @help_window.set_text(description)
  @help_window.update
 end
 
end # of Window_Craft

#=======================================
class Window_CraftResult < Window_Base

 #--------------------------------------------------------------------------
 def initialize
  super(240, 64, 400, 184)
  self.contents = Bitmap.new(width - 32, height - 32)
  self.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype
  self.contents.font.size = 20
  @result = nil
  @type = nil
 end

 #--------------------------------------------------------------------------
 def refresh
  self.contents.clear
  case @type
    when 0
      item = $data_items[@result]
      if item.recover_hp_rate > item.recover_hp
        hp_string = "HP Recovery% :"
        hp_stat = item.recover_hp_rate
      else
        hp_string = "HP Recovery Points:"
        hp_stat = item.recover_hp
      end
      if item.recover_sp_rate > item.recover_sp
        sp_string = "SP Recovery% :"
        sp_stat = item.recover_sp_rate
      else
        sp_string = "SP Recovery Points:"
        sp_stat = item.recover_sp
      end
      @strings = [hp_string, sp_string, "Phy. Def:" , "Mag Def:", "Accuracy:", "Variance:"]
      @stats = [hp_stat, sp_stat, item. pdef_f, item.mdef_f, item.hit, item.variance,
                      $game_party.item_number(@result)]
      @bitmap = RPG::Cache.icon(item.icon_name)
    when 1
      item = $data_armors[@result]
      @strings = ["Phy. Def:", "Mag. Def:", "Evasion plus:", "Strength plus:", "Dex. plus:",
                      "Agility plus:", "Int. plus:"]
      @stats = [item.pdef, item.mdef, item.eva, item.str_plus, item.dex_plus,
                  item.agi_plus, item.int_plus, $game_party.armor_number(@result) ]
      @bitmap = RPG::Cache.icon(item.icon_name)
    when 2
      item = $data_weapons[@result]
      @strings =["Attack Power:", "Phy. Def:", "Mag. Def:", "Strength plus:", "Dex. plus:",
                  "Agility plus:", "Int. plus:"]
      @stats = [item.atk, item.pdef, item.mdef, item.str_plus, item.dex_plus,
                  item.agi_plus, item.int_plus, $game_party.weapon_number(@result) ]
      @bitmap = RPG::Cache.icon(item.icon_name)
  end
  for i in 0...@strings.size
    x = i%2 * 184
    y = i /2 *28 +32
    self.contents.font.color = normal_color
    self.contents.draw_text(x,y,100, 28,@strings[i])
    self.contents.font.color = system_color
    self.contents.draw_text(x + 110, y, 45, 28, @stats[i].to_s)
  end
  self.contents.blt(0, 0, @bitmap, Rect.new(0, 0, 24, 24), 255)
  self.contents.font.color= normal_color
  self.contents.draw_text(40, 0, 300, 28, "Quantity curentley owned:")
  self.contents.font.color = system_color
  count = @stats[@stats.size - 1].to_s
  self.contents.draw_text(294, 0, 45, 28, count )
 end
 
#----------------------------------------------------------------------
 def set_result(result , type)
  @result = result
  @type = type
  refresh
 end

end #of Window_CraftResult

#=======================================
class Window_CraftIngredients < Window_Base

 #--------------------------------------------------------------------------
 def initialize
  super(240, 248, 400, 232)
  self.contents = Bitmap.new(width - 32, height - 32)
  self.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype
  self.contents.font.size = 20
  @ingredients = []
  @types = []
  @quantities = []
  @item = nil
  @count = 0
 end

 #--------------------------------------------------------------------------
 def refresh
  self.contents.clear
  for i in 0...@ingredients.size
    case @types[i]
    when 0
      @item = $data_items[@ingredients[i]]
      @count = $game_party.item_number(@ingredients[i])
    when 1
      @item = $data_armors[@ingredients[i]]
      @count = $game_party.armor_number(@ingredients[i])
    when 2
      @item = $data_weapons[@ingredients[i]]
      @count = $game_party.weapon_number(@ingredients[i])
    end
    y = i *26
    self.contents.blt(0, y, RPG::Cache.icon(@item.icon_name), Rect.new(0, 0, 24, 24), 255)
    self.contents.font.color = @count >= @quantities[i] ? normal_color : disabled_color
    self.contents.draw_text(30, y, 280, 28, @item.name)
    self.contents.draw_text(300, y, 45, 28, @quantities[i].to_s)
    self.contents.font.color = system_color
    self.contents.draw_text(245, y, 45, 28, @count.to_s )   
  end
 end
   
 #--------------------------------------------------------------------------
 def set_ingredients(ingredients , types, quantities)
  @ingredients = ingredients
  @types = types
  @quantities = quantities
  refresh
 end

end # of Window_CraftIngredients

#======================================
class Scene_Craft

 #--------------------------------------------------------------------------
 def initialize(craft_index=0, return_scene = "menu")
  @craft_index=craft_index
  @return_scene = return_scene
 end
 
 #--------------------------------------------------------------------------
 def main
  @craft_window = Window_Craft.new
  @craft_window.index=@craft_index
  @confirm_window = Window_Base.new(120, 188, 400, 64)
  @confirm_window.contents = Bitmap.new(368, 32)
  @confirm_window.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype
  @confirm_window.contents.font.size = $fontsize.is_a?(Integer) ? $fontsize : $defaultfontsize
  @help_window = Window_Help.new
  @craft_window.help_window = @help_window
  @result_window=Window_CraftResult.new
  @ingredients_window=Window_CraftIngredients.new
  @yes_no_window = Window_Command.new(100, ["Yes", "No"])
  @confirm_window.visible = false
  @confirm_window.z = 1500
  @yes_no_window.visible = false
  @yes_no_window.active = false
  @yes_no_window.index = 1
  @yes_no_window.x = 270
  @yes_no_window.y = 252
  @yes_no_window.z = 1500
  @label_window = Window_Base.new(450,200,190,52)
  @label_window.contents=Bitmap.new(@label_window.width - 32,@label_window.height - 32)
  @label_window.contents.font.size=20
  @label_window.contents.font.color = @label_window.normal_color
  @label_window.contents.font.name = $fontface.is_a?(String) ? $fontface : $defaultfonttype
  @label_window.contents.draw_text(0, 0, @label_window.contents.width, 20, "  Have    Need")
  Graphics.transition
  loop do
    Graphics.update
    Input.update
    update
    if $scene != self
      break
    end
  end
  Graphics.freeze
  @help_window.dispose
  @craft_window.dispose
  @result_window.dispose
  @ingredients_window.dispose
  @confirm_window.dispose
  @yes_no_window.dispose
  @label_window.dispose
 end

 #--------------------------------------------------------------------------
 def update
  @craft_window.update
  @ingredients_window.update
  if $game_party.recipes.size > 0
    @result_window.set_result(@craft_window.recipe.result, @craft_window.recipe.result_type)
    @ingredients_window.set_ingredients(@craft_window.recipe.ingredients,
                                                          @craft_window.recipe.ingredient_types,
                                                          @craft_window.recipe.quantities)
  end
  if @craft_window.active
    update_craft
    return
  end
  if @yes_no_window.active
    confirm_update
    return
  end
 end

 #--------------------------------------------------------------------------
 def update_craft
  if Input.trigger?(Input::B)
    $game_system.se_play($data_system.cancel_se)
    if @return_scene == "menu"
      $scene = Scene_Menu.new(0)
    else
      $scene = Scene_Map.new
    end
    return
  end
  if Input.trigger?(Input::C) and $game_party.recipes.size != 0
    @recipe = @craft_window.recipe
    if @recipe.have
      @yes_no_window.active = true
      @craft_window.active = false
    else
      $game_system.se_play($data_system.buzzer_se)
      return
    end
  end
 end

 #--------------------------------------------------------------------------
 def confirm_update
  @craft_index = @craft_window.index
  @confirm_window.visible = true
  @confirm_window.z = 1500
  @yes_no_window.visible = true
  @yes_no_window.active = true
  @yes_no_window.z = 1500
  @yes_no_window.update
  string = "Create " + @recipe.name + "?"
  cw = @confirm_window.contents.text_size(string).width
  center = @confirm_window.contents.width/2 - cw /2
  unless @drawn
    @confirm_window.contents.draw_text(center, 0, cw, 30, string)
    @drawn = true
  end
  if Input.trigger?(Input::C)
    if @yes_no_window.index == 0
      $game_system.se_play($data_system.decision_se)
      @recipe.make
      $game_system.se_play($data_system.save_se)
      $scene=Scene_Craft.new(@craft_index)
    else
      $game_system.se_play($data_system.cancel_se)
      $scene=Scene_Craft.new(@craft_index)
    end
  end
  if Input.trigger?(Input::B)
    $game_system.se_play($data_system.cancel_se)
    $scene=Scene_Craft.new(@craft_index)
  end
 end

end # of Scene_Craft

이하는 레시피 목록 예제:
#================================
# Sample master list for crafting script
#----------------------------------------------------------------
#-written by Deke
#----------------------------------------------------------------
#================================

class Game_Temp
  attr_reader :recipe_list
 
  alias crafting_temp_initialize initialize

  def initialize
    crafting_temp_initialize
    @recipe_list=[]
    get_recipe_list
  end
 
  def get_recipe_list
   
    ingredients = [30,31,32]
    ingredient_types = [0,0,0]
    quantities = [1,1,1]
    result = 4
    result_type = 2
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
   
    ingredients = [29,30]
    ingredient_types = [0,0]
    quantities = [1,2]
    result = 8
    result_type = 1
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
   
    ingredients = [30,31,1]
    ingredient_types = [0,0,1]
    quantities = [1,1,3]
    result = 4
    result_type = 0
    @recipe_list.push(Game_Recipe.new(ingredients,ingredient_types,quantities,result,result_type))
   
  end # of get_recipe_list method
end # of updates to Game_Temp Class

Who's 백호

?

이상혁입니다.

http://elab.kr


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 스크립트 자료 게시물 작성시 주의사항 습작 2012.12.24 6203
941 상태/속성 Cool Edited Status Screen. 10 아방스 2009.01.12 2431
940 기타 모험일기 5 키라링 2009.01.18 1825
939 메뉴 KGC스크립트모음 12 file 키라링 2009.01.18 2688
938 메시지 한글 채팅 스크립트 32 file こなた 2009.01.22 4947
937 기타 몬스터 게이지바 턴알 22 file 키라링 2009.01.22 4016
936 아이템 아이템도감 14 키라링 2009.01.22 2300
935 기타 타이머스크립트 ps인간 2009.01.23 1765
934 아이템 아이템획득스크립트 ps인간 2009.01.23 2993
933 아이템 아이템제한스크립트 ps인간 2009.01.23 1680
932 전투 캐릭터고르기스크립트? ps인간 2009.01.23 3264
931 상점 Mog- 상점업그레이드 ps인간 2009.01.23 2684
930 스킬 스킬창 업그레이드? ps인간 2009.01.23 3061
929 메뉴 Mog-메뉴업그레이드? ps인간 2009.01.23 2948
928 아이템 mog-아이템창업그레이드? ps인간 2009.01.23 2555
927 장비 장비창업그레이드 ps인간 2009.01.23 2478
926 기타 mog-스테이터스 업그레이드? ps인간 2009.01.23 1904
925 타이틀/게임오버 게..임..오버.. ps인간 2009.01.23 2636
924 이름입력 이름입력스크립트 ps인간 2009.01.23 3632
923 HUD 맵이름표시 ps인간 2009.01.23 3441
922 전투 오버드라이브 8 file 키라링 2009.01.23 2194
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 52 Next
/ 52