Massassi Forums Logo

This is the static archive of the Massassi Forums. The forums are closed indefinitely. Thanks for all the memories!

You can also download Super Old Archived Message Boards from when Massassi first started.

"View" counts are as of the day the forums were archived, and will no longer increase.

ForumsCog Forum → Nice and simple Splinter Cellish cog
Nice and simple Splinter Cellish cog
2003-08-31, 4:43 AM #1
I've got this thermal goggles cog that I've been having some problems with.
Code:
# Jedi Knight Cog Script
#
# ITEM_THGOGGLES.COG
#
# Thermal Goggles
# This set the world to blue to red solid hues and adds fog.
# This changes the models to their heat version.
#
# [DP]
#

symbols

thing       player
int         effectHandle=-1
int         i
int         j
flex        distance

material    thmat=00_blue.mat

message     activated
message     pulse
message     killed
message     startup

sound       goggleActivate=activate01.wav
sound       goggleDeactivate=deactivate03.wav

end

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

code

Startup:
   player = GetLocalPlayerThing();
   HeapFree();
   Return;

# ........................................................................................

Activated:
   If(GetInv(player, 135))
   {
      If(IsInvActivated(player, 135) == 0)
      {
         If(GetInv(player, 13) > 0)
         {
            Print("Thermal Goggles ON");
            SetInvActivated(player, 135, 1);
            PlaySoundThing(goggleActivate, player, 1, -1, -1, 0x80);
            effectHandle = newColorEffect(0, 0, 1, 0, 0, 2, 10, 0, 45, .5);
            HeapNew(0, GetSurfaceCount()*4);
            For(i=0; i<GetSurfaceCount(); i=i+1)
            {
               distance = 0;
               HeapSet(i, GetSurfaceMat(i));
               HeapSet(GetSurfaceCount()+i, GetFaceGeoMode(i));
               HeapSet(GetSurfaceCount()*2+i, GetFaceLightMode(i));
               HeapSet(GetSurfaceCount()*3+i, GetSurfaceLight(i));
               EnableIRMode(0, 1);
               // For(j=0; j<GetNumSurfaceVertices(i); j=j+1)
               // {
               //    If(distance < VectorDist(GetThingPos(player), GetSurfaceVertexPos(i, j)))
               //       distance = VectorDist(GetThingPos(player), GetSurfaceVertexPos(i, j));
               // }
               distance = VectorDist(GetThingPos(player), GetSurfaceCenter(i));
               // If(distance >= 5) distance = 5;
               SetSurfaceMat(i, thmat);
               If(GetFaceGeoMode(i) != 0)
                  SetFaceGeoMode(i, 3);
               SetFaceLightMode(i, 3);
               SetSurfaceLight(i, 1-(distance/5), 0);
            }
            SetPulse(0.025);
         }
         Else
         {
            Print("Thermal Goggles Out Of Power");
            PlaySoundThing(goggleDeactivate, player, 1, -1, -1, 0x80);
         }
      }
      Else
      {
         Print("Thermal Goggles OFF");
         SetInvActivated(player, 135, 0);
         PlaySoundThing(goggleDeactivate, player, 1, -1, -1, 0x80);
         If(effectHandle != -1) freeColorEffect(effectHandle);
         DisableIRMode();
         SetPulse(0);
         For(i=0; i<GetSurfaceCount(); i=i+1)
         {
            SetSurfaceMat(i, HeapGet(i));
            SetFaceGeoMode(i, HeapGet(GetSurfaceCount() + i));
            SetFaceLightMode(i, HeapGet(GetSurfaceCount()*2 + i));
            SetSurfaceLight(i, HeapGet(GetSurfaceCount()*3 + i), 0);
         }
         HeapFree();
      }
   }

   Return;

# ........................................................................................

Pulse:
   ChangeInv(player, 13, -0.075);
   For(i=0; i<GetSurfaceCount(); i=i+1)
   {
      distance = 0;
      // For(j=0; j<GetNumSurfaceVertices(i); j=j+1)
      // {
      //    If(distance < VectorDist(GetThingPos(player), GetSurfaceVertexPos(i, j)))
      //    distance = VectorDist(GetThingPos(player), GetSurfaceVertexPos(i, j));
      // }
      distance = VectorDist(GetThingPos(player), GetSurfaceCenter(i));
      // If(distance >= 5) distance = 5;
      SetSurfaceLight(i, 1-(distance/5), 0);
   }
   If(GetInv(player, 13) <= 0)
   {
      Print("Thermal Goggles Out Of Power");
      SetInvActivated(player, 135, 0);
      PlaySoundThing(goggleDeactivate, player, 1.0, -1, -1, 0x80);
      If(effectHandle != -1) freeColorEffect(effectHandle);
      DisableIRMode();
      SetPulse(0);
      For(i=0; i<GetSurfaceCount(); i=i+1)
      {
         SetSurfaceMat(i, HeapGet(i));
         SetFaceGeoMode(i, HeapGet(GetSurfaceCount() + i));
         SetFaceLightMode(i, HeapGet(GetSurfaceCount()*2 + i));
         SetSurfaceLight(i, HeapGet(GetSurfaceCount()*3 + i), 0);
      }
      HeapFree();
   }

   Return;

# ........................................................................................

Killed:
   If(GetSenderRef() != player) Return;

   If(IsInvActivated(player, 135) == 1)
   {
      SetPulse(0);
      SetInvActivated(player, 135, 0);
      If(effectHandle != -1) freeColorEffect(effectHandle);
      DisableIRMode();
      For(i=0; i<GetSurfaceCount(); i=i+1)
      {
         SetSurfaceMat(i, HeapGet(i));
         SetFaceGeoMode(i, HeapGet(GetSurfaceCount() + i));
         SetFaceLightMode(i, HeapGet(GetSurfaceCount()*2 + i));
         SetSurfaceLight(i, HeapGet(GetSurfaceCount()*3 + i), 0);
      }
      HeapFree();
   }
   Return;

end

Note use of code tags.

The problem is as this. The cog, activates and works fine. Then when you deactivate, it changes some surfaces to HOM (assuming a geomode of < 3, most likely 0). Then when you reactivate, it crashes the game. Any ideas on how to help?

------------------
The Sniper Missions. Current project, The Sniper Missions

The Magician Saber System.

The 2 riddle!
Major projects working on:
SATNRT, JK Pistol Mod, Aliens TC, Firearms

Completed
Judgement Day (HLP), My level pack
2003-08-31, 11:00 AM #2
All I can say is check those arrays and be wary of IRMode. ;p
Cordially,
Lord Tiberius Grismath
1473 for '1337' posts.
2003-08-31, 6:19 PM #3
I'm thinking is that theres too many things created by the heap... But why should I be wary of IRmode?

------------------
The Sniper Missions. Current project, The Sniper Missions

The Magician Saber System.

The 2 riddle!
Major projects working on:
SATNRT, JK Pistol Mod, Aliens TC, Firearms

Completed
Judgement Day (HLP), My level pack
2003-09-01, 5:08 AM #4
I don't know, it just sounded cool.
Cordially,
Lord Tiberius Grismath
1473 for '1337' posts.
2003-09-01, 1:13 PM #5
lol Well I'm still looking for ideas, but I think my arrays are right. I'm betting it has something to do with the heapfree() or its too much for JK to handle, else I dunno.

------------------
The Sniper Missions. Current project, The Sniper Missions

The Magician Saber System.

The 2 riddle!
Major projects working on:
SATNRT, JK Pistol Mod, Aliens TC, Firearms

Completed
Judgement Day (HLP), My level pack
2003-09-01, 2:31 PM #6
Descent Pilot, could I have EVERYTHING you are using to test this. Mats, levels...

When I did my own test on my custom level with 00wwarn.mat, it worked without crashing. What exactly is it supposed to do? Limit the view with a cool effect?

------------------
Sam: "Sir we can't call it 'The Enterprise'"
Jack: "Why not!"
Sam: "Sir we can't call it 'The Enterprise'"
Jack: "Why not!"
2003-09-01, 7:25 PM #7
Hmmm.... I don't like to give out my data/levels for a little thing like this. There's no custom mats, a few custom 3dos, and the levels, but nothing really more... I'm stumped, I've got an eariler version that mostly works, but there's not alot of diffrences....

------------------
The Sniper Missions. Current project, The Sniper Missions

The Magician Saber System.

The 2 riddle!

[This message has been edited by Descent_pilot (edited September 01, 2003).]
Major projects working on:
SATNRT, JK Pistol Mod, Aliens TC, Firearms

Completed
Judgement Day (HLP), My level pack
2003-09-02, 12:23 AM #8
Hi there [http://forums.massassi.net/html/smile.gif]

/me-thinks: I'll have to look at this one off-line - I'm guessing it'll take me a while to work through - that's one thing that can be said about you Descent_pilot --> I've noticed this befroe - you're always pushing to get the most out of the JK engine with COG lol [http://forums.massassi.net/html/wink.gif]

Just from a cursory glance, my suspicions lie with you, about the HeapFree() verb and the reasons as to why it's not displaying things as it was when they were first obtained and placed in arrays...

That said, I haven't much used "Heap" verbs (in fact "never" come to think of it... could never think of a practical implementation for it, but hey...) but I'll have a look off-line for you [http://forums.massassi.net/html/smile.gif] I make no promises though lol [http://forums.massassi.net/html/wink.gif]

-Jackpot

PS: Just wondering why in you're first HeapNew verb you're multiplying the surface count by 4 - surely if this was on a large level, you're looking at occupying a huge slab of memory resources, by this means?? It doesn't seem wrong, but I was just curious as to why you'd do this... [http://forums.massassi.net/html/biggrin.gif]

------------------
Are you feeling lucky, cuz if you are, get your hands off me... ;)

"Life is mostly froth and bubble,
But two things stand in stone,
Kindness in another's trouble,
Courage in your own"
("Ye Wearie Wayfarer" - by Adam Lindsay Gordon)
"lucky_jackpot is the smily god..." -gothicX
"Life is mostly froth and bubble, but two things stand in stone,
Kindness in another's trouble, courage in your own"
- "Ye Wearie Wayfarer"
|| AI Builder: compatible with both JK & MotS || My website ||
2003-09-02, 3:50 AM #9
Jackpot, he multiplies it by 4 because he uses i-surface count for mats, surface count-surface count*2 for geo, surface count*2-surface count*3 for facelightmode, and surface count*3-surface count*4 for surfacelight.

DP, I don't think I changed the cog besides the mat (00wwarn.mat) I put it under my field light and it never crashed. Could you say exactly what it's supposed to do?

It made everything blue and, depending on my distance, made surfaces different shades (dark was far). Should I be able to see through walls (I couldn't)?

Hope this helps.

------------------
Sam: "Sir we can't call it 'The Enterprise'"
Jack: "Why not!"
Sam: "Sir we can't call it 'The Enterprise'"
Jack: "Why not!"
2003-09-02, 6:50 AM #10
Cheers SG-fan - as I said, it was only a cursory glance, and now I've had a little time to look at it (been out virtually all today, which I wasn't planning on, but hey...) it was obvious about the Heap setting assignments lol [http://forums.massassi.net/html/wink.gif]

But otherwise, I'm still looking for some sort of error, espcially if SG-fan says it works fine for him (other than changing the mat - maybe there-in lies the issue?) ...

/me = baffled so far (seem to be getting this feeling an awful lot recently - maybe not enough caffeine [http://forums.massassi.net/html/wink.gif] ) ... [http://forums.massassi.net/html/redface.gif]

-Jackpot

------------------
Are you feeling lucky, cuz if you are, get your hands off me... ;)

"Life is mostly froth and bubble,
But two things stand in stone,
Kindness in another's trouble,
Courage in your own"
("Ye Wearie Wayfarer" - by Adam Lindsay Gordon)
"lucky_jackpot is the smily god..." -gothicX
"Life is mostly froth and bubble, but two things stand in stone,
Kindness in another's trouble, courage in your own"
- "Ye Wearie Wayfarer"
|| AI Builder: compatible with both JK & MotS || My website ||
2003-09-02, 10:45 AM #11
i tested your cog by making it the item_irgoggles.cog and changing the bins that it activates and it didnt crash the game on me either.
the one thing that it did do that was sort of wrong was when i exited the game all the way out to windows there would always be a error message that comes up.
it said "warning JK.exe has preformed an illegal operation and will be closed" or something like that.
im not sure if it will help but the only way i could get it so that that error message didnt appear was to tag out (//) all the HeapFree() verbs.
if that doesnt help and you think the heap is too big there is a way to make it smaller than what it is in your cog. i did it in a copy of your cog that i was playing around with. if you want i can post it and you can see what i mean, its kind of hard to explain other wise.


------------------
Famous last words - "It seemed like a good idea at the time."

[This message has been edited by DSLS_DeathSythe (edited September 02, 2003).]
Famous last words - "It seemed like a good idea at the time."
2003-09-02, 11:22 AM #12
Well I for one would be interested in seeing how you made the Heaps smaller (and presumably the cog generally more efficient) DeathSythe [http://forums.massassi.net/html/biggrin.gif]

I'm always willing to see a new/improved modification of previous code... [http://forums.massassi.net/html/wink.gif]

-Jackpot

------------------
Are you feeling lucky, cuz if you are, get your hands off me... ;)

"Life is mostly froth and bubble,
But two things stand in stone,
Kindness in another's trouble,
Courage in your own"
("Ye Wearie Wayfarer" - by Adam Lindsay Gordon)
"lucky_jackpot is the smily god..." -gothicX
"Life is mostly froth and bubble, but two things stand in stone,
Kindness in another's trouble, courage in your own"
- "Ye Wearie Wayfarer"
|| AI Builder: compatible with both JK & MotS || My website ||
2003-09-03, 4:00 AM #13
Could you all post your system specs? Just a theory, but maybe heaps work better depending on your computer. I could be completely wrong, but it's my only way to explain why it works for DeathSythe and me, while not working for you DP.

I just had another idea, in the level you're testing on, are the hom surfaces always the same? If so please post what their flags are.

------------------
Sam: "Sir we can't call it 'The Enterprise'"
Jack: "Why not!"
Sam: "Sir we can't call it 'The Enterprise'"
Jack: "Why not!"
2003-09-03, 7:41 AM #14
i have two computers:

my main gameing/working computer:
-1.6ghz, 256mb ram, Geforce2 32mb video card, WinXP Pro.

my other computer is for internet and testing MP stuff for jk and thats about it:
-133mhz, 48mb ram, no 3D card just a basic graphics card, Win98.

the level i have been testing it out in is the Nar Shaddaa Loading Terminal.

i tried it on both computers (one at a time) and it worked fine for both, except for the error stuff.

oh and heres the cog that ive been playing around with (since lucky_jackpot said that he wanted to see it):
Code:
# Jedi Knight Cog Script
#
# ITEM_THGOGGLES.COG
#
# Thermal Goggles
# This set the world to blue to red solid hues and adds fog.
# This changes the      s to their heat version.
#
# [DP]
#
#############################################################
symbols
#--------------------
message     startup
message     activated
message     pulse
message     killed

thing       player=-1     local

int         effectHandle=-1     local
int         i=0     local
int         j=0     local
flex        distance=0.0     local

material    thmat=00_blue.mat                     local

sound       goggleActivate=activate01.wav         local
sound       goggleDeactivate=deactivate03.wav     local

int         surf_count=0     local
int         a=0              local
flex        light=0.0        local
#--------------------
end
#====================
code
#--------------------
startup:
    Sleep(1.0);
    //-Get a count of all the surfaces that are
    //-going to be effected by this cog...
    surf_count = 0;
    for(i=0; i<GetSurfaceCount(); i=i+1)
        if(GetFaceGeoMode(i) != 0)
            if(!(GetSurfaceFlags(i) & 0x400) && !(GetSurfaceFlags(i) & 0x200))
                surf_count = surf_count + 1;
    PrintInt(surf_count);
//    surf_count = GetSurfaceCount() * 4;
//    PrintInt(surf_count);
    player = GetLocalPlayerThing();
//    HeapFree();
return;
# ........................................................................................
activated:
    if(GetInv(player, 41))
        {
        if(IsInvActivated(player, 41) == 0)
            {
            if(GetInv(player, 13) > 0)
                {
                Print("Thermal Goggles ON");
                SetInvActivated(player, 41, 1);
                PlaySoundThing(goggleActivate, player, 1, -1, -1, 0x80);
                effectHandle = newColorEffect(0, 0, 1, 0, 0, 2, 10, 0, 45, 0.9);
//              HeapNew(0, GetSurfaceCount()*4);
                HeapNew(0, surf_count * 4);
                a = 0;
                for(i=0; i<GetSurfaceCount(); i=i+1)
                    {
                    //-Skip the ADJOINed surfaces...
                    if(GetFaceGeoMode(i) != 0)
                        {
                        //-Skip the SKY surfaces...
                        if(!(GetSurfaceFlags(i) & 0x400) && !(GetSurfaceFlags(i) & 0x200))
                            {
                            distance = 0;
//                            HeapSet(i, GetSurfaceMat(i));
//                            HeapSet(GetSurfaceCount()+i, GetFaceGeoMode(i));
//                            HeapSet(GetSurfaceCount()*2+i, GetFaceLightMode(i));
//                            HeapSet(GetSurfaceCount()*3+i, GetSurfaceLight(i));
                            HeapSet(a, GetSurfaceMat(i));
                            HeapSet(surf_count + a, GetFaceGeoMode(i));
                            HeapSet(surf_count * 2 + a, GetFaceLightMode(i));
                            HeapSet(surf_count * 3 + a, GetSurfaceLight(i));
                            EnableIRMode(0, 1);
                            distance = VectorDist(GetThingPos(player), GetSurfaceCenter(i));
                            SetSurfaceMat(i, thmat);
//                          if(GetFaceGeoMode(i) != 0)
                            SetFaceGeoMode(i, 3);
                            SetFaceLightMode(i, 3);
                            SetSurfaceLight(i, 1-(distance/5), 0);
                            a = a + 1;
                            }
                        }
                    }
                SetPulse(0.025);
                return;
                }
            else
                {
                Print("Thermal Goggles Out Of Power");
                PlaySoundThing(goggleDeactivate, player, 1, -1, -1, 0x80);
                return;
                }
            }
        else
            {
            Print("Thermal Goggles OFF");
            SetInvActivated(player, 41, 0);
            PlaySoundThing(goggleDeactivate, player, 1, -1, -1, 0x80);
            if(effectHandle != -1) freeColorEffect(effectHandle);
            DisableIRMode();
            SetPulse(0);
            a = 0;
            for(i=0; i<GetSurfaceCount(); i=i+1)
                {
                if(GetFaceGeoMode(i) != 0)
                    {
                    if(!(GetSurfaceFlags(i) & 0x400) && !(GetSurfaceFlags(i) & 0x200))
                        {
//                        SetSurfaceMat(i, HeapGet(i));
//                        SetFaceGeoMode(i, HeapGet(GetSurfaceCount() + i));
//                        SetFaceLightMode(i, HeapGet(GetSurfaceCount()*2 + i));
//                        SetSurfaceLight(i, HeapGet(GetSurfaceCount()*3 + i), 0);
                        SetSurfaceMat(i, HeapGet(a));
                        SetFaceGeoMode(i, HeapGet(surf_count + a));
                        SetFaceLightMode(i, HeapGet(surf_count * 2 + a));
                        SetSurfaceLight(i, HeapGet(surf_count * 3 + a), 0);
                        a = a + 1;
                        }
                    }
                }
//            HeapFree();
            }
        }
return;
# ........................................................................................
pulse:
//    ChangeInv(player, 13, -0.075);
    if(GetInv(player, 13) <= 0)
        {
        Print("Thermal Goggles Out Of Power");
        SetInvActivated(player, 41, 0);
        PlaySoundThing(goggleDeactivate, player, 1.0, -1, -1, 0x80);
        if(effectHandle != -1) freeColorEffect(effectHandle);
        DisableIRMode();
        SetPulse(0);
        a = 0;
        for(i=0; i<GetSurfaceCount(); i=i+1)
            {
            if(GetFaceGeoMode(i) != 0)
                {
                if(!(GetSurfaceFlags(i) & 0x400) && !(GetSurfaceFlags(i) & 0x200))
                    {
//                    SetSurfaceMat(i, HeapGet(i));
//                    SetFaceGeoMode(i, HeapGet(GetSurfaceCount() + i));
//                    SetFaceLightMode(i, HeapGet(GetSurfaceCount()*2 + i));
//                    SetSurfaceLight(i, HeapGet(GetSurfaceCount()*3 + i), 0);
                    SetSurfaceMat(i, HeapGet(a));
                    SetFaceGeoMode(i, HeapGet(surf_count + a));
                    SetFaceLightMode(i, HeapGet(surf_count * 2 + a));
                    SetSurfaceLight(i, HeapGet(surf_count * 3 + a), 0);
                    a = a + 1;
                    }
                }
            }
//        HeapFree();
        return;
        }
    for(i=0; i<GetSurfaceCount(); i=i+1)
        {
        if(GetFaceGeoMode(i) != 0)
            {
            if(!(GetSurfaceFlags(i) & 0x400) && !(GetSurfaceFlags(i) & 0x200))
                {
                distance = 0;
                distance = VectorDist(GetThingPos(player), GetSurfaceCenter(i));
                if(VectorZ(GetSurfaceNormal(i)) == 0.0)
                    light = 1 - (distance / 2.5);
                else
                    light = 1 - (distance / 5);
                SetSurfaceLight(i, light, 0);
                }
            }
        }
return;
# ........................................................................................
killed:
    if(GetSenderRef() != player) Return;
    if(IsInvActivated(player, 41) == 1)
        {
        SetPulse(0);
        SetInvActivated(player, 41, 0);
        if(effectHandle != -1) freeColorEffect(effectHandle);
        DisableIRMode();
        a = 0;
        for(i=0; i<GetSurfaceCount(); i=i+1)
            {
            if(GetFaceGeoMode(i) != 0)
                {
                if(!(GetSurfaceFlags(i) & 0x400) && !(GetSurfaceFlags(i) & 0x200))
                    {
//                    SetSurfaceMat(i, HeapGet(i));
//                    SetFaceGeoMode(i, HeapGet(GetSurfaceCount() + i));
//                    SetFaceLightMode(i, HeapGet(GetSurfaceCount()*2 + i));
//                    SetSurfaceLight(i, HeapGet(GetSurfaceCount()*3 + i), 0);
                    SetSurfaceMat(i, HeapGet(a));
                    SetFaceGeoMode(i, HeapGet(surf_count + a));
                    SetFaceLightMode(i, HeapGet(surf_count * 2 + a));
                    SetSurfaceLight(i, HeapGet(surf_count * 3 + a), 0);
                    a = a + 1;
                    }
                }
            }
//        HeapFree();
        }
return;
####################
end

whether or not the size of the heap really makes a difference i have no idea.
its not very different from DP's but all i did mostly to get the heap smaller was not make the HeapNew() make a slot for all surfaces, just the ones that this cog effects (assuming that it was not ment to mess with adjoins or sky surfaces).

------------------
Famous last words - "It seemed like a good idea at the time."

[This message has been edited by DSLS_DeathSythe (edited September 03, 2003).]
Famous last words - "It seemed like a good idea at the time."
2003-09-03, 5:49 PM #15
Hey I finally have time to post! [http://forums.massassi.net/html/tongue.gif] Gots now that little thing called school. [http://forums.massassi.net/html/tongue.gif] But onto buisness.

You're right in how it works SG-fan, you fade away to black as you get further away and it turns it all blue and can't see through walls. (but by now you've all figured that out [http://forums.massassi.net/html/tongue.gif]) PS - I've got a 1.6 ghz, 256 mb RAM, 32 mb vid card (mayber GeForce but I forget [http://forums.massassi.net/html/redface.gif]), and winXP, plus my level has a bit more surfaces then Nar. [http://forums.massassi.net/html/wink.gif]

------------------
The Sniper Missions. Current project, The Sniper Missions

The Magician Saber System.

The 2 riddle!

[This message has been edited by Descent_pilot (edited September 04, 2003).]
Major projects working on:
SATNRT, JK Pistol Mod, Aliens TC, Firearms

Completed
Judgement Day (HLP), My level pack
2003-09-04, 2:30 PM #16
Yes! I've figured it out. Its got to do with the surfaces with dflt.mat. It sets them to a negative number. Go fig why. I fixed with a little simple If(GetHeap(i) < 0) SetSurfaceMat(i, dflt); w/ of course, dflt defined in the symbols. But I dunno whats up with the HeapFree(). Any ideas on that?

------------------
The Sniper Missions. Current project, The Sniper Missions

The Magician Saber System.

The 2 riddle!

[This message has been edited by Descent_pilot (edited September 04, 2003).]

[This message has been edited by Descent_pilot (edited September 04, 2003).]
Major projects working on:
SATNRT, JK Pistol Mod, Aliens TC, Firearms

Completed
Judgement Day (HLP), My level pack

↑ Up to the top!