ID:257759
 
//Title: Phase Icons
//Credit to: Android Data
//Contributed by: Android Data


/*
This snippet provides you with two cool procedures to use for atoms. It will
cause the atom to phase in/out at will. It also manipulates density/opacity at
your whim.
You can use the effect for i.e. teleportation effects, going invisible and
becoming visible again, holograms, ...
It's just something I whipped up for my game. I don't like keeping state
secrets so I'm giving it out to the general public so you can make your own
effects! It also takes underlays and overlays into account, so now you can
finally make those effects for your mobs without having to draw every single
overlay the same way!

Note that you will need a blank icon (in my case it was 'Icons/blank.dmi':
I don't use FILE_DIR so I have to specify the full directory). The icon file
should have only one icon_state: a blank one with only the transparent mask in
it.

There are three procs that you can use freely:
* The anim_fadein() proc allows you fade-in an object. You may optionally
change the icon of the object. In this case, the fade in effect will be changed
to fade in the icon you specified rather than the objects' original icon.

* The anim_fadeout() proc allows you to fade-out an object.

* The genicons() proc allows you to regenerate the fade-in/fade-out icons for
the object. anim_fadein() and anim_fadeout() call this automatically since it
doesn't do anything if no changes were made to the icon (thus preventing too
much CPU usage due to regenerating the same icon). You may call genicons(1) to
force regeneration of the icon. This may be nessesary when you are dealing with
dynamic icons yourself.
*/


genimage
var
icon/icon
icon_state
list/overlays[0]
list/underlays[0]

icon/genicon
New(atom/A)
icon=A.icon
icon_state=A.icon_state
for(var/X in A:overlays)
var/genimage_layer/I=new
I.icon=X:icon
I.icon_state=X:icon_state
overlays+=I
for(var/X in A:underlays)
var/genimage_layer/I=new
I.icon=X:icon
I.icon_state=X:icon_state
underlays+=I
genimage_layer
var
icon
icon_state
atom
var
genimage/fadeimage1
genimage/fadeimage2
icon/fadeinicon
icon/fadeouticon
proc
anim_fadein(icon=initial(src.icon),icon_state=initial(src.icon_state), \
density=initial(src.density),opacity=initial(src.opacity))
if(!icon) return
src.icon=icon //these two are here for genicons() to do its work.
src.icon_state=icon_state
genicons()
src.density=density
src.icon=fadeinicon
flick("",src)
sleep(8)
src.opacity=opacity
src.icon=icon
src.icon_state=icon_state
anim_fadeout(density=initial(src.density),opacity=initial(src.opacity))
genicons()
src.opacity=opacity
icon=fadeouticon
flick("",src)
sleep(8)
src.density=density
icon=null
genicons(override=0)
.=0
if(!fadeimage1||!genicons_check(fadeimage1)||override)
.=1
fadeimage1=new(src)
fadeimage1.genicon=new('Icons/blank.dmi')
for(var/genimage_layer/I in fadeimage1.underlays)
fadeimage1.genicon.Blend(icon(I.icon,I.icon_state),\
ICON_OVERLAY)
fadeimage1.genicon.Blend(icon(fadeimage1.icon,\
fadeimage1.icon_state),ICON_OVERLAY)
for(var/genimage_layer/I in fadeimage1.overlays)
fadeimage1.genicon.Blend(icon(I.icon,I.icon_state),\
ICON_OVERLAY)
for(var/i=2,i<=32,i+=2)
fadeimage1.genicon.DrawBox(null,i,1,i,31) //create dither effect
if(!fadeimage2||!genicons_check(fadeimage2)||override)
.=1
fadeimage2=new(src)
fadeimage2.genicon=new('Icons/blank.dmi')
for(var/genimage_layer/I in fadeimage2.underlays)
fadeimage2.genicon.Blend(icon(I.icon,I.icon_state),ICON_OVERLAY)
fadeimage2.genicon.Blend(icon(fadeimage2.icon,fadeimage2.icon_state),\
ICON_OVERLAY)
for(var/genimage_layer/I in fadeimage2.overlays)
fadeimage2.genicon.Blend(icon(I.icon,I.icon_state),ICON_OVERLAY)
for(var/i=2,i<=32,i+=2)
fadeimage2.genicon.DrawBox(null,i,1,i,31) //create dither effect
for(var/i=2,i<=32,i+=2)
fadeimage2.genicon.DrawBox(null,1,i,31,i) //create second dither effect
if(.)
fadeinicon=new('Icons/blank.dmi',icon_state="")
fadeinicon.Insert(fadeimage2.genicon,icon_state="",delay=2,\
frame=2)
fadeinicon.Insert(fadeimage1.genicon,icon_state="",delay=2,\
frame=3)
fadeinicon.Insert(icon(icon,icon_state),icon_state="",delay=2,\
frame=4)

fadeouticon=new(icon(icon,icon_state),icon_state="")
fadeouticon.Insert(fadeimage1.genicon,icon_state="",delay=2,\
frame=2)
fadeouticon.Insert(fadeimage2.genicon,icon_state="",delay=2,\
frame=3)
fadeouticon.Insert('Icons/blank.dmi',icon_state="",delay=2,\
frame=4)
genicons_check(genimage/I)
if(I.icon!=src.icon||I.icon_state!=src.icon_state) return 1
.=0
var/list
overlays[0]
underlays[0]
for(var/X in src.overlays)
var/genimage_layer/L
for(L in I.overlays)
if(L.icon==X:icon&&L.icon_state==X:icon_state) break
if(L) overlays+=L
else {.=1;break;}
if(.) return 1
for(var/X in src.underlays)
var/genimage_layer/L
for(L in I.underlays)
if(L.icon==X:icon&&L.icon_state==X:icon_state) break
if(L) underlays+=L
else {.=1;break;}
if(.) return 1
for(var/genimage_layer/X in src.overlays) if(!(X in overlays))
return 1
for(var/genimage_layer/X in src.underlays) if(!(X in underlays))
return 1

///*
//Testing Code/Sample Implementation:

atom
New()
.=..()
verbs-=/atom/verb/fadein
if(ismob(src)&&src:client) verbs-=/atom/verb/fadeout
verb
fadein()
set src in world
if(usr.ckey=="androiddata")
anim_fadein()
verbs-=/atom/verb/fadein
verbs+=/atom/verb/fadeout
fadeout()
set src in world
if(usr.ckey=="androiddata")
anim_fadeout()
verbs-=/atom/verb/fadeout
verbs+=/atom/verb/fadein