Thanks, I added a note.

Christopher Harris wrote:
You should note that Think functions needs have void as return type and void
as parameter. Ie void ImThinking( void ); I didn't see anywhere that it was
explicitly stated.

Chris

-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Josh Rehm
Sent: Saturday, February 23, 2008 4:10 PM
To: [email protected]
Subject: Re: [hlcoders] Think() documentation

--
[ Picked text/plain from multipart/alternative ]

What code samples?


The ones you have in your post, alternating every second between which
messages are going to the console :)

On Sat, Feb 23, 2008 at 2:08 PM, Jay Stelly <[EMAIL PROTECTED]> wrote:


DEFINE_THINKFUNC is there to support saving the game.  Datadescs
implement entity serialization.

Jay



-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of
Tom Edwards
Sent: Saturday, February 23, 2008 1:50 AM
To: [email protected]
Subject: Re: [hlcoders] Think() documentation

Thanks Josh. I've added the updated article to VDC:


http://developer.valvesoftware.com/wiki/Think()<http://developer.valvesoftwa
re.com/wiki/Think%28%29>.

I know there is a DATADESC macro to define a Think

function, DEFINE_THINKFUNC.  I'm not sure of what it gains
you, however, and from what I've been able to tell everything
works fine without it.
I'd guess that it prevents an entity from changing its mind
about something every time a saved game is loaded. It's a
good enough theory to be going on with.

You mention ClientThink at the beginning of the document,

and then again at the end.  I'd put them together.
There's actually a link down to the ClientThink heading in
the HTML version. That's the best way of doing it: you don't
want to less useful stuff pushing down the core information,
but you do want people who need to perform a special task to
be aware that the page will be useful to them.

Are you sure the Think function is called automatically at Spawn?


Yes. :-) Think is the logic_auto of entities.

I'd mention that passing 0 (some code samples I've seen use

NULL) to SetNextThink will prevent a Think function from
being fired again.
Good tip, I'll add that.

The code samples and explanations are perfect for how to

use the Think

functions and how they're based on time.  Also, the more advanced
example regarding the gun is a great way of showing how those
functions can be expanded into something more detailed, that's not
necessarily "AI".  In other words, it's another use of the

Think functions.
What code samples?


Josh Rehm wrote:

--
[ Picked text/plain from multipart/alternative ] Some good info.  I
learned a bit from it.  I am by no means a professional

(anything), so

take my comments with a grain of salt!  This is all just my

own little

opinion.

I can't speak for everyone, but to me it would seem like anyone who
understands basic programming concepts, functions, and

methods (member

functions), should be able to realize they can call functions from
anywhere (inside Think functions).  I'd recommend picking a target
audience that allows you to focus on explaining the purpose of the
Think functions, how to use them, and write as if you're talking to
them.  Organize the document in such a way where it states its
assumptions about the reader's knowledge, where the reader can find
information about those assumptions (if they don't know

those things), and then the document itself.

I know there is a DATADESC macro to define a Think function,
DEFINE_THINKFUNC.  I'm not sure of what it gains you, however, and
from what I've been able to tell everything works fine without it.
However, since it exists, it may be good to understand the

purpose of

DATADESC so you can describe what using that macro gains

you.  (This

would teach me something
too!)  Though, following what I mention in the paragraph above, I
wouldn't go into a lot of detail about the purpose of

DATADESC itself.

You could write a separate document on that.

As for AI, at most I would suggest that these functions

could be used

for AI, and then cover the AI in another document.  Again,

this keeps

the document focused on the Think functions and how to use them.

Elaborate a little on what "internal logic" is, as it's an

important

concept in terms of what a Think function is for.  Something like
"Think functions are used to implement your entity's

internal logic, how your entity thinks.

In other words, an Entity can use a think function to

determine how it

should react to external stimuli and its current situation.  For
example, an entity that uses a weapon could use a Think function to
check its current ammunition stock.  If its low, it would switch to
another Think function that implements how it should go

about finding

ammunition."  This could tie in well to the AI comment I made above.

You mention ClientThink at the beginning of the document, and then
again at the end.  I'd put them together.

Are you sure the Think function is called automatically at

Spawn?  I

always thought you had to set the correct think function with
SetThink, and call SetNextThink from within Spawn() to get

the a Think

function to fire the first time.  I may be wrong here, and if so
someone please correct me (I don't have the code available

to test it at the moment).

I'd mention that passing 0 (some code samples I've seen use

NULL) to

SetNextThink will prevent a Think function from being fired again.

The code samples and explanations are perfect for how to

use the Think

functions and how they're based on time.  Also, the more advanced
example regarding the gun is a great way of showing how those
functions can be expanded into something more detailed, that's not
necessarily "AI".  In other words, it's another use of the

Think functions.

Finally, I would elaborate a little on what you mean by "Don't put
anything expensive in this function."

I think it's a very useful document, especially to someone just
getting started with the Source Engine.  Great job!

- Josh


On Fri, Feb 22, 2008 at 11:56 AM, Tom Edwards
<[EMAIL PROTECTED]>
wrote:



[ Converted text/html to text/plain ]

I'm in the process of writing some programming

documentation for VDC

(it's a fantastic way to learn). Before I make any

changes, I'd like

to hear some feedback. :-)

Some concerns of mine:

I don't explicitly mention that you can call the functions from
anywhere within a class, not just a think function. How

obvious is it

that you can do that?
I don't mention DATADESC. I don't understand it, can't

make it work,

and all of my experiments worked fine without it anyway. Is it
important?
I don't mention AI thinking. Should I?
Is it actually any good?

Here's the copy. I hope you can view HTML e-mails:




---------------------------------------------------------------------

---------

Thinking

An entity's Think() function is the "root" gateway used to run all
internal logic. It is called once on spawn, with any

subsequent calls

decided by the programmer - happening either on a regular

basis, or

in response to external events.

Use ClientThink()[1] to have an entity think every frame.

SetNextThink()

Defines when the entity next thinks.
Accepts a floating point[2] value.
If more than one call is made in a single execution, the new value
overrides the old.

void CMyEntity::Think()
{
       Msg( "I think, therefore I am.\n" );
       SetNextThink( gpGlobals->curtime + 1.0f ); // Think

again in

1.0seconds }

This code causes the entity to print a message to the console once
per second.
Note the use of gpGlobals->curtime, which returns the time at
execution, and f, which tells the C++ compiler that we are

submitting

a floating-point value and not an integer[3].

SetThink()

Changes the active think function
Accepts a function pointer[4]: add '&' before the name and

omit its

closing parentheses.
If more than one call is made in a single execution, the new value
overrides the old.

void CMyEntity::Think()
{
       Msg( "I think, therefore I am.\n" );
       SetThink( &CMyEntity::Think2 ); // Think with this

procedure next

       SetNextThink( gpGlobals->curtime + 1.0f ); }

void CMyEntity::Think2()
{
       Msg( "Variety is the spice of life.\n" );
       SetThink( &CMyEntity::Think ); // Think with this

procedure next

       SetNextThink( gpGlobals->curtime + 1.0f ); }

This code switches thinking between two functions. A real-world
application is to change an entity between various life stages:
consider a buildable gun turret[5]. One think function would run
while it waits to be unpackaged, another while it is being built,
another while it is active, and a fourth when it dies.

Creating think

functions for each discrete stage increases code stability

and aids

debugging.

ClientThink()

Thinking can also occur on the client, but its effects are limited.
Additionally, only one think function is supported for each entity.

void C_MyEntity::ClientThink()
{
       DevMsg( "Don't put anything expensive in this

function!\n" );

       SetNextClientThink( CLIENT_THINK_ALWAYS ); // Think every
frame }

Some examples of client-side thinking are:

Visual effects / particles
VGUI screen interaction
Modifying player speed (calculated on the client as well

as server to

avoid
lag)
Striders' legs snapping ropes (disabled by default)

SetNextClientThink()

Used to re-fire ClientThink(). In addition to normal float

values, it

accepts:

CLIENT_THINK_ALWAYS
Think on the client once every frame. Use with caution!
Replaces Simulate().
CLIENT_THINK_NEVER
Stop all client-side thinking without killing the entity.

===References:===
 1.


http://developer.valvesoftware.com/w/index.php?title=Generalities_On_

Entities&amp;action=submit#ClientThink.28.29
 2. http://en.wikipedia.org/wiki/Floating_point
 3. http://en.wikipedia.org/wiki/Integer_%28computer_science%29
 4. http://en.wikipedia.org/wiki/Pointer_%28computing%29
 5. http://forums.gamedesign.net/viewtopic.php?t=3702

_______________________________________________
To unsubscribe, edit your list preferences, or view the list
archives, please visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders




--

_______________________________________________
To unsubscribe, edit your list preferences, or view the

list archives, please visit:

http://list.valvesoftware.com/mailman/listinfo/hlcoders




_______________________________________________
To unsubscribe, edit your list preferences, or view the list
archives, please visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders



_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives,
please visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders



--

_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives,
please visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders


_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please 
visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders





_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please 
visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders

Reply via email to