PDA

View Full Version : COG Repetition control structure causes massive slowdown



Wolfy
11-15-2003, 03:43 PM
One of the following COGs causes my level to slow down to the point of almost freezing.


################################################## ########################################
# Jedi Knight Cog Script #
# #
# electroswitch.cog #
# #
# #
# This cog will make a light thing flicker, to put it in your level, creat a thing #
# where you want the flickering light. #
# #
# [EL3CTRO - 15/04/2001] [ Modified by Wolfy - 15/11/2003] #
# #
################################################## ########################################
flags=0x240

symbols

message startup
message timer
message activated
thing light
template electric
template sparks
surface switch1
surface screen1
surface switch2
surface screen2
surface switch3
surface screen3
sound beep
sound elec_sound
int a=0 local
int sw1on=0 local
int sw2on=0 local
int sw3on=0 local

end

#================================================= ==========================-

code

startup:

SetTimer(rand());
return;

#================================================= ==========================-

activated:

if((GetSenderRef()==switch1) && (sw1on==0)) {
sw1on=1;
a=1;
SetWallCel(switch1, 1);
SetWallCel(screen1, 1);
PlaySoundLocal(beep, 1.0, 0.0, 0x0);
}

if((GetSenderRef()==switch2) && (sw2on==0)) {
sw2on=1;
SetWallCel(switch1, 2);
SetWallCel(screen1, 2);
PlaySoundLocal(beep, 1.0, 0.0, 0x0);
}

if((GetSenderRef()==switch3) && (sw3on==0)) {
sw3on=1;
SetWallCel(switch3, 1);
SetWallCel(screen3, 1);
PlaySoundLocal(beep, 1.0, 0.0, 0x0);
}

return;

#================================================= ==========================-


timer:

if(On)
{
if (a==0) {
SetThingLight(light, 1, 0);
CreateThing(electric, light);
CreateThing(sparks, light);
PlaySoundThing(elec_sound, light, 1.0, -1, -1, 0x0);
SetTimer(rand());
}
}
else
{
if (a==0) {
SetThingLight(light, 0, 0);
SetTimer(rand());
}
}

On = 1 - On;

return;

#================================================= ==========================-

end

This one generates lightning, sparks, and a flash of light at a specificed point (to simulate sparking wiring and electrical arcs). When you press switch1, it's supposed to set a=1, so that the timer stops.


# Jedi Knight Cog Script
#
#
# [YB]
#
# (C) 1997 LucasArts Entertainment Co. All Rights Reserved
# 00_sectordamage.cog
#
# Apply constant amount of damage to a player in a sector.
# Sector can heal instead, if a negative number is used for the "damage" variable.
#
# 01/31/97 [CYW]
# 04/14/97 [YB] Disabled the pulse if the damageSector is not linked in
# Reduced the damageInterval and increased the damage
# 06/27/97 [DB] Changed damage type to 0x1


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

symbols

message startup
message pulse
message activated

sector damageSector # the deadly sector.

surface switch1

flex damageInterval=1.0 # how often damage is applied in seconds.
flex damage=4.0 # how much damage is applied

thing victim local # actors and players affected.

int bugger=0 local
int type local
int sw****=0 local # Uh, oh! Naughty word!!!111shiftone

end

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

code

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

startup:
if(damageSector > -1) SetPulse(damageInterval);
return;

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

activated:
if((GetSenderRef()==switch1) && (sw****==0)) {
sw****=1;
bugger=1;
}

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


pulse:

if (bugger==0) {
victim = FirstThingInSector(damageSector);
while (victim != -1)
{
type = GetThingType(victim);
// If we have an actor (2) or a player (10)
if ((type==2) || (type==10))
{
// Do the damage or healing.
if (damage > 0)
{
DamageThing(victim, damage, 0x1, victim);
}
else
{
HealThing(victim, -damage);
}
victim = NextThingInSector(victim);
}
}
}
return;

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

end

This COG is supposed to damage the player while bugger=0. Then, when switch1 is activated, bugger=1 and the player can not be damaged while he/she is in the specified sector.

Anyone have any ideas?

------------------
"LC Tusken: the idiot is the person who follows the idiot and your not following me your insulting me your following the path of a idiot so that makes you the idiot"
Jack Chick preaches it (http://www.chick.com/bookimages/150/150_064.gif)
NMGOH (http://www.nmgoh.com)

Lord_Grismath
11-15-2003, 08:55 PM
For the first one, I say kill L3CY.



int sw****=0 local # Uh, oh! Naughty word!!!111shiftone

That might possibly have something to do with it. http://forums.massassi.net/html/tongue.gif



activated: if((GetSenderRef()==switch1) && (sw****==0)) {


The parentheses are unnecessary around the sw********* part.

[This message has been edited by Lord_Grismath (edited November 15, 2003).]

Emon
11-15-2003, 10:23 PM
Unless COG is even more stupid than I think it already is, that shouldn't matter.

------------------
Bassoon, n. A brazen instrument into which a fool blows out his brains.

The_New_Guy
11-16-2003, 10:57 AM
I believe its your use of timers. I think at one time sabermaster tried to explain how each timer ID uses a different thread. I think with SetTimer(Rand()); you are actually creating new timers before the old ones expire.

I would try a different approach or switch to pulse: .

------------------
- Wisdom is 99% experience, 1% knowledge. -