Page 1 of 3

Help! My alarm crashes the game!

Posted: Tue Feb 25, 2003 11:32 pm
by matt_moh
:x I tried to put an alarm in my map. The AI goes to it, pulls the alarm, and then the level crashes and goes back to the main menu. Could it have anything to do with the setthread/alarm_player_reset key/value for my trigger use or the fact that I am running my level with spearhead :?: Also, the switch on the alarm moves when the AI pulls it, but when the player pulls it nothing happens. I took a look at the global/alarmer.scr file and read the new tutorial on this site but still, I had the same problems. Help would be greatly appreciated. :?

Posted: Wed Feb 26, 2003 7:16 am
by jv_map
I'm sure the console gives you an error.

"Command overflow. Possible infinite loop in thread" ?

Posted: Wed Feb 26, 2003 11:41 am
by mohaa_rox
BTW, I wrote it. I had this prob too then, but you can take a look at the example map.

Posted: Wed Feb 26, 2003 11:14 pm
by matt_moh
:) Thanks, jv_map. The console does give me the "ERROR Command Overflow. Possibe infintite loop in thread." Does anyone know how to fix that? :?

Posted: Thu Feb 27, 2003 11:12 am
by mohaa_rox
Did you follow everything? The targetname of the alarm? The targetname of the spawners (ai spawners).

Posted: Thu Feb 27, 2003 8:23 pm
by matt_moh
I don't have any alarm spawners. Once an alarm is pulled, a cinema scene starts and the level ends. Because of this, I have no need for alarm spawners. Could that be the problem?

I have 2 alarms, each with a targetname and $targetname of alarm.

Each has a trigger_use around it with setthread/alarm_player_reset.

There are also 3 enemies with all the default settings except for a typeattack of alarm and a targetname of enemy.

In my script I have:

//Nijmegen Bridge Part 1//

main:

$cutwire1 hide
$cutwire4 hide
exec global/loadout.scr maps/test_Nijmegen_Bridge_Part_1.scr
exec global/ai.scr
exec global/alarmer.scr
exec global/turret.scr

level waittill prespawn

exec global/exploder.scr
exec global/spotlight.scr
exec global/ambient.scr test_Nijmegen_Bridge_Part_1
$player stufftext "tmstartloop sound/music/mus_04a_suspense.mp3"

level waittill spawn

end


Further down in the script I have:

alarmer:
end

alarm_player_reset:
thread global/alarmer.scr::alarm_player_reset
end

I tried it without these two threads and still had problems. I only put them in because I saw them in the script for m4l3.

Hopefuly this info will help you guys find the problem.

Posted: Fri Feb 28, 2003 2:00 am
by mohaa_rox
No wonder it doesn't work. You must add alarmspawners.

Posted: Fri Feb 28, 2003 3:32 am
by matt_moh
Thanks mohaa_rox. I'll try adding an alarm spawner. Mabe I can put him in the cinema scene. :P

Posted: Thu Mar 06, 2003 9:21 am
by bdbodger
I had the same problem with the global/alarmer.scr . I compliled it for spearhead and crashes exactly as above even with everything by the book . then I compiled it with the mohaa compilers worked good it's a spearhead thing . looks like a job for jv , rox or inkeeper maybe .

Posted: Thu Mar 06, 2003 10:55 am
by bdbodger
ok after haveing a look and some experementing I have the answer .

change this in alarmer.scr

level waittill prespawn

while ($alarmspawner)
{
local.ent = waitthread global/spawner.scr::spawner_create $alarmspawner[1]
local.ent.targetname = "alarmspawned"
}

to this
level waittill prespawn

for(local.i=1;local.i< $alarmspawner.size+1;local.i++)
{
local.ent = waitthread global/spawner.scr::spawner_create $alarmspawner[local.i]
local.ent.targetname = "alarmspawned"
}

then save it as alarmer2.scr and put it in the global directory or your .pk3

then in your script before waittill prespawn put

exec global/alarmer2.scr

The problem was the original script kept spawning script origins until the game crashed with a no free edict error syntax different in spearhead

Posted: Sat Dec 13, 2003 12:45 am
by Gold
ok hope ya guys can help on this one hehehe,,ok 1st i did as bdbodger suggested and changed the alamer.scr to keep it from crashing in spearhead,,,ok next i loaded a existing map which i knew had all the required triggers etc,,for the alarms,,,ok now the thing is the map i am loading into multiplayer is m6l2a,,,which was originally single player of course,,,even with the original script loaded along side the original bsp,,,i still cant turn the alarms off or on,,,now the ai guys turn them on ,,,but i cant hehehe,,,any ideas why this isnt working in multiplayer would be greatly apprieciated
<TWZ>Gold<<mohha freak

Posted: Sat Dec 13, 2003 11:48 am
by bdbodger
The problem with the global/alarmer.scr is it was ment for single player where there is only one $player . I have adapted it for you for multeplayer mohaa and speearhead just copy this and name it alarmer_MP.scr and run it instead of the global/alarmer.scr

Code: Select all

//	Alarm system used in m4l3 and m6l2a. Created by Mackey McCandlish and calibrated with Steve Fukuda.
//
//	Before level waittill prespawn: "exec global/alarmer.scr"
//	Anybody with targetname "enemy" will try to ring the alarm.
//	Alarms are animate_equipment_alarmswitch with targetname "alarm" and they point away from the surface they're placed against.
//	The alarm spawners are AI placed in the level with targetname "alarmspawner".
//	The Alarm triggers are "trigger_use"s with setthread "alarm_player_reset". They encompass the actual alarm.
//	You can set level.alarm_always_on to 1 and the alarm will come back on after 14-20 seconds.
//
//
// *********************************************************************************************
//
//                   remodded for mohaa/spearhead multiplayer by Bdbodger
//**********************************************************************************************

main:

	level.alarm_always_on = 0
	level.alarm_always_on_base = 14
	level.alarm_always_on_random = 7
	level.alarm_time = 0
	level.alarm_time_base = 14
	level.alarm_time_random = 5

	for (local.i=1;local.i<$alarm.size+1;local.i++)
		$alarm[local.i] notsolid

level waittill prespawn 

for(local.i=1;local.i< $alarmspawner.size+1;local.i++) 
{ 
local.ent = waitthread global/spawner.scr::spawner_create $alarmspawner[local.i] 
local.ent.targetname = "alarmspawned" 
} 



level waittill spawn

	thread alarmprep_MP

	//thread alarmgenner
	//$player.alarmoff = level.time + 1
	//thread alarmer
	
	/*
		$endgate_left time 1
		$endgate_right time 1

		$endgate_right rotateyup 80
		$endgate_right move
		$endgate_left rotateydown 100
		$endgate_left waitmove
		$endgate_left connect_paths
		$endgate_right connect_paths
	*/
end

alarmprep_MP:

while(1)
{
	for(local.i=1;local.i <= $player.size;local.i++)
	{
		if($player[local.1].alarmprep != 1)
		{
		$player[local.1].alarmprep = 1
		thread alarmgenner $player[local.1] 
		$player[local.i].alarmoff = level.time + 1
		thread alarmer $player[local.1] 
		}
	}
}
end



doalarm local.player:
	level.alarmers++
	println "doing alarm"
	local.range = 5000
	local.alarm = -1
	println ("Enemy " + (vector_length (self.origin - local.player.origin)) + " distance away is doing alarm and is in thinkstate " + self.thinkstate)
	for (local.i=1;local.i<$alarm.size+1;local.i++)
	{
		local.temprange = vector_length (self.origin - $alarm[local.i].origin)
		if ((local.temprange < local.range) && (vector_length (local.player.origin - $alarm[local.i].origin) > local.temprange))
		{
			local.range = local.temprange
			local.alarm = local.i
		}
	}

	if (local.alarm != -1)
	{
		local.break = 0
		local.timer = level.time + 12
	
		thread de-alarmer

		local.org = angles_toforward ($alarm[local.alarm].angles)
//		local.org = ((local.org * 30) + ($alarm[local.alarm].origin)) + ( 0 0 -25 )
		local.org = ((local.org * 35) + ($alarm[local.alarm].origin)) + ( 0 0 -30 )
		local.ent = spawn script_origin
		local.ent.origin = local.org
		local.ent droptofloor
		local.org = local.ent.origin
		local.ent delete


		wait (randomfloat(2.3))
		self exec global/disable_ai.scr
//		self type_attack "alarm"
//		local.ent = spawn script_origin
//		local.ent.origin = local.org
//		self alarmnode local.ent
//		self alarmthread "alarmreg"
//		println "should be running for alarm"
//		waitframe

		self.movedoneradius = 15
		while ((isalive self) && (local.break == 0) && (level.time < local.timer)) 
		{
			self runto local.org
			self waittill movedone

			if (level.alarm_on == 0)
			{
				if (vector_length (self.origin - $alarm[local.alarm].origin) < 90)
				{
					self.turndoneerror = 10
					self turnto $alarm[local.alarm]
					self waittill turndone
					self anim alarm_switchon
					self playsound alarm_switch

					local.break = 1
					
					wait 0.2
					for (local.i=1;local.i<$alarm.size+1;local.i++)
       					$alarm[local.i] anim turnon

					wait 0.5
					level.alarm_on = 1
				}
			}
			else
			local.break = 1

			wait 1
		}
	}
	else
		level.alarmers--

	if (isalive self)
		self exec global/enable_ai.scr

end

de-alarmer:
	wait 12
	level.alarmers--
end

alarmreg:
end


/*
alarmreg local.player:
//			self runto local.org // $alarm[local.alarm]
			self waittill movedone
			if (parm.movefail == 1)
			{
				local.break = 1
				level.alarmers--
				self.targetname = "enemy_noalarm"
				local.oldalarm = $alarm[local.alarm]
				local.oldalarm.targetname = "alarm_noalarm"

				wait 5
				self runto local.player
				self.targetname = "enemy"
				local.oldalarm.targetname = "alarm"
				end
			}
			else

			wait 1
		}
		
	}

	self exec global/enable_ai.scr


end

*/

alarm_player_reset:

local.player=parm.other

	if (level.time > local.player.alarmoff)
	{
		local.player.alarmoff = level.time + 1

		if (level.alarm_on == 1)
		{
			level.alarm_on = 0
			
			for (local.i=1;local.i<$alarm.size+1;local.i++)
       			$alarm[local.i] anim turnoff

			self playsound alarm_switch
			if (level.alarm_time - level.time < 5)
				level.alarm_time = level.time + (level.alarm_time_base + randomint(alarm_time_random))

			wait 0.5

//			for (local.i=1;local.i<$alarm.size+1;local.i++)
//       			$alarm[local.i] stoploopsound

			level.alarm_sound stoploopsound

			if (level.alarm_always_on == 1)
				wait (level.alarm_always_on_base + randomint(level.alarm_always_on_random))

			if (level.alarm_always_on == 1)
			{
				if (level.alarm_on == 0)
				{
					level.alarm_on = 1
							
					for (local.i=1;local.i<$alarm.size+1;local.i++)
       					$alarm[local.i] anim turnon

					self playsound alarm_switch

					wait 0.5

//					for (local.i=1;local.i<$alarm.size+1;local.i++)
//						$alarm[local.i] loopsound alarmbell

				}
			}
		}
		else
		{
			level.alarm_on = 1
			
			for (local.i=1;local.i<$alarm.size+1;local.i++)
       			$alarm[local.i] anim turnon

			self playsound alarm_switch

			wait 0.5

//			for (local.i=1;local.i<$alarm.size+1;local.i++)
//				$alarm[local.i] loopsound alarmbell

		}
	}

//	local.alarmbell thread global/loopsound.scr::main alarmbell 	// Ring the alarm bell

end

turn_alarm_on:
	if (level.alarm_on == 0)
	{
		level.alarm_on = 1
				
		for (local.i=1;local.i<$alarm.size+1;local.i++)
       		$alarm[local.i] anim turnon

		self playsound alarm_switch

		wait 0.5

//		for (local.i=1;local.i<$alarm.size+1;local.i++)
//			$alarm[local.i] loopsound alarmbell
	}
end

alarmsounder local.player:
	
	level.alarm_sound = spawn script_model
//	level.alarm_sound thread playersoundorg
	level.alarm_sound model "fx/dummy.tik"
	level.alarm_sound notsolid

	while (1)
	{
		if (level.alarm_on == 1)
		{
			local.range = 1400
	
			for (local.i=1;local.i<$alarm.size+1;local.i++)
			{
				local.newrange = vector_length ( local.player.origin - $alarm[local.i].origin)
				if (local.newrange < local.range)
				{
//					$alarm[local.i] loopsound alarmbell
					local.range = local.newrange
				}
//				waitframe
			}

/*
			1400	50		1400
			0.2		1.5		0.2
			1.7		0.2		1.7

1.5
*/
			local.vol = (1.5 / 1350) * (local.range)
			local.vol = 1.5 - local.vol
			if (local.vol < 0.2)
				local.vol = 0.2
			else
			if (local.vol > 1.5)
				local.vol = 1.5
//				println ("range is " + local.range + " and vol is " + local.vol)

			level.alarm_sound loopsound alarmbell local.vol "levelwide"

		}
		waitframe
	}

end



alarmgenner local.player:

	if (level.alarm_nosound == NIL)
		thread alarmsounder
	
	local.timer = level.time

	while (((local.player.dmteam == "axis")||(local.player.dmteam == "allies")) && (isalive local.player ))
	{
		if (level.alarm_on == 1)
		{
			if (level.time > local.timer)
			{
				//local.key = getboundkey1 "+use"
				//iprintlnbold_noloc (loc_convert_string "Approach alarms and press the USE key ( ") local.key (loc_convert_string " ) to toggle them off or on.")
				local.timer = level.time + 12
			}

			while (level.totalspawnies < 2)
			{
				waitthread create_alarmguy local.player
				wait randomint (3)
			}
		}
		else
			local.timer = level.time + 45

		wait 1
	}

self.alarmprep = 0

end

create_alarmguy local.player:

	local.range = 5000
	local.entnum = -1
	local.num = 0
//	local.spawner = -1
	for (local.i=1;local.i<$alarmspawned.size+1;local.i++)
	{
		if !(sighttrace (local.player.origin + (0 0 50)) ($alarmspawned[local.i].origin + (0 0 50)) 1)
		{
			local.num++
			local.spawner[local.num] = $alarmspawned[local.i]
			println ("prepped a spawner at " + local.spawner[local.num].origin + " with num " + local.num)
		}
		wait 0.1
	}

	if (local.spawner == NIL)
		end

	local.lastnum = -1

	for (local.i=1;local.i<local.num+1;local.i++)
	{
		local.temprange = vector_length (local.player.origin - local.spawner[local.i].origin)
		println ("checking local spawner " + local.i + " and local num is " + local.num + " at range " + local.temprange)
		if (local.temprange < local.range)
		{
			local.range = local.temprange
			local.lastnum = local.entnum
			local.entnum = local.i
		}
	}

	if (local.lastnum != -1)
		local.entnum = local.lastnum

	if (local.entnum != -1)
	{
		local.ent = waitthread global/spawner.scr::spawner_activate local.spawner[local.entnum]
		local.ent.targetname = "alarm_spawned_guy"

		local.ent thread spawnerthink local.player
	}
	else
	{
		println "-------------------"
		println local.range
		println local.lastnum
		println local.entnum
		println "-------------------"
	}
end

runcheck:
	if (level.runcheck)
		level.runcheck delete

	level.runcheck = local
	while (isalive self)
	{
		if (getcvar(debug) == "1")
		println ("A spawned guy is at " + self.origin + " with thinkstate " + self.thinkstate)
		wait 1
	}

end

spawnerthink local.player:
	if (game.skill == "hard")
		if (randomint(100) > 60)
			self item items/item_25_healthbox.tik 25

	self ammo_grenade (randomint(4) + 1)
	self mindist 128
	self leash 8000
	self maxdist 400
	self fixedleash 0
	self.movedoneradius = 450
	wait randomfloat(3)
	level.totalspawnies++
	thread baddeath
	self.nosurprise = 1
	local.origin = self.origin

	self thread level.script::alarmer local.player
	self forceactivate
	wait 1
	if (self.thinkstate == "idle")
	{
		println ("spawned guy is running to the player from " + self.origin)
		self thread runcheck
		self runto local.player
		self waittill movedone
		self attackplayer
//		println ("movefail is " + parm.movefail)

		if ((parm.movefail == 1) && !(sighttrace (local.player.origin + (0 0 50)) (self.origin + (0 0 50)) 1) && (vector_length (self.origin - local.origin) < 100))
			self damage $world 15000 $world (0 0 0) (0 0 0) (0 0 0) 0 9 0 0
	}

	while (isalive self)
	{
		println ("spawned guy is running to the player from " + self.origin)
		self runto local.player
		self waittill movedone
		self attackplayer
		wait 2
	}
end

baddeath:
	self waittill death
	println "I die!"
	level.totalspawnies--
end

debugprint:
	while (1)
	{
		println ("alarmers = " + level.alarmers + " baddies " + level.totalspawnies)
		wait 1
	}

end


alarmer local.player:

	level.alarmers = 0
	level.totalspawnies = 0
	level.alarm_on = 0
	if (getcvar(skill) == "0")
		local.alarmcount = 0
	else
		local.alarmcount = 1

	if (getcvar(debug) == "1")
	thread debugprint
	
	while (1)
	{
		while ((level.alarmers > local.alarmcount) || (level.alarm_on == 1) || (level.time < level.alarm_time))
			wait 1

		wait randomfloat(2)
		local.ent = -1
		local.lastent = -1
		local.range = 1500
		for (local.i=1;local.i<$enemy.size+1;local.i++)
		{
			if ((isalive $enemy[local.i]) && ($enemy[local.i].thinkstate != "idle")) //  ($enemy[local.i] cansee $player)) 
			{
				local.newrange = vector_length ($enemy[local.i].origin - local.player.origin)
				if (local.newrange < local.range)
				{
					local.range = local.newrange
					local.ent = local.i
/*
					if (local.lastent == -1)
					{
						local.ent = local.lastent
						local.lastent = local.i
					}
					else
					{
						local.lastent = local.i
						local.ent = local.i
					}
*/
				}
			}
//			else
//			println ("thinkstate is " + $enemy[local.i].thinkstate)
		}
		

		if (local.ent != -1)
		{
			if (game.skill == "hard")
				$enemy[local.ent] thread doalarm local.player
			else
			if (sighttrace ($enemy[local.ent].origin + (0 0 50)) (local.player + (0 0 50)) 1)
				$enemy[local.ent] thread doalarm local.player
		}

		/*
		else
		if (local.lastent != -1)
		if (level.enemy[local.lastent] cansee local.player)
			level.enemy[local.lastent] thread bridgeblownow (randomint(3))
		*/

		wait 2
	}
end

alarms

Posted: Sat Dec 13, 2003 6:43 pm
by Gold
thanx so much for the time ya must have put into scripting that,,,thing is i still dont understand why i cant get it to work lol,,,i have the piano working and the cello,,also all sounds ,,but no matter what i seem to try i cant get the alarms moving or sounding off,,,heres the lines i changed in the script
exec global/alarmer_MP.scr
and then i added this to the end of the script
//working alarms

alarm_player_reset:

thread global/alarmer_MP.scr::alarm_player_reset

end

what am i missing?lol
<TWZ>Gold<<mohha freak
p.s. tried it in mohha and spearhead both ,,same results

Posted: Sat Dec 13, 2003 7:19 pm
by bdbodger
I didn't test it myself but it should work of course I could have made a typo too .

Did you put it in the right place and did you get any errors in the console ?

Code: Select all

main:

exec global/alarmer_MP.scr // put before level waittill prespawn

level waittill prespawn
...
...
end

alarm_player_reset:

	thread global/alarmer_MP.scr::alarm_player_reset

end


and I guess you should change this too or you will get a infinate thread in script error , this could be what is stopping it from working .

Code: Select all

while(1) 
{ 
   for(local.i=1;local.i <= $player.size;local.i++) 
   { 
      if($player[local.1].alarmprep != 1) 
      { 
      $player[local.1].alarmprep = 1 
      thread alarmgenner $player[local.1] 
      $player[local.i].alarmoff = level.time + 1 
      thread alarmer $player[local.1] 
      } 
   } 
//*********************************************
// add this to the script
//*********************************************

waitframe

//**********************************************
// before the last } bracket
//**********************************************
} 
end 

alarms

Posted: Sat Dec 13, 2003 10:09 pm
by Gold
ok did as ya suggested and still no work,,,heres what the console is saying

if($player[local.1].alarmprep != 1) (global/alarmer_mp.scr, 65)
if($player[local^

^~^~^ Script file compile error: Couldn't parse 'global/alarmer_mp.scr'
ScriptMaster::GetScript: Script 'global//alarmer_mp.scr' was not properly loaded

ok when i walked over to a alarm and hit the e key to activate it i got the following error in console,,which tells me at least its trying to work hehehehe

thread global/alarmer_MP.scr::alarm_player_reset (maps/m6l2a.scr, 279)
^

^~^~^ Script Error: Script 'global/alarmer_MP.scr' was not properly loaded


thread global/alarmer_MP.scr::alarm_player_reset (maps/m6l2a.scr, 279)
^

^~^~^ Script Error: Script 'global/alarmer_MP.scr' was not properly loaded

which that got me excited believe it or not,,lol,,,man i would really have got excited if alarm would have soundecd off

ok just to make sure i have the alarm script correct now,,i will post it once more

main:

level.alarm_always_on = 0
level.alarm_always_on_base = 14
level.alarm_always_on_random = 7
level.alarm_time = 0
level.alarm_time_base = 14
level.alarm_time_random = 5

for (local.i=1;local.i<$alarm.size+1;local.i++)
$alarm[local.i] notsolid

level waittill prespawn

for(local.i=1;local.i< $alarmspawner.size+1;local.i++)
{
local.ent = waitthread global/spawner.scr::spawner_create $alarmspawner[local.i]
local.ent.targetname = "alarmspawned"
}



level waittill spawn

thread alarmprep_MP

//thread alarmgenner
//$player.alarmoff = level.time + 1
//thread alarmer

/*
$endgate_left time 1
$endgate_right time 1

$endgate_right rotateyup 80
$endgate_right move
$endgate_left rotateydown 100
$endgate_left waitmove
$endgate_left connect_paths
$endgate_right connect_paths
*/
end

alarmprep_MP:

while(1)
{
for(local.i=1;local.i <= $player.size;local.i++)
{
if($player[local.1].alarmprep != 1)
{
$player[local.1].alarmprep = 1
thread alarmgenner $player[local.1]
$player[local.i].alarmoff = level.time + 1
thread alarmer $player[local.1]
}
}
//*********************************************
// add this to the script
//*********************************************

waitframe

//**********************************************
// before the last } bracket
//**********************************************
}
end




doalarm local.player:
level.alarmers++
println "doing alarm"
local.range = 5000
local.alarm = -1
println ("Enemy " + (vector_length (self.origin - local.player.origin)) + " distance away is doing alarm and is in thinkstate " + self.thinkstate)
for (local.i=1;local.i<$alarm.size+1;local.i++)
{
local.temprange = vector_length (self.origin - $alarm[local.i].origin)
if ((local.temprange < local.range) && (vector_length (local.player.origin - $alarm[local.i].origin) > local.temprange))
{
local.range = local.temprange
local.alarm = local.i
}
}

if (local.alarm != -1)
{
local.break = 0
local.timer = level.time + 12

thread de-alarmer

local.org = angles_toforward ($alarm[local.alarm].angles)
// local.org = ((local.org * 30) + ($alarm[local.alarm].origin)) + ( 0 0 -25 )
local.org = ((local.org * 35) + ($alarm[local.alarm].origin)) + ( 0 0 -30 )
local.ent = spawn script_origin
local.ent.origin = local.org
local.ent droptofloor
local.org = local.ent.origin
local.ent delete


wait (randomfloat(2.3))
self exec global/disable_ai.scr
// self type_attack "alarm"
// local.ent = spawn script_origin
// local.ent.origin = local.org
// self alarmnode local.ent
// self alarmthread "alarmreg"
// println "should be running for alarm"
// waitframe

self.movedoneradius = 15
while ((isalive self) && (local.break == 0) && (level.time < local.timer))
{
self runto local.org
self waittill movedone

if (level.alarm_on == 0)
{
if (vector_length (self.origin - $alarm[local.alarm].origin) < 90)
{
self.turndoneerror = 10
self turnto $alarm[local.alarm]
self waittill turndone
self anim alarm_switchon
self playsound alarm_switch

local.break = 1

wait 0.2
for (local.i=1;local.i<$alarm.size+1;local.i++)
$alarm[local.i] anim turnon

wait 0.5
level.alarm_on = 1
}
}
else
local.break = 1

wait 1
}
}
else
level.alarmers--

if (isalive self)
self exec global/enable_ai.scr

end

de-alarmer:
wait 12
level.alarmers--
end

alarmreg:
end


/*
alarmreg local.player:
// self runto local.org // $alarm[local.alarm]
self waittill movedone
if (parm.movefail == 1)
{
local.break = 1
level.alarmers--
self.targetname = "enemy_noalarm"
local.oldalarm = $alarm[local.alarm]
local.oldalarm.targetname = "alarm_noalarm"

wait 5
self runto local.player
self.targetname = "enemy"
local.oldalarm.targetname = "alarm"
end
}
else

wait 1
}

}

self exec global/enable_ai.scr


end

*/

alarm_player_reset:

local.player=parm.other

if (level.time > local.player.alarmoff)
{
local.player.alarmoff = level.time + 1

if (level.alarm_on == 1)
{
level.alarm_on = 0

for (local.i=1;local.i<$alarm.size+1;local.i++)
$alarm[local.i] anim turnoff

self playsound alarm_switch
if (level.alarm_time - level.time < 5)
level.alarm_time = level.time + (level.alarm_time_base + randomint(alarm_time_random))

wait 0.5

// for (local.i=1;local.i<$alarm.size+1;local.i++)
// $alarm[local.i] stoploopsound

level.alarm_sound stoploopsound

if (level.alarm_always_on == 1)
wait (level.alarm_always_on_base + randomint(level.alarm_always_on_random))

if (level.alarm_always_on == 1)
{
if (level.alarm_on == 0)
{
level.alarm_on = 1

for (local.i=1;local.i<$alarm.size+1;local.i++)
$alarm[local.i] anim turnon

self playsound alarm_switch

wait 0.5

// for (local.i=1;local.i<$alarm.size+1;local.i++)
// $alarm[local.i] loopsound alarmbell

}
}
}
else
{
level.alarm_on = 1

for (local.i=1;local.i<$alarm.size+1;local.i++)
$alarm[local.i] anim turnon

self playsound alarm_switch

wait 0.5

// for (local.i=1;local.i<$alarm.size+1;local.i++)
// $alarm[local.i] loopsound alarmbell

}
}

// local.alarmbell thread global/loopsound.scr::main alarmbell // Ring the alarm bell

end

turn_alarm_on:
if (level.alarm_on == 0)
{
level.alarm_on = 1

for (local.i=1;local.i<$alarm.size+1;local.i++)
$alarm[local.i] anim turnon

self playsound alarm_switch

wait 0.5

// for (local.i=1;local.i<$alarm.size+1;local.i++)
// $alarm[local.i] loopsound alarmbell
}
end

alarmsounder local.player:

level.alarm_sound = spawn script_model
// level.alarm_sound thread playersoundorg
level.alarm_sound model "fx/dummy.tik"
level.alarm_sound notsolid

while (1)
{
if (level.alarm_on == 1)
{
local.range = 1400

for (local.i=1;local.i<$alarm.size+1;local.i++)
{
local.newrange = vector_length ( local.player.origin - $alarm[local.i].origin)
if (local.newrange < local.range)
{
// $alarm[local.i] loopsound alarmbell
local.range = local.newrange
}
// waitframe
}

/*
1400 50 1400
0.2 1.5 0.2
1.7 0.2 1.7

1.5
*/
local.vol = (1.5 / 1350) * (local.range)
local.vol = 1.5 - local.vol
if (local.vol < 0.2)
local.vol = 0.2
else
if (local.vol > 1.5)
local.vol = 1.5
// println ("range is " + local.range + " and vol is " + local.vol)

level.alarm_sound loopsound alarmbell local.vol "levelwide"

}
waitframe
}

end



alarmgenner local.player:

if (level.alarm_nosound == NIL)
thread alarmsounder

local.timer = level.time

while (((local.player.dmteam == "axis")||(local.player.dmteam == "allies")) && (isalive local.player ))
{
if (level.alarm_on == 1)
{
if (level.time > local.timer)
{
//local.key = getboundkey1 "+use"
//iprintlnbold_noloc (loc_convert_string "Approach alarms and press the USE key ( ") local.key (loc_convert_string " ) to toggle them off or on.")
local.timer = level.time + 12
}

while (level.totalspawnies < 2)
{
waitthread create_alarmguy local.player
wait randomint (3)
}
}
else
local.timer = level.time + 45

wait 1
}

self.alarmprep = 0

end

create_alarmguy local.player:

local.range = 5000
local.entnum = -1
local.num = 0
// local.spawner = -1
for (local.i=1;local.i<$alarmspawned.size+1;local.i++)
{
if !(sighttrace (local.player.origin + (0 0 50)) ($alarmspawned[local.i].origin + (0 0 50)) 1)
{
local.num++
local.spawner[local.num] = $alarmspawned[local.i]
println ("prepped a spawner at " + local.spawner[local.num].origin + " with num " + local.num)
}
wait 0.1
}

if (local.spawner == NIL)
end

local.lastnum = -1

for (local.i=1;local.i<local.num+1;local.i++)
{
local.temprange = vector_length (local.player.origin - local.spawner[local.i].origin)
println ("checking local spawner " + local.i + " and local num is " + local.num + " at range " + local.temprange)
if (local.temprange < local.range)
{
local.range = local.temprange
local.lastnum = local.entnum
local.entnum = local.i
}
}

if (local.lastnum != -1)
local.entnum = local.lastnum

if (local.entnum != -1)
{
local.ent = waitthread global/spawner.scr::spawner_activate local.spawner[local.entnum]
local.ent.targetname = "alarm_spawned_guy"

local.ent thread spawnerthink local.player
}
else
{
println "-------------------"
println local.range
println local.lastnum
println local.entnum
println "-------------------"
}
end

runcheck:
if (level.runcheck)
level.runcheck delete

level.runcheck = local
while (isalive self)
{
if (getcvar(debug) == "1")
println ("A spawned guy is at " + self.origin + " with thinkstate " + self.thinkstate)
wait 1
}

end

spawnerthink local.player:
if (game.skill == "hard")
if (randomint(100) > 60)
self item items/item_25_healthbox.tik 25

self ammo_grenade (randomint(4) + 1)
self mindist 128
self leash 8000
self maxdist 400
self fixedleash 0
self.movedoneradius = 450
wait randomfloat(3)
level.totalspawnies++
thread baddeath
self.nosurprise = 1
local.origin = self.origin

self thread level.script::alarmer local.player
self forceactivate
wait 1
if (self.thinkstate == "idle")
{
println ("spawned guy is running to the player from " + self.origin)
self thread runcheck
self runto local.player
self waittill movedone
self attackplayer
// println ("movefail is " + parm.movefail)

if ((parm.movefail == 1) && !(sighttrace (local.player.origin + (0 0 50)) (self.origin + (0 0 50)) 1) && (vector_length (self.origin - local.origin) < 100))
self damage $world 15000 $world (0 0 0) (0 0 0) (0 0 0) 0 9 0 0
}

while (isalive self)
{
println ("spawned guy is running to the player from " + self.origin)
self runto local.player
self waittill movedone
self attackplayer
wait 2
}
end

baddeath:
self waittill death
println "I die!"
level.totalspawnies--
end

debugprint:
while (1)
{
println ("alarmers = " + level.alarmers + " baddies " + level.totalspawnies)
wait 1
}

end


alarmer local.player:

level.alarmers = 0
level.totalspawnies = 0
level.alarm_on = 0
if (getcvar(skill) == "0")
local.alarmcount = 0
else
local.alarmcount = 1

if (getcvar(debug) == "1")
thread debugprint

while (1)
{
while ((level.alarmers > local.alarmcount) || (level.alarm_on == 1) || (level.time < level.alarm_time))
wait 1

wait randomfloat(2)
local.ent = -1
local.lastent = -1
local.range = 1500
for (local.i=1;local.i<$enemy.size+1;local.i++)
{
if ((isalive $enemy[local.i]) && ($enemy[local.i].thinkstate != "idle")) // ($enemy[local.i] cansee $player))
{
local.newrange = vector_length ($enemy[local.i].origin - local.player.origin)
if (local.newrange < local.range)
{
local.range = local.newrange
local.ent = local.i
/*
if (local.lastent == -1)
{
local.ent = local.lastent
local.lastent = local.i
}
else
{
local.lastent = local.i
local.ent = local.i
}
*/
}
}
// else
// println ("thinkstate is " + $enemy[local.i].thinkstate)
}


if (local.ent != -1)
{
if (game.skill == "hard")
$enemy[local.ent] thread doalarm local.player
else
if (sighttrace ($enemy[local.ent].origin + (0 0 50)) (local.player + (0 0 50)) 1)
$enemy[local.ent] thread doalarm local.player
}

/*
else
if (local.lastent != -1)
if (level.enemy[local.lastent] cansee local.player)
level.enemy[local.lastent] thread bridgeblownow (randomint(3))
*/

wait 2
}
end