#============================================================================== # □ Sapphire Action System IV Skill Fix ver.1.1.1 #============================================================================== # Author : 습작(etude87) #============================================================================== module Sapphire_Core #-------------------------------------------------------------------------- # ■ 파티클 소멸 시간 #-------------------------------------------------------------------------- # 설명 : 파티클 생성 후 소멸까지 소요되는 시간입니다.(단위 프레임) # 미 설정시 (255 - 이동속도 * 5)의 속도(최소값 1)로 사라집니다. # 개별 스킬에 Disappear = n 을 입력하시면 됩니다.(0보다 클것) #-------------------------------------------------------------------------- #-------------------------------------------------------------------------- # ■ 8방향 사용 여부 #-------------------------------------------------------------------------- # 설명 : 사용 설정을 하시면 대각선 방향인 경우 투사체가 대각선 방향으로 사출됩니다. #-------------------------------------------------------------------------- Use_Dir8 = true #-------------------------------------------------------------------------- # ■ 기본 최대 시작 각도(0부터 설정 값중 무작위의 각도로 시작합니다.) #-------------------------------------------------------------------------- # 설명 : SAS는 XAS와 달리 투사체 이미지 자체가 움직이는 것이 아니라 점선 그리듯 # 이동하며 매 위치마다 점점 사라지는 파티클 스프라이트를 생성합니다. # 0 이상일 경우 0부터 설정 값까지 중에서 무작위로 선택하여 파티클 스프라이트를 # 회전시켜 생성합니다. # 본래 SAS의 기본값은 360입니다. # 개별 스킬에 대한 설정은 StartAngle = n 을 입력하시면 됩니다. #-------------------------------------------------------------------------- Default_Particle_Start_Angle = 360 #-------------------------------------------------------------------------- # ■ 기본 최대 회전 각도(0부터 설정 값중 무작위의 각도로 회전합니다.) #-------------------------------------------------------------------------- # 설명 : 점점 사라지는 파티클 스프라이트는 생성 이후부터 매 프레임마다 # 0부터 설정 값까지 중 무작위로 선택하여 그만큼 회전을 합니다. # 본래 SAS의 기본값은 10입니다. # 개별 스킬에 대한 설정은 AnglePlus = n 을 입력하시면 됩니다. #-------------------------------------------------------------------------- Default_Particle_Angle_Plus = 10 #-------------------------------------------------------------------------- # ■ 기본 방향에 다른 반전 및 회전 사용 여부 #-------------------------------------------------------------------------- # 설명 : 파티클의 좌우 반전 및 상하 각도 회전을 적용합니다. # 개별 스킬에 대한 설정은 Mirror = true/false 를 입력하시면 됩니다. #-------------------------------------------------------------------------- Default_Particle_Mirror = true #-------------------------------------------------------------------------- # ■ 기본 파티클 생성 간격 #-------------------------------------------------------------------------- # 설명 : 파티클 생성과 다음 파티클 생성까지의 간격입니다. # 0인 경우 매 이동마다 파티클을 그려주게 됩니다. # 1이상인 경우 파티클 생성 후 설정 값만큼 이동 후 다시 파티클을 생성합니다. # 개별 스킬에 대한 설정은 Interval = n 을 입력하시면 됩니다. #-------------------------------------------------------------------------- Default_Particle_Interval = 0 #-------------------------------------------------------------------------- end #============================================================================== #============================================================================== module Pixel_Core Pixel_Range = {2=>[0,0.25], 4=>[-0.25,0], 6=>[0.25,0], 8=>[0,-0.25], 1=>[-0.25,0.25], 3=>[0.25,0.25], 7=>[-0.25,-0.25], 9=>[0.25,-0.25], } Tile_Range = {2=>[0,1], 4=>[-1,0], 6=>[1,0], 8=>[0,-1], 1=>[-1,1], 3=>[1,1], 7=>[-1,-1], 9=>[1,-1], } end #============================================================================== #============================================================================== class RPG::Skill < RPG::UsableItem #-------------------------------------------------------------------------- def disappear self.note.get("Disappear", 0).to_i end #-------------------------------------------------------------------------- def mirror self.note.get("Mirror", Sapphire_Core::Default_Particle_Mirror) end #-------------------------------------------------------------------------- def start_angle self.note.get("StartAngle", Sapphire_Core::Default_Particle_Start_Angle).to_i end #-------------------------------------------------------------------------- def angle_plus self.note.get("AnglePlus", Sapphire_Core::Default_Particle_Angle_Plus).to_i end #-------------------------------------------------------------------------- def interbal self.note.get("Interval", Sapphire_Core::Default_Particle_Interval).to_i end #-------------------------------------------------------------------------- end #============================================================================== #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- def move_by_input return if !movable? || $game_map.interpreter.running? move_straight(Sapphire_Core::Use_Dir8 ? Input.dir8 : Input.dir4) if (Sapphire_Core::Use_Dir8 ? Input.dir8 : Input.dir4) > 0 end #-------------------------------------------------------------------------- end #============================================================================== #============================================================================== class Sprite_Character < Sprite_Base #-------------------------------------------------------------------------- def update_src_rect case @character.direction when 2,4,6,8 dir = @character.direction when 1,3 dir = 2 when 7,9 dir = 8 end if @tile_id == 0 index = @character.character_index pattern = @character.pattern < 3 ? @character.pattern : 1 sx = (index % 4 * 3 + pattern) * @cw sy = (index / 4 * 4 + (dir - 2) / 2) * @ch self.src_rect.set(sx, sy, @cw, @ch) end end #-------------------------------------------------------------------------- end #============================================================================== #============================================================================== class Sapphire_Skill #-------------------------------------------------------------------------- attr_reader :disappear attr_reader :mirror attr_reader :start_angle attr_reader :angle_plus #-------------------------------------------------------------------------- alias etude87_sf_initialize initialize def initialize(char) @move_count = 0 etude87_sf_initialize(char) @disappear = @skill.disappear @mirror = @skill.mirror @start_angle = @skill.start_angle @angle_plus = @skill.angle_plus end #-------------------------------------------------------------------------- def update move unless moving? return update_move if moving? end #-------------------------------------------------------------------------- def distance_per_frame 2 ** [@move_speed,6].min / 256.0 end #-------------------------------------------------------------------------- def move_pixel ([@move_speed,6].max/6).times do run_move_pixel end if @move_speed > 6 case @move_speed%6 when 1 extra_move(6) when 2 extra_move(3) when 3 extra_move(2) when 4 2.times do extra_move(3) end when 5 extra_move(2) extra_move(5) end end end #-------------------------------------------------------------------------- def extra_move(n) run_move_pixel if Graphics.frame_count % n == 0 end #-------------------------------------------------------------------------- def run_move_pixel return if @last_move cast_particle if @move_count % (@skill.interbal + 1) == 0 if pixel_passable?(@px,@py,@direction) @px += Tile_Range[@direction][0] @py += Tile_Range[@direction][1] @real_x = @x @real_y = @y @x += Pixel_Range[@direction][0] @y += Pixel_Range[@direction][1] else front_pixel_touch?(@px + Tile_Range[@direction][0],@py + Tile_Range[@direction][1]) @last_move = true @remaining = 3 end @move_count += 1 end #-------------------------------------------------------------------------- end #============================================================================== #============================================================================== class Sapphire_Particle < Sprite #-------------------------------------------------------------------------- def initialize(key,char) super(nil) @key = key @char = char self.bitmap = Sapphire_Bitcore[@key] self.ox = self.bitmap.width/2 self.oy = self.bitmap.height/2 self.z = 200 if @char.mirror case @char.direction when 3 self.angle = 315 when 2 self.angle = 270 when 9 self.angle = 45 when 4 self.mirror = true when 7 self.mirror = true self.angle = 315 when 8 self.mirror = true self.angle = 270 when 1 self.mirror = true self.angle = 45 end end self.angle += rand(@char.start_angle) @add = rand(@char.angle_plus) @done = false @rx = @char.real_x @ry = @char.real_y self.blend_type = @char.blend @speed = @char.move_speed @start = true end #-------------------------------------------------------------------------- def update self.x = $game_map.adjust_unlx(@rx) * 32 + 16 self.y = $game_map.adjust_unly(@ry) * 32 + 16 if @char.mirror case @char.direction when 2,3,6,9 self.angle += @add else self.angle -= @add end else self.angle += @add end if @start @start = false else if @char.disappear > 0 self.opacity <= 0 ? dispose : self.opacity -= (255.0/@char.disappear) else self.opacity <= 0 ? dispose : self.opacity -= @speed * 5 end end end #-------------------------------------------------------------------------- end