X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgame.c;h=c1e87624b867bf3a92a53e976a1cbbd0bee2cd48;hb=ac4c028b525860750de315d626730ac493f56944;hp=9dca25854cf41ca1b13b79267f3d8323b54acaf4;hpb=0d0e1a63d6b14109b64805bcb1a45ddf469ba35d;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 9dca2585..c1e87624 100644 --- a/src/game.c +++ b/src/game.c @@ -533,21 +533,15 @@ static void InitGameEngine() }; static int ep_em_slippery_wall_num = SIZEOF_ARRAY_INT(ep_em_slippery_wall); + /* special EM style gems behaviour */ for (i=0; i VERSION_IDENT(2,0,1)) - Properties2[EL_EXPANDABLE_WALL_GROWING] |= EP_BIT_EM_SLIPPERY_WALL; - else - Properties2[EL_EXPANDABLE_WALL_GROWING] &=~EP_BIT_EM_SLIPPERY_WALL; + SET_PROPERTY(EL_EXPANDABLE_WALL_GROWING, EP_EM_SLIPPERY_WALL, + (level.em_slippery_gems && + game.engine_version > VERSION_IDENT(2,0,1))); } /* initialize changing elements information */ @@ -658,6 +652,8 @@ void InitGame() player->is_moving = FALSE; player->is_waiting = FALSE; + player->is_digging = FALSE; + player->is_collecting = FALSE; player->move_delay = game.initial_move_delay; player->move_delay_value = game.initial_move_delay_value; @@ -727,7 +723,7 @@ void InitGame() { Feld[x][y] = Ur[x][y]; MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0; - Store[x][y] = Store2[x][y] = StorePlayer[x][y] = 0; + Store[x][y] = Store2[x][y] = StorePlayer[x][y] = Back[x][y] = 0; AmoebaNr[x][y] = 0; JustStopped[x][y] = 0; Stop[x][y] = FALSE; @@ -917,7 +913,7 @@ void InitGame() else { DrawTextExt(drawto, DX + XX_EMERALDS, DY + YY_EMERALDS, - int2str(level_nr, 3), FONT_LEVEL_NUMBER, FONT_OPAQUE); + int2str(level_nr, 3), FONT_LEVEL_NUMBER, BLIT_OPAQUE); BlitBitmap(drawto, drawto, DX + XX_EMERALDS, DY + YY_EMERALDS + 1, getFontWidth(FONT_LEVEL_NUMBER) * 3, @@ -941,7 +937,7 @@ void InitGame() OpenDoor(DOOR_OPEN_ALL); - PlaySoundStereo(SND_GAME_STARTING, SOUND_MAX_RIGHT); + PlaySoundStereo(SND_GAME_STARTING, SOUND_MIDDLE); if (setup.sound_music) PlayMusic(level_nr); @@ -1097,20 +1093,20 @@ void GameWon() local_player->LevelSolved = FALSE; - PlaySoundStereo(SND_GAME_WINNING, SOUND_MAX_RIGHT); + PlaySoundStereo(SND_GAME_WINNING, SOUND_MIDDLE); if (TimeLeft) { if (!tape.playing && setup.sound_loops) - PlaySoundExt(SND_GAME_LEVELTIME_BONUS, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT, + PlaySoundExt(SND_GAME_LEVELTIME_BONUS, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_LOOP); while (TimeLeft > 0) { if (!tape.playing && !setup.sound_loops) - PlaySoundStereo(SND_GAME_LEVELTIME_BONUS, SOUND_MAX_RIGHT); + PlaySoundStereo(SND_GAME_LEVELTIME_BONUS, SOUND_MIDDLE); if (TimeLeft > 0 && !(TimeLeft % 10)) - RaiseScore(level.score[SC_ZEITBONUS]); + RaiseScore(level.score[SC_TIME_BONUS]); if (TimeLeft > 100 && !(TimeLeft % 10)) TimeLeft -= 10; else @@ -1128,15 +1124,15 @@ void GameWon() else if (level.time == 0) /* level without time limit */ { if (!tape.playing && setup.sound_loops) - PlaySoundExt(SND_GAME_LEVELTIME_BONUS, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT, + PlaySoundExt(SND_GAME_LEVELTIME_BONUS, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_LOOP); while (TimePlayed < 999) { if (!tape.playing && !setup.sound_loops) - PlaySoundStereo(SND_GAME_LEVELTIME_BONUS, SOUND_MAX_RIGHT); + PlaySoundStereo(SND_GAME_LEVELTIME_BONUS, SOUND_MIDDLE); if (TimePlayed < 999 && !(TimePlayed % 10)) - RaiseScore(level.score[SC_ZEITBONUS]); + RaiseScore(level.score[SC_TIME_BONUS]); if (TimePlayed < 900 && !(TimePlayed % 10)) TimePlayed += 10; else @@ -1382,6 +1378,7 @@ static int MovingOrBlocked2ElementIfNotLeaving(int x, int y) static void RemoveField(int x, int y) { Feld[x][y] = EL_EMPTY; + GfxElement[x][y] = EL_UNDEFINED; MovPos[x][y] = 0; MovDir[x][y] = 0; MovDelay[x][y] = 0; @@ -1436,13 +1433,18 @@ void DrawDynamite(int x, int y) if (!IN_SCR_FIELD(sx, sy) || IS_PLAYER(x, y)) return; - if (Store[x][y]) + if (IS_WALKABLE_INSIDE(Back[x][y])) + return; + + if (Back[x][y]) + DrawGraphic(sx, sy, el2img(Back[x][y]), 0); + else if (Store[x][y]) DrawGraphic(sx, sy, el2img(Store[x][y]), 0); frame = getGraphicAnimationFrame(graphic, GfxFrame[x][y]); #if 1 - if (Store[x][y]) + if (Back[x][y] || Store[x][y]) DrawGraphicThruMask(sx, sy, graphic, frame); else DrawGraphic(sx, sy, graphic, frame); @@ -1503,6 +1505,10 @@ void Explode(int ex, int ey, int phase, int mode) { int center_element = Feld[ex][ey]; + /* remove things displayed in background while burning dynamite */ + if (!IS_INDESTRUCTIBLE(Back[ex][ey])) + Back[ex][ey] = 0; + if (IS_MOVING(ex, ey) || IS_BLOCKED(ex, ey)) { /* put moving element to center field (and let it explode there) */ @@ -1528,7 +1534,10 @@ void Explode(int ex, int ey, int phase, int mode) RemoveMovingField(x, y); } - if (IS_INDESTRUCTIBLE(element) || element == EL_FLAMES) + if ((IS_INDESTRUCTIBLE(element) && + (game.engine_version < VERSION_IDENT(2,2,0) || + (!IS_WALKABLE_OVER(element) && !IS_WALKABLE_UNDER(element)))) || + element == EL_FLAMES) continue; if (IS_PLAYER(x, y) && SHIELD_ON(PLAYERINFO(x, y))) @@ -1543,6 +1552,11 @@ void Explode(int ex, int ey, int phase, int mode) continue; } + /* save walkable background elements while explosion on same tile */ + if (IS_INDESTRUCTIBLE(element)) + Back[x][y] = element; + + /* ignite explodable elements reached by other explosion */ if (element == EL_EXPLOSION) element = Store2[x][y]; @@ -1598,7 +1612,7 @@ void Explode(int ex, int ey, int phase, int mode) Store[x][y] = EL_PEARL; else if (element == EL_WALL_CRYSTAL) Store[x][y] = EL_CRYSTAL; - else if (!IS_PFORTE(Store[x][y])) + else Store[x][y] = EL_EMPTY; if (x != ex || y != ey || @@ -1615,6 +1629,7 @@ void Explode(int ex, int ey, int phase, int mode) } Feld[x][y] = EL_EXPLOSION; + GfxElement[x][y] = EL_UNDEFINED; MovDir[x][y] = MovPos[x][y] = 0; AmoebaNr[x][y] = 0; ExplodePhase[x][y] = 1; @@ -1668,6 +1683,11 @@ void Explode(int ex, int ey, int phase, int mode) element = Feld[x][y] = Store[x][y]; Store[x][y] = Store2[x][y] = 0; + + if (Back[x][y] && IS_INDESTRUCTIBLE(Back[x][y])) + element = Feld[x][y] = Back[x][y]; + Back[x][y] = 0; + MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = 0; InitField(x, y, FALSE); if (CAN_MOVE(element) || COULD_MOVE(element)) @@ -1686,14 +1706,19 @@ void Explode(int ex, int ey, int phase, int mode) int frame = getGraphicAnimationFrame(graphic, phase - delay); if (phase == delay) - DrawCrumbledSand(SCREENX(x), SCREENY(y)); + DrawLevelFieldCrumbledSand(x, y); - if (IS_PFORTE(Store[x][y])) + if (IS_WALKABLE_OVER(Back[x][y])) { - DrawLevelElement(x, y, Store[x][y]); + DrawLevelElement(x, y, Back[x][y]); DrawGraphicThruMask(SCREENX(x), SCREENY(y), graphic, frame); } - else + else if (IS_WALKABLE_UNDER(Back[x][y])) + { + DrawGraphic(SCREENX(x), SCREENY(y), graphic, frame); + DrawLevelElementThruMask(x, y, Back[x][y]); + } + else if (!IS_WALKABLE_INSIDE(Back[x][y])) DrawGraphic(SCREENX(x), SCREENY(y), graphic, frame); } } @@ -1822,6 +1847,26 @@ void SplashAcid(int x, int y) } } +static int ChangeElementOnPlayfield(int element_old, int element_new) +{ + int x, y; + int num_changes = 0; + + for(y=0; yprogrammed_action = MV_DOWN; } } +/* + MoveFigureOneStep() + ----------------------------------------------------------------------------- + dx, dy: direction (non-diagonal) to try to move the player to + real_dx, real_dy: direction as read from input device (can be diagonal) +*/ + boolean MoveFigureOneStep(struct PlayerInfo *player, int dx, int dy, int real_dx, int real_dy) { @@ -5251,7 +5307,7 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy) else if (old_jx == jx && old_jy != jy) player->MovDir = (old_jy < jy ? MV_DOWN : MV_UP); - DrawLevelField(jx, jy); /* for "DrawCrumbledSand()" */ + DrawLevelField(jx, jy); /* for "crumbled sand" */ player->last_move_dir = player->MovDir; player->is_moving = TRUE; @@ -5311,7 +5367,7 @@ void ScrollFigure(struct PlayerInfo *player, int mode) if (player->MovPos == 0) { - if (IS_QUICK_GATE(Feld[last_jx][last_jy])) + if (IS_PASSABLE(Feld[last_jx][last_jy])) { /* continue with normal speed after quickly moving through gate */ HALVE_PLAYER_SPEED(player); @@ -5599,8 +5655,8 @@ void KillHero(struct PlayerInfo *player) if (!player->active) return; - if (IS_PFORTE(Feld[jx][jy])) - Feld[jx][jy] = EL_EMPTY; + /* remove accessible field at the player's position */ + Feld[jx][jy] = EL_EMPTY; /* deactivate shield (else Bang()/Explode() would not work right) */ player->shield_normal_time_left = 0; @@ -5652,6 +5708,25 @@ void RemoveHero(struct PlayerInfo *player) ExitY = ZY = jy; } +#if 0 +/* + checkDiagonalPushing() + ----------------------------------------------------------------------------- + check if diagonal input device direction results in pushing of object +*/ + +static boolean checkDiagonalPushing(int x, int y, int real_dx, int real_dy) +{ +} +#endif + +/* + DigField() + ----------------------------------------------------------------------------- + x, y: field next to player (non-diagonal) to try to dig to + real_dx, real_dy: direction as read from input device (can be diagonal) +*/ + int DigField(struct PlayerInfo *player, int x, int y, int real_dx, int real_dy, int mode) { @@ -5664,7 +5739,10 @@ int DigField(struct PlayerInfo *player, int element; if (player->MovPos == 0) + { player->is_digging = FALSE; + player->is_collecting = FALSE; + } if (player->MovPos == 0) player->Pushing = FALSE; @@ -5721,11 +5799,14 @@ int DigField(struct PlayerInfo *player, case EL_SP_BASE: case EL_SP_BUGGY_BASE: case EL_SP_BUGGY_BASE_ACTIVATING: + RemoveField(x, y); #if 1 - if (mode != DF_SNAP && element == EL_SAND) - GfxElement[x][y] = Feld[x][y]; + if (mode != DF_SNAP && element != EL_EMPTY) + { + GfxElement[x][y] = (CAN_BE_CRUMBLED(element) ? EL_SAND : element); + player->is_digging = TRUE; + } #endif - RemoveField(x, y); PlaySoundLevelElementAction(x, y, element, ACTION_DIGGING); break; @@ -5739,6 +5820,13 @@ int DigField(struct PlayerInfo *player, case EL_PEARL: case EL_CRYSTAL: RemoveField(x, y); +#if 1 + if (mode != DF_SNAP) + { + GfxElement[x][y] = element; + player->is_collecting = TRUE; + } +#endif local_player->gems_still_needed -= (element == EL_DIAMOND ? 3 : element == EL_PEARL ? 5 : element == EL_CRYSTAL ? 8 : 1); @@ -5768,7 +5856,7 @@ int DigField(struct PlayerInfo *player, TimeLeft += 10; DrawText(DX_TIME, DY_TIME, int2str(TimeLeft, 3), FONT_TEXT_2); } - PlaySoundStereo(SND_EXTRA_TIME_COLLECTING, SOUND_MAX_RIGHT); + PlaySoundStereo(SND_EXTRA_TIME_COLLECTING, SOUND_MIDDLE); break; case EL_SHIELD_NORMAL: @@ -5824,6 +5912,8 @@ int DigField(struct PlayerInfo *player, { int key_nr = element - EL_KEY_1; int graphic = el2edimg(element); + int element_old, element_new; + int num_changes; RemoveField(x, y); player->key[key_nr] = TRUE; @@ -5833,6 +5923,34 @@ int DigField(struct PlayerInfo *player, DrawMiniGraphicExt(window, DX_KEYS + key_nr * MINI_TILEX, DY_KEYS, graphic); PlaySoundLevel(x, y, SND_CLASS_KEY_COLLECTING); + + element_old = EL_GATE_1_CLOSED + key_nr; + element_new = EL_GATE_1_OPEN + key_nr; + num_changes = ChangeElementOnPlayfield(element_old, element_new); + if (num_changes > 0) + PlaySoundLevelElementAction(x, y, element_old, ACTION_OPENING); + + element_old = EL_GATE_1_GRAY_CLOSED + key_nr; + element_new = EL_GATE_1_GRAY_OPEN + key_nr; + num_changes = ChangeElementOnPlayfield(element_old, element_new); + if (num_changes > 0) + PlaySoundLevelElementAction(x, y, element_old, ACTION_OPENING); + + if (game.engine_version < VERSION_IDENT(2,2,0)) + { + element_old = EL_EM_GATE_1_CLOSED + key_nr; + element_new = EL_EM_GATE_1_OPEN + key_nr; + num_changes = ChangeElementOnPlayfield(element_old, element_new); + if (num_changes > 0) + PlaySoundLevelElementAction(x, y, element_old, ACTION_OPENING); + + element_old = EL_EM_GATE_1_GRAY_CLOSED + key_nr; + element_new = EL_EM_GATE_1_GRAY_OPEN + key_nr; + num_changes = ChangeElementOnPlayfield(element_old, element_new); + if (num_changes > 0) + PlaySoundLevelElementAction(x, y, element_old, ACTION_OPENING); + } + break; } @@ -5843,6 +5961,8 @@ int DigField(struct PlayerInfo *player, { int key_nr = element - EL_EM_KEY_1; int graphic = el2edimg(EL_KEY_1 + key_nr); + int element_old, element_new; + int num_changes; RemoveField(x, y); player->key[key_nr] = TRUE; @@ -5852,6 +5972,34 @@ int DigField(struct PlayerInfo *player, DrawMiniGraphicExt(window, DX_KEYS + key_nr * MINI_TILEX, DY_KEYS, graphic); PlaySoundLevel(x, y, SND_CLASS_KEY_COLLECTING); + + element_old = EL_EM_GATE_1_CLOSED + key_nr; + element_new = EL_EM_GATE_1_OPEN + key_nr; + num_changes = ChangeElementOnPlayfield(element_old, element_new); + if (num_changes > 0) + PlaySoundLevelElementAction(x, y, element_old, ACTION_OPENING); + + element_old = EL_EM_GATE_1_GRAY_CLOSED + key_nr; + element_new = EL_EM_GATE_1_GRAY_OPEN + key_nr; + num_changes = ChangeElementOnPlayfield(element_old, element_new); + if (num_changes > 0) + PlaySoundLevelElementAction(x, y, element_old, ACTION_OPENING); + + if (game.engine_version < VERSION_IDENT(2,2,0)) + { + element_old = EL_GATE_1_CLOSED + key_nr; + element_new = EL_GATE_1_OPEN + key_nr; + num_changes = ChangeElementOnPlayfield(element_old, element_new); + if (num_changes > 0) + PlaySoundLevelElementAction(x, y, element_old, ACTION_OPENING); + + element_old = EL_GATE_1_GRAY_CLOSED + key_nr; + element_new = EL_GATE_1_GRAY_OPEN + key_nr; + num_changes = ChangeElementOnPlayfield(element_old, element_new); + if (num_changes > 0) + PlaySoundLevelElementAction(x, y, element_old, ACTION_OPENING); + } + break; } @@ -6022,28 +6170,34 @@ int DigField(struct PlayerInfo *player, PlaySoundLevelElementAction(x, y, element, ACTION_PUSHING); break; - case EL_GATE_1: - case EL_GATE_2: - case EL_GATE_3: - case EL_GATE_4: + case EL_GATE_1_OPEN: + case EL_GATE_2_OPEN: + case EL_GATE_3_OPEN: + case EL_GATE_4_OPEN: +#if 0 if (!player->key[element - EL_GATE_1]) return MF_NO_ACTION; +#endif break; - case EL_GATE_1_GRAY: - case EL_GATE_2_GRAY: - case EL_GATE_3_GRAY: - case EL_GATE_4_GRAY: + case EL_GATE_1_GRAY_OPEN: + case EL_GATE_2_GRAY_OPEN: + case EL_GATE_3_GRAY_OPEN: + case EL_GATE_4_GRAY_OPEN: +#if 0 if (!player->key[element - EL_GATE_1_GRAY]) return MF_NO_ACTION; +#endif break; - case EL_EM_GATE_1: - case EL_EM_GATE_2: - case EL_EM_GATE_3: - case EL_EM_GATE_4: + case EL_EM_GATE_1_OPEN: + case EL_EM_GATE_2_OPEN: + case EL_EM_GATE_3_OPEN: + case EL_EM_GATE_4_OPEN: +#if 0 if (!player->key[element - EL_EM_GATE_1]) return MF_NO_ACTION; +#endif if (!IN_LEV_FIELD(x + dx, y + dy) || !IS_FREE(x + dx, y + dy)) return MF_NO_ACTION; @@ -6051,15 +6205,21 @@ int DigField(struct PlayerInfo *player, player->programmed_action = move_direction; DOUBLE_PLAYER_SPEED(player); +#if 1 + PlaySoundLevelAction(x, y, ACTION_PASSING); +#else PlaySoundLevel(x, y, SND_CLASS_GATE_PASSING); +#endif break; - case EL_EM_GATE_1_GRAY: - case EL_EM_GATE_2_GRAY: - case EL_EM_GATE_3_GRAY: - case EL_EM_GATE_4_GRAY: + case EL_EM_GATE_1_GRAY_OPEN: + case EL_EM_GATE_2_GRAY_OPEN: + case EL_EM_GATE_3_GRAY_OPEN: + case EL_EM_GATE_4_GRAY_OPEN: +#if 0 if (!player->key[element - EL_EM_GATE_1_GRAY]) return MF_NO_ACTION; +#endif if (!IN_LEV_FIELD(x + dx, y + dy) || !IS_FREE(x + dx, y + dy)) return MF_NO_ACTION; @@ -6087,16 +6247,16 @@ int DigField(struct PlayerInfo *player, break; case EL_SP_PORT_LEFT: - case EL_SP_GRAVITY_PORT_LEFT: case EL_SP_PORT_RIGHT: - case EL_SP_GRAVITY_PORT_RIGHT: case EL_SP_PORT_UP: - case EL_SP_GRAVITY_PORT_UP: case EL_SP_PORT_DOWN: - case EL_SP_GRAVITY_PORT_DOWN: case EL_SP_PORT_HORIZONTAL: case EL_SP_PORT_VERTICAL: case EL_SP_PORT_ANY: + case EL_SP_GRAVITY_PORT_LEFT: + case EL_SP_GRAVITY_PORT_RIGHT: + case EL_SP_GRAVITY_PORT_UP: + case EL_SP_GRAVITY_PORT_DOWN: if ((dx == -1 && element != EL_SP_PORT_LEFT && element != EL_SP_GRAVITY_PORT_LEFT && @@ -6202,7 +6362,7 @@ int DigField(struct PlayerInfo *player, TimeLeft += 10; DrawText(DX_TIME, DY_TIME, int2str(TimeLeft, 3), FONT_TEXT_2); DrawLevelField(x, y); - PlaySoundStereo(SND_TIME_ORB_FULL_COLLECTING, SOUND_MAX_RIGHT); + PlaySoundStereo(SND_TIME_ORB_FULL_COLLECTING, SOUND_MIDDLE); return MF_ACTION; break; @@ -6368,8 +6528,8 @@ int DigField(struct PlayerInfo *player, player->push_delay = 0; - if (Feld[x][y] != element) /* really digged something */ - player->is_digging = TRUE; + if (Feld[x][y] != element) /* really digged/collected something */ + player->is_collecting = !player->is_digging; return MF_MOVING; } @@ -6393,7 +6553,10 @@ boolean SnapField(struct PlayerInfo *player, int dx, int dy) player->snapped = FALSE; if (player->MovPos == 0) + { player->is_digging = FALSE; + player->is_collecting = FALSE; + } return FALSE; } @@ -6411,6 +6574,8 @@ boolean SnapField(struct PlayerInfo *player, int dx, int dy) player->snapped = TRUE; player->is_digging = FALSE; + player->is_collecting = FALSE; + DrawLevelField(x, y); BackToFront(); @@ -6432,7 +6597,13 @@ boolean PlaceBomb(struct PlayerInfo *player) return FALSE; if (element != EL_EMPTY) + { +#if 0 Store[jx][jy] = element; +#else + Back[jx][jy] = element; +#endif + } MovDelay[jx][jy] = 96; @@ -6595,22 +6766,22 @@ void RaiseScoreElement(int element) case EL_EMERALD_YELLOW: case EL_EMERALD_RED: case EL_EMERALD_PURPLE: - RaiseScore(level.score[SC_EDELSTEIN]); + RaiseScore(level.score[SC_EMERALD]); break; case EL_DIAMOND: - RaiseScore(level.score[SC_DIAMANT]); + RaiseScore(level.score[SC_DIAMOND]); break; case EL_BUG: case EL_BD_BUTTERFLY: - RaiseScore(level.score[SC_KAEFER]); + RaiseScore(level.score[SC_BUG]); break; case EL_SPACESHIP: case EL_BD_FIREFLY: - RaiseScore(level.score[SC_FLIEGER]); + RaiseScore(level.score[SC_SPACESHIP]); break; case EL_YAMYAM: case EL_DARK_YAMYAM: - RaiseScore(level.score[SC_MAMPFER]); + RaiseScore(level.score[SC_YAMYAM]); break; case EL_ROBOT: RaiseScore(level.score[SC_ROBOT]); @@ -6619,16 +6790,16 @@ void RaiseScoreElement(int element) RaiseScore(level.score[SC_PACMAN]); break; case EL_NUT: - RaiseScore(level.score[SC_KOKOSNUSS]); + RaiseScore(level.score[SC_NUT]); break; case EL_DYNAMITE: - RaiseScore(level.score[SC_DYNAMIT]); + RaiseScore(level.score[SC_DYNAMITE]); break; case EL_KEY_1: case EL_KEY_2: case EL_KEY_3: case EL_KEY_4: - RaiseScore(level.score[SC_SCHLUESSEL]); + RaiseScore(level.score[SC_KEY]); break; default: break;