/*
	server/entities/lights.qc

	Spawns and handles Quake's lights and torches

	Copyright (C) 2021-2024 NZ:P Team

	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

	See the GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program; if not, write to:

		Free Software Foundation, Inc.
		59 Temple Place - Suite 330
		Boston, MA  02111-1307, USA

*/

#define LIGHT_SPAWNFLAG_STARTOFF        1               // Light starts turned off but can be triggered
                                                        // On via Power Switch.

#define LIGHT_SPAWNFLAG_STARTON         2               // Opposite of STARTOFF, light turns Off when
                                                        // Power is On.

//
// LS_Setup()
// Defines all of the LightStyles in the Game.
//
void() LS_Setup =
{
    // Lightstyles take alphebetical strings of input, from a-z.
    // a = complete darkness.
    // z = maximum brightness.
    lightstyle(0, "m");                                                     // 0 : Normal
    lightstyle(1, "mmnmmommommnonmmonqnmmo");                               // 1 : Flicker
    lightstyle(2, "abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba");   // 2 : Slow Strong Pulse
    lightstyle(3, "mmmmmaaaaammmmmaaaaaabcdefgabcdefg");                    // 3 : Candle
    lightstyle(4, "mamamamamama");                                          // 4 : Fast Strobe
    lightstyle(5, "jklmnopqrstuvwxyzyxwvutsrqponmlkj");                     // 5 : Gentle Pulse
    lightstyle(6, "nmonqnmomnmomomno");                                     // 6 : Flicker 2
    lightstyle(7, "mmmaaaabcdefgmmmmaaaammmaamm");                          // 7 : Candle 2
    lightstyle(8, "mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa");            // 8 : Candle 3
    lightstyle(9, "aaaaaaaazzzzzzzz");                                      // 9 : Slow Strobe
    lightstyle(10, "mmamammmmammamamaaamammma");                            // 10: Fluro
    lightstyle(11, "abcdefghijklmnopqrrqponmlkjihgfedcba");                 // 11: Slow Pulse (no black)                                                  // 64: Off.
}

//
// L_Setup()
// Initialization for Lights.
//
void() L_Setup =
{
    // If it's not vanilla ZHLT, cut it off.
    if (self.style > 12 || !self.targetname) {
        remove(self);
        return;
    }

    // Set the Light to be Off if the spawnflag is set.
    /*if ((self.spawnflags & LIGHT_SPAWNFLAG_STARTOFF)) {
        // Store the other value for later.
        //self.score = self.style;
        lightstyle(self.style, "a");
    }*/
}

//
// --------------------
// Generic Light Entities
// --------------------
//

void()  light               =           // Basic Light
{   L_Setup();                                                              }
void()  light_fluoro        =           // Light with hum ambient
{   L_Setup();                                                              }
void()  light_environment   =           // Sun cast from Sky
{   makestatic(self);                                                       }
void()  light_fluorospark   =           // Light with buzz ambient
{   L_Setup();                                                              }
void()  light_globe         =           // Light with visible globe
{   L_Setup();  makestatic(self);                                           }
void()  light_torch_small_walltorch =   // Light with visible wall torch
{   L_Setup(); makestatic(self);                                            }
void()  light_flame_large_yellow =
{   L_Setup(); makestatic(self);                                            }
void()  light_torch_small_yellow =      // Light with small flame & fire sound
{   L_Setup();    makestatic(self);                                         }
void()  light_torch_large_yellow =      // Light with larger flame & fire sound
{   L_Setup();   self.frame = 1; makestatic(self);                          }
void()  light_flame_small_white =       // Light with small flame & fire sound
{   L_Setup();   makestatic(self);                                          }
void()  light_spot = 			// Spotlight
{   L_Setup();   				                                            }

//
// --------------------
// Spawnable Dynamic Lights
// --------------------
//

//
// Light_Red(e)
// RGB: 255, 56, 56
//
void(entity e, optional float fullbright) Light_Red =
{
    if (fullbright)
        e.effects = EF_FULLBRIGHT;

#ifndef FTE

    e.effects = e.effects | EF_REDLIGHT;

#else

    {
        e.pflags = PFLAGS_FULLDYNAMIC;
       	e.light_lev = 100;
	    e.color_x = 2;	
	    e.color_y = 0.25;	
	    e.color_z = 0.25;
    }

#endif // FTE

}

//
// Light_Green(e)
// RGB: 56, 255, 56
//
void(entity e, optional float fullbright) Light_Green =
{
    if (fullbright)
        e.effects = EF_FULLBRIGHT;

#ifndef FTE

    e.effects = e.effects | EF_GREENLIGHT;

#else

    {
        e.pflags = PFLAGS_FULLDYNAMIC;
       	e.light_lev = 100;
	    e.color_x = 0.25;	
	    e.color_y = 2;	
	    e.color_z = 0.25;
    }

#endif // FTE

}

//
// Light_Blue(e)
// RGB: 56, 56, 255
//
void(entity e, optional float fullbright) Light_Blue =
{
    if (fullbright)
        e.effects = EF_FULLBRIGHT;

#ifndef FTE

    e.effects = e.effects | EF_BLUELIGHT;

#else

    {
        e.pflags = PFLAGS_FULLDYNAMIC;
       	e.light_lev = 100;
	    e.color_x = 0.25;	
	    e.color_y = 0.25;	
	    e.color_z = 2;
    }

#endif // FTE

}

//
// Light_Orange(e)
// RGB: 255, 128, 0
//
void(entity e, optional float fullbright) Light_Orange =
{
    if (fullbright)
        e.effects = EF_FULLBRIGHT;

#ifndef FTE

    e.effects = e.effects | EF_ORANGELIGHT;

#else

    {
        e.pflags = PFLAGS_FULLDYNAMIC;
       	e.light_lev = 100;
	    e.color_x = 2;	
	    e.color_y = 1;	
	    e.color_z = 0;
    }

#endif // FTE

}

//
// Light_Purple(e)
// RGB: 255, 28, 255
//
void(entity e, optional float fullbright) Light_Purple =
{
    if (fullbright)
        e.effects = EF_FULLBRIGHT;

#ifndef FTE

    e.effects = e.effects | EF_PURPLELIGHT;

#else

    {
        e.pflags = PFLAGS_FULLDYNAMIC;
       	e.light_lev = 100;
	    e.color_x = 2;	
	    e.color_y = 0.25;	
	    e.color_z = 2;
    }

#endif // FTE

}

//
// Light_Cyan(e)
// RGB: 97, 178, 248
//
void(entity e, optional float fullbright) Light_Cyan =
{
    if (fullbright)
        e.effects = EF_FULLBRIGHT;

#ifndef FTE

    e.effects = e.effects | EF_CYANLIGHT;

#else

    {
        e.pflags = PFLAGS_FULLDYNAMIC;
       	e.light_lev = 100;
	    e.color_x = 0.765;	
	    e.color_y = 1.4;	
	    e.color_z = 1.95;
    }

#endif // FTE

}

//
// Light_Pink(e)
// RGB: 255, 180, 180
//
void(entity e, optional float fullbright) Light_Pink =
{
    if (fullbright)
        e.effects = EF_FULLBRIGHT;

#ifndef FTE

    e.effects = e.effects | EF_PINKLIGHT;

#else

    {
        e.pflags = PFLAGS_FULLDYNAMIC;
       	e.light_lev = 100;
	    e.color_x = 2.37;	
	    e.color_y = 1.35;	
	    e.color_z = 1.35;
    }

#endif // FTE

}

//
// Light_Lime(e)
// RGB: 128, 255, 128
//
void(entity e, optional float fullbright) Light_Lime =
{
    if (fullbright)
        e.effects = EF_FULLBRIGHT;

#ifndef FTE

    e.effects = e.effects | EF_LIMELIGHT;

#else

    {
        e.pflags = PFLAGS_FULLDYNAMIC;
       	e.light_lev = 100;
	    e.color_x = 1;	
	    e.color_y = 2;	
	    e.color_z = 1;
    }

#endif // FTE

}

//
// Light_Yellow(e)
// RGB: 255, 255, 128
//
void(entity e, optional float fullbright) Light_Yellow =
{
    if (fullbright)
        e.effects = EF_FULLBRIGHT;

#ifndef FTE

    e.effects = e.effects | EF_YELLOWLIGHT;

#else

    {
        e.pflags = PFLAGS_FULLDYNAMIC;
       	e.light_lev = 100;
	    e.color_x = 2;	
	    e.color_y = 2;	
	    e.color_z = 1;
    }

#endif // FTE

}

//
// Light_None(e)
// Resets all Perk Light Effects.
//
void(entity e) Light_None =
{
	e.effects = 0;

#ifdef FTE

	{
		e.pflags = 0;
		e.light_lev = 0;
		e.color_x = 0;
		e.color_y = 0;
		e.color_z = 0;
	}

#endif // FTE

}

#ifdef FTE

void(entity what, float fullbright, float light_level,
     float red, float green, float blue) Light_Custom =
{
    if (fullbright)
        what.effects = what.effects | EF_FULLBRIGHT;

    {
        what.pflags = PFLAGS_FULLDYNAMIC;
        what.light_lev = light_level;
        what.color_x = red;
        what.color_y = green;
        what.color_z = blue;
    }
}

#endif // FTE
