📄 critter.java
字号:
c.setAnim(Anims.GREEN_EATING);
//#if DefaultConfiguration || Nokia_6600 || Nokia_6600_Unobfuscated || Nokia_3220 || Nokia_3220_Unobfuscated || Razr
c.m_timer = (short)((TIME_EAT * count) - TIME_EAT_TO_CHEW);
//#else
//# c.m_timer = (short)(TIME_EAT * count);
//#endif
c.m_consumed += count;
}
while(tmp != null) {
if( ((tmp.m_state & STATE_CLIMBING) == 0) &&
((tmp.m_state & STATE_BEING_EATEN) == 0) ) {
//Engine.printLine("speed climb on " + toString());
tmp.stop();
tmp.m_state &= ~STATE_DESCENDING;
tmp.m_state |= (STATE_ASCENDING | STATE_CLIMBING);
tmp.m_speed = (byte)SPEED_CLIMB;
tmp.m_destination_y -= Level.SQUARE_H * count;
}
tmp = Level.boardRetrieve(tmp.m_board_x, tmp.m_board_y + 1);
}
}
}
// reset the current Critter's movement and timers.
public void reset() {
stop();
m_state &= ~(STATE_ASCENDING |
STATE_DESCENDING |
STATE_WESTWARD |
STATE_EASTWARD |
STATE_IMMOBILE |
STATE_FLASHING);
m_timer = 0;
}
// sentence the Critter TO DEATH.
public void sentence() { sentence(0); }
// sentence the Critter TO DEATH.
public void sentence(int time) {
if(mutable()) {
m_state &= ~(STATE_EATING | STATE_CHEWING);
m_state |= (STATE_DYING | STATE_IMMOBILE);
m_timer = (short)time;
if(Level.s_state == Level.STATE_ACTIVE) {
if(m_id == CREATURE_TNT) {
makeFull();
Level.s_board_state |= (Level.BOARD_EXPLODE_TNT);
}
if((m_state & STATE_TOXIC) == 0) {
Level.s_combo++;
}
}
}
}
// initiate the Critter's explosion death sequence.
public void explode() {
m_state &= ~STATE_DYING;
m_state |= STATE_POPPING;
//#if Nokia_3100 || Nokia_3100_Unobfuscated
//# Engine.playSound(Engine.SOUND_POP);
//#endif
if(m_type == TYPE_CREATURE) {
// particle pop effect
if(((m_state & STATE_TOXIC) == 0) &&
(m_id == CREATURE_GREEN ||
m_id == CREATURE_ORANGE ||
m_id == CREATURE_RED ||
m_id == CREATURE_BLOCKER ||
m_id == CREATURE_WILDCARD ||
m_id == CREATURE_BLUE ||
m_id == CREATURE_PURPLE)) {
if ((m_state & STATE_FINAL_FALL) != 0 && m_timer <= 0 &&
m_id != CREATURE_BLOCKER && m_id != CREATURE_WILDCARD) {
// create a fake critter that appears to jump at the player
int life = Particles.DEATH_CRITTER_LIFE + Engine.getRandom(Particles.DEATH_CRITTER_LIFE);
Particles.create(Particles.TYPE_DEATH_CRITTER, Particles.LAYER_FOREGROUND, life, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT),
((Level.s_player.m_x - m_x)<<Engine.FP_SHIFT)/life, -(life)<<Engine.FP_SHIFT, 0, (life/4)<<Engine.FP_SHIFT, m_id, 0);
} else {
Particles.create(Particles.TYPE_CREATURE_PUFF, Particles.LAYER_FOREGROUND, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT), m_id);
}
}
//Particles.create(Particles.TYPE_CREATURE_POP, Particles.LAYER_FOREGROUND, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT), m_id);
//Particles.create(Particles.TYPE_TNT_POP, Particles.LAYER_FOREGROUND, Engine.toFP(m_x), Engine.toFP(m_y));
if((m_state & STATE_TOXIC) != 0) //Particles.create(Particles.TYPE_TOXIC_SPLAT, Particles.LAYER_FOREGROUND, Engine.toFP(m_x), Engine.toFP(m_y));
Particles.create(Particles.TYPE_CREATURE_POP, Particles.LAYER_FOREGROUND, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT), CREATURE_TOXIC);
if (m_id == CREATURE_TNT) Particles.create(Particles.TYPE_TNT_POP, Particles.LAYER_HUD, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT));
}
else if(m_type == TYPE_ITEM) {
if (m_id == ITEM_GEM_TOXIC)
Particles.create(Particles.TYPE_TOXIC_SPLAT, Particles.LAYER_FOREGROUND, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT));
else
Particles.create(Particles.TYPE_GEM_SHATTER, Particles.LAYER_FOREGROUND, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT), m_id);
}
m_timer = (short)TIME_EXPLODE;
if( Level.s_state == Level.STATE_ACTIVE && m_type != TYPE_ITEM && (almostFull() || ((m_state & STATE_TOXIC) != 0) || ( ((m_state & STATE_BONUS) != 0) && !full()))) {
Level.dropItem(this);
}
}
// check adjacent spots to see which other Critters need to explode.
public void explodeAll(int type, int delay, boolean verticals) {
boolean wildcard_type = (m_type == TYPE_CREATURE && m_id == CREATURE_WILDCARD);
if(mutable() && (m_id == type || wildcard_type)) sentence(delay);
else return;
// check left side, right side and top side for adjacent explosions.
Critter c;
c = Level.boardRetrieve(m_board_x - 1, m_board_y);
if(c != null) c.explodeAll((wildcard_type ? c.m_id : m_id), delay + TIME_POP_DELAY, true);
c = Level.boardRetrieve(m_board_x + 1, m_board_y);
if(c != null) c.explodeAll((wildcard_type ? c.m_id : m_id), delay + TIME_POP_DELAY, true);
c = Level.boardRetrieve(m_board_x, m_board_y - 1);
if(c != null && Level.onScreen(c.m_board_x, c.m_board_y)) c.explodeAll((wildcard_type ? c.m_id : m_id), delay + TIME_POP_DELAY, true);
c = Level.boardRetrieve(m_board_x, m_board_y + 1);
if(c != null) c.explodeAll((wildcard_type ? c.m_id : m_id), delay + TIME_POP_DELAY, true);
/*
boolean wildcard_type = (creature() && m_id == CREATURE_WILDCARD);
boolean wildcard_vertical = (verticals || wildcard_type);
if(mutable() && (m_size == type || wildcard_type)) sentence(delay);
else return;
// check left side, right side and top side for adjacent explosions.
Critter c;
c = Level.boardRetrieve(m_board_x - 1, m_board_y);
if(c != null) c.explodeAll(wildcard_type ? c.m_size : type, delay + TIME_POP_DELAY, wildcard_vertical);
c = Level.boardRetrieve(m_board_x + 1, m_board_y);
if(c != null) c.explodeAll(wildcard_type ? c.m_size : type, delay + TIME_POP_DELAY, wildcard_vertical);
c = Level.boardRetrieve(m_board_x, m_board_y - 1);
if(c != null && (almostFull() || wildcard_vertical || c.almostFull()) && Level.onScreen(c.m_board_x, c.m_board_y)) c.explodeAll(wildcard_type ? c.m_size : type, delay + TIME_POP_DELAY, wildcard_vertical);
c = Level.boardRetrieve(m_board_x, m_board_y + 1);
if(c != null && (almostFull() || wildcard_vertical || c.almostFull())) c.explodeAll(wildcard_type ? c.m_size : type, delay + TIME_POP_DELAY, wildcard_vertical);
*/
}
// set the Critter's animation state to the default one while accomodating
// for modifiers such as full and toxic.
public void setIdleAnim() {
if(m_type == TYPE_CREATURE) {
if(almostFull()) setAnim(Anims.GREEN_FULL);
else setAnim(Anims.GREEN_IDLE);
}
else if(m_type == TYPE_ITEM) {
setAnim(Anims.MELON_IDLE);
}
}
// map the Critter type based on its id.
public void mapSize() {
if(m_type == TYPE_CREATURE) {
/*
if(m_id == CREATURE_GREEN) {
m_size = SIZE_SMALL_1;
}
else if(m_id == CREATURE_RED ||
m_id == CREATURE_TOXIC) {
m_size = SIZE_MEDIUM_1;
}
else if(m_id == CREATURE_ORANGE) {
m_size = SIZE_MEDIUM_2;
}
else if(m_id == CREATURE_BLUE ||
m_id == CREATURE_TNT) {
m_size = SIZE_BIG_1;
}
else if(m_id == CREATURE_PURPLE) {
m_size = SIZE_BIG_2;
}
else if(m_id == CREATURE_BLOCKER ||
m_id == CREATURE_WILDCARD) {
m_size = SIZE_INEDIBLE;
}
*/
if (m_id == CREATURE_GREEN) m_size = SIZE_SMALL;
else if(m_id == CREATURE_RED) m_size = SIZE_MEDIUM;
else if(m_id == CREATURE_ORANGE) m_size = SIZE_MEDIUM;
else if(m_id == CREATURE_BLUE) m_size = SIZE_BIG;
else if(m_id == CREATURE_PURPLE) m_size = SIZE_BIG;
else m_size = SIZE_INEDIBLE;
}
else {
if(m_id == ITEM_PEPPER) m_size = SIZE_ALL;
else m_size = SIZE_INEDIBLE;
}
}
// register this Critter as being picked up.
public void pickup() { pickup(0); }
// register this Critter as having entered Biggs' mouth.
public void pickup(int snap) {
m_y += snap;
m_state &= ~STATE_TONGUED;
if(m_type == TYPE_ITEM) {
//Level.s_combo = 0;
Level.s_player.m_state |= Avatar.STATE_EATING;
//#if DefaultConfiguration || Nokia_6600 || Nokia_6600_Unobfuscated || Nokia_3220 || Nokia_3220_Unobfuscated || Razr
Level.s_player.setAnim(Anims.BIGGS_CHEWING_LEFT);
//#endif
Level.s_player.m_timer = (short)Avatar.TIME_CHEW;
int score = 0;
if(m_id == ITEM_GEM_TOXIC) {
if(Level.s_type == Level.TYPE_ADVENTURE || Level.s_type == Level.TYPE_TUTORIAL) Level.s_level_bar += Level.TOXIC_HUNGER;
score = Level.TOXIC_POINTS;
Level.s_current_score -= score;
Particles.create(Particles.TYPE_LOSE_POINTS_TEXT, Particles.LAYER_HUD, (m_x<<Engine.FP_SHIFT), (Level.s_player.m_y - Level.GAME_SQUARE_H)<<Engine.FP_SHIFT, -(score));
}
//#if DefaultConfiguration || Nokia_6600 || Nokia_6600_Unobfuscated || Nokia_3220 || Nokia_3220_Unobfuscated || Razr
else if((m_id >= ITEM_GEM_1 && m_id <= ITEM_GEM_9) || m_id == ITEM_COIN) {
//#else
//# else if((m_id >= ITEM_GEM_1 && m_id <= ITEM_GEM_3) || m_id == ITEM_COIN) {
//#endif
if(m_consumed != 0) {
//Engine.printLine("consuming combo " + m_consumed);
if(Level.s_type == Level.TYPE_ADVENTURE || Level.s_type == Level.TYPE_TUTORIAL) Level.s_level_bar -= m_consumed;
//#if DefaultConfiguration || Nokia_6600 || Nokia_6600_Unobfuscated || Nokia_3220 || Nokia_3220_Unobfuscated || Razr
score = m_consumed * m_consumed * (Level.BASE_POINTS + Level.s_number + (Level.s_coin_timer > 0 || m_id == ITEM_COIN ? Level.COIN_POINTS : Level.COMBO_POINTS));
if(m_id == ITEM_COIN) {
Level.s_coin_timer = TIME_COIN_DURATION;
}
//#else
//# score = m_consumed * m_consumed * (Level.BASE_POINTS + Level.s_number + (Level.s_coin_timer > 0 || m_id == ITEM_COIN ? Level.COIN_POINTS : Level.COMBO_POINTS));
//# if(m_id == ITEM_COIN) {
//# Level.s_coin_timer = TIME_COIN_DURATION;
//# }
//#endif
Level.s_current_score += score;
Particles.create(Particles.TYPE_POINTS_TEXT, Particles.LAYER_HUD, (m_x<<Engine.FP_SHIFT), (Level.s_player.m_y - 30 - m_consumed*2)<<Engine.FP_SHIFT, score);
if (m_id == ITEM_COIN)
Particles.create(Particles.TYPE_COIN_TEXT, Particles.LAYER_HUD, Engine.SCREEN_HALF_WIDTH<<Engine.FP_SHIFT, Engine.SCREEN_HALF_HEIGHT<<Engine.FP_SHIFT);
}
Level.s_total_jewels_caught++;
Particles.create(Particles.TYPE_GEM_COLLECT, Particles.LAYER_FOREGROUND, (m_x<<Engine.FP_SHIFT), (m_y<<Engine.FP_SHIFT));
}
else {
if(m_id == ITEM_WATERMELON) {
if(Level.s_player.m_powerup_id == ITEM_SEED) {
Level.s_player.m_powerup_ammo += AMMO_MELON;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -