Multifunction door cog -- prl_door_auto.cog
This cog allows you to open a single door by any and all of 5 methods: crossing an adjoin, pressing a switch, stepping on a surface, activating door from one side, or entering a sector. Use your imagination to set up your own combination. See cog details below. 13 August 2001

# Jedi Knight Cog Script 
#
# prl_door_auto.cog
# Sylvicolus [PRL] 13 August 2001
#
# ===This cog is for single player levels only.==========================
# Based on 00_elev_switch.cog and 00_door.cog with functions and adjoin code added.
# FOR USE WITH ONLY ONE DOOR.  Do not use see-through doors
# Cog affects the adjoins of the door sector but does not affect light value.
# Door will react to "blocked" message (player is blocking door movement).
# Door opens, sleeps, and closes.
#
# Five methods to open door, depends on which variables you supply values for.
# The mask=0x405 allows both player and AI to open door by these methods.
# AI can always open door from either side.
#
# Give a value for ANY of the following variables to get the door to open.
#
# outer_adjoin0, outer_adjoin1, outer_adjoin2 -- crossing these adjoin surfaces.
#
# button -- surface is a switch you can put anywhere to open the door.
#
# floor_by_door -- floor surface is stepped on.
#
# Door opens if player is in sector_by_door and activates the door (spacebar).
# Sector_by_door0 -- Entering this sector (use for onlocked side of door).
# Sector_by_door1 -- the next adjacent sector if the first sector is small.
#
# If sector_active=1 then entering a sector_by_door will also open the door.
#
# If alarm_active=1 then alarm will briefly sound when activating locked door.
#
# This cog is not supported by LucasArts Entertainment Co.

symbols

message  startup
message  crossed
message  entered
message  activated
message  touched
message  arrived
message  blocked

thing	door0		linkid=2  mask=0x405
flex	sleeptime=2.0
flex	speed=4.0
surface	outer_adjoin0	linkid=1  mask=0x405
surface	outer_adjoin1	linkid=1  mask=0x405
surface	outer_adjoin2	linkid=1  mask=0x405
surface	button		linkid=1  mask=0x405
surface	floor_by_door	linkid=1  mask=0x405
sector	sector_by_door0	linkid=3  mask=0x405
sector	sector_by_door1	linkid=3  mask=0x405
int	sector_active=0
int	alarm_active=0

sound	wav0=beep1.wav		local
sound	wav1=lvrclik2.wav	local
sound	wav2=00alarmloop03.wav	local
sector	doorSector		local
int	sector			local
int	cog_active=0		local
thing	player			local

end

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

code

startup:
	doorSector = GetThingSector(door0);
	SetSectorAdjoins(doorSector, 0);
	player = jkGetLocalPlayer();
	return;

crossed:     // outer adjoin(s)
entered:     // floor_by_door or sector_by_door
	if (cog_active==1) return;
	if (GetSourceRef() != player) 
	{   // AI opens door
		cog_active=1;
		call OpenDoors; 
		return; 
	}
	if (sector_active == 0 && GetSenderId() == 3) return;  // sector does not trigger door
	cog_active=1;
	call OpenDoors; 
	return;

touched:
	if (GetSourceRef() == player) return; //AI can activate doors with touch
activated:    // press button or door
	if (cog_active==1) return;
	cog_active=1;
	if (GetSourceRef() != player && GetSenderId() == 2) 
	{   // AI opens door
		call OpenDoors; 
		return; 
	}
	sector = GetThingSector(player); 
	if (GetSenderId() == 2 && sector != sector_by_door0 && sector != sector_by_door1) 
	{ // message came from door and player not on inside sector.
		PlaySoundThing(wav1, door0, 1.0, -1, -1, 0); // door sound
		if (alarm_active == 1) PlaySoundThing(wav2, door0, 1.0, -1, -1, 0); // alarm sound
		sleep(0.3);
		cog_active=0;
		return; 
	}
	call OpenDoors; 
	return; 

OpenDoors:
	if (GetCurFrame(door0) != 0) return; // no effect if door is open or moving
	sleep(0.1);
	if (button) 
	{
		SetWallCel(button, 1);
		PlaySoundPos(wav0, SurfaceCenter(button), 0.6, -1, -1, 0);
	}
	SetSectorAdjoins(doorSector, 1);
	MoveToFrame(door0, 1, speed);  // open door
	return;

arrived:
	if (GetCurFrame(door0) == 0)
	{
		SetSectorAdjoins(doorSector, 0);
		if (button) 
		{
			SetWallCel(button, 0);
			PlaySoundPos(wav0, SurfaceCenter(button), 0.6, -1, -1, 0);
		}
		cog_active=0;
	} 
	else		// door open, so sleep then close
	{
		Sleep(sleeptime); 
		MoveToFrame(door0, 0, speed);
	}
	return;

blocked:
	MoveToFrame(door0, 1, speed);
	return;

end