#===============================================================================
# # Klein Footprints for Pokémon Essentials
# # Give credits if you're using this!
# # https://kleinstudio.deviantart.com
#===============================================================================
#Regardless of the above setting,the species in this array will always animate
FOLLOWING_DONT_WALK=[
# GEN I
12,15,17,18,22,41,42,49,50,51,63,74,81,92,93,109,110,120,121,137,142,144,145,
146,149,150,151,
# GEN II
164,165,166,169,171,176,187,188,189,193,200,201,204,205,207,223,226,227,233,
249,250,251,
# GEN III
267,269,277,278,279,283,284,291,292,307,313,314,318,319,320,321,330,333,334,
337,338,339,340,343,344,349,351,353,355,358,362,366,367,368,369,370,374,375,
380,381,382,384,385,
# GEN IV
397,398,412,413,414,415,416,420,425,426,429,433,436,437,442,455,456,457,458,
462,468,469,472,474,476,477,478,479,480,481,482,487,488,489,490,491,492,493,
# GEN V
494,517,518,520,521,527,528,535,546,548,550,561,562,563,564,567,577,578,
579,581,582,583,584,589,592,593,594,597,599,600,601,602,605,606,607,608,609,
615,616,628,630,635,637,641,642,643,644,645,648,
# GEN VI
662,663,666,669,670,671,679,680,681,682,683,686,690,691,693,703,707,708,710,
711,714,715,717,719,720,
# GEN VII
732,733,738,742,743,746,751,761,764,769,770,774,779,781,785,786,787,788,789,790,792,
793,797,798,800,801,803,804
#GEN VIII
]
# Set here the terrain tag for footprints, 3 is sand
TERRAINFOOT=3
# Initial opacity for footprints
FOOTOPACITY=62
# Delay velocity
FOOTDELAY=1.1
class Footprint
def initialize(event,position)
return if event!=$game_player &&
(event.character_name=="" || event.character_name == "nil" || event.name.include?("/nofoot/"))
return if event!=$game_player && pbEventCommentInput(event,0,"NoFoot")
if $game_switches[Toggle_Following_Switch]
if $Trainer.party.length>0
return if event!=$game_player && (!($game_map.events[@event_id] &&
$game_map.events[@event_id].name=="Dependent") &&
(FOLLOWING_DONT_WALK.include?($Trainer.party[0].species) ||
$PokemonGlobal.bicycle))
end
end
character_sprites=$scene.spriteset.character_sprites
viewport=$scene.spriteset.viewport1
footsprites=$scene.spriteset.footsprites
nid=getNewId
fev=$game_map.events[nid]
rpgEvent=RPG::Event.new(position[0],position[1])
rpgEvent.id=nid
fev=Game_Event.new($game_map.map_id,rpgEvent,$game_map)
eventsprite=Sprite_Character.new(viewport,fev)
character_sprites.push(eventsprite)
footsprites.push(Footsprite.new(eventsprite,fev,viewport,$game_map,position[2],
nid,character_sprites,(event==$game_player)))
end
end
def getNewId
newId = 1
while $game_map.events[newId] != nil do
break if $game_map.events[newId].erased
newId += 1
end
return newId
end
class Game_Event < Game_Character
attr_reader :erased
end
class Sprite_Character
alias old_initialize_foot initialize
def initialize(viewport, character = nil)
old_initialize_foot(viewport, character)
@disposed=false
end
alias old_update_foot update
def update
return if @disposed
old_update_foot
end
alias old_dispose_foot dispose
def dispose
old_dispose_foot
@disposed=true
end
end
class Spriteset_Map
def viewport1; return @@viewport1; end
attr_accessor :character_sprites
attr_accessor :footsprites
alias old_initialize initialize
def initialize(map=nil)
old_initialize(map)
@footsprites=[]
end
def putFootprint(event,pos)
foot=Footprint.new(event,pos)
end
alias old_dispose dispose
def dispose
old_dispose
if @footsprites!=nil
for sprite in @footsprites
sprite.dispose
end
end
@footsprites.clear
end
alias old_update update
def update
old_update
if @footsprites!=nil
for sprite in @footsprites
sprite.update
end
end
end
end
class Scene_Map
def spriteset?
return true if @spritesets!=nil
return false
end
end
class Game_Character
alias old_increase_foot increase_steps
def get_last_pos
case direction
when 2 # Move down
return [@x,@y-1,direction]
when 4 # Move left
return [@x+1,@y,direction]
when 6 # Move right
return [@x-1,@y,direction]
when 8 # Move up
return [@x,@y+1,direction]
end
return false
end
def terrain_tag_pos(x=@x,y=@y)
return $game_map.terrain_tag(x, y)
end
def increase_steps
if terrain_tag_pos(get_last_pos[0],get_last_pos[1])==TERRAINFOOT
$scene.spriteset.putFootprint(self,get_last_pos) if $scene.is_a?(Scene_Map) && $scene.spriteset?
end
old_increase_foot
end
end
class Footsprite
def initialize(sprite,event,viewport,map,direction,nid,chardata,player)
@rsprite=sprite
@sprite=Sprite.new(viewport)
if player && $PokemonGlobal.bicycle
@sprite.bitmap=BitmapCache.load_bitmap("Graphics/Pictures/footsetbike")
else
@sprite.bitmap=BitmapCache.load_bitmap("Graphics/Pictures/footset")
end
@[email protected]/4
@sprite.src_rect.width=@realwidth
@opacity=FOOTOPACITY
setFootset(direction)
@event=event
@disposed=false
@map=map
@eventid=nid
@viewport=viewport
@chardata=chardata
update
end
def setFootset(direction)
case direction
when 2 # Move down
@sprite.src_rect.x=0
when 4 # Move left
@sprite.src_rect.x=@realwidth*3
when 6 # Move right
@sprite.src_rect.x=@realwidth*2
when 8 # Move up
@sprite.src_rect.x=@realwidth
end
@sprite.opacity=@opacity
end
def dispose
if !@disposed
@disposed=true
@event.erase
for i in [email protected]
@chardata.delete_at(i) if @chardata[i]==@rsprite
end
@rsprite.dispose
@sprite.dispose
@sprite=nil
end
end
def update
return if @disposed
[email protected]@rsprite.ox
[email protected]@rsprite.oy
[email protected]_rect.width
[email protected]_rect.height
@sprite.x=x+width/2
@sprite.y=y+height
@sprite.ox=@realwidth/2
@[email protected]
@[email protected]
@opacity-=FOOTDELAY
@sprite.opacity=@opacity
if @sprite.opacity<=0
dispose
end
end
end