I'm trying to have a system where I have a pet that has stats decay slowly(Hunger, Happyness, etc) how would I allow my hunger proc and my randommovement proc run at the same time since they use totally different clocks and it will get very complicated if I make any more looped procs in the future
Thanks in advance - Senormofo
ID:148920
![]() Aug 15 2002, 9:39 pm
|
|
Hanns wrote:
Have you tried something like this..? Just to be on the safe side, you should probably make that into a background proc. mob/proc/Bleh() set background = 1 //the rest of what you had That way, it won't hog processor cycles in the infinite loops -- it'll skip ticks if it has to. |
Hanns wrote:
Have you tried something like this..? Why use sleep? If you're using spawn, might as well use it properly. mob/proc/Bleh() That should accomplish roughly the same results. Spawn(n) waits for n seconds then takes the actions listed under it (indented). Sleep(n) freezes the procedure for n seconds before continuing. Putting sleep() in a spawn() statement will accomplish the same thing, end result wise, but it makes more programming sense to eliminate needless clutter. Doing so makes your code smalle, faster, more efficient, and easier to read. -<font color = #0000FF>Sapphiremagus</font> |
Actually, not exactly. Running loops inside a proc that never ends is preferable to calling the same proc over and over again -- running an infinite loop means that the code runs through a jump instruction, while spawning the proc over and over again runs through a function-call, which is much slower (because it has to look up the function's location in the DMB's function table).
Plus, your proc isn't exactly infinite. =P [edit] I think you misread Hanns' code -- he was spawning "while(1)" statements, which are infinite loops. He wasn't spawning sleeps for several seconds and having the procedure return. |
Isn't what he looking for more like:
mob/monster var stomach = 100 mood = 100 proc hunger() stomach -= 5 view() << "I'm getting hungry!" spawn(100) hunger() happiness() mood -= 3 view() << "I'm becoming more sad!" spawn(100) happiness() |
My apologies. Misread = 4am post. No more posting at 4am. Bad for you. Bad for me. Me go bed now. Night.
|
Yeh Orochi is right I'm looking for a way to run somthing like this...
proc hunger() stomach -= 5 view() << "I'm getting hungry!" spawn(100) hunger() happiness() mood -= 3 view() << "I'm becoming more sad!" spawn(100) happiness() |
Ok...there's a few ways to do this.
I'm assuming you're not looking for -exact- symmetry...since that's pretty impossible... The easiest way is probably to bounce off time with modulo..like this something like: mob/proc first() usr << "first" while(world.time%100 != 0) sleep(-1) spawn(first) second() usr << "second" while(world.time%100 != 0) sleep(-1) spawn(second) A true time-offset ticker is probably the -best- way to go, and you might want to use my ticker library (which I intend to clean up and put up sometime today, since it seems to be in demand and useful) |
I thought having those sleep procs in there accomplished that by pausing the proc and letting the CPU attend to other things. I may have made some incorrect assumptions as to how sleep actually works...
|
mob/proc/Bleh()
spawn while(1)
sleep(50)
src << "Blah"
spawn while(1)
sleep(10)
src << "Bleh"