![[PokeCommunity.com] [Essentials v16.2+] Overworld Shadows [PokeCommunity.com] [Essentials v16.2+] Overworld Shadows](https://cdn.discordapp.com/attachments/513468946599510016/582579882798743553/Shadow_Overworld.gif)
I made a new Shadow Overworld, fixing '$game_switches' and dependent events bugs. Let's go!
First, save this image (called by shadow) inside Character folder:
![[PokeCommunity.com] [Essentials v16.2+] Overworld Shadows [PokeCommunity.com] [Essentials v16.2+] Overworld Shadows](https://cdn.discordapp.com/attachments/568260046383743005/582584197550440448/shadow.png)
If you are using v16.2 check here.
Now, find 'Sprite_WaterReflection' script and below that script, add a new script called "Sprite_ShadowOverworld" (or whatever you want) and paste this code inside the new script:
Spoiler:
New Code:
Spoiler:
Code:
# Extending so we can access some private instance variables.
class Game_Character; attr_reader :jump_count; end
class Sprite_ShadowOverworld
attr_reader :visible; attr_accessor :event
NO_SHADOW_EVENT=["door","nurse","healing balls","Mart","boulder","tree","HeadbuttTree","BerryPlant"]
def initialize(sprite,event,viewport=nil)
@rsprite = sprite
@sprite = nil
@event = event
@viewport = viewport
@disposed = false
@shadowoverworldbitmap = AnimatedBitmap.new("Graphics/Characters/shadow")
@cws = @shadowoverworldbitmap.height*2
@chs = @shadowoverworldbitmap.height*2
update
end
def dispose; if !@disposed; @sprite.dispose if @sprite; @sprite = nil; @disposed = true; end; end
def disposed?; @disposed; end
def jump_sprite
return unless @sprite
x = (@event.real_x - @event.map.display_x + 3) / 4 + (Game_Map::TILEWIDTH / 2)
y = (@event.real_y - @event.map.display_y + 3) / 4 + (Game_Map::TILEHEIGHT)
@totaljump = @event.jump_count if !@totaljump
case @event.jump_count
when 1..(@totaljump / 3); @sprite.zoom_x += 0.1; @sprite.zoom_y += 0.1
when (@totaljump / 3 + 1)..(@totaljump / 3 + 2); @sprite.zoom_x += 0.05; @sprite.zoom_y += 0.05
when (@totaljump / 3 * 2 - 1)..(@totaljump / 3 * 2); @sprite.zoom_x -= 0.05; @sprite.zoom_y -= 0.05
when (@totaljump / 3 * 2 + 1)..(@totaljump); @sprite.zoom_x -= 0.1; @sprite.zoom_y -= 0.1
end
if @event.jump_count == 1; @sprite.zoom_x = 1.0; @sprite.zoom_y = 1.0; @totaljump = nil; end
@sprite.x = x; @sprite.y = y; @sprite.z = @rsprite.z - 1
end
def visible=(value); @visible = value; @sprite.visible = value if @sprite && [email protected]?; end
def update
return if disposed? || !$scene || !$scene.is_a?(Scene_Map)
return jump_sprite if event.jumping?
if event.character_name =="" || event.character_name == "nil" ||
(PBTerrain.isGrass?(pbGetTerrainTag(event)) || PBTerrain.hasReflections?(pbGetTerrainTag(event)) ||
PBTerrain.isSurfable?(pbGetTerrainTag(event)) || PBTerrain.isIce?(pbGetTerrainTag(event))) ||
(event!=$game_player && pbEventCommentInput(event,0,"NoShadow")) ||
NO_SHADOW_EVENT.include?(event.character_name) || event.transparent
# Just-in-time disposal of sprite
if @sprite; @sprite.dispose; @sprite = nil; end; return; end
# Just-in-time creation of sprite
@sprite = Sprite.new(@viewport) if !@sprite
if @sprite
@sprite.bitmap = @shadowoverworldbitmap.bitmap; cw = @cws; ch = @chs
@sprite.x = @rsprite.x
@sprite.y = @rsprite.y
@sprite.ox = cw/2 -1
@sprite.oy = ch -18
@sprite.z = @rsprite.z-1
@sprite.zoom_x = @rsprite.zoom_x
@sprite.zoom_y = @rsprite.zoom_y
@sprite.tone = @rsprite.tone
@sprite.color = @rsprite.color
@sprite.opacity = @rsprite.opacity
end
end
end
Old Code:
Spoiler:
Code:
# Extending so we can access some private instance variables.
class Game_Character
attr_reader :jump_count
end
class Sprite_ShadowOverworld
attr_reader :visible
attr_accessor :event
def initialize(sprite,event,viewport=nil)
@rsprite = sprite
@sprite = nil
@event = event
@viewport = viewport
@disposed = false
@shadowoverworldbitmap = AnimatedBitmap.new("Graphics/Characters/shadow")
@cws = @shadowoverworldbitmap.height*2
@chs = @shadowoverworldbitmap.height*2
update
end
def dispose
if !@disposed
@sprite.dispose if @sprite
@sprite = nil
@disposed = true
end
end
def disposed?
@disposed
end
def jump_sprite
return unless @sprite
x = (@event.real_x - @event.map.display_x + 3) / 4 + (Game_Map::TILEWIDTH / 2)
y = (@event.real_y - @event.map.display_y + 3) / 4 + (Game_Map::TILEHEIGHT)
@totaljump = @event.jump_count if !@totaljump
case @event.jump_count
when 1..(@totaljump / 3)
@sprite.zoom_x += 0.1
@sprite.zoom_y += 0.1
when (@totaljump / 3 + 1)..(@totaljump / 3 + 2)
@sprite.zoom_x += 0.05
@sprite.zoom_y += 0.05
when (@totaljump / 3 * 2 - 1)..(@totaljump / 3 * 2)
@sprite.zoom_x -= 0.05
@sprite.zoom_y -= 0.05
when (@totaljump / 3 * 2 + 1)..(@totaljump)
@sprite.zoom_x -= 0.1
@sprite.zoom_y -= 0.1
end
if @event.jump_count == 1
@sprite.zoom_x = 1.0
@sprite.zoom_y = 1.0
@totaljump = nil
end
@sprite.x = x
@sprite.y = y #- 6
@sprite.z = @rsprite.z - 1
end
def visible=(value)
@visible = value
@sprite.visible = value if @sprite && [email protected]?
end
def update
return if disposed?
return jump_sprite if event.jumping?
currentTag = pbGetTerrainTag(event)
if event.character_name =="" || event.character_name == "nil" ||
(PBTerrain.isGrass?(currentTag) || PBTerrain.hasReflections?(currentTag) ||
event!=$game_player && PBTerrain.isSurfable?(currentTag)) ||
event!=$game_player && pbEventCommentInput(event,0,"NoShadow") || event.transparent
# Just-in-time disposal of sprite
if @sprite
@sprite.dispose
@sprite = nil
end
return
end
# Just-in-time creation of sprite
@sprite = Sprite.new(@viewport) if !@sprite
if @sprite
if (event==$game_player && $PokemonTemp.surfJump)
@sprite.x = ($PokemonTemp.surfJump[0]*[email protected]_x+3)/4+(Game_Map::TILEWIDTH/2)
@sprite.y = ($PokemonTemp.surfJump[1]*[email protected]_y+3)/4+(Game_Map::TILEHEIGHT/2)+16
else
@sprite.x = @rsprite.x
@sprite.y = @rsprite.y
end
@sprite.bitmap = @shadowoverworldbitmap.bitmap; cw = @cws; ch = @chs
@sprite.x = @rsprite.x
@sprite.y = @rsprite.y
@sprite.ox = cw/2 -1
@sprite.oy = ch -18
@sprite.z = @rsprite.z-1
@sprite.zoom_x = @rsprite.zoom_x
@sprite.zoom_y = @rsprite.zoom_y
@sprite.tone = @rsprite.tone
@sprite.color = @rsprite.color
@sprite.opacity = @rsprite.opacity
end
end
end
Now, find 'Sprite_Character' script. Then:
Spoiler:
Inside 'def initialize(viewport, character = nil)', below '@surfbase = Sprite_SurfBase.new(self,character,viewport) if character==$game_player' add:
Code:
@shadowoverworldbitmap = Sprite_ShadowOverworld.new(self,character,viewport)
Inside 'def visible=(value)', below '@reflection.visible = value if @reflection' add:
Code:
@shadowoverworldbitmap.visible = value if @shadowoverworldbitmap
Inside 'def dispose', below '@reflection = nil' add:
Code:
@shadowoverworldbitmap.dispose if @shadowoverworldbitmap
@shadowoverworldbitmap = nil
Finally, inside 'def update', below '@reflection.update if @reflection', paste:
Code:
@shadowoverworldbitmap.update if @shadowoverworldbitmap
To the event doesn't works (won't show the shadow effect) you need to put a Comment NoShadow inside the event, to each page. Example to (healing balls events, inside Poke Center Map):
Spoiler:
![[PokeCommunity.com] [Essentials v16.2+] Overworld Shadows [PokeCommunity.com] [Essentials v16.2+] Overworld Shadows](https://cdn.discordapp.com/attachments/568260046383743005/582582033067540523/unknown.png)
JUST A P.S. DON'T COPY:
That is the code to check if event are walking into surfing base or grass tile or water reflection tile (to remove the shadow effect). You can add more if you want to:
Code:
currentTag = pbGetTerrainTag(event)
if PBTerrain.isGrass?(currentTag) || PBTerrain.hasReflections?(currentTag) ||
PBTerrain.isSurfable?(currentTag)
# Just-in-time disposal of sprite
if @sprite
@sprite.dispose
@sprite = nil
end
return
end
Thanks Marin for the code about jump scene.
Thanks MGriffin for help me about jump scene.
Give credits to me (WolfPP) and Marin (because i copied his "jump scene" into Shadow Overworld script) if use.
Cya!
Last edited: