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