/* * Pixel Dungeon * Copyright (C) 2012-2015 Oleg Dolya * * Shattered Pixel Dungeon * Copyright (C) 2014-2016 Evan Debenham * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see */ package com.shatteredpixel.shatteredpixeldungeon.items.wands; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Light; import com.shatteredpixel.shatteredpixeldungeon.effects.Beam; import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter; import com.shatteredpixel.shatteredpixeldungeon.effects.Speck; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.RainbowParticle; import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShadowParticle; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.watabou.noosa.audio.Sample; import com.watabou.utils.Callback; import com.watabou.utils.PointF; import com.watabou.utils.Random; public class WandOfPrismaticLight extends DamageWand { { image = ItemSpriteSheet.WAND_PRISMATIC_LIGHT; collisionProperties = Ballistica.MAGIC_BOLT; } public int min(int lvl){ return 1+lvl; } public int max(int lvl){ return 5+3*lvl; } @Override protected void onZap(Ballistica beam) { Char ch = Actor.findChar(beam.collisionPos); if (ch != null){ processSoulMark(ch, chargesPerCast()); affectTarget(ch); } affectMap(beam); if (Dungeon.level.viewDistance < 4) Buff.prolong( curUser, Light.class, 10f+level()*5); } private void affectTarget(Char ch){ int dmg = damageRoll(); //three in (5+lvl) chance of failing if (Random.Int(5+level()) >= 3) { Buff.prolong(ch, Blindness.class, 2f + (level() * 0.333f)); ch.sprite.emitter().burst(Speck.factory(Speck.LIGHT), 6 ); } if (ch.properties().contains(Char.Property.DEMONIC) || ch.properties().contains(Char.Property.UNDEAD)){ ch.sprite.emitter().start( ShadowParticle.UP, 0.05f, 10+level() ); Sample.INSTANCE.play(Assets.SND_BURNING); ch.damage(Math.round(dmg*1.333f), this); } else { ch.sprite.centerEmitter().burst( RainbowParticle.BURST, 10+level() ); ch.damage(dmg, this); } } private void affectMap(Ballistica beam){ boolean noticed = false; for (int c: beam.subPath(0, beam.dist)){ for (int n : Level.NEIGHBOURS9DIST2){ int cell = c+n; if (!Level.insideMap(cell)) continue; if (Level.discoverable[cell]) Dungeon.level.mapped[cell] = true; int terr = Dungeon.level.map[cell]; if ((Terrain.flags[terr] & Terrain.SECRET) != 0) { Dungeon.level.discover( cell ); GameScene.discoverTile( cell, terr ); ScrollOfMagicMapping.discover(cell); noticed = true; } } CellEmitter.center(c).burst( RainbowParticle.BURST, Random.IntRange( 1, 2 ) ); } if (noticed) Sample.INSTANCE.play( Assets.SND_SECRET ); Dungeon.observe(); } @Override protected void fx( Ballistica beam, Callback callback ) { curUser.sprite.parent.add( new Beam.LightRay(curUser.sprite.center(), DungeonTilemap.tileCenterToWorld(beam.collisionPos))); callback.call(); } @Override public void onHit(MagesStaff staff, Char attacker, Char defender, int damage) { //cripples enemy Buff.prolong( defender, Cripple.class, 1f+staff.level()); } @Override public void staffFx(MagesStaff.StaffParticle particle) { particle.color( Random.Int( 0x1000000 ) ); particle.am = 0.3f; particle.setLifespan(1f); particle.speed.polar(Random.Float(PointF.PI2), 2f); particle.setSize( 1f, 2.5f); particle.radiateXY(1f); } }