📄 critter.java
字号:
if((m_state & STATE_WESTWARD) != 0) {
if(m_x <= m_destination_x) stop();
else m_next_x -= m_speed;
}
if((m_state & STATE_EASTWARD) != 0) {
if(m_x >= m_destination_x) stop();
else m_next_x += m_speed;
}
if((m_state & STATE_SPAT) != 0) {
c = Level.getLowest(m_board_x);
if(m_type == TYPE_ITEM && (m_id == ITEM_SEED || m_id == ITEM_PEPPER)) {
while(c != null && !c.mutable() && ((c.m_state & STATE_EATING) == 0) && c.m_board_y != 0) {
c = Level.boardRetrieve(c.m_board_x, c.m_board_y - 1);
}
}
if(m_y == m_destination_y || (c != null && Engine.collide(c.getBox(), getBox()))) endSpit(c);
}
if((m_state & STATE_CLIMBING) != 0) {
if(m_y <= m_destination_y) {
m_state &= ~STATE_CLIMBING;
m_state |= STATE_DONE_CLIMB;
Level.s_board_state |= (Level.BOARD_EAT_CLIMBERS);
}
}
if((m_state & STATE_CHEWING) != 0) {
if(m_timer == 0) {
m_state &= ~STATE_CHEWING;
if((m_state & STATE_CHILI_BLAST) != 0) {
makeFull();
Level.s_board_state |= (Level.BOARD_EXPLODE_CHILIS);
// fire effect
Particles.create(Particles.TYPE_FIRE_LEFT, Particles.LAYER_HUD, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT));
Particles.create(Particles.TYPE_FIRE_RIGHT, Particles.LAYER_HUD, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT));
}
else {
if(full()) {
if(m_id == CREATURE_TNT) sentence();
else Level.s_board_state |= (Level.BOARD_EXPLODE_FULL);
}
else {
setIdleAnim();
if((m_state & STATE_POISONED) != 0) {
m_state |= STATE_FLASHING;
toxicPoison(TIME_POISON_TIMER);
}
}
}
}
}
if((m_state & STATE_EATING) != 0) {
if(m_timer == 0) {
m_state &= ~STATE_EATING;
c = Level.boardRetrieve(m_board_x, m_board_y - 1);
if( ((m_state & STATE_FOOD_CHAIN) != 0) && ((m_size & SIZE_MEDIUM) == SIZE_MEDIUM) && c != null && c.mutable()) {
c.m_state |= STATE_FOOD_CHAIN;
if((m_state & STATE_BONUS) != 0) c.m_state |= STATE_BONUS;
Particles.create(Particles.TYPE_FOOD_CHAIN_TEXT, Particles.LAYER_HUD, c.m_x<<Engine.FP_SHIFT, (c.m_y+Level.SQUARE_H)<<Engine.FP_SHIFT);
eat(c);
// throw in extra process call when eating a red Critter in a
// food chain to synch him up with any Critters below.
process();
}
else {
if( ((m_state & STATE_FOOD_CHAIN) != 0) && ((m_size & SIZE_BIG) == SIZE_BIG || m_id == CREATURE_TNT)) {
makeFull();
Level.s_combo = 2;
}
if(!full() && (m_state & STATE_CHILI_BLAST) == 0) m_state &= ~STATE_IMMOBILE;
m_state |= STATE_CHEWING;
//#if DefaultConfiguration || Nokia_6600 || Nokia_6600_Unobfuscated || Nokia_3220 || Nokia_3220_Unobfuscated || Razr
setAnim(Anims.GREEN_CHEWING);
//#endif
m_timer = (short)TIME_CHEW;
}
}
}
if((m_state & STATE_SPAWN_DROP) != 0) {
if(//m_board_x == Level.s_player.m_board_x &&
Engine.collide(getBox(), Level.s_player.getBox())) {
//#if Nokia_3100 || Nokia_3100_Unobfuscated
//# if((m_id >= ITEM_GEM_1 && m_id <= ITEM_GEM_3) || m_id == Critter.ITEM_COIN) {
//# Engine.printLine("playing gem grab 1");
//# Engine.playSound(Engine.SOUND_GRAB_GEM);
//# }
//# else {
//# Engine.playSound(Engine.SOUND_GRAB_POWERUP);
//# }
//#endif
pickup();
}
}
if((m_state & STATE_BONUS) != 0) {
Particles.create(Particles.TYPE_SPECIAL_GLOW, Particles.LAYER_MIDGROUND, (m_x<<Engine.FP_SHIFT),(m_y<<Engine.FP_SHIFT));
}
// process special timer stuff.
//if(Level.s_type != Level.TYPE_TUTORIAL && Level.s_state == Level.STATE_ACTIVE)
if(m_special_timer > 0) m_special_timer--;
if((m_state & STATE_TOXIC) != 0) {
if(m_special_timer == TIME_TOXIC_FLASH) {
m_state |= STATE_FLASHING;
}
else if(m_special_timer == 0) {
if((m_state & STATE_TOXIC) != 0) {
Level.s_board_state |= (Level.BOARD_POISON);
}
}
Particles.create(Particles.TYPE_TOXIC_HAZE, Particles.LAYER_FOREGROUND, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT), (((m_board_x+1)*(m_board_y+1))+Engine.s_engine.m_state_timer)%Particles.TOXIC_HAZE_FRAMES);
}
if((m_state & STATE_POISONED) != 0) {
if(m_special_timer == 0) {
if(!full()) toxicMorph();
}
}
if((m_state & STATE_BLOCKER_PUFF) != 0) {
if(m_special_timer == 0) {
m_state &= ~STATE_BLOCKER_PUFF;
setIdleAnim();
}
}
if (m_type == TYPE_ITEM) {
//#if DefaultConfiguration || Nokia_6600 || Nokia_6600_Unobfuscated || Razr
if((m_id >= ITEM_GEM_1 && m_id <= ITEM_GEM_9) || m_id == ITEM_COIN) {
Particles.create(Particles.TYPE_GEM_SPARKLE, Particles.LAYER_FOREGROUND, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT), m_id);
}
//#endif
}
}
//#ifndef NO_SCREEN_SHAKING
// return an offset of the indicated axis based on screen-shaking logic.
public int shake(int axis) { return Engine.getShake(Engine.SHAKE_CRITTERS, axis); }
//#endif
// process this Critter's death sequence.
public void die() {
//if(m_id == CREATURE_GREEN) Level.s_greens--;
//else if(m_id == CREATURE_RED) Level.s_reds--;
//else if(m_id == CREATURE_BLUE) Level.s_blues--;
//Level.s_Critter_count--;
if(m_board_x >= 0 && m_board_x < Level.s_board[0].length && m_board_y >= 0 && m_board_y < Level.s_board.length) Level.s_board[m_board_y][m_board_x] = null;
Level.removeExtra(this);
}
// return an array representing the on-screen bounding box of the Entity.
public int [] getBox() {
int x = m_x + S_BOX[BOX_X];
int y = m_y + S_BOX[BOX_Y];
int w = x + S_BOX[BOX_WIDTH];
int h = y + S_BOX[BOX_HEIGHT];
return new int [] { x, y, w, h };
}
// set the indicated animation state.
public void setAnim(int state) {
m_anim_state = (short)(state + m_id);
m_frame = 0;
}
/****************************************************************************
** Miscellaneous Methods
***************************************************************************/
// check to see if this Critter is one of the basic green/red/blue creatures.
public boolean basic() { return (m_type == TYPE_CREATURE && (m_id == CREATURE_GREEN || m_id == CREATURE_RED || m_id == CREATURE_BLUE || m_id == CREATURE_ORANGE || m_id == CREATURE_PURPLE)); }
// check to see if this Critter is any way dying or about to die.
public boolean mutable() {
return ( ((m_state & STATE_BEING_EATEN) == 0) &&
((m_state & STATE_DYING) == 0) &&
((m_state & STATE_POPPING) == 0) );
}
// check to see if this creature can be poisoned.
public boolean poisonable(int type) {
Critter c = Level.boardRetrieve(m_board_x, m_board_y - 1);
return (Level.onScreen(m_board_x, m_board_y) &&
mutable() &&
basic() &&
//(c == null || c.m_id != CREATURE_GREEN) &&
//((type & m_size) == m_size) &&
((m_state & STATE_TOXIC) == 0) &&
((m_state & STATE_POISONED) == 0) );
}
// check to see if the Critter is almost-full.
public boolean almostFull() { return m_consumed == REGULAR_FULL - 1; }
// check to see if the Critter is full and needs to pop.
public boolean full() { return m_consumed >= REGULAR_FULL; }
// make this creature be full.
public void makeFull() { m_consumed = REGULAR_FULL; }
// make this creature a bonus one.
public boolean bonusify(long state) {
if(basic() && mutable() && ((m_state & STATE_TOXIC) == 0) && ((m_state & STATE_POISONED) == 0) ) {
m_state |= (STATE_BONUS | state);
return true;
}
return false;
}
// check if any eating should occur.
public void eat(Critter c) {
if(c == null || c.m_type != TYPE_CREATURE || !c.mutable() || !Level.onScreen(c.m_board_x, c.m_board_y)) return;
Critter tmp = this;
int count = 0;
while(tmp != null &&
((c.m_state & STATE_DONE_CLIMB) == 0) &&
(( ((c.m_size & SIZE_MEDIUM) == SIZE_MEDIUM) && ((tmp.m_size & SIZE_SMALL) == SIZE_SMALL) ) ||
( ((c.m_size & SIZE_BIG) == SIZE_BIG) && ((tmp.m_size & SIZE_MEDIUM) == SIZE_MEDIUM) ) ||
c.m_id == CREATURE_TNT ||
(tmp.m_size == SIZE_ALL))) {
count++;
tmp.m_state |= (STATE_ASCENDING | STATE_IMMOBILE | STATE_BEING_EATEN);
//#if DefaultConfiguration || Nokia_6600 || Nokia_6600_Unobfuscated || Nokia_3220 || Nokia_3220_Unobfuscated || Razr
if(tmp.m_type == TYPE_CREATURE) tmp.setAnim(Anims.GREEN_SCARED);
//#endif
if(tmp.almostFull()) c.makeFull();
if(tmp.m_type == TYPE_ITEM && tmp.m_id == ITEM_PEPPER) c.m_state |= STATE_CHILI_BLAST;
if((tmp.m_state & STATE_BONUS) != 0) c.m_state |= STATE_BONUS;
if((tmp.m_state & STATE_DROP_MELON) != 0) c.m_state |= STATE_DROP_MELON;
if((tmp.m_state & STATE_DROP_PEPPER) != 0) c.m_state |= STATE_DROP_PEPPER;
if((tmp.m_state & STATE_DROP_ONION) != 0) c.m_state |= STATE_DROP_ONION;
if((tmp.m_state & STATE_TOXIC) != 0) c.toxicMorph();
tmp.m_destination_y -= Level.SQUARE_H * count;
tmp.m_speed = (byte)SPEED_CLIMB;
// check for a food chain.
if((tmp.m_state & STATE_DONE_CLIMB) == 0) {
Critter chainer = Level.onScreen(c.m_board_x, c.m_board_y - 1) ? Level.boardRetrieve(c.m_board_x, c.m_board_y - 1) : null;
if( ((c.m_size & SIZE_MEDIUM) == SIZE_MEDIUM) && ((c.m_state & STATE_CHILI_BLAST) == 0) && c.mutable() &&
chainer != null && ((chainer.m_size & SIZE_BIG) == SIZE_BIG || chainer.m_id == CREATURE_TNT) && chainer.mutable()) {
c.m_state |= STATE_FOOD_CHAIN;
break;
}
}
// get next Critter.
tmp = Level.boardRetrieve(tmp.m_board_x, tmp.m_board_y + 1);
}
if(count > 0) {
if((c.m_state & STATE_EATING) == 0) {
c.m_state |= (STATE_EATING | STATE_IMMOBILE);
if((m_state & STATE_TOXIC) != 0) c.toxicMorph();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -