54 lines
1.5 KiB
JavaScript
54 lines
1.5 KiB
JavaScript
|
|
class entity_enemy_hound_t extends entity_enemy_t {
|
|
_init(patrol_dir) {
|
|
super._init(patrol_dir);
|
|
this._model = model_hound;
|
|
this._texture = 22;
|
|
this._health = 25;
|
|
this._check_against = ENTITY_GROUP_PLAYER;
|
|
|
|
this.s = vec3(12,16,12);
|
|
|
|
this._attack_distance = 200;
|
|
this._evade_distance = 64;
|
|
this._attack_chance = 0.7;
|
|
this._speed = 256;
|
|
|
|
this._ANIMS = [
|
|
[1, [0]], // 0: Idle
|
|
[0.15, [0,1]], // 2: Run
|
|
[0.15, [0,1]], // 2: Run
|
|
[1, [0]], // 3: Attack prepare
|
|
[0.1, [0,1,1,1,0,0,0]], // 4: Attack
|
|
];
|
|
|
|
this._STATE_PATROL = [1, 0.2, 0.5];
|
|
this._STATE_ATTACK_RECOVER = [0, 0, 0.5, this._STATE_FOLLOW];
|
|
this._STATE_ATTACK_EXEC = [4, 0, 1, this._STATE_ATTACK_RECOVER];
|
|
this._STATE_ATTACK_PREPARE = [3, 0, 0.0, this._STATE_ATTACK_EXEC];
|
|
this._STATE_ATTACK_AIM = [0, 0, 0.0, this._STATE_ATTACK_PREPARE];
|
|
this._STATE_EVADE = [2, 1, 0.3, this._STATE_ATTACK_AIM];
|
|
|
|
this._set_state(this._STATE_IDLE);
|
|
}
|
|
|
|
_did_collide_with_entity(other) {
|
|
if (!this._did_hit && this._state == this._STATE_ATTACK_EXEC) {
|
|
this._did_hit = 1;
|
|
other._receive_damage(this, 14);
|
|
}
|
|
}
|
|
|
|
_attack() {
|
|
this._play_sound(sfx_enemy_hound_attack);
|
|
this.v = vec3_rotate_y(vec3(0, 250, 600), this._target_yaw);
|
|
this._on_ground = 0;
|
|
this._did_hit = 0;
|
|
|
|
// Ignore ledges while attacking
|
|
this._keep_off_ledges = 0;
|
|
clearTimeout(this._reset_ledges);
|
|
this._reset_ledges = setTimeout(()=>this._keep_off_ledges = 1, 1000);
|
|
}
|
|
}
|