Files
quakemapping/mod_slipgate/source/server/lights.qc
2019-12-30 17:23:05 +01:00

374 lines
8.7 KiB
Plaintext

/*========================================
lights.qc
========================================*/
static enumflags { LIGHT_START_OFF, LIGHT_FADE, LIGHT_NO_SOUND };
#define FADE_RAMP 13
static string abc[FADE_RAMP] = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m" };
#define NUM_LIGHTSTYLES 13
static string lightstyles[NUM_LIGHTSTYLES] =
{
// 0 NORMAL
"m",
// 1 FLICKER (first variety)
"mmnmmommommnonmmonqnmmo",
// 2 SLOW STRONG PULSE
"abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba",
// 3 CANDLE (first variety)
"mmmmmaaaaammmmmaaaaaabcdefgabcdefg",
// 4 FAST STROBE
"mamamamamama",
// 5 GENTLE PULSE 1
"jklmnopqrstuvwxyzyxwvutsrqponmlkj",
// 6 FLICKER (second variety)
"nmonqnmomnmomomno",
// 7 CANDLE (second variety)
"mmmaaaabcdefgmmmmaaaammmaamm",
// 8 CANDLE (third variety)
"mmmaaammmaaammmabcdefaaaammmmabcdefmmmaaaa",
// 9 SLOW STROBE (fourth variety)
"aaaaaaaazzzzzzzz",
// 10 FLUORESCENT FLICKER
"mmamammmmammamamaaamammma",
// 11 SLOW PULSE NOT FADE TO BLACK
"abcdefghijklmnopqrrqponmlkjihgfedcba",
// 12 BLINK OFF / ON (can be combined with animated textures, e.g. +0light, +1light, +alight)
"aamm"
};
/*==========
lightstyle_lookup
look up a style by it's number and return the correct animation string
==========*/
static string(float num) lightstyle_lookup =
{
if (num > NUM_LIGHTSTYLES - 1)
num = NUM_LIGHTSTYLES - 1;
if (num < 0)
num = 0;
return lightstyles[num];
};
/*==========
lightstyle_fade_lookup
==========*/
static string(float num) lightstyle_fade_lookup =
{
if (num > FADE_RAMP - 1)
num = FADE_RAMP - 1;
if (num < 0)
num = 0;
return abc[num];
};
/*==========
setup_lightstyles
Setup light animation tables. 'a' is total darkness, 'z' is maxbright.
Styles 32+ are assigned by the light compiler for switchable lights.
==========*/
void() setup_lightstyles =
{
for (float i = 0; i < NUM_LIGHTSTYLES - 1; i++)
{
lightstyle(i, lightstyle_lookup(i));
}
};
/*==========
light_fade_in
==========*/
static void() light_fade_in =
{
lightstyle(self.style, lightstyle_fade_lookup(self.count));
self.count = self.count + 1;
if (self.count > FADE_RAMP - 1)
{
self.count = FADE_RAMP - 1;
return;
}
self.think = light_fade_in;
self.nextthink = time + self.speed;
};
/*==========
light_fade_out
==========*/
static void() light_fade_out =
{
lightstyle(self.style, lightstyle_fade_lookup(self.count));
self.count = self.count - 1;
if (self.count < 0)
{
self.count = 0;
return;
}
self.think = light_fade_out;
self.nextthink = time + self.speed;
};
/*==========
light_use
using a light will turn it on and off
==========*/
static void() light_use =
{
if (self.spawnflags & LIGHT_START_OFF)
{
if (self.mdl != "")
setmodel(self, self.mdl);
if (self.noise1 != "")
sound(self, CHAN_VOICE, self.noise2, 0.5, ATTN_IDLE);
self.spawnflags = self.spawnflags - LIGHT_START_OFF;
if (self.spawnflags & LIGHT_FADE && !self.style2)
light_fade_in();
else
lightstyle(self.style, lightstyle_lookup(self.style2));
}
else
{
if (self.mdl != "")
self.modelindex = 0;
if (self.noise1 != "")
sound(self, CHAN_VOICE, self.noise1, 0.5, ATTN_IDLE);
self.spawnflags = self.spawnflags + LIGHT_START_OFF;
if (self.spawnflags & LIGHT_FADE && !self.style2)
light_fade_out();
else
lightstyle(self.style, "a");
}
};
/*QUAKED light (1 1 0) (-8 -8 -8) (8 8 8) START_OFF FADE NO_SOUND
Non-displayed light
Please see your compiling utility documentation for full details,
this entry only describes things controlled by the QuakeC.
==========
Keys
==========
"targetname" "name"
Turns the light into a switchable light. You must target it to toggle it.
"speed" "n"
If the light is switchable and FADE_IN_OUT is set, the speed at which the light transitions from off to on and vice versa. Default 0.1.
"style" "n"
Set the animated light style. Default 0.
0 NORMAL
1 FLICKER (first variety)
2 SLOW STRONG PULSE
3 CANDLE (first variety)
4 FAST STROBE
5 GENTLE PULSE 1
6 FLICKER (second variety)
7 CANDLE (second variety)
8 CANDLE (third variety)
9 SLOW STROBE (fourth variety)
10 FLUORESCENT FLICKER
11 SLOW PULSE NOT FADE TO BLACK
12 BLINK OFF / ON (can be synced with animated textures, e.g. +0light, +1light, +alight)
"style2" "n"
Set the animated light style for a switchable light.
This is because "style" will be set by your compiling utility to a value in the range 32+,
so we need to tell the QuakeC what actual style to use.
==========
Spawnflags
==========
START_OFF - switchable lights only - light is switched off at map start - default is on
FADE - switchable lights only - light fades in and out when switched. you can't combine this with an animated style.
*/
static void() light =
{
if (self.mdl != "")
{
if (!(self.spawnflags & LIGHT_START_OFF))
setmodel(self, self.mdl);
}
// non-switchable light
if (!self.targetname)
{
//remove(self);
return;
}
// default fade speed
if (self.speed <= 0)
self.speed = 0.1;
// switchable light
if (self.style >= 32)
{
self.use = light_use;
if (self.spawnflags & LIGHT_START_OFF)
{
self.count = 0;
lightstyle(self.style, "a");
}
else
{
self.count = FADE_RAMP - 1;
lightstyle(self.style, lightstyle_lookup(self.style2));
}
}
};
/*QUAKED light_fluoro (1 1 0) (-8 -8 -8) (8 8 8) START_OFF FADE NO_SOUND
Non-displayed light
Makes steady fluorescent humming sound
*/
static void() light_fluoro =
{
ambient_light_buzz();
remove(self);
};
/*QUAKED light_fluorospark (1 1 0) (-8 -8 -8) (8 8 8) START_OFF FADE NO_SOUND
Non-displayed light
Makes sparking, broken fluorescent sound
*/
static void() light_fluorospark =
{
ambient_flouro_buzz();
remove(self);
};
/*QUAKED light_globe (1 1 0) (-8 -8 -8) (8 8 8) START_OFF FADE NO_SOUND
Sprite globe light
*/
static void() light_globe =
{
precache_model("progs/s_light.spr");
setmodel(self, "progs/s_light.spr");
makestatic(self);
};
/*QUAKED light_torch_small_walltorch (1 1 0) (-4 -4 -16) (4 4 32) START_OFF FADE NO_SOUND
{ model ("progs/flame.mdl"); }
Short wall torch
Makes crackling fire noise unless NO_SOUND is set
*/
static void() light_torch_small_walltorch =
{
precache_model("progs/flame.mdl");
setmodel(self, "progs/flame.mdl");
if (!(self.spawnflags & LIGHT_NO_SOUND))
ambient_fire();
makestatic(self);
};
/*QUAKED light_torch_long_walltorch (1 1 0) (-8 -8 -48) (8 8 24) START_OFF FADE NO_SOUND
{ model ("progs/flame3.mdl"); }
Long wall torch
Makes crackling fire noise unless NO_SOUND is set
*/
static void() light_torch_long_walltorch =
{
precache_model("progs/flame3.mdl");
setmodel(self, "progs/flame3.mdl");
if (!(self.spawnflags & LIGHT_NO_SOUND))
ambient_fire();
makestatic(self);
};
/*QUAKED light_flame_small_yellow (1 1 0) (-4 -4 -12) (4 4 16) START_OFF FADE NO_SOUND
{ model ("progs/flame2.mdl"); }
Small yellow flame
Makes crackling fire noise unless NO_SOUND is set
*/
static void() light_flame_small_yellow =
{
precache_model("progs/flame2.mdl");
setmodel(self, "progs/flame2.mdl");
if (!(self.spawnflags & LIGHT_NO_SOUND))
ambient_fire();
makestatic(self);
};
/*==========
light_flame_small_white
For compatability only.
==========*/
static void() light_flame_small_white =
{
self.classname = "light_flame_small_yellow";
light_flame_small_yellow();
};
/*QUAKED light_flame_large_yellow (1 1 0) (-8 -8 -12) (8 8 40) START_OFF FADE NO_SOUND
{ model ( { "path" : "progs/flame2.mdl", "frame" : 1 } ); }
Large yellow flame
Makes crackling fire noise unless NO_SOUND is set
*/
static void() light_flame_large_yellow =
{
precache_model("progs/flame2.mdl");
setmodel (self, "progs/flame2.mdl");
self.frame = 1;
if (!(self.spawnflags & LIGHT_NO_SOUND))
ambient_fire();
makestatic(self);
};
/*==========
s_flame
==========*/
static void() s_flame =
{
self.frame = self.frame + 1;
if (self.frame > 13)
self.frame = 0;
self.think = s_flame;
self.nextthink = time + 0.05;
};
/*QUAKED light_flame_sprite (1 1 0) (-16 -16 0) (16 16 40) START_OFF FADE NO_SOUND
Large yellow flame sprite
Makes crackling fire noise
See the "light" entity for a full description
*/
static void() light_flame_sprite =
{
self.mdl = "progs/s_flame.spr";
precache_model(self.mdl);
self.noise = "ambience/fire1.wav";
precache_sound(self.noise);
self.noise1 = "misc/torchoff.wav";
precache_sound(self.noise1);
self.noise2 = "misc/torchon1.wav";
precache_sound(self.noise2);
if (!(self.spawnflags & LIGHT_NO_SOUND))
ambient_fire();
light();
// assume any sensible engine that implements pr_checkextension
// also has working spritegroups, so we can use
// makestatic and reduce network traffic
if (cvar("pr_checkextension"))
{
self.frame = 14; // frame 14 is a spritegroup which contains 14 frames
//makestatic(self);
}
else
{
self.think = s_flame; // animate frames 0-13 manually
self.nextthink = time + 0.01 + random() * 0.5;
}
};