374 lines
8.7 KiB
Plaintext
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;
|
|
}
|
|
};
|