alter-egoism/js/plugins/survivor_mob.js
2025-11-01 14:17:42 -05:00

673 lines
14 KiB
JavaScript

//MOBクラスに直接書くよりコッチの方が見やすい
//基本ステータス
const mob_id_list = [
"ossan",
"ossan_mura",
"ossan_gold",
"ossan_red",
"ossan_hakase",
"ossan_hage",
"ossan_battle",
"ossan_long",
"ossan_back",
"ossan_majime",
"monster_ghost",
"monster_bone",
"monster_orc",
"monster_imp",
"monster_flower_r",
"monster_flower_b",
"monster_slime_b",
"monster_slime_g",
"monster_succubus_r",
"monster_succubus_g",
"bat",
"medama",
"bee",
"jelly",
"fishman",
"scorpion",
"spider"
];
const mobData = {
ossan: {
name: "オッサン",
img: "ossan_sao",
img_index: 0,
maxHp: 20,
hp: 20,
exp: 1,
speed: 0.7,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
ossan_mura: {
name: "オッサン紫",
img: "ossan_sao",
img_index: 1,
maxHp: 30,
hp: 30,
exp: 2,
speed: 1.5,
weight: 5,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
ossan_gold: {
name: "オッサン金",
img: "ossan_sao",
img_index: 2,
maxHp: 150,
hp: 150,
exp: 10,
speed: 1,
weight: 30,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
ossan_red: {
name: "オッサン赤",
img: "ossan_sao",
img_index: 3,
maxHp: 50,
hp: 50,
exp: 2,
speed: 2,
weight: 10,
damage: 2,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
ossan_hakase: {
name: "オッサンハカセ",
img: "ossan_minna",
img_index: 0,
maxHp: 50,
hp: 50,
exp: 2,
speed: 1,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
ossan_hage: {
name: "オッサンハゲ",
img: "ossan_minna",
img_index: 0,
maxHp: 50,
hp: 50,
exp: 2,
speed: 1,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
ossan_battle: {
name: "オッサンバトル",
img: "ossan_minna",
img_index: 2,
maxHp: 70,
hp: 70,
exp: 3,
speed: 1.5,
weight: 10,
damage: 3,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
ossan_long: {
name: "オッサンロン毛",
img: "ossan_minna",
img_index: 3,
maxHp: 50,
hp: 50,
exp: 2,
speed: 1,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
ossan_back: {
name: "オッサンオールバック",
img: "ossan_minna",
img_index: 4,
maxHp: 50,
hp: 50,
exp: 2,
speed: 1,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
ossan_majime: {
name: "オッサン真面目",
img: "ossan_minna",
img_index: 5,
maxHp: 50,
hp: 50,
exp: 2,
speed: 1,
weight: 10,
damage: 2,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
monster_ghost: {
name: "モンスターゴースト",
img: "Monster1",
img_index: 0,
maxHp: 20,
hp: 20,
exp: 1,
speed: 2,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
monster_bone: {
name: "モンスター骨",
img: "Monster1",
img_index: 1,
maxHp: 30,
hp: 30,
exp: 1,
speed: 0.7,
weight: 10,
damage: 3,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
monster_orc: {
name: "モンスターオーク",
img: "Monster1",
img_index: 2,
maxHp: 100,
hp: 100,
exp: 5,
speed: 0.5,
weight: 10,
damage: 3,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
monster_imp: {
name: "モンスターインプ",
img: "Monster1",
img_index: 3,
maxHp: 30,
hp: 30,
exp: 1,
speed: 2,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
monster_flower_r: {
name: "花赤",
img: "Monster2",
img_index: 0,
maxHp: 30,
hp: 30,
exp: 1,
speed: 0.8,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
monster_flower_b: {
name: "花青",
img: "05_Enemy02",
img_index: 2,
maxHp: 80,
hp: 80,
exp: 4,
speed: 0.8,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
monster_slime_b: {
name: "スライム青",
img: "Monster2",
img_index: 2,
maxHp: 10,
hp: 10,
exp: 1,
speed: 0.5,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
monster_slime_g: {
name: "スライム緑",
img: "Monster2",
img_index: 6,
maxHp: 30,
hp: 30,
exp: 2,
speed: 0.5,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
monster_succubus_r: {
name: "サキュバス赤",
img: "Monster2",
img_index: 3,
maxHp: 100,
hp: 100,
exp: 8,
speed: 1.3,
weight: 10,
damage: 3,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
monster_succubus_g: {
name: "サキュバス緑",
img: "Monster2",
img_index: 7,
maxHp: 100,
hp: 100,
exp: 10,
speed: 1.3,
weight: 10,
damage: 4,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
bat: {
name: "コウモリ",
img: "Monster3",
img_index: 0,
maxHp: 5,
hp: 5,
exp: 1,
speed: 2,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
medama: {
name: "目玉",
img: "Monster3",
img_index: 1,
maxHp: 120,
hp: 120,
exp: 7,
speed: 0.8,
weight: 10,
damage: 2,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
bee: {
name: "ハチ",
img: "Monster3",
img_index: 2,
maxHp: 10,
hp: 10,
exp: 1,
speed: 2,
weight: 10,
damage: 1,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
jelly: {
name: "海月",
img: "Monster3",
img_index: 3,
maxHp: 20,
hp: 20,
exp: 2,
speed: 1,
weight: 10,
damage: 2,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
fishman: {
name: "サハギン",
img: "Monster3",
img_index: 5,
maxHp: 100,
hp: 100,
exp: 9,
speed: 1,
weight: 10,
damage: 3,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
scorpion: {
name: "サソリ",
img: "Monster3",
img_index: 6,
maxHp: 15,
hp: 15,
exp: 1,
speed: 1.5,
weight: 10,
damage: 2,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
},
spider: {
name: "クモ",
img: "Monster3",
img_index: 7,
maxHp: 20,
hp: 20,
exp: 1,
speed: 2,
weight: 10,
damage: 2,
r: 20,
dm_cool: [], //こいつが攻撃する時のクールタイム
appear_cool: 0
}
};
// MOBがやられた時の流れ
// resetMobされる
// Spriteはそのまま
function MOB(name, id) {
this.resetMob(name, id);
}
MOB.prototype.resetMob = function (name, id) {
this.cool = []; //やられた時のクールタイム {id:id , duration:フレーム数}が入る
this.name = name;
this.id = id;
//まず中央に配置
this.x = (Graphics.width - SURVIVOR_CONST.RIGHT_MARGIN) / 2;
this.y = Graphics.height / 2;
var key = Math.random() - 0.5;
//左右のタテ直線ラインに配置
if (Math.random() < 0.5) {
this.x += Math.sign(key) * ((Graphics.width - SURVIVOR_CONST.RIGHT_MARGIN) / 2) * (Math.random() + 1);
this.y += Graphics.height * (Math.random() - 0.5);
} else {
this.y += Math.sign(key) * (Graphics.height / 2) * (Math.random() + 1);
this.x += (Graphics.width - SURVIVOR_CONST.RIGHT_MARGIN) * (Math.random() - 0.5);
}
//その時のディスプレイ座標を記録
this.dispX = $gameMap._parallaxX;
this.dispY = $gameMap._parallaxY;
this.kb = null;
this.death = false;
this.del = false;
this.dm = {
visible: false,
dm: 0,
duration: 0
};
//クラスよりこっちの方が見やすい
var keys = Object.keys(mobData[name]);
for (var i = 0, len = keys.length; i < len; i++) {
this[keys[i]] = mobData[name][keys[i]];
}
this.reset = true;
};
MOB.prototype.setDamage = function (dm) {
this.hp -= dm;
this.dm.visible = true;
this.dm.dm = dm;
this.dm.duration = SURVIVOR_CONST.DAMAGE_DURATION;
};
//MobのSprite
function Sprite_Mob() {
this.initialize(...arguments);
}
Sprite_Mob.prototype = Object.create(Sprite.prototype);
Sprite_Mob.prototype.constructor = Sprite_Mob;
Sprite_Mob.prototype.initialize = function (data) {
Sprite.prototype.initialize.call(this);
this.anchor.x = 0.5;
this.anchor.y = 0.5;
this.data = data;
this.t = 0;
this.setCharacterBitmap();
var sp = new Sprite_CBRDamage(this.data);
this._damage = sp;
this.addChild(sp);
};
//登場するモンスターは1つの画像にまとめよう、updateはフレームだけ
Sprite_Mob.prototype.update = function () {
Sprite.prototype.update.call(this);
if (this.data.del) {
return;
} else {
this.visible = true;
}
this.updateCharacterFrame();
this.updatePosition();
//死んだらダメージもポジションもアップデートしない
if (this.data.death) {
//初期
if (!this.data.deathFilter) {
var filter = new PIXI.filters.breakFilter();
filter.uniforms.key1 = 1; //粒々用乱数、ノイズの大きさ用 0.1だと少ない 0.9だと多い
filter.uniforms.pxSize = Graphics.boxWidth / 1; //粒子のサイズ
this._CBR_breakFilter = filter;
if (!this.filters) {
this.filters = [];
}
this.filters.push(filter);
this.data.deathFilter = true;
}
var filter = this._CBR_breakFilter;
filter.uniforms.key1 = this.data.deathCount / SURVIVOR_CONST.DEATH_COUNT; //粒々用乱数、ノイズの大きさ用
//死んだ完了フラグが立ってたらdelフラグON
if (this.data.deathCount <= 0) {
this.data.del = true;
this.visible = false;
this.filters = [];
} else {
this.data.deathCount--;
}
}
if (this.data.reset) {
this.bitmap = ImageManager.loadCharacter(this.data.img);
this.updateCharacterFrame();
this.data.reset = false;
}
};
Sprite_Mob.prototype.updatePosition = function () {
this.x = this.data.x;
this.y = this.data.y;
};
Sprite_Mob.prototype.updateBitmap = function () {
if (this.isImageChanged()) {
this._tilesetId = $gameMap.tilesetId();
this._tileId = this._character.tileId();
this._characterName = this._character.characterName();
this._characterIndex = this._character.characterIndex();
if (this._tileId > 0) {
this.setTileBitmap();
} else {
this.setCharacterBitmap();
}
}
};
Sprite_Mob.prototype.setCharacterBitmap = function () {
this.bitmap = ImageManager.loadCharacter(this.data.img);
};
Sprite_Mob.prototype.updateCharacterFrame = function () {
const pw = this.patternWidth();
const ph = this.patternHeight();
const sx = (this.characterBlockX() + this.characterPatternX()) * pw;
const sy = (this.characterBlockY() + this.characterPatternY()) * ph;
this.setFrame(sx, sy, pw, ph);
this.t++;
};
Sprite_Mob.prototype.characterPatternX = function () {
return Math.floor(Math.abs(((this.t / 10) % 5.99) - 5.99 / 2)) + (this.data.img_index % 4) * 3; //this._character.pattern();
};
Sprite_Mob.prototype.characterPatternY = function () {
return Math.floor(this.data.img_index / 4);
};
Sprite_Mob.prototype.patternWidth = function () {
return this.bitmap.width / 12;
};
Sprite_Mob.prototype.patternHeight = function () {
return this.bitmap.height / 8;
};
Sprite_Mob.prototype.characterBlockX = function () {
const index = 0; //this._character.characterIndex();
return (index % 4) * 3;
};
Sprite_Mob.prototype.characterBlockY = function () {
const index = 0; //this._character.characterIndex();
return Math.floor(index / 4) * 4;
};
//Mobのダメージ
function Sprite_CBRDamage() {
this.initialize(...arguments);
}
Sprite_CBRDamage.prototype = Object.create(Sprite.prototype);
Sprite_CBRDamage.prototype.constructor = Sprite_CBRDamage;
Sprite_CBRDamage.prototype.initialize = function (data) {
Sprite.prototype.initialize.call(this);
this.data = data;
this.anchor.x = 0.5;
this.visible = false;
this._damages = [];
this.duration = 0;
this.create();
};
Sprite_CBRDamage.prototype.create = function () {
//まぁ最大で3桁でしょ
for (var i = 0; i < 3; i++) {
var sp = new Sprite();
sp.bitmap = ImageManager.loadSystem("Damage");
sp.x = 12 * i;
sp.scale.x = 1;
sp.scale.y = 1;
this._damages.push(sp);
this.addChild(sp);
}
};
Sprite_CBRDamage.prototype.setFrame = function (dm) {
if (dm < 10) {
this.x = -12 * 2.5;
this._damages[0].visible = false;
this._damages[1].visible = false;
this._damages[2].setFrame(12 * dm, 0, 12, 16);
} else if (dm < 100) {
this.x = -12 * 2;
var temp = Math.floor(dm / 10);
this._damages[0].visible = false;
this._damages[1].visible = true;
this._damages[1].setFrame(12 * temp, 0, 12, 16);
this._damages[2].setFrame(12 * Math.floor(dm - temp * 10), 0, 12, 16);
} else {
this.x = -12 * 1.5;
var temp = Math.floor(dm / 100);
this._damages[0].setFrame(12 * temp, 0, 12, 16);
dm -= temp * 100;
var temp = Math.floor(dm / 10);
this._damages[1].setFrame(12 * temp, 0, 12, 16);
this._damages[2].setFrame(12 * Math.floor(dm - temp * 10), 0, 12, 16);
}
};
Sprite_CBRDamage.prototype.update = function () {
Sprite.prototype.update.call(this);
var d = this.data.dm;
if (d.visible) {
//最初の時
if (d.duration == SURVIVOR_CONST.DAMAGE_DURATION) {
this.setFrame(d.dm);
this.visible = true;
}
this.y = -Math.sin((3.14 / SURVIVOR_CONST.DAMAGE_DURATION) * (SURVIVOR_CONST.DAMAGE_DURATION - d.duration)) * SURVIVOR_CONST.DAMAGE_DURATION;
d.duration--;
if (d.duration < 0) {
this.visible = false;
}
} else {
this.visible = false;
}
};