QuakeCマニュアル

5.entityについて
 Quakeではモンスター、プレイヤー、アイテム、そしてマップ全てがentityとして扱われる。
QuakeCのコードを覗いてみると3種類のentityを目にするであろう。


●スタティックentity

 スタティックentityの存在はゲームの状況に左右されることはない。これらはmodelや、ラ
イト、架空のオブジェクト及びそれに類する物の場合がある。これらスタティックentityは
entityの参照番号を持たないため参照を行うことはできない。

 スタティックentityは以下の関数によって生成される。

makestatic()

(実行時spawnstaticメッセージが各clientへ送信される)
一度生成してしまったスタティックentityは削除することができない。

 スタティックentityの最大使用限度数は127個である。


●テンポラリentity

 テンポラリentityは使用される時間が非常に短い。例えば、Quakeではこれらのentityを壁
を叩いた時の破片の効果(点型entity)や、武器Thunderboltの稲妻(線型entity)、発砲等、1フ
レームのみの表示物に使用されている。

 テンポラリentityはテンポラリentityメッセージの送信により生成され、それ自身で自動
的に消滅するため、削除を行う必要が無い。

●ダイナミックentity

 ダイナミックentityは様々な行動、外観、その他の変更が可能である。弾薬箱、回転するア
ーマー、プレイヤーのmodel、その他これに類する物のことである。

ダイナミックentityの生成:

entity = spawn();
setmodel( entity,"progs/entity.mdl");
setsize( entity,vector_min,vector_max);
setorigin( entity,position );

ダイナミックentityの削除:

remove( entity );

 ダイナミックentityの最大使用限度数は449個である。

●entityフィールドの定義

 これから示すフィールドはentityオブジェクト(例えば、self、other等)内にて利用するこ
とができる。しかし、entityオブジェクトはフィールドへのアクセスには何ら保護も無い上、
フィールド内の値の正当性も保証されておらず、プログラミング上の観点から言いうと本当
のオブジェクトとは呼び難い。フィールドへいい加減な値を設定すればゲームがクラッシュ
することも起こり得る。

 entityオブジェクトへはカスタムフィールドを追加するころができる(例えば新たに作った
武器の残り弾薬数を格納する時等)。しかし、これらカスタムフィールドはQuakeCとQuake.exe
に共通の位置付けであってはならない。そうでなければQuake.exe本体の再コンパイルが必要
となってしまう。カスタムフィールドはフィールド定義の個所にある仮想変数end_sys_fields
より後に宣言しなければならない(QuakeCのオリジナルソースではdefs.qc内でこの個所を見
ることができる)。

●Quake.exe、QuakeC共有のentityフィールド

 これらは殆どのentityに共通するフィールドであり、Quake.exeのCコードとPROGS.DAT内の
QuakeCコードが共有するフィールドである。

 フィールド内にある一部の値はCコードで管理されており、参照のみ行う限りは問題無しで
あるが、直接内容を変更してはならない(変更の際にはビルトイン関数を使用すること)。

技術的数値

entity	chain;		//chainリスト上の次のentity(ビルトイン関数findradius参照)
float	ltime;		//各entity個有のタイマー
float	teleport_time;	//テレポートの渋滞発生を避ける
float	spawnflags;	//諸設定のビットフィールド

entityの外観

float	modelindex;	//プリキャッシュリスト上にあるmodelファイルの番号
string	classname;	//spawn時に呼び出された初期設定関数名

string	model;		//modelのファイル名

float	frame;		//表示中のmodelのフレーム番号、フレームはmodelファイル内の$frameによって定義され
			//$xxxといったコード(xxxにはフレームの名前が入る)で扱う

float	skin;		//表示中のmodelのスキン番号、2つ以上のスキンが定義されている場合使用中のスキン番
			//号を示す、スキンは正当な範囲内で自由に変更可能である、例えばアーマー等は黄、赤、
			//緑色のスキンが使い分けされている

float	effects;	//entityの発光効果、entityを発光させたり、entityの周囲に光の粒を発生させる


3次元の位置座標

vector	origin;		//modelの位置座標
			//origin_x、origin_y、origin_z
vector	mins;		//entityのサイズを表すboxのoriginへの相対的な最下位座標
			//mins_x、mins_y、mins_z
vector	maxs;		//entityのサイズを表すboxのoriginへの相対的な最上位座標
			//maxs_x、maxs_y、maxs_z
vector	size;		//entityのサイズ、maxs-minsの値である
			//size_x、size_y、size_z
vector	absmin;		//entityのサイズを表すboxの絶対的な最下位座標、origin+minsと同じ
			//absmin_x、absmin_y、absmin_z
vector	absmax;		//entityのサイズを表すboxの絶対的な最下位座標、origin+minsと同じ
			//absmax_x、absmax_y、absmax_z
vector	oldorigin;	//modelの旧位置座標
vector	angles;		//内容は'pitch_angle yaw_angle flip_angle'となっている

注:anglesをプレイヤーへ設定しても設定は反映されない。

entityをとりまく状況

float	waterlevel;	//0 = 水中ではない、1 = 足まで、2 = 腰まで、3 = 目まで浸かっている
float	watertype;	//水の種類(4.4参照)
entity	groundentity;	//現在立っている足場のentity

groundentityはプログラム中のどこでも使用されてはいない。

3次元空間の移動

vector	velocity;	//内容は'speed_x speed_y speed_z'となっている
vector	avelocity;	//内容は'pitch_speed yaw_speed 0'
vector	punchangle;	//ダメージを受けた場合や発砲時に反動を受けた場合、元のangleへ戻すための物
float	movetype;	//動作のタイプ(4.8参照)
float	yaw_speed;	//水平に回転する速度
float	solid;		//固形オブジェクト設定(4.7参照)

モンスターの行動

entity	goalentity;	//モンスターの標的または敵
float	ideal_yaw;	//モンスターの向こうとする水平方向
float	yaw_speed;	//モンスターが水平に回転する(振り向く)速度
string	target;		//モンスターの標的
string	targetname;	//モンスターの標的名

自動的に行われる行動


float	nextthink;	//entityの次回行動までの時間
void()	think;		//entity行動時呼び出される関数
void()	touch;		//entityが何かに接触した場合に呼び出される関数
void()	use;		//entityが使用された場合に呼び出される関数
void()	blocked;	//ドアやプラット用の関数で何かに阻まれて動けなかった場合に呼び出される関数
vector	movedir;	//主にドアを対象に使用されるが、水濠等にも使われる
string	message;	//トリガーメッセージ
float	sounds;		//演奏するCDトラックの曲番
string	noise;		//entityノイズチャンネル1で発せられている音
string	noise1;
string	noise2;
string	noise3;

プレイヤー及びモンスターのステータス

float	deadflag;	//entityの生死状況(4.10参照)
float	health;		//体力値
float	max_health;	//最大体力値
float	takedamage;	//ダメージを受けた量
float	dmg_take;	//super shotgunで大量のダメージを与えることのないよう、1フレーム内に受けたダメージ
			//は1つに集められて渡される
float	dmg_save;	//
entity	dmg_inflictor;	//ダメージを与えてきた加害者側のentity(プレイヤー、モンスター、ミサイル、ドア)

プレイヤーの所持品

float	items;		//所持している武器類はビットフラグによって表す
float	armortype;	//ダメージを軽減してくれるアーマーの種類
float	armorvalue;	//アーマー値
float	weapon;		//IT_SHOTGUN等、選択中の武器フラグ
string	weaponmodel;	//表示する武器のmodel
float	weaponframe;	//表示する武器modelのフレーム番号
float	currentammo;	//選択中の武器の残り弾薬数
float	ammo_shells;	//shellの残り数
float	ammo_nails;	//nailの残り数
float	ammo_rockets;	//rocket及びgranadeの残り数
float	ammo_ceils;	//lightning boltの残り数

float	impulse;	//武器の変更

 weaponの値を0へ指定しても武器は変更されない。0以外を指定した場合、その指定内容を
QuakeCがimpulseコマンドとして実行して武器の変更要求をする(impulseコマンドの項を参照)。

プレイヤーの戦闘

entity	owner;		//entityのオーナー(ミサイルや泡などのオーナーはプレイヤーである)
entity	enemy;		//敵(これはモンスター用)
float	button0;	//発砲
float	button1;	//使用
float	button2;	//ジャンプ
vector	view_ofs;	//プレイヤー視点のoriginに対する相対座標
float	fixangle;	//angleの変更を行いたい場合に1を指定する
vector	v_angle;	//プレイヤー視点のangle値
float	idealpitch;	//登り坂を見上げる際のために算出されたpitch値
entity	aiment;		//自分を狙っているentity?

デスマッチ

float	frags;		//fragの値
string	netname;	//ネットワークプレイ時の名前
float	colormap;	//シャツ及びパンツの色
float	team;		//チーム番号
float	flags;		//#不明

●QuakeC側でのみ使用されているentityフィールド(ユーザー定義)

 これから述べるフィールドはQuakeCプログラムでのみ使用され、Quake.exeからは直接参照
されることにはならない。他のQuakeCのモジュールが行っている範囲を逸脱しない限り、好き
なように値を扱って良い。

 もし、これらのフィールドだけでは不都合であれば、既存のフィールド定義へ新規の定義を
追加することができる。実はentityフィールドのフィールド数(つまりentityオブジェクト全
体のサイズ)はQuakeC側で決定され、PROGS.DATのヘッダーにある変数entityfieldsはQuake.exe
へentityフィールドのサイズを教えるのである。

 フィールドを追加するとフィールドを追加した分だけ、各entityが使用するメモリ領域を増
加させることになる。float型(4バイト長)のフィールドを1つ追加したとすると、
[entity数×4バイト]の分だけ使用メモリ領域が増加する計算である。


Worldフィールド

string	wad;		//WADファイル名
string	map;		//map名
float	worldtype;	//以下の詳細を参照

 worldtypeは0であれば中世風、1であれば金属系、2は基地の設定である。
これらのフィールドはグローバル変数にできそうなものだが...。

Quakeのエディット用フィールド

string	killtarget;
float	light_lev;	//ゲームでは使用しないが、ライト用ユーティリティーで必要
float	style;

モンスターの行動

 以下の関数はそれぞれのイベントが起こった時に呼び出される。

void()	th_stand;	//アイドル状態で立っている時
void()	th_walk;	//歩行時
void()	th_run;		//走行時
void()	th_missile;	//ミサイルが迫っている時
void()	th_melee;	//乱闘状態
void()	th_die;		//死亡時

void(entity attacker,float damage)	th_pain;
			//モンスターがattacker(プレイヤーもしくは他のモンスター)にダメージを受けた場合に
			//呼び出され、時には(同じ種族でなかった場合等)モンスターがattackerに対して敵意を
			//示す

モンスターのステータス

entity	oldenemy;	//ダメージを受ける前まで敵意を示していたプレイヤー
float	speed;		//
float	lefty;		//
float	search_time;	//
float	attack_state;	//

float	pausetime;
float	movetarget;

プレイヤーのみ

float	walkframe;
float	attack_finished;	//攻撃終了(次の攻撃が可能になる状態)の時間
float	pain_finished;		//痛みによる悲鳴soundの再生が終了
float	invincible_finished;	//無敵の終了時間
float	invisible_finished;	//透明人間の終了時間
float	super_damage_finished;	//Quadダメージショットの終了時間
float	radsuit_finished;	//バイオスーツ効力の終了時間
float	invincible_time;	//プレイヤーの無敵状態on/off(1でon)
float	invincible_sound;	//プレイヤーの無敵sound再生終了時間
float	invisible_time;		//プレイヤーの透明人間on/off(1でon)
float	invisible_sound;	//プレイヤーの透明人間sound再生終了時間
float	super_time;		//Quadダメージショットon/off(1でon)
float	super_sound;		//Quadダメージショットsound再生終了時間
float	rad_time;		//バイオスーツの効力on/off(1でon)
float	fly_sound;		
float	axhitme;		//TRUEならば斧で殴られたことを示す
float	show_hostile;		//プレイヤーが発砲したり、ダメージを受けた場合はいつもtime+0.2の値がセット
				//されている、この操作結果は警戒中のモンスターに対して反映され、プレイヤー
				//を見逃しにくくしている
float	jump_flag;		//プレイヤーがジャンプしている際のsoundフラグ
float	swim_flag;		//プレイヤーが泳いでいる際のsoundフラグ
float	air_finished;		//酸素の切れる時間、時間切れで溺れ始める
float	bubble_count;		//泡が消滅する時間
string	deathtype;		//死んだ理由

オブジェクト関連

string	mdl;		//modelの名前?
vector	mangle;		//スタート時のangle、'pitch roll yaw'
vector	oldorigin;	//隠しドアのみに対して使用
float	t_length;
float	t_width;

ドア

vector	dest;
vector	dest1;
vector	dest2;
float	wait;		//次に撃たれて動作を行う受け付けを開始するまでの時間
float	delay;		//撃たれて動作を開始するまでの時間
entity	trigger_field;	//ドアのトリガとなるentity
string	noise4;
float	aflag;
float	dmg;		//ドアの受けたダメージ

多目的フィールド

float	cnt;		//カウンタ
void()	think1;
vector	finaldest;
vector	finalangle;
//
//
//
float	count;		//カウントを行うトリガ用
//
//
//
float	lip;
float	state;
vector	pos1;		//最上位座標
vector	pos2;		//最下位座標
float	height;
//
//
//
float	waitmin;
float	waitmax;
float	distance;
float	volume;

e-mail:ponpoko@axcx.com