完善钻石宝箱王相关逻辑,细节待优化

This commit is contained in:
LingASDJ 2023-04-26 16:32:57 +08:00
parent 6749aca860
commit 645b53bab7
8 changed files with 227 additions and 88 deletions

View File

@ -3,6 +3,13 @@
actors.mobs.bosses.diamondknight.name=宝箱之王
actors.mobs.bosses.diamondknight.desc=拟态的最终结果就是无限接近人类。\n原本作用拟形的钻石宝箱外壳化作盔甲包裹住如王般的内在。\n衪是所有拟形怪的王——至少衪是这么认为的。\n王会战斗到最后一刻直到粉身碎骨。
actors.mobs.bosses.diamondknight.notice=你杀了我很多的子嗣,你理应用你的命来赎罪!
actors.mobs.bosses.diamondknight.now_go=真是有趣的家伙,本王带你看看我的宝藏迷宫吧。
actors.mobs.bosses.diamondknight.war_go=很久没有这么热血沸腾了!挑战者,或许你真的是这里唯一的光芒
actors.mobs.bosses.diamondknight.iswar_go=最大的敌人往往就是你自己,准备好和自己决一死战了吗?
actors.mobs.bosses.diamondknight.ok_go=好吧,让我们以最纯朴的战斗结束这次的较量吧。
actors.mobs.bosses.diamondknight.defeated=真是一场有趣的战斗,挑战者,这次就算你赢了!
actors.mobs.salamander.name=深蓝蝾螈
actors.mobs.salamander.desc=来自森林的小生物,由于下方的邪恶力量侵蚀,它们已经由温顺变得凶猛。\n它们锋利的尾巴能穿透敌人它们十分的聪明且极其灵活必须趁其不备将之杀掉。

Binary file not shown.

View File

@ -49,6 +49,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Amulet;
import com.shatteredpixel.shatteredpixeldungeon.items.Ankh;
import com.shatteredpixel.shatteredpixeldungeon.items.BrokenSeal;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.KingsCrown;
import com.shatteredpixel.shatteredpixeldungeon.items.TengusMask;
import com.shatteredpixel.shatteredpixeldungeon.items.Waterskin;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor;
@ -78,6 +79,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.elixirs.WaterSoul;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.MIME;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.MetalShard;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfFlameCursed;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfLullaby;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping;
@ -216,7 +218,8 @@ public enum HeroClass {
new PotionOfLiquidFlameX().quantity(100).identify().collect();
new YellowSunBooks().quantity(1).identify().collect();
new BrokenBooks().quantity(44).identify().collect();
new ScrollOfFlameCursed().quantity(44).identify().collect();
new KingsCrown().quantity(1).identify().collect();
new MIME.GOLD_ONE().quantity(1).identify().collect();
new MIME.GOLD_TWO().quantity(1).identify().collect();
new MIME.GOLD_THREE().quantity(1).identify().collect();

View File

@ -21,10 +21,13 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses;
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.levels.Level.set;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Boss;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
@ -32,13 +35,10 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Degrade;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Ooze;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.ColdMagicRat;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.SkeletonKey;
import com.shatteredpixel.shatteredpixeldungeon.items.quest.GooBlob;
import com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@ -49,10 +49,10 @@ import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.Camera;
import com.watabou.noosa.audio.Sample;
import com.watabou.utils.Bundle;
import com.watabou.utils.PathFinder;
import com.watabou.utils.Random;
public class DiamondKnight extends Boss {
public int armTier;
private static final float TIME_TO_ZAP = 3f;
{
initProperty();
@ -60,6 +60,7 @@ public class DiamondKnight extends Boss {
initStatus(80);
EXP = 10;
defenseSkill = 8;
spriteClass = DimandKingSprite.class;
properties.add(Property.BOSS);
@ -68,14 +69,19 @@ public class DiamondKnight extends Boss {
}
private int pumpedUp = 0;
private int phase;
public int phase;
private int healInc = 1;
@Override
public int damageRoll() {
int min = 1;
int max = (HP*2 <= HT) ? 12 : 8;
if (pumpedUp > 0) {
//模仿玩家的伤害
ColdChestBossLevel.State level = ((ColdChestBossLevel)Dungeon.level).pro();
if (level == ColdChestBossLevel.State.VSYOU_START){
return hero.damageRoll();
} else if (pumpedUp > 0) {
pumpedUp = 0;
return Random.NormalIntRange( min*3, max*3 );
} else {
@ -91,10 +97,10 @@ public class DiamondKnight extends Boss {
return attack;
}
@Override
public boolean isInvulnerable(Class effect) {
return this.HP==360;
}
// @Override
// public boolean isInvulnerable(Class effect) {
// return this.HP==360;
// }
@Override
public int defenseSkill(Char enemy) {
@ -103,36 +109,11 @@ public class DiamondKnight extends Boss {
@Override
public int drRoll() {
return Random.NormalIntRange(0, 2);
return Random.NormalIntRange(5,9);
}
@Override
public boolean act() {
if (Dungeon.level.water[pos] && HP < HT) {
HP += healInc;
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
if (lock != null) lock.removeTime(healInc*2);
if (Dungeon.level.heroFOV[pos] ){
sprite.emitter().burst( Speck.factory( Speck.HEALING ), healInc );
}
if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES) && healInc < 3) {
healInc++;
}
if (HP*2 > HT) {
BossHealthBar.bleed(false);
HP = Math.min(HP, HT);
}
} else {
healInc = 1;
}
if (state != SLEEPING){
Dungeon.level.seal();
}
return super.act();
}
@ -152,10 +133,10 @@ public class DiamondKnight extends Boss {
@Override
public int attackProc( Char enemy, int damage ) {
damage = super.attackProc( enemy, damage );
if (Random.Int( 3 ) == 0) {
Buff.affect( enemy, Ooze.class ).set( Ooze.DURATION );
enemy.sprite.burst( 0x000000, 5 );
}
// if (Random.Int( 3 ) == 0) {
// Buff.affect( enemy, Ooze.class ).set( Ooze.DURATION );
// enemy.sprite.burst( 0x000000, 5 );
// }
if (pumpedUp > 0) {
Camera.main.shake( 3, 0.2f );
@ -187,19 +168,46 @@ public class DiamondKnight extends Boss {
Dungeon.level.seal();
}
super.damage(dmg, src);
LockedFloor lock = Dungeon.hero.buff(LockedFloor.class);
LockedFloor lock = hero.buff(LockedFloor.class);
if (lock != null) lock.addTime(dmg*2);
ColdChestBossLevel.State level = ((ColdChestBossLevel)Dungeon.level).pro();
//血量低于360后追加phase并加载楼层的进度方法
if (level == ColdChestBossLevel.State.START && this.HP < 360 && phase == 0) {
GLog.n("让这场游戏变得更加有趣吧");
//血量低于360后追加phase并加载楼层的进度方法,加载迷宫
if (level == ColdChestBossLevel.State.START && this.HP <= 360 && phase == 0) {
GLog.n(Messages.get(DiamondKnight.class,"now_go"));
GameScene.flash(0x808080);
((ColdChestBossLevel)Dungeon.level).progress();
phase++;
} else if(level == ColdChestBossLevel.State.MAZE_START && this.HP < 360 && phase == 1) {
GLog.n("让这场游戏变得更加有d趣吧");
//血量低于300加载第三场景
} else if(level == ColdChestBossLevel.State.MAZE_START && this.HP <= 300 && phase == 1) {
GLog.n(Messages.get(DiamondKnight.class,"war_go"));
GameScene.flash(0x808080);
((ColdChestBossLevel)Dungeon.level).progress();
phase++;
} else if (level == ColdChestBossLevel.State.VSBOSS_START && this.HP <= 240 && phase == 2) {
((ColdChestBossLevel)Dungeon.level).progress();
phase++;
//血量低于200后变成玩家的样子伤害和防御数值与玩家一致
} else if (level == ColdChestBossLevel.State.VSLINK_START && this.HP <= 200 && phase == 3) {
GLog.n(Messages.get(DiamondKnight.class,"iswar_go"));
GameScene.flash(0x808080);
((ColdChestBossLevel)Dungeon.level).progress();
spriteClass=DimandKingSprite.PrismaticSprite.class;
ShatteredPixelDungeon.resetScene();
GameScene.flash(0x888888);
phase++;
//血量低于100后变回来基础伤害二连击
} else if (level == ColdChestBossLevel.State.VSYOU_START && this.HP <= 100 && phase == 4) {
GLog.n(Messages.get(DiamondKnight.class,"ok_go"));
GameScene.flash(0x808080);
spriteClass=DimandKingSprite.class;
ShatteredPixelDungeon.resetScene();
GameScene.flash(0x888888);
((ColdChestBossLevel)Dungeon.level).progress();
phase++;
}
}
@ -209,29 +217,22 @@ public class DiamondKnight extends Boss {
super.die( cause );
if(Dungeon.depth!=28){
Dungeon.level.unseal();
Dungeon.level.unseal();
GetBossLoot();
phase++;
GameScene.bossSlain();
Dungeon.level.drop( new SkeletonKey( Dungeon.depth ), pos ).sprite.drop();
GameScene.bossSlain();
//60% chance of 2 blobs, 30% chance of 3, 10% chance for 4. Average of 2.5
int blobs = Random.chances(new float[]{0, 0, 6, 3, 1});
for (int i = 0; i < blobs; i++){
int ofs;
do {
ofs = PathFinder.NEIGHBOURS8[Random.Int(8)];
} while (!Dungeon.level.passable[pos + ofs]);
Dungeon.level.drop( new GooBlob(), pos + ofs ).sprite.drop( pos );
}
//入口
set( 647, Terrain.EXIT );
GameScene.updateMap( 647 );
Badges.validateBossSlain();
yell( Messages.get(this, "defeated") );
}
//出口
set( 52, Terrain.ENTRANCE );
GameScene.updateMap( 52 );
Badges.validateBossSlain();
yell( Messages.get(this, "defeated") );
}
@Override
@ -254,16 +255,21 @@ public class DiamondKnight extends Boss {
private static final String PHASE ="dimandphase";
@Override
public void storeInBundle( Bundle bundle ) {
super.storeInBundle( bundle );
phase = bundle.getInt(PHASE);
bundle.put( PUMPEDUP , pumpedUp );
bundle.put( HEALINC, healInc );
if(phase == 5) {
spriteClass=DimandKingSprite.PrismaticSprite.class;
} else {
spriteClass=DimandKingSprite.class;
}
}
@Override
public void restoreFromBundle( Bundle bundle ) {
super.restoreFromBundle( bundle );
bundle.put(PHASE,phase);
pumpedUp = bundle.getInt( PUMPEDUP );
@ -273,6 +279,12 @@ public class DiamondKnight extends Boss {
//if check is for pre-0.9.3 saves
healInc = bundle.getInt(HEALINC);
if(phase == 5) {
spriteClass=DimandKingSprite.PrismaticSprite.class;
} else {
spriteClass=DimandKingSprite.class;
}
}
private void zap() {
@ -280,7 +292,7 @@ public class DiamondKnight extends Boss {
if (hit( this, enemy, true )) {
//TODO would be nice for this to work on ghost/statues too
if (enemy == Dungeon.hero && Random.Int( 2 ) == 0) {
if (enemy == hero && Random.Int( 2 ) == 0) {
Buff.prolong( enemy, Blindness.class, Degrade.DURATION );
Sample.INSTANCE.play( Assets.Sounds.DEBUFF );
}
@ -288,7 +300,7 @@ public class DiamondKnight extends Boss {
int dmg = Random.NormalIntRange( 10, 12 );
enemy.damage( dmg, new ColdMagicRat.DarkBolt() );
if (enemy == Dungeon.hero && !enemy.isAlive()) {
if (enemy == hero && !enemy.isAlive()) {
Dungeon.fail( getClass() );
GLog.n( Messages.get(this, "frost_kill") );
}

View File

@ -4,6 +4,10 @@ import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel.State.GO_START;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel.State.MAZE_START;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel.State.START;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel.State.VSBOSS_START;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel.State.VSLINK_START;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel.State.VSYOU_START;
import static com.shatteredpixel.shatteredpixeldungeon.levels.ColdChestBossLevel.State.WIN;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
@ -43,9 +47,9 @@ public class ColdChestBossLevel extends Level {
GO_START,
START,
MAZE_START,
MAZECOMPLE,
VSBOSS_START,
FIND_START,
VSLINK_START,
VSYOU_START,
WIN
}
@ -90,8 +94,8 @@ public class ColdChestBossLevel extends Level {
W,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,W,P,W,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,W,
W,E,E,E,E,E,P,E,W,W,W,W,E,E,E,E,W,P,W,E,E,E,E,W,W,W,W,E,P,E,E,E,E,E,W,
W,E,E,E,E,E,E,E,W,K,K,W,W,W,W,W,W,D,W,W,W,W,W,W,K,K,W,E,E,E,E,E,E,E,W,
W,E,E,E,E,E,P,E,W,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,W,E,P,E,E,E,E,E,W,
W,E,E,E,E,E,E,E,W,K,K,K,K,K,K,K,K,O,K,K,K,K,K,K,K,K,W,E,E,E,E,E,E,E,W,
W,E,E,E,E,E,P,E,W,K,K,K,K,K,K,K,W,K,W,K,K,K,K,K,K,K,W,E,P,E,E,E,E,E,W,
W,E,E,E,E,E,E,E,W,K,K,K,K,K,K,K,W,O,W,K,K,K,K,K,K,K,W,E,E,E,E,E,E,E,W,
W,W,W,W,W,W,W,W,W,K,K,K,K,K,K,K,O,O,O,K,K,K,K,K,K,K,W,W,W,W,W,W,W,W,W,
W,B,B,B,B,B,B,B,W,K,K,K,K,K,K,O,O,O,O,O,K,K,K,K,K,K,W,B,B,B,B,B,B,B,W,
W,B,K,K,K,K,K,B,W,K,K,K,K,K,O,O,O,K,O,O,O,K,K,K,K,K,W,B,K,K,K,K,K,B,W,
@ -249,6 +253,8 @@ public class ColdChestBossLevel extends Level {
GameScene.updateMap( getBossDoor );
set( HOME, Terrain.EMPTY );
GameScene.updateMap( HOME );
set( 1102, Terrain.EMPTY );
GameScene.updateMap( 1102 );
Dungeon.observe();
pro = START;
break;
@ -256,14 +262,14 @@ public class ColdChestBossLevel extends Level {
//血量低于360后且在START枚举中
for (Mob boss : Dungeon.level.mobs.toArray(new Mob[0])) {
if(boss instanceof DiamondKnight) {
//如果楼层为开始且boss血量小于360 阶段
if (pro == START && boss.HP < 360) {
//如果楼层为开始且boss血量小于360 1阶段
if (pro == START && boss.HP <= 360) {
//动态修改整个房间
changeMap(EndMap);
changeMap(MazeRoom);
//宝箱王移动到看戏位
// ScrollOfTeleportation.appear(boss, MDX);
// //玩家移动到初始位
// ScrollOfTeleportation.appear(hero, STARTPOS);
ScrollOfTeleportation.appear(boss, MDX);
//玩家移动到初始位
ScrollOfTeleportation.appear(hero, STARTPOS);
boss.HP = 360;
pro = MAZE_START;
}
@ -271,7 +277,56 @@ public class ColdChestBossLevel extends Level {
}
break;
case MAZE_START:
//血量低于300后且在MAZE_START枚举中
for (Mob boss : Dungeon.level.mobs.toArray(new Mob[0])) {
if(boss instanceof DiamondKnight) {
//如果楼层为开始且boss血量小于300 2阶段
if (pro == MAZE_START && boss.HP <= 300) {
//动态修改整个房间 宝藏迷宫
changeMap(EndMap);
ScrollOfTeleportation.appear(boss,647);
//玩家移动到初始位
ScrollOfTeleportation.appear(hero, 962);
boss.HP = 300;
pro = VSBOSS_START;
}
}
}
break;
case VSBOSS_START:
for (Mob boss : Dungeon.level.mobs.toArray(new Mob[0])) {
if(boss instanceof DiamondKnight) {
//如果楼层为开始且boss血量小于240 3阶段
if (pro == VSBOSS_START && boss.HP <= 240) {
boss.HP = 240;
pro = VSLINK_START;
}
}
}
break;
case VSLINK_START:
for (Mob boss : Dungeon.level.mobs.toArray(new Mob[0])) {
if(boss instanceof DiamondKnight) {
//如果楼层为开始且boss血量小于200 4阶段
if (pro == VSLINK_START && boss.HP <= 200) {
pro = VSYOU_START;
}
}
}
break;
case VSYOU_START:
//血量低于300后且在MAZE_START枚举中
for (Mob boss : Dungeon.level.mobs.toArray(new Mob[0])) {
if(boss instanceof DiamondKnight) {
//如果楼层为开始且boss血量小于100 判定WIN
if (pro == VSYOU_START && boss.HP <= 100) {
pro = WIN;
}
}
}
break;
case WIN:
//
break;
}
}
@ -280,6 +335,9 @@ public class ColdChestBossLevel extends Level {
protected void createMobs() {
}
//keep track of removed items as the level is changed. Dump them back into the level at the end.
private static final int getBossDoor = WIDTH*11+17;
private static final int LDBossDoor = WIDTH*12+17;

View File

@ -103,6 +103,9 @@ import java.util.HashSet;
public abstract class Level implements Bundlable {
//静态地图改变的轮子调用
public void changeMap(int[] map){
//构建全新地图通过MAPCSV构建并清理当前地块
@ -110,6 +113,11 @@ public abstract class Level implements Bundlable {
buildFlagMaps();
cleanWalls();
//清理掉落物
for (Heap heap : heaps.valueList()){
heap.destroy();
}
//自动获取出入口
exit = entrance = 0;
for (int i = 0; i < length(); i ++)
@ -133,7 +141,8 @@ public abstract class Level implements Bundlable {
GameScene.resetMap();
Dungeon.observe();
}
public static enum Feeling {
NONE,
CHASM,

View File

@ -72,7 +72,7 @@ public class InterlevelScene extends PixelScene {
private static float fadeTime;
public enum Mode {
DESCEND, ASCEND, CONTINUE, RESURRECT, RETURN, FALL, RESET, NONE,EXBOSS,GOBACK,FRGIRLBOSS,
DESCEND, ASCEND, CONTINUE, RESURRECT, RETURN, FALL, RESET, NONE,EXBOSS,GOBACK,FRGIRLBOSS,DR,
}
public static Mode mode;

View File

@ -1,10 +1,12 @@
package com.shatteredpixel.shatteredpixeldungeon.sprites;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.bosses.DiamondKnight;
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ElmoParticle;
import com.watabou.noosa.Game;
import com.watabou.noosa.TextureFilm;
import com.watabou.noosa.audio.Sample;
import com.watabou.noosa.particles.Emitter;
@ -47,6 +49,7 @@ public class DimandKingSprite extends MobSprite {
@Override
public void update() {
super.update();
if (teleParticles != null){
teleParticles.pos( this );
teleParticles.visible = visible;
@ -62,10 +65,6 @@ public class DimandKingSprite extends MobSprite {
}
}
public void teleParticles(boolean value){
if (teleParticles != null) teleParticles.on = value;
}
@Override
public synchronized void play(Animation anim, boolean force) {
if (teleParticles != null) teleParticles.on = false;
@ -108,5 +107,56 @@ public class DimandKingSprite extends MobSprite {
}
super.onComplete( anim );
}
public static class PrismaticSprite extends MobSprite {
private static final int FRAME_WIDTH = 12;
private static final int FRAME_HEIGHT = 15;
public PrismaticSprite() {
super();
texture( Dungeon.hero.heroClass.spritesheet() );
updateArmor( 0 );
idle();
}
@Override
public void link( Char ch ) {
super.link( ch );
updateArmor( ((DiamondKnight)ch).armTier );
}
public void updateArmor( int tier ) {
TextureFilm film = new TextureFilm( HeroSprite.tiers(), tier, FRAME_WIDTH, FRAME_HEIGHT );
idle = new Animation( 1, true );
idle.frames( film, 0, 0, 0, 1, 0, 0, 1, 1 );
run = new Animation( 20, true );
run.frames( film, 2, 3, 4, 5, 6, 7 );
die = new Animation( 20, false );
die.frames( film, 0 );
attack = new Animation( 15, false );
attack.frames( film, 13, 14, 15, 0 );
idle();
}
@Override
public void update() {
super.update();
if (flashTime <= 0) {
float interval = (Game.timeTotal % 9) / 3f;
tint(0,
interval > 1 ? Math.max(0.9f, 1 - interval) : interval,
interval < 1 ? Math.min(153 + interval * 72, 255) : Math.max(153 - (interval - 1) * 72, 128),
0.5f);
}
}
}
}