class DukeTouchPlate : DukeActor
{
	default
	{
		statnum STAT_STANDABLE;
	}

	private bool checkspawn()
	{
		if (!Raze.isWorldTour())
		{
			if (self.pal && ud.multimode > 1) return false;
		}
		else { // Twentieth Anniversary World Tour addition - needs to be guarded because some mods surely will run afoul of it
			if ((self.pal == 1 && ud.multimode > 1) // Single-game Only
				|| (self.pal == 2 && (ud.multimode == 1 || (ud.multimode > 1 && ud.coop != 1))) // Co-op Only
				|| (self.pal == 3 && (ud.multimode == 1 || (ud.multimode > 1 && ud.coop == 1)))) // Dukematch Only
			{
				return false;
			}
		}
		return true;
	}

	override void Initialize()
	{
		let sectp = self.sector;
		self.temp_pos.Z = sectp.floorz;
		if (sectp.lotag != 1 && sectp.lotag != 2)
			sectp.setfloorz(self.pos.Z);
		if (!checkspawn())
		{
			self.Scale = (0, 0);
			self.ChangeStat(STAT_MISC);
			return;
		}
		self.cstat = CSTAT_SPRITE_INVISIBLE;
	}


	//---------------------------------------------------------------------------
	//
	// 
	//
	//---------------------------------------------------------------------------

	override void Tick()
	{
		let sectp = self.sector;
		DukePlayer p;

		if (self.temp_data[1] == 1 && self.hitag >= 0) //Move the sector floor
		{
			double Z = sectp.floorz;
			double add = sectp.extra * zmaptoworld;

			if (self.temp_data[3] == 1)
			{
				if (Z >= self.temp_pos.Z)
				{
					sectp.setfloorz(Z);
					self.temp_data[1] = 0;
				}
				else
				{
					sectp.addfloorz(add);
					p = Duke.checkcursectnums(sectp);
					if (p != null) p.addpos((0, 0, add));
				}
			}
			else
			{
				if (Z <= self.pos.Z)
				{
					sectp.setfloorz(self.pos.Z);
					self.temp_data[1] = 0;
				}
				else
				{
					sectp.addfloorz(-add);
					p = Duke.checkcursectnums(sectp);
					if (p != null) p.addpos((0, 0, -add));
				}
			}
			return;
		}

		if (self.temp_data[5] == 1) return;

		p = Duke.checkcursectnums(sectp);
		if (p != null && (p.on_ground || self.intangle == 512))
		{
			if (self.temp_data[0] == 0 && !dlevel.check_activator_motion(self.lotag))
			{
				self.temp_data[0] = 1;
				self.temp_data[1] = 1;
				self.temp_data[3] = !self.temp_data[3];
				dlevel.operatemasterswitches(self.lotag);
				dlevel.operateactivators(self.lotag, p);
				if (self.hitag > 0)
				{
					self.hitag--;
					if (self.hitag == 0) self.temp_data[5] = 1;
				}
			}
		}
		else self.temp_data[0] = 0;

		if (self.temp_data[1] == 1)
		{
			DukeStatIterator it;
			for(let act2 = it.first(STAT_STANDABLE); act2; act2 = it.Next())
			{
				if (act2 != self && act2 is 'DukeTouchPlate' && act2.lotag == self.lotag)
				{
					act2.temp_data[1] = 1;
					act2.temp_data[3] = self.temp_data[3];
				}
			}
		}
	}
}