From 842286d307c91c9ad1cefd638497d4dc0c2a009d Mon Sep 17 00:00:00 2001 From: watabou Date: Sun, 27 Jul 2014 17:39:07 +0400 Subject: [PATCH] actual source files added --- AndroidManifest.xml | 40 + LICENSE => LICENSE.txt | 57 +- assets/amulet.png | Bin 0 -> 1025 bytes assets/arcs1.png | Bin 0 -> 2911 bytes assets/arcs2.png | Bin 0 -> 3110 bytes assets/avatars.png | Bin 0 -> 6337 bytes assets/badges.png | Bin 0 -> 7074 bytes assets/banners.png | Bin 0 -> 11651 bytes assets/bat.png | Bin 0 -> 3456 bytes assets/blacksmith.png | Bin 0 -> 918 bytes assets/brute.png | Bin 0 -> 5688 bytes assets/buffs.png | Bin 0 -> 19015 bytes assets/burning_fist.png | Bin 0 -> 2024 bytes assets/chrome.png | Bin 0 -> 2017 bytes assets/crab.png | Bin 0 -> 4783 bytes assets/dashboard.png | Bin 0 -> 1779 bytes assets/demon.png | Bin 0 -> 15145 bytes assets/dm300.png | Bin 0 -> 4544 bytes assets/effects.png | Bin 0 -> 17525 bytes assets/elemental.png | Bin 0 -> 3715 bytes assets/exp_bar.png | Bin 0 -> 123 bytes assets/eye.png | Bin 0 -> 1929 bytes assets/fireball.png | Bin 0 -> 4607 bytes assets/font15x.png | Bin 0 -> 2519 bytes assets/font1x.png | Bin 0 -> 3973 bytes assets/font25x.png | Bin 0 -> 3700 bytes assets/font2x.png | Bin 0 -> 5457 bytes assets/font3x.png | Bin 0 -> 7520 bytes assets/game.mp3 | Bin 0 -> 576573 bytes assets/ghost.png | Bin 0 -> 1130 bytes assets/gnoll.png | Bin 0 -> 4306 bytes assets/golem.png | Bin 0 -> 1152 bytes assets/goo.png | Bin 0 -> 857 bytes assets/hp_bar.png | Bin 0 -> 2853 bytes assets/icons.png | Bin 0 -> 3736 bytes assets/items.png | Bin 0 -> 16024 bytes assets/king.png | Bin 0 -> 2822 bytes assets/large_buffs.png | Bin 0 -> 20079 bytes assets/larva.png | Bin 0 -> 3323 bytes assets/mage.png | Bin 0 -> 15136 bytes assets/monk.png | Bin 0 -> 7277 bytes assets/piranha.png | Bin 0 -> 1441 bytes assets/plants.png | Bin 0 -> 1910 bytes assets/ranger.png | Bin 0 -> 15539 bytes assets/rat.png | Bin 0 -> 6493 bytes assets/ratking.png | Bin 0 -> 1187 bytes assets/rogue.png | Bin 0 -> 14827 bytes assets/rotting_fist.png | Bin 0 -> 1657 bytes assets/scorpio.png | Bin 0 -> 7437 bytes assets/shaman.png | Bin 0 -> 1514 bytes assets/sheep.png | Bin 0 -> 3282 bytes assets/shopkeeper.png | Bin 0 -> 3236 bytes assets/skeleton.png | Bin 0 -> 4182 bytes assets/snd_alert.mp3 | Bin 0 -> 9927 bytes assets/snd_badge.mp3 | Bin 0 -> 5956 bytes assets/snd_beacon.mp3 | Bin 0 -> 5329 bytes assets/snd_blast.mp3 | Bin 0 -> 4221 bytes assets/snd_bones.mp3 | Bin 0 -> 5172 bytes assets/snd_boss.mp3 | Bin 0 -> 13375 bytes assets/snd_burning.mp3 | Bin 0 -> 4702 bytes assets/snd_challenge.mp3 | Bin 0 -> 10800 bytes assets/snd_charms.mp3 | Bin 0 -> 4232 bytes assets/snd_click.mp3 | Bin 0 -> 418 bytes assets/snd_cursed.mp3 | Bin 0 -> 1656 bytes assets/snd_death.mp3 | Bin 0 -> 10972 bytes assets/snd_descend.mp3 | Bin 0 -> 19506 bytes assets/snd_dewdrop.mp3 | Bin 0 -> 7680 bytes assets/snd_door_open.mp3 | Bin 0 -> 8161 bytes assets/snd_drink.mp3 | Bin 0 -> 7433 bytes assets/snd_eat.mp3 | Bin 0 -> 12113 bytes assets/snd_evoke.mp3 | Bin 0 -> 2736 bytes assets/snd_falling.mp3 | Bin 0 -> 8463 bytes assets/snd_ghost.mp3 | Bin 0 -> 12384 bytes assets/snd_gold.mp3 | Bin 0 -> 9099 bytes assets/snd_hit.mp3 | Bin 0 -> 8678 bytes assets/snd_item.mp3 | Bin 0 -> 5462 bytes assets/snd_levelup.mp3 | Bin 0 -> 17130 bytes assets/snd_lightning.mp3 | Bin 0 -> 10427 bytes assets/snd_lullaby.mp3 | Bin 0 -> 5760 bytes assets/snd_mastery.mp3 | Bin 0 -> 4232 bytes assets/snd_meld.mp3 | Bin 0 -> 2090 bytes assets/snd_miss.mp3 | Bin 0 -> 8414 bytes assets/snd_plant.mp3 | Bin 0 -> 1045 bytes assets/snd_puff.mp3 | Bin 0 -> 2664 bytes assets/snd_ray.mp3 | Bin 0 -> 6583 bytes assets/snd_read.mp3 | Bin 0 -> 6176 bytes assets/snd_rocks.mp3 | Bin 0 -> 7776 bytes assets/snd_secret.mp3 | Bin 0 -> 6896 bytes assets/snd_shatter.mp3 | Bin 0 -> 7218 bytes assets/snd_step.mp3 | Bin 0 -> 6762 bytes assets/snd_teleport.mp3 | Bin 0 -> 5224 bytes assets/snd_tomb.mp3 | Bin 0 -> 1149 bytes assets/snd_trap.mp3 | Bin 0 -> 783 bytes assets/snd_unlock.mp3 | Bin 0 -> 8616 bytes assets/snd_water.mp3 | Bin 0 -> 6176 bytes assets/snd_zap.mp3 | Bin 0 -> 7842 bytes assets/specks.png | Bin 0 -> 868 bytes assets/spell_icons.png | Bin 0 -> 535 bytes assets/spinner.png | Bin 0 -> 4912 bytes assets/statue.png | Bin 0 -> 2583 bytes assets/status_pane.png | Bin 0 -> 3709 bytes assets/succubus.png | Bin 0 -> 1633 bytes assets/surface.mp3 | Bin 0 -> 465814 bytes assets/surface.png | Bin 0 -> 6317 bytes assets/swarm.png | Bin 0 -> 6096 bytes assets/tengu.png | Bin 0 -> 2325 bytes assets/theme.mp3 | Bin 0 -> 718033 bytes assets/thief.png | Bin 0 -> 5334 bytes assets/tiles0.png | Bin 0 -> 16574 bytes assets/tiles1.png | Bin 0 -> 17790 bytes assets/tiles2.png | Bin 0 -> 16355 bytes assets/tiles3.png | Bin 0 -> 14946 bytes assets/tiles4.png | Bin 0 -> 13947 bytes assets/toolbar.png | Bin 0 -> 3796 bytes assets/undead.png | Bin 0 -> 4358 bytes assets/wandmaker.png | Bin 0 -> 855 bytes assets/warlock.png | Bin 0 -> 1450 bytes assets/warrior.png | Bin 0 -> 15006 bytes assets/water0.png | Bin 0 -> 667 bytes assets/water1.png | Bin 0 -> 604 bytes assets/water2.png | Bin 0 -> 3370 bytes assets/water3.png | Bin 0 -> 614 bytes assets/water4.png | Bin 0 -> 684 bytes assets/wraith.png | Bin 0 -> 602 bytes assets/yog.png | Bin 0 -> 2136 bytes proguard-project.txt | 20 + res/drawable-hdpi/ic_launcher.png | Bin 0 -> 3179 bytes res/drawable-mdpi/ic_launcher.png | Bin 0 -> 1949 bytes res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 7128 bytes res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 7047 bytes res/drawable-xxxhdpi/ic_launcher.png | Bin 0 -> 10198 bytes res/values-v11/styles.xml | 11 + res/values-v14/styles.xml | 12 + res/values/strings.xml | 6 + res/values/styles.xml | 20 + src/com/watabou/pixeldungeon/Assets.java | 159 ++ src/com/watabou/pixeldungeon/Badges.java | 927 ++++++++++++ src/com/watabou/pixeldungeon/Bones.java | 125 ++ src/com/watabou/pixeldungeon/Chrome.java | 66 + src/com/watabou/pixeldungeon/Dungeon.java | 690 +++++++++ .../watabou/pixeldungeon/DungeonTilemap.java | 94 ++ src/com/watabou/pixeldungeon/FogOfWar.java | 121 ++ .../watabou/pixeldungeon/GamesInProgress.java | 75 + src/com/watabou/pixeldungeon/Journal.java | 122 ++ .../watabou/pixeldungeon/PixelDungeon.java | 206 +++ src/com/watabou/pixeldungeon/Preferences.java | 70 + src/com/watabou/pixeldungeon/Rankings.java | 195 +++ .../pixeldungeon/ResultDescriptions.java | 43 + src/com/watabou/pixeldungeon/Statistics.java | 96 ++ .../watabou/pixeldungeon/actors/Actor.java | 219 +++ src/com/watabou/pixeldungeon/actors/Char.java | 493 ++++++ .../pixeldungeon/actors/blobs/Alchemy.java | 76 + .../pixeldungeon/actors/blobs/Blob.java | 212 +++ .../pixeldungeon/actors/blobs/Fire.java | 114 ++ .../pixeldungeon/actors/blobs/Foliage.java | 86 ++ .../pixeldungeon/actors/blobs/Freezing.java | 56 + .../actors/blobs/ParalyticGas.java | 52 + .../pixeldungeon/actors/blobs/Regrowth.java | 76 + .../pixeldungeon/actors/blobs/ToxicGas.java | 93 ++ .../actors/blobs/WaterOfAwareness.java | 108 ++ .../actors/blobs/WaterOfHealth.java | 83 + .../actors/blobs/WaterOfTransmutation.java | 237 +++ .../pixeldungeon/actors/blobs/Web.java | 68 + .../pixeldungeon/actors/blobs/WellWater.java | 147 ++ .../pixeldungeon/actors/buffs/Amok.java | 33 + .../pixeldungeon/actors/buffs/Awareness.java | 31 + .../pixeldungeon/actors/buffs/Barkskin.java | 63 + .../pixeldungeon/actors/buffs/Bleeding.java | 93 ++ .../pixeldungeon/actors/buffs/Blindness.java | 40 + .../pixeldungeon/actors/buffs/Buff.java | 90 ++ .../pixeldungeon/actors/buffs/Burning.java | 154 ++ .../pixeldungeon/actors/buffs/Charm.java | 56 + .../pixeldungeon/actors/buffs/Combo.java | 67 + .../pixeldungeon/actors/buffs/Cripple.java | 35 + .../actors/buffs/FlavourBuff.java | 28 + .../pixeldungeon/actors/buffs/Frost.java | 79 + .../pixeldungeon/actors/buffs/Fury.java | 46 + .../actors/buffs/GasesImmunity.java | 44 + .../pixeldungeon/actors/buffs/Hunger.java | 159 ++ .../actors/buffs/Invisibility.java | 60 + .../pixeldungeon/actors/buffs/Levitation.java | 55 + .../pixeldungeon/actors/buffs/Light.java | 59 + .../pixeldungeon/actors/buffs/MindVision.java | 44 + .../pixeldungeon/actors/buffs/Ooze.java | 58 + .../pixeldungeon/actors/buffs/Paralysis.java | 58 + .../pixeldungeon/actors/buffs/Poison.java | 98 ++ .../actors/buffs/Regeneration.java | 50 + .../pixeldungeon/actors/buffs/Roots.java | 50 + .../pixeldungeon/actors/buffs/Shadows.java | 96 ++ .../pixeldungeon/actors/buffs/Sleep.java | 24 + .../pixeldungeon/actors/buffs/Slow.java | 42 + .../actors/buffs/SnipersMark.java | 33 + .../pixeldungeon/actors/buffs/Speed.java | 24 + .../pixeldungeon/actors/buffs/Terror.java | 53 + .../pixeldungeon/actors/buffs/Weakness.java | 62 + .../pixeldungeon/actors/hero/Belongings.java | 299 ++++ .../pixeldungeon/actors/hero/Hero.java | 1334 +++++++++++++++++ .../pixeldungeon/actors/hero/HeroAction.java | 89 ++ .../pixeldungeon/actors/hero/HeroClass.java | 221 +++ .../actors/hero/HeroSubClass.java | 88 ++ .../pixeldungeon/actors/mobs/Acidic.java | 48 + .../pixeldungeon/actors/mobs/Albino.java | 50 + .../pixeldungeon/actors/mobs/Bandit.java | 56 + .../watabou/pixeldungeon/actors/mobs/Bat.java | 97 ++ .../pixeldungeon/actors/mobs/Bestiary.java | 183 +++ .../pixeldungeon/actors/mobs/Brute.java | 105 ++ .../pixeldungeon/actors/mobs/Crab.java | 76 + .../pixeldungeon/actors/mobs/DM300.java | 173 +++ .../pixeldungeon/actors/mobs/Elemental.java | 110 ++ .../watabou/pixeldungeon/actors/mobs/Eye.java | 174 +++ .../pixeldungeon/actors/mobs/Gnoll.java | 69 + .../pixeldungeon/actors/mobs/Golem.java | 105 ++ .../watabou/pixeldungeon/actors/mobs/Goo.java | 188 +++ .../pixeldungeon/actors/mobs/King.java | 328 ++++ .../watabou/pixeldungeon/actors/mobs/Mob.java | 528 +++++++ .../pixeldungeon/actors/mobs/Monk.java | 120 ++ .../pixeldungeon/actors/mobs/Piranha.java | 144 ++ .../watabou/pixeldungeon/actors/mobs/Rat.java | 65 + .../pixeldungeon/actors/mobs/Scorpio.java | 117 ++ .../pixeldungeon/actors/mobs/Senior.java | 52 + .../pixeldungeon/actors/mobs/Shaman.java | 144 ++ .../pixeldungeon/actors/mobs/Shielded.java | 47 + .../pixeldungeon/actors/mobs/Skeleton.java | 129 ++ .../pixeldungeon/actors/mobs/Spinner.java | 130 ++ .../pixeldungeon/actors/mobs/Statue.java | 170 +++ .../pixeldungeon/actors/mobs/Succubus.java | 142 ++ .../pixeldungeon/actors/mobs/Swarm.java | 145 ++ .../pixeldungeon/actors/mobs/Tengu.java | 193 +++ .../pixeldungeon/actors/mobs/Thief.java | 156 ++ .../pixeldungeon/actors/mobs/Warlock.java | 145 ++ .../pixeldungeon/actors/mobs/Wraith.java | 139 ++ .../watabou/pixeldungeon/actors/mobs/Yog.java | 430 ++++++ .../actors/mobs/npcs/Blacksmith.java | 326 ++++ .../pixeldungeon/actors/mobs/npcs/Ghost.java | 395 +++++ .../pixeldungeon/actors/mobs/npcs/Imp.java | 256 ++++ .../actors/mobs/npcs/ImpShopkeeper.java | 71 + .../actors/mobs/npcs/MirrorImage.java | 138 ++ .../actors/mobs/npcs/RatKing.java | 82 + .../actors/mobs/npcs/Shopkeeper.java | 103 ++ .../actors/mobs/npcs/Wandmaker.java | 379 +++++ .../pixeldungeon/effects/BadgeBanner.java | 284 ++++ .../pixeldungeon/effects/BannerSprites.java | 46 + .../pixeldungeon/effects/BlobEmitter.java | 59 + .../pixeldungeon/effects/CellEmitter.java | 56 + .../pixeldungeon/effects/CheckedCell.java | 50 + .../pixeldungeon/effects/DeathRay.java | 75 + .../watabou/pixeldungeon/effects/Effects.java | 50 + .../watabou/pixeldungeon/effects/EmoIcon.java | 97 ++ .../pixeldungeon/effects/Fireball.java | 164 ++ .../watabou/pixeldungeon/effects/Flare.java | 170 +++ .../pixeldungeon/effects/FloatingText.java | 134 ++ .../watabou/pixeldungeon/effects/Halo.java | 74 + .../pixeldungeon/effects/IceBlock.java | 68 + .../pixeldungeon/effects/Identification.java | 101 ++ .../pixeldungeon/effects/Lightning.java | 142 ++ .../pixeldungeon/effects/MagicMissile.java | 399 +++++ .../watabou/pixeldungeon/effects/Pushing.java | 100 ++ .../watabou/pixeldungeon/effects/Ripple.java | 59 + .../watabou/pixeldungeon/effects/Speck.java | 419 ++++++ .../pixeldungeon/effects/SpellSprite.java | 135 ++ .../watabou/pixeldungeon/effects/Splash.java | 80 + .../pixeldungeon/effects/TorchHalo.java | 71 + .../watabou/pixeldungeon/effects/Wound.java | 83 + .../effects/particles/BloodParticle.java | 60 + .../effects/particles/EarthParticle.java | 60 + .../effects/particles/ElmoParticle.java | 64 + .../effects/particles/EnergyParticle.java | 65 + .../effects/particles/FlameParticle.java | 64 + .../effects/particles/FlowParticle.java | 109 ++ .../effects/particles/LeafParticle.java | 69 + .../effects/particles/PoisonParticle.java | 88 ++ .../effects/particles/PurpleParticle.java | 82 + .../effects/particles/ShadowParticle.java | 93 ++ .../effects/particles/ShaftParticle.java | 66 + .../effects/particles/SnowParticle.java | 55 + .../effects/particles/SparkParticle.java | 62 + .../effects/particles/WebParticle.java | 61 + .../effects/particles/WindParticle.java | 114 ++ .../effects/particles/WoolParticle.java | 54 + .../watabou/pixeldungeon/items/Amulet.java | 106 ++ src/com/watabou/pixeldungeon/items/Ankh.java | 51 + .../watabou/pixeldungeon/items/ArmorKit.java | 124 ++ .../watabou/pixeldungeon/items/DewVial.java | 187 +++ .../watabou/pixeldungeon/items/Dewdrop.java | 75 + .../pixeldungeon/items/EquipableItem.java | 68 + .../watabou/pixeldungeon/items/Generator.java | 263 ++++ src/com/watabou/pixeldungeon/items/Gold.java | 118 ++ src/com/watabou/pixeldungeon/items/Heap.java | 337 +++++ src/com/watabou/pixeldungeon/items/Item.java | 463 ++++++ .../pixeldungeon/items/ItemStatusHandler.java | 162 ++ .../pixeldungeon/items/KindOfWeapon.java | 115 ++ .../pixeldungeon/items/LloydsBeacon.java | 178 +++ .../watabou/pixeldungeon/items/Stylus.java | 122 ++ .../pixeldungeon/items/TomeOfMastery.java | 145 ++ src/com/watabou/pixeldungeon/items/Torch.java | 94 ++ .../pixeldungeon/items/armor/Armor.java | 376 +++++ .../pixeldungeon/items/armor/ClassArmor.java | 134 ++ .../pixeldungeon/items/armor/ClothArmor.java | 38 + .../items/armor/HuntressArmor.java | 107 ++ .../items/armor/LeatherArmor.java | 38 + .../pixeldungeon/items/armor/MageArmor.java | 87 ++ .../pixeldungeon/items/armor/MailArmor.java | 39 + .../pixeldungeon/items/armor/PlateArmor.java | 40 + .../pixeldungeon/items/armor/RogueArmor.java | 117 ++ .../pixeldungeon/items/armor/ScaleArmor.java | 39 + .../items/armor/WarriorArmor.java | 129 ++ .../items/armor/glyphs/Affection.java | 66 + .../items/armor/glyphs/AntiEntropy.java | 67 + .../items/armor/glyphs/Bounce.java | 72 + .../items/armor/glyphs/Displacement.java | 69 + .../items/armor/glyphs/Entanglement.java | 66 + .../items/armor/glyphs/Metabolism.java | 74 + .../items/armor/glyphs/Multiplicity.java | 81 + .../items/armor/glyphs/Potential.java | 72 + .../items/armor/glyphs/Stench.java | 61 + .../items/armor/glyphs/Viscosity.java | 150 ++ .../watabou/pixeldungeon/items/bags/Bag.java | 186 +++ .../pixeldungeon/items/bags/ScrollHolder.java | 49 + .../pixeldungeon/items/bags/SeedPouch.java | 48 + .../pixeldungeon/items/bags/WandHolster.java | 73 + .../items/food/ChargrilledMeat.java | 46 + .../watabou/pixeldungeon/items/food/Food.java | 120 ++ .../items/food/FrozenCarpaccio.java | 92 ++ .../pixeldungeon/items/food/MysteryMeat.java | 77 + .../items/food/OverpricedRation.java | 41 + .../pixeldungeon/items/food/Pasty.java | 40 + .../pixeldungeon/items/keys/GoldenKey.java | 44 + .../pixeldungeon/items/keys/IronKey.java | 75 + .../watabou/pixeldungeon/items/keys/Key.java | 69 + .../pixeldungeon/items/keys/SkeletonKey.java | 50 + .../pixeldungeon/items/potions/Potion.java | 287 ++++ .../items/potions/PotionOfExperience.java | 45 + .../items/potions/PotionOfFrost.java | 67 + .../items/potions/PotionOfHealing.java | 64 + .../items/potions/PotionOfInvisibility.java | 65 + .../items/potions/PotionOfLevitation.java | 50 + .../items/potions/PotionOfLiquidFlame.java | 55 + .../items/potions/PotionOfMight.java | 52 + .../items/potions/PotionOfMindVision.java | 57 + .../items/potions/PotionOfParalyticGas.java | 56 + .../items/potions/PotionOfPurity.java | 126 ++ .../items/potions/PotionOfStrength.java | 53 + .../items/potions/PotionOfToxicGas.java | 59 + .../pixeldungeon/items/quest/CorpseDust.java | 51 + .../pixeldungeon/items/quest/DarkGold.java | 54 + .../pixeldungeon/items/quest/DriedRose.java | 47 + .../pixeldungeon/items/quest/DwarfToken.java | 54 + .../pixeldungeon/items/quest/Pickaxe.java | 177 +++ .../pixeldungeon/items/quest/RatSkull.java | 52 + .../pixeldungeon/items/rings/Ring.java | 324 ++++ .../items/rings/RingOfAccuracy.java | 40 + .../items/rings/RingOfDetection.java | 55 + .../items/rings/RingOfElements.java | 77 + .../items/rings/RingOfEvasion.java | 40 + .../items/rings/RingOfHaggler.java | 68 + .../pixeldungeon/items/rings/RingOfHaste.java | 40 + .../items/rings/RingOfHerbalism.java | 40 + .../items/rings/RingOfMending.java | 42 + .../pixeldungeon/items/rings/RingOfPower.java | 41 + .../items/rings/RingOfSatiety.java | 40 + .../items/rings/RingOfShadows.java | 41 + .../items/rings/RingOfThorns.java | 66 + .../items/scrolls/InventoryScroll.java | 95 ++ .../pixeldungeon/items/scrolls/Scroll.java | 184 +++ .../items/scrolls/ScrollOfChallenge.java | 57 + .../items/scrolls/ScrollOfIdentify.java | 55 + .../items/scrolls/ScrollOfLullaby.java | 82 + .../items/scrolls/ScrollOfMagicMapping.java | 103 ++ .../items/scrolls/ScrollOfMirrorImage.java | 80 + .../items/scrolls/ScrollOfPsionicBlast.java | 72 + .../items/scrolls/ScrollOfRecharging.java | 69 + .../items/scrolls/ScrollOfRemoveCurse.java | 98 ++ .../items/scrolls/ScrollOfTeleportation.java | 91 ++ .../items/scrolls/ScrollOfTerror.java | 82 + .../items/scrolls/ScrollOfUpgrade.java | 64 + .../items/scrolls/ScrollOfWeaponUpgrade.java | 60 + .../pixeldungeon/items/wands/Wand.java | 475 ++++++ .../pixeldungeon/items/wands/WandOfAmok.java | 61 + .../items/wands/WandOfAvalanche.java | 100 ++ .../pixeldungeon/items/wands/WandOfBlink.java | 82 + .../items/wands/WandOfDisintegration.java | 114 ++ .../items/wands/WandOfFirebolt.java | 86 ++ .../pixeldungeon/items/wands/WandOfFlock.java | 151 ++ .../items/wands/WandOfLightning.java | 118 ++ .../items/wands/WandOfMagicMissile.java | 153 ++ .../items/wands/WandOfPoison.java | 63 + .../items/wands/WandOfRegrowth.java | 80 + .../items/wands/WandOfSlowness.java | 61 + .../items/wands/WandOfTelekinesis.java | 170 +++ .../items/wands/WandOfTeleportation.java | 88 ++ .../pixeldungeon/items/weapon/Weapon.java | 221 +++ .../items/weapon/enchantments/Death.java | 70 + .../items/weapon/enchantments/Fire.java | 70 + .../items/weapon/enchantments/Horror.java | 62 + .../weapon/enchantments/Instability.java | 45 + .../items/weapon/enchantments/Leech.java | 68 + .../items/weapon/enchantments/Luck.java | 57 + .../items/weapon/enchantments/Paralysis.java | 61 + .../items/weapon/enchantments/Piercing.java | 75 + .../items/weapon/enchantments/Poison.java | 61 + .../items/weapon/enchantments/Slow.java | 61 + .../items/weapon/enchantments/Swing.java | 74 + .../items/weapon/melee/BattleAxe.java | 37 + .../items/weapon/melee/Dagger.java | 37 + .../items/weapon/melee/Glaive.java | 37 + .../items/weapon/melee/Knuckles.java | 37 + .../items/weapon/melee/Longsword.java | 37 + .../pixeldungeon/items/weapon/melee/Mace.java | 37 + .../items/weapon/melee/MeleeWeapon.java | 184 +++ .../items/weapon/melee/Quarterstaff.java | 38 + .../items/weapon/melee/ShortSword.java | 129 ++ .../items/weapon/melee/Spear.java | 37 + .../items/weapon/melee/Sword.java | 37 + .../items/weapon/melee/WarHammer.java | 39 + .../items/weapon/missiles/Boomerang.java | 106 ++ .../items/weapon/missiles/CurareDart.java | 73 + .../items/weapon/missiles/Dart.java | 60 + .../items/weapon/missiles/IncendiaryDart.java | 93 ++ .../items/weapon/missiles/Javelin.java | 71 + .../items/weapon/missiles/MissileWeapon.java | 144 ++ .../items/weapon/missiles/Shuriken.java | 64 + .../items/weapon/missiles/Tamahawk.java | 71 + .../pixeldungeon/levels/CavesBossLevel.java | 299 ++++ .../pixeldungeon/levels/CavesLevel.java | 284 ++++ .../pixeldungeon/levels/CityBossLevel.java | 253 ++++ .../pixeldungeon/levels/CityLevel.java | 200 +++ .../pixeldungeon/levels/DeadEndLevel.java | 97 ++ .../pixeldungeon/levels/HallsBossLevel.java | 253 ++++ .../pixeldungeon/levels/HallsLevel.java | 232 +++ .../pixeldungeon/levels/LastLevel.java | 131 ++ .../pixeldungeon/levels/LastShopLevel.java | 225 +++ .../watabou/pixeldungeon/levels/Level.java | 973 ++++++++++++ .../watabou/pixeldungeon/levels/Patch.java | 85 ++ .../pixeldungeon/levels/PrisonBossLevel.java | 376 +++++ .../pixeldungeon/levels/PrisonLevel.java | 189 +++ .../pixeldungeon/levels/RegularLevel.java | 696 +++++++++ src/com/watabou/pixeldungeon/levels/Room.java | 255 ++++ .../pixeldungeon/levels/SewerBossLevel.java | 257 ++++ .../pixeldungeon/levels/SewerLevel.java | 220 +++ .../watabou/pixeldungeon/levels/Terrain.java | 167 +++ .../levels/features/AlchemyPot.java | 48 + .../pixeldungeon/levels/features/Chasm.java | 111 ++ .../pixeldungeon/levels/features/Door.java | 46 + .../levels/features/HighGrass.java | 72 + .../levels/painters/ArmoryPainter.java | 71 + .../levels/painters/BlacksmithPainter.java | 60 + .../levels/painters/BossExitPainter.java | 39 + .../levels/painters/CryptPainter.java | 80 + .../levels/painters/EntrancePainter.java | 39 + .../levels/painters/ExitPainter.java | 39 + .../levels/painters/GardenPainter.java | 53 + .../levels/painters/LaboratoryPainter.java | 83 + .../levels/painters/LibraryPainter.java | 90 ++ .../levels/painters/MagicWellPainter.java | 67 + .../pixeldungeon/levels/painters/Painter.java | 86 ++ .../levels/painters/PassagePainter.java | 116 ++ .../levels/painters/PitPainter.java | 89 ++ .../levels/painters/PoolPainter.java | 108 ++ .../levels/painters/RatKingPainter.java | 86 ++ .../levels/painters/ShopPainter.java | 214 +++ .../levels/painters/StandardPainter.java | 240 +++ .../levels/painters/StatuePainter.java | 72 + .../levels/painters/StoragePainter.java | 64 + .../levels/painters/TrapsPainter.java | 104 ++ .../levels/painters/TreasuryPainter.java | 62 + .../levels/painters/TunnelPainter.java | 120 ++ .../levels/painters/VaultPainter.java | 76 + .../levels/painters/WeakFloorPainter.java | 54 + .../pixeldungeon/levels/traps/AlarmTrap.java | 48 + .../pixeldungeon/levels/traps/FireTrap.java | 37 + .../levels/traps/GrippingTrap.java | 42 + .../levels/traps/LightningTrap.java | 73 + .../levels/traps/ParalyticTrap.java | 35 + .../pixeldungeon/levels/traps/PoisonTrap.java | 40 + .../levels/traps/SummoningTrap.java | 88 ++ .../pixeldungeon/levels/traps/ToxicTrap.java | 35 + .../pixeldungeon/mechanics/Ballistica.java | 98 ++ .../pixeldungeon/mechanics/ShadowCaster.java | 152 ++ .../pixeldungeon/plants/Blindweed.java | 80 + .../pixeldungeon/plants/Earthroot.java | 143 ++ .../watabou/pixeldungeon/plants/Fadeleaf.java | 99 ++ .../pixeldungeon/plants/Firebloom.java | 71 + .../watabou/pixeldungeon/plants/Icecap.java | 77 + .../watabou/pixeldungeon/plants/Plant.java | 177 +++ .../pixeldungeon/plants/Sorrowmoss.java | 73 + .../watabou/pixeldungeon/plants/Sungrass.java | 123 ++ .../pixeldungeon/scenes/AboutScene.java | 93 ++ .../pixeldungeon/scenes/AmuletScene.java | 133 ++ .../pixeldungeon/scenes/BadgesScene.java | 88 ++ .../pixeldungeon/scenes/CellSelector.java | 158 ++ .../pixeldungeon/scenes/GameScene.java | 618 ++++++++ .../pixeldungeon/scenes/InterlevelScene.java | 335 +++++ .../pixeldungeon/scenes/IntroScene.java | 47 + .../pixeldungeon/scenes/PixelScene.java | 325 ++++ .../pixeldungeon/scenes/RankingsScene.java | 219 +++ .../pixeldungeon/scenes/StartScene.java | 510 +++++++ .../pixeldungeon/scenes/SurfaceScene.java | 361 +++++ .../pixeldungeon/scenes/TitleScene.java | 176 +++ .../pixeldungeon/sprites/AcidicSprite.java | 53 + .../pixeldungeon/sprites/AlbinoSprite.java | 46 + .../pixeldungeon/sprites/BanditSprite.java | 45 + .../pixeldungeon/sprites/BatSprite.java | 46 + .../sprites/BlacksmithSprite.java | 82 + .../pixeldungeon/sprites/BruteSprite.java | 46 + .../sprites/BurningFistSprite.java | 77 + .../pixeldungeon/sprites/CharSprite.java | 407 +++++ .../pixeldungeon/sprites/CrabSprite.java | 51 + .../pixeldungeon/sprites/DM300Sprite.java | 62 + .../sprites/DiscardedItemSprite.java | 48 + .../pixeldungeon/sprites/ElementalSprite.java | 64 + .../pixeldungeon/sprites/EyeSprite.java | 68 + .../pixeldungeon/sprites/FetidRatSprite.java | 56 + .../pixeldungeon/sprites/GhostSprite.java | 68 + .../pixeldungeon/sprites/GnollSprite.java | 46 + .../pixeldungeon/sprites/GolemSprite.java | 60 + .../pixeldungeon/sprites/GooSprite.java | 60 + .../pixeldungeon/sprites/HeroSprite.java | 127 ++ .../pixeldungeon/sprites/ImpSprite.java | 69 + .../pixeldungeon/sprites/ItemSprite.java | 224 +++ .../pixeldungeon/sprites/ItemSpriteSheet.java | 172 +++ .../pixeldungeon/sprites/KingSprite.java | 46 + .../pixeldungeon/sprites/LarvaSprite.java | 58 + .../pixeldungeon/sprites/MirrorSprite.java | 61 + .../pixeldungeon/sprites/MissileSprite.java | 78 + .../pixeldungeon/sprites/MobSprite.java | 73 + .../pixeldungeon/sprites/MonkSprite.java | 65 + .../pixeldungeon/sprites/PiranhaSprite.java | 56 + .../pixeldungeon/sprites/PlantSprite.java | 110 ++ .../pixeldungeon/sprites/RatKingSprite.java | 46 + .../pixeldungeon/sprites/RatSprite.java | 46 + .../sprites/RottingFistSprite.java | 69 + .../pixeldungeon/sprites/ScorpioSprite.java | 90 ++ .../pixeldungeon/sprites/SeniorSprite.java | 65 + .../pixeldungeon/sprites/ShamanSprite.java | 62 + .../pixeldungeon/sprites/SheepSprite.java | 45 + .../pixeldungeon/sprites/ShieldedSprite.java | 46 + .../sprites/ShopkeeperSprite.java | 58 + .../pixeldungeon/sprites/SkeletonSprite.java | 61 + .../pixeldungeon/sprites/SpinnerSprite.java | 51 + .../pixeldungeon/sprites/StatueSprite.java | 51 + .../pixeldungeon/sprites/SuccubusSprite.java | 55 + .../pixeldungeon/sprites/SwarmSprite.java | 51 + .../pixeldungeon/sprites/TenguSprite.java | 99 ++ .../pixeldungeon/sprites/ThiefSprite.java | 45 + .../pixeldungeon/sprites/UndeadSprite.java | 61 + .../pixeldungeon/sprites/WandmakerSprite.java | 120 ++ .../pixeldungeon/sprites/WarlockSprite.java | 75 + .../pixeldungeon/sprites/WraithSprite.java | 51 + .../pixeldungeon/sprites/YogSprite.java | 54 + src/com/watabou/pixeldungeon/ui/Archs.java | 65 + .../pixeldungeon/ui/AttackIndicator.java | 167 +++ .../watabou/pixeldungeon/ui/BadgesList.java | 122 ++ src/com/watabou/pixeldungeon/ui/Banner.java | 101 ++ .../pixeldungeon/ui/BuffIndicator.java | 143 ++ .../pixeldungeon/ui/BusyIndicator.java | 38 + src/com/watabou/pixeldungeon/ui/CheckBox.java | 61 + src/com/watabou/pixeldungeon/ui/Compass.java | 64 + .../pixeldungeon/ui/DangerIndicator.java | 104 ++ src/com/watabou/pixeldungeon/ui/GameLog.java | 114 ++ .../pixeldungeon/ui/GoldIndicator.java | 79 + .../pixeldungeon/ui/HealthIndicator.java | 82 + src/com/watabou/pixeldungeon/ui/Icons.java | 152 ++ src/com/watabou/pixeldungeon/ui/ItemSlot.java | 195 +++ .../pixeldungeon/ui/LootIndicator.java | 93 ++ .../watabou/pixeldungeon/ui/PrefsButton.java | 68 + .../watabou/pixeldungeon/ui/QuickSlot.java | 211 +++ .../watabou/pixeldungeon/ui/RedButton.java | 111 ++ .../watabou/pixeldungeon/ui/ScrollPane.java | 149 ++ .../watabou/pixeldungeon/ui/SimpleButton.java | 65 + .../watabou/pixeldungeon/ui/StatusPane.java | 199 +++ src/com/watabou/pixeldungeon/ui/Tag.java | 80 + src/com/watabou/pixeldungeon/ui/Toast.java | 84 ++ src/com/watabou/pixeldungeon/ui/Toolbar.java | 359 +++++ src/com/watabou/pixeldungeon/ui/Window.java | 199 +++ .../watabou/pixeldungeon/utils/BArray.java | 140 ++ src/com/watabou/pixeldungeon/utils/GLog.java | 60 + src/com/watabou/pixeldungeon/utils/Utils.java | 41 + .../pixeldungeon/windows/IconTitle.java | 89 ++ .../pixeldungeon/windows/WndBadge.java | 64 + .../watabou/pixeldungeon/windows/WndBag.java | 399 +++++ .../pixeldungeon/windows/WndBlacksmith.java | 176 +++ .../pixeldungeon/windows/WndCatalogus.java | 189 +++ .../pixeldungeon/windows/WndChooseWay.java | 102 ++ .../pixeldungeon/windows/WndError.java | 30 + .../watabou/pixeldungeon/windows/WndGame.java | 120 ++ .../watabou/pixeldungeon/windows/WndHero.java | 209 +++ .../watabou/pixeldungeon/windows/WndImp.java | 90 ++ .../pixeldungeon/windows/WndInfoCell.java | 84 ++ .../pixeldungeon/windows/WndInfoItem.java | 125 ++ .../pixeldungeon/windows/WndInfoMob.java | 130 ++ .../pixeldungeon/windows/WndInfoPlant.java | 53 + .../watabou/pixeldungeon/windows/WndItem.java | 90 ++ .../pixeldungeon/windows/WndJournal.java | 123 ++ .../watabou/pixeldungeon/windows/WndList.java | 72 + .../pixeldungeon/windows/WndMessage.java | 43 + .../pixeldungeon/windows/WndOptions.java | 69 + .../pixeldungeon/windows/WndQuest.java | 28 + .../pixeldungeon/windows/WndRanking.java | 345 +++++ .../pixeldungeon/windows/WndResurrect.java | 102 ++ .../pixeldungeon/windows/WndSadGhost.java | 104 ++ .../pixeldungeon/windows/WndSettings.java | 171 +++ .../pixeldungeon/windows/WndStory.java | 133 ++ .../pixeldungeon/windows/WndTabbed.java | 187 +++ .../windows/WndTitledMessage.java | 72 + .../pixeldungeon/windows/WndTradeItem.java | 250 +++ .../pixeldungeon/windows/WndWandmaker.java | 104 ++ 606 files changed, 55996 insertions(+), 55 deletions(-) create mode 100644 AndroidManifest.xml rename LICENSE => LICENSE.txt (92%) create mode 100644 assets/amulet.png create mode 100644 assets/arcs1.png create mode 100644 assets/arcs2.png create mode 100644 assets/avatars.png create mode 100644 assets/badges.png create mode 100644 assets/banners.png create mode 100644 assets/bat.png create mode 100644 assets/blacksmith.png create mode 100644 assets/brute.png create mode 100644 assets/buffs.png create mode 100644 assets/burning_fist.png create mode 100644 assets/chrome.png create mode 100644 assets/crab.png create mode 100644 assets/dashboard.png create mode 100644 assets/demon.png create mode 100644 assets/dm300.png create mode 100644 assets/effects.png create mode 100644 assets/elemental.png create mode 100644 assets/exp_bar.png create mode 100644 assets/eye.png create mode 100644 assets/fireball.png create mode 100644 assets/font15x.png create mode 100644 assets/font1x.png create mode 100644 assets/font25x.png create mode 100644 assets/font2x.png create mode 100644 assets/font3x.png create mode 100644 assets/game.mp3 create mode 100644 assets/ghost.png create mode 100644 assets/gnoll.png create mode 100644 assets/golem.png create mode 100644 assets/goo.png create mode 100644 assets/hp_bar.png create mode 100644 assets/icons.png create mode 100644 assets/items.png create mode 100644 assets/king.png create mode 100644 assets/large_buffs.png create mode 100644 assets/larva.png create mode 100644 assets/mage.png create mode 100644 assets/monk.png create mode 100644 assets/piranha.png create mode 100644 assets/plants.png create mode 100644 assets/ranger.png create mode 100644 assets/rat.png create mode 100644 assets/ratking.png create mode 100644 assets/rogue.png create mode 100644 assets/rotting_fist.png create mode 100644 assets/scorpio.png create mode 100644 assets/shaman.png create mode 100644 assets/sheep.png create mode 100644 assets/shopkeeper.png create mode 100644 assets/skeleton.png create mode 100644 assets/snd_alert.mp3 create mode 100644 assets/snd_badge.mp3 create mode 100644 assets/snd_beacon.mp3 create mode 100644 assets/snd_blast.mp3 create mode 100644 assets/snd_bones.mp3 create mode 100644 assets/snd_boss.mp3 create mode 100644 assets/snd_burning.mp3 create mode 100644 assets/snd_challenge.mp3 create mode 100644 assets/snd_charms.mp3 create mode 100644 assets/snd_click.mp3 create mode 100644 assets/snd_cursed.mp3 create mode 100644 assets/snd_death.mp3 create mode 100644 assets/snd_descend.mp3 create mode 100644 assets/snd_dewdrop.mp3 create mode 100644 assets/snd_door_open.mp3 create mode 100644 assets/snd_drink.mp3 create mode 100644 assets/snd_eat.mp3 create mode 100644 assets/snd_evoke.mp3 create mode 100644 assets/snd_falling.mp3 create mode 100644 assets/snd_ghost.mp3 create mode 100644 assets/snd_gold.mp3 create mode 100644 assets/snd_hit.mp3 create mode 100644 assets/snd_item.mp3 create mode 100644 assets/snd_levelup.mp3 create mode 100644 assets/snd_lightning.mp3 create mode 100644 assets/snd_lullaby.mp3 create mode 100644 assets/snd_mastery.mp3 create mode 100644 assets/snd_meld.mp3 create mode 100644 assets/snd_miss.mp3 create mode 100644 assets/snd_plant.mp3 create mode 100644 assets/snd_puff.mp3 create mode 100644 assets/snd_ray.mp3 create mode 100644 assets/snd_read.mp3 create mode 100644 assets/snd_rocks.mp3 create mode 100644 assets/snd_secret.mp3 create mode 100644 assets/snd_shatter.mp3 create mode 100644 assets/snd_step.mp3 create mode 100644 assets/snd_teleport.mp3 create mode 100644 assets/snd_tomb.mp3 create mode 100644 assets/snd_trap.mp3 create mode 100644 assets/snd_unlock.mp3 create mode 100644 assets/snd_water.mp3 create mode 100644 assets/snd_zap.mp3 create mode 100644 assets/specks.png create mode 100644 assets/spell_icons.png create mode 100644 assets/spinner.png create mode 100644 assets/statue.png create mode 100644 assets/status_pane.png create mode 100644 assets/succubus.png create mode 100644 assets/surface.mp3 create mode 100644 assets/surface.png create mode 100644 assets/swarm.png create mode 100644 assets/tengu.png create mode 100644 assets/theme.mp3 create mode 100644 assets/thief.png create mode 100644 assets/tiles0.png create mode 100644 assets/tiles1.png create mode 100644 assets/tiles2.png create mode 100644 assets/tiles3.png create mode 100644 assets/tiles4.png create mode 100644 assets/toolbar.png create mode 100644 assets/undead.png create mode 100644 assets/wandmaker.png create mode 100644 assets/warlock.png create mode 100644 assets/warrior.png create mode 100644 assets/water0.png create mode 100644 assets/water1.png create mode 100644 assets/water2.png create mode 100644 assets/water3.png create mode 100644 assets/water4.png create mode 100644 assets/wraith.png create mode 100644 assets/yog.png create mode 100644 proguard-project.txt create mode 100644 res/drawable-hdpi/ic_launcher.png create mode 100644 res/drawable-mdpi/ic_launcher.png create mode 100644 res/drawable-xhdpi/ic_launcher.png create mode 100644 res/drawable-xxhdpi/ic_launcher.png create mode 100644 res/drawable-xxxhdpi/ic_launcher.png create mode 100644 res/values-v11/styles.xml create mode 100644 res/values-v14/styles.xml create mode 100644 res/values/strings.xml create mode 100644 res/values/styles.xml create mode 100644 src/com/watabou/pixeldungeon/Assets.java create mode 100644 src/com/watabou/pixeldungeon/Badges.java create mode 100644 src/com/watabou/pixeldungeon/Bones.java create mode 100644 src/com/watabou/pixeldungeon/Chrome.java create mode 100644 src/com/watabou/pixeldungeon/Dungeon.java create mode 100644 src/com/watabou/pixeldungeon/DungeonTilemap.java create mode 100644 src/com/watabou/pixeldungeon/FogOfWar.java create mode 100644 src/com/watabou/pixeldungeon/GamesInProgress.java create mode 100644 src/com/watabou/pixeldungeon/Journal.java create mode 100644 src/com/watabou/pixeldungeon/PixelDungeon.java create mode 100644 src/com/watabou/pixeldungeon/Preferences.java create mode 100644 src/com/watabou/pixeldungeon/Rankings.java create mode 100644 src/com/watabou/pixeldungeon/ResultDescriptions.java create mode 100644 src/com/watabou/pixeldungeon/Statistics.java create mode 100644 src/com/watabou/pixeldungeon/actors/Actor.java create mode 100644 src/com/watabou/pixeldungeon/actors/Char.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/Alchemy.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/Blob.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/Fire.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/Foliage.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/Freezing.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/ParalyticGas.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/Regrowth.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/ToxicGas.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/WaterOfAwareness.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/WaterOfHealth.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/WaterOfTransmutation.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/Web.java create mode 100644 src/com/watabou/pixeldungeon/actors/blobs/WellWater.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Amok.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Awareness.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Barkskin.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Bleeding.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Blindness.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Buff.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Burning.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Charm.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Combo.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Cripple.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/FlavourBuff.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Frost.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Fury.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/GasesImmunity.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Hunger.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Invisibility.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Levitation.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Light.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/MindVision.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Ooze.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Paralysis.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Poison.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Regeneration.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Roots.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Shadows.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Sleep.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Slow.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/SnipersMark.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Speed.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Terror.java create mode 100644 src/com/watabou/pixeldungeon/actors/buffs/Weakness.java create mode 100644 src/com/watabou/pixeldungeon/actors/hero/Belongings.java create mode 100644 src/com/watabou/pixeldungeon/actors/hero/Hero.java create mode 100644 src/com/watabou/pixeldungeon/actors/hero/HeroAction.java create mode 100644 src/com/watabou/pixeldungeon/actors/hero/HeroClass.java create mode 100644 src/com/watabou/pixeldungeon/actors/hero/HeroSubClass.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Acidic.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Albino.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Bandit.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Bat.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Bestiary.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Brute.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Crab.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/DM300.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Elemental.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Eye.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Gnoll.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Golem.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Goo.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/King.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Mob.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Monk.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Piranha.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Rat.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Scorpio.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Senior.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Shaman.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Shielded.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Skeleton.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Spinner.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Statue.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Succubus.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Swarm.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Tengu.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Thief.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Warlock.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Wraith.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/Yog.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/npcs/Blacksmith.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/npcs/Ghost.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/npcs/Imp.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/npcs/ImpShopkeeper.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/npcs/MirrorImage.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/npcs/RatKing.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/npcs/Shopkeeper.java create mode 100644 src/com/watabou/pixeldungeon/actors/mobs/npcs/Wandmaker.java create mode 100644 src/com/watabou/pixeldungeon/effects/BadgeBanner.java create mode 100644 src/com/watabou/pixeldungeon/effects/BannerSprites.java create mode 100644 src/com/watabou/pixeldungeon/effects/BlobEmitter.java create mode 100644 src/com/watabou/pixeldungeon/effects/CellEmitter.java create mode 100644 src/com/watabou/pixeldungeon/effects/CheckedCell.java create mode 100644 src/com/watabou/pixeldungeon/effects/DeathRay.java create mode 100644 src/com/watabou/pixeldungeon/effects/Effects.java create mode 100644 src/com/watabou/pixeldungeon/effects/EmoIcon.java create mode 100644 src/com/watabou/pixeldungeon/effects/Fireball.java create mode 100644 src/com/watabou/pixeldungeon/effects/Flare.java create mode 100644 src/com/watabou/pixeldungeon/effects/FloatingText.java create mode 100644 src/com/watabou/pixeldungeon/effects/Halo.java create mode 100644 src/com/watabou/pixeldungeon/effects/IceBlock.java create mode 100644 src/com/watabou/pixeldungeon/effects/Identification.java create mode 100644 src/com/watabou/pixeldungeon/effects/Lightning.java create mode 100644 src/com/watabou/pixeldungeon/effects/MagicMissile.java create mode 100644 src/com/watabou/pixeldungeon/effects/Pushing.java create mode 100644 src/com/watabou/pixeldungeon/effects/Ripple.java create mode 100644 src/com/watabou/pixeldungeon/effects/Speck.java create mode 100644 src/com/watabou/pixeldungeon/effects/SpellSprite.java create mode 100644 src/com/watabou/pixeldungeon/effects/Splash.java create mode 100644 src/com/watabou/pixeldungeon/effects/TorchHalo.java create mode 100644 src/com/watabou/pixeldungeon/effects/Wound.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/BloodParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/EarthParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/ElmoParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/EnergyParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/FlameParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/FlowParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/LeafParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/PoisonParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/PurpleParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/ShadowParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/ShaftParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/SnowParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/SparkParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/WebParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/WindParticle.java create mode 100644 src/com/watabou/pixeldungeon/effects/particles/WoolParticle.java create mode 100644 src/com/watabou/pixeldungeon/items/Amulet.java create mode 100644 src/com/watabou/pixeldungeon/items/Ankh.java create mode 100644 src/com/watabou/pixeldungeon/items/ArmorKit.java create mode 100644 src/com/watabou/pixeldungeon/items/DewVial.java create mode 100644 src/com/watabou/pixeldungeon/items/Dewdrop.java create mode 100644 src/com/watabou/pixeldungeon/items/EquipableItem.java create mode 100644 src/com/watabou/pixeldungeon/items/Generator.java create mode 100644 src/com/watabou/pixeldungeon/items/Gold.java create mode 100644 src/com/watabou/pixeldungeon/items/Heap.java create mode 100644 src/com/watabou/pixeldungeon/items/Item.java create mode 100644 src/com/watabou/pixeldungeon/items/ItemStatusHandler.java create mode 100644 src/com/watabou/pixeldungeon/items/KindOfWeapon.java create mode 100644 src/com/watabou/pixeldungeon/items/LloydsBeacon.java create mode 100644 src/com/watabou/pixeldungeon/items/Stylus.java create mode 100644 src/com/watabou/pixeldungeon/items/TomeOfMastery.java create mode 100644 src/com/watabou/pixeldungeon/items/Torch.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/Armor.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/ClassArmor.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/ClothArmor.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/HuntressArmor.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/LeatherArmor.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/MageArmor.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/MailArmor.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/PlateArmor.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/RogueArmor.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/ScaleArmor.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/WarriorArmor.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/glyphs/Affection.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/glyphs/AntiEntropy.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/glyphs/Bounce.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/glyphs/Displacement.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/glyphs/Entanglement.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/glyphs/Metabolism.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/glyphs/Multiplicity.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/glyphs/Potential.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/glyphs/Stench.java create mode 100644 src/com/watabou/pixeldungeon/items/armor/glyphs/Viscosity.java create mode 100644 src/com/watabou/pixeldungeon/items/bags/Bag.java create mode 100644 src/com/watabou/pixeldungeon/items/bags/ScrollHolder.java create mode 100644 src/com/watabou/pixeldungeon/items/bags/SeedPouch.java create mode 100644 src/com/watabou/pixeldungeon/items/bags/WandHolster.java create mode 100644 src/com/watabou/pixeldungeon/items/food/ChargrilledMeat.java create mode 100644 src/com/watabou/pixeldungeon/items/food/Food.java create mode 100644 src/com/watabou/pixeldungeon/items/food/FrozenCarpaccio.java create mode 100644 src/com/watabou/pixeldungeon/items/food/MysteryMeat.java create mode 100644 src/com/watabou/pixeldungeon/items/food/OverpricedRation.java create mode 100644 src/com/watabou/pixeldungeon/items/food/Pasty.java create mode 100644 src/com/watabou/pixeldungeon/items/keys/GoldenKey.java create mode 100644 src/com/watabou/pixeldungeon/items/keys/IronKey.java create mode 100644 src/com/watabou/pixeldungeon/items/keys/Key.java create mode 100644 src/com/watabou/pixeldungeon/items/keys/SkeletonKey.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/Potion.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/PotionOfExperience.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/PotionOfFrost.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/PotionOfHealing.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/PotionOfInvisibility.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/PotionOfLevitation.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/PotionOfLiquidFlame.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/PotionOfMight.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/PotionOfMindVision.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/PotionOfParalyticGas.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/PotionOfPurity.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/PotionOfStrength.java create mode 100644 src/com/watabou/pixeldungeon/items/potions/PotionOfToxicGas.java create mode 100644 src/com/watabou/pixeldungeon/items/quest/CorpseDust.java create mode 100644 src/com/watabou/pixeldungeon/items/quest/DarkGold.java create mode 100644 src/com/watabou/pixeldungeon/items/quest/DriedRose.java create mode 100644 src/com/watabou/pixeldungeon/items/quest/DwarfToken.java create mode 100644 src/com/watabou/pixeldungeon/items/quest/Pickaxe.java create mode 100644 src/com/watabou/pixeldungeon/items/quest/RatSkull.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/Ring.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/RingOfAccuracy.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/RingOfDetection.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/RingOfElements.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/RingOfEvasion.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/RingOfHaggler.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/RingOfHaste.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/RingOfHerbalism.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/RingOfMending.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/RingOfPower.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/RingOfSatiety.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/RingOfShadows.java create mode 100644 src/com/watabou/pixeldungeon/items/rings/RingOfThorns.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/InventoryScroll.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/Scroll.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/ScrollOfChallenge.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/ScrollOfIdentify.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/ScrollOfLullaby.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/ScrollOfMagicMapping.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/ScrollOfMirrorImage.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/ScrollOfPsionicBlast.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/ScrollOfRecharging.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/ScrollOfRemoveCurse.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/ScrollOfTeleportation.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/ScrollOfTerror.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/ScrollOfUpgrade.java create mode 100644 src/com/watabou/pixeldungeon/items/scrolls/ScrollOfWeaponUpgrade.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/Wand.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfAmok.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfAvalanche.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfBlink.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfDisintegration.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfFirebolt.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfFlock.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfLightning.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfMagicMissile.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfPoison.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfRegrowth.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfSlowness.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfTelekinesis.java create mode 100644 src/com/watabou/pixeldungeon/items/wands/WandOfTeleportation.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/Weapon.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/enchantments/Death.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/enchantments/Fire.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/enchantments/Horror.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/enchantments/Instability.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/enchantments/Leech.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/enchantments/Luck.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/enchantments/Paralysis.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/enchantments/Piercing.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/enchantments/Poison.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/enchantments/Slow.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/enchantments/Swing.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/melee/BattleAxe.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/melee/Dagger.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/melee/Glaive.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/melee/Knuckles.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/melee/Longsword.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/melee/Mace.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/melee/MeleeWeapon.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/melee/Quarterstaff.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/melee/ShortSword.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/melee/Spear.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/melee/Sword.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/melee/WarHammer.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/missiles/Boomerang.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/missiles/CurareDart.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/missiles/Dart.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/missiles/IncendiaryDart.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/missiles/Javelin.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/missiles/MissileWeapon.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/missiles/Shuriken.java create mode 100644 src/com/watabou/pixeldungeon/items/weapon/missiles/Tamahawk.java create mode 100644 src/com/watabou/pixeldungeon/levels/CavesBossLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/CavesLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/CityBossLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/CityLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/DeadEndLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/HallsBossLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/HallsLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/LastLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/LastShopLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/Level.java create mode 100644 src/com/watabou/pixeldungeon/levels/Patch.java create mode 100644 src/com/watabou/pixeldungeon/levels/PrisonBossLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/PrisonLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/RegularLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/Room.java create mode 100644 src/com/watabou/pixeldungeon/levels/SewerBossLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/SewerLevel.java create mode 100644 src/com/watabou/pixeldungeon/levels/Terrain.java create mode 100644 src/com/watabou/pixeldungeon/levels/features/AlchemyPot.java create mode 100644 src/com/watabou/pixeldungeon/levels/features/Chasm.java create mode 100644 src/com/watabou/pixeldungeon/levels/features/Door.java create mode 100644 src/com/watabou/pixeldungeon/levels/features/HighGrass.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/ArmoryPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/BlacksmithPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/BossExitPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/CryptPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/EntrancePainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/ExitPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/GardenPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/LaboratoryPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/LibraryPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/MagicWellPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/Painter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/PassagePainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/PitPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/PoolPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/RatKingPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/ShopPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/StandardPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/StatuePainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/StoragePainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/TrapsPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/TreasuryPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/TunnelPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/VaultPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/painters/WeakFloorPainter.java create mode 100644 src/com/watabou/pixeldungeon/levels/traps/AlarmTrap.java create mode 100644 src/com/watabou/pixeldungeon/levels/traps/FireTrap.java create mode 100644 src/com/watabou/pixeldungeon/levels/traps/GrippingTrap.java create mode 100644 src/com/watabou/pixeldungeon/levels/traps/LightningTrap.java create mode 100644 src/com/watabou/pixeldungeon/levels/traps/ParalyticTrap.java create mode 100644 src/com/watabou/pixeldungeon/levels/traps/PoisonTrap.java create mode 100644 src/com/watabou/pixeldungeon/levels/traps/SummoningTrap.java create mode 100644 src/com/watabou/pixeldungeon/levels/traps/ToxicTrap.java create mode 100644 src/com/watabou/pixeldungeon/mechanics/Ballistica.java create mode 100644 src/com/watabou/pixeldungeon/mechanics/ShadowCaster.java create mode 100644 src/com/watabou/pixeldungeon/plants/Blindweed.java create mode 100644 src/com/watabou/pixeldungeon/plants/Earthroot.java create mode 100644 src/com/watabou/pixeldungeon/plants/Fadeleaf.java create mode 100644 src/com/watabou/pixeldungeon/plants/Firebloom.java create mode 100644 src/com/watabou/pixeldungeon/plants/Icecap.java create mode 100644 src/com/watabou/pixeldungeon/plants/Plant.java create mode 100644 src/com/watabou/pixeldungeon/plants/Sorrowmoss.java create mode 100644 src/com/watabou/pixeldungeon/plants/Sungrass.java create mode 100644 src/com/watabou/pixeldungeon/scenes/AboutScene.java create mode 100644 src/com/watabou/pixeldungeon/scenes/AmuletScene.java create mode 100644 src/com/watabou/pixeldungeon/scenes/BadgesScene.java create mode 100644 src/com/watabou/pixeldungeon/scenes/CellSelector.java create mode 100644 src/com/watabou/pixeldungeon/scenes/GameScene.java create mode 100644 src/com/watabou/pixeldungeon/scenes/InterlevelScene.java create mode 100644 src/com/watabou/pixeldungeon/scenes/IntroScene.java create mode 100644 src/com/watabou/pixeldungeon/scenes/PixelScene.java create mode 100644 src/com/watabou/pixeldungeon/scenes/RankingsScene.java create mode 100644 src/com/watabou/pixeldungeon/scenes/StartScene.java create mode 100644 src/com/watabou/pixeldungeon/scenes/SurfaceScene.java create mode 100644 src/com/watabou/pixeldungeon/scenes/TitleScene.java create mode 100644 src/com/watabou/pixeldungeon/sprites/AcidicSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/AlbinoSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/BanditSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/BatSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/BlacksmithSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/BruteSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/BurningFistSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/CharSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/CrabSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/DM300Sprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/DiscardedItemSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/ElementalSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/EyeSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/FetidRatSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/GhostSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/GnollSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/GolemSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/GooSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/HeroSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/ImpSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/ItemSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/ItemSpriteSheet.java create mode 100644 src/com/watabou/pixeldungeon/sprites/KingSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/LarvaSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/MirrorSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/MissileSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/MobSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/MonkSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/PiranhaSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/PlantSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/RatKingSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/RatSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/RottingFistSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/ScorpioSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/SeniorSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/ShamanSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/SheepSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/ShieldedSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/ShopkeeperSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/SkeletonSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/SpinnerSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/StatueSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/SuccubusSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/SwarmSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/TenguSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/ThiefSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/UndeadSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/WandmakerSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/WarlockSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/WraithSprite.java create mode 100644 src/com/watabou/pixeldungeon/sprites/YogSprite.java create mode 100644 src/com/watabou/pixeldungeon/ui/Archs.java create mode 100644 src/com/watabou/pixeldungeon/ui/AttackIndicator.java create mode 100644 src/com/watabou/pixeldungeon/ui/BadgesList.java create mode 100644 src/com/watabou/pixeldungeon/ui/Banner.java create mode 100644 src/com/watabou/pixeldungeon/ui/BuffIndicator.java create mode 100644 src/com/watabou/pixeldungeon/ui/BusyIndicator.java create mode 100644 src/com/watabou/pixeldungeon/ui/CheckBox.java create mode 100644 src/com/watabou/pixeldungeon/ui/Compass.java create mode 100644 src/com/watabou/pixeldungeon/ui/DangerIndicator.java create mode 100644 src/com/watabou/pixeldungeon/ui/GameLog.java create mode 100644 src/com/watabou/pixeldungeon/ui/GoldIndicator.java create mode 100644 src/com/watabou/pixeldungeon/ui/HealthIndicator.java create mode 100644 src/com/watabou/pixeldungeon/ui/Icons.java create mode 100644 src/com/watabou/pixeldungeon/ui/ItemSlot.java create mode 100644 src/com/watabou/pixeldungeon/ui/LootIndicator.java create mode 100644 src/com/watabou/pixeldungeon/ui/PrefsButton.java create mode 100644 src/com/watabou/pixeldungeon/ui/QuickSlot.java create mode 100644 src/com/watabou/pixeldungeon/ui/RedButton.java create mode 100644 src/com/watabou/pixeldungeon/ui/ScrollPane.java create mode 100644 src/com/watabou/pixeldungeon/ui/SimpleButton.java create mode 100644 src/com/watabou/pixeldungeon/ui/StatusPane.java create mode 100644 src/com/watabou/pixeldungeon/ui/Tag.java create mode 100644 src/com/watabou/pixeldungeon/ui/Toast.java create mode 100644 src/com/watabou/pixeldungeon/ui/Toolbar.java create mode 100644 src/com/watabou/pixeldungeon/ui/Window.java create mode 100644 src/com/watabou/pixeldungeon/utils/BArray.java create mode 100644 src/com/watabou/pixeldungeon/utils/GLog.java create mode 100644 src/com/watabou/pixeldungeon/utils/Utils.java create mode 100644 src/com/watabou/pixeldungeon/windows/IconTitle.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndBadge.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndBag.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndBlacksmith.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndCatalogus.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndChooseWay.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndError.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndGame.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndHero.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndImp.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndInfoCell.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndInfoItem.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndInfoMob.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndInfoPlant.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndItem.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndJournal.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndList.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndMessage.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndOptions.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndQuest.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndRanking.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndResurrect.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndSadGhost.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndSettings.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndStory.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndTabbed.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndTitledMessage.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndTradeItem.java create mode 100644 src/com/watabou/pixeldungeon/windows/WndWandmaker.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000000..3335045086 --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE.txt similarity index 92% rename from LICENSE rename to LICENSE.txt index 70566f2d0e..e587591e14 100644 --- a/LICENSE +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -GNU GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. @@ -618,57 +618,4 @@ an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - 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 . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/assets/amulet.png b/assets/amulet.png new file mode 100644 index 0000000000000000000000000000000000000000..8ebbac7ccfdd2595b80e116fb845139b8aeb9b6a GIT binary patch literal 1025 zcmV+c1pfPpP)q==PWW%FOUKC}Dj7iY-&%93j!=-ZK@q?8!9 z58q>RkA6IKaY8DqRNw%N;EUF{(wp9jI%ddV%@8SVjJxyj9{ZvrH7x}?Aun+74#7LR z^Zz$>=u z@04xpJDr~zBO$rSfVJ}CmUv}g&%0aZXiu zbcKlrN4c45viV`B!QQ?YA#EX2f$GBV%ZK!gcO{g)|6foqK#T%Ozfzat{d(yKEQ_-n zh>`typYAw0QINzNklQ)M>H;Q2-IOPToOHSu2G!+>D;R+LUsdIFY?pP4(G?8fk5s;p z=!8FxRqKN43K3{8A5m*0(*;wTiCrP=2f7B7s>@pw1#>Z@-qj5iJ*0hfMC-Mm%xn$|Udv!0*WxFIM#hx)B@d3Cc1EfL8^MDE z7|Qe1qMn3K1IfrSIom_ltgB+a`*%sj1JkphsKEK20F6QKQ3p6+$PDcmIOIOV7+y3P zA1o>z;4wOeMN6&~cG?YWNDO%~03*29K31{4u`OI+1mA0b_W;gLL+IJ)} z!=aSD)PNQ`=-&4N$DH%v@cer%L+YZfg_ZE&P}CVkjm3*&6ze$m`XXT2+7O{C!K5z5|%rRwBVi* v0D;~;5(yK*h$27F;ioKeTnP^HPk;dcJz#o0Zi+)=00000NkvXXu0mjfM19}_ literal 0 HcmV?d00001 diff --git a/assets/arcs1.png b/assets/arcs1.png new file mode 100644 index 0000000000000000000000000000000000000000..900b52e137177e12a8b3d0387327f1408bed2372 GIT binary patch literal 2911 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 literal 0 HcmV?d00001 diff --git a/assets/avatars.png b/assets/avatars.png new file mode 100644 index 0000000000000000000000000000000000000000..3bd332c5ab2ab4602cc98a18b4f33687a55d2a81 GIT binary patch literal 6337 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 DsoC#E literal 0 HcmV?d00001 diff --git a/assets/badges.png b/assets/badges.png new file mode 100644 index 0000000000000000000000000000000000000000..20d380331b131e79c59278faab06040c57017e8c GIT binary patch literal 7074 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 M07*qoM6N<$f@)~t=>Px# literal 0 HcmV?d00001 diff --git a/assets/banners.png b/assets/banners.png new file mode 100644 index 0000000000000000000000000000000000000000..b0a01b787132b8eb88fcc097a769d56480d7aa8f GIT binary patch literal 11651 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 literal 0 HcmV?d00001 diff --git a/assets/bat.png b/assets/bat.png new file mode 100644 index 0000000000000000000000000000000000000000..d1104c422c99820d44d2c2297aea7eeea1f7ed0f GIT binary patch literal 3456 zcmV-`4S({9P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z00083Nkl#mS z|C5n120K29PX_!k>BR7*N-l!PS?=g<*uaCNsxVWz~QvG?vL zwTK|@Oe$tmQKW2+cpg#x06-!V+T@i8;zW{jS@JdUISZsFl5#h03w{B2tp1drMTa2F zP!tQ^^S>>C+`QI)an*(MDgRnBOV};sr$~^jQrLU(Tgowba|EI{Wi7(*BGkq{yv3}g;h)a=P5<*R|pW!i(T8Pgi zfMUh_W2*U8z$mwQ)Z)|F6dhZ1H|?64$5x(;GqsYv2q%$0n5{&AkJ|*Q5s)P}ck})+ zZR!n+!?_r9tv4c1>+{*_J+IX3`wY zsb};Dc&$a=w|zz!6Kg@|IWB zB0_!NW9<>}sRgjKm_p*0j2pgl1R|$?pICZ5RRIu@EiA@Wl6bdo&cDTPu77UbYu#_F i2-YV5)d60HzXJfGpWC;y^>CU10000rAa+AT1B%-E`g**2(9I^s9*~~K#zqV~2)PZPUHAYCGDk(3=YL7jGzQ6^ zVqiX}<|+m@+m8%9KSchkYe_L;GXS3+Mj*iEFhY9J1Dag75d)a;Nq)Z`#-JjUN|J$t zSr6V6V4!0Ij;d={Z!vsj-^ieA%@0@fg<~g>OvBJjSPui8^rSIRoB{$vUE#^-;WML%F^cla`JKvl9FO53heBx!R}tR zawdl3qQcW5B{La%=FFc2CTEG^7z}`Ja7@j|W1y=yFR6$-A zLnBBJ)B$ik&22ScOi0h6Lr1~EheM%dO96o!9bsITl z03*Ybtw4ue{r~0r1%}K@cW^zs99YGGfRfVz28QVv`Y`k;Ss!57c`Xqtja3f=NRJjj z1LLU|AO6Gipa3H5A;N9s6@nM89AN~twL$Dlp6eMN6pAuPSp8vmTCs=0{q8%4t{-0+ zKrLHfiOZ<&mI|$!o-+EzNx}7m2C+i)EapMc0|ekgYWcCJU>c~0fsh`UJ|x z+ZleW7Gz-e31#@4w}&DB!CQu;uOCtDAqBwO>L3dQ|I2{cM~_}*(0TF~u4v=0A8_@^ zRnFOavxw4z+#ev-9#8#2T;=)!Ht7Tp2E&V+A=16q1ZjbhY7* z@@M0~2wh6`06oI!&&rOX2b}B)=mDvjs-c47d5W{ZwX0X*f*XE*XD~4_`41}5kz(gR sx(w7Di2}!97{P4X0 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 Q*9rzy6g1^)A(r9)0}Q6XaR2}S literal 0 HcmV?d00001 diff --git a/assets/buffs.png b/assets/buffs.png new file mode 100644 index 0000000000000000000000000000000000000000..7c12ab545d99a634aa6aac1e00e9b286a1f41704 GIT binary patch literal 19015 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 literal 0 HcmV?d00001 diff --git a/assets/burning_fist.png b/assets/burning_fist.png new file mode 100644 index 0000000000000000000000000000000000000000..ea34c58c065f98f7f00b12290d4db5cc605362ff GIT binary patch literal 2024 zcmVP)OH)L6m|fA_T=d{*?6K zPicls)NnB(7`vVC?7Qw+cb|QJ_PKYM3$73LoOAa*cb%F0?e(pneWp~cRw)%jQ>(-K z{|Qg~zWlG0dA$RrQi;+&w|n<)+O=yJDJB3d;5W;@YZ~_)m-{LFd^42*kT<6%JpKLn z4Z1xvLQ8ktA0x8x;;AhTw$W1C7EUcIg$AD9QEHffd~5aIU4(+)@cZsR*E$~9@rC`E z2n6@D?^R!z&;709FrflqEsh2e*t^U*Z!ZuT`D0mtW#89!9^5|C5q{wO{wj5^F>}|4 zh*ll!s$cWNo0ahRLYeNZ1?S*5CIo^DFCHA+&U|T3uC*k82h9-1A00l610>E^Grhh* zm`LE#g~<($k0H;~oZrW`kMmFIeULEV@Uvbs146(~58yq_o$RA3|IS5lin_zdSg4m|=WO)Vtiw;e6dkMCAd35K!NqHp?s$_?6$k%W-q@ zkYXDSFVF9GElhmB2;pMc0FB_*XpCEc>wwXH{oWHt< z=&L|ugZGOGfyM8vzCS||=vh5K;NoiieVbqA!RPOgBGa>aT74dC%9U~0_sZg2F&;et z3mhSEr3wy(SDquD-y1e~5n zC}@B9eICv~KM*VoIQ)}unE@dIHHYBpCyO0tgyF{$!1 zEq;n(`@=ride0l&3-r56r%dfXq2Fwivp_ii6AI(563Aj&?xADg%z_nVs4{)@HTKWX0;5u|;Y9mE@s z>5V^E^p`*ez}FmlzEY?MAZvRGMEXtZqt`pXh|cdIa~R3CeQdz0`9+<-rQ0e84wy^; zO~9H+B=#B7`1Rp9i(8j%8}>5>QapS)SF|t#a5<^HHRN76qxDE{i-3I1_T}z^%Rb-3 zCl$m$^qeHr@o~qOI{{K0Q2RGF1Ji4M>G-Z~Kt%db1T3MzwNvjB^_SufYDa(G+Ox|5 zcKUhU(LClJp{OBPD-m*uKrj7q)!*z=hYD7)G%uwx`=&W+xxnx z(4%q409^Nw&-?>f&Ai2rM%Uon^_jg@b1#0{F9~JQJK(LpMV-+j!SXuSR^aE=YN-|c z=Ha0k+eJB7v{(QX3dOyH4*d!g3Kal_LZJenP$*OY6bgk3fI^{A0Z=FuDgX+FLIpsf zP^bVX6bcmpg+ieMpin4O02B&^3V=ePPytXV6m5?G1sDML)=tf$VcSyx0000wbwBK literal 0 HcmV?d00001 diff --git a/assets/chrome.png b/assets/chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..e11048efa18437b64c390b7629b749ef9bfe06d2 GIT binary patch literal 2017 zcmV<72Oju|P)04E`uYBB>}TB>qydNfk{6lT`3eX#*At4HN?+VhL1=Xi7Cy z${nO6)qL1gTW*`?!!%7A3nf|SU2m4TxxKyFyPdtSd0@MDdpGaiJI^!ke7&102%!K< zj9bVWm1&f96~j%tBjok!_&jQuo>t(sq9~&LPq$u7ZEKnqcCuc)@XzV5PlV`;(^E6( z^X@N$JPulvh0h|X{;;T>Dktqs&D{H+0Z%z<;PW9Z|0gD{7@vhgqo}2&HE2gP3CbhK z1pxTv!X^E@-Tx?>Rd2^RW(Bq^jjv9eMo&FmZRoiL}J0Br}t zKD2x*i0~iC3kILn34~T`2T+bKFH``;0Rq+$s|sMtnzclL$K$cIwXv~*e*W=dLR*A< zY)4IE$B*rVu^pp-hd#f7gM26b2f~3kIF^@}QzDU+7X>frx4>cAY2Fq~!d|ip1M-WC zJW1_=2$I-Qv7K8ScKmk62_pQ5J{!V55yIr;m@RVJ+nWs$96Qz*6d?ee5g4>UxCCd2 z^FSES0WFp;d+OwwAj&Za^50aXMMXtihg&l%Z`5d|`H!`3vFqy_IWYy~n3lQfKTlWa z7CcCzpdkey1t1{>ARz@HQJC<$bt9gUE$4UqoZksZdb1<~!1693*y;cr>^NX$CqM|c zI)HpDI}))GpfZJdZZcGoxiBoMz(R@DQZWm&jUUQRARRk)kcR(RGtcMh0?5u6kVMwD zVTFqaq@_`1Lu5M?mRNxRc4H?QSkj!b<1$Im2*UBAT2I%eDr5}6ZfV*Hp^3Ib$v%9# zaLNu3zz2vlPGDl$6NeO^>oKZ8j5+S*+qq4@yBd8f8RHBB>=swj%z?hm8O zyA597d64dYzH9jaqPBy9{NbO@rIOL3xJ^2*&vroX=i4RGwR`}x?NHubJ?QfjZHE%_ zr~bTY`-j!-b+^@%af_3n^8o;Mw{#)wi_Qm7kiewSRLKXlwY9kt0aEFnYz){^sZ-1H zjwgktX;95T#X1UhtntF0=QQHNuNQwqBI?Ga^7aRT64^CJcLQ=SfWkWm-_)q}4Q*hs zUkad5@bQrkG?STuhObKjR)=bD%&f7XS#ao zCI)bolWd&(j++WEtE~S~fEUG{~hQnpt13(vdG`1wfNO zIy&uKvyTcOdJjVcAOJ%CXYbaBJ~=)d)U{we3t=(G{<}lo&sRo54^&IN}A_=DfeKCY)crB9rr8_Gz zLXh+)5r7-yM@QiSLddo2;uj4m^21U9*#SaC;Jw4ggJ%bOg@owWn!6qm-Ktc*YLJB}a3P7R|1@J)D zOkoS)zO0$T7QkJ{ZoqB}OJunKfG}0SA4-tOp$Nd{13D1_mX=mzZD%38ZiVc{#bs1p z?z8+3$qy8{C5#ck_X*3@zytySIJFPJiV32CnF!p<3I^NJtl&U&-=W}z;B~U~C&~w; zqW~Ng6{Us{*sS1(%PNFBO=Shcy~71B0CwXi)r}yM^hwS%T3cUV}lP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000NtNkl>*YdrewvmjjoOd(ZcM=lgrU^L>XA5e5ebQ5`#T3=9lB8N^fLB)?+qU5tpz#BLRAFSp>o&^tHEE_uj{WJZ@NH}0b-0&T69hP)ZQTb1eleU_K77n9sB2?5dO9cRqC%Bft*-y?GK1bIQcn}Vw=icI$?XNm2 znE_0VlNMR9e3oPFUCih68NO9Sd6mE;t``R5uYS5DshaV(E*0 zggyI^@_OhhPuCPF3ksQng$cyy410As8m3o2@V@m8vv zn6<@wGSh_l+nbckG~u;+AmC5aMn@X}u&xU+mLB%g*xJpa*=IIWnEihQ0It*(=MnUn z6o2@x)Oqj#$q~O2!J`s*w8#R+re{o3PBR{MGQ23a(UZrNuvUZcTz@aU^W`v8?cR(r z%T74g-%F>yy27jmaZ~$?w-R^ex(;jh*W+4b^S3wYwR*Qc=lu^o_!c3gV9xtWV^}zX z%(BG&CJOjn`9LYu5Ag8(^K*|uWFqDD&|H5n$*CGo*Jvq1{9Nes`M`@%A{@ubA919- z9vxns!{^z>qxx=#hf-^J*5S?MuaX^?S$f#7q%YzjA|-7*dMrjmTt`ve#abwFzmEcb zR{`&$?W*{nzkPxd_xtoG^8Keeo`UsF28bUi`ES7Q%F`tR#af8t4ESC8e3}29_Aoi! z)0KVL1#RX|J~chGUr!}P;}eZ=#d!p$zPiF>gJJDmjFuuadhUEddMNBLw(&?il;NCd zg$J`W>=bx82p5x^=w!UVuaaLW+8I`ZYnQ$#sYe5@BJ1e>Wr3N|kH)+4?<>dQT0UIB zyWE{fc|EjuNYiPJPd)|!xQ@Sz*!*2|U5GIrL}WYE2Kotm_Q7#_TCWwz!IT##c~IC4 zzVuwQF?Wefro5hP|8_MAZRQSYKf3?`sQv5$_ttPYY z{)iQ=2A7M6N3^Z*P_7KN6W*%aXfiQT=cY^*~? z|9D3PvH817-sSp2-9(5n*DS-s^N22Q;**a8@Yb9|Z2m61HRp8N(Rep@cm88obM2+e z%yD`e$xKtOesF?lDMEbL$MUblkD!~umy`uWJDnJ_BKNj;0fI;%iglnKKs}HS`3=8O ztRsj-*@kNtCChc7a(J){Z&n3=TJ)cU^UAbk`Z8^m9ydDLw!97%@7{)Umh6vb0orO3 zN7p|#wH=-n7=lQwg_4;j@D9OSZ;S%F`jN~uVd?iYw3$1gr3mdE($GEjD#T2~w1Xvd zUBnIp&m`ow_O{;xz|=UMb)Ugl_$D5N%>mB3&!7_r^7jA)cclU-FOfV7lm(dx`9W(E7xxYp3^UoLm4`d zx%%IV{whh|P5{xuVE{41{Qv+M@ir0!?3NKe9?ZV3ySf9^V z)*6Z(E6nhj$xk(3{;%S}3O!i|m6G4{0M9!CBh8J5uE1P>uU_?^>+db7;Pc{Rde~1R z-o~O&de~2f8ceQJ5&8a8L)U?K3*>i+`+YQj`-J{%cNgHl0RVko^cD31q{ILK002ov JPDHLkV1m{|5F!8o literal 0 HcmV?d00001 diff --git a/assets/dashboard.png b/assets/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..9cd503cd5320b1cbad3be00c163950ab0a985893 GIT binary patch literal 1779 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 W6LVcE9a3IqEm&G;ZCmp2#{UApnb@%a literal 0 HcmV?d00001 diff --git a/assets/dm300.png b/assets/dm300.png new file mode 100644 index 0000000000000000000000000000000000000000..6a1d68495a63efc614e53e4dfdb0114ae4ea4b28 GIT binary patch literal 4544 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 literal 0 HcmV?d00001 diff --git a/assets/exp_bar.png b/assets/exp_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..81825389f92f7846d4e98765d949008f0e723c75 GIT binary patch literal 123 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 literal 0 HcmV?d00001 diff --git a/assets/font1x.png b/assets/font1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7106aafc133770379f1c9b14966e19375dc3ecf8 GIT binary patch literal 3973 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 F{{{nzD-!?! literal 0 HcmV?d00001 diff --git a/assets/font2x.png b/assets/font2x.png new file mode 100644 index 0000000000000000000000000000000000000000..adc6f614b395bb045e58123c785b620280f4c959 GIT binary patch literal 5457 zcmYjTWmMGN*Zm>L&>-D{q;w-Np`{9lXBgB6QxbCXP zZvgj9Gw~lV^OllAale?#z!)s@I0Pva5)`RKm?NUl# zET1W8LI5)+rtooqu9ulz0`!sh#Cr_1fLFYL6-Uta6cC(!neLAPn0{fVz{pDk zn8@s-6ahym0FE;Jqy#_(0CES7UJ2kAFCd_1m68u^KhX4@Ji3)!XVEF@9 zgDfmQKv+6Ju6$wyKIX0>L32GQm0k;OVU)f+sJO|+tRGot$nhb3 z(`kf4M2J^UM*$!&k>cUEr?);xqADa(EUuBrl6UV1_Wd&(n~l3IRE4`70IYchPTcYE z*U<(`VF$b16|fy*Ia=W7y}O8Us3n$b0P=R{jZWSF(?%&jp=EAvYjg9Ldar`1^{`RE z9SmXFWpwNOFA#ilalYEQ&Ke?Q9-@MExr!J)(=4J#CEs7O9 zfpU>==#YBEDQ3i;3KczzR!Dl@$2NIyx4y!2jVZGt3e>!j!SGMyEj72r{Hwu10`=-z zzW{)fHn;AdoH&@ljvv=h-uFkcw<>vTK(K>ak_P}-D6;bD57)^K-~fPPUIJl$D0 zHBT2defQ(VZu}c7u`mVJUW5XP0-jwky{FZ4c&Gwr#8?djmlgj{IR=p~9mj}dcOpK7 zK{JuGJMon@PEI#xdk8L;{2&gQHS>HFhRr7^OB@bWdiW)Cw<;EC3@g)66uHhbjYLsZ zLETUKOa`h9C(@peBqGg}TN9-Q0in>Fh;|jhFCn!$(mx3rAT6chv|-8x_~Uk7f*J9Y zd70y$^|aElV)^Lt3Pz8UN6FsZQlX+ZmT+A>X1jn=FQjL1{)+hgZ zscnP=BcZB1EHk9>Wc(!lQIKA7R?=vQ5JyYGBen0}^e0Itl_y@| zT`JAje`);|>-p_<@OH=2=!|X&@5%DfWw3q$+*xZNr zTy1H$3~e#e38WbWXEP_X4iPR z_wq19_hn1*^I|DYDb0bg(XoQDnRL-iX~9_`bS64;Hgl!P%EZTnr?IrL*N!mANDgQX_mZRcbO@mD%+C6SLmf@)Yv%p_QRq-IdIagTE6hnJ>_3$VB98 zqVQLNJ2T@T>uu|poRist6pU=T~bQ+osRdd#$m*C^75_5I#T)8eJ+9zDZv(*yDQI^oINvOG$DVal=@t(;=NLsQ(@MBV9f`>vm^ULH$*dA=# z;r$5QKD_p>&o!orpYbbb$f+&?{@9oouTi0RN8f~VmJ3u1vo~`1F%~^6ky4SvJ$5i! zH@uJ_o^_Oae?W>LT}x^#iqJ6PWq@vXz~4yJf<1f}@HQwOb4M6r!@@Ut9m}^7%jaM41uOhPPWGJFPRgo`HrBVd_ z;#~CEqKkAJ{*k`;rM|49x5W^mFi(8qY z&IJPugO}3|)ArYD*L4@NRng_UmnqjS=9OA59tQ)MlbE+47NW-4mY>rMlhXRS@iW}} zDntWMJMXfOym<-52n{}G^{=zIEBbEkUf`}=FcM16zmN5YuYsnXzGr|j@V`;WILT1X z)XTUwwJ~kg9+jDx*<1FzQCWCOoFxJ__EkUCA9_8%8#E}(3>vrywizAl?&|fkEpxE^LS#&LSeR+2H@3pO3lDyi z$yQbOB>?!b0YLCa0Qh(R5O)FKod5vrSpk4#8URqaC0X_w(0huKLXjtLV{+0px#xYDYc$R zRC!As#N(#229P|VnQ1HhJ{l0addd)w03UvpfXzF+6KZE1)8BznG5#?>yAtqPKWK8i zH|P&p{j}Ynj?eAX+=`sIL;7?zI8bVruZuY5kLGe+Uk;rwg_JbAlDJv+>8-hRceaHS zCxD&F|E=I4Gq&moyRC;FS((O*EuygkD$n+f)Bin5EJsu{Dj2ESv z@qvG5anZS`O2J`7H?5MlDI;}>TIUI?Jh=@4 zh&{3loc%$QtEAZPn*-_b&0%&m_sXtV3fGpVs&P9!8h!eMgB&oltZZ@L-dL)dq^vAN z^A*rk)YuBnuLxD8v&YJe+&JgNgehyzPdUk;OvQ-Yq}w}aDp7d60`I^kR=aEn%oAY^ zAJkqvJg%Eq*W%l8jYv%`pZ3~!M^BF>E6IxW=$WShDvD^D>Ob!OXm%f>&%R?x9%=~T zQ5hDLbSK5}diqQ~LDvaYJW8rv7R+DJps<~i-NtZ`-T*@L^>$n_F!UT=Kt-bd5TM~f z_f__`%8Un-MH;DWMeKz@6p;Zw=~hS?QyS4bvVoFD5psGV`Isj%JQ4KtHTCwa-;rrS zv}b0Dk=m?bDlUnV@S2>7^gtsol4oa$=P-M-p{Kt!p=uPbqQ)ie%bNbum#fOnj+^F6 zIfmp@VWG4h%hex7Jz^pyWeMM5sQ)0&7~k1(TW^Zd#rY%cq6Un+MprsX^7}r?(|7y% z=-U_$B@|2Fxrp-dCBr8=8oG*~$_qY1lgJkP1r;I8R=x>pZ?45(0UakxbfEHIF<-n( z3qlfA+Pror!+C>noX!NPdfxpTLE~(rb6p24&GNzYx$2=c@iTQhQnbjf=Ig3Z3T@TK zAQT#`g7$6oXz?RLozf3@#L{Tn^Mpuc?RYC~OdsY_24taI7Gd~DH<{DKODnxfCk%AE zeOZ=|qeN5U z+2T8r1utrEQ72{LH*AqT3(H#@8<2}*bM(5zRZCwo{O{>$REhB=3k^$8z8W(w^g;!XbW5(AXlHf0JtSqKv;fVf0 ztj_eRm2SFU()3Tg_QV`&0@meOycikApi!U=JvtgU# zP4e2HYW!(0=&;73?(KlgMZaCRg+aUj;Te$dLd0Q61GM(ID?R*hSg~~yxBTty8YvZPP-KL{-mD2Pa77iwn1}= zYNi)!wTB1&h1b4g#I{RSXRpJLP&d751+;!RdEhfw?cg?KID@at7lUMz)sbY@)AcJ; z!|j(J{z=hAXd27qX0MESJ{^kQbkQ#J&P7YFg>YQhSq*U*q!;Dq=VSZ@NO;O#Wnc+R zjw&AyM{iR^``juSLs=UgLcj%QAdBrO0qp4R>e zv@vv~_*Z~069_ov>qTrDa~XL8OgXx>&wpS~!g?poY1)*U3=3v@^&ZiZ*{s=uIm0vx za8Jhv{Ugq?5)@*CCLmp7eaQzg=0l>G)!!E2qq1X|tIKC3o4A3ta8epj1h#ysEy z;G}y;oCAY@qtDwXEjslp8%z!w~yi>Xt8w;W^=)76aO})95<=U zb`lG{a8qDa8h#3lp3XmL&Nq!{{-8oxD1y71HL56Bd*AN;pgST2M>OhBQ)c4uddDBR zb(tqjYv$+b&qVSW$=F|YWT<|^Z7^JB`xS6B_%5j|fj2Oz{wzL;759|7TSQ%`chtCu z=rmH4_PUA$V5cb{IUM0W{LbxPA(<;o=)9+$UR9Ll?A$F)kBEdf9ZOXbG`cf^*>_CK zv+B+MaDxrAxL-}wMd|={&Ek>3;1nJZrec7URm4bWH*L4e8*EFwHI;x+%Y;W9<$ux@ zL?lu_ma|JZsp|UQYT?BLdTkPn#}b?W5g48Mlh0D)8hF3fG2%fO-zP{kk#o&~9h@SN zMij)R95F@azEpdk6UV6f0#wqdO?#N?V+~zanjt;&kN0h5 zVD9>;MK0G~q3lY+8kF7~&q-X?4)1vtJj?fYr}FEttO2j3x!w%OQbJLW%{3}0mCyYB z7fgF)3wlN}%dMqj8T(|5PeT=dUpD31m_E;%p$=)Y+fD0hR^lyg*3Pz=aU5u1ulj4Vd#s0ke=!B8)Sk4cIpb%= z0B7TthYp|s{(Ip6K^E`sjQqjG{6E|TUV;GN{vH#6&WofXD#F4ZJS(84q@`G;U={j* Dcr$o3 literal 0 HcmV?d00001 diff --git a/assets/font3x.png b/assets/font3x.png new file mode 100644 index 0000000000000000000000000000000000000000..87011cdda89c08890e6d625d009f8d5a9a3f6de5 GIT binary patch literal 7520 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

yI2=~|-Evr) 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%0DXz1 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 literal 0 HcmV?d00001 diff --git a/assets/ghost.png b/assets/ghost.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ffadbcde922c8ecfb27392b03563b8ce2542cc GIT binary patch literal 1130 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 A3jhEB literal 0 HcmV?d00001 diff --git a/assets/golem.png b/assets/golem.png new file mode 100644 index 0000000000000000000000000000000000000000..e9e25d0fe39b9eabc89388da2891056df13614a2 GIT binary patch literal 1152 zcmV-`1b_R9P)ed-CFy z6p2u_ei38W0dpCZIn+o8sRsZs@1qCz2MjQCZch3bI)u*!1KR@L-0FBO=sX54TR#uK zDD&qT|E2Q_;?vGfY5W>tm@=6cKo`71rW-&vbtqqbUeX{?r1^CHJ2zJ{S082S0}o$Q zKAJ!oBTKQX>(}7+)i>hV+HzmtrHST6?0)?w&YV6qFn&`%CcZD~01_Dhbo06l;4*(G zf7r)gUjvt+Z{wK|G6&H134k1Lb8B9`>J0S7alw2#AMiz)m|laJ>z^usOd1+RbmCht zhy~pV=^{*Zk;>GE9XJLsUTBZ+Z5J8ngO5QBgW0SE3ewuwjq zTn50K`2TMPySR_}ZG78J23$G0D%O82_FjMZ*pYb*O!ZB>SXJ~7uG6x0SEqgK?f;f& zLe%`cainsK&NP4D6GWu3>l7p;0B{DlwsgaL63E9KlH=<|KyCq_z5GY4uZ3SgPTytV zGWC^i@9(Yai-(TNlpnM6;rM+F7!b_BOfn(>_Brp~Z$zIU@{E7jCx}r?K^lw!4n<#B zKmebdo#W%;jm`Oy?*p5D>$Oy5IkIS;2!DH-~oML3%MSY3&uC409*<( zqZU7=4T>+Yb-P^=5l|&I6+r5uUWyt(hyg-!Snd(v@#&-e=t)l?sd8w}K&TISVN5<4 zo5L5y$MMGmK&&B9fO*^PHv9RXzxD?LAi~7)Jwc$hEr4(-1f&l|)Nmk$plw|00#iN) zgcJZO{BS(A?dBXG1Bi=ns)S?u0q-Nbn43r7!f{5A|*1$H2qs z`|y3nAIs8$Fn_vx7t!BXrU0e|M8624!}S=j$mhSYH%mXhrPQuM zA7$!84h}6fUq6D=6d-iopijA~Z^=Ey@a3!bpoUP1M}rMfqsAEH-?tg_1u?84P=q|i z(D_yRVOA*tz?3$?PK^yOnCt-p!K78<=wm3$}yhVb%4#A2QhhWpG(YP|kPMju%q4-HirL>lt_&tA0XxsLyCPD~bV}SZOpU${6UiomJoashB;3jh+0lZs&$EB53b2Y+ zib!Kt6};u)?T)nml0Px>QquE%NeR7U8u-b%SRY(YAw*|J#dVidnWl)>z~u=SY|17{l*DKNTH`bI2` zH1vF|Y&Z1&MMBhNu!nQ&^}6?+6Nd`~A$*@Tt*uKb`L*Yz!baEGA_7+O$JWm=4Sc6E zK7LBUZPc)t%Pl-O9*-aZC;~lkBq0Ox!?l;o}^6Ulkti|Dm80oAh3tN0D)*0MZyCgq4L0Li1;}ArqDIBhyZP&q>3hG_XT3? z_$S~)q_$}q^UZ_|cawHjzMF&j&t4Gv+TO_=|AY({cr^g_a1gm#t!|Y;Mm8K=2~fd- zc7vYF-3PvY(!eukAEamP?D!1e69m9YGEOW_0CIxaA^=t)P%`y{0Ho|iGJdd@@IZ2C zJNPtRJ3mD5xEON*NbPN^vT*_UAOR?`BME>dm}vkD0w9t$*GFw8P-=^k?5};e1I!Nq zi^byMeB^ar(Ozf*P$NzpE&ziBKoWseSzSp0r0i8>kN%+uUky_7Yi)$|N>BO6Vr>B! zYBR*D8^^Q+U`UVzA<%}BH)#EGX#kID58n;|atD^(y?5W45VSR(mF-JA#GVVl2MB<} j;cx+PI2<2>UjYUHY*NQZ@|2wA00000NkvXXu0mjfp*4LV literal 0 HcmV?d00001 diff --git a/assets/hp_bar.png b/assets/hp_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3197e0735136ab55a765d20b79066c4c203a19 GIT binary patch literal 2853 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

    vEtd>0X5;fL&)*6K+5I6N=WqNIkLbG|}R} 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 OATO=*rbf~v?Ee6(8NlHH literal 0 HcmV?d00001 diff --git a/assets/piranha.png b/assets/piranha.png new file mode 100644 index 0000000000000000000000000000000000000000..3865e624edb01c2324803dfe0e3c5049c8ec3956 GIT binary patch literal 1441 zcmV;S1z!4zP)7E!1ME*4Xc}CtE&DwHKvLz@8#KG(DtxYQBg?Y_{|H${>(e?&d%=hywA+8kWx}B+UV$L zOZ8`DWF*~Rv2nM&`Qs#?!=2f_%pnD$t^4*&-= z!0+NKAMd2;H8ZrKQpxn|erab@8~{{<8!=F_+QIMQF^;jS0fwj_ohn{(DE1l@- zlG79WbHSVti{vCD#8|2jf?^2Pc2fWsiCz}a$hH?IexY@5R@J#1|16`92NFLMtN_0z z8LsVd4t?EG?M&PCzqM6DRs3*&Swa-M6ba7yLyM zT?2aUi_a@SYXhLoIXgEk&$aa|na#`0D$YBbUr52P?c}{PbpG=1l&F-ZYu=QNKIk^K zzHq`ozZK~vO2gKs%oHP78xVjAL@8y&d@_N`&$;;PHZK0#4}7O2y)H*4=48A@q3hRv zl`bpp$mkkOHgg5E32gEAT!V1LY}0uT<|Nb7%-PfQddE~68{6@vtDsIOE30b~GBWl& zD?=DsF}&N~o05giFvf?!{!^mxeUz}${%9(I6oeY6hGl`emShlDf8Y4di*#i&x+|dh zImm2W13<=l0oE66U9QwKRP}qA>23C4f15VD`AvT3_9M!SY+g6 z6YPJS0$9MAXI}n3@qHw{Z$|e8G&i(4e(W4gPA|8{<|Klc@I}EsFZ1p>CLv4_ip-ZV z$|#0~Od0Y3ZPr26L7AX{q;OoM^a5cl?jm560J-J>_DIWk2Qa7p9%K@gS)|i1DY6lfu)LHFpT7JT79_Oy{%TtP@|;pLSziiF z!q|83tQsE|%Tf#`ar!PY0*HG2aqkU4YiXtcof4rQ8$EWY1F?gc&^Hj8R$|FwrSOR# zrYGeHz&GocQ3}p>a(I*Xsyol1P~n$|a-w0vZ5$ukWb`FIOXzJ7skjOERMdqS#UGbow3ImoQuv zLj&Y@oTd!Efad=rKw0q5r0VA3`^`jy%&T>;_`y6AIWnPTPFKqUWf^}%IXL+z3d2Sg zk@mwE18%22dL!4rUG0xUA5hQxpJk5CwokuRs>?^=@h>@JLhQkIkm%zvqCK`YsE-@c zunG*je9v@i~oIG-|o-3lmf5}T2wS2cJ;Tkwfb-S@HnqG zNx<690Dn|wYSRW5*~qu7Qrk&%DFL_wxv;bwG{MdGhlz&BQqQf31cH@N0Ig;qfG-aA zo2p}FayVrpp}f`UkQwablQWhpEup4(8$27CJeTyG(Kf9|JKm4xXG>-r)DH>K8?(VV vemZ80UVe;v5uWp-K>)#m1$#L5uK)u8&mHIvb@hn100000NkvXXu0mjfNJ6ZI literal 0 HcmV?d00001 diff --git a/assets/plants.png b/assets/plants.png new file mode 100644 index 0000000000000000000000000000000000000000..72604346b0d4137d7adfecf24d1359d88fe27635 GIT binary patch literal 1910 zcmV-+2Z{KJP)Jvf#wOcv zI%d|91gnJAW}M$js$2o)q+;g>Xmq?wqaWPw(kv*`!zLoR|eo0(*; z+1z3i9gNgIh-Ihqd(VB|`<(Z_=iGaT-|B&vbKk$`dEejf`E%Zz@_nE3Nh+0cj3%#; zc?t6)YZ(1StzGQ9MzMw$lu_wt+t-cUYmsMQeP1f4A!f3_k=%}tgOeDbw5t2QSBx^N zJ>TWFZB8n(2F5)7@SwZ%P?c_%dKCMv?%xL8+L}t$c3UcZSDeVT#`5z001bq zy#shWKkpq!vMz~X&f&F8eYm}B^-Nc`{XKj&7G&H0rR)5ZN zT_^+lVoP88&hqPYdgLZmZ(TAFc@GnV$J-CT5IwWmp-!a}Aj7(;S=>K^Cr=^TYFUj z0Ztvf!y1n!tx2WFmX&I2M}b%1(9l`a6d_x1Fo`jg*8&kj&>fP*umP()m49ob@4Af;B@fniWs&qptp(V8WVF2?cLz{}+5&ejc(O_?>WmO3x))bEodV2kddYs%so z^y=0VdJNjp&wUJeiRsz{U_EW^aQy=rBj3?M(nCm+m~Jo5)nAz6Xz+tPz_XEH(a}x? z{sWVVo}WLS?rpn5PGcppCy?L|1+LuYM&a&d><1A5dhMF}2w+kGY@ByNA0IgSFpi19 zdNa7~Tb4zzDe>mdi8?WBdnO)irFAR@j)57Pn} zSdQ-vdkg>UfRb=KI<85z!8^#qHj_|x^(e4<4g(x}nS{~;O+fhbPiF5tkK?oifXN8p z0k|xZ6if_TqA1UB(Faet68PnfPtc)t`%-d@nQtiI1D7v70P5@=Y@R?9z;+n{@K-LL zsgpmQ7#d`W#8Iz4lJGGZ5c}c&nc+#`b3fue0ASz&0K5a=6_^4*01U@_PV`J`VHX@{ z%@TB3H$Mku4q^jzXz)^`Fd>pizzN{eyIM5x?EV*TUFzdECx}wEZVtl>fMviLXh{h9 zB9@|5A5O@~{T$ zWwZPw!69?lSU2yI@(QNzG7PcxGx%QD$p}%M#yM_f)dWQXB!rw3m|qJ>^bW7upWb!k zGxe@z^B$vru3p#A-Ca8=6T)2E-X+N9Z`;ja;!U8u#p194V#M8^!LktJObfClUGgSP z9&FsLSuwYGcqbFcw0@HSahEqtfci;)sU(nd1oJbF0RX5b_yOojzo70&5^z!|&tS_( zp8LuwC$dkFprmw+`VH_`-2Y@ciTs?{FPkx!SrbB%dUf&YA}=f46B0FX%}(@Sh#ng9R*07*qoM6N<$g8X2iod5s; literal 0 HcmV?d00001 diff --git a/assets/ranger.png b/assets/ranger.png new file mode 100644 index 0000000000000000000000000000000000000000..56175742b18a3e71c7584066548c75168138943d GIT binary patch literal 15539 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 literal 0 HcmV?d00001 diff --git a/assets/rat.png b/assets/rat.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8372fd47661ae36b9962321b19be78fba7b4eb GIT binary patch literal 6493 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 TeB5l*{}oV{*O04)T7>)$BiLpl literal 0 HcmV?d00001 diff --git a/assets/ratking.png b/assets/ratking.png new file mode 100644 index 0000000000000000000000000000000000000000..d39b944534381898677095090dd4c01694e4655b GIT binary patch literal 1187 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 Z=v6+LowF_E^i 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 b!!tl3?#GrQx7CZdZvqtM)MV=+=Ar)s%7OOY literal 0 HcmV?d00001 diff --git a/assets/shaman.png b/assets/shaman.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc101ed08c477fb105146940fe177126066b826 GIT binary patch literal 1514 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 literal 0 HcmV?d00001 diff --git a/assets/skeleton.png b/assets/skeleton.png new file mode 100644 index 0000000000000000000000000000000000000000..8c70a2094f3fcc234e99b2dedf31b64c1ad93e50 GIT binary patch literal 4182 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 literal 0 HcmV?d00001 diff --git a/assets/snd_alert.mp3 b/assets/snd_alert.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c6af7803e16df2eaf3116ac3bc2b6db4d6f38426 GIT binary patch literal 9927 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 literal 0 HcmV?d00001 diff --git a/assets/snd_badge.mp3 b/assets/snd_badge.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c022ccd857e82d75ee25d39a51397e6e69924482 GIT binary patch literal 5956 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 literal 0 HcmV?d00001 diff --git a/assets/snd_bones.mp3 b/assets/snd_bones.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7ec6f0a37376053a228ce97b32268e7fa86b2bd7 GIT binary patch literal 5172 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 N0g(UU{{Ppi{{YD|Ra5`~ literal 0 HcmV?d00001 diff --git a/assets/snd_boss.mp3 b/assets/snd_boss.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..942bf3deafc8fad73f4643e73aac2e5850be8a1a GIT binary patch literal 13375 zcmcJV^+S_k_y6y~V03p57~Lt&h|#HZgMc(c0TGGOE!`l4(d9@%5l2Z_q#_obqJUr^ z$anL3{($H6!*@U5+qKtq&Us(wys!K658W65fJ-&Fn8r{*e#X8o3kn!`SEl}Vf(YOO zWN0AIBa|7yi9``QC^|3+m6Qk*RM~P{_%QB=rgOFosKUf0Upp5Ls6o^rO zJ*j0bjt?#=$j^Gqg;d0))&>J!-x=zx05l6=^(94z?F#R>;R0h8Pm9je*r#zsudYz2 z#yem`uD%z>-E5j4YNcpZ`;BFQOJCxFh*02@8zD)h2GEwQ4rBpY#|klTmw;LZWOk0Y z3EgOoZb|F1W@}h-yB*_TtYTTy^H{^CDZvPAgCgP~s`Io4-$Ux@^o)_+yeZY4>ZMOE zV7dO~QWUYPLcgUET~M@Jm9+>b01?IOH3fK*vR#GOqzB3TV28GiQnMtp{+2r2m{K{j zY%-$lvZM-YofUpH@y*V%V*ji~f`t3+!Pk!lc6scqSlRu8$)$h{{$0t2Hz{I`Kj_vP zxHeyZ%zxi)Tp$O~(J|=ep@`iGKqM%{f?en)OnU{L9)z_n3==bbKS`XKD?>dp1AWS; z=^h^ePFf`mzzPMwey-UdKe_s`8X-Xk0E|@6%C9`9c*E_bI458$xtr}p*;~l3x1hHN zQ4zl-@HbW{R(}c&K%LP<1R!D*BG4u%h3XJqPSu7QrJ$?MuOQvQaIQSnXWSf%dPGvR zvz($s5We$kH3 zpGk#j4x(9D0L*9!Z0{3*z$gUR;Z{--Hn)?uZ9%v&@*Y}8$1|yq;Zt`+aOg3c%dkV| z9~s=+epQPY6*G;+6`+J{rswr`-)+`FB)g>4GZ^=fR{6+!BOgodV z8^xU`-hT=iEDf7W3Xv*snO_W}KZ{FLwnH<{*NYm2^$i|h4!AwU>HPF>hFQUk(Lg2r z(NF5~_<@v%1Rye$p0in8JWLmvOWR(^!iB6Gmtdv2U#ops#==;y&^`V2O`5=%Rt3Kb zn_SrmP5xfA^1O;6of(sz>~4_x+vm$aBQ{UIF2eaBl){y2!w5cBTlX$nc|Yf#IXJ0>) z!*bzz1Ry2=>}(gBRJsShM-qIPUrK}oibilm6Uf>T754S;;icW{MwU~?Md4rnzO26W zBm)NkzpM@o{KWQX`{Rb_2eidmfAFW>@=D`cRj{`uDuq$E0ImbNLKBSY z7y=Ln07l#R*T}4+lEH__ozACqjw~ajtw9d8IBbZgUtMW44zQYX9vLAv#qJcy@6Bi(PLyBmfDa z^u}yL1nMxjBJvP*0Wx&}Bop~uf0MI9C!GJ&Fl>$J2Kfbw$f0Fo0s3q7tJ2Vy%RjUD zf1u6%GWQ_Si$4nMEAQcuHsmYhc6w)m^o_AY-GLdqR&B9fI*eJ2c!8SVUdWvQBo?n% zc`XRQVo;fBlGe5`d-Zbo?bUvCAcw2|X+wRCr&M2d*40+;SD)|B$4v!TQqd8IiQRg}&sTwXf!Colx&bce$T8SM*DrP8PQAC`lyqFMK?BM@I(G7X7{kPO)XJ z6Qzh@4oH2u^KOk>5wamKz^P&NXXSp9_s->MORo$72=arZX8}4MeSERf;TJ+cV?qS5 zx^Q$3UbfT6%C|SP&Lrx%A7nYEQ=9VS^g`xe&s?#|WA%yy}fjOJe>@wDywQmo9oGGoptmjR2$o=q-uIpwgi-W#m|- zSK5}pxokpU2BVJ&>*BY)e3%h%m-1PnyZAj$vrO`!Vv8K!4Cmqcs$A+F1B@i*!Q1^J zv=#K6a-5c&x^>-z?u*_nwpA^5xfkOL2K`coLwj;*4M_x`D*y@L;9Dbu!DW#?Xk$uK zGED=BU|hsBRG2xh4{Gdu0-~cgcDW1l+dirZ4uxNQKG_g^*JlXk#u9tXYLALA3Mq^J z@Nl|P7k7*Z$8^-XL9u;9c4~7urx!Lo+ED1VV1TuX0HlV}^KyuBFV#LwOAG$O$R#Ai z9B$#%6gPik7s}RKxhXLvtR-p0B(8rNyQ#k@P7itxs79H-8x`dV>a(l?DzT!4s?I-jJ@3xb|H#z;kXvn1=;v>QFi@3{88@bVA; z77n0@ev#kPAHg@Aa9Qe@DhoMxG$Uu(N5>|*5P%SXo~2zV6jp;P!^^1!!u@&vY_~^uHlcu=3yh+_`JTG- z!>*Sz6{hEK)7-af<*3aK`k^XSh5gH`Gz1`HKrc%?83n@~7UfCSF{MT7We6&EL5%o9 zeMs8Dh^K-@)XcB`yemoF)d-0g>JSLF*qM%NO^80@&-((}nSpK&=Y#oq)4Ju{OMDwh znuKRZ9(CI^hu=QxU33Sf=2c}%nj`ZFKo)>rn@w_jsm@_GdHV)9P5Ce-b}v%5X0b6sVZ0mk56ad;RI=M4s%2+2thCkXQ@~D(2YdScWr*DjAJsi^B zR%?DgJ7Ym2a`?uYhT6xaEKF_E&i~-N{``MY-o9w{8eAfIyCn+~(oX94pUc?K5|Fb%{pqDo z>JN46H_)!cr$l4rT8hDC8&*3DqBxKPpc<^Sp0*-kEn68S!%l>>>W+Wb zmcpg`zPD?Ee(Q^GIVaA70OU$MmgV3B46dUpG9^%uN@YXZwoYZq&;s`8I_Id+29LH0 z_dEB59!Fd#vO~!LChi1NtLv3WI@(TUWMm^(P~Gi?Dz1R8A}0(iLu+A%o(6?BbS4vd zp64{ZdO&1YsbJQS{+Iyd2?8Tcf(R*>mnngRRLb~gSB>!mS@+Zn_hpwFfaLDMiZZw?58=r22q0Y4DlLqPySqQK4$A?|E7=&yg_gRM5{8H=AWt2N*Dy5bJ+*l9a zBx(?VB2ap0n-Bs}4td83F`2>vSL!9pb8fk|&F$nHdrLN4UMrujgkqIzfp^~^ ze_p_?5(;zG9ZX%#Y-8-GaZ*=merG)J^ES_)m_i!`05FFuU)43(iRCv;(x4bIApph2 zgR{&6P<6GqGTL@8aG^}W?CYH(Nx@$w!~Jm>gYPF-(7O#uZVRFS&fXwXsp{?g8cr!x7# zXz1_ozj~JkH z+C8!HBu}Lf=HV#J{=(j1lAES~Tj+PrN~Hd{uS>De25sqxe0%LreL{p%;z_vD{rF(I zxMKX^1+G+%wJ`q{&O}uT1vqqxE18gQXtw1pISNunKhXX5DoIq5P3`LA*HEjwywGZ@ z-3l~+#LiKZ(o#vgAY;9v?@K(wnxibXDSJeV{kpVzvsknGYFHQnC@mh`@8C%QDo?>j zs8Zq5vcrf&?C*+7#4Kg%g0fDfsu%sn_2Be2Ooz42abcjg%f0U1i>}Wu=VKq1ZhFcf zE#y`-^QLhhQ6W2WA?i(E_HmbX1gjg5d-9+L#%h|P6;B2 zcLt8k4XxvyTp9TZ_urg`taJJNcIsutoX1@(2Z%HgfO1eIUf%Atow}%Us&*_flLCrj z0~qWfI~1&x;;dxZZUe9Fw{bor4ZGEK`Z4m(Mwen(z}uRw$YK$SE7ae882L3*wn0w} zQhc;)a>hrup3%GsY%K`fD6Ucpn_f0d>a_v6lc^Jca`7X$w>y9bs-(i=Bcvpss^G^y zS(+|dJA{qEm|BDHn6MiwA^KtvGQ_=vbI#yV|L>;(L*>-_9-qRoD zCOBR3Ri>zSC+cc;QDDSdDV8n}^~M?!giA|w&#MYFU_i`WjUxUYmYDWfA!tJCy^~<$ zbV*On!^X3Fr3`c?F#GR5vBe^J(YpD4M$pnv)>MsJn1KVtZ{Cq}>0 zvEjY8jA(DE47@b_33AhP((>cq9EGe9fC^FII{e0U>cXoi@XaZgZDR<{27Zdj}SIr(T(Ui>Dd*3IL&q*vhCf%S|ippHJOW z)B8L}->4kF*k@D$e)n9-?-BtgCjgZKdShlc&~>Z0@|*w^sfaQ}erxC2ojgyS7hCs7 zp3ZCqQze9A#$|iKbF3Em@60piPr|0MSE7+CUf3&rBoL&adxRA&(ZbnGiTy-@H;$qx z+b!Z??=1kzf%B4n|JAfM`keq&0U!)xLeOlh&|=!Q4ScPVhp-gsBx}vIk@^om@};Ea zeOIC=ohr7JErUjRpZWDJaGRFyy~)kKCz2RZi}jhyh4PH*9 z*>!@Jeurx}Af)XCa7s@dYd~_lg#JdJ$Y8k^H;#hpUd$WtsVLXIw+$uL{x6H zP=U&wuDWIxdCoUZ)RSGI{kl7~{D;8g*@dg~-B2*md@u@Pg#Cl4MZTo{LnfuJb!{{6 zEtq5uf37l&b;W~AZLagz;dwH?FoD~kMjxNJ{{3|;?AQ{3NcQz#G5^qNl(~;na45;m zsI2&Hqk0GZqBQq*D^23fy+1AfHulNG6ja_6j#ff1CC9Li$aK}Y4=Yv?4%#+MaHuyLvQEny8E}%j!;$w^ zzon;~05k*wqa9ppWOQ*kejo0}bWBIhS_WPDnsz;`vr3!1m32Kt? zpg$O=tABg`%y%r^d(%ly+Q{~{=8oAF6a~1F7$VETwQl!vn~sYs*-84TchN4(vvNs= z+CUHiXf$3g&BTMSa|N`mfN)y>fj7yagHi!Q?829r6Y^?_S+RRYJdeu4#_mW@Yw(_u z;+;P@wNiGn%zflDuh}p_Ry&f)*^#>=VSsUfUg$Nm@%*A$H)p;lrF)ID^zyTE|FL2M z&?E|f-g%?&tz1dQK^QnqB0bxkLu4GAKCc(V6}9=Q>1pe4TAzum9apMJ9qt5?Ri5<2 ztaH|L2F{+KD`O;4tguve$uqJy$t-&1qJL%}?pW-CJZaNBN7aN1v1{Pgsz;-UApz(G z3Owjwj~>L}Dsmo#5t9iu-ngx;!NI!w_NBoa29foJFQwMD^w0bw&)A}VS#{79XqV_$ z^7ehz@-oF39cYLfGv0P|Cr>S^8lDd{qqa^+o&NB1;LG_hx|b5r{bxrVMDf`l2tcp# zYHDW(FU-o%)0x5Lw`c;;9Pzkv zj3uDHj>@ChgF`BP4>Xf^N^RA%2FOj5v?;{qg`06pLD-}M1A(?+Vdz;gSNo<5OP8+2 z*`6vu=7SbuCKH*5E(B@+>{-_2ePX(z9U7wuUY3dd!L8J1a1r(NjVV9?T0ns}5Vz2< z8f-p!D~y!MmxzUE>a2bp#=qzB`4<}xTr<=kDWdCJQJu65SEA3;pNioK_l|83cjNE< zg82DHymX>?gD-G^2uZ#wt5lLnSv;M|+h0ZzI^m#{QX9mfpu}`~l>oGqIF@T?P5?@y zXvX1pZe|%3V9tYKz)sR{Ye$fMCT1|*Mo#CS7`HCE?!Mi$`S4-a+R4mfe%`g$O|VK8 z6+fbgQr`z}K4MqQsQ)W`?dvrMxBTkeaKE0Qu#(SbB>o9-0?;QExY8jA#kPWNq!xv< zHbwGbyn$P3`ChA6gQ?kbpN)HnFfC1donqfn&;pjEu5U}s4fBr7w;>TH>O zi?vCLD*;|1CH=Vjsw_jnjyIYQ&Dw@g>TI|o*Ivz?x8L4(etK>s=njGuRZT4)*ziB; zu?!H_8Ed@%DlS=XX~X-)jPJ32=^4jdteJvkd(_|q0?;~u??~+Uu^4m_6=CCKj^_sS zb+v^cU$J*Pag^}utDZre*v`*7*>$b-q2T2`Km8|BT5k?+duKDH7Y<4#O1+buZZB}* zjw2qI<|CQ?fXn!Zr9bSP^B9OAvR|(jI{tz8C;nz*W;KoRU*|xG<2}! z8EqQ^3qQY}b%%LtIZ4^nGw=qF{8YuShDi=1%C91N@)!)EWNEKx? zt>8Skd8A7*%-Tv6LQ?T<;+t=a6RE;CFSlSFg)#l-a21~yPxzzckWWIrR+wYsCEZ2! z!YEc5QYW6AHrfdBQF28hhHHBa`#cRUK93G{x5|%ei$Z9?9xu$SmQb) zS*eS2t}4R@88IyQJxX_Lcm4+yPm&a;58&6S&1|-|WkO0)Sk*I1SC}V@8nsE66oZSN zmz*D73j)pGjE6+F4z@!!@&xk?zV5+65W2^HzRvY9WhV+3uZL_$S&ofy+fH}QNW4ap z-*c?R*`@YYG<`9>zi>eS+6GAMZA@|MHK@FdHY7MrGg`8{UV&3Vtt9KO-Zc@ULk6L+ zX2$1`Y6|*j-{VJ4k^3(CCT5S%ir_%1o5xifWOj&7pIu1(bHfbr{EHc~jLvOH$2)D# z=1`?G^{U3&NAx!T#*`ft$%{BAH2%J;jiLo+%M|!Tb&FYuwlL=%i=d0Dp#?CDGME$) z-q~oqJ^Z-gS-pjF@51W=e|niophf{=iZo=@lZK~TrdZAHK7dz`N*wL7a4&r7YHf*d z#QfAa`|>$6XzAX+l*6A7Ha1W;?Uk;A{S8~PU_`3rwM?wMj>M}97Uk?v#%+>qGaB3r zdCL-x7yI)pJqP7+vvm1zK!{7kP~TUxW==5s8yQ2L(aY^l?dTvf=Qt}TA8evep zVPUI(SnYkGe>DV#71m%1O%N5|7a|gQ6uz=@MK{i*GpG+VspNgwB$Y$+ zx?a1TEaKJYUxWfA02(}nc59Z-W58_L_rDQD? zRV->S7B1cQ+A(a=oeHAN2_vgi3PTtnrG(Wv+y%!}#9t*m=gv)@5E=b3Bvw*5J6|JI zp8gLg9+4HJk0Bi3cpzJ*$ekTd2xtQ0$fEsMMoN}(lIlD=iFF}60CUKHX!&3jBJS~C zE}V}J1d*GSs}H?NZwtN^ud+5`Lw*f@;xnI1$}Wpi(v&KEz<;+Mwye~UNwzcJ`kxva zZ}QV8)KFHsA3!Q0GyUS7>Uo9u_QRAoiAmJ7bfjkB0?@aHt}eX(&gmpD)$aJw4?$)& zVwu$&CK-YYV7U$H3sT|TS7BWB;F4+WQ6+V!4A}L``d4qxJ_hV-Jk=I~{#O*Rb`~hu z>PlX=2#$p*l882bA0y3RbE+ov}kluzF`6SPlEL`xn8%v z@-U|femm`#kn&X{K*bss!ba-qs#2`v7;I_4_lEr*+0x0kGS`6^hIdiqMwhdh9gS1?+zTqD@>J6Oq>+I1jl=~ZGk$UxlEIrUd0Ca4#;``8^1OeB<_4g5;_ZThX&>IF zYFda8@wHI0m!ivbEYD|oJT>!DH)G@JN}hlj+$Go7?3t;qc}IQEug85)s+b)@?XTr- zjhi^C9$q&IM2818`iF;f2GVpE&hYmGS*ZpQW&yd1Swm-;yZ~LierHCreN>IR& z`BuQfGT*_5CNd;s(z6s%_nOXPZ1c_wgF%U76Nmdww|ja20d2=4`one5c<-W+UIc}A zX#MX9ofv3KQ)jB?Ub-krYr}d+qt!b6)MQ>&ZU)}^=FspwCbpgde{rYC4$aK6J}+48*-o;o z-J!UBc%{O;2SxVL@nGz=9!!4cX;k{@S$Orod1wnDu?{tY!d7t=v`zRP3pvvB*H(*K zNm^MUNT9!Su#1!KeEg+++LEyN{kqp#&r~0g*&4q#vw;D?;Y#z|(p(-VZ#m~Ve`s*+ z<2)sH0Zzr1IAx2;%2yb9;am(x|H%#ayZ=NXal9}F4rpL-C7B{9R&?YM`IrwjTvjkA zifKwv)@|oq%*sbBy#ESOh9O;mg;T8q3&y-kOa`1v8HpJ=er~lkaPx=y8>OqKw&xFW zCo&Axf1?ia1z7Hq^=1`J+WqQl2R94;Q#s=CuoyToy_TZ%9-bk z2|?N8 z#T1X6rXd63gfDv+MOc$dy&;z$1R#7Sk&Qj z-KoQ%bMl9Y&s;ySE>xe~5pw=_4~0*KtZRDUK}(>MV)q1ZG(MRMORgPe=Em;YK1l6J zrX3pr-Qn&LxTYcaV5SRlebiH_Td`N8x}EnUi62}g6nXC&#%Ekc^r3(NZmF8DTj%yl z@DW9aJTFFI{if*yPbvK>uYVCjA@sZr@V1$(b1ju8>KB-mhTt7@)O>e zQVXXb6>pL5nVdRt0uWvl0v+JB_;UzNvEyY+7D<e z{#LTSC)uw82roCs%0Q6Y-QS$tL9}opLAb;m5ksG~bb7-tUcXxg&fLAFMC?VS9wOdOvT z%$_E9;fnSEzZQAW{?)DKSUY-d*??D+Oi0j!W9xlXh&Rs;T}HXS#VhjPx-Yy;TMfVM zBJ>_zaQv}mB>-)q5T-E}P%H-7l+#$qT8L#S9^tf%tfk>FJ~AqGj)*2ok`!c7T?=K* zVdR|UvDw@xGc%lRI29Ajr76xI?9orrPde4D;T*hnUjF`lev8Jn#k~$Am&3myDzI4L znzUVmvjhUrW<2=N!2pdvSRZ7Hc(HJW0gfmYUbYux=U1YyoZpFUJ>FPL@JYVz&)S_3 zF_<1jGxjdd!aRcyMT2OV_5F|_Mv1ff1yg2(SGW&9Hf~lDPajFSL8nnveod|W_-X!U z3wSKuzt#s|L%%{*Yt%R4-C4dOcq>>$K~tGF(a=Kg=Rv9AOD&C9#h%}=&*Z}(?OBU- zk@k*iDno8&zWtl&n;l4~6XpU44n^P4OT-K z<8LGx#y0S^>Yxji!MHcyYpMfRYO0nzr!ihQi#8bI`!hUrR=*#hHWtd=aO+kQHAcSX zw=JRrbHVO*Di$c|=W&uSS7vWP*FeW)iGr@4h0;0hnKMaf^d~G>f3ecT(DG%FB zJo%5xk+k_K>0s+oWf@!elta?n)PKQY2fRXQ+;z!q1;_4dYV-u_b+`}57-c@E_*He_ z>uF%-BUiM-5}51qOmpM9CRLStrU_gx9RDtko7$ID%h=pEaV)Qv@0_~@=+1q5C~^N^ zCM1rF_{kB*hsJCn{FtIF`z*k~+q!|_s9s-A7uFke0>V7-T`!rrHv8^f&s|CTTNWQL z7udm9LC-DLq`SN=9}B(T`(Zop`hxe=ntJs^zc%e7`eA1S!M>yg&!SC6Tl8A)ztjei z82Tx}1wBw@l)_#tWJnHKWbAC-E~6IOBDDqr9Vvy%E}wR%3t4 zV*DkpiY_W%jmo75CmNm@-m;=LHNZ)`&o{>N`idF}sg913Bb zE(gc1;VP+`Ho)lM-J5K-BScvd($s2hMW-13+2i$ z4M8JY<+{#v{l>?#zbH^#Tt0>|Dc6ZVXlJPVrW~ftD{}S!y?F2J#aH*wjM)K5$zrZR zWomFGSq*U3O64-**`$2N?1cNMo*s78gVj{OwN7ENU_<)A64c3xzQBmLYT` zby7US?F{sIW` zYDE#-lebg-H7`B1w@4i;$L3Ryz&X8n_;<49U8g6PX8bwIA^##ojDUH|K%WSpDrg!2 ze8#mjwA^Wz-w<2!aT7LYvEF?$J)cHB$D&sA*=#GSr`YzWecfC9`63mG2x!wgV`kyb zgX+n=vW@`34gZ~x5h(C$2_D)*8|j`B`n_joIh?7!J}Qb3p&bB$bWy>|ZvZ#s4ZXrJ}7ygrSBwS8PIEfl`J*AL6xDZLKX<%YT zSxI`88)cv(v!NR*e6Q$ez~c+rh;a6nfe((Z)YH}z+@-&J{u`KLg)|il z5k%}^Xwm$AMdvfnwes1=eX9pWQm^~w)Pg3X;vBW)K!N3Jp#^-arkWS(LOKtqgsD5i zSd2ZfTF=v47cr`x<_!@QLC<$w1peI_ZvzP57!`bOqbu_8vdt9XSZc#l&iYoy!7IAb zQFAsNcfP`Q{bkC#o0yN3_n$}gr1T!EUSlv^>{oW&wq(fTV8zK+ai{)aQXn$}%3g9J z+Ej`-`#S6bJ8b9k3+ojO(dRaV2yKH9O)*k&7l_QQxuU`?uqzMc>fYAcMU3_ zOnX~PAwS8+%5`-ngt4tk&-Xtmrw^pd!m;b{eA;ciY%AR`o%HLhQ5iOx4@Qjjf@JHW zR;0|^D(^klq?G}C=nalafZh8b&R^hbu&y+ne&JWaPM6&ej z_9PSCBxcQ?MXLs8LUm7EcrT1gsf`-OmBiSzqi4{k&=H*p`!$}4`khK%wIUjx7gf=f zk@Z6SaTRktasPl4_2DrhaJ+2iXA2UJhgUMpc{B0Drqw--egmVmL4WBAUmQ%{;EPO? zxG+{6Xr1y3vhVMXIyDnP#3%~zuYl$ZJ1lz=ZpC%^32Aw{rR04@3xq;>vplLf<|7lY z+a|@K|A_*=QK(Wt%dBHDv<+MRwX6z#j6~Kv*exTeYa{C&Ur0%k&NVBjD?};M#GgntKWeX;JO9;-Z;o)61ca ze`DoeN5bYO#ZOQwYk2%f-wJY^7nB>^+_C@^>^rXCUA!xOt~R%!c8QtrPI zLdQsrw;9c#sRi}$_fUQ_Tq*~>Dzoc#5UQ=5Op&Ycl1!11t}n-T&&ddQ_f*9W^@B`Hi1c!Tt+WNvNUq z-1}7ZaQsWbr7`0OSr4P)5ouhZSLJO~*d7U|`Vz}${k1K&Z67&?T{lT%g&1b2noDiZ zN?KCDgBFcxA8OK9z}-(|Htaj(0nzs#^k%4p?@6+9&tKa38`<;{fHo8L&b`F|*&5U% z+Iqv1_FSF|d&Es>ymjU5L^`P$ZCd6aJx_r4^NeBC4|kkM`gmpH1y@|`tJy6QUhnZmUL|?d0QxWHaA}M zdW|6c`{1#%(v%fbhAOL8fhno5=^Y-m_fO+KKV2?r`RD)PRcU(NK_ zD-Xy#UFGAz9~!DRQgGjIm5P(!@VxS?aB9_P)=4pn^KUi6rk2l2X~v$OAsd9zp(9f5 zG1O)hX26n}m+O0Fh?3@z^(*r8Yq)Y3M}Qphz8ro`A;$Z1LQoA4RB29qQg;TKfH^S{ z6RFjfQ2SIsa&2fmmjj~ABbUtDno*wll9~B(pV?H~3?VP2q9P@4^S^!m8zEGTm^OX_ zFU=M#B;`{7-@f{Pd+Hw$3ZZ;UTClF!y@wixSGmal+fV#YPyeTe#wxFg;A;r?C=Z4@ z$uRt%zWINAhya8iQ(%4yH86w2CzOIPTekmSKwF8)Ob93d8^#r-*-kRD(fuF)>;Lrl F{{z8wS5^Q3 literal 0 HcmV?d00001 diff --git a/assets/snd_burning.mp3 b/assets/snd_burning.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c45ea9f3970b680986dc4af7d0157df6d391aaf4 GIT binary patch literal 4702 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 literal 0 HcmV?d00001 diff --git a/assets/snd_challenge.mp3 b/assets/snd_challenge.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f014020fcebcaa486e9273a7771b3d8c9196dbd1 GIT binary patch literal 10800 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%0A0q5TgQ7w$d)C*L%`S8oZ+5Z=n^Jn}yeE9$W z13U*9?>~^gcY|5Gl9jd6;P9oJ^*0rc8efY2KWXx^N-@^29%XPGN&VJ!k3?h91GY0_;B~Wn2+gR0+JeT4NfI{aY`? z|Be<{rX}5}_@KSu{g3aZ6Bw8s?0tD7Pp%Bg>REE(n$%?0MWHIw(!TLVNNN8wS+)E1 z%M~093_Jl{S==2{gxZw<13kpi;9|kd?ZDz7(9@uhBG6fMdPDx1`yH98(*nHwa6SdHz1>VNEit}p(x{{QDE zKUW^nwb}OYdfOtmsMY`S0#m#|9^!9s(YW=Eq2>I6N(Qk4flh-9Ax*wV7{ni}6jo+E nnjcxP-V1c+SDL`&3JAYP=m2q_P%_zdDVP0Z8NGP6=a=Dq88dnJxq&ZWT$SU>WK5({ zf3GLOX+h37B?Z2ZJbXC>QN$-Ng@eZ4uIcR`WI)lVrMeCN5siu_lQ%

    t?up0<)w| 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 NFn0KtwSP_F-vC%Iv{e8A literal 0 HcmV?d00001 diff --git a/assets/snd_descend.mp3 b/assets/snd_descend.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9ab56bccf11b74ba8b2587049ae142f0a2378b47 GIT binary patch literal 19506 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 T3j!Kt=B_AG^nVND1HbE;W{xQnJ(*j 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 literal 0 HcmV?d00001 diff --git a/assets/snd_drink.mp3 b/assets/snd_drink.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5b86710e7ca98ec6520828b56d922a494c1614d1 GIT binary patch literal 7433 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 literal 0 HcmV?d00001 diff --git a/assets/snd_eat.mp3 b/assets/snd_eat.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9a02829ed7f72c5806e3ca07d7d7d662307c7a70 GIT binary patch literal 12113 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 K&j$Sm_x~4sS>;&( literal 0 HcmV?d00001 diff --git a/assets/snd_evoke.mp3 b/assets/snd_evoke.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f3592a97ccdbd6f28ba9edd60e4b38e0a7dc6f41 GIT binary patch literal 2736 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%0Ae zNSjGR2b8luXe!oOQ zEx)JIt)IS~@@^pUdB&U}SsjA|_kAHYQ9pLY4Yr1+rRAx0!N``u=@>mDdYR4TT5Zc9 z5X;Z+3iJ~$gJCf+NJ8`2i$kLyF6oOww~hbpf3pb+8=s&gIkX6nFGEaw8or3vj&3)V z8$VK$7}uF5SZ)P?&Osg&RjZFN(Fv_gMf$6F43MDsgK*#K?1;ORU2Fgdz8XeKDtZ6r zDRpr^%9W5e&3rxdTxk2FV4Xwoyp3Sd$dw*C)6M;3>BS=$(e0U7AGB>6}@B4q!PDXb~9unQM*)oicX0IF1E(E>`|3& z>Oyb%pKt(F8)BVbpgzV$zvVMYnR=)fK_`Fxy9HNv_BsN#CjNj`+2y1856(U514eCd;qjkvc`C&F z|FK*F*0i`lp9L0I=2cvMjsVi)u^g{vs~6X3sonyR2vlazd-bYtT92d&K za3~*BwlJASS;@){6*Bc^z&#N+0lvJG@1mWtYwM9YX0t~-iKk}t|*$ix*2y}aIBmzHRe0RUMDn(YT^S8@~UotucLwjXg*5=ZqL z)Afi3*z}amfOS-@9-CI5HH;h#omFl%%-HElGe-r#aB@>@cne;3rcjlP0g&5dzYT*i zd7yp{7e(y)S29xSmg<+qZR2aYGZc)*Tb22OY9Rqx7a^8Z8LTMGvEFA5oIku2Y#|DgVa#qn+O`RL22W} z{WnT6)N(hG#0a`REiBOzt+X%fcpTBI$uaZy^FHe|{ZU_*G`Zn)c_9AwfNvxK%;t%H zPGLwq80+!~T5UHn+_%5k{X#yo@8W`-dIlgx%XL7JyEiOFl{aQB{*YW+rsf!Y2>mBp zY*M_GgfjO(Z<2Zc)?us4Nal)sZj-WrtXxXX=(C!%CjudTTTpyCq3?)vxS=MwbVYi8 zd=HV*7@}5{+=P1@$=@RRsY7cTULjh1zNB+Ba!ZHg+BbiF4EyTK@WwR)+$Nfw-d7oA zyPQCiQdW0DE;HS*p3gzcuD{w<2td4Oo=}i%LRce;G$cI34&M3Qw)n$`G?rzESmPIc z?wb71!QQrDUteH|A`U*C&g=@YMBqi>A@ zoi-9zTJy%XkooGw%%xo6m{-xq+f$Bp`Y{_b(GV8!~17Px)L}N48`mzw!S!HJOp`+rqTK#~#!-m~J%s;a? zV)d7UY0o%B9Q8>$+^^HB+OTU3Or)dyPa6K<=0w}<97LMy6aYX$g@n63>)JqSm@1K|+EnIWZImgC7sy}jS$fzf>kCx>4feiGFlB5*TT%ln-j>cN|w3TmMyM6oG4degyM}XTv!<@6_ z`CH1T8R?4)rXmCW*HQkD7W@YXiSWu6>y;}Xph{Zls1SYffAp{aby$MsHZaf%7jA{v U-~_hlRDh{q|9>6j|7OAe0}K}MlmGw# literal 0 HcmV?d00001 diff --git a/assets/snd_ghost.mp3 b/assets/snd_ghost.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..dc1e5560bfd366bf5ab35050bab6e45b2c7c787f GIT binary patch literal 12384 zcmc)Q_dnb3_c;DXf(U|`jnxLRqhi;n#@=ezsESpis998z*dvHNs`f5Lht(C-*4m?5 zT{f-KqS_)~`h5KXpI_d$Z+^@zXY)u!NBG zXH93%BsxhXiIM{{u6`asAbvQHCZV)r>hr51R=(9&(Ff&O_nW+gC&28OvL07R%)K{n zm{h-6SM(+E7zNcTYFdjcwsyvU@R%|=12>F_}ZAzY6rb7Yg!>9E-k@ zwbu-b=CXKrZ^5VPqFR@G1QD+GJ>p26uI=;n@|1!rR+`bS z=VzlV)ykyY$#A-B3*`^xN|CJt8tX1!)*#qb$q3LF^E9KdbpvfB_tlW8SWyMxFUg`MLlG- z;aqZ@;})Mq;T!wRgEuOqtVVNb`&k2>giFIDte72^faM3VB!Tna z-Yst{x=U1%~$Y#e}eo!1*avULW{i%waLPd#jwafK|Z`n?e zY^=csk^lhz%NIWDQUj_6SY}xdj?L~Qa3?b)$-8=JeQZa4Vcq|t5peA6=oQP)w7e1E z7UaU0pO-OKH)|lUi=)1Zqdnp!n9YZKsp~E3vjH?9x$!=Rh=LaIs)kl~d?FPtpa~bQ zocmneXNEP=Kq7ldR%}k~0< zq=QV+J$yONNRo_iXjYY}==tn?W)XGtwy%?>d5Nto(iNp$Ww4e`p+vq;iff*A>Cg7Z zJOo(Jb;nE$&^%JmV+WHMcPn{Y_nyjMS!A>rTfAr;!?Wk?__XLK6YDNu*w-I46%Rg+ zy|95GJz>7mWbP~zGs1rV3&mWMa^25{%ZB`4zI63c4Mi$-$M!PT{bT6LqmL2F1q+r& zCea4oeO$vPQ`g!)%*XDDsF(qKMI%=Ij(={-P*EF25oKvJXT@JQ;5HGged7|S7CESy zaC%*Z(o3Z0&+I@Z_u^8-dS2~}W^i?)Tdxgy{OP*P@u0|%AAEKxHk*@;ki>pG_R}E( zYcJsm!qS06BGgYkG83`21hN+^de^%(n((0eUwrVi zXot%Q&2AYqXX~osp`DBhx5(MW{Ad>X9h-6f%UfYS5^Cb^l|jvSQ1MQfmcG!k8gnxp zO;Ir2rG-I`n@4_*!*VH9PdT}b7&D}M56VJY_EYR~VH$&m3Q?jd??$%xqc!BFMSR$_ zbGMwoyrH(Hd{-`8zPp|PMFiX2dEhDj%BfOA5wdiJ*uMRy=H}r0bTM(E7>B7n^_C*Ufn{U?*=@ zUVETK*_D(>Dsj6qF;Ks&{GUg!*NlkKCN0Cgws+|=ajwZ~SCI}A1@}F&OJ2nG5^CMh zAp#$mN;z!Mf?MeVm>9}rsB#vC66{joEnYHBNTj!!muOVy8j~j}K$2y+8~>!)mocX4 z^T%h^4=;2*J6HNd3Z zfdUD{USndVA$BTLtSTFNuq70OO!=W~#iFs8d*!EtW`uEzmF`&Ro7d}2zwSBA!?tcw zC_e?1df9aU^dO}^v2zCz&!2f*$+*Oqy-1IjW;N?~k-QPpwsg_6HbnjAQR9pK7}za+ zn0f(aSWE*P_~JzsPKig1gN_kjXh7VZa#GaQP8WD@Gf?#T=BWpUr$zKS)DSP5eqgDW zj)yiQhwXl)2c&dtPRWj&K(5~X;9gOktwo_6D?u2ZznoDA8Ur3<*trz_gq{4yb%cCe zoP6HX)|hpwS&teCZwu1hIBmpL#3}Hsaw%}OeGCN zLC$(a3guf}B`5qgFqAA*>McP|;rdp?naRwysr8I05!1XM zQ^u{56W4Sol)t@aN3&d>L@jN048i3lJ8>XYk|+$$tNi%d5YsjMN-k-YrlVYLBt zLTIM$lxugGiK^dAg#*;jv3(RSm&jMeyhgo#PdUDPcrf5`Nc~urVyEt2u_un}5cgp3 zG66n>GY-qgvz|4wyz%7yaGA*UOJ|&eeW*Ocr+KCV5=V2cRN_&+l&LQ1M-+|t^cye5 z;*KiRLq*d-#KJBEvT1}gTIbXwgs0`b>{QciWIBVmv9z05|BCK$SAcpzLd7>s*EnNw zRZZ*5zfVV^C^x_6)CRGA@T4bhYEMjU~NA*&1=;AT(2@v#kQIF zv*?O{{Zs<4i?DDcVyZ~9q>Y`}#Aey==50@Xw@Q@932}aK_4G|*_?psg^KGP|lPC?y zgy4(uaSl~+V)MFLswi_q>Z-{X>CCf<*NyU%wtHONmP7d@qGUGB$iAMV2f>2m^GELb zaB&Yf0O<~EP77o)!!(Z?y-%0@lSHT{05FS1d(O=Z>xw+ydu^kCPU9nur`3wGZ9rWo zPchf;WYJ-Q;n1@R9}lg@A5fC5aAG7a0S#*qe+VA1u7hf6XK*KV@Y>pN+1~el%GChd zsavpbq8RlDWb3oiUV6f42ZnTV+b&vmWj-A6_zp1}V6MhCLv19vWCU-2mcq?=+A!@^ z%xx$PW;pIeQ8Y^F$bTubq9}IV1?L>3?x{x+fE>oyH=wk!uSpGl`_KS7qyUUcCYwfv zTP`Lih##MuQ4{TVUCC?v_{fUecT0Bk@-v7lMWEkKtvbOFe~ zW%rt9H~47W=3YD^(fxgtzra#=V9B?k+z?mm{t}!Lx2GI^tc9L1^OHf|RAuS}#^F%a z=d^7ZuFgYpRRcAOJa73D{ts0 zum&1fF)BXrW3Xnc_%FGE1rfnC0W)4kaYZ}%oi?G^-2I`%H%F2$-KJJFsojtL5D>_5 z?4*|HygqxhFR0v_NATj9k*K9N^JnLt${M(~xKHuqohfcRv*DP`%X@eyIf^5=gm<&f zG_9fwMw6LG@2BL)VP#}?>aoT{iY_}gAg+_=;P;=z(224xU)M+U@Y}E~lg>s5gpN)~ zTwP$t%y6pBL=PDT8-npaZ&F|arlaScB;tCxiI2q-Vk?8dHrHYCW<_@yaWSAc8&cgv zi%@?i7Cpa_=JQ?gA}^TvxcOclM@Ya#hEuup$RaH7Uw_MclFh2^Iht_IQlmZ*t*342 z6@2QshKGz@ay#i4@Oda&J_h!wsj+ZzNZN73V5;uO@pva2@v83v^5qdp|0AgpP_*}) z%8YHWRLkE4HOiFEk7-S*e1v7M zD2vxC4@1-jiI#ah?A>AbcF!S-JnA`OT+*}$b2sScE3c{$N4NZ)?N zM=WC0WlrTj`+F0BtFAJSx*3%6RWQx)m^KV$qN>GX)59m}(Dq73cHnF3vx$aN&mBA@ zKgm%fUzhYMeS;$x+FlhNwW)x_`i(5r<(3$jYTHMkjX>=aJ~>#1@G<%Gw@On3e95ML zT@_#Lt3E61*^~_mat%$el^0QtuG4F{&FQZ%)NqR(*?9r|W?C~r5V}uvQaq5z*i~G| z`eISVgN0TW=edn`?r-xXHnwwLSAdBc``!j*4Mo_Z1h$P&Q>R;f$=Kx$}-&HhjZ zUrTU*8_pVk_HN&ECC`Lcje^2giFpWrCzhBACK)%QRK`i!LrN>J8XBTbxDsOhDn;tz zy1@pJtzin6%tKd&sG>!0ksI7;A0P^3?s&fqV=M7axVPP@boHvwgq4%_<-d;@&CKXz zDIfpp+F-Z-g4An3GNl$}iz}y|Q~wD8MfQA8Jv1^Wo#uw(bydrzXoFxY_`KCK=dkIWdNcBQ1U8ZXOOjLXv4Gjpx^E1ZviNk z+nsu{0f={kQ$ll<=`6{!E1US~qy54(>bS8?_widu1YOD>k3SrQFnDz78G3&+Ue2;* zPKsuWH-^+Ol9*M#x)s`Xanq64v)l8pb%rwF;(>i%c%!_1sSFMB)GEax;q}^=$n@wE zMka_}a6n?YxXnA)J!dANxor13*?aTR{z+dzxI1%5)9#By8s@{sN2QcN-s8~Hp`w zzw~n-b5!~9k|@)G69Idh+K;c7#P6z~-cwf+4QA+e9VqefNoi~v`%>Mrrbz{UQkNDM zvp9NXarLY8bnuNAAaa=a1t&K0f%5m3NUKm|l?{Trx<;j|?As;JA6#u>o}f&2ww~NI z>I$lsinD&dPCZR0{maloq|zPxKE+GuBwueHUQLTSTKLMs!9+0W9%ZttPH8c)nDAjx zXIKL)ShU-~CImu6(sQ}ueDe4URy)w+Jr(QHl#MFdT9M2Qqer#S*s++CI}&AB!G?wS z@rD;jJll$omxeIhn`eJbU036bXk0?(?km{YV!NBV%d=l@Q*#Z@RZQFeIz08X;vwyq ztWM7BfN7|>P!R%tT)5KxdO*MB^~~&0@1aACDEK+|!)D>c+gx;JHUZV=ida0sjFZ!6 zhSEL5Lsq$5Z47`ONtGRS8OHLvbE1eRK`Tr}=qGjfFnjF}kyML`PlY+<%W==c~mQT+GFr_A0%Ai@8l$Rfxm=ye{l!bfB=sLSX@{6=SRG9_pO>Ye zY)~xL&uEM0k(&Uy921m3cWrucew!MVVF+5e;gaDy#<3QFR)LUQ1C5&r-yfY+0SMFvTzH#Rz)G!&V>9FGP=?aM z!Bw008YzkifEF==gA!;H9E_(j12{q5`R3hsqQMo*j8?-2$<<(9jkt;-Cq>_*x9-7o z@~56*Jmgc7UIW4tKMUOuO32syoPdlI`Dmk=!hQT*zB=QNV~p-G_s2UzH=@4(enJgU zNn)lU^XUJEZseAfQ+ zM!}a=O46)Z6{4k4FDX0Dok6uki<(Wu^5;!YA2#E1R%rW&H~F0Wr=E$E`q8u?VqRfK z;=QEf5jeYN4xo|%iX?wOSI@W!kH)ankK03z7tZaO8;68-TLBlox}MY=p^}kl@eE7; zHDh1?y?}%HaC@9(d198oh|e4OuR0e@A4P5|bzFFNAdG*+Flq9`t%8?CEmjHl0k1LF zS}d01(zG&Dr|D57n^KLzcMVAo9k@tUBd4Bscu1(GF&g0p%n?0L)>mnVxL9d%`&Ui| z00nX`6~rSe?o2X6j!6=D{rh<`uTum7HvsS3M@`G+7kBd>XYAnRMo3n;BXXCeWvnJP z|IhE@`h3-EEknX>s3L2Jny<-M%8~wRKURBS;7b!b=4#&!*2~jE z2JrJt2CfygKR@*>0T5SX3nI$R43sFklaSBPpCcvtD4%;|RAY8$!&PCrXz= zY(r(uz%JbVq+fKXKnl|l@4Bz3QraTjA?&4osOQz>QkBgJ^&NU!mkt_0V*-G~sQZpO zt5^pul&^QPf&rQ&tnHZI*EfxHTpb_LLxM9VaC-~YA6-OYRXJe+PUk&T#A=&v!FxTP zbW=vG$@yQ866$GcvW#cP29@mPw@y7Pcv?)HF%jeRnK8vGMyptxZ(hWpMTe}>Os3@3!<2QKC=86=hAoC4@f#yQ4 z-SVa31aoPDZlVKKotc}dILHJe;8W>Ad^Jx?G?Yj0LZ$`s@`fe@Pm^5Mm_zyX`1TcM*~;sUr*a|p6vZFw%l?BACh*OCD~D3Rcp;y zfd}-}A~>DJ#dq3PCU8&BmLK9z&4?~%tb zD)-XBKF*lRID_hma)&l6Y!w!VJ0nrbiPPdEE?fpzjF?h>2ksR%9)91HfxjW7H833d!X4+E*$lE-J<0x|i53b{-R-s6 zEB7b0TK>ydH0{?ob#${kVk>F2Djw!(9i&UTd@GQz@rBl}!#(jF8J|m9M;0};w%L{H z$>M;BAd*voI`r8}+L}hwSn5#7*>%@6LHURWgQ7pxwx96+U8oF;zcnw=_+s9!tj&#* zW2OE~{ag5Loypt&pR;1_v=0wTZDV`kP#ea&GH&8k|BS_)z?&CE@S!}ofAxc>eHN|+ zt2{ZTVOv?wChi0!{d&55dpvq3EIiH9Sy8-V@>0b;0#&)S`NULx{zFSik4GNht5~Gp zg%X_CbZCQwxebMhYaCbZ`eqVQe=k`D)AF80Q75FLtXMK{GJx8=i?--Rtod+2d7O0E zkNX>gE2%B0BsmnLZiIq-XYe?;-R;2(S?7wpkbLq#?t!>mnl_6 zY5ASO+*Z~QBQM{MApZ7LW6(Lj34-8}{{_R@1 zC;Q)ehYpk|67w(XZ8EPcXK`Sz%XuY&m)s-lCR*JiDf1Dg)%>r_zCZjXZwVj)L=F2L z+Cp1apfn(=r)3;@lbWTNjee`zQKKM9DinuSh8Aa~UAs}3lE1NF!IMrm%EH54rQ|1F zsG-eEdtL$fBa@NA<;(mP~_!2cH?tpr&~)n4EWX=OQ<_(`H+s@gWJWmm+t_W+s%{C|u5hk_Pp&rWnEd>C5G!w?SDw;+F=Y#z5&`i z6S$2&A4bI?#I48)^dMWJ717jXD7}%L2#5SnAD|6i^sfwF_IdI1eBACe29~k%FT39Z zSa-Uh51&Y;VSzq?6(n;;=hpnQ6(p9(Xf=Q-{!K#PJ zf!#?%)sg1X0vKpm#ix$c-TTBQ8Fdvkczif0hFdVa+t8!0GnK6Fo76x|7VK9$4ZzFW zjDG!zF>a89fmR(0g)b=tc$D#Ow0r%_7oN5|Ne(YYIXi1WshqHOzMC8h(Qx3_?7|0{Fc3xo%YOf=&b%=}$ivLRHVg~J zlhFPF9BKcnAG8~0q|%+dLUQXmnWq@;t;jYnIja3pGP5hN>Rh1eD1uQ3RKAvN)T@e_ z1QTKhZ1tm;9GBd*#aseqVV&$}?hvmt70J8{n*84T1cj>d-q)PVHTPJUyin*dUq(Z^*;~oRFXUz<%XwZ zEH78Xwz(1V^}f!v$p)gMKhBRP*?QpN8k<)aA~P;u83UUF0VE-3q^%?nGf_o{S%FbeaS3E5b^dr=DdX{!}3#u)^cizJlDb=kdKZ8P8gI-ZnLtRN9229qSm4mgCo?!u#x{ExlcBWciDwGOV zLMVrW>Vj#}^^P4DuW=1#^egf6cpn-ML+(7iThI{K`JI1f(S`8dZT+W+ONApzZp z(H+==SLK|XXPVt(NFuL=;fbk>k;0VQCP8>W&QqgD$YW1HB7J}{X3ylp zhh=!(t>X;ZDw z)|2_-bdv=b2zbQenKgEJ34w-C3

    _K2dhDopK4}?d}tnE9M2F*J;EO(*eB}S@e?nLpsUs316>p_jq ze1I{`dc%<&*Qe6eSqSZHJlpy3omfRixLK)9wDB$llAVVsPDkXH9-r zt;n|^h6V*c_k{>hHKCk@v8xQJ>%B(*AkYR`_ox^9FG2R24)ZCL4?HUBu3eX|b}})RpuyBM zh$P@gACa>?rN9s(w}xwQl1om)wsXmK=u{F=RB(gmU&Hcx1=I7k0)G!?(J=`pizN*_ z@@M?j(YyW~cwt&C2+++ixqMZ_@Y!JWOkB&pC}?50@7UR&dNu$$c#0V8Sue0iT5-!J z)&|m{F?~$$({GTD(4+gzOmwtp1SwUtl5iEEdlXvBV_CgN6O^P7quKqO$N8=4>S?pWW1xd zw&vE?^FCb)aO&YRf-LE1Oe72Isb>WbWsj3WSL$Pz;LGaS#P;)j*RElMwa&bxwhmZC1d-kf??0jS4wS#*9Ae1)`fI?oOKV2mqASF&-2Qn^afjZ$V7AJt#D-{7MULW1=! zg29;}K8DPTAhyB#b<3sYPeSUx%_&PzRoNrW?VmAY4xPYU-qM9`ye?h5kG6z}$T+5@ zW#?o|n8D_Kv=+S^BpJx<)rbsWDN@oNdQx>>_D1Ss{%oxOp!wc|fA{Yz0PUwZ(T2+Y zlmACu_dJ=O7V|N4YhW7&*ylzG8KxBHFJ=&4IoI+_L9HP{ui{#$OX*nSNGx`u03#1r zdJ%m~x78_uD%!-M5x0?@it>}wjl8gye#>>*X!N_f36$TPOH_#S<>;M1B6epzq%5#l zW{$h81fGTc>8^Vl-gaUbQnS{(JdX)6F-GkF;-mUfQWE8fUnJF>toLK#g13(rW$kCK zj7CzzM?xa}wNlP;_CEpdeP|O7r!JPj&Jnl9 z&yMNz2xhu@tGhkE$QbfwKjmBk|yKIYbg(Sy1+RRchg!si?^zE@GXk;nd@hqgUK z^fktf{2N{^l$|OeX$#gr^6d<423wk|pab1^ue`bQ1DzqZr*8@rJy5(;ulgt`2L$;tl$&!GlY#%?gPIvg{Q*h%l-d!5Z)k(iLTADMYK%=xm^&G{3X3}I$$ywRZ^_gR1;<2azrLctlu5!3u* z*p1EcH&IAzYpHy!^RA)5vl}Z>oNuU6i=~;aJ?^n(~Wd<37&Ff_j^aD7zc%u`iNqBHbe^P}L*rAhi-c z26TBMk}bt33xB5Zg5^1wuU;`692%yjhdkoX4Qs@3mO+1jsnpiqTK%O&AE86VHcHgT zrlxQ6Wz+-~{qYhnl?u$#0|fW}tzf^*3TooFYy1HvzC&kujM%Pve!UA%i_T;blZ>*? zI?dO~{rlq-(Ubn(1!Aexk1cJtL|me6EsuFsmzgYh`S~J&w0j{4pn4XTbuO@@gmQb$ zQPZHMYS@&Uk+!X+^=5;6Q~$y{bhP&m-`MUvvK;*|YPWS$b+c`sLX{%Z^U2S~$bcyD zC|K{q9%^9dx$)C1f?5A%!Dm(|NRHNqu1+M{0G;^$X>R;Xis!%m>dEyG9fxGZ^ph7d zmThB+f8HN7KTIF0dc_yFQ7*Z*M(zVs^I#@!Kj-PK&!Hc_P&9&rKh?~XB&x0~zS~M3 zTho;6RzYL=m`QV((~^I}cyQLv4~oN16x5zObN@Dv1ZN<-J{j27FvE ziw39dqz<*`YumfkT^x_rgEU6DJI%p@R8_aoZ@Tr$wTxsuZy^yGW!4XbY|e0664RSpQUy8y{?X7T<8U$v7)uHFr^luOj8FgZB^=J zMA>+2e%@OHfq(PvRVv!0^s{J8FZKsqus1dp)A!N1^>60_g%TweNRz5zt1UF?{(CdN z(!)0CecdlJ<5V_U{)Z3x;kh4>3vd?Ju?CU{H>5V`hrF$k9aO~b^`n;@SL@vso2<(% z%i_(-Uh4W?`6~)B0J7 z(LG4ug?*#K&NDCeRznY1MuIw3AG>cg1!>W+Ve0&HC^{7ah2}kiT5pvdo@$s1g0p_I zx?d@XWiV^vY8b-U4a%LRsjhF-M{mIhU=k z>n|&rzzzIRHgO3PE^_xvPjb!VgA}q9L>;?2QeOr|dh5lgWw zT%<`#td15&o+52#rId_7U}8#!)~$`yjkRUZD=D3qt^dDzoO;${2INvWVO6wU084pS zLVo-I)tCK0eD1$|QT3}5I2lnjWC~mWRGIz%yCf^Wh=78;FrT>TD@qhJ_ F{}1y`0KWhL literal 0 HcmV?d00001 diff --git a/assets/snd_gold.mp3 b/assets/snd_gold.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f3b134be460b0322c8cda35d07946bbd0ffb6e11 GIT binary patch literal 9099 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 Z6_8eSLxloj34xe5f?WTOcz?C)KL9;&lq>)M literal 0 HcmV?d00001 diff --git a/assets/snd_item.mp3 b/assets/snd_item.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..dc67e92a6fd7bc9e3fc09e435fe5c697116470f5 GIT binary patch literal 5462 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 ADgXcg literal 0 HcmV?d00001 diff --git a/assets/snd_lullaby.mp3 b/assets/snd_lullaby.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a686a37d58bb13db0af54770dc7d7fce5300e43a GIT binary patch literal 5760 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 C1EQiL7^-mvP8t#l0w$% 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 literal 0 HcmV?d00001 diff --git a/assets/snd_plant.mp3 b/assets/snd_plant.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d4b7e55a53daa8d6c81b9d391b96bd4f3d1cfeee GIT binary patch literal 1045 zcmezWTi^%-v-2N$oy3j=h93534WD@`S=d)FwlTB#FO}diXn5S>_(8EG%4AW{`Aak2 z`~Qu9Jg10d&Z&a}CH*Fz4F?jHw+c9R%6$kd*G|@JT=#3=WqlLvpeq6k7`=5JSR0O25nRFwTUDK2P13kptz?zcnAn~z*VbP>j&O!kUfBwdluCdJHoqx~dkmo^(N1G=s zRDDxqX@CARhr-2+%%)F!Wxpt^Sv)(cW60>hb;lsESwSSA!I3#vp`oF~!~K?#IZ=Q`AIj(L(B}UE`>o7Qy3VQ^kh2=88CRMo#~ykFLuH0nznYf<7b~o z2QUAtv{g0ypXr2G27dC-Iu9>&Z+pV>!BdKn|LrD+sFzX(3L#T03eNqOw6*&ed#aN) zvM+Ix#p9Oc)Bpd{3VbfglCuKrAqG~3^e~C34GgP$SA#6lIFXqny3k>big2OnmB%Fy zZf@ONwfvmR*7?yZex7nM*_+HZRn4t+!Np#OopsmF8Wb*Z$TLXvcrRhF)FMit%=G8- z9|aW$1p>VH1Woz>|29jwsk#BkLre`UZ)#&e9@@gQl6l4iMn7IRmdBV*f)%PapMxKqi%hJdzn@n}vmhHW= zukxvrWcCXtljIkZtFK+W?Cz@SY zpyttgT1(N$G5aKA{xsE^??0p1eU4~PhIok8qTNm65HKb10s}6AVbQj=>9TuuBlYGU zep50(bJ{IgE|n>}irCr(++yx`&$gKP{_Vf8FYA^*=nZ(ok$%F)>_*168{1}o{*&$U zfB(;%Jy&iEh)ZanZIcoHH~;sl_&P1e1|dicxpY{1+axwHbhc)EQJBG_AW)GM61m&- zt-I>R8JBO^=`4(B(~>NyyRd?DpZhQGAluai9!w35?Jk{yN-ip0CLWVzJU*Dnp4sear8HYjv$U~gW2N)QaFfcGEFff=jFfg#dB&kUQ0BniC7XSbN literal 0 HcmV?d00001 diff --git a/assets/snd_puff.mp3 b/assets/snd_puff.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..eb4274edeb76932c68aa7d1f39045dfe474b928e GIT binary patch literal 2664 zcmb`G`#;l*AICqN-OS~TVIzt)Hbc2=9puZ*mSJ+4EsC03qD?N9$|=LhFu8@psUxQ2 z-gM~VRA({8;kX<^(f3;&I&z6p39)a!-~Zq|&inWG`~7^p-p{vk-C6+v@H5ZN$b~|X z8geNKD+E(PHbKs{IuI3g8pdHjIhY1|ga&|Y6(KJ^DgQ_16hW!X7e$)bqU;TK*7cu9 zq&Q5bzKh#b{SkG+uPeT7ej(Z0H&2062X-fjJCrFx`PtTAFIAwE)8yct4ySp{EXoE6 zZam`D1oa{JZ5Blc(-*&~3hF>AD^oWxn;A%=HUFR;Lr1x8tAGG-S$vFP5dbpFUU(DaAJY8yPj*J1rq+i)rt6vCs~PHe;n$KDZ-bNXF;!=@X<9BU zOY7nt!=mxjEEu?ITAUg;&Ke}!#tFas?X_lswzQ9{YH0CkEM~R95LQ%=4A$4;8kIh6 zoHU~xf^GJ^T^xRzGO!T5k#x^h+0?VLNwVoOV*LizLi`^N0f|pMs_yTKEpD26m~9N& z&sFh5l{^cbA8$Pp=;YkNnZFyrSU0D!)7X@=|49~%;s>)X^X_7{6JLOC%Q>K_kEb5| zr@4*NMg>ySKg)bjTKU~jW|f00ogJ7$zdj=1hj#m>)`ln64u7Uz>6H~0*qtO4ETo(F zd1o+E>j9@01(gay{|`=xpjIS`%A#EL#0yI$SRxb}(IEr+ zRd+r0;iWe=_f1ifg$e zW<)Mr$w}OKL@bLrDFnqXtO)TJl!V;OxLNIyfRE`l-Jol5} z{`DuZYD0*tr9;IQOum*XAtIQr>v3315PBQLshT1$>x8>^^f!~MC8qX3F&5vk?eRQ1 zAiLUJXR%Hyp#^4hMcHd3pL?gYhit-p1oCvavESoos3PVdXI~?0PJKI5T!z*Da>rPAD1hO5Vfz z1Gmvcw&2mBy}^98u60^>a%b+%fnn04SFWTS0FP8vmAf8=xaGhLGgVOR8~9a?%H9M1 zCM#F)kukbKzS!2e`Ykv;0FL*F`l=i-tu;5_iI}OnrCK7gZofTgnAziaJ$fwsXZq0WqQ7B<7XO#u+E*VxSdqE?zWA}_*(T@Qd!*nt zK01U0Jhu)|7t&Ve1%>S zi({C8{yB%q5_Yv+S`BqI6nh7MDS~; zH%2o&(pGSm0G#T>f#E}iGYAWwqAW~pnp*;drBB`oI1Y@xcI22XyrQzal zKTdUyToLb6Q^OqZ9Mk>|zigRzv{>T*^5r}x;Y}m%?fuBQ08vdF@O_I6hkGr8;A*OJ zXI`3|=TCs<7i+6=x(eXf(Gdy?kVGX0F<8vJIWylZ&^eYe3X!6u2^%mjegIsofnYlS~1 zZ7pfMx$p~v+hT_Or2e>Q%C~=COSu1d>%$kv&f#=%?OaMlle-|fYvUD8$^mv$f!YXm zY-G8uzFUGUBgG?--`^6HQ&3V{Zh#Mf46Y>cip9Xhg~{0 zRQ^hOIr4zlq>*zfhCOu0G4-UT zW{(!20w7c%x!A$eW4~(d2rc;1ulxB&F90H_B470ko&9pex)W33qFmniLMyxQ?UUVs zPtI4=H@v?QP;D+~?rSOA1fi3W)*P0rH^Xk1gTpR6&fl*sxHuu~tgeQMD6zY1+Y2cw kZ|~n9_s@22DVL`5XvlE6Qgosl0LVfBfc{`R#00(WA9YybcN literal 0 HcmV?d00001 diff --git a/assets/snd_ray.mp3 b/assets/snd_ray.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..ef5a21775b343684f5f386580aa09c9f89f8527c GIT binary patch literal 6583 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 literal 0 HcmV?d00001 diff --git a/assets/snd_read.mp3 b/assets/snd_read.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..dd1ce822ee908d1230225a7a0e55efbedee1941d GIT binary patch literal 6176 zcmeHLdpuNm8y};>yeVwd_NqNi*>o{iW5zIP7$U}Xh;EFTgNeB~Gwv1AMN;pQOD&?P zHs#j7vfIU-HhQ&NXq80if?ag;mdd>6xNUmv8@=u4(;t3+%{k}$d%n-}eJ;N<$BIQ( zM8RvZmc65u3ksz^4TW-L+oOz4f+bv@FDL^%L2rSGf$h0af&~P826i2VO<+sRKp%l+ zCOJb{WQk@Sc(I*~{xl7QibU4;RR zA-)&gk!3MV2VXI;J~Ekvj>iWD1>u6oI5FgnCmI?W;t3?g2#nB^hKOX`U_Fs^F=ArK z1`Cw(Ab~_C5Q_lBCf8FOAY)*$@N-}!7NKO+xJZf{j0?vT3-Q5R37&`};NJtY+5a0Z z6pq;;m6->^jKkiKOCaThNI<+JC=~}lJkUH46v-C9ODdH)f`14w0TVEMi~%@#tUvQw zI20r+M8p*ecx;d_fU}9n18<_6K_FKqhB#ue-$-Je!~r6{r&uiW0nD8A0bMxJEHTec zBISTWi5TMg(UIKZ2vi)Awrs2+kj0gO3@nL2Bchc!f+5&1TcBL{b@7!~?BZ3@jWbP9WgZiG~(tOj8PzW=12L zlZZqbi$-OdTM$f5^(kbgg~f<-@OC)f03n>Dk?s7+ZMTC2aO-jX#xrAXPBx%XNu)pZ z0;z1k7wkup-Vr(V4VZNU=h-}Jfsg8SSdFUM)Te`P_6E5x^LaoB$&&VvPUqCK~Q576=L84zYm5 z!odzFl z+uJgCN6w)N`Qh2U2?f<6lexGozw@R0jI%gp_2D z=@vM}15{My;ZE+i*(S^d-p^kd)Wechh=|(!OD;q6 zrz;KnS4SkU@yq6G^z?1J+k80L=w5D~%iDChT;39~tqX;U7>vhCeXmB1mgjW{*QaC> z-i9ek+_-!Gj&7Tnr}qMkcAui|IaM35Nwu{DY&7tQfudc%U}My+Qe)0!u}faK?e0$= zXfTrFUKS^xI&#InGOo5OD6R3qj~yB@Pb*#W%f4!mdf-vd7<&6?zawGkNDp@X|`eO33vRtl7u_`?oFQYkdpoMe3hBU zbx?`U*?H*5GdDMCZb*5&tX?yVQo3D~cs9Q^?=tD@#^veZ=?D)`O>Lksu%;6FVHU0L z)xjHU4*FeEVrS-?s&C!#Wm*p$ePwv;E~&P*Qc*@Uxg#R_%YP_)!*{R6b|hQwM9s)i zKvBFhQ0870n3tti#09HUeSfNWc>nVK8SUt6@y)>U*wc` zhSQhaSIi-?uXb-d;e|F$KWfvCL*rFlwbqtzl6;pIV;-h2 zKEKX3^iqlZ5t!cC8PVw8;2|+gdj4yZR{+tKuxB}Szkh9Hm78cghGTIOJ-|AtOHrG?D379Tv9SITwdZA_t#enR#xOU1LDg1z-^Xo`85M z2TA!qIAh({4TR<_urup?e*2hxMEh~Q3~qL^2f}k~P6)ax5UvA2#cKsL?{9~Kvyb{< zl$R$v8y<|SI_?I9>nb`P?&&U|lqpoJ?ASu1Jh-d(yFcn+u|4Vm`KV`x(+l%6;rD)3 zbFF?<&n|DPU~-8WrHX|%_SoxpF3xk_JFD#g!gE?ZKPjuF+SQh2%JXwp*|tt%LtTEK zajiSQEj+cfG1%tEuKJXMfBDyD$D_1WANol!Gh)&kmNvJD!>gX?>8JJ2NU*tZc~AYx z8vY6s{7Jcdb~MA95{inBU!R@3e)?}6|JI$3@RVo*=dxNVW{SKMUk5A=+SRSxnzk`R zX>Ln-;lMo8w-;M3wQI9!t!sa?EG0J8w_0{6uLAsIIf``ZKH^Lv{Ro~pSHp#_0qjq!1Hw0#XH(pFfuY@Al2 z{qyS_I`meo5Zjoam}$08Eh@h^D)PHsg<1+0QS0}*Wm`PDozj4PF#rY@iMHR|Qq#d% zau-hTk@$h^?BY+1){Y2Ixn|k18iVq>q&Sc3Ivhm|D^Y(H{>$cxt}zM`!eT+CU#~=7T%`15^Bgpa1{> literal 0 HcmV?d00001 diff --git a/assets/snd_rocks.mp3 b/assets/snd_rocks.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1f94f57cefd1a764f0000f2ea94ecae1c143f933 GIT binary patch literal 7776 zcmc)OXIGQW)&Ss12r1NnbP)pv2t^E4K*dm#P(!b3=tWS9sQ4&^-ZAvhixH^`3W(A| zFN)F?MFmAb1S?>dmptp7_5Or2U*^NCb;Nda>a>-w=|XSirWV4|42NAZj(>{;7z0c+G8BeR+Wr$`s0z{P6auLE|lUmlF4F9pYJ>(t0Sn4!SKh=sMK^!Hg#Ctbbqp=nejIl2x9;# z>-v8@45CNiu>(mPY41nk(kn9hGtS!#J{Drgh)Xl=)USMK-i7#H*3FsW?xUtMp#R@0)SUc6a zFMhGtEIKeW;0Wu_96h87Nm20r`@#O(RQHL1$XWn74AF~J5;0?YV6lizivZt7U&02x zek7JpyiIKEFbkuk_MTBzixCi&l#nj_XdRKL0*zD2PZ27+v(x`}I|dmXS+4K?8S)vy zUyYX!)+=Z6)5KRb^Dqr{kLs*rO5`3ynm!b@GnI~%@K7xvgnA)_bj4S+lw0{)?mXv` z@hmG^xqH^c^#ebpY0?E?7eIExD}{vrcoxFFd>g%;wuF=|a?-~ipn$Xn(sUqZR6KOdpe-n$U1CsF#-9_qVIo(H0S05QoSDQ_u? zs{NvdlC-Al2u%zb#JG?SpO2nNEkELuBA|aPbStqV>D1JNuq&*O$epi^e%50b++Efn zjS${rWZJ*~i-xGS@**}qB5kDBzewQGo)>2Qi6lyS20H@{cx}Z#U^(Js>LvwCRkETk zER8-=b-27o3hJu8e)ac}KgT~7_H}p6UHt(=avmWd1ma*(qQg=~wn%IKnuoEkwWSUV znBDMh8g_{nrj$WL0)qyn8t+IBJ{xKbdgLkqhvcX06%UYTFoX{PT;l)6hX&vLC&Vc3 z9N{_QAa5emNsNQF^mr}=^F_MnQ%J7c{{g3^r@HA?_{}^ zs`N>^7URDL79EHKLdqB0ECipu|67i7{KQel0VZ!kLP@;xi6;FXS2RusFM3)Yig<9L zp%R~KEBlTTwRNpJ7T@QCGrabE& zJvy&94lvV|rGMETArAOcSHIo$!)HY+mbpSmnYc*)V z@=A4oc)q2^33bldW$uwjw45gj)sIV>H=FUhK0r}_S$TQ>&PmVICqsW7{>&f+fM6C4 zx)N4nPAcswxVpW=tNHpr}t+e~rYfd!o9Kd&eQPwDbbeZjurosD9dzj;Who5k(HCgJmEbjisp&4POZG$y_)e!CHi8x7avGa68!USfOj z(eU|jpB07$VIn2)U0hn*=CmYdOi+1y?oVMj08kd9@>Amz>0Eh|yYA1h54UG=y@rgZw2hSbGio>1d$&!4+<1kC+Fm@_r0RApY4RY2 zoSX@7luEEKw(LCkKCAX^NwYnAG?QX`YCV1k`8Z|$L?XjqWkpcj~DD)ckkaJoWm;w7|V9r1xjLHt-u zb-yaxLyRTjlTRw+{VB6N>&9^fS;YH-uQQpnRg_V=z#ggBPMs#rO@`0%D~aFULxLgd z6)uc+X*pEyv#z>8g){9MZlc`pwLw5XnoC=8FW018&fo-ob^feE+}9T^`%WF-2|xn* zLkkl0t%o{RztvGqXXKE^1pIvjVRl8&`BsV-XTM_2OGg2PqKK>ww#OnCLA9a=9_?XG zB)?BiWT@V8S=h$(&6Xb?N}aiNiGVUAh}Tt(I%Fa#yy!k!prT;0h9045M9rW%<1POj zj@d}Ome%O+{Nz!>`K@G!Nol|8%!)1NL$(kOneJaIfXb26FDo9Wqj9)^UnEqhyoouMKtQ{>8`<>xofUrQQs6XmM~BSAj?Oy zvK8j5g0pZ+C7DIG3`cL$tfG_az`NOawj`MS7DOF?nV7)|t!iA1Iz(F!_Z87DGy&VGZA zs|lWNuj`8aDKGA2Q+ev8JsQA10m#kxy5##b?Odto7!0negrLalA|PAtK^iOITjf)d ztU|r|*60`#epNVQ^{*7?ROopo6bKg6AQ~zpYqrM)z<-lH&9VK%ZxMB?n~b?<%rl1^ z_APi54vI_5$xQI1IICavF>aQBV-@EO3?K68)4jAAx$C7yFO>eSFgC2=wGbKvI*Gj4 zDdp`UF&v(I0P!f5)6-9X;B7o}N~wKdCh4QERARB`!8=#Op4j9c5)@ItoHX}q6k;0* zSZNlj*z5bl)$TCUFvr=RlQaY{b6H_}CatHQF5XQ0V(e|3ET>XT^_0?z&*U@@ zo_c2KW3MQ9h%o=_+B$Jkf$m+ZGTI&Jox3M+DrOE=nPQ zgo9S$icQic5-dVn*hwzSD$#3_5 zrzV|-H7$h2z5gTMgTyL^T)34gsHaIYoLougzi+KkiPRX!-wY6K1l(nejEXO>u~?%- z$46Y8p8PS`9=VBoviC+iCL`IN(=>#WqdSr5tq zxIW+h>S{i-Mgri(0>tOa9VL;|z}BGoK@h)&Ec%=_>#c`LlBoRKviV!e?;5VX z*_!-?7QwikZJO`i+SrLwEpEkdnqV@RxLp4={io<+$7N(juTbM zWOG+8vV+Xc>i*!zGX}1E<9OuorP%`4ZEWVU-g7tXnKrU}HZ76YPDrQfPV_4kD6P?miU)D-97EquZ<2`W4Ro5zxQC@NC;0F5mi=RNJC zs~1ksoDiq~L6+O!$hJJgq7ne=8Gt?6lUtO_M|9vHs4uE?i}Skdmsq#%K zV$U*_tNVDz5jht|&kvM+70{hU3Fdy_HGC9MK{LE?W&iu&-E$OJM`M#Tf%Bl2S%?@CD;&;#I*pn;FGfA&9>Q=XT+Jf8R*ZA%p zOI>TxBAAJD%gW1CbPOBv(@aJhQ)(CF`HWPH!;m$RP)`r*7+Yx2B2uoD19!uix4_p- z$*tz{Xfn6rivS=GK<*?6V~y1qD%M|Z5frFMqE+1RInT4X(}_Bx_0LD^m& zwL&Q(t21@2MrPkl{Y-m*g8p*vAJ*OWHy-we67Q=*T328*;V_Yz%~p+}o^ zSUC}!4v?046{oi)kjT>#nBO^8>KO5x0<0M3;EhYg%X?zI^Thut)j==nX%s%bUM45U zef&=M{q6dpLmwt1%O6w42W5E2=moUJOr3VDURK+AgBS7VyfxO9{49vx#e9WYbr=-6u@9Ef*P`JR+%!EkimC&8e z`}FwJMcP_!#p@ zvOVR%B=}gs0M@;6o_me3EnU&Rui>{$eW5BK2z_8dX=uURv^jZ6%Bpp9TjArBeETIu zX$!Ql-+)P&ix1PlP!`!kJZ1+^;p5|vH>TrlUb(Jv9tJ=@b!dv}w!i_aVMUi>dajF> z_!zvJUs?|&HWYTwW_>Ad{cf4mxtCjJVymfp>ZX=ci>$=I`>PtjABF`bHoAYBN7PsM zGe()Ik2R4H0yKvXv0^-|-Iv`jdJ@ao_{%u0NT7+dbp1}l(uj39H@-SxP*ep&gYjLq z&E{#c*ymwb9<>EqNOZs4rxekkwpEzGFOXxcw3zqWC|QNiw(P;m!-;fQdwh}bzT98c zBhY$Q@yLz1frr%wejYO4v~tlvh#jAsGz8B0gb8*uX(BDikDg((0l-g#g(WA037$6^ zy^1+QM^tI&4Re+?;-rErEk(wyHAua@l(E9O>Bru&R@(HDyW_Z+opQOOhp%pZ=Fv#y zDlW~Ue^TSK4~V#u?2R%MG*<6V{d{fppl$P_nw<5B^U;S}=2f5LA6i5_5n66or$PW8 z96K<1a?dK;(*h70uC69nZ`yZZWy$^m?im@)h!*WCg`rI5`fDwt<#?uvgNb={uTVIQ zW25cLKgPWv;!W46d5vz%X98*%fabDyf^pI-L_4)Z{8ah^J#2qoq421FvDAh#_S{YzpF9{FMzLDOshyiR>Fgf~@ zG$iCro=8GV`bH2J2nLoCW*aF&+ydWec6+PYp8F7@wx`2tM-Oe4?O{f=2v3R_DJ92M z4yK5&7C4q@XQ!!qlWcs(xLO0V-~ur|lAc>8Pd6b{vXl0jIe!K+O_C#aM37~mpw>so zo+v?LB-LukRSuJC+H;+I#WFnW3^QoA_y27D`8R4tDV!oyTn?G@^6%=u=eV!BT3!Yh zN|b7kJ<=#vBh2=6#=wW|?S`0R$fe|fhudNc<70DQ4xo%pW|)1 zy?VdH{MD{pWgY-t0FZM#;iQ^k16KmaD7U1%(`%^uA1GB_?yfXVR@Mj2rNZ{~0aC}z ziQW8=vdkU8928r4vL3^~OugCHY5wYcS4;cGMl2el9t+@=xf~9|D^~t64%+W@kHBieKW?~w2f{dTHY4^8^d3s5DY5H^ z`A5}DLV!+-N17R{t1#D>T`!gjpEr3un0%R1qh75X}6Fg+cCKZG@_Q3|@r6_yLx-y3@OlJ0c zJ5q2q|J#mncltEgFlWbSh=w3o@8-_|lozPA>PQ-Raef^VsE0qS82}V$tays*PnA;?Z2N~dH=YpnjpRaxhtuX;a*L0n^Hpc zf2pZ>sjU9gi{FG_8LK7~5WFJm5W88VUu745{mEAkk3KrG+h_KGttkd51LZX6QYhQ= z5FpTGdlT#sawDa-cr#tPv3Rodw#;5_n$xj5{zJ13m%{I)pS|N4kf;6g#7DDxrY&c} z-RD)dOhv?p1R=W>7_cb^`*Otj$lPPo3W}LrJ%-WWX%{W-C1Qmh`w6%BsXcyS)lisc z9NRY-p!uY;WqYS-ChD#p87L8e^c~MQcPGGb#1BUzvESI9$I*%9&J^D!Y1#~T4P#rJ zwKniGarAAOQVRA8zQH%-ibQAK`|h33VLLmOyP;?V#Dy-5ugq|& ziaGPAfK$Qkh8!Wqxus(~4LNMj6b;^CY)x$JAQE3iY@p6Kv zm8aRBXEcPySx0$BVDMa~qSt1!R#=Jlud0HuJ$lXM&p(+8{iZd%`k20~Ef{+&SBM6v zMtNRhQMjQ=<$TVyrH5jrQi*cR+aunI*;uP4^%O_JwjV=fd>k8>OpI!OL*bQFyXsQ^ z%BHTgZHRWe1(Yh#b1=%7l)Y^2nv5n2^nQJY$Asi2!` zjczM3TCGtnt;$dOJpVnv|GxLn`?~j>`~IABKlfb5Zv+(puwDu}X42`1E3BtGsF`#V zfVDJso#h&4z*>ZL6e!PC>~a>D)IrbgJM`^FK~kVQhD6IYDMAvpy;U5ZDNu6}vB3eW zII0tdFgOl9#-sCd5a_j#$>CO)1VFY4a{;N^jNg1zHo#0j&8d;HzFy6>+F3+w($3CI z*UmSdoGEm7DYHFP*#9!_eBqr52BU(Ycbz>wkx}v98|vA5xJ0WF8@L6~-$p)t?u z#*$lO0;5mV*Wlv}o;~DPlNsvL(0c)-?jeZR++1(2#`j}}$bs~e`>{J?|8iU$>>JIJv^dGlVEoVLdms`zaRp3-SgN%qR2a(OVZc!V~ia+8hYzu5J1tf z$fz3H%XH~ewDo9ZKL+2u-ME{)UIfu{Ru1bg&&*?eoZ%o)PTmS~VlVZAL+}2{U&m?N z_x7T-8M{ybjdxAXol>iXPOqH!3rZO#x?6Ffg9v2e(ZL%1WtKY6lpT5?M_ORiO?EIc z&|bRuZKh&v6>I7s3+98thhg%iRjBUHNLKD*ue_WdCOPGy{I6Ubmu~Tkcy1Yk>Z_5jV$?@zE6y>dDzOnpZbpw49XJnL-Z3r@q}Q6C zd~Te{Fv&2>s0TP7^aIELf&f#I^NxyD<}D4JACTyG{K~P?bYv^Qv#6lDm0)vy!p05Hm?xM(SgutP?!T zlau_Vk%RwzhjvUH03YN41+n@aPDJgCf!FYnBj>jUALz6uwX!^&51C6pbGUya4d{nhVjF_QxcR)#xfXSuAD1@D(nJb1 z?*Xbcc%g0^OSy+(TJ4X%YBq9N6L>J3}P znjhaNIa*&8^)){u`6>jv)WZPK9>FRQnwJu06A+gg>4-NkayMWwLEHc~GAgP%(`G%L zbh}Di01rLx!hkd0=K%=FW7u5yPdR0x@e3q>=GyhwG&Y`%XrXYG2N;nd?a`RUx+AE!9DQA->(MBE#RUhAvs9AI&69|`b)8I*7=(&;H3n9s01~NoKpf@n zbGJHbYnSsUyy8SRPLA_VBw)aK;jkkK|DMc3$b7>AX@i~%IVpZh|7o9DcK@{iRs_9q z?>Wnaen&I!i*C@!#)9z??Z}g7g1=wWk5Ra3ihFX9hmR@+U}JHPNCS}070zXLF|rpt z=Wy;6!0LY-U95J)qGxnofZ-bVl)^nAbL3q@-o7)UA|J)N7D>0;hQ7Ark(1VI+Yj%7 z`^^_G&5qJb4BL`l%%WBiT&wZGv1}e>#k!j$*TKpmsPX_7@9Ij>_i0HxSUF+J8KLmA zT=wVNM1DWhxZ+YyFtX=MjPaN!N3nC4J}**|Sf3XOUi9OG3!`7V`*iu?Hm)&dWNbCr z!9p*z2>^)kXt&QjHvDw=?h#jx!1k4AUTtqenIKg#_MDHSoJjq83arjw5s82CfC`dY zSg_0-Po>`k&-T|jFO$hxU!G?yFQ(}jU+^{DX()cMAVMh|!p%AKTnq~%x62Dzd@Ypg zxN$>BQ3|SD41E!@Iyvn8$uf1mK~kFP%VNO<=@76)Z`<0c)#XfBEtX3}m23s(eJ>fh zsXk6nm4yzPa@`OZnlS4O-}^Y`+qgXmfQrz7Kq*;5-R*5(L2?(=bo{tclGE+2xAcp# z@(nv9SE|@S%^6A0lixjd+ZpUo5`JL71Q|lG1e_jZ1;U;MtA&aq-Dk2S0!u@@y?ac? zhmMu-Wo(5abwoG>5k5W+Ss{5^elZd*(bQ|6vq?cuY7j9&{;ww;TF&(eTw86Szl^!+ zQn%_rB;8(7Y30FxvianocCwGFnnZOsV{%{ zeUA$DzS9ESXXFK~_VIvj$-#)lN3|jxfOMpmD=mny+lyj~L1Ru5YA*Kyhm)OZNw1SH zJ;D}=c8$*4Z!Ls;#9&#gQYiWXfuTFEmTmkx)(jvP)l-(7U(deV{`u(zIwE5dIu36# z#{i&b-|A_Yx32AkiR{;Ac1)0C3e^Iq#U3^c+dwyY__}D`-S& zK!p00)`n+0cRmhZj{afA1i2Ehv98w0{vmW4DY&W;Rb&d|T){gX(GtSlFe*Vh=@ot| z?F@O=<0s>osTPO-#^90+x)kq}+p0(qJ_Qn*v_bB!8cNEiE~?=sgdzcVou&;Wo#` z;LI0K54vr99XQn4+mLXKb6AP3xWs85tA-scEVZumliq*z`OJsU$lygHTJtoBwfry? zL>7fhctj2l{9%FufP)ID0V~M^8Kk;JIPwCLCFW4Ei_O*V(xOxMQw4-*@)iKMDxzyP zRmpqddmAJiiGGp^8{^StoQ=4#pAcT!H$%I_a6JpjsN=t=W!!9YaWYx`t$AgNA0HMp zXQtjg#dGk%Lr_mAQ^`037JNWtE{TreLdkKEf|gv2EQ@cjX7!!Mv9Qz-5LW`*ew>o> z8ZZg5EKX1G`X z!^Q^=PY)&%K58U@eT~ya`bYuS4mJfgav%h0!Onl7niW>o0w6rR_%z*2ON3kF~;g@3zIey?Gx8 zq+v7(>`c(P6fD_W4MUS0xJ{}CxX==8aznB)4d;6{X3iSN`_f z6c0_^K!054iQW(cH*ERt0`{B%e?p8fN0a6)8>5yD4vWN2OS+@ii1deTSjy@8d1czq zMhX*j;Q-{M3-}Lp=UtQFO14-CM(zD>v5V|EPPLJ`42!(Z zjc#l}G*F@h;>|-LL9XL!2WNsbklZ1|s)=G%_$}+)6t^hZ3`x<8{kBv5JX7t;`a@%hXb$-dD?$bFB|ok& z`8n#_jKFe!gODnzxBgI;&%5R$h4*g@DW##W7+5iW(Hzg1n=}dHM86VZ`Hbb{nV`#H zQ-rI0`CJN6NTL;7*PJntCf8?^H%(qHO_TdfKaTHdgVVGI#BXt+yh?W24j=9nQ!&0w zcZgzfZ2a?c!UIJ3P!GhiX=15mKnB zI7NUaC6^DQ0b*#k$3td)!0Z#U@B%W?O_2T6C*6*y{m;(RBAvmb?GIF6T#;_B!RQ`+ zE@iIlcr-<43ZiAA9$}V)c&^c#+19w}`AMAd0>5*PD5qcpX(%|#t7h|o2}*-dpSj8b zwE2NLSQP=@kCY$hjXs41|Ev+JqJ2C0(mbk2k5h&=YpRSOTChKwi*nZ4awi#6WFvfE zE!o-=G7<72e!UVm3^f!LWa8eQd=r~i#GQ1gDaBkg7@}~ld&M8$mBj?56R@c`Ie2RW zkVL9oWTOQA$_(iC-K}`L=JR6p&}IQf7p>s%utc}YU3c_@RkFQH>D2j@sSuJ^Si=5V zg(Rir(b`=7j`9Qr8jE7ZQ#!h__n#%ahDTfs2)b?kv-)zUy!PJZ!&ifzTKFs-Z0XY_AIDwYlg$BLe*u#+#Pg)V1|H(J1Z5u;k>X|ONi79GBz zX2pxFToPPLZ9ON4w0}hF;#@PXPC|m&WTiR%?YwjcPNJUsHO@;;Xit#Oy-onxD0C95NT{UY5VyCYk$YLj>K`z?C~ z!{o|I!CI21sG5Q|8Q1THi( zqC(U;uXdmg64?zM7@CTfEB3RG@RwTp86)j2WE^Q>rUV>}pwGj;hKlb!LG(luW zM(m_YvnE*EOMM6hN18fEBl+8TRDl3Zd$zi|I3H_fh00Q>7@Q1paR@^s(ExE&aF=|z z>Y~o-{k~%jUAyi@PkcV-&sl#9@IQ8Y8KPUpak+P$f&gPB)w!-)y1cO<{o~bdxVI^< zWSkJ`|6c03fS#JT?0ZfR6vaQ+NVI;6JS@@O!UWY2uo}#kgCLV()y`rluaRN^3HA6n zQr=2`1g;NX5Y$k3;n%C?KCzBa?L2Q4-Bbas%LbQ@&}*)Y|AXvj<#nkxuL!*U(!Z_! zr*`+V^Y>UB00_nA9?vi3me}~Q4DOXtJ|?IcOhvmhTVeeQ%%7lya_5`Ep+#3^iUA0nez0(GvLd(&4}71C?v!sk#+PGj z!q&z@c3i#QSor*BRC&)>(Eg7ED+0jcrZezsOD+Ju~>0zZ5eUVFDwZv33YF^ z=dCi5_01pSiQ6h*j3w7QG4>huHFGx3%LQ1gJZn2uDk>|lDX)zU4C(G*ZCaCPLffRj z`t+KXx7Z^vU^}d00%2BY6u@S>B0&LCzy%WBjV(U{o;&IU$A}pmjz*srY6qp=UFSQW zN)9IoQX#20?uJR!C(%oiLiL(!c~Vtl*7=eas0s(Wvgxo_)?Wg?nT0w<@_Aa9mL+)Y zCH}&qOpt&AA7IM_jf00QTooz!iuGL5!T`Jl={&7l_{pz#tq80mfx|8(0U{}EAa8Hz8G7>mprfK z%hQ*;mQ3z(i~Pf2FuvnbfrCRH1B$k|Flki6d**6tM-Tkl*MeVvBs>|d-iB3^dTaTy ztX(a_%!OM>g2v;-fE7QBJQz(wOu&O1E*Ebq)cCe4$~`DxTY~dM+}KIHkFm;?UCrA=V0v1B3J^f!WdVi%@ZFnVz%iyy>2ZM znNTKZ1;i4G6Dbc#esl*`C8sD797tRTl0`PDrH140CEFCyx{bsAI6rR9_|M;#)Gj-; zG8p^WlQ{>OeDSc?Vp|uc$$5Ab4jOL3ZYPN|FPD0wd9EHJDGNIaYQv6H7tBukJt7qCzwci_Xt_O0s z&mo^I_aapPF^Vom?51)j$=IM+5W*R1^X_kDbtgN9oZJQi%NSqxojxzh@x3);g6K)m zew+{xAVKVfEy{_pM~e`A{72%?S{}R0LA>Aceak=j*3&ni?kJIFZSH8@dGV4u>UmHg zQ$U}a!ZYNL88zjBpO%TfbeB6~SbTu*7Gg z08$JC+VMqDpJwm}^l;~tJQ2cuG(B6%n=3twadqXrR++Y~@Rbt7zaR*;%1MFJZ-Op| z%^Pu{>ZaoXiZ}1v`o6t@JoZ2yB|GrqSxuSBUTbJ-Jd2hP8|F(s^lC$Rl}0{ zCay#(i&uA0p!DF0BntOm)#m@Gk9Dcs|Db&}k$5kzNm97v2otoNk_N>|*r2S&+YdnE z`fkaMa3L0d1VkTep3=cCG%1{-aLGD-@lU(%&!w(ccKftQS;n7Jo97SeL~(GRCk&^5 z7CH7(I*0d$h+%W4G;y=7?Zd6(yZP3~8JqiL0A2^Xp}+(!1JE5!DU(_MoKjL%op8R# zP+fj;aKs9+Ok!l@!cnYDeM!RoeYAKrgE2k5G$xHLIB0BE2@Ge3mm}42L)Ubo5a3Jf zv6RZPCOBT!&7@tbUZV@WVSN6&y_bv!0B(OkmI+!(8KzkBS%jblnn=DFad@otyVLkS z$y60*xx;Q%RK8ymBN(!FJShtKjb1*zTk)*n&!<-(ehbnwdWMV_NEA)qYe&-b9G=Z8 zJLveFn{`;32&~u5QdeR87PL!b?EUEdB?$a|hn66zbvQB8U{jzQRsm9K8K<0@GKS{d zkZ&-2^s6y_gA+3|8)vR_5tLA<5;D5_M?R=IL-+*|DXr z1xdZWNxjj)X6!C1=SEqtYEzdhibA#J9c*%Z2d!<2l9j5QrH+@td{f2YajMQ9eV6(? z+7H*^}2St00zOoFHbg64L>zI46b-{?}3eHvki~1Y+^RaUTrZAodK&nP=$S h|Gn(rpJ9UDrVJ6Jxk1&EL;%nr008vghy9-j{|9shNx1+3 literal 0 HcmV?d00001 diff --git a/assets/snd_shatter.mp3 b/assets/snd_shatter.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..33b500ff1c1b5c82ad9f71e0924854dcaad80995 GIT binary patch literal 7218 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 PLP8*%Z$Gl_@#g*ou_r1d literal 0 HcmV?d00001 diff --git a/assets/snd_step.mp3 b/assets/snd_step.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..fac28ea08e1e5a9b9db4cf5c8a91b6e81f3d5a8a GIT binary patch literal 6762 zcmeHLeNYo;8s9?1K(V$}Du|xTf+8x}-Fy&O6Zy!7<12`OAGD>iNj4;fWaDNrfY-U4 zt%ALRA5$nOwV)JRDjuy?uVbsWbnJ0}9zEskovq4EovP=V( z`$uN?-RJYSzvq3PY%(eFhQNxzGBT5wLD1A+LC^|K2Be5Bwo(BCtz@D^Mcw`~w&`gH;Sm!%~r0B#zW!Q4&}t5lLjYTq0Wli!m%3#pI}19EnF0 zI8NYVxNjkg{9pyEHxQX*VxK#3r$me#XC+Y7Znul<5)s4Zqj*eA42p?)BS0e3R$}3( z;z)}vlsDnFLDDuIYqD}C#sc#;DJ@gPDG>xbhdsHNt^LL=HjyhYk&ZE=#grArMHqUQ zutxLK;%4(84I7t9---U74s6*aRvOKuZA=lXqk(wnK$kX7y&8nvm;Mk8s8`b#ZjcG^ z^2q-ewb`8{Sz@8gCY^@Xo50)T;Q>m7hS8f0B_zesN<@s|l1NM(DVAsBGD0RMu$cLn zl)$h%(trtiilc@quVQIn`Nz^yLKa1crFU6(Ni%FV!xVZ*mccjjJ=tR8D2tBvcsBv>Bo?KP#>fOx z;`Sa*V)7U{*ouiy0N&*;X2S{)EbpIYO{-~rBFmUve0EWdFx|uKkdlJk`udTA(x=Zn z2)HO;xt{!zOg4^TOI%y-a?YYxx$oS!g(g?tFz^g&grIbMohuO=1yFI9kmu3JLGf6y z8);yAU=g@zD#ZuT6ol@M#KssnJH^uR`G8#`XKTMbosqKS)8Ldw7oz-m%U2oV#;Wh2 zdq60L!rK05#t0M-695%?pSl}Fv>yWi4n&L)%YR-jj0O`_>R%ubI>y3*LVKu$NPJ)% z?&^^JARk{A@R`}u%@7X5*}yQLxaoj&SyZ{0{&In!ACy+YvEW}&L1+4K+wc*7EW%g zIeJc5b1|a9*V2Opg*nn5`-`tvNFFJjJ;ghu?Ul5(#_(z8jg3&dzfcj=HLLfiVUjV} z>(M|jx$~bJ9Kjd9?+TiJ{1SW%X{ue4Hz6b?e$CDg4jw8kthK(`5f^;EXGZCbvxX3% z>cjuOwy7J0eXr*sm^_AOlL6 z<#jvH$A16qve>5jBH5zcGsnJJ5!SSA)&74}#ufV+1W(cv3{tpi`m2{CP6y-js&|z& z?D+KeJ1Q$uwlUeO-aBw3>kUiGE~e*<^LFjkZhxnf&ic<9I)`(1I!~lmE!c8;OVX#W zrN;j?sIdBz@Ydy0fCbf9pQ>Wy8CR z6Iv8g_IEvRZ? z+pk3_^_vgr`9?y?N42LvVgG+tjH1ZQmM7G`cTR8HS76?V`S zpWx*kduQFz=C3}EJ8NvNtpPd$$Dy~`+&MS=o4g~^rfvB09US5FVIg5_e(L29lW|4Z zg^zZ=f1oAZj}7?Z??(sQx#>SI41yq^HwJIJ?!f-oSbRR~AfL^lOaCRj+}hP>_-Jj_ izOfP7h@#;0+2inry#pN%Xf6cJJ_26jh%Ai_rT+mtZBiuw literal 0 HcmV?d00001 diff --git a/assets/snd_teleport.mp3 b/assets/snd_teleport.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..cc42df593bed538d426c9325a1fa2329fed56c4c GIT binary patch literal 5224 zcmcK7`9DeN z`%9T+X6C*qoiaqYBvZ~J{^RauNtfSew}d$WAZgD8VEA0WXjM^w1Unepx23-&33HIu z`WZGE&oHb-wkcF+RN7k{q`YQh?!79NI@}eT8}(gQX0a%Z4tNZp_Nb+W+O;Fbrf-48 zDVR_Q3hZvve*$v#n^4LQ_gg-&>B`3d(7v{LI54>YMHa1tB!EC*?QA^7jmwrGmkwa7 zZao0>2W@D>jn_@M#>xU0Tzmn5 zHSmGvM0xjpK6Ul%W%IFz8Pt=yaxYX1uSjN!L2~RKydBNhkGRZ94$-bFzr@k#M(k+s z(_|lfS1q*|yHQy+-XT9-dm>M(+mNSREZkQ{uut#ak-u;{FijVLc97;DNiVm<4qV_4 z%95>GImtD&1({gGD|LGQKB}`3WFbKeQi67%H*J%BI~~WDAa?y>Q=-!u_Jhsn&)Gx`R%Jl zuz)>|>4JrkVX9Y@b`L$aaF^q=YvD%2Z_Z*z=i0LJgV$1FLO6Huz7XHU9Snin9ZYAD zA6m+{{HE=VV`UQds}zjsi9rfr2i4lVA-soj88xrlLCIx9%AsA?{5AuXHBhgXvyG%| z8`E**!GJp4w%%5wa?+qkPZcd`pmL?AaFYAA7A8crQ=7&n`NB5?s{F7RN%eCl{rrvl z5D~q;&mzoE^cW{Lsfa;}YyscGvLU4RdtK5D?L9LiGELuw3m_P?d)^*xrq(!Ns)H<+ zW44&(QFVJAB;0>Axs5*Gv^nmeQ0p(5h<#Twc7k--Vb-#spyn6T$*}<*t(`EK{SG~X+wXt5 z1&BddNWj%IuUert<{))x_ZHnRNdJx*P$mq~h1;n&2(YA^st*i(uTIF`sr5};>;lxD ze51cC;vPIlRDG0AOeSN(Vb|_5L!5MTwOdIMDrpAVa%en%pkaN{mjoXfz1uHYsKUh{ z4YX8#7ySS&|c+@yAfza$D)2}O1dwdXiWKzAI;sjhqa6HgEZEFjDfMwO97%z zIqQ&Q;mO-qk^VOhGGyA2vXK_ zPM6_NAcFlGn0rFh6<)cPY)WR(NTpBwL&hKFjmNA7`WqXu03ULOC$Vu#dcA!;1+k6Q zOd$72&EYd1(*Er_tusL+T6;fU3uN%%@KQWgj&jsy{Jp<5P5y6rF~}H#59nFe#SkJd zBW7PUN0w^Q_~{)i z%|47-&*VZb=?f@0*!Y`hudp;fyBh0$^LWAOv&!v$VvsGw#cG(zo`fQkI6=63!rkz; zWljzPz+m!3eFl~g$~nr5HNM=2sV6ApE;AUX*CW?MWmo`6?avk<^|l?BMRE$ez8lJ2 zN6IU*OcY;}2P}h^YJg%i9ZQv%NtTAhASbAMS&M`|iLX8huN=7&;*_VM{b(}C4qg=7 zfBURK2(o11&bPT+38Ehf{eTK>fq)y4K4P|~(ZKzXni#Yf2plyw5Bc#ZY);_F^>D}ZG?}!6Kh6q629Nj# zCcUV`!0=K)p#*rE*pKD!*YqD2>ZcCB$-qbL`=#uINc3XWHfaI?m>d-m0^8FwEbDsV z*v74WU1~Plx8TB^Y!<$FJBvZyK(M^g+I_{Iaw&-jdmQN~5`7SPus_S%dDoie8KSxm zlLB#bK1O{7FlNA2YOTdS7w@+x);9qjAb{lJnPP0hf+`i-hXEa(}(%j_b!X5YBU)QI- zzHOgdc=}eB^PkIhx;j2xOiK5nRl5X$4t}MZ)%0OCJ(W(1o5f>JI%KEFVt=)sQWq@x z`=_bN1d~tf7lZsEfdIFu?zlZA4jz!xAl&_h^f%BDk6e8Qfg!*I+k~429adcV#^%88 z4TL8vyW#jF-9c>(Q{5|%E4E9KI4uYEkTo_(4lI13(wa_Mhnc+F5PsW}_$Eg@%4Y+> z0AkQlHg|rbq1!izc?MpoycX^RD{TJtwO`a9^HSMt^2wdVG#L!CY$dB`?Rv=kZF!NX zqrLVR7Z6xfwH4|SteF$)s`ZU>iX>o?ooy2zVmW)Lo~?fzy#Iy2Nx@`lx_BePY(Wf) zWO2FLYUovaCL11wVDYbURo=q>FBqKLBDeZd@XYL`m>sy z6aecCaO)4&+RIDfDWqE}_f^_KkFC>J|C!hrgD=cMAu(7D>x$!7js_N{%bh=Hdp*6Z zTTY?;{#;-V4ABhYv932%Px@(b}K42gHNP{B=aUk}j1_c!%6lTIJ%7<(; z*&@?InFyYo#kUFoZ~zIAb!+8JRSAiM(TcnanC;uOZ89u1d@e+OUorIE*eMb{c}pHB z=?L~x+k^=Awz?%LY?PEq?V0{iek^_E086RnOr98Y4nmN%EC(Z|BQJAFH4QeIYB(QX zoSHJ$Xc(%0qo`tmdlo(w2vYvxvi184;blzWjL?wcCj`Q(js zX+n_6(^EHVWp%Ha!bqdIa zS9cDTz)IkiSr17HQnPTX@JNc~WN_4r9U8VZ*70$3E2k4gqHkvm0L%+uTs%~5s$oNZ zF25(s>gOqm8){)AfH9>Zl-QVo48j)W1u3CVNMB@}>N&ht54ZpHB`fef{K{FxhI?~m z3zu4yl<Y)P9bjp{J2a~DS2hFZR*lZQPG*3A>O3$5s|2M z@muQpX{sm?zysiTpUJ#d`OMNo#rV!#?=PZxQSi@g#a}YZ zCws-9q4kebT}p50>&AqnKv-Sg%l!s;dfXGoX7kN*im$OqMD4~F9EQ%4mG-)3>~`@& zCwN4>VX9Jb0z8DVIGlQ0&VoVZW%2$@s-$0(0Y1Bs@d$wk$L@<(uMt)g;fn|h> zLE{iY(wHKc?~c5fRQa;7Jm?sa99TxlPfg{`1{RRiqoVU^A20M&ZFSVFK#M8$^r`ue*W9LrGbRokTpYK=Jdx)6biyz^klBjKF0}v> zJEQr+(p-CWubPgyBBN1B`zaNr8#Zkc-wxuf53il+{QKw#gJLy@>~~@$h(WXP9!pb$ zh_}S$MC1&u!zNwJNd07++1jOGpiRI8(W>|gJJIc|@vZ$N+s%1P>)m{b-t}_*Ad4CX zQoKI!Q6FOim-lCg+*wrJVQ1D`MK7?pW>onc)1F**_po4?^D{e2Lpw!_$Ff zhP%7^JHkRtVFZ80Sv4q3kvaccRw%+xyM7#4o*7E;FZ$zpZB_F(r>~v>M0DZs$l6k= z^nIgI52TMoz(z^a+)6K%z_Nx@6L&f~SL#h8-aT7u3KxUs;634{gox=`VKJ|)YY_bk z4UpAT!-rIC6sgS0qE*#aNX*7~wN6U`3wGXs+uxDjVo80WR*D}%>r@jo$b z$U1FDla#2>?M0oU)v$do#4?$bL!NlPn`L<1$p1hmjMd#ExWidVS7{mP;ZNrgThH2g zdQA2bpPX?Z8YS=Un8_+UeK9Qz+j6t6!6za|lD2r1M8Bv*44<^r zMh3&X$uHscpI@T<_8Y9aZ90J6ssARF%IrB1~D3qk+g+5)0l8!g2N1Arw90K~tL^B;$bouB{! literal 0 HcmV?d00001 diff --git a/assets/snd_tomb.mp3 b/assets/snd_tomb.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9a25e13bfdf0c9de2b53958c0dad27a6dbc2b3ef GIT binary patch literal 1149 zcmezWTi^%-0}GG8hDb64!&W{mXSo7~-Me>RYf3PX;L%U!XJAqIUVYDai-1DAK?@T@ zLlXbzxh6{$4Bz$s^@=$*d(Q?PSq{hGr$;7hJ?)cWJy4;tcc!9dy760k4a2*?AMHPF za_V%QxmfrA-$F;28d*);Lu9@*a7=4?vm}jSfflQ=($Wc&p1oOaSzrwkEJ^I)Eke}|X z_n&AzP;d75!X+iY;y=(sEDfwn+;bM&oM>3g`pzVMiNMl_r(&k^eDO8qR7vRgGC%#! zZKqqU=U2#HQstRyYFNu9+y3T6#zDr742c{J9x`jw(ssE9wOF9u z^ZOjzXuEau|KH6}YtMGe0(pp;!8O4>ZTXTj4of-ThI|uwkS28IgI`!ug^O?ctVGKb zPU|&~?*7!S*`%?uqhQg2Vx?cQzv>uX@E^XJeD@(^YR=J#0goP@<<>RY9cHa`)P^g1 zXG^AYiF8uv@~|Hr-#bGK_}g=0KptXhWOhh>(xFYj$?{u839&C#QvrBf;w(PFsV*Z;7i zQ>)6pwXF^QvHddqe0QH@YP{)MA~pvcLk+AhrMWIMyc`yAY9C17FoS_sY&GBJY_}J5NI) z5sQiQUnbpn^Ivo66~jFfMCUW}Nvc?L+yC1iJwb^fbfz=|CuhGTtEbn(qE%|XmRr6y z6coE{T&H1>#GR{JU2VVp*VP6-#*!tv+6vQK7J)p(+UT;tKW-VzC58o@IU)yVaVT-j z4tl9r_*+TUj7RVPp=AdGE!ThN^NioPPUVZCykcn4!LG+!+Z!WiwTLAc^}U-@Iz#pI z3s;r0um!gsHVACkaQ@W^PNu_5*DO+2>@ zVIZ~k>-+@@51bCn6nnHT!tB|vR}VOjUtAUS`SDB70~aGwiat52^D`XP{Tx-k?WE^Q z|HCQSYYtz~@L}xoj(3t}t+A-i=an^N@}J+@wxrzJvLHK82jn5X2A2iyKI|LLFic?8 zOqsG|qQQ~PmfHw>f`9^3i6N$^N|!y4L6lz V3JeS;4ZtG8SkKZ@&p4Et006jx`o#bM literal 0 HcmV?d00001 diff --git a/assets/snd_trap.mp3 b/assets/snd_trap.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f09f612f039c9e12959872498fdc038f494bd970 GIT binary patch literal 783 zcmV+q1MvL+`!K`+00$t4P?R!&0UQ>A|e;sg&;rx0Rg}OAflZAAqd>( zJJ6LO2;ce6;sNmZybuHm90$YY0rdhO|G@)`K3qRU5cYc9hFU{J6hMh2q5uayzz)}d z;Lz;kQAY_KP{7zcQva+VFbERu?@bB?7=fNp(q;FYKmX=c%rTuXL)IUbUT)l^ryeR3 zk|>%fARy-d`!d7>fCq$WYn<_b5hWF?v<3_~>VAmIO(}-diWycGS0&C_s6uF9ytW+4 zbCjwn|Jh28G?=*;ZWn#B%p|Kt5Fd*kbLgE3c0JF^ZN068)+f zJZw;afzXD$|NAn;1b_$tvsqv;VZj(2>fpl-n|vNRlC6}z{ z44@k<1PTKwOJ#>GhyGm4-}cCdcC4{YEeTdDY?FOxC;qA&nW70yvJF971wm0Q!*Z}l z(bH-I6xXRplbGq5)`U|s;4;3@%F`)n+>ig|{c~uxoFY7opSR-2u&3jh%DgYSzi|<( zszd;m5dfs|F8}*7#07u|P_0j3Bw@h_3F>eL3^H&?N+Kc$L(XKwO6p0(SWvh{Y#ScR zML@JW2x|d4p_1lac3uydJp9FWI@hZ#$HL3014)^2o}nFXGLixi55Yk=BM{1xO(v`@ zm5TmmB?ep|fXLFwlF4aF2i!am1MTDWj4*+by|f89dj3oLP#gXq8lL* zUC|-V=~RmD5*3yGw$%Ba&hLDGzjMy-`+GdjALsqoKA+F?b$PyC&-d&7*@nlNuL1~` zuAHYg-X8#v{{R345US zAAkhGKv*V=0zyI&P=qN7zQG)XGKZR@%q+}NCLjbHZV7{1zz_&iGfT9Y8QKg1`nF_B4~;j6GFcHYGb<}A7#tyVB0!kNBr@2<1XD(g zp3udL4;&?i#G*yBX-o!4=#v=6jAdiMV8L_H7cNoJzc^>aKtJ(BrcIbjG~bU6f#ZFO<{QiMrbUHLS!>pzDy?lOJjYQu?%t;lgXxn zus%qTp`g(?Cdnf@#+MQm&14bjXkl-ma0{rJrP0@pC^#aUf&nAoX6B}Fgek(p*9?V5 zn4^)F#&9GW4*vyB5J-wlWD|cEk3^fHev4<4Y2k@~5KSPU@r)QYkwK#1aTu_GCX_}a zqfv+rICGS_B@S*0cSM+(Iapv3jyR+})*OqnGAR9r_f;?PkF@okKe!8_HcOS}*m8+FYI_;CrL7-0}L=#EE zeSiVS5aTH16@h(uMEjkJ{I9uuQie!%^mb#m&S@c`FD29ACuOKJ@fyvT~;(8{yBb-6 zvxV?Y#3;eY!p2fOnKT9)L?E&vDXf?;o9960~YdP z9ZuwS9Qbbk58qscf#w(O0lOvEik8_$M^2c~wd4|k)J+HDs2_ch^!b3N$KL!{r?cD; z^%PLnx=&SI*5wccy@$6&>xPH{!eMxQG<8WzB@}<4EUW;qPGjz!%EO!RXBFRd8HiV^4;eCfx^{Cc9KC(v(cJ08`e}Ia*7K^vP5LwR(YN_J_(#h>Ew%2Od~7oRxEl_V-i1Je83BQt7D z{nJf|>h%aKpDti8&@ZWgT9i=w@xf4BqK2%KLj+jd@3SyNXAU}$H9#gB^h zRRhC@yrA(YRTnTixD-_73(Bm@&Y|7Zy=-Xvx+d^633KnF$w?Iz?;o?=o0>je^RHYt zz9ot`!I<3`7^i*?1L>=rk>x@e-|iU6AHPl6_-J>=FsVUW>9#@tl+B?RrS3vL6pqv^ zi7-_{(}hdb+vLkmT}}#1t)of}nXC(QJ}(;#*s1>L0yA;f$-9ev^Ot<<20ZKhj(G8~ zI`GT7q%pT)Pfp18(b^MqC4iDahCa}X5enH3 z$&Kvxr@%M)b}sswuh$-0C;LQ!{5|L9&q35Ju9K(bSYwe0%7HakRQwSAg>FJVu>h&| ze79Ov8qth9)7q;i&hrBPN*dbUc?jd(Yol zmlz%a@^`{Rj!Ua99FVB3-YnU0?Yd!*e%`TQLsRX|npes*rMdOoZi~>1u4%BR=8hL@ zwx1e%s>A2=r`5_{sNvkuYgXCatPFUiaxBwnV{Kra%p7<;jL~wQXIMV`*l48gpyJ)#*QS_jP6AM%4Nvowt^xkM>(bxv{z37N)!wtI{00 z(kZ*T6w#71lXtLZj+{t39^?ufnEU=HcPf-@Wd*NmOnh7s-iFbg>OEq*ei)aB)7cjZ zSkS#+v{lM;QJV&?40bC`Fi3?PI;{g(U7X#mMFzbT+dUt@PNQk8p-sx(c<&WiuXscMbQjWGy^M71CTe24~Q6?qilf{vi9dJ$u zMH1a}>o?@(ilKwC1s(ajwgxO^X`G{58{+G&Yr7l0=ChIoWx8xH$1Lab-{u`M{{Hbx z?V1PbT3{DfTpOtf$C)?AStkA9OmiUT0p|$CVfUdxV65S7TannV-Ten{-D;kjTabz7 zH$*fPBAaG{08I%y(nQVb4zX*q0`IJAv$38?*&h_vI=S%Xq7MB(y*7${Y@(=Tp*WOMeDG$nB2@exp4**;f z70t~M*INZC=gLSsRw>^v(Be36-}d9Z_X_aB1Fn~*ZHCTGm~T*Th81jrMi!B_dP#QC zI|4u`hZoBJ;#8^Ivoh}z4kznD_+8#2T?)YlbRA%BZ}}ScOSIw-TBh#HvHV8peGx7C z3wCj;Mt^SZN722mYq<#GOh{h++qVumj(M&rbH$6rcVBKl)v{~prI1fNNBRUIX!0UQ z7gfByotr~{{fKv&8eANFA6GVp!RTDZ!e@E**#p)Gur|s+$jhmkJlUS~+_YiW6h3J1 zO_BEnKYc?b!(OM6;)A#L)rG?x9=Yr2P>i=2C*#-d)Y#liE$~DK7W;WCDtd`2mvZ-4 zj@I=`$UdRxYJ9IJf7T$Og))6Pg^xUCE(Wyf-=h0yGq}3@ySq)s!}oNx;#Jku&9XA_H>ehF8^tgnagLq}^-0$R&|9 z#5$vAJ!|Ols|dmBb@n@4uD%8Kb*z7(I;NC;>&>$(>nPvk1QnT&ZiJDbh>ny)y&*SC z9qOoSO%+$!-9U(Noc7v}dv3Y4hVBzh1yB({MMXblEp&oSu$6&r5^|<1T%vu}P{BuB zOq0yKcI%?%MJ<0Z2KVs$-HvmP4r}xel;ta_6}E(4ymTozOw_ku%(8+sxtx=Ak_&`X zJakkZ85F&3Ti4gWPYL_vxGMgVOx}?rdsLd_rH3c@^rg$x0$0#2As;SB8u^gWry5D5 zmOVaKu!ep;LMJue+SX~S(XqSdMtrGnXI#nTq=w>5ge1X;nGM^K-7#P z=qLveusi@MC}VVi%T**otB1PWg5#2w?H;7Lx@-xm%5~Jb!d!M99Ae4M=ab^@^l+*8 z!Q-LT`%7yv&1Xk0gk!Mu`ayYCwX3HAeBv>F`lsfc_a_PfCF1XaG!#Cxb4X&uMAtKP zeW>UC<^dq`5Jq*unmziSclh~LN&LiCALZqOrN%{lpwBl}qNjy?N&!-1=dpdVk;IVV zW3#<#bgxT$Iif~V`)$li4*AbtAbV}Xbd0p0#NAXWHe7E!GZA%n*e>SVHfP;_UQ)qB z7WtGrPfKG*m5<|14eBz%X5U=6#SVhYF*kll#no&28jf63l|!}F(`w00cNQV9lh^5< z8pYMRH09$?Tz9=wyKCG~Q(c@Xn~{;zUz)qhaA$UF*yj7hCqW<@J6aKXTs%BAX*EN> z!l^~h=Nc&vi?nzSKYG9orF>vU{or2jYqLzKr5=IJISb`4D*M@GjHKc%Cwrpr^y7VY1V#1gq zR^DP-_#M~Q)Qv*vAi(nPoIwS3TD;6J)6z8eyd_$Hw!PIWUC5`ABYp0yMLJ}VNG&$_ z&|6CPJ^bxiUHfnp0Lp~$b`5t)$2Pn%b|Wqq61w-TmRC2nqxwk?JUCN{d}x7cIkeeV zqZ7Qly!DuIZpgJMTP|$SpvaYGFg1c}*KCSb&;7Vyq^CV6>n5I++&MjBa#Qxji#HRH z+|>|2cD!|CeObZu59C_gYT%~f!c^|0lV)GuIDK3-6`TDqX;)(UH-^gtj5l74xPb>p z&*~+hV&%)5yG5lu*}KziwG^vl&x_PTb0+HjYi|yk0VLyvd|Ci9fgPyn>Otb>VoH0T z8a+HdKKTR}05~(_{o5TkP7#{d!7rdleDH+FD5;EN*=E2u|8{#;`MRF zQ%k=SW#2qdjt-Q=LQX){6FYyliAKtGX(jJBOWNRHulID6{@|YYZKVq@_t|I8E6rtI zc6ZWittodB4{1ZLb@7QI$X98~P}{QAdU6piL^_uQr?#1-zI4mFkf(EcmA_1=i}{k?^ao1cvG zXcNepwnL+1$H#e(KgQqPwTo}(#k=M54gix5yo^CcKQVJ+LYt>BM z6i{;M+-E5|MXh69cA##{?t&9}J-!8~?V~y;`FzI^!E3@-OYmp=-((5-oaaclcUU*t s3?{N<3|il)KKz^H_E*vn^0~;77&B9gXd?Fm0Qy}3fY@Jg^f$5jFH+oV^#A|> literal 0 HcmV?d00001 diff --git a/assets/snd_water.mp3 b/assets/snd_water.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1e2310af85203802e07361968fa5775697fa36d1 GIT binary patch literal 6176 zcmeHLdr%X19^U{;h*}^@LDbF?;6#*U^TK3JRFaUAN)$q{fQRRjEMbA{<~9oiPp&~w zQGD@GskT;>Y7tveaeVX-nG^AWQoZx6y*pdav5MNOZLiu|w7J~`P%J&+PG{N~elwZb z$LII`em|e@V>heQh`j-Ng}-b}k2lZ0;?LPy|6T0W@78644RELLn>^fjx^ilLIP9b2eT#l>UZL z4ML$x-p`h5A6ieBlo_Fr0r7HJB=MB?V?1HTvWo|a*6U#%Zl@63gz7X(9!-;vVP;sS z6-mWHNUPDxwDBULP^M7}wQ@+UQfZ)ANG9xcMsKJ27Fg*d^=>y0ZTmbDqgxNjAJB~E z8Bs8m4JzoM={OQFJDr?j_a#rcr=Y+0oOw?3F?XGVpt}fR#KiQ0l4nN>QL~#5ZOd~D z8%U97#nR7sQ4UI*ek!+5<*Lt}oyew&5E6~E&@%q-mDOj@l!M?Fl%8UO83JY=F~!3Z zJVzgg*DN@8?}Xi38A z&Z~R=!UML*pz6Z2-#pON7*vaS_7nfl*zoiM!%w4!jU@dFV1Ht4s1VD5z2bpW416wP zrAN2A08Jt=oC5U-nTL}0-XZb?ka?CVdD_JJz1aSkY?3x)a6bpKMN$bQjD_5*f0B9w zawn-@#GWKR@mQw=_gtf27w9(?LEo!N4tiIPd| zwy=p}NytpBt(<$Ll0s;ar9f2Vl2_6E`Bv&Tq^4OWIbi z-zJ(i8+y&(c|z~Kx<0rWv*T$9RJZ%j=VY1-$DQ-uJ@Kh(3p-tXtX5VwuD)|}uG#P6 zSyg=_cW$hC8F+Q;*ioITvTLdT_$}C6YfM`lpmZEq^E=j+Mz*)?OnFD>osgVMvJ1P; zwk-H=a}(j3`$KDPU4@a$Ws$_U+tWEKO;^oa$F&o+wzZ{zc@$W7*NnFuxwkJ94?4F0 z|UEPaCcV1b(?fnlP9t(!2jj)$t(59V62;krgRxx}coop}?W%xWS-=k<*T^l#* zMB8Dnn850`*Glsh2UtljjbY8>RUgWzjyFf79mXD%ZTh|?^EVSNNK^KI61w}qd1Gn^ z;1n;|Y+jxo28XfV_E{O%>X@dQ?A)`krn%&d!dUr5D7L{nVP~r>x4zTbl&|UMGB0v6j_-0c zBxeKHc6FwvlzNpd-1O!B+=OMbPo=j`x?M1B5YnmLtFhToF=Mv z^);`;yoAhk4UrYuYA`T4genQ1vQQqR+Y#ghYPd)C-bruy?C6)<_(uc*oUv(#Pred3 zpW`)pvDG$a+XG9KWLd(M`nP@mmik3yDF^(pdUL4%K^5`RsR~u4Ph-f$q+ocYE^d+k z(!kPf+qGF6GTv9uaMgX(yF!)*3OcpNg}oEMd(!2MrK3i+S|*3b@0@?GBy0Qft%~{4(a}*Y(f5U0 zH0Koc(=BgGB>MKZ)^|n>#6J=8_6Xdmg@wsy2` zlH&jt9C__}ZPg#%X#RTD(%R_1*Q8t;Gr@E*dK`wW$j-y7)BUUdvSVlD#*M}g63<38 zOAWUke&i}7?PoiTdsgI5+W$Fstk+6;qA@OeuP8dDZeK9FQu@6}$ne1dPSURU8{iyd z%DN~;O;AL3)aTo|8I^Npc53xoc4W1U&2h%Dvg+BP>ze~=erR?5biL@YHE8<`pAx{Y pt8vE7x~4@k){f-z3i|W%uXZtfnw(yXSbUlS2mq0-0Pt((^B)ILuC@RG literal 0 HcmV?d00001 diff --git a/assets/snd_zap.mp3 b/assets/snd_zap.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..3c4e3dd49aa6788ab983a78b172697bac3ae9f02 GIT binary patch literal 7842 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 fv9W{Up literal 0 HcmV?d00001 diff --git a/assets/specks.png b/assets/specks.png new file mode 100644 index 0000000000000000000000000000000000000000..1363636d9908dd0cce0a3bbdf90c2202dd92e3b7 GIT binary patch literal 868 zcmV-q1DpJbP)(?e6V4Hpr%ckw$kjyI$|kdow$Sj4=>`C|`05m}y=p9n!Ar+>F6mGtDw!{Xjcn z2>Cd+Ak7_3+QTu!(&|mIH>9!34P+nRz}eXs>;IyMkF~M8+tyQU@#DNf(`L} za6S}sXa|TzJW$0*`N+n~jWlWKc&6CxkoMp&$)y?Q<{A_m)pz$U5`mJ zc+ar0v0{xyY$#OVdR~B^rl|#*whO?m_w2`YW`G}1N@S#MgA6-{_T|$8e|UBclv-q% z8v!aLft%*x8H@?ham=Kuvd_m z6=3Qh5Y-u1ct_+S%@ZCl3~f?!n@BKKR#G{PyB&xfch7mgkk2P-!qqF^p;7+|joV8L zxdLh&Xaj6;ZBG_saYpg3q7+KID}e_Ed>91i{NA_b#K1;Tq=}%^^t+yImr@{{zbQxWtvaQW^g!1@-z%AJMv0O;IJ`XIbHQl$}=TPU*M z(|U)iO;6l6^RF5_5{VXChHNdVnE zx?cdi^s8yFqYp*5&qXy;P1Fr&{H*Uigd_m-G@ZErGVz_y`U0000pJNB zes~YV5TYoeHs6kv7LKS3KgXOR9azQSCYFyXxE_$2&MVRHBMHhT8%v;GVO#9TN@I=& z=SUbEjW;y1xe;mVG;7B;LFzokbQX9-P#ju!->Ch}+;_z6=GgejWZ1 ZU;y(Jqlt(n_fr4>002ovPDHLkV1l|I>+}Es literal 0 HcmV?d00001 diff --git a/assets/spinner.png b/assets/spinner.png new file mode 100644 index 0000000000000000000000000000000000000000..2605e497fb2291afa3ea3e9a1426fb7930171494 GIT binary patch literal 4912 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 literal 0 HcmV?d00001 diff --git a/assets/status_pane.png b/assets/status_pane.png new file mode 100644 index 0000000000000000000000000000000000000000..8751f12d4b7437f2349697e70812204143cc8ceb GIT binary patch literal 3709 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 Hwh{jWh*9W# literal 0 HcmV?d00001 diff --git a/assets/succubus.png b/assets/succubus.png new file mode 100644 index 0000000000000000000000000000000000000000..fc577df8cfb18fb6e995d96eebb94c31680a8c1b GIT binary patch literal 1633 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 z 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%0D)a*1or>ct7FDr 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

    !!4a(*sb7J@wJ5<;W5d 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 C+di;E-s&chVv;5l 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%0DOD1FZu`wF96?$@#c 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

    HY(KfV(eZG3-aY%VUj<4aELbG~7!CUl6~ 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

    ZhUbZ4=f^V?0>30t67$`H6N=qa&K>o-tp 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 literal 0 HcmV?d00001 diff --git a/assets/surface.png b/assets/surface.png new file mode 100644 index 0000000000000000000000000000000000000000..75f9a644a9c7f67a4bbfb2157348923e75cdbdc2 GIT binary patch literal 6317 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 literal 0 HcmV?d00001 diff --git a/assets/theme.mp3 b/assets/theme.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..acb7c7a62e20a26fe2f91b73c06d8447b0019a3c GIT binary patch literal 718033 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⋘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

    DtajYrB8-DZ(-NX@v$R& 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�R0PIFx2R`Tk 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%0DrCe`7M)3MHzrI0KP{hYoNbs)z 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 z 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 rr>p literal 0 HcmV?d00001 diff --git a/assets/thief.png b/assets/thief.png new file mode 100644 index 0000000000000000000000000000000000000000..ecdb0b3c7b24ecaf29d6e90a3d0ddd7abfb272cc GIT binary patch literal 5334 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 Ca}B)! literal 0 HcmV?d00001 diff --git a/assets/tiles0.png b/assets/tiles0.png new file mode 100644 index 0000000000000000000000000000000000000000..cc42fdfddc4d8386917f7a468a76c1a12f10b880 GIT binary patch literal 16574 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 literal 0 HcmV?d00001 diff --git a/assets/tiles1.png b/assets/tiles1.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf5af50b519494b0c3f91d9e61579c47e3cbc36 GIT binary patch literal 17790 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 W!Z5y1Lkq{OMDe0Cj0g;rD-UXy% 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 literal 0 HcmV?d00001 diff --git a/assets/tiles4.png b/assets/tiles4.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6e63fc82ad74197e2ffa7cbb894be2a56b76bf GIT binary patch literal 13947 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 Vi43fdB(wkk002ovPDHLkV1oJ?o+tnS literal 0 HcmV?d00001 diff --git a/assets/toolbar.png b/assets/toolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..89fe80800d1772073b19f0dbefa00675b3285611 GIT binary patch literal 3796 zcmV;_4lD7AP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000C3NklHqwEU3epS%moJqmzN96&X>Uh{K?JTZ-E~{u?CzdhH~0MD*xhrx z-|cyRzvp@W|370wp%5q%7X~^6)BqIJ02I^!6x09|)BqF-1_ppRQ92t6g#tpy8HQB9 z1L9PgAa6{@!&p&yX_OSrYIb}RJC$1u!N0097IQvE)#_bAT^hGEPk$5V?j5c2|H zjG_zG7z>QUX1D5=ulUgZ(HqzAEUl=#G)j{5x3NHyH*ySGnw}BkG?`N|78nNr80jt; zKQNh7iSXF$R>1%?2uyI$6(C0FeB1~C$jHk1tBr^F9!&!i$PgJ>Ir#P?geQ$Y{jC6R z28P3~(`*(+FDfc@VzA%;X8^jttNP({+Mi=^;H~6+%bs1T2j}&~Vys^9Q5DD6!AAf9 z>oTL{^~0y{001c_GoCd1ur(+5{~Lf8-sN(IwX-ZM+XzL4PL!2bhqdKpTU42V7r&R| z!rE6RClehYuRnXu`MGQq{Mf*T!Q!o1qH%A zzCChfkixmr3n(kEhQr~&jcd2za5%8UoQj4A!ze0rD*oZU9EVWhK=3^gKCQ$SW2o)Qkdso6gh z{&f|2@yaWlM~c68O+JxM%xQm);i_5;SJkT8?_WVh@UOM?RKNIv{d#B zYCO%z%eJ85LHKHM{Mc@IZk_;;M65GvwuNY-iy?O#5W||e14I70_$vg}*Vn7ddAq+O zFZ)l{kZ#Y!nUYgjvD}2LTn9Qv)R};v@fH;vGYLC2$te>5p68)(-hZ_L_LL-j8z9YQ z0n4&8#sMtL%1Q;rDPL!IGdAY#M4RtE;A>ZH0<8kVsYwoo`N@jKU$k%@oZB`F*N-~K zu{|Tao`0pn8$U4sX>82hiN29BJodF?{qmo>43dv{N2SF0hJD*mZvEbE$`_}*|XWW~FR3RDw0000< KMNUMnLSTYB;twDI literal 0 HcmV?d00001 diff --git a/assets/undead.png b/assets/undead.png new file mode 100644 index 0000000000000000000000000000000000000000..ac066eeea2c40980cd101b0725607b68e16999e2 GIT binary patch literal 4358 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 ADgXcg literal 0 HcmV?d00001 diff --git a/assets/wandmaker.png b/assets/wandmaker.png new file mode 100644 index 0000000000000000000000000000000000000000..19e8fe3d675e4c2cad007ce8f64c47bb2719a6d3 GIT binary patch literal 855 zcmV-d1E~CoP)86pB56GDM zI16txI-q&4*Q=Pb;$l($RbN2C75YK`!>o`fg2W6!~_3a~Nr1q_bcoIjn~pJTQTm;}IZR+S4t#bP!WOiO-j=Ku`9 zPJwpp1#alNL9f?y8=kzwRS+<7-EJL1nV=C$GMNO6#R9Y6YhZP0fhQ!38pLnzzsvcd z4&#lQ!)Hy+V<9Ot=o#n_lLKpz#3-~D5qgag z(vU=mu}x!AlS>YbXHz+_*3z!?&fRQhXFu+C?=G#}JTUC;yU*;+9Q!=;zH|SqguWH7>R&m*6lTC#+kU}^dR>1^L<97E_VicPt^2x_BDvFYEJY64!~U1<;GPB1@yz|1$tdlQUXLk^oX~4 z5%B!xPd|dYy(L<_qxLx%TE3#NmzE(KJ*x)&K6ve^4dB_?3c-h;pz+huGw^El%ZBHR zeD)b5lcVrK)B9QT-OQJnj9DMTS42JlgwKe8MDT*k1hK?2tiAabnEx$$UGUw` z_kq&;Ec=`}J4+SX-yWu7U09f-1`}$0Ofw5K0Xx)IRf1?3eJ2MkHzZS;fhscwiL4C3 zt>6xPGYGq%snOlT)mG$x*wY2?HNHd7nSkt&PyWcyBPx!ajx~e%iu|%WOHFxIj|U+# zGUUo&5N-^E?GH#uWMu%^2o6m^6AMX&aV5l6Q0&9R<0&eppMmK6wjb`=un~oWJL9@l zD_?vzcE&fG?+Y#UmVB%42*uClo$ri<8cx+Vh{w-EEEdc7R}TpZQv=9WaI73a1HhFK zT7dG|Mqo-9v@?pSt$ROsj#R?b;-BDcoYnQoH=l^xFm`^v#K6+>nenmx0{VTlhqdo! z?vE%f7cwpnZWPew}XF^587b= z)zykzPj$~g1cnR)%NO5j>BFOCjsB^5IP zmSy#Rb=cN07A`0dKV)ArL?Xk3f6fJj_gftv<5CohWh zCV(%w*x4zc^+6ODt)s_t7hasp zb8|6Y2F!q{$fuLnPv2h&Lo*Th`^q_b{pj19$f|C9CYA>tk|l_+;$wDzf5e*F`;Qho zHa%d>R`9mouzPz`_=C$0wK%g02-Ru!jw1PTyWrX*|8 zmaDB~yHzR*hKr=tly8AkP5p+6)EwACxWDMf)CqKDGpxd^Fkg%_K8li$nE^`$Cg4oK z`1tDsW(k>a;bM?v3#6Po@rHc!B`D;^kAy@4<39lg01eKf6uQd_lK=n!07*qoM6N<$ Eg3!Udng9R* literal 0 HcmV?d00001 diff --git a/assets/warrior.png b/assets/warrior.png new file mode 100644 index 0000000000000000000000000000000000000000..a98ee5d3d96fe95399761e89ed97cef240d54521 GIT binary patch literal 15006 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 D)C%5^ literal 0 HcmV?d00001 diff --git a/assets/water0.png b/assets/water0.png new file mode 100644 index 0000000000000000000000000000000000000000..2f421efba8acd68234fef2220f27eb4dc41b1e2f GIT binary patch literal 667 zcmV;M0%ZM(P)IE0QGvvi5fgXpY(I#iXtV3Jy`HhXXAe)0+ue2*o@qUCVDtH*B*nDLoNl|GUf(8zLXK7ja1=m)RlQnUM-oSd}i=ax9I?9ytpko6HR z>#J?C=nW+`Pd?TvI+@%~YAkhic9Ac_rv2a3va8QD1xeJ0OYP;-_}4haW5z@@ok7mp z1zJfDPDYwpDyY=Y{lLm(=QMeMFB2uQSUK63{Scl?Rlj&yFD=Wu)Y%Cr zpHoLcn_DI?Jf@#~002ovPDHLkV1gfN BFN**G literal 0 HcmV?d00001 diff --git a/assets/water1.png b/assets/water1.png new file mode 100644 index 0000000000000000000000000000000000000000..95d61515eeaf48ce76b3ba1183778d3c37d1ae5e GIT binary patch literal 604 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 AQUCw| literal 0 HcmV?d00001 diff --git a/assets/water3.png b/assets/water3.png new file mode 100644 index 0000000000000000000000000000000000000000..e1646eba58f2146e4f7851d608df227ed7f7b089 GIT binary patch literal 614 zcmV-s0-61ZP)%Na^MCaydN5_x*T?#%uZ6=I8S`3^JMKc{y^u z9+DxF@?VW2*w7j&st2@d&v;~fY)!)e+qG}s54dl%Z@cq6wE{H+1US%5_(E_x075&R zlY>=0G>()uAo!7?5AAS8{wrpb&XCF6Cq5=^F+_$T8XS{hSvQm;J7i1bp+U42%w$R9 z9y)8R#<<;&%TLTdWaLQo36xcXoAEtEhKpb=B#UuMR3nZsD;@3L7{m&fzNX1Q92T}; zTwzJ%SDM02R)5+vM63-$OR^E@fQqS$EM%hhF^-*Rc!ZPMp#-h!G)R<)BgD!dFJ7Gw zpR~(3x^$N|+#tyf8uQJ_F+;x8vl?C_K#6s1=-_mNqF#8A@uJ2BHJtXeInV}{^qjRO zu9tq20WP9s-_=2DeBR%-Ud{E=*Um1&Mw0bim`5YpaP#-U&eVmskk`{d6t-XTN2gZ< zW%@3I#$<`0Q!MK|x)Q?sIg}}XVnQ_gbTC&ejWs#QxE%IpeSdVW>#7Nmb@uT66TS+J zuOb}O0f_&PCq=keHdbh_pIkPe`8+4T! z41zSqJK{7z_t1VkqV*j{=v}z(4j3IVWiyRCEbIAUD&M-!fR1G{*ROD<&}_CGc?%|9 z^^uLXHgFxEU;FRhZ-pMA?+%bPp}2%_u}sRIz(1fh<9Q}NhkV@hJ^PfyTAfSFjnItY zQ@5A{N`$cQAQ7nUoryWKN4#;yFKP+PD+g~Mb??54^7B?woL&_eXRJCf=*+=%S-x5n zD6oCd!hr3k*kr$QK&F~#bJaQC$`jF^mod6(h6Wv{z{a|Hvl*JW*% zut;q$GNDbe%FW=yl4p_&-}WMHrFoeam8Y7kFvXfWPreuqcmRD5kT#*vhWRw6EqGdF zw)ss*i-#0OW2C!V>UA_jvJ60x1eu1S%Zdxy2DErV!$l#D6u=>>k6>CcW^s+cRxjcI5cXi;y z@;xe~mJ=MAoO&E&Sq)1;kI!MF=FVDm;O{1|;|`NSQ|#BwDdY0Y4n|VS=5>eAUDM1sDLedsxlb SoL3$I0000sq$D(K`wNmx*$))C+I*Z~#sP}* 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 RkWT;r002ovPDHLkV1mdx?uGyW literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_launcher.png b/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..747b8f4184ffec11383be44f16827a26999f6865 GIT binary patch literal 1949 zcmV;O2V(e%P)ZF@`c z)!jo%bJ-2kJKZ&BpRe|MVy9fe+RKv(PWb$_*RMqp8jg2p zPu_>d+^%uI_Jl#8#L?q# z`Z@Q#_h~+vOw`uaR+|C*!oos|UxFPJC`-|jAl@`dts#}SSnOs90C=qF(Gaq<3OJHe zNIOvu24Z4E6KfQ}&)5?(0UrCNIdBDRi;IgHz;g}&{L<1=e(>Ny@_p`{Dti6CsBQeE zSxQ#3f+BX2tQ>FN>FnVP5Fo)8tJ<}`~SJy6yoY;!J8ev;r{;t3;<$%h{vP>xt5Js67 z2+eH5L5NIbuzvK5zg-SsKCA`L8SqgKNX?7ztQwDbF4joeUklmU(|MMe(dSi+4Ol4$ zT3}Bs3ndtKDGw|Ls~B2z)|_@TPNZdtWJ;K$(8La&$j>kbbKN>4PDT~Ou}~72Elov? z&EW<1Z0@GX0(O@00wVfEvSoQ535#1U=@Zg0i!qMoWQGS+gkR3zN?1Ns7{-ylR5M?z z4t*MLm{?5!BsC-Bb7R?=MsS|OT#P0&b;c2u7QT35;2AIgON`Co1@>$_9=D^>sNLM$ zY(&Jz%-0m7yjZI#FGz27vL=NEMn=iT;jx1POt+a~EO>(JfCZ+zRheW$HZY`wCB_D< zzzponr;d`u#t;jYgs-8BJy60I*h?qZD4ny~Y_N!ZsWZtM&Euh6@>K(>k|6h&v{< zId2N4a2|-jgPQ@QAmA9K2ug$`)^QTC^|1zFQS`H^j@7X(*`1Yu!5|ymSqqwtuwB1? zy#jb(_Z1ECL~4XMBM-P3MBx#(FM;d9%>dmSEYKM6`5>u8fiQvs@oR<-uO7S>IYomN z(B?VknX>r?JK_&1VT`94LyT>0ZLRUG1jUj`2BM^kU%wR;s2=pK@A!{3lYHRsJ`$Wl zBUR%0FV9-ePdd!gWf7yr$#;*~zDV1wRUGSQj-3$A)|idPVQYbN<7b=67~72-gW5N9 zI6-TQc3P{TB^C$Q>d^OCzK0iLZk`6cU7xSFf1|bgPS*kvnn$)it^+n0-M7=w!p5SG zGu@T?J-80_c5Y^g6lxL&3#b6?^2eFTGb29g8#vahBBgkxc znOuw5EeLE$)*q0Y7x-<-h6CyF%lD^!-!Bw}0ETX(kkL#AxCd)K_QcaBt|>XMY;H1X zpv^$*f}yNZ0gj5!lkiG8>pj)Cx6!prY7Eo~pM{9m>Mx@JfiuG@phJaX5Il#%Q^Noa zcd1OJ7PM+x(Z$jAWQ=vkR)Up?LW-+mV+4XuL-~}Vo!l^>BL(1g9Vy^Lh7}uIix*z})r6h(n2y5kwiTF8NqEA%76PE+D`msLaDF=(8U-jMHr5+1M6oq_ zP93~p3X{zZFpLYYTL3?&0^06nij7NfZQBD^aoc*`-fM{^lr2tbDvsT9qd?T4!TLf+ zNjv{%qbUV0UYh*@l06{tH37+u;?jyEUIAbj870Yzb%i&%X%=y>#@d5Z9_){o)D-jG z)|a`Roj_uxd$F>dEtT(5O`)j*Bei#M~T*mk|HeSMMnW zjy@XB&%S+V*Eh5iujp+n>=&=@F8IQ^@SW%USBG|;A6W4p`Z|5Hh5w&_XSjPlukUoM za_6~o7~IJ*Yk&WB`fm2Xy%9pQT)7)l&3{bpT@T#7AvCLS?0aBeftwoT{eP+7SKy99 jXs`col|Ao)zXccoYeC%2cSA3A00000NkvXXu0mjf#rUAF literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_launcher.png b/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ecd7e583300aed46a188ad06375b1f056761641e GIT binary patch literal 7128 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 literal 0 HcmV?d00001 diff --git a/res/values-v11/styles.xml b/res/values-v11/styles.xml new file mode 100644 index 0000000000..3c02242ad0 --- /dev/null +++ b/res/values-v11/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/res/values-v14/styles.xml b/res/values-v14/styles.xml new file mode 100644 index 0000000000..a91fd0372b --- /dev/null +++ b/res/values-v14/styles.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml new file mode 100644 index 0000000000..632a9f6ee9 --- /dev/null +++ b/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + Pixel Dungeon + + \ No newline at end of file diff --git a/res/values/styles.xml b/res/values/styles.xml new file mode 100644 index 0000000000..6ce89c7ba4 --- /dev/null +++ b/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/src/com/watabou/pixeldungeon/Assets.java b/src/com/watabou/pixeldungeon/Assets.java new file mode 100644 index 0000000000..a940c77265 --- /dev/null +++ b/src/com/watabou/pixeldungeon/Assets.java @@ -0,0 +1,159 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +public class Assets { + + public static final String ARCS_BG = "arcs1.png"; + public static final String ARCS_FG = "arcs2.png"; + public static final String DASHBOARD = "dashboard.png"; + + public static final String BANNERS = "banners.png"; + public static final String BADGES = "badges.png"; + public static final String AMULET = "amulet.png"; + + public static final String CHROME = "chrome.png"; + public static final String ICONS = "icons.png"; + public static final String STATUS = "status_pane.png"; + public static final String HP_BAR = "hp_bar.png"; + public static final String XP_BAR = "exp_bar.png"; + public static final String TOOLBAR = "toolbar.png"; + + public static final String WARRIOR = "warrior.png"; + public static final String MAGE = "mage.png"; + public static final String ROGUE = "rogue.png"; + public static final String HUNTRESS = "ranger.png"; + public static final String AVATARS = "avatars.png"; + + public static final String SURFACE = "surface.png"; + + public static final String FIREBALL = "fireball.png"; + public static final String SPECKS = "specks.png"; + public static final String EFFECTS = "effects.png"; + + public static final String RAT = "rat.png"; + public static final String GNOLL = "gnoll.png"; + public static final String CRAB = "crab.png"; + public static final String GOO = "goo.png"; + public static final String SWARM = "swarm.png"; + public static final String SKELETON = "skeleton.png"; + public static final String SHAMAN = "shaman.png"; + public static final String THIEF = "thief.png"; + public static final String TENGU = "tengu.png"; + public static final String SHEEP = "sheep.png"; + public static final String KEEPER = "shopkeeper.png"; + public static final String BAT = "bat.png"; + public static final String BRUTE = "brute.png"; + public static final String SPINNER = "spinner.png"; + public static final String DM300 = "dm300.png"; + public static final String WRAITH = "wraith.png"; + public static final String ELEMENTAL= "elemental.png"; + public static final String MONK = "monk.png"; + public static final String WARLOCK = "warlock.png"; + public static final String GOLEM = "golem.png"; + public static final String UNDEAD = "undead.png"; + public static final String KING = "king.png"; + public static final String STATUE = "statue.png"; + public static final String PIRANHA = "piranha.png"; + public static final String EYE = "eye.png"; + public static final String SUCCUBUS = "succubus.png"; + public static final String SCORPIO = "scorpio.png"; + public static final String ROTTING = "rotting_fist.png"; + public static final String BURNING = "burning_fist.png"; + public static final String YOG = "yog.png"; + public static final String LARVA = "larva.png"; + public static final String GHOST = "ghost.png"; + public static final String MAKER = "wandmaker.png"; + public static final String TROLL = "blacksmith.png"; + public static final String IMP = "demon.png"; + public static final String RATKING = "ratking.png"; + + public static final String ITEMS = "items.png"; + public static final String PLANTS = "plants.png"; + + public static final String TILES_SEWERS = "tiles0.png"; + public static final String TILES_PRISON = "tiles1.png"; + public static final String TILES_CAVES = "tiles2.png"; + public static final String TILES_CITY = "tiles3.png"; + public static final String TILES_HALLS = "tiles4.png"; + + public static final String WATER_SEWERS = "water0.png"; + public static final String WATER_PRISON = "water1.png"; + public static final String WATER_CAVES = "water2.png"; + public static final String WATER_CITY = "water3.png"; + public static final String WATER_HALLS = "water4.png"; + + public static final String BUFFS_SMALL = "buffs.png"; + public static final String BUFFS_LARGE = "large_buffs.png"; + public static final String SPELL_ICONS = "spell_icons.png"; + + public static final String FONTS1X = "font1x.png"; + public static final String FONTS15X = "font15x.png"; + public static final String FONTS2X = "font2x.png"; + public static final String FONTS25X = "font25x.png"; + public static final String FONTS3X = "font3x.png"; + + public static final String THEME = "theme.mp3"; + public static final String TUNE = "game.mp3"; + public static final String HAPPY = "surface.mp3"; + + public static final String SND_CLICK = "snd_click.mp3"; + public static final String SND_BADGE = "snd_badge.mp3"; + public static final String SND_GOLD = "snd_gold.mp3"; + + public static final String SND_OPEN = "snd_door_open.mp3"; + public static final String SND_UNLOCK = "snd_unlock.mp3"; + public static final String SND_ITEM = "snd_item.mp3"; + public static final String SND_DEWDROP = "snd_dewdrop.mp3"; + public static final String SND_HIT = "snd_hit.mp3"; + public static final String SND_MISS = "snd_miss.mp3"; + public static final String SND_STEP = "snd_step.mp3"; + public static final String SND_WATER = "snd_water.mp3"; + public static final String SND_DESCEND = "snd_descend.mp3"; + public static final String SND_EAT = "snd_eat.mp3"; + public static final String SND_READ = "snd_read.mp3"; + public static final String SND_LULLABY = "snd_lullaby.mp3"; + public static final String SND_DRINK = "snd_drink.mp3"; + public static final String SND_SHATTER = "snd_shatter.mp3"; + public static final String SND_ZAP = "snd_zap.mp3"; + public static final String SND_LIGHTNING= "snd_lightning.mp3"; + public static final String SND_LEVELUP = "snd_levelup.mp3"; + public static final String SND_DEATH = "snd_death.mp3"; + public static final String SND_CHALLENGE= "snd_challenge.mp3"; + public static final String SND_CURSED = "snd_cursed.mp3"; + public static final String SND_TRAP = "snd_trap.mp3"; + public static final String SND_EVOKE = "snd_evoke.mp3"; + public static final String SND_TOMB = "snd_tomb.mp3"; + public static final String SND_ALERT = "snd_alert.mp3"; + public static final String SND_MELD = "snd_meld.mp3"; + public static final String SND_BOSS = "snd_boss.mp3"; + public static final String SND_BLAST = "snd_blast.mp3"; + public static final String SND_PLANT = "snd_plant.mp3"; + public static final String SND_RAY = "snd_ray.mp3"; + public static final String SND_BEACON = "snd_beacon.mp3"; + public static final String SND_TELEPORT = "snd_teleport.mp3"; + public static final String SND_CHARMS = "snd_charms.mp3"; + public static final String SND_MASTERY = "snd_mastery.mp3"; + public static final String SND_PUFF = "snd_puff.mp3"; + public static final String SND_ROCKS = "snd_rocks.mp3"; + public static final String SND_BURNING = "snd_burning.mp3"; + public static final String SND_FALLING = "snd_falling.mp3"; + public static final String SND_GHOST = "snd_ghost.mp3"; + public static final String SND_SECRET = "snd_secret.mp3"; + public static final String SND_BONES = "snd_bones.mp3"; +} diff --git a/src/com/watabou/pixeldungeon/Badges.java b/src/com/watabou/pixeldungeon/Badges.java new file mode 100644 index 0000000000..1cb3ad9efb --- /dev/null +++ b/src/com/watabou/pixeldungeon/Badges.java @@ -0,0 +1,927 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; + +import com.watabou.noosa.Game; +import com.watabou.pixeldungeon.actors.mobs.Acidic; +import com.watabou.pixeldungeon.actors.mobs.Albino; +import com.watabou.pixeldungeon.actors.mobs.Bandit; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.actors.mobs.Senior; +import com.watabou.pixeldungeon.actors.mobs.Shielded; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.bags.ScrollHolder; +import com.watabou.pixeldungeon.items.bags.SeedPouch; +import com.watabou.pixeldungeon.items.bags.WandHolster; +import com.watabou.pixeldungeon.items.potions.Potion; +import com.watabou.pixeldungeon.items.rings.Ring; +import com.watabou.pixeldungeon.items.rings.RingOfHaggler; +import com.watabou.pixeldungeon.items.rings.RingOfThorns; +import com.watabou.pixeldungeon.items.scrolls.Scroll; +import com.watabou.pixeldungeon.items.wands.Wand; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Bundle; + +public class Badges { + + public static enum Badge { + MONSTERS_SLAIN_1( "10 enemies slain", 0 ), + MONSTERS_SLAIN_2( "50 enemies slain", 1 ), + MONSTERS_SLAIN_3( "150 enemies slain", 2 ), + MONSTERS_SLAIN_4( "250 enemies slain", 3 ), + GOLD_COLLECTED_1( "100 gold collected", 4 ), + GOLD_COLLECTED_2( "500 gold collected", 5 ), + GOLD_COLLECTED_3( "2500 gold collected", 6 ), + GOLD_COLLECTED_4( "7500 gold collected", 7 ), + LEVEL_REACHED_1( "Level 6 reached", 8 ), + LEVEL_REACHED_2( "Level 12 reached", 9 ), + LEVEL_REACHED_3( "Level 18 reached", 10 ), + LEVEL_REACHED_4( "Level 24 reached", 11 ), + ALL_POTIONS_IDENTIFIED( "All potions identified", 16 ), + ALL_SCROLLS_IDENTIFIED( "All scrolls identified", 17 ), + ALL_RINGS_IDENTIFIED( "All rings identified", 18 ), + ALL_WANDS_IDENTIFIED( "All wands identified", 19 ), + ALL_ITEMS_IDENTIFIED( "All potions, scrolls, rings & wands identified", 35, true ), + BAG_BOUGHT_SEED_POUCH, + BAG_BOUGHT_SCROLL_HOLDER, + BAG_BOUGHT_WAND_HOLSTER, + ALL_BAGS_BOUGHT( "All bags bought", 23 ), + DEATH_FROM_FIRE( "Death from fire", 24 ), + DEATH_FROM_POISON( "Death from poison", 25 ), + DEATH_FROM_GAS( "Death from toxic gas", 26 ), + DEATH_FROM_HUNGER( "Death from hunger", 27 ), + DEATH_FROM_GLYPH( "Death from a glyph", 57 ), + DEATH_FROM_FALLING( "Death from falling down", 59 ), + YASD( "Death from fire, poison, toxic gas & hunger", 34, true ), + BOSS_SLAIN_1_WARRIOR, + BOSS_SLAIN_1_MAGE, + BOSS_SLAIN_1_ROGUE, + BOSS_SLAIN_1_HUNTRESS, + BOSS_SLAIN_1( "1st boss slain", 12 ), + BOSS_SLAIN_2( "2nd boss slain", 13 ), + BOSS_SLAIN_3( "3rd boss slain", 14 ), + BOSS_SLAIN_4( "4th boss slain", 15 ), + BOSS_SLAIN_1_ALL_CLASSES( "1st boss slain by Warrior, Mage, Rogue & Huntress", 32, true ), + BOSS_SLAIN_3_GLADIATOR, + BOSS_SLAIN_3_BERSERKER, + BOSS_SLAIN_3_WARLOCK, + BOSS_SLAIN_3_BATTLEMAGE, + BOSS_SLAIN_3_FREERUNNER, + BOSS_SLAIN_3_ASSASSIN, + BOSS_SLAIN_3_SNIPER, + BOSS_SLAIN_3_WARDEN, + BOSS_SLAIN_3_ALL_SUBCLASSES( + "3rd boss slain by Gladiator, Berserker, Warlock, Battlemage, " + + "Freerunner, Assassin, Sniper & Warden", 33, true ), + RING_OF_HAGGLER( "Ring of Haggler obtained", 20 ), + RING_OF_THORNS( "Ring of Thorns obtained", 21 ), + STRENGTH_ATTAINED_1( "13 points of Strength attained", 40 ), + STRENGTH_ATTAINED_2( "15 points of Strength attained", 41 ), + STRENGTH_ATTAINED_3( "17 points of Strength attained", 42 ), + STRENGTH_ATTAINED_4( "19 points of Strength attained", 43 ), + FOOD_EATEN_1( "10 pieces of food eaten", 44 ), + FOOD_EATEN_2( "20 pieces of food eaten", 45 ), + FOOD_EATEN_3( "30 pieces of food eaten", 46 ), + FOOD_EATEN_4( "40 pieces of food eaten", 47 ), + MASTERY_WARRIOR, + MASTERY_MAGE, + MASTERY_ROGUE, + MASTERY_HUNTRESS, + ITEM_LEVEL_1( "Item of level 3 acquired", 48 ), + ITEM_LEVEL_2( "Item of level 6 acquired", 49 ), + ITEM_LEVEL_3( "Item of level 9 acquired", 50 ), + ITEM_LEVEL_4( "Item of level 12 acquired", 51 ), + RARE_ALBINO, + RARE_BANDIT, + RARE_SHIELDED, + RARE_SENIOR, + RARE_ACIDIC, + RARE( "All rare monsters slain", 37, true ), + VICTORY_WARRIOR, + VICTORY_MAGE, + VICTORY_ROGUE, + VICTORY_HUNTRESS, + VICTORY( "Amulet of Yendor obtained", 22 ), + VICTORY_ALL_CLASSES( "Amulet of Yendor obtained by Warrior, Mage, Rogue & Huntress", 36, true ), + MASTERY_COMBO( "7-hit combo", 56 ), + POTIONS_COOKED_1( "3 potions cooked", 52 ), + POTIONS_COOKED_2( "6 potions cooked", 53 ), + POTIONS_COOKED_3( "9 potions cooked", 54 ), + POTIONS_COOKED_4( "12 potions cooked", 55 ), + NO_MONSTERS_SLAIN( "Level completed without killing any monsters", 28 ), + GRIM_WEAPON( "Monster killed by a Grim weapon", 29 ), + PIRANHAS( "6 piranhas killed", 30 ), + NIGHT_HUNTER( "15 monsters killed at nighttime", 58 ), + GAMES_PLAYED_1( "10 games played", 60, true ), + GAMES_PLAYED_2( "100 games played", 61, true ), + GAMES_PLAYED_3( "500 games played", 62, true ), + GAMES_PLAYED_4( "2000 games played", 63, true ), + HAPPY_END( "Happy end", 38 ), + SUPPORTER( "Thanks for your support!", 31, true ); + + public boolean meta; + + public String description; + public int image; + + private Badge( String description, int image ) { + this( description, image, false ); + } + + private Badge( String description, int image, boolean meta ) { + this.description = description; + this.image = image; + this.meta = meta; + } + + private Badge() { + this( "", -1 ); + } + } + + private static HashSet global; + private static HashSet local = new HashSet(); + + private static boolean saveNeeded = false; + + public static void reset() { + local.clear(); + loadGlobal(); + } + + private static final String BADGES_FILE = "badges.dat"; + private static final String BADGES = "badges"; + + private static HashSet restore( Bundle bundle ) { + HashSet badges = new HashSet(); + + String[] names = bundle.getStringArray( BADGES ); + for (int i=0; i < names.length; i++) { + try { + badges.add( Badge.valueOf( names[i] ) ); + } catch (Exception e) { + } + } + + return badges; + } + + private static void store( Bundle bundle, HashSet badges ) { + int count = 0; + String names[] = new String[global.size()]; + + for (Badge badge:badges) { + names[count++] = badge.toString(); + } + bundle.put( BADGES, names ); + } + + public static void loadLocal( Bundle bundle ) { + local = restore( bundle ); + } + + public static void saveLocal( Bundle bundle ) { + store( bundle, local ); + } + + public static void loadGlobal() { + if (global == null) { + try { + InputStream input = Game.instance.openFileInput( BADGES_FILE ); + Bundle bundle = Bundle.read( input ); + input.close(); + + global = restore( bundle ); + + } catch (IOException e) { + global = new HashSet(); + } + } + } + + public static void saveGlobal() { + if (saveNeeded) { + + Bundle bundle = new Bundle(); + store( bundle, global ); + + try { + OutputStream output = Game.instance.openFileOutput( BADGES_FILE, Game.MODE_PRIVATE ); + Bundle.write( bundle, output ); + output.close(); + saveNeeded = false; + } catch (IOException e) { + + } + } + } + + public static void validateMonstersSlain() { + Badge badge = null; + + if (!local.contains( Badge.MONSTERS_SLAIN_1 ) && Statistics.enemiesSlain >= 10) { + badge = Badge.MONSTERS_SLAIN_1; + local.add( badge ); + } + if (!local.contains( Badge.MONSTERS_SLAIN_2 ) && Statistics.enemiesSlain >= 50) { + badge = Badge.MONSTERS_SLAIN_2; + local.add( badge ); + } + if (!local.contains( Badge.MONSTERS_SLAIN_3 ) && Statistics.enemiesSlain >= 150) { + badge = Badge.MONSTERS_SLAIN_3; + local.add( badge ); + } + if (!local.contains( Badge.MONSTERS_SLAIN_4 ) && Statistics.enemiesSlain >= 250) { + badge = Badge.MONSTERS_SLAIN_4; + local.add( badge ); + } + + displayBadge( badge ); + } + + public static void validateGoldCollected() { + Badge badge = null; + + if (!local.contains( Badge.GOLD_COLLECTED_1 ) && Statistics.goldCollected >= 100) { + badge = Badge.GOLD_COLLECTED_1; + local.add( badge ); + } + if (!local.contains( Badge.GOLD_COLLECTED_2 ) && Statistics.goldCollected >= 500) { + badge = Badge.GOLD_COLLECTED_2; + local.add( badge ); + } + if (!local.contains( Badge.GOLD_COLLECTED_3 ) && Statistics.goldCollected >= 2500) { + badge = Badge.GOLD_COLLECTED_3; + local.add( badge ); + } + if (!local.contains( Badge.GOLD_COLLECTED_4 ) && Statistics.goldCollected >= 7500) { + badge = Badge.GOLD_COLLECTED_4; + local.add( badge ); + } + + displayBadge( badge ); + } + + public static void validateLevelReached() { + Badge badge = null; + + if (!local.contains( Badge.LEVEL_REACHED_1 ) && Dungeon.hero.lvl >= 6) { + badge = Badge.LEVEL_REACHED_1; + local.add( badge ); + } + if (!local.contains( Badge.LEVEL_REACHED_2 ) && Dungeon.hero.lvl >= 12) { + badge = Badge.LEVEL_REACHED_2; + local.add( badge ); + } + if (!local.contains( Badge.LEVEL_REACHED_3 ) && Dungeon.hero.lvl >= 18) { + badge = Badge.LEVEL_REACHED_3; + local.add( badge ); + } + if (!local.contains( Badge.LEVEL_REACHED_4 ) && Dungeon.hero.lvl >= 24) { + badge = Badge.LEVEL_REACHED_4; + local.add( badge ); + } + + displayBadge( badge ); + } + + public static void validateStrengthAttained() { + Badge badge = null; + + if (!local.contains( Badge.STRENGTH_ATTAINED_1 ) && Dungeon.hero.STR >= 13) { + badge = Badge.STRENGTH_ATTAINED_1; + local.add( badge ); + } + if (!local.contains( Badge.STRENGTH_ATTAINED_2 ) && Dungeon.hero.STR >= 15) { + badge = Badge.STRENGTH_ATTAINED_2; + local.add( badge ); + } + if (!local.contains( Badge.STRENGTH_ATTAINED_3 ) && Dungeon.hero.STR >= 17) { + badge = Badge.STRENGTH_ATTAINED_3; + local.add( badge ); + } + if (!local.contains( Badge.STRENGTH_ATTAINED_4 ) && Dungeon.hero.STR >= 19) { + badge = Badge.STRENGTH_ATTAINED_4; + local.add( badge ); + } + + displayBadge( badge ); + } + + public static void validateFoodEaten() { + Badge badge = null; + + if (!local.contains( Badge.FOOD_EATEN_1 ) && Statistics.foodEaten >= 10) { + badge = Badge.FOOD_EATEN_1; + local.add( badge ); + } + if (!local.contains( Badge.FOOD_EATEN_2 ) && Statistics.foodEaten >= 20) { + badge = Badge.FOOD_EATEN_2; + local.add( badge ); + } + if (!local.contains( Badge.FOOD_EATEN_3 ) && Statistics.foodEaten >= 30) { + badge = Badge.FOOD_EATEN_3; + local.add( badge ); + } + if (!local.contains( Badge.FOOD_EATEN_4 ) && Statistics.foodEaten >= 40) { + badge = Badge.FOOD_EATEN_4; + local.add( badge ); + } + + displayBadge( badge ); + } + + public static void validatePotionsCooked() { + Badge badge = null; + + if (!local.contains( Badge.POTIONS_COOKED_1 ) && Statistics.potionsCooked >= 3) { + badge = Badge.POTIONS_COOKED_1; + local.add( badge ); + } + if (!local.contains( Badge.POTIONS_COOKED_2 ) && Statistics.potionsCooked >= 6) { + badge = Badge.POTIONS_COOKED_2; + local.add( badge ); + } + if (!local.contains( Badge.POTIONS_COOKED_3 ) && Statistics.potionsCooked >= 9) { + badge = Badge.POTIONS_COOKED_3; + local.add( badge ); + } + if (!local.contains( Badge.POTIONS_COOKED_4 ) && Statistics.potionsCooked >= 12) { + badge = Badge.POTIONS_COOKED_4; + local.add( badge ); + } + + displayBadge( badge ); + } + + public static void validatePiranhasKilled() { + Badge badge = null; + + if (!local.contains( Badge.PIRANHAS ) && Statistics.piranhasKilled >= 6) { + badge = Badge.PIRANHAS; + local.add( badge ); + } + + displayBadge( badge ); + } + + public static void validateItemLevelAquired( Item item ) { + + // This method should be called: + // 1) When an item is obtained (Item.collect) + // 2) When an item is upgraded (ScrollOfUpgrade, ScrollOfWeaponUpgrade, ShortSword, WandOfMagicMissile) + // 3) When an item is identified + if (!item.levelKnown) { + return; + } + + Badge badge = null; + + if (!local.contains( Badge.ITEM_LEVEL_1 ) && item.level >= 3) { + badge = Badge.ITEM_LEVEL_1; + local.add( badge ); + } + if (!local.contains( Badge.ITEM_LEVEL_2 ) && item.level >= 6) { + badge = Badge.ITEM_LEVEL_2; + local.add( badge ); + } + if (!local.contains( Badge.ITEM_LEVEL_3 ) && item.level >= 9) { + badge = Badge.ITEM_LEVEL_3; + local.add( badge ); + } + if (!local.contains( Badge.ITEM_LEVEL_4 ) && item.level >= 12) { + badge = Badge.ITEM_LEVEL_4; + local.add( badge ); + } + + displayBadge( badge ); + } + + public static void validateAllPotionsIdentified() { + if (Dungeon.hero != null && Dungeon.hero.isAlive() && + !local.contains( Badge.ALL_POTIONS_IDENTIFIED ) && Potion.allKnown()) { + + Badge badge = Badge.ALL_POTIONS_IDENTIFIED; + local.add( badge ); + displayBadge( badge ); + + validateAllItemsIdentified(); + } + } + + public static void validateAllScrollsIdentified() { + if (Dungeon.hero != null && Dungeon.hero.isAlive() && + !local.contains( Badge.ALL_SCROLLS_IDENTIFIED ) && Scroll.allKnown()) { + + Badge badge = Badge.ALL_SCROLLS_IDENTIFIED; + local.add( badge ); + displayBadge( badge ); + + validateAllItemsIdentified(); + } + } + + public static void validateAllRingsIdentified() { + if (Dungeon.hero != null && Dungeon.hero.isAlive() && + !local.contains( Badge.ALL_RINGS_IDENTIFIED ) && Ring.allKnown()) { + + Badge badge = Badge.ALL_RINGS_IDENTIFIED; + local.add( badge ); + displayBadge( badge ); + + validateAllItemsIdentified(); + } + } + + public static void validateAllWandsIdentified() { + if (Dungeon.hero != null && Dungeon.hero.isAlive() && + !local.contains( Badge.ALL_WANDS_IDENTIFIED ) && Wand.allKnown()) { + + Badge badge = Badge.ALL_WANDS_IDENTIFIED; + local.add( badge ); + displayBadge( badge ); + + validateAllItemsIdentified(); + } + } + + public static void validateAllBagsBought( Item bag ) { + + Badge badge = null; + if (bag instanceof SeedPouch) { + badge = Badge.BAG_BOUGHT_SEED_POUCH; + } else if (bag instanceof ScrollHolder) { + badge = Badge.BAG_BOUGHT_SCROLL_HOLDER; + } else if (bag instanceof WandHolster) { + badge = Badge.BAG_BOUGHT_WAND_HOLSTER; + } + + if (badge != null) { + + local.add( badge ); + + if (!local.contains( Badge.ALL_BAGS_BOUGHT ) && + local.contains( Badge.BAG_BOUGHT_SCROLL_HOLDER ) && + local.contains( Badge.BAG_BOUGHT_SEED_POUCH ) && + local.contains( Badge.BAG_BOUGHT_WAND_HOLSTER )) { + + badge = Badge.ALL_BAGS_BOUGHT; + local.add( badge ); + displayBadge( badge ); + } + } + } + + public static void validateAllItemsIdentified() { + if (!global.contains( Badge.ALL_ITEMS_IDENTIFIED ) && + global.contains( Badge.ALL_POTIONS_IDENTIFIED ) && + global.contains( Badge.ALL_SCROLLS_IDENTIFIED ) && + global.contains( Badge.ALL_RINGS_IDENTIFIED ) && + global.contains( Badge.ALL_WANDS_IDENTIFIED )) { + + Badge badge = Badge.ALL_ITEMS_IDENTIFIED; + displayBadge( badge ); + } + } + + public static void validateDeathFromFire() { + Badge badge = Badge.DEATH_FROM_FIRE; + local.add( badge ); + displayBadge( badge ); + + validateYASD(); + } + + public static void validateDeathFromPoison() { + Badge badge = Badge.DEATH_FROM_POISON; + local.add( badge ); + displayBadge( badge ); + + validateYASD(); + } + + public static void validateDeathFromGas() { + Badge badge = Badge.DEATH_FROM_GAS; + local.add( badge ); + displayBadge( badge ); + + validateYASD(); + } + + public static void validateDeathFromHunger() { + Badge badge = Badge.DEATH_FROM_HUNGER; + local.add( badge ); + displayBadge( badge ); + + validateYASD(); + } + + public static void validateDeathFromGlyph() { + Badge badge = Badge.DEATH_FROM_GLYPH; + local.add( badge ); + displayBadge( badge ); + } + + public static void validateDeathFromFalling() { + Badge badge = Badge.DEATH_FROM_FALLING; + local.add( badge ); + displayBadge( badge ); + } + + private static void validateYASD() { + if (global.contains( Badge.DEATH_FROM_FIRE ) && + global.contains( Badge.DEATH_FROM_POISON ) && + global.contains( Badge.DEATH_FROM_GAS ) && + global.contains( Badge.DEATH_FROM_HUNGER)) { + + Badge badge = Badge.YASD; + local.add( badge ); + displayBadge( badge ); + } + } + + public static void validateBossSlain() { + Badge badge = null; + switch (Dungeon.depth) { + case 5: + badge = Badge.BOSS_SLAIN_1; + break; + case 10: + badge = Badge.BOSS_SLAIN_2; + break; + case 15: + badge = Badge.BOSS_SLAIN_3; + break; + case 20: + badge = Badge.BOSS_SLAIN_4; + break; + } + + if (badge != null) { + local.add( badge ); + displayBadge( badge ); + + if (badge == Badge.BOSS_SLAIN_1) { + switch (Dungeon.hero.heroClass) { + case WARRIOR: + badge = Badge.BOSS_SLAIN_1_WARRIOR; + break; + case MAGE: + badge = Badge.BOSS_SLAIN_1_MAGE; + break; + case ROGUE: + badge = Badge.BOSS_SLAIN_1_ROGUE; + break; + case HUNTRESS: + badge = Badge.BOSS_SLAIN_1_HUNTRESS; + break; + } + local.add( badge ); + if (!global.contains( badge )) { + global.add( badge ); + saveNeeded = true; + } + + if (global.contains( Badge.BOSS_SLAIN_1_WARRIOR ) && + global.contains( Badge.BOSS_SLAIN_1_MAGE ) && + global.contains( Badge.BOSS_SLAIN_1_ROGUE ) && + global.contains( Badge.BOSS_SLAIN_1_HUNTRESS)) { + + badge = Badge.BOSS_SLAIN_1_ALL_CLASSES; + if (!global.contains( badge )) { + displayBadge( badge ); + global.add( badge ); + saveNeeded = true; + } + } + } else + if (badge == Badge.BOSS_SLAIN_3) { + switch (Dungeon.hero.subClass) { + case GLADIATOR: + badge = Badge.BOSS_SLAIN_3_GLADIATOR; + break; + case BERSERKER: + badge = Badge.BOSS_SLAIN_3_BERSERKER; + break; + case WARLOCK: + badge = Badge.BOSS_SLAIN_3_WARLOCK; + break; + case BATTLEMAGE: + badge = Badge.BOSS_SLAIN_3_BATTLEMAGE; + break; + case FREERUNNER: + badge = Badge.BOSS_SLAIN_3_FREERUNNER; + break; + case ASSASSIN: + badge = Badge.BOSS_SLAIN_3_ASSASSIN; + break; + case SNIPER: + badge = Badge.BOSS_SLAIN_3_SNIPER; + break; + case WARDEN: + badge = Badge.BOSS_SLAIN_3_WARDEN; + break; + default: + return; + } + local.add( badge ); + if (!global.contains( badge )) { + global.add( badge ); + saveNeeded = true; + } + + if (global.contains( Badge.BOSS_SLAIN_3_GLADIATOR ) && + global.contains( Badge.BOSS_SLAIN_3_BERSERKER ) && + global.contains( Badge.BOSS_SLAIN_3_WARLOCK ) && + global.contains( Badge.BOSS_SLAIN_3_BATTLEMAGE ) && + global.contains( Badge.BOSS_SLAIN_3_FREERUNNER ) && + global.contains( Badge.BOSS_SLAIN_3_ASSASSIN ) && + global.contains( Badge.BOSS_SLAIN_3_SNIPER ) && + global.contains( Badge.BOSS_SLAIN_3_WARDEN )) { + + badge = Badge.BOSS_SLAIN_3_ALL_SUBCLASSES; + if (!global.contains( badge )) { + displayBadge( badge ); + global.add( badge ); + saveNeeded = true; + } + } + } + } + } + + public static void validateMastery() { + + Badge badge = null; + switch (Dungeon.hero.heroClass) { + case WARRIOR: + badge = Badge.MASTERY_WARRIOR; + break; + case MAGE: + badge = Badge.MASTERY_MAGE; + break; + case ROGUE: + badge = Badge.MASTERY_ROGUE; + break; + case HUNTRESS: + badge = Badge.MASTERY_HUNTRESS; + break; + } + + if (!global.contains( badge )) { + global.add( badge ); + saveNeeded = true; + } + } + + public static void validateMasteryCombo( int n ) { + if (!local.contains( Badge.MASTERY_COMBO ) && n == 7) { + Badge badge = Badge.MASTERY_COMBO; + local.add( badge ); + displayBadge( badge ); + } + } + + public static void validateRingOfHaggler() { + if (!local.contains( Badge.RING_OF_HAGGLER ) && new RingOfHaggler().isKnown()) { + Badge badge = Badge.RING_OF_HAGGLER; + local.add( badge ); + displayBadge( badge ); + } + } + + public static void validateRingOfThorns() { + if (!local.contains( Badge.RING_OF_THORNS ) && new RingOfThorns().isKnown()) { + Badge badge = Badge.RING_OF_THORNS; + local.add( badge ); + displayBadge( badge ); + } + } + + public static void validateRare( Mob mob ) { + + Badge badge = null; + if (mob instanceof Albino) { + badge = Badge.RARE_ALBINO; + } else if (mob instanceof Bandit) { + badge = Badge.RARE_BANDIT; + } else if (mob instanceof Shielded) { + badge = Badge.RARE_SHIELDED; + } else if (mob instanceof Senior) { + badge = Badge.RARE_SENIOR; + } else if (mob instanceof Acidic) { + badge = Badge.RARE_ACIDIC; + } + if (!global.contains( badge )) { + global.add( badge ); + saveNeeded = true; + } + + if (global.contains( Badge.RARE_ALBINO ) && + global.contains( Badge.RARE_BANDIT ) && + global.contains( Badge.RARE_SHIELDED ) && + global.contains( Badge.RARE_SENIOR ) && + global.contains( Badge.RARE_ACIDIC )) { + + badge = Badge.RARE; + displayBadge( badge ); + } + } + + public static void validateVictory() { + + Badge badge = Badge.VICTORY; + displayBadge( badge ); + + switch (Dungeon.hero.heroClass) { + case WARRIOR: + badge = Badge.VICTORY_WARRIOR; + break; + case MAGE: + badge = Badge.VICTORY_MAGE; + break; + case ROGUE: + badge = Badge.VICTORY_ROGUE; + break; + case HUNTRESS: + badge = Badge.VICTORY_HUNTRESS; + break; + } + local.add( badge ); + if (!global.contains( badge )) { + global.add( badge ); + saveNeeded = true; + } + + if (global.contains( Badge.VICTORY_WARRIOR ) && + global.contains( Badge.VICTORY_MAGE ) && + global.contains( Badge.VICTORY_ROGUE ) && + global.contains( Badge.VICTORY_HUNTRESS )) { + + badge = Badge.VICTORY_ALL_CLASSES; + displayBadge( badge ); + } + } + + public static void validateNoKilling() { + if (!local.contains( Badge.NO_MONSTERS_SLAIN ) && Statistics.completedWithNoKilling) { + Badge badge = Badge.NO_MONSTERS_SLAIN; + local.add( badge ); + displayBadge( badge ); + } + } + + public static void validateGrimWeapon() { + if (!local.contains( Badge.GRIM_WEAPON )) { + Badge badge = Badge.GRIM_WEAPON; + local.add( badge ); + displayBadge( badge ); + } + } + + public static void validateNightHunter() { + if (!local.contains( Badge.NIGHT_HUNTER ) && Statistics.nightHunt >= 15) { + Badge badge = Badge.NIGHT_HUNTER; + local.add( badge ); + displayBadge( badge ); + } + } + + public static void validateSupporter() { + + global.add( Badge.SUPPORTER ); + saveNeeded = true; + + PixelScene.showBadge( Badge.SUPPORTER ); + } + + public static void validateGamesPlayed() { + Badge badge = null; + if (Rankings.INSTANCE.totalNumber >= 10) { + badge = Badge.GAMES_PLAYED_1; + } + if (Rankings.INSTANCE.totalNumber >= 100) { + badge = Badge.GAMES_PLAYED_2; + } + if (Rankings.INSTANCE.totalNumber >= 500) { + badge = Badge.GAMES_PLAYED_3; + } + if (Rankings.INSTANCE.totalNumber >= 2000) { + badge = Badge.GAMES_PLAYED_4; + } + + displayBadge( badge ); + } + + public static void validateHappyEnd() { + displayBadge( Badge.HAPPY_END ); + } + + private static void displayBadge( Badge badge ) { + + if (badge == null) { + return; + } + + if (global.contains( badge )) { + + if (!badge.meta) { + GLog.h( "Badge endorsed: %s", badge.description ); + } + + } else { + + global.add( badge ); + saveNeeded = true; + + if (badge.meta) { + GLog.h( "New super badge: %s", badge.description ); + } else { + GLog.h( "New badge: %s", badge.description ); + } + PixelScene.showBadge( badge ); + } + } + + public static boolean isUnlocked( Badge badge ) { + return global.contains( badge ); + } + + public static void disown( Badge badge ) { + loadGlobal(); + global.remove( badge ); + saveNeeded = true; + } + + public static List filtered( boolean global ) { + + HashSet filtered = new HashSet( global ? Badges.global : Badges.local ); + + if (!global) { + Iterator iterator = filtered.iterator(); + while (iterator.hasNext()) { + Badge badge = iterator.next(); + if (badge.meta) { + iterator.remove(); + } + } + } + + leaveBest( filtered, Badge.MONSTERS_SLAIN_1, Badge.MONSTERS_SLAIN_2, Badge.MONSTERS_SLAIN_3, Badge.MONSTERS_SLAIN_4 ); + leaveBest( filtered, Badge.GOLD_COLLECTED_1, Badge.GOLD_COLLECTED_2, Badge.GOLD_COLLECTED_3, Badge.GOLD_COLLECTED_4 ); + leaveBest( filtered, Badge.BOSS_SLAIN_1, Badge.BOSS_SLAIN_2, Badge.BOSS_SLAIN_3, Badge.BOSS_SLAIN_4 ); + leaveBest( filtered, Badge.LEVEL_REACHED_1, Badge.LEVEL_REACHED_2, Badge.LEVEL_REACHED_3, Badge.LEVEL_REACHED_4 ); + leaveBest( filtered, Badge.STRENGTH_ATTAINED_1, Badge.STRENGTH_ATTAINED_2, Badge.STRENGTH_ATTAINED_3, Badge.STRENGTH_ATTAINED_4 ); + leaveBest( filtered, Badge.FOOD_EATEN_1, Badge.FOOD_EATEN_2, Badge.FOOD_EATEN_3, Badge.FOOD_EATEN_4 ); + leaveBest( filtered, Badge.ITEM_LEVEL_1, Badge.ITEM_LEVEL_2, Badge.ITEM_LEVEL_3, Badge.ITEM_LEVEL_4 ); + leaveBest( filtered, Badge.POTIONS_COOKED_1, Badge.POTIONS_COOKED_2, Badge.POTIONS_COOKED_3, Badge.POTIONS_COOKED_4 ); + leaveBest( filtered, Badge.BOSS_SLAIN_1_ALL_CLASSES, Badge.BOSS_SLAIN_3_ALL_SUBCLASSES ); + leaveBest( filtered, Badge.DEATH_FROM_FIRE, Badge.YASD ); + leaveBest( filtered, Badge.DEATH_FROM_GAS, Badge.YASD ); + leaveBest( filtered, Badge.DEATH_FROM_HUNGER, Badge.YASD ); + leaveBest( filtered, Badge.DEATH_FROM_POISON, Badge.YASD ); + leaveBest( filtered, Badge.VICTORY, Badge.VICTORY_ALL_CLASSES ); + leaveBest( filtered, Badge.GAMES_PLAYED_1, Badge.GAMES_PLAYED_2, Badge.GAMES_PLAYED_3, Badge.GAMES_PLAYED_4 ); + + ArrayList list = new ArrayList( filtered ); + Collections.sort( list ); + + return list; + } + + private static void leaveBest( HashSet list, Badge...badges ) { + for (int i=badges.length-1; i > 0; i--) { + if (list.contains( badges[i])) { + for (int j=0; j < i; j++) { + list.remove( badges[j] ); + } + break; + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/Bones.java b/src/com/watabou/pixeldungeon/Bones.java new file mode 100644 index 0000000000..4114784950 --- /dev/null +++ b/src/com/watabou/pixeldungeon/Bones.java @@ -0,0 +1,125 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.watabou.noosa.Game; +import com.watabou.pixeldungeon.items.Gold; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.rings.Ring; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Bones { + + private static final String BONES_FILE = "bones.dat"; + + private static final String LEVEL = "level"; + private static final String ITEM = "item"; + + private static int depth = -1; + private static Item item; + + public static void leave() { + + item = null; + switch (Random.Int( 4 )) { + case 0: + item = Dungeon.hero.belongings.weapon; + break; + case 1: + item = Dungeon.hero.belongings.armor; + break; + case 2: + item = Dungeon.hero.belongings.ring1; + break; + case 3: + item = Dungeon.hero.belongings.ring2; + break; + } + if (item == null) { + if (Dungeon.gold > 0) { + item = new Gold( Random.IntRange( 1, Dungeon.gold ) ); + } else { + item = new Gold( 1 ); + } + } + + depth = Dungeon.depth; + + Bundle bundle = new Bundle(); + bundle.put( LEVEL, depth ); + bundle.put( ITEM, item ); + + try { + OutputStream output = Game.instance.openFileOutput( BONES_FILE, Game.MODE_PRIVATE ); + Bundle.write( bundle, output ); + output.close(); + } catch (IOException e) { + + } + } + + public static Item get() { + if (depth == -1) { + + try { + InputStream input = Game.instance.openFileInput( BONES_FILE ) ; + Bundle bundle = Bundle.read( input ); + input.close(); + + depth = bundle.getInt( LEVEL ); + item = (Item)bundle.get( ITEM ); + + return get(); + + } catch (IOException e) { + return null; + } + + } else { + if (depth == Dungeon.depth) { + Game.instance.deleteFile( BONES_FILE ); + depth = 0; + + if (!item.stackable) { + item.cursed = true; + item.cursedKnown = true; + if (item.isUpgradable()) { + int lvl = (Dungeon.depth - 1) * 3 / 5 + 1; + if (lvl < item.level) { + item.degrade( item.level - lvl ); + } + item.levelKnown = false; + } + } + + if (item instanceof Ring) { + ((Ring)item).syncGem(); + } + + return item; + } else { + return null; + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/Chrome.java b/src/com/watabou/pixeldungeon/Chrome.java new file mode 100644 index 0000000000..ef6d5d93ff --- /dev/null +++ b/src/com/watabou/pixeldungeon/Chrome.java @@ -0,0 +1,66 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +import com.watabou.noosa.NinePatch; + +public class Chrome { + + public enum Type { + TOAST, + TOAST_TR, + WINDOW, + BUTTON, + TAG, + GEM, + SCROLL, + TAB_SET, + TAB_SELECTED, + TAB_UNSELECTED, + SURFACE + }; + + public static NinePatch get( Type type ) { + switch (type) { + case WINDOW: + return new NinePatch( Assets.CHROME, 0, 0, 22, 22, 7 ); + case TOAST: + return new NinePatch( Assets.CHROME, 22, 0, 18, 18, 5 ); + case TOAST_TR: + return new NinePatch( Assets.CHROME, 40, 0, 18, 18, 5 ); + case BUTTON: + return new NinePatch( Assets.CHROME, 58, 0, 4, 4, 1 ); + case TAG: + return new NinePatch( Assets.CHROME, 22, 18, 16, 14, 3 ); + case GEM: + return new NinePatch( Assets.CHROME, 0, 32, 32, 32, 13 ); + case SCROLL: + return new NinePatch( Assets.CHROME, 32, 32, 32, 32, 5, 11, 5, 11 ); + case TAB_SET: + return new NinePatch( Assets.CHROME, 64, 0, 22, 22, 7, 7, 7, 7 ); + case TAB_SELECTED: + return new NinePatch( Assets.CHROME, 64, 22, 10, 14, 4, 7, 4, 6 ); + case TAB_UNSELECTED: + return new NinePatch( Assets.CHROME, 74, 22, 10, 14, 4, 7, 4, 6 ); + case SURFACE: + return new NinePatch( Assets.CHROME, 86, 0, 22, 22, 5 ); + default: + return null; + } + } +} diff --git a/src/com/watabou/pixeldungeon/Dungeon.java b/src/com/watabou/pixeldungeon/Dungeon.java new file mode 100644 index 0000000000..f062208117 --- /dev/null +++ b/src/com/watabou/pixeldungeon/Dungeon.java @@ -0,0 +1,690 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.Date; +import java.util.HashSet; + +import com.watabou.noosa.Game; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Amok; +import com.watabou.pixeldungeon.actors.buffs.Light; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.actors.mobs.npcs.Blacksmith; +import com.watabou.pixeldungeon.actors.mobs.npcs.Imp; +import com.watabou.pixeldungeon.actors.mobs.npcs.Ghost; +import com.watabou.pixeldungeon.actors.mobs.npcs.Wandmaker; +import com.watabou.pixeldungeon.items.Ankh; +import com.watabou.pixeldungeon.items.potions.Potion; +import com.watabou.pixeldungeon.items.rings.Ring; +import com.watabou.pixeldungeon.items.scrolls.Scroll; +import com.watabou.pixeldungeon.items.wands.Wand; +import com.watabou.pixeldungeon.levels.CavesBossLevel; +import com.watabou.pixeldungeon.levels.CavesLevel; +import com.watabou.pixeldungeon.levels.CityBossLevel; +import com.watabou.pixeldungeon.levels.CityLevel; +import com.watabou.pixeldungeon.levels.DeadEndLevel; +import com.watabou.pixeldungeon.levels.HallsBossLevel; +import com.watabou.pixeldungeon.levels.HallsLevel; +import com.watabou.pixeldungeon.levels.LastLevel; +import com.watabou.pixeldungeon.levels.LastShopLevel; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.PrisonBossLevel; +import com.watabou.pixeldungeon.levels.PrisonLevel; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.SewerBossLevel; +import com.watabou.pixeldungeon.levels.SewerLevel; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.scenes.StartScene; +import com.watabou.pixeldungeon.utils.BArray; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.pixeldungeon.windows.WndResurrect; +import com.watabou.utils.Bundle; +import com.watabou.utils.PathFinder; +import com.watabou.utils.Random; + +public class Dungeon { + + private static final String NO_TIPS = "The text is indecipherable..."; + private static final String[] TIPS = { + "Don't overestimate your strength, use weapons and armor you can handle.", + "Not all doors in the dungeon are visible at first sight. If you are stuck, search for hidden doors.", + "Remember, that raising your strength is not the only way to access better equipment, you can go " + + "the other way lowering its strength requirement with Scrolls of Upgrade.", + "You can spend your gold in shops on deeper levels of the dungeon. The first one is on the 6th level.", + + "Beware of Goo!", + + "Pixel-Mart - all you need for successful adventure!", + "Identify your potions and scrolls as soon as possible. Don't put it off to the moment " + + "when you actually need them.", + "Being hungry doesn't hurt, but starving does hurt.", + "Surprise attack has a better chance to hit. For example, you can ambush your enemy behind " + + "a closed door when you know it is approaching.", + + "Don't let The Tengu out!", + + "Pixel-Mart. Spend money. Live longer.", + "When you're attacked by several monsters at the same time, try to retreat behind a door.", + "If you are burning, you can't put out the fire in the water while levitating.", + "There is no sense in possessing more than one Ankh at the same time, because you will lose them upon resurrecting.", + + "DANGER! Heavy machinery can cause injury, loss of limbs or death!", + + "Pixel-Mart. A safer life in dungeon.", + "When you upgrade an enchanted weapon, there is a chance to destroy that enchantment.", + "In a Well of Transmutation you can get an item, that cannot be obtained otherwise.", + "The only way to enchant a weapon is by upgrading it with a Scroll of Weapon Upgrade.", + + "No weapons allowed in the presence of His Majesty!", + + "Pixel-Mart. Special prices for demon hunters!", + "The text is written in demonic language.", + "The text is written in demonic language.", + "The text is written in demonic language." + }; + + private static final String TXT_DEAD_END = + "What are you doing here?!"; + + public static int potionOfStrength; + public static int scrollsOfUpgrade; + public static int arcaneStyli; + public static boolean dewVial; // true if the dew vial can be spawned + public static int transmutation; // depth number for a well of transmutation + + + public static Hero hero; + public static Level level; + + // Eitherî Item or Class + public static Object quickslot; + + public static int depth; + public static int gold; + // Reason of death + public static String resultDescription; + + public static HashSet chapters; + + // Hero's field of view + public static boolean[] visible = new boolean[Level.LENGTH]; + + public static boolean nightMode; + + public static void init() { + + Actor.clear(); + + PathFinder.setMapSize( Level.WIDTH, Level.HEIGHT ); + + Scroll.initLabels(); + Potion.initColors(); + Wand.initWoods(); + Ring.initGems(); + + Statistics.reset(); + Journal.reset(); + + depth = 0; + gold = 0; + + potionOfStrength = 0; + scrollsOfUpgrade = 0; + arcaneStyli = 0; + dewVial = true; + transmutation = Random.IntRange( 6, 14 ); + + chapters = new HashSet(); + + Ghost.Quest.reset(); + Wandmaker.Quest.reset(); + Blacksmith.Quest.reset(); + Imp.Quest.reset(); + + Room.shuffleTypes(); + + hero = new Hero(); + hero.live(); + + Badges.reset(); + + StartScene.curClass.initHero( hero ); + } + + public static Level newLevel() { + + Dungeon.level = null; + Actor.clear(); + + depth++; + if (depth > Statistics.deepestFloor) { + Statistics.deepestFloor = depth; + + if (Statistics.qualifiedForNoKilling) { + Statistics.completedWithNoKilling = true; + } else { + Statistics.completedWithNoKilling = false; + } + } + + Arrays.fill( visible, false ); + + Level level; + switch (depth) { + case 1: + case 2: + case 3: + case 4: + level = new SewerLevel(); + break; + case 5: + level = new SewerBossLevel(); + break; + case 6: + case 7: + case 8: + case 9: + level = new PrisonLevel(); + break; + case 10: + level = new PrisonBossLevel(); + break; + case 11: + case 12: + case 13: + case 14: + level = new CavesLevel(); + break; + case 15: + level = new CavesBossLevel(); + break; + case 16: + case 17: + case 18: + case 19: + level = new CityLevel(); + break; + case 20: + level = new CityBossLevel(); + break; + case 21: + level = new LastShopLevel(); + break; + case 22: + case 23: + case 24: + level = new HallsLevel(); + break; + case 25: + level = new HallsBossLevel(); + break; + case 26: + level = new LastLevel(); + break; + default: + level = new DeadEndLevel(); + Statistics.deepestFloor--; + } + + level.create(); + + Statistics.qualifiedForNoKilling = !bossLevel(); + + return level; + } + + public static void resetLevel() { + + Actor.clear(); + + Arrays.fill( visible, false ); + + level.reset(); + switchLevel( level, level.entrance ); + } + + public static String tip() { + + if (level instanceof DeadEndLevel) { + + return TXT_DEAD_END; + + } else { + + int index = depth - 1; + + if (index < TIPS.length) { + return TIPS[index]; + } else { + return NO_TIPS; + } + } + } + + public static boolean shopOnLevel() { + return depth == 6 || depth == 11 || depth == 16; + } + + public static boolean bossLevel() { + return bossLevel( depth ); + } + + public static boolean bossLevel( int depth ) { + return depth == 5 || depth == 10 || depth == 15 || depth == 20 || depth == 25; + } + + @SuppressWarnings("deprecation") + public static void switchLevel( final Level level, int pos ) { + + nightMode = new Date().getHours() < 7; + + Dungeon.level = level; + Actor.init(); + + Actor respawner = level.respawner(); + if (respawner != null) { + Actor.add( level.respawner() ); + } + + hero.pos = pos != -1 ? pos : level.exit; + + Light light = hero.buff( Light.class ); + hero.viewDistance = light == null ? level.viewDistance : Math.max( Light.DISTANCE, level.viewDistance ); + + observe(); + } + + public static boolean posNeeded() { + int[] quota = {4, 2, 9, 4, 14, 6, 19, 8, 24, 9}; + return chance( quota, potionOfStrength ); + } + + public static boolean soeNeeded() { + int[] quota = {5, 3, 10, 6, 15, 9, 20, 12, 25, 13}; + return chance( quota, scrollsOfUpgrade ); + } + + private static boolean chance( int[] quota, int number ) { + + for (int i=0; i < quota.length; i += 2) { + int qDepth = quota[i]; + if (depth <= qDepth) { + int qNumber = quota[i + 1]; + return Random.Float() < (float)(qNumber - number) / (qDepth - depth + 1); + } + } + + return false; + } + + public static boolean asNeeded() { + return Random.Int( 12 * (1 + arcaneStyli) ) < depth; + } + + private static final String RG_GAME_FILE = "game.dat"; + private static final String RG_DEPTH_FILE = "depth%d.dat"; + + private static final String WR_GAME_FILE = "warrior.dat"; + private static final String WR_DEPTH_FILE = "warrior%d.dat"; + + private static final String MG_GAME_FILE = "mage.dat"; + private static final String MG_DEPTH_FILE = "mage%d.dat"; + + private static final String RN_GAME_FILE = "ranger.dat"; + private static final String RN_DEPTH_FILE = "ranger%d.dat"; + + private static final String VERSION = "version"; + private static final String HERO = "hero"; + private static final String GOLD = "gold"; + private static final String DEPTH = "depth"; + private static final String QUICKSLOT = "quickslot"; + private static final String LEVEL = "level"; + private static final String POS = "potionsOfStrength"; + private static final String SOU = "scrollsOfEnhancement"; + private static final String AS = "arcaneStyli"; + private static final String DV = "dewVial"; + private static final String WT = "transmutation"; + private static final String CHAPTERS = "chapters"; + private static final String QUESTS = "quests"; + private static final String BADGES = "badges"; + + public static String gameFile( HeroClass cl ) { + switch (cl) { + case WARRIOR: + return WR_GAME_FILE; + case MAGE: + return MG_GAME_FILE; + case HUNTRESS: + return RN_GAME_FILE; + default: + return RG_GAME_FILE; + } + } + + private static String depthFile( HeroClass cl ) { + switch (cl) { + case WARRIOR: + return WR_DEPTH_FILE; + case MAGE: + return MG_DEPTH_FILE; + case HUNTRESS: + return RN_DEPTH_FILE; + default: + return RG_DEPTH_FILE; + } + } + + public static void saveGame( String fileName ) throws IOException { + try { + Bundle bundle = new Bundle(); + + bundle.put( VERSION, Game.version ); + bundle.put( HERO, hero ); + bundle.put( GOLD, gold ); + bundle.put( DEPTH, depth ); + + bundle.put( POS, potionOfStrength ); + bundle.put( SOU, scrollsOfUpgrade ); + bundle.put( AS, arcaneStyli ); + bundle.put( DV, dewVial ); + bundle.put( WT, transmutation ); + + int count = 0; + int ids[] = new int[chapters.size()]; + for (Integer id : chapters) { + ids[count++] = id; + } + bundle.put( CHAPTERS, ids ); + + Bundle quests = new Bundle(); + Ghost .Quest.storeInBundle( quests ); + Wandmaker .Quest.storeInBundle( quests ); + Blacksmith .Quest.storeInBundle( quests ); + Imp .Quest.storeInBundle( quests ); + bundle.put( QUESTS, quests ); + + Room.storeRoomsInBundle( bundle ); + + Statistics.storeInBundle( bundle ); + Journal.storeInBundle( bundle ); + + if (quickslot instanceof Class) { + bundle.put( QUICKSLOT, ((Class)quickslot).getName() ); + } + + Scroll.save( bundle ); + Potion.save( bundle ); + Wand.save( bundle ); + Ring.save( bundle ); + + Bundle badges = new Bundle(); + Badges.saveLocal( badges ); + bundle.put( BADGES, badges ); + + OutputStream output = Game.instance.openFileOutput( fileName, Game.MODE_PRIVATE ); + Bundle.write( bundle, output ); + output.close(); + + } catch (Exception e) { + + GamesInProgress.setUnknown( hero.heroClass ); + } + } + + public static void saveLevel() throws IOException { + Bundle bundle = new Bundle(); + bundle.put( LEVEL, level ); + + OutputStream output = Game.instance.openFileOutput( + Utils.format( depthFile( hero.heroClass ), depth ), Game.MODE_PRIVATE ); + Bundle.write( bundle, output ); + output.close(); + } + + public static void saveAll() throws IOException { + if (hero.isAlive()) { + + Actor.fixTime(); + saveGame( gameFile( hero.heroClass ) ); + saveLevel(); + + GamesInProgress.set( + hero.heroClass, + depth, + hero.lvl, + hero.belongings.armor != null ? hero.belongings.armor.tier : 0 ); + + } else if (WndResurrect.instance != null) { + + WndResurrect.instance.hide(); + Hero.reallyDie( WndResurrect.causeOfDeath ); + + } + } + + public static void loadGame( HeroClass cl ) throws IOException { + loadGame( gameFile( cl ), true ); + } + + public static void loadGame( String fileName ) throws IOException { + loadGame( fileName, false ); + } + + public static void loadGame( String fileName, boolean fullLoad ) throws IOException { + + Bundle bundle = gameBundle( fileName ); + + Dungeon.level = null; + Dungeon.depth = -1; + + if (fullLoad) { + PathFinder.setMapSize( Level.WIDTH, Level.HEIGHT ); + } + + Scroll.restore( bundle ); + Potion.restore( bundle ); + Wand.restore( bundle ); + Ring.restore( bundle ); + + potionOfStrength = bundle.getInt( POS ); + scrollsOfUpgrade = bundle.getInt( SOU ); + arcaneStyli = bundle.getInt( AS ); + dewVial = bundle.getBoolean( DV ); + transmutation = bundle.getInt( WT ); + + if (fullLoad) { + chapters = new HashSet(); + int ids[] = bundle.getIntArray( CHAPTERS ); + if (ids != null) { + for (int id : ids) { + chapters.add( id ); + } + } + + Bundle quests = bundle.getBundle( QUESTS ); + if (!quests.isNull()) { + Ghost.Quest.restoreFromBundle( quests ); + Wandmaker.Quest.restoreFromBundle( quests ); + Blacksmith.Quest.restoreFromBundle( quests ); + Imp.Quest.restoreFromBundle( quests ); + } else { + Ghost.Quest.reset(); + Wandmaker.Quest.reset(); + Blacksmith.Quest.reset(); + Imp.Quest.reset(); + } + + Room.restoreRoomsFromBundle( bundle ); + } + + Bundle badges = bundle.getBundle( BADGES ); + if (!badges.isNull()) { + Badges.loadLocal( badges ); + } else { + Badges.reset(); + } + + String qsClass = bundle.getString( QUICKSLOT ); + if (qsClass != null) { + try { + quickslot = Class.forName( qsClass ); + } catch (ClassNotFoundException e) { + } + } else { + quickslot = null; + } + + @SuppressWarnings("unused") + String version = bundle.getString( VERSION ); + + hero = null; + hero = (Hero)bundle.get( HERO ); + + gold = bundle.getInt( GOLD ); + depth = bundle.getInt( DEPTH ); + + Statistics.restoreFromBundle( bundle ); + Journal.restoreFromBundle( bundle ); + } + + public static Level loadLevel( HeroClass cl ) throws IOException { + + Dungeon.level = null; + Actor.clear(); + + InputStream input = Game.instance.openFileInput( Utils.format( depthFile( cl ), depth ) ) ; + Bundle bundle = Bundle.read( input ); + input.close(); + + return (Level)bundle.get( "level" ); + } + + public static void deleteGame( HeroClass cl, boolean deleteLevels ) { + + Game.instance.deleteFile( gameFile( cl ) ); + + if (deleteLevels) { + int depth = 1; + while (Game.instance.deleteFile( Utils.format( depthFile( cl ), depth ) )) { + depth++; + } + } + + GamesInProgress.delete( cl ); + } + + public static Bundle gameBundle( String fileName ) throws IOException { + + InputStream input = Game.instance.openFileInput( fileName ); + Bundle bundle = Bundle.read( input ); + input.close(); + + return bundle; + } + + public static void preview( GamesInProgress.Info info, Bundle bundle ) { + info.depth = bundle.getInt( DEPTH ); + if (info.depth == -1) { + info.depth = bundle.getInt( "maxDepth" ); // <-- It has to be refactored! + } + Hero.preview( info, bundle.getBundle( HERO ) ); + } + + public static void fail( String desc ) { + resultDescription = desc; + if (hero.belongings.getItem( Ankh.class ) == null) { + Rankings.INSTANCE.submit( false ); + } + } + + public static void win( String desc ) { + resultDescription = desc; + Rankings.INSTANCE.submit( true ); + } + + public static void observe() { + + if (level == null) { + return; + } + + level.updateFieldOfView( hero ); + System.arraycopy( Level.fieldOfView, 0, visible, 0, visible.length ); + + BArray.or( level.visited, visible, level.visited ); + + GameScene.afterObserve(); + } + + private static boolean[] passable = new boolean[Level.LENGTH]; + + public static int findPath( Char ch, int from, int to, boolean pass[], boolean[] visible ) { + + if (Level.adjacent( from, to )) { + return Actor.findChar( to ) == null && (pass[to] || Level.avoid[to]) ? to : -1; + } + + if (ch.flying || ch.buff( Amok.class ) != null) { + BArray.or( pass, Level.avoid, passable ); + } else { + System.arraycopy( pass, 0, passable, 0, Level.LENGTH ); + } + + for (Actor actor : Actor.all()) { + if (actor instanceof Char) { + int pos = ((Char)actor).pos; + if (visible[pos]) { + passable[pos] = false; + } + } + } + + return PathFinder.getStep( from, to, passable ); + + } + + public static int flee( Char ch, int cur, int from, boolean pass[], boolean[] visible ) { + + if (ch.flying) { + BArray.or( pass, Level.avoid, passable ); + } else { + System.arraycopy( pass, 0, passable, 0, Level.LENGTH ); + } + + for (Actor actor : Actor.all()) { + if (actor instanceof Char) { + int pos = ((Char)actor).pos; + if (visible[pos]) { + passable[pos] = false; + } + } + } + passable[cur] = true; + + return PathFinder.getStepBack( cur, from, passable ); + + } + +} diff --git a/src/com/watabou/pixeldungeon/DungeonTilemap.java b/src/com/watabou/pixeldungeon/DungeonTilemap.java new file mode 100644 index 0000000000..24d7af3ee9 --- /dev/null +++ b/src/com/watabou/pixeldungeon/DungeonTilemap.java @@ -0,0 +1,94 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +import com.watabou.noosa.Image; +import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.Tilemap; +import com.watabou.noosa.tweeners.AlphaTweener; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.utils.Point; +import com.watabou.utils.PointF; + +public class DungeonTilemap extends Tilemap { + + public static final int SIZE = 16; + + private static DungeonTilemap instance; + + public DungeonTilemap() { + super( + Dungeon.level.tilesTex(), + new TextureFilm( Dungeon.level.tilesTex(), SIZE, SIZE ) ); + map( Dungeon.level.map, Level.WIDTH ); + + instance = this; + } + + public int screenToTile( int x, int y ) { + Point p = camera().screenToCamera( x, y ). + offset( this.point().negate() ). + invScale( SIZE ). + floor(); + return p.x >= 0 && p.x < Level.WIDTH && p.y >= 0 && p.y < Level.HEIGHT ? p.x + p.y * Level.WIDTH : -1; + } + + @Override + public boolean overlapsPoint( float x, float y ) { + return true; + } + + public void discover( int pos, int oldValue ) { + + final Image tile = tile( oldValue ); + tile.point( tileToWorld( pos ) ); + + // For bright mode + tile.rm = tile.gm = tile.bm = rm; + tile.ra = tile.ga = tile.ba = ra; + parent.add( tile ); + + parent.add( new AlphaTweener( tile, 0, 0.6f ) { + protected void onComplete() { + tile.killAndErase(); + killAndErase(); + }; + } ); + } + + public static PointF tileToWorld( int pos ) { + return new PointF( pos % Level.WIDTH, pos / Level.WIDTH ).scale( SIZE ); + } + + public static PointF tileCenterToWorld( int pos ) { + return new PointF( + (pos % Level.WIDTH + 0.5f) * SIZE, + (pos / Level.WIDTH + 0.5f) * SIZE ); + } + + public static Image tile( int index ) { + Image img = new Image( instance.texture ); + img.frame( instance.tileset.get( index ) ); + return img; + } + + @Override + public boolean overlapsScreenPoint( int x, int y ) { + return true; + } +} diff --git a/src/com/watabou/pixeldungeon/FogOfWar.java b/src/com/watabou/pixeldungeon/FogOfWar.java new file mode 100644 index 0000000000..39d51b7b31 --- /dev/null +++ b/src/com/watabou/pixeldungeon/FogOfWar.java @@ -0,0 +1,121 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +import java.util.Arrays; + +import android.graphics.Bitmap; + +import com.watabou.gltextures.SmartTexture; +import com.watabou.gltextures.TextureCache; +import com.watabou.glwrap.Texture; +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class FogOfWar extends Image { + + private static final int VISIBLE = 0x00000000; + private static final int VISITED = 0xcc111111; + private static final int MAPPED = 0xcc442211; + private static final int INVISIBLE = 0xFF000000; + + private int[] pixels; + + private int pWidth; + private int pHeight; + + private int width2; + private int height2; + + public FogOfWar( int mapWidth, int mapHeight ) { + + super(); + + pWidth = mapWidth + 1; + pHeight = mapHeight + 1; + + width2 = 1; + while (width2 < pWidth) { + width2 <<= 1; + } + + height2 = 1; + while (height2 < pHeight) { + height2 <<= 1; + } + + float size = DungeonTilemap.SIZE; + width = width2 * size; + height = height2 * size; + + texture( new FogTexture() ); + + scale.set( + DungeonTilemap.SIZE, + DungeonTilemap.SIZE ); + + x = y = -size / 2; + } + + public void updateVisibility( boolean[] visible, boolean[] visited, boolean[] mapped ) { + + if (pixels == null) { + pixels = new int[width2 * height2]; + Arrays.fill( pixels, INVISIBLE ); + } + + for (int i=1; i < pHeight - 1; i++) { + int pos = (pWidth - 1) * i; + for (int j=1; j < pWidth - 1; j++) { + pos++; + int c = INVISIBLE; + if (visible[pos] && visible[pos - (pWidth - 1)] && + visible[pos - 1] && visible[pos - (pWidth - 1) - 1]) { + c = VISIBLE; + } else + if (visited[pos] && visited[pos - (pWidth - 1)] && + visited[pos - 1] && visited[pos - (pWidth - 1) - 1]) { + c = VISITED; + } + else + if (mapped[pos] && mapped[pos - (pWidth - 1)] && + mapped[pos - 1] && mapped[pos - (pWidth - 1) - 1]) { + c = MAPPED; + } + pixels[i * width2 + j] = c; + } + } + + texture.pixels( width2, height2, pixels ); + } + + private class FogTexture extends SmartTexture { + + public FogTexture() { + super( Bitmap.createBitmap( width2, height2, Bitmap.Config.ARGB_8888 ) ); + filter( Texture.LINEAR, Texture.LINEAR ); + TextureCache.add( FogOfWar.class, this ); + } + + @Override + public void reload() { + super.reload(); + GameScene.afterObserve(); + } + } +} diff --git a/src/com/watabou/pixeldungeon/GamesInProgress.java b/src/com/watabou/pixeldungeon/GamesInProgress.java new file mode 100644 index 0000000000..ad5659ea6d --- /dev/null +++ b/src/com/watabou/pixeldungeon/GamesInProgress.java @@ -0,0 +1,75 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +import java.util.HashMap; + +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.utils.Bundle; + +public class GamesInProgress { + + private static HashMap state = new HashMap(); + + public static Info check( HeroClass cl ) { + + if (state.containsKey( cl )) { + + return state.get( cl ); + + } else { + + Info info; + try { + + Bundle bundle = Dungeon.gameBundle( Dungeon.gameFile( cl ) ); + info = new Info(); + Dungeon.preview( info, bundle ); + + } catch (Exception e) { + info = null; + } + + state.put( cl, info ); + return info; + + } + } + + public static void set( HeroClass cl, int depth, int level, int armor ) { + Info info = new Info(); + info.depth = depth; + info.level = level; + info.armor = armor; + state.put( cl, info ); + } + + public static void setUnknown( HeroClass cl ) { + state.remove( cl ); + } + + public static void delete( HeroClass cl ) { + state.put( cl, null ); + } + + public static class Info { + public int depth; + public int level; + public int armor; + } +} diff --git a/src/com/watabou/pixeldungeon/Journal.java b/src/com/watabou/pixeldungeon/Journal.java new file mode 100644 index 0000000000..3edf2b4188 --- /dev/null +++ b/src/com/watabou/pixeldungeon/Journal.java @@ -0,0 +1,122 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +import java.util.ArrayList; + +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; + +public class Journal { + + public static enum Feature { + WELL_OF_HEALTH ( "Well of Health" ), + WELL_OF_AWARENESS ( "Well of Awareness" ), + WELL_OF_TRANSMUTATION ( "Well of Transmutation" ), + ALCHEMY ( "Alchemy pot" ), + GARDEN ( "Garden" ), + STATUE ( "Animated statue" ), + + GHOST ( "Sad ghost" ), + WANDMAKER ( "Old wandmaker" ), + TROLL ( "Troll blacksmith" ), + IMP ( "Ambitious imp" ); + + public String desc; + + private Feature( String desc ) { + this.desc = desc; + } + }; + + public static class Record implements Comparable, Bundlable { + + private static final String FEATURE = "feature"; + private static final String DEPTH = "depth"; + + public Feature feature; + public int depth; + + public Record() { + } + + public Record( Feature feature, int depth ) { + this.feature = feature; + this.depth = depth; + } + + @Override + public int compareTo( Record another ) { + return another.depth - depth; + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + feature = Feature.valueOf( bundle.getString( FEATURE ) ); + depth = bundle.getInt( DEPTH ); + } + + @Override + public void storeInBundle( Bundle bundle ) { + bundle.put( FEATURE, feature.toString() ); + bundle.put( DEPTH, depth ); + } + } + + public static ArrayList records; + + public static void reset() { + records = new ArrayList(); + } + + private static final String JOURNAL = "journal"; + + public static void storeInBundle( Bundle bundle ) { + bundle.put( JOURNAL, records ); + } + + public static void restoreFromBundle( Bundle bundle ) { + records = new ArrayList(); + for (Bundlable rec : bundle.getCollection( JOURNAL ) ) { + records.add( (Record) rec ); + } + } + + public static void add( Feature feature ) { + int size = records.size(); + for (int i=0; i < size; i++) { + Record rec = records.get( i ); + if (rec.feature == feature && rec.depth == Dungeon.depth) { + return; + } + } + + records.add( new Record( feature, Dungeon.depth ) ); + } + + public static void remove( Feature feature ) { + int size = records.size(); + for (int i=0; i < size; i++) { + Record rec = records.get( i ); + if (rec.feature == feature && rec.depth == Dungeon.depth) { + records.remove( i ); + return; + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/PixelDungeon.java b/src/com/watabou/pixeldungeon/PixelDungeon.java new file mode 100644 index 0000000000..6f5af9c539 --- /dev/null +++ b/src/com/watabou/pixeldungeon/PixelDungeon.java @@ -0,0 +1,206 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +import android.content.pm.ActivityInfo; +import android.os.Bundle; +import android.util.Log; +import android.view.Display; + +import com.watabou.noosa.Game; +import com.watabou.noosa.audio.Music; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.scenes.TitleScene; + +public class PixelDungeon extends Game { + + public PixelDungeon() { + super( TitleScene.class ); + + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.items.scrolls.ScrollOfUpgrade.class, + "com.watabou.pixeldungeon.items.scrolls.ScrollOfEnhancement" ); + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.actors.blobs.WaterOfHealth.class, + "com.watabou.pixeldungeon.actors.blobs.Light" ); + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.items.rings.RingOfMending.class, + "com.watabou.pixeldungeon.items.rings.RingOfRejuvenation" ); + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.items.wands.WandOfTelekinesis.class, + "com.watabou.pixeldungeon.items.wands.WandOfTelekenesis" ); + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.actors.blobs.Foliage.class, + "com.watabou.pixeldungeon.actors.blobs.Blooming" ); + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.actors.buffs.Shadows.class, + "com.watabou.pixeldungeon.actors.buffs.Rejuvenation" ); + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.items.scrolls.ScrollOfPsionicBlast.class, + "com.watabou.pixeldungeon.items.scrolls.ScrollOfNuclearBlast" ); + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.actors.hero.Hero.class, + "com.watabou.pixeldungeon.actors.Hero" ); + // com.watabou.utils.Bundle.addAlias( + // com.watabou.pixeldungeon.items.weapon.missiles.Javelin.class, + // "com.watabou.pixeldungeon.items.weapon.missiles.Boomerang" ); + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.actors.mobs.npcs.Shopkeeper.class, + "com.watabou.pixeldungeon.actors.mobs.Shopkeeper" ); + // 1.6.1 + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.items.quest.DriedRose.class, + "com.watabou.pixeldungeon.items.DriedRose" ); + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.actors.mobs.npcs.MirrorImage.class, + "com.watabou.pixeldungeon.items.scrolls.ScrollOfMirrorImage.MirrorImage" ); + // 1.6.4 + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.items.rings.RingOfElements.class, + "com.watabou.pixeldungeon.items.rings.RingOfCleansing" ); + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.items.rings.RingOfElements.class, + "com.watabou.pixeldungeon.items.rings.RingOfResistance" ); + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.items.weapon.missiles.Boomerang.class, + "com.watabou.pixeldungeon.items.weapon.missiles.RangersBoomerang" ); + com.watabou.utils.Bundle.addAlias( + com.watabou.pixeldungeon.items.rings.RingOfPower.class, + "com.watabou.pixeldungeon.items.rings.RingOfEnergy" ); + } + + @SuppressWarnings("deprecation") + @Override + protected void onCreate( Bundle savedInstanceState ) { + super.onCreate( savedInstanceState ); + + /* if (android.os.Build.VERSION.SDK_INT >= 19) { + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE | + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_FULLSCREEN | + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY ); + }*/ + + Display display = instance.getWindowManager().getDefaultDisplay(); + boolean landscape = display.getWidth() > display.getHeight(); + + if (Preferences.INSTANCE.getBoolean( Preferences.KEY_LANDSCAPE, false ) != landscape) { + landscape( !landscape ); + } + + Music.INSTANCE.enable( music() ); + Sample.INSTANCE.enable( soundFx() ); + } + + /* + * ---> Prefernces + */ + + public static void landscape( boolean value ) { + Game.instance.setRequestedOrientation( value ? + ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : + ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); + Preferences.INSTANCE.put( Preferences.KEY_LANDSCAPE, value ); + } + + public static boolean landscape() { + return width > height; + } + + public static void scaleUp( boolean value ) { + Preferences.INSTANCE.put( Preferences.KEY_SCALE_UP, value ); + switchScene( TitleScene.class ); + } + + public static boolean scaleUp() { + return Preferences.INSTANCE.getBoolean( Preferences.KEY_SCALE_UP, true ); + } + + public static void zoom( int value ) { + Preferences.INSTANCE.put( Preferences.KEY_ZOOM, value ); + } + + public static int zoom() { + return Preferences.INSTANCE.getInt( Preferences.KEY_ZOOM, 0 ); + } + + public static void music( boolean value ) { + Music.INSTANCE.enable( value ); + Preferences.INSTANCE.put( Preferences.KEY_MUSIC, value ); + } + + public static boolean music() { + return Preferences.INSTANCE.getBoolean( Preferences.KEY_MUSIC, true ); + } + + public static void soundFx( boolean value ) { + Sample.INSTANCE.enable( value ); + Preferences.INSTANCE.put( Preferences.KEY_SOUND_FX, value ); + } + + public static boolean soundFx() { + return Preferences.INSTANCE.getBoolean( Preferences.KEY_SOUND_FX, true ); + } + + public static void brightness( boolean value ) { + Preferences.INSTANCE.put( Preferences.KEY_BRIGHTNESS, value ); + if (scene() instanceof GameScene) { + ((GameScene)scene()).brightness( value ); + } + } + + public static boolean brightness() { + return Preferences.INSTANCE.getBoolean( Preferences.KEY_BRIGHTNESS, false ); + } + + public static void donated( String value ) { + Preferences.INSTANCE.put( Preferences.KEY_DONATED, value ); + } + + public static String donated() { + return Preferences.INSTANCE.getString( Preferences.KEY_DONATED, "" ); + } + + public static void lastClass( int value ) { + Preferences.INSTANCE.put( Preferences.KEY_LAST_CLASS, value ); + } + + public static int lastClass() { + return Preferences.INSTANCE.getInt( Preferences.KEY_LAST_CLASS, 0 ); + } + + public static void intro( boolean value ) { + Preferences.INSTANCE.put( Preferences.KEY_INTRO, value ); + } + + public static boolean intro() { + return Preferences.INSTANCE.getBoolean( Preferences.KEY_INTRO, true ); + } + + /* + * <--- Preferences + */ + + public static void reportException( Exception e ) { + Log.e( "PD", Log.getStackTraceString( e ) ); + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/Preferences.java b/src/com/watabou/pixeldungeon/Preferences.java new file mode 100644 index 0000000000..7fbfdbb798 --- /dev/null +++ b/src/com/watabou/pixeldungeon/Preferences.java @@ -0,0 +1,70 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +import com.watabou.noosa.Game; + +import android.content.SharedPreferences; + +enum Preferences { + + INSTANCE; + + public static final String KEY_LANDSCAPE = "landscape"; + public static final String KEY_SCALE_UP = "scaleup"; + public static final String KEY_MUSIC = "music"; + public static final String KEY_SOUND_FX = "soundfx"; + public static final String KEY_ZOOM = "zoom"; + public static final String KEY_LAST_CLASS = "last_class"; + public static final String KEY_DONATED = "donated"; + public static final String KEY_INTRO = "intro"; + public static final String KEY_BRIGHTNESS = "brightness"; + + private SharedPreferences prefs; + + private SharedPreferences get() { + if (prefs == null) { + prefs = Game.instance.getPreferences( Game.MODE_PRIVATE ); + } + return prefs; + } + + int getInt( String key, int defValue ) { + return get().getInt( key, defValue ); + } + + boolean getBoolean( String key, boolean defValue ) { + return get().getBoolean( key, defValue ); + } + + String getString( String key, String defValue ) { + return get().getString( key, defValue ); + } + + void put( String key, int value ) { + get().edit().putInt( key, value ).commit(); + } + + void put( String key, boolean value ) { + get().edit().putBoolean( key, value ).commit(); + } + + void put( String key, String value ) { + get().edit().putString( key, value ).commit(); + } +} diff --git a/src/com/watabou/pixeldungeon/Rankings.java b/src/com/watabou/pixeldungeon/Rankings.java new file mode 100644 index 0000000000..638de2c67e --- /dev/null +++ b/src/com/watabou/pixeldungeon/Rankings.java @@ -0,0 +1,195 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +import com.watabou.noosa.Game; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; +import com.watabou.utils.SystemTime; + +public enum Rankings { + + INSTANCE; + + public static final int TABLE_SIZE = 6; + + public static final String RANKINGS_FILE = "rankings.dat"; + public static final String DETAILS_FILE = "game_%d.dat"; + + public ArrayList records; + public int lastRecord; + public int totalNumber; + + public void submit( boolean win ) { + + load(); + + Record rec = new Record(); + + rec.info = Dungeon.resultDescription; + rec.win = win; + rec.heroClass = Dungeon.hero.heroClass; + rec.armorTier = Dungeon.hero.tier(); + rec.score = score( win ); + + String gameFile = Utils.format( DETAILS_FILE, SystemTime.now ); + try { + Dungeon.saveGame( gameFile ); + rec.gameFile = gameFile; + } catch (IOException e) { + rec.gameFile = ""; + } + + records.add( rec ); + + Collections.sort( records, scoreComparator ); + + lastRecord = records.indexOf( rec ); + int size = records.size(); + if (size > TABLE_SIZE) { + + Record removedGame; + if (lastRecord == size - 1) { + removedGame = records.remove( size - 2 ); + lastRecord--; + } else { + removedGame = records.remove( size - 1 ); + } + + if (removedGame.gameFile.length() > 0) { + Game.instance.deleteFile( removedGame.gameFile ); + } + } + + totalNumber++; + + Badges.validateGamesPlayed(); + + save(); + } + + private int score( boolean win ) { + return (Statistics.goldCollected + Dungeon.hero.lvl * Dungeon.depth * 100) * (win ? 2 : 1); + } + + private static final String RECORDS = "records"; + private static final String LATEST = "latest"; + private static final String TOTAL = "total"; + + public void save() { + Bundle bundle = new Bundle(); + bundle.put( RECORDS, records ); + bundle.put( LATEST, lastRecord ); + bundle.put( TOTAL, totalNumber ); + + try { + OutputStream output = Game.instance.openFileOutput( RANKINGS_FILE, Game.MODE_PRIVATE ); + Bundle.write( bundle, output ); + output.close(); + } catch (Exception e) { + } + } + + public void load() { + + if (records != null) { + return; + } + + records = new ArrayList(); + + try { + InputStream input = Game.instance.openFileInput( RANKINGS_FILE ); + Bundle bundle = Bundle.read( input ); + input.close(); + + for (Bundlable record : bundle.getCollection( RECORDS )) { + records.add( (Record)record ); + } + lastRecord = bundle.getInt( LATEST ); + + totalNumber = bundle.getInt( TOTAL ); + if (totalNumber == 0) { + totalNumber = records.size(); + } + + } catch (Exception e) { + } + } + + public static class Record implements Bundlable { + + private static final String REASON = "reason"; + private static final String WIN = "win"; + private static final String SCORE = "score"; + private static final String TIER = "tier"; + private static final String GAME = "gameFile"; + + public String info; + public boolean win; + + public HeroClass heroClass; + public int armorTier; + + public int score; + + public String gameFile; + + @Override + public void restoreFromBundle( Bundle bundle ) { + + info = bundle.getString( REASON ); + win = bundle.getBoolean( WIN ); + score = bundle.getInt( SCORE ); + + heroClass = HeroClass.restoreInBundle( bundle ); + armorTier = bundle.getInt( TIER ); + + gameFile = bundle.getString( GAME ); + } + + @Override + public void storeInBundle( Bundle bundle ) { + + bundle.put( REASON, info ); + bundle.put( WIN, win ); + bundle.put( SCORE, score ); + + heroClass.storeInBundle( bundle ); + bundle.put( TIER, armorTier ); + + bundle.put( GAME, gameFile ); + } + } + + private static final Comparator scoreComparator = new Comparator() { + @Override + public int compare( Record lhs, Record rhs ) { + return (int)Math.signum( rhs.score - lhs.score ); + } + }; +} diff --git a/src/com/watabou/pixeldungeon/ResultDescriptions.java b/src/com/watabou/pixeldungeon/ResultDescriptions.java new file mode 100644 index 0000000000..27248a0826 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ResultDescriptions.java @@ -0,0 +1,43 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +public class ResultDescriptions { + + // Mobs + public static final String MOB = "Killed by %s on level %d"; + public static final String BOSS = "Killed by the %s on level %d"; + + // Items + public static final String WAND = "Killed by your own %s on level %d"; + public static final String GLYPH = "Killed by the %s on level %d"; + + // Dungeon features + public static final String TRAP = "Killed by discharge of %s on level %d"; + + // Debuffs & blobs + public static final String BURNING = "Burned to death on level %d"; + public static final String HUNGER = "Starved to death on level %d"; + public static final String POISON = "Died from poison on level %d"; + public static final String GAS = "Died from toxic gas on level %d"; + public static final String BLEEDING = "Bled to death on level %d"; + public static final String OOZE = "Killed by a caustic ooze on level %d"; + public static final String FALL = "Fell to death on level %d"; + + public static final String WIN = "Obtained the Amulet of Yendor"; +} diff --git a/src/com/watabou/pixeldungeon/Statistics.java b/src/com/watabou/pixeldungeon/Statistics.java new file mode 100644 index 0000000000..2b74531774 --- /dev/null +++ b/src/com/watabou/pixeldungeon/Statistics.java @@ -0,0 +1,96 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon; + +import com.watabou.utils.Bundle; + +public class Statistics { + + public static int goldCollected; + public static int deepestFloor; + public static int enemiesSlain; + public static int foodEaten; + public static int potionsCooked; + public static int piranhasKilled; + public static int nightHunt; + public static int ankhsUsed; + + public static float duration; + + public static boolean qualifiedForNoKilling = false; + public static boolean completedWithNoKilling = false; + + public static boolean amuletObtained = false; + + public static void reset() { + + goldCollected = 0; + deepestFloor = 0; + enemiesSlain = 0; + foodEaten = 0; + potionsCooked = 0; + piranhasKilled = 0; + nightHunt = 0; + ankhsUsed = 0; + + duration = 0; + + qualifiedForNoKilling = false; + + amuletObtained = false; + + } + + private static final String GOLD = "score"; + private static final String DEEPEST = "maxDepth"; + private static final String SLAIN = "enemiesSlain"; + private static final String FOOD = "foodEaten"; + private static final String ALCHEMY = "potionsCooked"; + private static final String PIRANHAS = "priranhas"; + private static final String NIGHT = "nightHunt"; + private static final String ANKHS = "ankhsUsed"; + private static final String DURATION = "duration"; + private static final String AMULET = "amuletObtained"; + + public static void storeInBundle( Bundle bundle ) { + bundle.put( GOLD, goldCollected ); + bundle.put( DEEPEST, deepestFloor ); + bundle.put( SLAIN, enemiesSlain ); + bundle.put( FOOD, foodEaten ); + bundle.put( ALCHEMY, potionsCooked ); + bundle.put( PIRANHAS, piranhasKilled ); + bundle.put( NIGHT, nightHunt ); + bundle.put( ANKHS, ankhsUsed ); + bundle.put( DURATION, duration ); + bundle.put( AMULET, amuletObtained ); + } + + public static void restoreFromBundle( Bundle bundle ) { + goldCollected = bundle.getInt( GOLD ); + deepestFloor = bundle.getInt( DEEPEST ); + enemiesSlain = bundle.getInt( SLAIN ); + foodEaten = bundle.getInt( FOOD ); + potionsCooked = bundle.getInt( ALCHEMY ); + piranhasKilled = bundle.getInt( PIRANHAS ); + nightHunt = bundle.getInt( NIGHT ); + ankhsUsed = bundle.getInt( ANKHS ); + duration = bundle.getFloat( DURATION ); + amuletObtained = bundle.getBoolean( AMULET ); + } + +} diff --git a/src/com/watabou/pixeldungeon/actors/Actor.java b/src/com/watabou/pixeldungeon/actors/Actor.java new file mode 100644 index 0000000000..ee6cd9cc74 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/Actor.java @@ -0,0 +1,219 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors; + +import java.util.Arrays; +import java.util.HashSet; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; + +public abstract class Actor implements Bundlable { + + public static final float TICK = 1f; + + private float time; + + protected abstract boolean act(); + + protected void spend( float time ) { + this.time += time; + } + + protected void postpone( float time ) { + if (this.time < now + time) { + this.time = now + time; + } + } + + protected float cooldown() { + return time - now; + } + + protected void diactivate() { + time = Float.MAX_VALUE; + } + + protected void onAdd() {} + + protected void onRemove() {} + + private static final String TIME = "time"; + + @Override + public void storeInBundle( Bundle bundle ) { + bundle.put( TIME, time ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + time = bundle.getFloat( TIME ); + } + + // ********************** + // *** Static members *** + + private static HashSet all = new HashSet(); + private static Actor current; + + private static float now = 0; + + private static Char[] chars = new Char[Level.LENGTH]; + + public static void clear() { + + now = 0; + + Arrays.fill( chars, null ); + all.clear(); + } + + public static void fixTime() { + + if (Dungeon.hero != null && all.contains( Dungeon.hero )) { + Statistics.duration += now; + } + + float min = Float.MAX_VALUE; + for (Actor a : all) { + if (a.time < min) { + min = a.time; + } + } + for (Actor a : all) { + a.time -= min; + } + now = 0; + } + + public static void init() { + + addDelayed( Dungeon.hero, -Float.MIN_VALUE ); + + for (Mob mob : Dungeon.level.mobs) { + add( mob ); + } + + for (Blob blob : Dungeon.level.blobs.values()) { + add( blob ); + } + + current = null; + } + + public static void occupyCell( Char ch ) { + chars[ch.pos] = ch; + } + + public static void freeCell( int pos ) { + chars[pos] = null; + } + + protected static void next() { + current = null; + } + + public static void process() { + + if (current != null) { + return; + } + + boolean doNext; + + do { + now = Float.MAX_VALUE; + current = null; + + Arrays.fill( chars, null ); + + for (Actor actor : all) { + if (actor.time < now) { + now = actor.time; + current = actor; + } + + if (actor instanceof Char) { + Char ch = (Char)actor; + chars[ch.pos] = ch; + } + } + + if (current != null) { + doNext = current.act(); + if (doNext && !Dungeon.hero.isAlive()) { + doNext = false; + current = null; + } + } else { + doNext = false; + } + + } while (doNext); + } + + public static void add( Actor actor ) { + add( actor, now ); + } + + public static void addDelayed( Actor actor, float delay ) { + add( actor, now + delay ); + } + + private static void add( Actor actor, float time ) { + + if (all.contains( actor )) { + return; + } + + all.add( actor ); + actor.time += time; // (+=) => (=) ? + actor.onAdd(); + + if (actor instanceof Char) { + Char ch = (Char)actor; + chars[ch.pos] = ch; + for (Buff buff : ch.buffs()) { + all.add( buff ); + buff.onAdd(); + } + } + } + + public static void remove( Actor actor ) { + + if (actor != null) { + all.remove( actor ); + actor.onRemove(); + } + } + + public static Char findChar( int pos ) { + return chars[pos]; + } + + public static HashSet all() { + return all; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/Char.java b/src/com/watabou/pixeldungeon/actors/Char.java new file mode 100644 index 0000000000..ba3b862b43 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/Char.java @@ -0,0 +1,493 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors; + +import java.util.HashSet; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.buffs.Amok; +import com.watabou.pixeldungeon.actors.buffs.Bleeding; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.actors.buffs.Cripple; +import com.watabou.pixeldungeon.actors.buffs.Frost; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.buffs.Light; +import com.watabou.pixeldungeon.actors.buffs.Roots; +import com.watabou.pixeldungeon.actors.buffs.Shadows; +import com.watabou.pixeldungeon.actors.buffs.Sleep; +import com.watabou.pixeldungeon.actors.buffs.Speed; +import com.watabou.pixeldungeon.actors.buffs.Levitation; +import com.watabou.pixeldungeon.actors.buffs.MindVision; +import com.watabou.pixeldungeon.actors.buffs.Paralysis; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.actors.buffs.Slow; +import com.watabou.pixeldungeon.actors.buffs.Terror; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroSubClass; +import com.watabou.pixeldungeon.actors.mobs.Bestiary; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.PoisonParticle; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.levels.features.Door; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public abstract class Char extends Actor { + + protected static final String TXT_HIT = "%s hit %s"; + protected static final String TXT_KILL = "%s killed you..."; + protected static final String TXT_DEFEAT = "%s defeated %s"; + + private static final String TXT_YOU_MISSED = "%s %s your attack"; + private static final String TXT_SMB_MISSED = "%s %s %s's attack"; + + private static final String TXT_OUT_OF_PARALYSIS = "The pain snapped %s out of paralysis"; + + public int pos = 0; + + public CharSprite sprite; + + public String name = "mob"; + + public int HT; + public int HP; + + protected float baseSpeed = 1; + + public boolean paralysed = false; + public boolean pacified = false; + public boolean rooted = false; + public boolean flying = false; + public int invisible = 0; + + public int viewDistance = 8; + + private HashSet buffs = new HashSet(); + + @Override + protected boolean act() { + Dungeon.level.updateFieldOfView( this ); + return false; + } + + private static final String POS = "pos"; + private static final String TAG_HP = "HP"; + private static final String TAG_HT = "HT"; + private static final String BUFFS = "buffs"; + + @Override + public void storeInBundle( Bundle bundle ) { + + super.storeInBundle( bundle ); + + bundle.put( POS, pos ); + bundle.put( TAG_HP, HP ); + bundle.put( TAG_HT, HT ); + bundle.put( BUFFS, buffs ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + + super.restoreFromBundle( bundle ); + + pos = bundle.getInt( POS ); + HP = bundle.getInt( TAG_HP ); + HT = bundle.getInt( TAG_HT ); + + for (Bundlable b : bundle.getCollection( BUFFS )) { + if (b != null) { + ((Buff)b).attachTo( this ); + } + } + } + + public boolean attack( Char enemy ) { + + boolean visibleFight = Dungeon.visible[pos] || Dungeon.visible[enemy.pos]; + + if (hit( this, enemy, false )) { + + if (visibleFight) { + GLog.i( TXT_HIT, name, enemy.name ); + } + + // Refactoring needed! + int dr = this instanceof Hero && ((Hero)this).usingRanged && ((Hero)this).subClass == HeroSubClass.SNIPER ? + 0 : Random.IntRange( 0, enemy.dr() ); + + int dmg = damageRoll(); + int effectiveDamage = Math.max( dmg - dr, 0 );; + + effectiveDamage = attackProc( enemy, effectiveDamage ); + effectiveDamage = enemy.defenseProc( this, effectiveDamage ); + enemy.damage( effectiveDamage, this ); + + if (visibleFight) { + Sample.INSTANCE.play( Assets.SND_HIT, 1, 1, Random.Float( 0.8f, 1.25f ) ); + } + + if (enemy == Dungeon.hero) { + Dungeon.hero.interrupt(); + } + + enemy.sprite.bloodBurstA( sprite.center(), effectiveDamage ); + enemy.sprite.flash(); + + if (!enemy.isAlive() && visibleFight) { + if (enemy == Dungeon.hero) { + + if (Dungeon.hero.killerGlyph != null) { + + Dungeon.fail( Utils.format( ResultDescriptions.GLYPH, Dungeon.hero.killerGlyph.name(), Dungeon.depth ) ); + GLog.n( TXT_KILL, Dungeon.hero.killerGlyph.name() ); + + } else { + if (Bestiary.isUnique( this )) { + Dungeon.fail( Utils.format( ResultDescriptions.BOSS, name, Dungeon.depth ) ); + } else { + Dungeon.fail( Utils.format( ResultDescriptions.MOB, + Utils.indefinite( name ), Dungeon.depth ) ); + } + + GLog.n( TXT_KILL, name ); + } + + } else { + GLog.i( TXT_DEFEAT, name, enemy.name ); + } + } + + return true; + + } else { + + if (visibleFight) { + String defense = enemy.defenseVerb(); + enemy.sprite.showStatus( CharSprite.NEUTRAL, defense ); + if (this == Dungeon.hero) { + GLog.i( TXT_YOU_MISSED, enemy.name, defense ); + } else { + GLog.i( TXT_SMB_MISSED, enemy.name, defense, name ); + } + + Sample.INSTANCE.play( Assets.SND_MISS ); + } + + return false; + + } + } + + public static boolean hit( Char attacker, Char defender, boolean magic ) { + float acuRoll = Random.Float( attacker.attackSkill( defender ) ); + float defRoll = Random.Float( defender.defenseSkill( attacker ) ); + return (magic ? acuRoll * 2 : acuRoll) >= defRoll; + } + + public int attackSkill( Char target ) { + return 0; + } + + public int defenseSkill( Char enemy ) { + return 0; + } + + public String defenseVerb() { + return "dodged"; + } + + public int dr() { + return 0; + } + + public int damageRoll() { + return 1; + } + + public int attackProc( Char enemy, int damage ) { + return damage; + } + + public int defenseProc( Char enemy, int damage ) { + return damage; + } + + public float speed() { + return buff( Cripple.class ) == null ? baseSpeed : baseSpeed * 0.5f; + } + + public void damage( int dmg, Object src ) { + + if (HP <= 0) { + return; + } + + Buff.detach( this, Frost.class ); + + Class srcClass = src.getClass(); + if (immunities().contains( srcClass )) { + dmg = 0; + } else if (resistances().contains( srcClass )) { + dmg = Random.IntRange( 0, dmg ); + } + + if (buff( Paralysis.class ) != null) { + if (Random.Int( dmg ) >= Random.Int( HP )) { + Buff.detach( this, Paralysis.class ); + if (Dungeon.visible[pos]) { + GLog.i( TXT_OUT_OF_PARALYSIS, name ); + } + } + } + + HP -= dmg; + if (dmg > 0 || src instanceof Char) { + sprite.showStatus( HP > HT / 2 ? + CharSprite.WARNING : + CharSprite.NEGATIVE, + Integer.toString( dmg ) ); + } + if (HP <= 0) { + die( src ); + } + } + + public void destroy() { + HP = 0; + Actor.remove( this ); + Actor.freeCell( pos ); + } + + public void die( Object src ) { + destroy(); + sprite.die(); + } + + public boolean isAlive() { + return HP > 0; + } + + @Override + protected void spend( float time ) { + + float timeScale = 1f; + if (buff( Slow.class ) != null) { + timeScale *= 0.5f; + } + if (buff( Speed.class ) != null) { + timeScale *= 2.0f; + } + + super.spend( time / timeScale ); + } + + public HashSet buffs() { + return buffs; + } + + @SuppressWarnings("unchecked") + public HashSet buffs( Class c ) { + HashSet filtered = new HashSet(); + for (Buff b : buffs) { + if (c.isInstance( b )) { + filtered.add( (T)b ); + } + } + return filtered; + } + + @SuppressWarnings("unchecked") + public T buff( Class c ) { + for (Buff b : buffs) { + if (c.isInstance( b )) { + return (T)b; + } + } + return null; + } + + + public void add( Buff buff ) { + + buffs.add( buff ); + Actor.add( buff ); + + if (sprite != null) { + if (buff instanceof Poison) { + + CellEmitter.center( pos ).burst( PoisonParticle.SPLASH, 5 ); + sprite.showStatus( CharSprite.NEGATIVE, "poisoned" ); + + } else if (buff instanceof Amok) { + + sprite.showStatus( CharSprite.NEGATIVE, "amok" ); + + } else if (buff instanceof Slow) { + + sprite.showStatus( CharSprite.NEGATIVE, "slowed" ); + + } else if (buff instanceof MindVision) { + + sprite.showStatus( CharSprite.POSITIVE, "mind" ); + sprite.showStatus( CharSprite.POSITIVE, "vision" ); + + } else if (buff instanceof Paralysis) { + + sprite.add( CharSprite.State.PARALYSED ); + sprite.showStatus( CharSprite.NEGATIVE, "paralysed" ); + + } else if (buff instanceof Terror) { + + sprite.showStatus( CharSprite.NEGATIVE, "frightened" ); + + } else if (buff instanceof Roots) { + + sprite.showStatus( CharSprite.NEGATIVE, "rooted" ); + + } else if (buff instanceof Cripple) { + + sprite.showStatus( CharSprite.NEGATIVE, "crippled" ); + + } else if (buff instanceof Bleeding) { + + sprite.showStatus( CharSprite.NEGATIVE, "bleeding" ); + + } else if (buff instanceof Sleep) { + sprite.idle(); + } + + else if (buff instanceof Burning) { + sprite.add( CharSprite.State.BURNING ); + } else if (buff instanceof Levitation) { + sprite.add( CharSprite.State.LEVITATING ); + } else if (buff instanceof Frost) { + sprite.add( CharSprite.State.FROZEN ); + } else if (buff instanceof Invisibility) { + if (!(buff instanceof Shadows)) { + sprite.showStatus( CharSprite.POSITIVE, "invisible" ); + } + sprite.add( CharSprite.State.INVISIBLE ); + } + } + } + + public void remove( Buff buff ) { + + buffs.remove( buff ); + Actor.remove( buff ); + + if (buff instanceof Burning) { + sprite.remove( CharSprite.State.BURNING ); + } else if (buff instanceof Levitation) { + sprite.remove( CharSprite.State.LEVITATING ); + } else if (buff instanceof Invisibility && invisible <= 0) { + sprite.remove( CharSprite.State.INVISIBLE ); + } else if (buff instanceof Paralysis) { + sprite.remove( CharSprite.State.PARALYSED ); + } else if (buff instanceof Frost) { + sprite.remove( CharSprite.State.FROZEN ); + } + } + + public void remove( Class buffClass ) { + for (Buff buff : buffs( buffClass )) { + remove( buff ); + } + } + + @Override + protected void onRemove() { + for (Buff buff : buffs.toArray( new Buff[0] )) { + buff.detach(); + } + } + + public void updateSpriteState() { + for (Buff buff:buffs) { + if (buff instanceof Burning) { + sprite.add( CharSprite.State.BURNING ); + } else if (buff instanceof Levitation) { + sprite.add( CharSprite.State.LEVITATING ); + } else if (buff instanceof Invisibility) { + sprite.add( CharSprite.State.INVISIBLE ); + } else if (buff instanceof Paralysis) { + sprite.add( CharSprite.State.PARALYSED ); + } else if (buff instanceof Frost) { + sprite.add( CharSprite.State.FROZEN ); + } else if (buff instanceof Light) { + sprite.add( CharSprite.State.ILLUMINATED ); + } + } + } + + public int stealth() { + return 0; + } + + public void move( int step ) { + if (Dungeon.level.map[pos] == Terrain.OPEN_DOOR) { + Door.leave( pos ); + } + + pos = step; + + if (flying && Dungeon.level.map[pos] == Terrain.DOOR) { + Door.enter( pos ); + } + + if (this != Dungeon.hero) { + sprite.visible = Dungeon.visible[pos]; + } + } + + public int distance( Char other ) { + return Level.distance( pos, other.pos ); + } + + public void onMotionComplete() { + next(); + } + + public void onAttackComplete() { + next(); + } + + public void onOperateComplete() { + next(); + } + + private static final HashSet> EMPTY = new HashSet>(); + + public HashSet> resistances() { + return EMPTY; + } + + public HashSet> immunities() { + return EMPTY; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/Alchemy.java b/src/com/watabou/pixeldungeon/actors/blobs/Alchemy.java new file mode 100644 index 0000000000..fc02374af6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/Alchemy.java @@ -0,0 +1,76 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Journal; +import com.watabou.pixeldungeon.effects.BlobEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.utils.Bundle; + +public class Alchemy extends Blob { + + protected int pos; + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + + for (int i=0; i < LENGTH; i++) { + if (cur[i] > 0) { + pos = i; + break; + } + } + } + + @Override + protected void evolve() { + volume = off[pos] = cur[pos]; + + if (Dungeon.visible[pos]) { + Journal.add( Journal.Feature.ALCHEMY ); + } + } + + @Override + public void seed( int cell, int amount ) { + cur[pos] = 0; + pos = cell; + volume = cur[pos] = amount; + } + + public static void transmute( int cell ) { + Heap heap = Dungeon.level.heaps.get( cell ); + if (heap != null) { + + Item result = heap.transmute(); + if (result != null) { + Dungeon.level.drop( result, cell ).sprite.drop( cell ); + } + } + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + emitter.start( Speck.factory( Speck.BUBBLE ), 0.4f, 0 ); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/Blob.java b/src/com/watabou/pixeldungeon/actors/blobs/Blob.java new file mode 100644 index 0000000000..f92db95370 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/Blob.java @@ -0,0 +1,212 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import java.util.Arrays; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.PixelDungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.effects.BlobEmitter; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.utils.BArray; +import com.watabou.utils.Bundle; + +public class Blob extends Actor { + + public static final int WIDTH = Level.WIDTH; + public static final int HEIGHT = Level.HEIGHT; + public static final int LENGTH = Level.LENGTH; + + public int volume = 0; + + public int[] cur; + protected int[] off; + + public BlobEmitter emitter; + + protected Blob() { + + cur = new int[LENGTH]; + off = new int[LENGTH]; + + volume = 0; + } + + private static final String CUR = "cur"; + private static final String START = "start"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + + if (volume > 0) { + + int start; + for (start=0; start < LENGTH; start++) { + if (cur[start] > 0) { + break; + } + } + int end; + for (end=LENGTH-1; end > start; end--) { + if (cur[end] > 0) { + break; + } + } + + bundle.put( START, start ); + bundle.put( CUR, trim( start, end + 1 ) ); + + } + } + + private int[] trim( int start, int end ) { + int len = end - start; + int[] copy = new int[len]; + System.arraycopy( cur, start, copy, 0, len ); + return copy; + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + + super.restoreFromBundle( bundle ); + + int[] data = bundle.getIntArray( CUR ); + if (data != null) { + int start = bundle.getInt( START ); + for (int i=0; i < data.length; i++) { + cur[i + start] = data[i]; + volume += data[i]; + } + } + + if (Level.resizingNeeded) { + int[] cur = new int[Level.LENGTH]; + Arrays.fill( cur, 0 ); + + int loadedMapSize = Level.loadedMapSize; + for (int i=0; i < loadedMapSize; i++) { + System.arraycopy( this.cur, i * loadedMapSize, cur, i * Level.WIDTH, loadedMapSize ); + } + + this.cur = cur; + } + } + + @Override + public boolean act() { + + spend( TICK ); + + if (volume > 0) { + + volume = 0; + evolve(); + + int[] tmp = off; + off = cur; + cur = tmp; + + } + + return true; + } + + public void use( BlobEmitter emitter ) { + this.emitter = emitter; + } + + protected void evolve() { + + boolean[] notBlocking = BArray.not( Level.solid, null ); + + for (int i=1; i < HEIGHT-1; i++) { + + int from = i * WIDTH + 1; + int to = from + WIDTH - 2; + + for (int pos=from; pos < to; pos++) { + if (notBlocking[pos]) { + + int count = 1; + int sum = cur[pos]; + + if (notBlocking[pos-1]) { + sum += cur[pos-1]; + count++; + } + if (notBlocking[pos+1]) { + sum += cur[pos+1]; + count++; + } + if (notBlocking[pos-WIDTH]) { + sum += cur[pos-WIDTH]; + count++; + } + if (notBlocking[pos+WIDTH]) { + sum += cur[pos+WIDTH]; + count++; + } + + int value = sum >= count ? (sum / count) - 1 : 0; + off[pos] = value; + + volume += value; + } else { + off[pos] = 0; + } + } + } + } + + public void seed( int cell, int amount ) { + cur[cell] += amount; + volume += amount; + } + + public void clear( int cell ) { + volume -= cur[cell]; + cur[cell] = 0; + } + + public String tileDesc() { + return null; + } + + @SuppressWarnings("unchecked") + public static T seed( int cell, int amount, Class type ) { + try { + + T gas = (T)Dungeon.level.blobs.get( type ); + if (gas == null) { + gas = type.newInstance(); + Dungeon.level.blobs.put( type, gas ); + } + + gas.seed( cell, amount ); + + return gas; + + } catch (Exception e) { + PixelDungeon.reportException( e ); + return null; + } + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/Fire.java b/src/com/watabou/pixeldungeon/actors/blobs/Fire.java new file mode 100644 index 0000000000..79fe55a98e --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/Fire.java @@ -0,0 +1,114 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.effects.BlobEmitter; +import com.watabou.pixeldungeon.effects.particles.FlameParticle; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class Fire extends Blob { + + @Override + protected void evolve() { + + boolean[] flamable = Level.flamable; + + int from = WIDTH + 1; + int to = Level.LENGTH - WIDTH - 1; + + boolean observe = false; + + for (int pos=from; pos < to; pos++) { + + int fire; + + if (cur[pos] > 0) { + + burn( pos ); + + fire = cur[pos] - 1; + if (fire <= 0 && flamable[pos]) { + + int oldTile = Dungeon.level.map[pos]; + Level.set( pos, Terrain.EMBERS ); + + observe = true; + GameScene.updateMap( pos ); + if (Dungeon.visible[pos]) { + GameScene.discoverTile( pos, oldTile ); + } + } + + } else { + + if (flamable[pos] && (cur[pos-1] > 0 || cur[pos+1] > 0 || cur[pos-WIDTH] > 0 || cur[pos+WIDTH] > 0)) { + fire = 4; + burn( pos ); + } else { + fire = 0; + } + + } + + volume += (off[pos] = fire); + + } + + if (observe) { + Dungeon.observe(); + } + } + + private void burn( int pos ) { + Char ch = Actor.findChar( pos ); + if (ch != null) { + Buff.affect( ch, Burning.class ).reignite( ch ); + } + + Heap heap = Dungeon.level.heaps.get( pos ); + if (heap != null) { + heap.burn(); + } + } + + public void seed( int cell, int amount ) { + if (cur[cell] == 0) { + volume += amount; + cur[cell] = amount; + } + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + emitter.start( FlameParticle.FACTORY, 0.03f, 0 ); + } + + @Override + public String tileDesc() { + return "A fire is raging here."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/Foliage.java b/src/com/watabou/pixeldungeon/actors/blobs/Foliage.java new file mode 100644 index 0000000000..f6099c31a3 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/Foliage.java @@ -0,0 +1,86 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Journal; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Shadows; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.BlobEmitter; +import com.watabou.pixeldungeon.effects.particles.ShaftParticle; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class Foliage extends Blob { + + @Override + protected void evolve() { + + int from = WIDTH + 1; + int to = Level.LENGTH - WIDTH - 1; + + int[] map = Dungeon.level.map; + boolean regrowth = false; + + boolean visible = false; + + for (int pos=from; pos < to; pos++) { + if (cur[pos] > 0) { + + off[pos] = cur[pos]; + volume += off[pos]; + + if (map[pos] == Terrain.EMBERS) { + map[pos] = Terrain.GRASS; + regrowth = true; + } + + visible = visible || Dungeon.visible[pos]; + + } else { + off[pos] = 0; + } + } + + Hero hero = Dungeon.hero; + if (hero.isAlive() && hero.visibleEnemies() == 0 && cur[hero.pos] > 0) { + Buff.affect( hero, Shadows.class ).prolong(); + } + + if (regrowth) { + GameScene.updateMap(); + } + + if (visible) { + Journal.add( Journal.Feature.GARDEN ); + } + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + emitter.start( ShaftParticle.FACTORY, 0.9f, 0 ); + } + + @Override + public String tileDesc() { + return "Shafts of light pierce the gloom of the underground garden."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/Freezing.java b/src/com/watabou/pixeldungeon/actors/blobs/Freezing.java new file mode 100644 index 0000000000..9ec2aeccbd --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/Freezing.java @@ -0,0 +1,56 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Frost; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.SnowParticle; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.utils.Random; + +public class Freezing { + + // It's not really a blob... + + public static void affect( int cell, Fire fire ) { + + Char ch = Actor.findChar( cell ); + if (ch != null) { + Buff.prolong( ch, Frost.class, Frost.duration( ch ) * Random.Float( 1.0f, 1.5f ) ); + } + + if (fire != null) { + fire.clear( cell ); + } + + Heap heap = Dungeon.level.heaps.get( cell ); + if (heap != null) { + heap.freeze(); + } + + if (Dungeon.visible[cell]) { + CellEmitter.get( cell ).start( SnowParticle.FACTORY, 0.2f, 6 ); + } + + + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/ParalyticGas.java b/src/com/watabou/pixeldungeon/actors/blobs/ParalyticGas.java new file mode 100644 index 0000000000..cae7c22381 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/ParalyticGas.java @@ -0,0 +1,52 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Paralysis; +import com.watabou.pixeldungeon.effects.BlobEmitter; +import com.watabou.pixeldungeon.effects.Speck; + +public class ParalyticGas extends Blob { + + @Override + protected void evolve() { + super.evolve(); + + Char ch; + for (int i=0; i < LENGTH; i++) { + if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) { + Buff.prolong( ch, Paralysis.class, Paralysis.duration( ch ) ); + } + } + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + + emitter.pour( Speck.factory( Speck.PARALYSIS ), 0.6f ); + } + + @Override + public String tileDesc() { + return "A cloud of paralytic gas is swirling here."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/Regrowth.java b/src/com/watabou/pixeldungeon/actors/blobs/Regrowth.java new file mode 100644 index 0000000000..794c0248ac --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/Regrowth.java @@ -0,0 +1,76 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Roots; +import com.watabou.pixeldungeon.effects.BlobEmitter; +import com.watabou.pixeldungeon.effects.particles.LeafParticle; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class Regrowth extends Blob { + + @Override + protected void evolve() { + super.evolve(); + + if (volume > 0) { + + boolean mapUpdated = false; + + for (int i=0; i < LENGTH; i++) { + if (off[i] > 0) { + int c = Dungeon.level.map[i]; + if (c == Terrain.EMPTY || c == Terrain.EMBERS || c == Terrain.EMPTY_DECO) { + + Level.set( i, cur[i] > 9 ? Terrain.HIGH_GRASS : Terrain.GRASS ); + mapUpdated = true; + + } else if (c == Terrain.GRASS && cur[i] > 9) { + + Level.set( i, Terrain.HIGH_GRASS ); + mapUpdated = true; + + } + + Char ch = Actor.findChar( i ); + if (ch != null) { + Buff.prolong( ch, Roots.class, TICK ); + } + } + } + + if (mapUpdated) { + GameScene.updateMap(); + Dungeon.observe(); + } + } + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + + emitter.start( LeafParticle.LEVEL_SPECIFIC, 0.2f, 0 ); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/ToxicGas.java b/src/com/watabou/pixeldungeon/actors/blobs/ToxicGas.java new file mode 100644 index 0000000000..2db7044227 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/ToxicGas.java @@ -0,0 +1,93 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.BlobEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; + +public class ToxicGas extends Blob implements Hero.Doom { + + @Override + protected void evolve() { + super.evolve(); + + int levelDamage = 5 + Dungeon.depth * 5; + + Char ch; + for (int i=0; i < LENGTH; i++) { + if (cur[i] > 0 && (ch = Actor.findChar( i )) != null) { + + int damage = (ch.HT + levelDamage) / 40; + if (damage < 1) { + damage = 1; + } + + ch.damage( damage, this ); + } + } + + Blob blob = Dungeon.level.blobs.get( ParalyticGas.class ); + if (blob != null) { + + int par[] = blob.cur; + + for (int i=0; i < LENGTH; i++) { + + int t = cur[i]; + int p = par[i]; + + if (p >= t) { + volume -= t; + cur[i] = 0; + } else { + blob.volume -= p; + par[i] = 0; + } + } + } + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + + emitter.pour( Speck.factory( Speck.TOXIC ), 0.6f ); + } + + @Override + public String tileDesc() { + return "A greenish cloud of toxic gas is swirling here."; + } + + @Override + public void onDeath() { + + Badges.validateDeathFromGas(); + + Dungeon.fail( Utils.format( ResultDescriptions.GAS, Dungeon.depth ) ); + GLog.n( "You died from a toxic gas.." ); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/WaterOfAwareness.java b/src/com/watabou/pixeldungeon/actors/blobs/WaterOfAwareness.java new file mode 100644 index 0000000000..4a589a3ce3 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/WaterOfAwareness.java @@ -0,0 +1,108 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.Journal; +import com.watabou.pixeldungeon.Journal.Feature; +import com.watabou.pixeldungeon.actors.buffs.Awareness; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.BlobEmitter; +import com.watabou.pixeldungeon.effects.Identification; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.utils.GLog; + +public class WaterOfAwareness extends WellWater { + + private static final String TXT_PROCCED = + "As you take a sip, you feel the knowledge pours into your mind. " + + "Now you know everything about your equipped items. Also you sense " + + "all items on the level and know all its secrets."; + + @Override + protected boolean affectHero( Hero hero ) { + + Sample.INSTANCE.play( Assets.SND_DRINK ); + emitter.parent.add( new Identification( DungeonTilemap.tileCenterToWorld( pos ) ) ); + + hero.belongings.observe(); + + for (int i=0; i < Level.LENGTH; i++) { + + int terr = Dungeon.level.map[i]; + if ((Terrain.flags[terr] & Terrain.SECRET) != 0) { + + Level.set( i, Terrain.discover( terr ) ); + GameScene.updateMap( i ); + + if (Dungeon.visible[i]) { + GameScene.discoverTile( i, terr ); + } + } + } + + Buff.affect( hero, Awareness.class, Awareness.DURATION ); + Dungeon.observe(); + + Dungeon.hero.interrupt(); + + GLog.p( TXT_PROCCED ); + + Journal.remove( Feature.WELL_OF_AWARENESS ); + + return true; + } + + @Override + protected Item affectItem( Item item ) { + if (item.isIdentified()) { + return null; + } else { + item.identify(); + Badges.validateItemLevelAquired( item ); + + emitter.parent.add( new Identification( DungeonTilemap.tileCenterToWorld( pos ) ) ); + + Journal.remove( Feature.WELL_OF_AWARENESS ); + + return item; + } + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + emitter.pour( Speck.factory( Speck.QUESTION ), 0.3f ); + } + + @Override + public String tileDesc() { + return + "Power of knowledge radiates from the water of this well. " + + "Take a sip from it to reveal all secrets of equipped items."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/WaterOfHealth.java b/src/com/watabou/pixeldungeon/actors/blobs/WaterOfHealth.java new file mode 100644 index 0000000000..0710151e02 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/WaterOfHealth.java @@ -0,0 +1,83 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Journal; +import com.watabou.pixeldungeon.Journal.Feature; +import com.watabou.pixeldungeon.actors.buffs.Hunger; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.BlobEmitter; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.particles.ShaftParticle; +import com.watabou.pixeldungeon.items.DewVial; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.potions.PotionOfHealing; +import com.watabou.pixeldungeon.utils.GLog; + +public class WaterOfHealth extends WellWater { + + private static final String TXT_PROCCED = + "As you take a sip, you feel your wounds heal completely."; + + @Override + protected boolean affectHero( Hero hero ) { + + Sample.INSTANCE.play( Assets.SND_DRINK ); + + PotionOfHealing.heal( hero ); + hero.belongings.uncurseEquipped(); + ((Hunger)hero.buff( Hunger.class )).satisfy( Hunger.STARVING ); + + CellEmitter.get( pos ).start( ShaftParticle.FACTORY, 0.2f, 3 ); + + Dungeon.hero.interrupt(); + + GLog.p( TXT_PROCCED ); + + Journal.remove( Feature.WELL_OF_HEALTH ); + + return true; + } + + @Override + protected Item affectItem( Item item ) { + if (item instanceof DewVial && !((DewVial)item).isFull()) { + ((DewVial)item).fill(); + return item; + } + + return null; + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + emitter.start( Speck.factory( Speck.HEALING ), 0.5f, 0 ); + } + + @Override + public String tileDesc() { + return + "Power of health radiates from the water of this well. " + + "Take a sip from it to heal your wounds and satisfy hunger."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/WaterOfTransmutation.java b/src/com/watabou/pixeldungeon/actors/blobs/WaterOfTransmutation.java new file mode 100644 index 0000000000..07c82c348d --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/WaterOfTransmutation.java @@ -0,0 +1,237 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import com.watabou.pixeldungeon.Journal; +import com.watabou.pixeldungeon.Journal.Feature; +import com.watabou.pixeldungeon.effects.BlobEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.Generator.Category; +import com.watabou.pixeldungeon.items.potions.Potion; +import com.watabou.pixeldungeon.items.potions.PotionOfMight; +import com.watabou.pixeldungeon.items.potions.PotionOfStrength; +import com.watabou.pixeldungeon.items.rings.Ring; +import com.watabou.pixeldungeon.items.scrolls.Scroll; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfUpgrade; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfWeaponUpgrade; +import com.watabou.pixeldungeon.items.wands.Wand; +import com.watabou.pixeldungeon.items.weapon.Weapon.Enchantment; +import com.watabou.pixeldungeon.items.weapon.melee.*; +import com.watabou.pixeldungeon.plants.Plant; + +public class WaterOfTransmutation extends WellWater { + + @Override + protected Item affectItem( Item item ) { + + if (item instanceof MeleeWeapon) { + + return changeWeapon( (MeleeWeapon)item ); + + } else if (item instanceof Scroll) { + + Journal.remove( Feature.WELL_OF_TRANSMUTATION ); + return changeScroll( (Scroll)item ); + + } else if (item instanceof Potion) { + + Journal.remove( Feature.WELL_OF_TRANSMUTATION ); + return changePotion( (Potion)item ); + + } else if (item instanceof Ring) { + + Journal.remove( Feature.WELL_OF_TRANSMUTATION ); + return changeRing( (Ring)item ); + + } else if (item instanceof Wand) { + + Journal.remove( Feature.WELL_OF_TRANSMUTATION ); + return changeWand( (Wand)item ); + + } else if (item instanceof Plant.Seed) { + + Journal.remove( Feature.WELL_OF_TRANSMUTATION ); + return changeSeed( (Plant.Seed)item ); + + } else { + return null; + } + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + emitter.start( Speck.factory( Speck.CHANGE ), 0.2f, 0 ); + } + + private MeleeWeapon changeWeapon( MeleeWeapon w ) { + + MeleeWeapon n = null; + + if (w instanceof Knuckles) { + n = new Dagger(); + } else if (w instanceof Dagger) { + n = new Knuckles(); + } + + else if (w instanceof Spear) { + n = new Quarterstaff(); + } else if (w instanceof Quarterstaff) { + n = new Spear(); + } + + else if (w instanceof Sword) { + n = new Mace(); + } else if (w instanceof Mace) { + n = new Sword(); + } + + else if (w instanceof Longsword) { + n = new BattleAxe(); + } else if (w instanceof BattleAxe) { + n = new Longsword(); + } + + else if (w instanceof Glaive) { + n = new WarHammer(); + } else if (w instanceof WarHammer) { + n = new Glaive(); + } + + if (n != null) { + + int level = w.level; + if (level > 0) { + n.upgrade( level ); + } else if (level < 0) { + n.degrade( -level ); + } + + if (w.isEnchanted()) { + n.enchant( Enchantment.random() ); + } + + n.levelKnown = w.levelKnown; + n.cursedKnown = w.cursedKnown; + n.cursed = w.cursed; + + Journal.remove( Feature.WELL_OF_TRANSMUTATION ); + + return n; + } else { + return null; + } + } + + private Ring changeRing( Ring r ) { + Ring n; + do { + n = (Ring)Generator.random( Category.RING ); + } while (n.getClass() == r.getClass()); + + n.level = 0; + + int level = r.level; + if (level > 0) { + n.upgrade( level ); + } else if (level < 0) { + n.degrade( -level ); + } + + n.levelKnown = r.levelKnown; + n.cursedKnown = r.cursedKnown; + n.cursed = r.cursed; + + return n; + } + + private Wand changeWand( Wand w ) { + + Wand n; + do { + n = (Wand)Generator.random( Category.WAND ); + } while (n.getClass() == w.getClass()); + + n.level = 0; + n.upgrade( w.level ); + + n.levelKnown = w.levelKnown; + n.cursedKnown = w.cursedKnown; + n.cursed = w.cursed; + + return n; + } + + private Plant.Seed changeSeed( Plant.Seed s ) { + + Plant.Seed n; + + do { + n = (Plant.Seed)Generator.random( Category.SEED ); + } while (n.getClass() == s.getClass()); + + return n; + } + + private Scroll changeScroll( Scroll s ) { + if (s instanceof ScrollOfUpgrade) { + + return new ScrollOfWeaponUpgrade(); + + } else if (s instanceof ScrollOfWeaponUpgrade) { + + return new ScrollOfUpgrade(); + + } else { + + Scroll n; + do { + n = (Scroll)Generator.random( Category.SCROLL ); + } while (n.getClass() == s.getClass()); + return n; + } + } + + private Potion changePotion( Potion p ) { + if (p instanceof PotionOfStrength) { + + return new PotionOfMight(); + + } else if (p instanceof PotionOfMight) { + + return new PotionOfStrength(); + + } else { + + Potion n; + do { + n = (Potion)Generator.random( Category.POTION ); + } while (n.getClass() == p.getClass()); + return n; + } + } + + @Override + public String tileDesc() { + return + "Power of change radiates from the water of this well. " + + "Throw an item into the well to turn it into something else."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/Web.java b/src/com/watabou/pixeldungeon/actors/blobs/Web.java new file mode 100644 index 0000000000..00695bbf36 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/Web.java @@ -0,0 +1,68 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Roots; +import com.watabou.pixeldungeon.effects.BlobEmitter; +import com.watabou.pixeldungeon.effects.particles.WebParticle; + +public class Web extends Blob { + + @Override + protected void evolve() { + + for (int i=0; i < LENGTH; i++) { + + int offv = cur[i] > 0 ? cur[i] - 1 : 0; + off[i] = offv; + + if (offv > 0) { + + volume += offv; + + Char ch = Actor.findChar( i ); + if (ch != null) { + Buff.prolong( ch, Roots.class, TICK ); + } + } + } + } + + @Override + public void use( BlobEmitter emitter ) { + super.use( emitter ); + + emitter.pour( WebParticle.FACTORY, 0.4f ); + } + + public void seed( int cell, int amount ) { + int diff = amount - cur[cell]; + if (diff > 0) { + cur[cell] = amount; + volume += diff; + } + } + + @Override + public String tileDesc() { + return "Everything is covered with a thick web here."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/blobs/WellWater.java b/src/com/watabou/pixeldungeon/actors/blobs/WellWater.java new file mode 100644 index 0000000000..d59956d6a8 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/blobs/WellWater.java @@ -0,0 +1,147 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.blobs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Journal; +import com.watabou.pixeldungeon.Journal.Feature; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class WellWater extends Blob { + + protected int pos; + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + + for (int i=0; i < LENGTH; i++) { + if (cur[i] > 0) { + pos = i; + break; + } + } + } + + @Override + protected void evolve() { + volume = off[pos] = cur[pos]; + + if (Dungeon.visible[pos]) { + if (this instanceof WaterOfAwareness) { + Journal.add( Feature.WELL_OF_AWARENESS ); + } else if (this instanceof WaterOfHealth) { + Journal.add( Feature.WELL_OF_HEALTH ); + } else if (this instanceof WaterOfTransmutation) { + Journal.add( Feature.WELL_OF_TRANSMUTATION ); + } + } + } + + protected boolean affect() { + + Heap heap; + + if (pos == Dungeon.hero.pos && affectHero( Dungeon.hero )) { + + volume = off[pos] = cur[pos] = 0; + return true; + + } else if ((heap = Dungeon.level.heaps.get( pos )) != null) { + + Item oldItem = heap.peek(); + Item newItem = affectItem( oldItem ); + + if (newItem != null) { + + if (newItem == oldItem) { + + } else if (oldItem.quantity() > 1) { + + oldItem.quantity( oldItem.quantity() - 1 ); + heap.drop( newItem ); + + } else { + heap.replace( oldItem, newItem ); + } + + heap.sprite.link(); + volume = off[pos] = cur[pos] = 0; + + return true; + + } else { + + int newPlace; + do { + newPlace = pos + Level.NEIGHBOURS8[Random.Int( 8 )]; + } while (!Level.passable[newPlace] && !Level.avoid[newPlace]); + Dungeon.level.drop( heap.pickUp(), newPlace ).sprite.drop( pos ); + + return false; + + } + + } else { + + return false; + + } + } + + protected boolean affectHero( Hero hero ) { + return false; + } + + protected Item affectItem( Item item ) { + return null; + } + + @Override + public void seed( int cell, int amount ) { + cur[pos] = 0; + pos = cell; + volume = cur[pos] = amount; + } + + public static void affectCell( int cell ) { + + Class[] waters = {WaterOfHealth.class, WaterOfAwareness.class, WaterOfTransmutation.class}; + + for (ClasswaterClass : waters) { + WellWater water = (WellWater)Dungeon.level.blobs.get( waterClass ); + if (water != null && + water.volume > 0 && + water.pos == cell && + water.affect()) { + + Level.set( cell, Terrain.EMPTY_WELL ); + GameScene.updateMap( cell ); + + return; + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Amok.java b/src/com/watabou/pixeldungeon/actors/buffs/Amok.java new file mode 100644 index 0000000000..48a260a46e --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Amok.java @@ -0,0 +1,33 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Amok extends FlavourBuff { + + @Override + public int icon() { + return BuffIndicator.AMOK; + } + + @Override + public String toString() { + return "Amok"; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Awareness.java b/src/com/watabou/pixeldungeon/actors/buffs/Awareness.java new file mode 100644 index 0000000000..252e901e6f --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Awareness.java @@ -0,0 +1,31 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Dungeon; + +public class Awareness extends FlavourBuff { + + public static final float DURATION = 2f; + + @Override + public void detach() { + super.detach(); + Dungeon.observe(); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Barkskin.java b/src/com/watabou/pixeldungeon/actors/buffs/Barkskin.java new file mode 100644 index 0000000000..e8e53ae8ee --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Barkskin.java @@ -0,0 +1,63 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Barkskin extends Buff { + + private int level = 0; + + @Override + public boolean act() { + if (target.isAlive()) { + + spend( TICK ); + if (--level <= 0) { + detach(); + } + + } else { + + detach(); + + } + + return true; + } + + public int level() { + return level; + } + + public void level( int value ) { + if (level < value) { + level = value; + } + } + + @Override + public int icon() { + return BuffIndicator.BARKSKIN; + } + + @Override + public String toString() { + return "Barkskin"; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Bleeding.java b/src/com/watabou/pixeldungeon/actors/buffs/Bleeding.java new file mode 100644 index 0000000000..32f8d9f07d --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Bleeding.java @@ -0,0 +1,93 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.effects.Splash; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundle; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class Bleeding extends Buff { + + protected int level; + + private static final String LEVEL = "level"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( LEVEL, level ); + + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + level = bundle.getInt( LEVEL ); + } + + public void set( int level ) { + this.level = level; + }; + + @Override + public int icon() { + return BuffIndicator.BLEEDING; + } + + @Override + public String toString() { + return "Bleeding"; + } + + @Override + public boolean act() { + if (target.isAlive()) { + + if ((level = Random.Int( level / 2, level )) > 0) { + + target.damage( level, this ); + if (target.sprite.visible) { + Splash.at( target.sprite.center(), -PointF.PI / 2, PointF.PI / 6, + target.sprite.blood(), Math.min( 10 * level / target.HT, 10 ) ); + } + + if (target == Dungeon.hero && !target.isAlive()) { + Dungeon.fail( Utils.format( ResultDescriptions.BLEEDING, Dungeon.depth ) ); + GLog.n( "You bled to death..." ); + } + + spend( TICK ); + } else { + detach(); + } + + } else { + + detach(); + + } + + return true; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Blindness.java b/src/com/watabou/pixeldungeon/actors/buffs/Blindness.java new file mode 100644 index 0000000000..4ef36a9ff0 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Blindness.java @@ -0,0 +1,40 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Blindness extends FlavourBuff { + + @Override + public void detach() { + super.detach(); + Dungeon.observe(); + } + + @Override + public int icon() { + return BuffIndicator.BLINDNESS; + } + + @Override + public String toString() { + return "Blinded"; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Buff.java b/src/com/watabou/pixeldungeon/actors/buffs/Buff.java new file mode 100644 index 0000000000..0b5aa1632e --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Buff.java @@ -0,0 +1,90 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Buff extends Actor { + + public Char target; + + public boolean attachTo( Char target ) { + + if (target.immunities().contains( getClass() )) { + return false; + } + + this.target = target; + target.add( this ); + + return true; + } + + public void detach() { + target.remove( this ); + } + + @Override + public boolean act() { + diactivate(); + return true; + } + + public int icon() { + return BuffIndicator.NONE; + } + + public static T affect( Char target, Class buffClass ) { + T buff = target.buff( buffClass ); + if (buff != null) { + return buff; + } else { + try { + buff = buffClass.newInstance(); + buff.attachTo( target ); + return buff; + } catch (Exception e) { + return null; + } + } + } + + public static T affect( Char target, Class buffClass, float duration ) { + T buff = affect( target, buffClass ); + buff.spend( duration ); + return buff; + } + + public static T prolong( Char target, Class buffClass, float duration ) { + T buff = affect( target, buffClass ); + buff.postpone( duration ); + return buff; + } + + public static void detach( Buff buff ) { + if (buff != null) { + buff.detach(); + } + } + + public static void detach( Char target, Class cl ) { + detach( target.buff( cl ) ); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Burning.java b/src/com/watabou/pixeldungeon/actors/buffs/Burning.java new file mode 100644 index 0000000000..e88687b2bd --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Burning.java @@ -0,0 +1,154 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.Fire; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.Thief; +import com.watabou.pixeldungeon.effects.particles.ElmoParticle; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.food.ChargrilledMeat; +import com.watabou.pixeldungeon.items.food.MysteryMeat; +import com.watabou.pixeldungeon.items.rings.RingOfElements.Resistance; +import com.watabou.pixeldungeon.items.scrolls.Scroll; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Burning extends Buff implements Hero.Doom { + + private static final String TXT_BURNS_UP = "%s burns up!"; + private static final String TXT_BURNED_TO_DEATH = "You burned to death..."; + + private static final float DURATION = 8f; + + private float left; + + private static final String LEFT = "left"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( LEFT, left ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle(bundle); + left = bundle.getFloat( LEFT ); + } + + @Override + public boolean act() { + + if (target.isAlive()) { + + if (target instanceof Hero) { + Buff.prolong( target, Light.class, TICK * 1.01f ); + } + + target.damage( Random.Int( 1, 5 ), this ); + + if (target instanceof Hero) { + + Item item = ((Hero)target).belongings.randomUnequipped(); + if (item instanceof Scroll) { + + item = item.detach( ((Hero)target).belongings.backpack ); + GLog.w( TXT_BURNS_UP, item.toString() ); + + Heap.burnFX( target.pos ); + + } else if (item instanceof MysteryMeat) { + + item = item.detach( ((Hero)target).belongings.backpack ); + ChargrilledMeat steak = new ChargrilledMeat(); + if (!steak.collect( ((Hero)target).belongings.backpack )) { + Dungeon.level.drop( steak, target.pos ).sprite.drop(); + } + GLog.w( TXT_BURNS_UP, item.toString() ); + + Heap.burnFX( target.pos ); + + } + + } else if (target instanceof Thief && ((Thief)target).item instanceof Scroll) { + + ((Thief)target).item = null; + target.sprite.emitter().burst( ElmoParticle.FACTORY, 6 ); + } + + } else { + detach(); + } + + if (Level.flamable[target.pos]) { + GameScene.add( Blob.seed( target.pos, 4, Fire.class ) ); + } + + spend( TICK ); + left -= TICK; + + if (left <= 0 || + Random.Float() > (2 + (float)target.HP / target.HT) / 3 || + (Level.water[target.pos] && !target.flying)) { + + detach(); + } + + return true; + } + + public void reignite( Char ch ) { + left = duration( ch ); + } + + @Override + public int icon() { + return BuffIndicator.FIRE; + } + + @Override + public String toString() { + return "Burning"; + } + + public static float duration( Char ch ) { + Resistance r = ch.buff( Resistance.class ); + return r != null ? r.durationFactor() * DURATION : DURATION; + } + + @Override + public void onDeath() { + + Badges.validateDeathFromFire(); + + Dungeon.fail( Utils.format( ResultDescriptions.BURNING, Dungeon.depth ) ); + GLog.n( TXT_BURNED_TO_DEATH ); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Charm.java b/src/com/watabou/pixeldungeon/actors/buffs/Charm.java new file mode 100644 index 0000000000..d363accfc1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Charm.java @@ -0,0 +1,56 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.items.rings.RingOfElements.Resistance; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Charm extends FlavourBuff { + + @Override + public boolean attachTo( Char target ) { + if (super.attachTo( target )) { + target.pacified = true; + return true; + } else { + return false; + } + } + + @Override + public void detach() { + target.pacified = false; + super.detach(); + } + + @Override + public int icon() { + return BuffIndicator.HEART; + } + + @Override + public String toString() { + return "Charmed"; + } + + public static float durationFactor( Char ch ) { + Resistance r = ch.buff( Resistance.class ); + return r != null ? r.durationFactor() : 1; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Combo.java b/src/com/watabou/pixeldungeon/actors/buffs/Combo.java new file mode 100644 index 0000000000..9956f47c85 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Combo.java @@ -0,0 +1,67 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.pixeldungeon.utils.GLog; + +public class Combo extends Buff { + + private static String TXT_COMBO = "%d hit combo!"; + + public int count = 0; + + @Override + public int icon() { + return BuffIndicator.COMBO; + } + + @Override + public String toString() { + return "Combo"; + } + + public int hit( Char enemy, int damage ) { + + count++; + + if (count >= 3) { + + Badges.validateMasteryCombo( count ); + + GLog.p( TXT_COMBO, count ); + postpone( 1.41f - count / 10f ); + return (int)(damage * (count - 2) / 5f); + + } else { + + postpone( 1.1f ); + return 0; + + } + } + + @Override + public boolean act() { + detach(); + return true; + } + +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Cripple.java b/src/com/watabou/pixeldungeon/actors/buffs/Cripple.java new file mode 100644 index 0000000000..c50c3b418d --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Cripple.java @@ -0,0 +1,35 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Cripple extends FlavourBuff { + + public static final float DURATION = 10f; + + @Override + public int icon() { + return BuffIndicator.CRIPPLE; + } + + @Override + public String toString() { + return "Crippled"; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/FlavourBuff.java b/src/com/watabou/pixeldungeon/actors/buffs/FlavourBuff.java new file mode 100644 index 0000000000..01cb7ffe59 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/FlavourBuff.java @@ -0,0 +1,28 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +// Special kind of buff, that doesn't perform any kind actions +public class FlavourBuff extends Buff { + + @Override + public boolean act() { + detach(); + return true; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Frost.java b/src/com/watabou/pixeldungeon/actors/buffs/Frost.java new file mode 100644 index 0000000000..18546ce811 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Frost.java @@ -0,0 +1,79 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.food.FrozenCarpaccio; +import com.watabou.pixeldungeon.items.food.MysteryMeat; +import com.watabou.pixeldungeon.items.rings.RingOfElements.Resistance; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Frost extends FlavourBuff { + + private static final float DURATION = 5f; + + @Override + public boolean attachTo( Char target ) { + if (super.attachTo( target )) { + + target.paralysed = true; + Burning.detach( target, Burning.class ); + + if (target instanceof Hero) { + Hero hero = (Hero)target; + Item item = hero.belongings.randomUnequipped(); + if (item instanceof MysteryMeat) { + + item = item.detach( hero.belongings.backpack ); + FrozenCarpaccio carpaccio = new FrozenCarpaccio(); + if (!carpaccio.collect( hero.belongings.backpack )) { + Dungeon.level.drop( carpaccio, target.pos ).sprite.drop(); + } + } + } + + return true; + } else { + return false; + } + } + + @Override + public void detach() { + target.paralysed = false; + super.detach(); + } + + @Override + public int icon() { + return BuffIndicator.FROST; + } + + @Override + public String toString() { + return "Frozen"; + } + + public static float duration( Char ch ) { + Resistance r = ch.buff( Resistance.class ); + return r != null ? r.durationFactor() * DURATION : DURATION; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Fury.java b/src/com/watabou/pixeldungeon/actors/buffs/Fury.java new file mode 100644 index 0000000000..fb2777a471 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Fury.java @@ -0,0 +1,46 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Fury extends Buff { + + public static float LEVEL = 0.4f; + + @Override + public boolean act() { + if (target.HP > target.HT * LEVEL) { + detach(); + } + + spend( TICK ); + + return true; + } + + @Override + public int icon() { + return BuffIndicator.FURY; + } + + @Override + public String toString() { + return "Fury"; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/GasesImmunity.java b/src/com/watabou/pixeldungeon/actors/buffs/GasesImmunity.java new file mode 100644 index 0000000000..fab1d89fb9 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/GasesImmunity.java @@ -0,0 +1,44 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class GasesImmunity extends FlavourBuff { + + public static final float DURATION = 5f; + + @Override + public int icon() { + return BuffIndicator.IMMUNITY; + } + + @Override + public String toString() { + return "Immune to gases"; + } + + public static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Paralysis.class ); + IMMUNITIES.add( ToxicGas.class ); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Hunger.java b/src/com/watabou/pixeldungeon/actors/buffs/Hunger.java new file mode 100644 index 0000000000..4e4ea63c88 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Hunger.java @@ -0,0 +1,159 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.items.rings.RingOfSatiety; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Hunger extends Buff implements Hero.Doom { + + private static final float STEP = 10f; + + public static final float HUNGRY = 260f; + public static final float STARVING = 360f; + + private static final String TXT_HUNGRY = "You are hungry."; + private static final String TXT_STARVING = "You are starving!"; + private static final String TXT_DEATH = "You starved to death..."; + + private float level; + + private static final String LEVEL = "level"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( LEVEL, level ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + level = bundle.getFloat( LEVEL ); + } + + @Override + public boolean act() { + if (target.isAlive()) { + + Hero hero = (Hero)target; + + if (isStarving()) { + + if (Random.Float() < 0.3f && (target.HP > 1 || !target.paralysed)) { + + GLog.n( TXT_STARVING ); + hero.damage( 1, this ); + + hero.interrupt(); + } + } else { + + int bonus = 0; + for (Buff buff : target.buffs( RingOfSatiety.Satiety.class )) { + bonus += ((RingOfSatiety.Satiety)buff).level; + } + + float newLevel = level + STEP - bonus; + boolean statusUpdated = false; + if (newLevel >= STARVING) { + + GLog.n( TXT_STARVING ); + statusUpdated = true; + + hero.interrupt(); + + } else if (newLevel >= HUNGRY && level < HUNGRY) { + + GLog.w( TXT_HUNGRY ); + statusUpdated = true; + + } + level = newLevel; + + if (statusUpdated) { + BuffIndicator.refreshHero(); + } + + } + + float step = ((Hero)target).heroClass == HeroClass.ROGUE ? STEP * 1.2f : STEP; + spend( target.buff( Shadows.class ) == null ? step : step * 1.5f ); + + } else { + + diactivate(); + + } + + return true; + } + + public void satisfy( float energy ) { + level -= energy; + if (level < 0) { + level = 0; + } else if (level > STARVING) { + level = STARVING; + } + + BuffIndicator.refreshHero(); + } + + public boolean isStarving() { + return level >= STARVING; + } + + @Override + public int icon() { + if (level < HUNGRY) { + return BuffIndicator.NONE; + } else if (level < STARVING) { + return BuffIndicator.HUNGER; + } else { + return BuffIndicator.STARVATION; + } + } + + @Override + public String toString() { + if (level < STARVING) { + return "Hungry"; + } else { + return "Starving"; + } + } + + @Override + public void onDeath() { + + Badges.validateDeathFromHunger(); + + Dungeon.fail( Utils.format( ResultDescriptions.HUNGER, Dungeon.depth ) ); + GLog.n( TXT_DEATH ); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Invisibility.java b/src/com/watabou/pixeldungeon/actors/buffs/Invisibility.java new file mode 100644 index 0000000000..cf44544e3c --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Invisibility.java @@ -0,0 +1,60 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Invisibility extends FlavourBuff { + + public static final float DURATION = 15f; + + @Override + public boolean attachTo( Char target ) { + if (super.attachTo( target )) { + target.invisible++; + return true; + } else { + return false; + } + } + + @Override + public void detach() { + target.invisible--; + super.detach(); + } + + @Override + public int icon() { + return BuffIndicator.INVISIBLE; + } + + @Override + public String toString() { + return "Invisible"; + } + + public static void dispel() { + Invisibility buff = Dungeon.hero.buff( Invisibility.class ); + if (buff != null && Dungeon.hero.visibleEnemies() > 0) { + buff.detach(); + } + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Levitation.java b/src/com/watabou/pixeldungeon/actors/buffs/Levitation.java new file mode 100644 index 0000000000..c3d64c850e --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Levitation.java @@ -0,0 +1,55 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Levitation extends FlavourBuff { + + public static final float DURATION = 20f; + + @Override + public boolean attachTo( Char target ) { + if (super.attachTo( target )) { + target.flying = true; + Roots.detach( target, Roots.class ); + return true; + } else { + return false; + } + } + + @Override + public void detach() { + target.flying = false; + Dungeon.level.press( target.pos, target ); + super.detach(); + } + + @Override + public int icon() { + return BuffIndicator.LEVITATION; + } + + @Override + public String toString() { + return "Levitating"; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Light.java b/src/com/watabou/pixeldungeon/actors/buffs/Light.java new file mode 100644 index 0000000000..7f2baa4381 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Light.java @@ -0,0 +1,59 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Light extends FlavourBuff { + + public static final float DURATION = 250f; + public static final int DISTANCE = 4; + + @Override + public boolean attachTo( Char target ) { + if (super.attachTo( target )) { + // When a level is loading, do nothing + if (Dungeon.level != null) { + target.viewDistance = Math.max( Dungeon.level.viewDistance, DISTANCE ); + Dungeon.observe(); + } + return true; + } else { + return false; + } + } + + @Override + public void detach() { + target.viewDistance = Dungeon.level.viewDistance; + Dungeon.observe(); + super.detach(); + } + + @Override + public int icon() { + return BuffIndicator.LIGHT; + } + + @Override + public String toString() { + return "Illuminated"; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/MindVision.java b/src/com/watabou/pixeldungeon/actors/buffs/MindVision.java new file mode 100644 index 0000000000..4032e60ef6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/MindVision.java @@ -0,0 +1,44 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class MindVision extends FlavourBuff { + + public static final float DURATION = 20f; + + public int distance = 2; + + @Override + public int icon() { + return BuffIndicator.MIND_VISION; + } + + @Override + public String toString() { + return "Mind vision"; + } + + @Override + public void detach() { + super.detach(); + Dungeon.observe(); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Ooze.java b/src/com/watabou/pixeldungeon/actors/buffs/Ooze.java new file mode 100644 index 0000000000..564e46d4dd --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Ooze.java @@ -0,0 +1,58 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; + +public class Ooze extends Buff { + + private static final String TXT_HERO_KILLED = "%s killed you..."; + + public int damage = 1; + + @Override + public int icon() { + return BuffIndicator.OOZE; + } + + @Override + public String toString() { + return "Caustic ooze"; + } + + @Override + public boolean act() { + if (target.isAlive()) { + target.damage( damage, this ); + if (!target.isAlive() && target == Dungeon.hero) { + Dungeon.fail( Utils.format( ResultDescriptions.OOZE, Dungeon.depth ) ); + GLog.n( TXT_HERO_KILLED, toString() ); + } + spend( TICK ); + } + if (Level.water[target.pos]) { + detach(); + } + return true; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Paralysis.java b/src/com/watabou/pixeldungeon/actors/buffs/Paralysis.java new file mode 100644 index 0000000000..4623951157 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Paralysis.java @@ -0,0 +1,58 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.items.rings.RingOfElements.Resistance; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Paralysis extends FlavourBuff { + + private static final float DURATION = 10f; + + @Override + public boolean attachTo( Char target ) { + if (super.attachTo( target )) { + target.paralysed = true; + return true; + } else { + return false; + } + } + + @Override + public void detach() { + target.paralysed = false; + super.detach(); + } + + @Override + public int icon() { + return BuffIndicator.PARALYSIS; + } + + @Override + public String toString() { + return "Paralysed"; + } + + public static float duration( Char ch ) { + Resistance r = ch.buff( Resistance.class ); + return r != null ? r.durationFactor() * DURATION : DURATION; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Poison.java b/src/com/watabou/pixeldungeon/actors/buffs/Poison.java new file mode 100644 index 0000000000..fe223d5395 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Poison.java @@ -0,0 +1,98 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.rings.RingOfElements.Resistance; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundle; + +public class Poison extends Buff implements Hero.Doom { + + public static final int DOT = 2; + + protected float left; + + private static final String LEFT = "left"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( LEFT, left ); + + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + left = bundle.getFloat( LEFT ); + } + + public void set( float duration ) { + this.left = duration; + }; + + @Override + public int icon() { + return BuffIndicator.POISON; + } + + @Override + public String toString() { + return "Poisoned"; + } + + @Override + public boolean act() { + if (target.isAlive()) { + + target.damage( DOT, this ); + spend( TICK ); + + if ((left -= TICK) <= 0) { + detach(); + } + + } else { + + detach(); + + } + + return true; + } + + public static float durationFactor( Char ch ) { + Resistance r = ch.buff( Resistance.class ); + return r != null ? r.durationFactor() : 1; + } + + @Override + public void onDeath() { + Badges.validateDeathFromPoison(); + + Dungeon.fail( Utils.format( ResultDescriptions.POISON, Dungeon.depth ) ); + GLog.n( "You died from poison..." ); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Regeneration.java b/src/com/watabou/pixeldungeon/actors/buffs/Regeneration.java new file mode 100644 index 0000000000..790dbdc7f5 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Regeneration.java @@ -0,0 +1,50 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.rings.RingOfMending; + +public class Regeneration extends Buff { + + private static final float REGENERATION_DELAY = 10; + + @Override + public boolean act() { + if (target.isAlive()) { + + if (target.HP < target.HT && !((Hero)target).isStarving()) { + target.HP += 1; + } + + int bonus = 0; + for (Buff buff : target.buffs( RingOfMending.Rejuvenation.class )) { + bonus += ((RingOfMending.Rejuvenation)buff).level; + } + + spend( (float)(REGENERATION_DELAY / Math.pow( 1.2, bonus )) ); + + } else { + + diactivate(); + + } + + return true; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Roots.java b/src/com/watabou/pixeldungeon/actors/buffs/Roots.java new file mode 100644 index 0000000000..932dfbbcea --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Roots.java @@ -0,0 +1,50 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Roots extends FlavourBuff { + + @Override + public boolean attachTo( Char target ) { + if (!target.flying && super.attachTo( target )) { + target.rooted = true; + return true; + } else { + return false; + } + } + + @Override + public void detach() { + target.rooted = false; + super.detach(); + } + + @Override + public int icon() { + return BuffIndicator.ROOTS; + } + + @Override + public String toString() { + return "Rooted"; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Shadows.java b/src/com/watabou/pixeldungeon/actors/buffs/Shadows.java new file mode 100644 index 0000000000..ae6e4fc928 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Shadows.java @@ -0,0 +1,96 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.utils.Bundle; + +public class Shadows extends Invisibility { + + protected float left; + + private static final String LEFT = "left"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( LEFT, left ); + + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + left = bundle.getFloat( LEFT ); + } + + @Override + public boolean attachTo( Char target ) { + if (super.attachTo( target )) { + Sample.INSTANCE.play( Assets.SND_MELD ); + Dungeon.observe(); + return true; + } else { + return false; + } + } + + @Override + public void detach() { + super.detach(); + Dungeon.observe(); + } + + @Override + public boolean act() { + if (target.isAlive()) { + + spend( TICK * 2 ); + + if (--left <= 0 || Dungeon.hero.visibleEnemies() > 0) { + detach(); + } + + } else { + + detach(); + + } + + return true; + } + + public void prolong() { + left = 2; + } + + @Override + public int icon() { + return BuffIndicator.SHADOWS; + } + + @Override + public String toString() { + return "Shadowmelded"; + } + +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Sleep.java b/src/com/watabou/pixeldungeon/actors/buffs/Sleep.java new file mode 100644 index 0000000000..7ffff90e13 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Sleep.java @@ -0,0 +1,24 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +public class Sleep extends FlavourBuff { + + public static final float SWS = 1.5f; + +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Slow.java b/src/com/watabou/pixeldungeon/actors/buffs/Slow.java new file mode 100644 index 0000000000..34f55234fb --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Slow.java @@ -0,0 +1,42 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.items.rings.RingOfElements.Resistance; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Slow extends FlavourBuff { + + private static final float DURATION = 10f; + + @Override + public int icon() { + return BuffIndicator.SLOW; + } + + @Override + public String toString() { + return "Slowed"; + } + + public static float duration( Char ch ) { + Resistance r = ch.buff( Resistance.class ); + return r != null ? r.durationFactor() * DURATION : DURATION; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/SnipersMark.java b/src/com/watabou/pixeldungeon/actors/buffs/SnipersMark.java new file mode 100644 index 0000000000..01ca64f758 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/SnipersMark.java @@ -0,0 +1,33 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class SnipersMark extends FlavourBuff { + + @Override + public int icon() { + return BuffIndicator.MARK; + } + + @Override + public String toString() { + return "Sniper's mark"; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Speed.java b/src/com/watabou/pixeldungeon/actors/buffs/Speed.java new file mode 100644 index 0000000000..cccdc6950c --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Speed.java @@ -0,0 +1,24 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +public class Speed extends FlavourBuff { + + public static final float DURATION = 10f; + +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Terror.java b/src/com/watabou/pixeldungeon/actors/buffs/Terror.java new file mode 100644 index 0000000000..d905e2d81d --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Terror.java @@ -0,0 +1,53 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.utils.Bundle; + +public class Terror extends FlavourBuff { + + public static final float DURATION = 10f; + public Char source; + + @Override + public int icon() { + return BuffIndicator.TERROR; + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + // It's not really correct... + source = Dungeon.hero; + } + + @Override + public String toString() { + return "Terror"; + } + + public static void recover( Char target ) { + Terror terror = target.buff( Terror.class ); + if (terror != null && terror.cooldown() < DURATION) { + target.remove( terror ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/actors/buffs/Weakness.java b/src/com/watabou/pixeldungeon/actors/buffs/Weakness.java new file mode 100644 index 0000000000..52df8f84b8 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/buffs/Weakness.java @@ -0,0 +1,62 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.buffs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.rings.RingOfElements.Resistance; +import com.watabou.pixeldungeon.ui.BuffIndicator; + +public class Weakness extends FlavourBuff { + + private static final float DURATION = 40f; + + @Override + public int icon() { + return BuffIndicator.WEAKNESS; + } + + @Override + public String toString() { + return "Weakened"; + } + + @Override + public boolean attachTo( Char target ) { + if (super.attachTo( target )) { + Hero hero = (Hero)target; + hero.weakened = true; + hero.belongings.discharge(); + + return true; + } else { + return false; + } + } + + @Override + public void detach() { + super.detach(); + ((Hero)target).weakened = false; + } + + public static float duration( Char ch ) { + Resistance r = ch.buff( Resistance.class ); + return r != null ? r.durationFactor() * DURATION : DURATION; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/hero/Belongings.java b/src/com/watabou/pixeldungeon/actors/hero/Belongings.java new file mode 100644 index 0000000000..88a594b338 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/hero/Belongings.java @@ -0,0 +1,299 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.hero; + +import java.util.Iterator; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.KindOfWeapon; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.bags.Bag; +import com.watabou.pixeldungeon.items.keys.IronKey; +import com.watabou.pixeldungeon.items.keys.Key; +import com.watabou.pixeldungeon.items.rings.Ring; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfRemoveCurse; +import com.watabou.pixeldungeon.items.wands.Wand; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Belongings implements Iterable { + + public static final int BACKPACK_SIZE = 19; + + private Hero owner; + + public Bag backpack; + + public KindOfWeapon weapon = null; + public Armor armor = null; + public Ring ring1 = null; + public Ring ring2 = null; + + public Belongings( Hero owner ) { + this.owner = owner; + + backpack = new Bag() {{ + name = "backpack"; + size = BACKPACK_SIZE; + }}; + backpack.owner = owner; + } + + private static final String WEAPON = "weapon"; + private static final String ARMOR = "armor"; + private static final String RING1 = "ring1"; + private static final String RING2 = "ring2"; + + public void storeInBundle( Bundle bundle ) { + + backpack.storeInBundle( bundle ); + + bundle.put( WEAPON, weapon ); + bundle.put( ARMOR, armor ); + bundle.put( RING1, ring1 ); + bundle.put( RING2, ring2 ); + } + + public void restoreFromBundle( Bundle bundle ) { + + backpack.clear(); + backpack.restoreFromBundle( bundle ); + + weapon = (KindOfWeapon)bundle.get( WEAPON ); + if (weapon != null) { + weapon.activate( owner ); + } + + armor = (Armor)bundle.get( ARMOR ); + + ring1 = (Ring)bundle.get( RING1 ); + if (ring1 != null) { + ring1.activate( owner ); + } + + ring2 = (Ring)bundle.get( RING2 ); + if (ring2 != null) { + ring2.activate( owner ); + } + } + + @SuppressWarnings("unchecked") + public T getItem( Class itemClass ) { + + for (Item item : this) { + if (itemClass.isInstance( item )) { + return (T)item; + } + } + + return null; + } + + @SuppressWarnings("unchecked") + public T getKey( Class kind, int depth ) { + + for (Item item : backpack) { + if (item.getClass() == kind && ((Key)item).depth == depth) { + return (T)item; + } + } + + return null; + } + + public void countIronKeys() { + + IronKey.curDepthQunatity = 0; + + for (Item item : backpack) { + if (item instanceof IronKey && ((IronKey)item).depth == Dungeon.depth) { + IronKey.curDepthQunatity = item.quantity(); + return; + } + } + } + + public void identify() { + for (Item item : this) { + item.identify(); + } + } + + public void observe() { + if (weapon != null) { + weapon.identify(); + Badges.validateItemLevelAquired( weapon ); + } + if (armor != null) { + armor.identify(); + Badges.validateItemLevelAquired( armor ); + } + if (ring1 != null) { + ring1.identify(); + Badges.validateItemLevelAquired( ring1 ); + } + if (ring2 != null) { + ring2.identify(); + Badges.validateItemLevelAquired( ring2 ); + } + for (Item item : backpack) { + item.cursedKnown = true; + } + } + + public void uncurseEquipped() { + ScrollOfRemoveCurse.uncurse( owner, armor, weapon, ring1, ring2 ); + } + + public Item randomUnequipped() { + return Random.element( backpack.items ); + } + + public void resurrect( int depth ) { + + for (Item item : backpack.items.toArray( new Item[0])) { + if (item instanceof Key) { + if (((Key)item).depth == depth) { + item.detachAll( backpack ); + } + } else if (item.unique) { + + } else if (!item.isEquipped( owner )) { + item.detachAll( backpack ); + } + } + + if (weapon != null) { + weapon.cursed = false; + weapon.activate( owner ); + } + + if (armor != null) { + armor.cursed = false; + } + + if (ring1 != null) { + ring1.cursed = false; + ring1.activate( owner ); + } + if (ring2 != null) { + ring2.cursed = false; + ring2.activate( owner ); + } + } + + public int charge( boolean full) { + + int count = 0; + + for (Item item : this) { + if (item instanceof Wand) { + Wand wand = (Wand)item; + if (wand.curCharges < wand.maxCharges) { + wand.curCharges = full ? wand.maxCharges : wand.curCharges + 1; + count++; + + wand.updateQuickslot(); + } + } + } + + return count; + } + + public int discharge() { + + int count = 0; + + for (Item item : this) { + if (item instanceof Wand) { + Wand wand = (Wand)item; + if (wand.curCharges > 0) { + wand.curCharges--; + count++; + + wand.updateQuickslot(); + } + } + } + + return count; + } + + @Override + public Iterator iterator() { + return new ItemIterator(); + } + + private class ItemIterator implements Iterator { + + private int index = 0; + + private Iterator backpackIterator = backpack.iterator(); + + private Item[] equipped = {weapon, armor, ring1, ring2}; + private int backpackIndex = equipped.length; + + @Override + public boolean hasNext() { + + for (int i=index; i < backpackIndex; i++) { + if (equipped[i] != null) { + return true; + } + } + + return backpackIterator.hasNext(); + } + + @Override + public Item next() { + + while (index < backpackIndex) { + Item item = equipped[index++]; + if (item != null) { + return item; + } + } + + return backpackIterator.next(); + } + + @Override + public void remove() { + switch (index) { + case 0: + equipped[0] = weapon = null; + break; + case 1: + equipped[1] = armor = null; + break; + case 2: + equipped[2] = ring1 = null; + break; + case 3: + equipped[3] = ring2 = null; + break; + default: + backpackIterator.remove(); + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/actors/hero/Hero.java b/src/com/watabou/pixeldungeon/actors/hero/Hero.java new file mode 100644 index 0000000000..daf8d57404 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/hero/Hero.java @@ -0,0 +1,1334 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.hero; + +import java.util.ArrayList; +import java.util.HashSet; + +import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Bones; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.GamesInProgress; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Barkskin; +import com.watabou.pixeldungeon.actors.buffs.Bleeding; +import com.watabou.pixeldungeon.actors.buffs.Blindness; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.actors.buffs.Combo; +import com.watabou.pixeldungeon.actors.buffs.Cripple; +import com.watabou.pixeldungeon.actors.buffs.Fury; +import com.watabou.pixeldungeon.actors.buffs.GasesImmunity; +import com.watabou.pixeldungeon.actors.buffs.Hunger; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.buffs.Light; +import com.watabou.pixeldungeon.actors.buffs.Ooze; +import com.watabou.pixeldungeon.actors.buffs.Paralysis; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.actors.buffs.Regeneration; +import com.watabou.pixeldungeon.actors.buffs.Roots; +import com.watabou.pixeldungeon.actors.buffs.Charm; +import com.watabou.pixeldungeon.actors.buffs.SnipersMark; +import com.watabou.pixeldungeon.actors.buffs.Weakness; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.CheckedCell; +import com.watabou.pixeldungeon.effects.Flare; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.Amulet; +import com.watabou.pixeldungeon.items.Ankh; +import com.watabou.pixeldungeon.items.DewVial; +import com.watabou.pixeldungeon.items.Dewdrop; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Heap.Type; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.KindOfWeapon; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.keys.GoldenKey; +import com.watabou.pixeldungeon.items.keys.Key; +import com.watabou.pixeldungeon.items.keys.SkeletonKey; +import com.watabou.pixeldungeon.items.keys.IronKey; +import com.watabou.pixeldungeon.items.potions.PotionOfStrength; +import com.watabou.pixeldungeon.items.rings.RingOfAccuracy; +import com.watabou.pixeldungeon.items.rings.RingOfDetection; +import com.watabou.pixeldungeon.items.rings.RingOfElements; +import com.watabou.pixeldungeon.items.rings.RingOfEvasion; +import com.watabou.pixeldungeon.items.rings.RingOfHaste; +import com.watabou.pixeldungeon.items.rings.RingOfShadows; +import com.watabou.pixeldungeon.items.rings.RingOfThorns; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfMagicMapping; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfRecharging; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfUpgrade; +import com.watabou.pixeldungeon.items.wands.Wand; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.items.weapon.melee.MeleeWeapon; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.levels.features.AlchemyPot; +import com.watabou.pixeldungeon.levels.features.Chasm; +import com.watabou.pixeldungeon.plants.Earthroot; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.scenes.InterlevelScene; +import com.watabou.pixeldungeon.scenes.SurfaceScene; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.HeroSprite; +import com.watabou.pixeldungeon.ui.AttackIndicator; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.pixeldungeon.ui.QuickSlot; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.windows.WndMessage; +import com.watabou.pixeldungeon.windows.WndResurrect; +import com.watabou.pixeldungeon.windows.WndTradeItem; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Hero extends Char { + + private static final String TXT_LEAVE = "One does not simply leave Pixel Dungeon."; + + private static final String TXT_LEVEL_UP = "level up!"; + private static final String TXT_NEW_LEVEL = + "Welcome to level %d! Now you are healthier and more focused. " + + "It's easier for you to hit enemies and dodge their attacks."; + + public static final String TXT_YOU_NOW_HAVE = "You now have %s"; + + private static final String TXT_SOMETHING_ELSE = "There is something else here"; + private static final String TXT_LOCKED_CHEST = "This chest is locked and you don't have matching key"; + private static final String TXT_LOCKED_DOOR = "You don't have a matching key"; + private static final String TXT_NOTICED_SMTH = "You noticed something"; + + private static final String TXT_WAIT = "..."; + private static final String TXT_SEARCH = "search"; + + public static final int STARTING_STR = 10; + + private static final float TIME_TO_REST = 1f; + private static final float TIME_TO_SEARCH = 2f; + + public HeroClass heroClass = HeroClass.ROGUE; + public HeroSubClass subClass = HeroSubClass.NONE; + + private int attackSkill = 10; + private int defenseSkill = 5; + + public boolean ready = false; + public HeroAction curAction = null; + public HeroAction lastAction = null; + + private Char enemy; + + public Armor.Glyph killerGlyph = null; + + private Item theKey; + + public boolean restoreHealth = false; + + public boolean usingRanged = false; + public Belongings belongings; + + public int STR; + public boolean weakened = false; + + public float awareness; + + public int lvl = 1; + public int exp = 0; + + private ArrayList visibleEnemies; + + public Hero() { + super(); + name = "you"; + + HP = HT = 20; + STR = STARTING_STR; + awareness = 0.1f; + + belongings = new Belongings( this ); + + visibleEnemies = new ArrayList(); + } + + public int STR() { + return weakened ? STR - 2 : STR; + } + + private static final String ATTACK = "attackSkill"; + private static final String DEFENSE = "defenseSkill"; + private static final String STRENGTH = "STR"; + private static final String LEVEL = "lvl"; + private static final String EXPERIENCE = "exp"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + + heroClass.storeInBundle( bundle ); + subClass.storeInBundle( bundle ); + + bundle.put( ATTACK, attackSkill ); + bundle.put( DEFENSE, defenseSkill ); + + bundle.put( STRENGTH, STR ); + + bundle.put( LEVEL, lvl ); + bundle.put( EXPERIENCE, exp ); + + belongings.storeInBundle( bundle ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + + heroClass = HeroClass.restoreInBundle( bundle ); + subClass = HeroSubClass.restoreInBundle( bundle ); + + attackSkill = bundle.getInt( ATTACK ); + defenseSkill = bundle.getInt( DEFENSE ); + + STR = bundle.getInt( STRENGTH ); + updateAwareness(); + + lvl = bundle.getInt( LEVEL ); + exp = bundle.getInt( EXPERIENCE ); + + belongings.restoreFromBundle( bundle ); + } + + public static void preview( GamesInProgress.Info info, Bundle bundle ) { + // Refactoring needed! + Armor armor = (Armor)bundle.get( "armor" ); + info.armor = armor == null ? 0 : armor.tier; + info.level = bundle.getInt( LEVEL ); + } + + public String className() { + return subClass == null || subClass == HeroSubClass.NONE ? heroClass.title() : subClass.title(); + } + + public void live() { + Buff.affect( this, Regeneration.class ); + Buff.affect( this, Hunger.class ); + } + + public int tier() { + return belongings.armor == null ? 0 : belongings.armor.tier; + } + + public boolean shoot( Char enemy, Weapon wep ) { + + // Ugly... + usingRanged = true; + + KindOfWeapon curWep = belongings.weapon; + belongings.weapon = wep; + + boolean result = attack( enemy ); + + belongings.weapon = curWep; + usingRanged = false; + + return result; + } + + @Override + public int attackSkill( Char target ) { + + int bonus = 0; + for (Buff buff : buffs( RingOfAccuracy.Accuracy.class )) { + bonus += ((RingOfAccuracy.Accuracy)buff).level; + } + float accuracy = (bonus == 0) ? 1 : (float)Math.pow( 1.4, bonus ); + if (usingRanged && Level.distance( pos, target.pos ) == 1) { + accuracy *= 0.5f; + } + + if (belongings.weapon != null) { + return (int)(attackSkill * accuracy * belongings.weapon.acuracyFactor( this )); + } else { + return (int)(attackSkill * accuracy); + } + } + + @Override + public int defenseSkill( Char enemy ) { + + int bonus = 0; + for (Buff buff : buffs( RingOfEvasion.Evasion.class )) { + bonus += ((RingOfEvasion.Evasion)buff).level; + } + float evasion = bonus == 0 ? 1 : (float)Math.pow( 1.2, bonus ); + if (paralysed) { + evasion /= 2; + } + + int aEnc = belongings.armor != null ? belongings.armor.STR - STR() : 0; + + if (aEnc > 0) { + return (int)(defenseSkill * evasion / Math.pow( 1.5, aEnc )); + } else { + + if (heroClass == HeroClass.ROGUE) { + + if (curAction != null && subClass == HeroSubClass.FREERUNNER && !isStarving()) { + evasion *= 2; + } + + return (int)((defenseSkill - aEnc) * evasion); + } else { + return (int)(defenseSkill * evasion); + } + } + } + + @Override + public int dr() { + int dr = belongings.armor != null ? Math.max( belongings.armor.DR, 0 ) : 0; + Barkskin barkskin = buff( Barkskin.class ); + if (barkskin != null) { + dr += barkskin.level(); + } + return dr; + } + + @Override + public int damageRoll() { + int dmg; + if (belongings.weapon != null) { + dmg = belongings.weapon.damageRoll( this ); + } else { + dmg = STR() > 10 ? Random.IntRange( 1, STR() - 9 ) : 1; + } + return buff( Fury.class ) != null ? (int)(dmg * 1.5f) : dmg; + } + + @Override + public float speed() { + + int aEnc = belongings.armor != null ? belongings.armor.STR - STR() : 0; + if (aEnc > 0) { + + return (float)(super.speed() * Math.pow( 1.3, -aEnc )); + + } else { + + float speed = super.speed(); + return ((HeroSprite)sprite).sprint( subClass == HeroSubClass.FREERUNNER && !isStarving() ) ? 1.6f * speed : speed; + + } + } + + public float attackDelay() { + if (belongings.weapon != null) { + + return belongings.weapon.speedFactor( this ); + + } else { + return 1f; + } + } + + @Override + public void spend( float time ) { + int hasteLevel = 0; + for (Buff buff : buffs( RingOfHaste.Haste.class )) { + hasteLevel += ((RingOfHaste.Haste)buff).level; + } + super.spend( hasteLevel == 0 ? time : (float)(time * Math.pow( 1.1, -hasteLevel )) ); + }; + + public void spendAndNext( float time ) { + busy(); + spend( time ); + next(); + } + + @Override + public boolean act() { + + super.act(); + + if (paralysed) { + + curAction = null; + + spendAndNext( TICK ); + return false; + } + + checkVisibleMobs(); + AttackIndicator.updateState(); + + if (curAction == null) { + + if (restoreHealth) { + if (isStarving() || HP >= HT) { + restoreHealth = false; + } else { + spend( TIME_TO_REST ); next(); + return false; + } + } + + ready(); + + } else { + + restoreHealth = false; + + ready = false; + + if (curAction instanceof HeroAction.Move) { + + actMove( (HeroAction.Move)curAction ); + + } else + if (curAction instanceof HeroAction.Interact) { + + actInteract( (HeroAction.Interact)curAction ); + + } else + if (curAction instanceof HeroAction.Buy) { + + actBuy( (HeroAction.Buy)curAction ); + + }else + if (curAction instanceof HeroAction.PickUp) { + + actPickUp( (HeroAction.PickUp)curAction ); + + } else + if (curAction instanceof HeroAction.OpenChest) { + + actOpenChest( (HeroAction.OpenChest)curAction ); + + } else + if (curAction instanceof HeroAction.Unlock) { + + actUnlock( (HeroAction.Unlock)curAction ); + + } else + if (curAction instanceof HeroAction.Descend) { + + actDescend( (HeroAction.Descend)curAction ); + + } else + if (curAction instanceof HeroAction.Ascend) { + + actAscend( (HeroAction.Ascend)curAction ); + + } else + if (curAction instanceof HeroAction.Attack) { + + actAttack( (HeroAction.Attack)curAction ); + + } else + if (curAction instanceof HeroAction.Cook) { + + actCook( (HeroAction.Cook)curAction ); + + } + } + + return false; + } + + public void busy() { + ready = false; + } + + private void ready() { + sprite.idle(); + curAction = null; + ready = true; + + GameScene.ready(); + } + + public void interrupt() { + if (curAction != null && curAction.dst != pos) { + lastAction = curAction; + } + curAction = null; + } + + public void resume() { + curAction = lastAction; + lastAction = null; + act(); + } + + private void actMove( HeroAction.Move action ) { + + if (getCloser( action.dst )) { + + } else { + if (Dungeon.level.map[pos] == Terrain.SIGN) { + GameScene.show( new WndMessage( Dungeon.tip() ) ); + } + ready(); + } + } + + private void actInteract( HeroAction.Interact action ) { + + Mob.NPC npc = action.npc; + + if (Level.adjacent( pos, npc.pos )) { + + ready(); + sprite.turnTo( pos, npc.pos ); + npc.interact(); + + } else { + + if (Level.fieldOfView[npc.pos] && getCloser( npc.pos )) { + + } else { + ready(); + } + + } + } + + private void actBuy( HeroAction.Buy action ) { + int dst = action.dst; + if (pos == dst || Level.adjacent( pos, dst )) { + + ready(); + + Heap heap = Dungeon.level.heaps.get( dst ); + if (heap != null && heap.type == Type.FOR_SALE && heap.size() == 1) { + GameScene.show( new WndTradeItem( heap, true ) ); + } + + } else if (getCloser( dst )) { + + } else { + ready(); + } + } + + private void actCook( HeroAction.Cook action ) { + int dst = action.dst; + if (Dungeon.visible[dst]) { + + ready(); + AlchemyPot.operate( this, dst ); + + } else if (getCloser( dst )) { + + } else { + ready(); + } + } + + private void actPickUp( HeroAction.PickUp action ) { + int dst = action.dst; + if (pos == dst) { + + Heap heap = Dungeon.level.heaps.get( pos ); + if (heap != null) { + Item item = heap.pickUp(); + if (item.doPickUp( this )) { + + if (item instanceof Dewdrop) { + + } else { + + if ((item instanceof ScrollOfUpgrade && ((ScrollOfUpgrade)item).isKnown()) || + (item instanceof PotionOfStrength && ((PotionOfStrength)item).isKnown())) { + GLog.p( TXT_YOU_NOW_HAVE, item.name() ); + } else { + GLog.i( TXT_YOU_NOW_HAVE, item.name() ); + } + } + + if (!heap.isEmpty()) { + GLog.i( TXT_SOMETHING_ELSE ); + } + curAction = null; + } else { + Dungeon.level.drop( item, pos ).sprite.drop(); + ready(); + } + } else { + ready(); + } + + } else if (getCloser( dst )) { + + } else { + ready(); + } + } + + private void actOpenChest( HeroAction.OpenChest action ) { + int dst = action.dst; + if (Level.adjacent( pos, dst ) || pos == dst) { + + Heap heap = Dungeon.level.heaps.get( dst ); + if (heap != null && + (heap.type == Type.CHEST || heap.type == Type.TOMB || heap.type == Type.SKELETON || + heap.type == Type.LOCKED_CHEST || heap.type == Type.CRYSTAL_CHEST)) { + + theKey = null; + + if (heap.type == Type.LOCKED_CHEST || heap.type == Type.CRYSTAL_CHEST) { + + theKey = belongings.getKey( GoldenKey.class, Dungeon.depth ); + + if (theKey == null) { + GLog.w( TXT_LOCKED_CHEST ); + ready(); + return; + } + } + + switch (heap.type) { + case TOMB: + Sample.INSTANCE.play( Assets.SND_TOMB ); + Camera.main.shake( 1, 0.5f ); + break; + case SKELETON: + break; + default: + Sample.INSTANCE.play( Assets.SND_UNLOCK ); + } + + spend( Key.TIME_TO_UNLOCK ); + sprite.operate( dst ); + + } else { + ready(); + } + + } else if (getCloser( dst )) { + + } else { + ready(); + } + } + + private void actUnlock( HeroAction.Unlock action ) { + int doorCell = action.dst; + if (Level.adjacent( pos, doorCell )) { + + theKey = null; + int door = Dungeon.level.map[doorCell]; + + if (door == Terrain.LOCKED_DOOR) { + + theKey = belongings.getKey( IronKey.class, Dungeon.depth ); + + } else if (door == Terrain.LOCKED_EXIT) { + + theKey = belongings.getKey( SkeletonKey.class, Dungeon.depth ); + + } + + if (theKey != null) { + + spend( Key.TIME_TO_UNLOCK ); + sprite.operate( doorCell ); + + Sample.INSTANCE.play( Assets.SND_UNLOCK ); + + } else { + GLog.w( TXT_LOCKED_DOOR ); + ready(); + } + + } else if (getCloser( doorCell )) { + + } else { + ready(); + } + } + + private void actDescend( HeroAction.Descend action ) { + int stairs = action.dst; + if (pos == stairs && pos == Dungeon.level.exit) { + + curAction = null; + + Hunger hunger = buff( Hunger.class ); + if (hunger != null && !hunger.isStarving()) { + hunger.satisfy( -Hunger.STARVING / 10 ); + } + + InterlevelScene.mode = InterlevelScene.Mode.DESCEND; + Game.switchScene( InterlevelScene.class ); + + } else if (getCloser( stairs )) { + + } else { + ready(); + } + } + + private void actAscend( HeroAction.Ascend action ) { + int stairs = action.dst; + if (pos == stairs && pos == Dungeon.level.entrance) { + + if (Dungeon.depth == 1) { + + if (belongings.getItem( Amulet.class ) == null) { + GameScene.show( new WndMessage( TXT_LEAVE ) ); + ready(); + } else { + Dungeon.deleteGame( Dungeon.hero.heroClass, true ); + Game.switchScene( SurfaceScene.class ); + } + + } else { + + curAction = null; + + Hunger hunger = buff( Hunger.class ); + if (hunger != null && !hunger.isStarving()) { + hunger.satisfy( -Hunger.STARVING / 10 ); + } + + InterlevelScene.mode = InterlevelScene.Mode.ASCEND; + Game.switchScene( InterlevelScene.class ); + } + + } else if (getCloser( stairs )) { + + } else { + ready(); + } + } + + private void actAttack( HeroAction.Attack action ) { + + enemy = action.target; + + if (Level.adjacent( pos, enemy.pos ) && enemy.isAlive() && !pacified) { + + spend( attackDelay() ); + sprite.attack( enemy.pos ); + + } else { + + if (Level.fieldOfView[enemy.pos] && getCloser( enemy.pos )) { + + } else { + ready(); + } + + } + } + + public void rest( boolean tillHealthy ) { + spendAndNext( TIME_TO_REST ); + if (!tillHealthy) { + sprite.showStatus( CharSprite.DEFAULT, TXT_WAIT ); + } + restoreHealth = tillHealthy; + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (belongings.weapon != null) { + + KindOfWeapon weapon = belongings.weapon; + weapon.proc( this, enemy, damage ); + + switch (subClass) { + case GLADIATOR: + if (weapon instanceof MeleeWeapon) { + damage += Buff.affect( this, Combo.class ).hit( enemy, damage ); + } + break; + case BATTLEMAGE: + if (weapon instanceof Wand) { + Wand wand = (Wand)weapon; + if (wand.curCharges < wand.maxCharges && damage > 0) { + + wand.curCharges++; + if (Dungeon.quickslot == wand) { + QuickSlot.refresh(); + } + + ScrollOfRecharging.charge( this ); + } + damage += wand.curCharges; + } + case SNIPER: + if (usingRanged) { + Buff.prolong( enemy, SnipersMark.class, attackDelay() * 1.1f ); + } + break; + default: + } + } + + return damage; + } + + @Override + public int defenseProc( Char enemy, int damage ) { + + RingOfThorns.Thorns thorns = buff( RingOfThorns.Thorns.class ); + if (thorns != null) { + int dmg = Random.IntRange( 0, damage ); + if (dmg > 0) { + enemy.damage( dmg, thorns ); + } + } + + Earthroot.Armor armor = buff( Earthroot.Armor.class ); + if (armor != null) { + damage = armor.absorb( damage ); + } + + if (belongings.armor != null) { + damage = belongings.armor.proc( enemy, this, damage ); + } + + return damage; + } + + @Override + public void damage( int dmg, Object src ) { + restoreHealth = false; + super.damage( dmg, src ); + + if (subClass == HeroSubClass.BERSERKER && 0 < HP && HP <= HT * Fury.LEVEL) { + Buff.affect( this, Fury.class ); + } + } + + private void checkVisibleMobs() { + + ArrayList visible = new ArrayList(); + + boolean newMob = false; + + for (Mob m : Dungeon.level.mobs) { + if (Level.fieldOfView[ m.pos ] && m.hostile) { + visible.add( m ); + if (!visibleEnemies.contains( m )) { + newMob = true; + } + } + } + + if (newMob) { + interrupt(); + restoreHealth = false; + } + + visibleEnemies = visible; + } + + public int visibleEnemies() { + return visibleEnemies.size(); + } + + public Mob visibleEnemy( int index ) { + return visibleEnemies.get( index % visibleEnemies.size() ); + } + + private boolean getCloser( final int target ) { + + if (rooted) { + return false; + } + + int step = -1; + + if (Level.adjacent( pos, target )) { + + if (Actor.findChar( target ) == null) { + if (Level.pit[target] && !flying && !Chasm.jumpConfirmed) { + Chasm.heroJump( this ); + interrupt(); + return false; + } + if (Level.passable[target] || Level.avoid[target]) { + step = target; + } + } + + } else { + + int len = Level.LENGTH; + boolean[] p = Level.passable; + boolean[] v = Dungeon.level.visited; + boolean[] m = Dungeon.level.mapped; + boolean[] passable = new boolean[len]; + for (int i=0; i < len; i++) { + passable[i] = p[i] && (v[i] || m[i]); + } + + step = Dungeon.findPath( this, pos, target, passable, Level.fieldOfView ); + } + + if (step != -1) { + + sprite.move( pos, step ); + move( step ); + spend( 1 / speed() ); + + return true; + + } else { + + return false; + + } + + } + + public void handle( int cell ) { + + if (cell == -1) { + return; + } + + Char ch; + Heap heap; + + if (Dungeon.level.map[cell] == Terrain.ALCHEMY && cell != pos) { + + curAction = new HeroAction.Cook( cell ); + + } else + if (Level.fieldOfView[cell] && (ch = Actor.findChar( cell )) instanceof Mob) { + + if (ch instanceof Mob.NPC) { + curAction = new HeroAction.Interact( (Mob.NPC)ch ); + } else { + curAction = new HeroAction.Attack( ch ); + } + + } else if ((heap = Dungeon.level.heaps.get( cell )) != null) { + + switch (heap.type) { + case HEAP: + curAction = new HeroAction.PickUp( cell ); + break; + case FOR_SALE: + curAction = heap.size() == 1 && heap.peek().price() > 0 ? + new HeroAction.Buy( cell ) : + new HeroAction.PickUp( cell ); + break; + default: + curAction = new HeroAction.OpenChest( cell ); + } + + } else if (Dungeon.level.map[cell] == Terrain.LOCKED_DOOR || Dungeon.level.map[cell] == Terrain.LOCKED_EXIT) { + + curAction = new HeroAction.Unlock( cell ); + + } else if (cell == Dungeon.level.exit) { + + curAction = new HeroAction.Descend( cell ); + + } else if (cell == Dungeon.level.entrance) { + + curAction = new HeroAction.Ascend( cell ); + + } else { + + curAction = new HeroAction.Move( cell ); + lastAction = null; + + } + + act(); + } + + public void earnExp( int exp ) { + + this.exp += exp; + + boolean levelUp = false; + while (this.exp >= maxExp()) { + this.exp -= maxExp(); + lvl++; + + HT += 5; + HP += 5; + attackSkill++; + defenseSkill++; + + if (lvl < 10) { + updateAwareness(); + } + + levelUp = true; + } + + if (levelUp) { + + GLog.p( TXT_NEW_LEVEL, lvl ); + sprite.showStatus( CharSprite.POSITIVE, TXT_LEVEL_UP ); + Sample.INSTANCE.play( Assets.SND_LEVELUP ); + + Badges.validateLevelReached(); + } + + if (subClass == HeroSubClass.WARLOCK) { + + int value = Math.min( HT - HP, 1 + (Dungeon.depth - 1) / 5 ); + if (value > 0) { + HP += value; + sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); + } + + ((Hunger)buff( Hunger.class )).satisfy( 10 ); + } + } + + public int maxExp() { + return 5 + lvl * 5; + } + + void updateAwareness() { + awareness = (float)(1 - Math.pow( + (heroClass == HeroClass.ROGUE ? 0.85 : 0.90), + (1 + Math.min( lvl, 9 )) * 0.5 + )); + } + + public boolean isStarving() { + return ((Hunger)buff( Hunger.class )).isStarving(); + } + + @Override + public void add( Buff buff ) { + super.add( buff ); + + if (sprite != null) { + if (buff instanceof Burning) { + GLog.w( "You catch fire!" ); + interrupt(); + } else if (buff instanceof Paralysis) { + GLog.w( "You are paralysed!" ); + interrupt(); + } else if (buff instanceof Poison) { + GLog.w( "You are poisoned!" ); + interrupt(); + } else if (buff instanceof Ooze) { + GLog.w( "Caustic ooze eats your flesh. Wash away it!" ); + } else if (buff instanceof Roots) { + GLog.w( "You can't move!" ); + } else if (buff instanceof Weakness) { + GLog.w( "You feel weakened!" ); + } else if (buff instanceof Blindness) { + GLog.w( "You are blinded!" ); + } else if (buff instanceof Fury) { + GLog.w( "You become furious!" ); + sprite.showStatus( CharSprite.POSITIVE, "furious" ); + } else if (buff instanceof Charm) { + GLog.w( "You are charmed!" ); + } else if (buff instanceof Cripple) { + GLog.w( "You are crippled!" ); + } else if (buff instanceof Bleeding) { + GLog.w( "You are bleeding!" ); + } + + else if (buff instanceof Light) { + sprite.add( CharSprite.State.ILLUMINATED ); + } + } + + BuffIndicator.refreshHero(); + } + + @Override + public void remove( Buff buff ) { + super.remove( buff ); + + if (buff instanceof Light) { + sprite.remove( CharSprite.State.ILLUMINATED ); + } + + BuffIndicator.refreshHero(); + } + + @Override + public int stealth() { + int stealth = super.stealth(); + for (Buff buff : buffs( RingOfShadows.Shadows.class )) { + stealth += ((RingOfShadows.Shadows)buff).level; + } + return stealth; + } + + @Override + public void die( Object cause ) { + + curAction = null; + + DewVial.autoDrink( this ); + if (isAlive()) { + new Flare( 8, 32 ).color( 0xFFFF66, true ).show( sprite, 2f ) ; + return; + } + + Actor.fixTime(); + super.die( cause ); + + Ankh ankh = (Ankh)belongings.getItem( Ankh.class ); + if (ankh == null) { + + reallyDie( cause ); + + } else { + + Dungeon.deleteGame( Dungeon.hero.heroClass, false ); + GameScene.show( new WndResurrect( ankh, cause ) ); + + } + } + + public static void reallyDie( Object cause ) { + + int length = Level.LENGTH; + int[] map = Dungeon.level.map; + boolean[] visited = Dungeon.level.visited; + boolean[] discoverable = Level.discoverable; + + for (int i=0; i < length; i++) { + + int terr = map[i]; + + if (discoverable[i]) { + + visited[i] = true; + if ((Terrain.flags[terr] & Terrain.SECRET) != 0) { + Level.set( i, Terrain.discover( terr ) ); + GameScene.updateMap( i ); + } + } + } + + Bones.leave(); + + Dungeon.observe(); + + Dungeon.hero.belongings.identify(); + + GameScene.gameOver(); + + if (cause instanceof Hero.Doom) { + ((Hero.Doom)cause).onDeath(); + } + + Dungeon.deleteGame( Dungeon.hero.heroClass, true ); + } + + @Override + public void move( int step ) { + super.move( step ); + + if (!flying) { + + if (Level.water[step]) { + Sample.INSTANCE.play( Assets.SND_WATER, 1, 1, Random.Float( 0.8f, 1.25f ) ); + } else { + Sample.INSTANCE.play( Assets.SND_STEP ); + } + Dungeon.level.press( step, this ); + } + } + + @Override + public void onMotionComplete() { + + Dungeon.observe(); + search( false ); + + super.onMotionComplete(); + } + + @Override + public void onAttackComplete() { + + AttackIndicator.target( enemy ); + + attack( enemy ); + curAction = null; + + Invisibility.dispel(); + + super.onAttackComplete(); + } + + @Override + public void onOperateComplete() { + + if (curAction instanceof HeroAction.Unlock) { + + if (theKey != null) { + theKey.detach( belongings.backpack ); + theKey = null; + } + + int doorCell = ((HeroAction.Unlock)curAction).dst; + int door = Dungeon.level.map[doorCell]; + + Level.set( doorCell, door == Terrain.LOCKED_DOOR ? Terrain.DOOR : Terrain.UNLOCKED_EXIT ); + GameScene.updateMap( doorCell ); + + } else if (curAction instanceof HeroAction.OpenChest) { + + if (theKey != null) { + theKey.detach( belongings.backpack ); + theKey = null; + } + + Heap heap = Dungeon.level.heaps.get( ((HeroAction.OpenChest)curAction).dst ); + if (heap.type == Type.SKELETON) { + Sample.INSTANCE.play( Assets.SND_BONES ); + } + heap.open( this ); + } + curAction = null; + + super.onOperateComplete(); + } + + public boolean search( boolean intentional ) { + + boolean smthFound = false; + + int positive = 0; + int negative = 0; + for (Buff buff : buffs( RingOfDetection.Detection.class )) { + int bonus = ((RingOfDetection.Detection)buff).level; + if (bonus > positive) { + positive = bonus; + } else if (bonus < 0) { + negative += bonus; + } + } + int distance = 1 + positive + negative; + + float level = intentional ? (2 * awareness - awareness * awareness) : awareness; + if (distance <= 0) { + + level /= 2 - distance; + distance = 1; + } + + int cx = pos % Level.WIDTH; + int cy = pos / Level.WIDTH; + int ax = cx - distance; + if (ax < 0) { + ax = 0; + } + int bx = cx + distance; + if (bx >= Level.WIDTH) { + bx = Level.WIDTH - 1; + } + int ay = cy - distance; + if (ay < 0) { + ay = 0; + } + int by = cy + distance; + if (by >= Level.HEIGHT) { + by = Level.HEIGHT - 1; + } + + for (int y = ay; y <= by; y++) { + for (int x = ax, p = ax + y * Level.WIDTH; x <= bx; x++, p++) { + + if (Dungeon.visible[p]) { + + if (intentional) { + sprite.parent.addToBack( new CheckedCell( p ) ); + } + + if (Level.secret[p] && (intentional || Random.Float() < level)) { + + int oldValue = Dungeon.level.map[p]; + + GameScene.discoverTile( p, oldValue ); + + Level.set( p, Terrain.discover( oldValue ) ); + + GameScene.updateMap( p ); + + ScrollOfMagicMapping.discover( p ); + + smthFound = true; + } + } + } + } + + + if (intentional) { + sprite.showStatus( CharSprite.DEFAULT, TXT_SEARCH ); + sprite.operate( pos ); + if (smthFound) { + spendAndNext( Random.Float() < level ? TIME_TO_SEARCH : TIME_TO_SEARCH * 2 ); + } else { + spendAndNext( TIME_TO_SEARCH ); + } + + } + + if (smthFound) { + GLog.w( TXT_NOTICED_SMTH ); + Sample.INSTANCE.play( Assets.SND_SECRET ); + interrupt(); + } + + return smthFound; + } + + public void resurrect( int resetLevel ) { + + HP = HT; + Dungeon.gold = 0; + exp = 0; + + belongings.resurrect( resetLevel ); + + live(); + } + + @Override + public HashSet> resistances() { + RingOfElements.Resistance r = buff( RingOfElements.Resistance.class ); + return r == null ? super.resistances() : r.resistances(); + } + + @Override + public HashSet> immunities() { + GasesImmunity buff = buff( GasesImmunity.class ); + return buff == null ? super.immunities() : GasesImmunity.IMMUNITIES; + } + + public static interface Doom { + public void onDeath(); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/hero/HeroAction.java b/src/com/watabou/pixeldungeon/actors/hero/HeroAction.java new file mode 100644 index 0000000000..1c51ff5a44 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/hero/HeroAction.java @@ -0,0 +1,89 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.hero; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.Mob; + + +public class HeroAction { + + public int dst; + + public static class Move extends HeroAction { + public Move( int dst ) { + this.dst = dst; + } + } + + public static class PickUp extends HeroAction { + public PickUp( int dst ) { + this.dst = dst; + } + } + + public static class OpenChest extends HeroAction { + public OpenChest( int dst ) { + this.dst = dst; + } + } + + public static class Buy extends HeroAction { + public Buy( int dst ) { + this.dst = dst; + } + } + + public static class Interact extends HeroAction { + public Mob.NPC npc; + public Interact( Mob.NPC npc ) { + this.npc = npc; + } + } + + public static class Unlock extends HeroAction { + public Unlock( int door ) { + this.dst = door; + } + } + + public static class Descend extends HeroAction { + public Descend( int stairs ) { + this.dst = stairs; + } + } + + public static class Ascend extends HeroAction { + public Ascend( int stairs ) { + this.dst = stairs; + } + } + + public static class Cook extends HeroAction { + public Cook( int pot ) { + this.dst = pot; + } + } + + public static class Attack extends HeroAction { + public Char target; + public Attack( Char target ) { + this.target = target; + } + } +} diff --git a/src/com/watabou/pixeldungeon/actors/hero/HeroClass.java b/src/com/watabou/pixeldungeon/actors/hero/HeroClass.java new file mode 100644 index 0000000000..7733dd01d0 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/hero/HeroClass.java @@ -0,0 +1,221 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.hero; + +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.TomeOfMastery; +import com.watabou.pixeldungeon.items.armor.ClothArmor; +import com.watabou.pixeldungeon.items.food.Food; +import com.watabou.pixeldungeon.items.potions.PotionOfStrength; +import com.watabou.pixeldungeon.items.rings.RingOfShadows; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfIdentify; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfMagicMapping; +import com.watabou.pixeldungeon.items.wands.WandOfMagicMissile; +import com.watabou.pixeldungeon.items.weapon.melee.Dagger; +import com.watabou.pixeldungeon.items.weapon.melee.Knuckles; +import com.watabou.pixeldungeon.items.weapon.melee.ShortSword; +import com.watabou.pixeldungeon.items.weapon.missiles.Dart; +import com.watabou.pixeldungeon.items.weapon.missiles.Boomerang; +import com.watabou.utils.Bundle; + +public enum HeroClass { + + WARRIOR( "warrior" ), MAGE( "mage" ), ROGUE( "rogue" ), HUNTRESS( "huntress" ); + + private String title; + + private HeroClass( String title ) { + this.title = title; + } + + public static final String[] WAR_PERKS = { + "Warriors start with 11 points of Strength.", + "Warriors start with a unique short sword. This sword can be later \"reforged\" to upgrade another melee weapon.", + "Warriors are less proficient with missile weapons.", + "Any piece of food restores some health when eaten.", + "Potions of Strength are identified from the beginning.", + }; + + public static final String[] MAG_PERKS = { + "Mages start with a unique Wand of Magic Missile. This wand can be later \"disenchanted\" to upgrade another wand.", + "Mages recharge their wands faster.", + "When eaten, any piece of food restores 1 charge for all wands in the inventory.", + "Mages can use wands as a melee weapon.", + "Scrolls of Identify are identified from the beginning." + }; + + public static final String[] ROG_PERKS = { + "Rogues start with a Ring of Shadows+1.", + "Rogues identify a type of a ring on equipping it.", + "Rogues are proficient with light armor, dodging better while wearing one.", + "Rogues are proficient in detecting hidden doors and traps.", + "Rogues can go without food longer.", + "Scrolls of Magic Mapping are identified from the beginning." + }; + + public static final String[] HUN_PERKS = { + "Huntresses start with 15 points of Health.", + "Huntresses start with a unique upgradeable boomerang.", + "Huntresses are proficient with missile weapons and get damage bonus for excessive strength when using them.", + "Huntresses gain more health from dewdrops.", + "Huntresses sense neighbouring monsters even if they are hidden behind obstacles." + }; + + public void initHero( Hero hero ) { + + hero.heroClass = this; + + switch (this) { + case WARRIOR: + initWarrior( hero ); + break; + + case MAGE: + initMage( hero ); + break; + + case ROGUE: + initRogue( hero ); + break; + + case HUNTRESS: + initHuntress( hero ); + break; + } + + hero.updateAwareness(); + } + + private static void initWarrior( Hero hero ) { + hero.STR = hero.STR + 1; + + (hero.belongings.weapon = new ShortSword()).identify(); + (hero.belongings.armor = new ClothArmor()).identify(); + new Dart( 8 ).identify().collect(); + new Food().identify().collect(); + + if (Badges.isUnlocked( Badges.Badge.MASTERY_WARRIOR )) { + new TomeOfMastery().collect(); + } + + Dungeon.quickslot = Dart.class; + + new PotionOfStrength().setKnown(); + } + + private static void initMage( Hero hero ) { + (hero.belongings.weapon = new Knuckles()).identify(); + (hero.belongings.armor = new ClothArmor()).identify(); + new Food().identify().collect(); + + WandOfMagicMissile wand = new WandOfMagicMissile(); + wand.identify().collect(); + + if (Badges.isUnlocked( Badges.Badge.MASTERY_MAGE )) { + new TomeOfMastery().collect(); + } + + Dungeon.quickslot = wand; + + new ScrollOfIdentify().setKnown(); + } + + private static void initRogue( Hero hero ) { + (hero.belongings.weapon = new Dagger()).identify(); + (hero.belongings.armor = new ClothArmor()).identify(); + (hero.belongings.ring1 = new RingOfShadows()).upgrade().identify(); + new Dart( 8 ).identify().collect(); + new Food().identify().collect(); + + hero.belongings.ring1.activate( hero ); + + if (Badges.isUnlocked( Badges.Badge.MASTERY_ROGUE )) { + new TomeOfMastery().collect(); + } + + Dungeon.quickslot = Dart.class; + + new ScrollOfMagicMapping().setKnown(); + } + + private static void initHuntress( Hero hero ) { + + hero.HP = (hero.HT -= 5); + + (hero.belongings.weapon = new Dagger()).identify(); + (hero.belongings.armor = new ClothArmor()).identify(); + Boomerang boomerang = new Boomerang(); + boomerang.identify().collect(); + new Food().identify().collect(); + + if (Badges.isUnlocked( Badges.Badge.MASTERY_HUNTRESS )) { + new TomeOfMastery().collect(); + } + + Dungeon.quickslot = boomerang; + } + + public String title() { + return title; + } + + public String spritesheet() { + + switch (this) { + case WARRIOR: + return Assets.WARRIOR; + case MAGE: + return Assets.MAGE; + case ROGUE: + return Assets.ROGUE; + case HUNTRESS: + return Assets.HUNTRESS; + } + + return null; + } + + public String[] perks() { + + switch (this) { + case WARRIOR: + return WAR_PERKS; + case MAGE: + return MAG_PERKS; + case ROGUE: + return ROG_PERKS; + case HUNTRESS: + return HUN_PERKS; + } + + return null; + } + + private static final String CLASS = "class"; + + public void storeInBundle( Bundle bundle ) { + bundle.put( CLASS, toString() ); + } + + public static HeroClass restoreInBundle( Bundle bundle ) { + String value = bundle.getString( CLASS ); + return value.length() > 0 ? valueOf( value ) : ROGUE; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/hero/HeroSubClass.java b/src/com/watabou/pixeldungeon/actors/hero/HeroSubClass.java new file mode 100644 index 0000000000..de594fc4e6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/hero/HeroSubClass.java @@ -0,0 +1,88 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.hero; + +import com.watabou.utils.Bundle; + +public enum HeroSubClass { + + NONE( null, null ), + + GLADIATOR( "gladiator", + "A successful attack with a melee weapon allows the _Gladiator_ to start a combo, " + + "in which every next successful hit inflicts more damage." ), + + BERSERKER( "berserker", + "When severely wounded, the _Berserker_ enters a state of wild fury " + + "significantly increasing his damage output." ), + + WARLOCK( "warlock", + "After killing an enemy the _Warlock_ consumes its soul. " + + "It heals his wounds and satisfies his hunger." ), + + BATTLEMAGE( "battlemage", + "When fighting with a wand in his hands, the _Battlemage_ inflicts additional damage depending " + + "on the current number of charges. Every successful hit restores 1 charge to this wand." ), + + ASSASSIN( "assassin", + "When performing a surprise attack, the _Assassin_ inflicts additional damage to his target." ), + + FREERUNNER( "freerunner", + "The _Freerunner_ can move almost twice faster, than most of the monsters. When he " + + "is running, the Freerunner is much harder to hit. For that he must be unencumbered and not starving." ), + + SNIPER( "sniper", + "_Snipers_ are able to detect weak points in an enemy's armor, " + + "effectively ignoring it when using a missile weapon." ), + + WARDEN( "warden", + "Having a strong connection with forces of nature gives _Wardens_ an ability to gather dewdrops and " + + "seeds from plants. Also trampling a high grass grants them a temporary armor buff." ); + + private String title; + private String desc; + + private HeroSubClass( String title, String desc ) { + this.title = title; + this.desc = desc; + } + + public String title() { + return title; + } + + public String desc() { + return desc; + } + + private static final String SUBCLASS = "subClass"; + + public void storeInBundle( Bundle bundle ) { + bundle.put( SUBCLASS, toString() ); + } + + public static HeroSubClass restoreInBundle( Bundle bundle ) { + String value = bundle.getString( SUBCLASS ); + try { + return valueOf( value ); + } catch (Exception e) { + return NONE; + } + } + +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Acidic.java b/src/com/watabou/pixeldungeon/actors/mobs/Acidic.java new file mode 100644 index 0000000000..82f73399df --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Acidic.java @@ -0,0 +1,48 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.sprites.AcidicSprite; +import com.watabou.utils.Random; + +public class Acidic extends Scorpio { + + { + name = "acidic scorpio"; + spriteClass = AcidicSprite.class; + } + + @Override + public int defenseProc( Char enemy, int damage ) { + + int dmg = Random.IntRange( 0, damage ); + if (dmg > 0) { + enemy.damage( dmg, this ); + } + + return super.defenseProc( enemy, damage ); + } + + @Override + public void die( Object cause ) { + super.die( cause ); + Badges.validateRare( this ); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Albino.java b/src/com/watabou/pixeldungeon/actors/mobs/Albino.java new file mode 100644 index 0000000000..8dd19bb723 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Albino.java @@ -0,0 +1,50 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Bleeding; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.sprites.AlbinoSprite; +import com.watabou.utils.Random; + +public class Albino extends Rat { + + { + name = "albino rat"; + spriteClass = AlbinoSprite.class; + + HP = HT = 15; + } + + @Override + public void die( Object cause ) { + super.die( cause ); + Badges.validateRare( this ); + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (Random.Int( 2 ) == 0) { + Buff.affect( enemy, Bleeding.class ).set( damage ); + } + + return damage; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Bandit.java b/src/com/watabou/pixeldungeon/actors/mobs/Bandit.java new file mode 100644 index 0000000000..5245bfadbd --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Bandit.java @@ -0,0 +1,56 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.buffs.Blindness; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.sprites.BanditSprite; +import com.watabou.utils.Random; + +public class Bandit extends Thief { + + public Item item; + + { + name = "crazy bandit"; + spriteClass = BanditSprite.class; + } + + @Override + protected boolean steal( Hero hero ) { + if (super.steal( hero )) { + + Buff.prolong( enemy, Blindness.class, Random.Int( 5, 12 ) ); + Dungeon.observe(); + + return true; + } else { + return false; + } + } + + @Override + public void die( Object cause ) { + super.die( cause ); + Badges.validateRare( this ); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Bat.java b/src/com/watabou/pixeldungeon/actors/mobs/Bat.java new file mode 100644 index 0000000000..4da00ce09c --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Bat.java @@ -0,0 +1,97 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.potions.PotionOfHealing; +import com.watabou.pixeldungeon.items.weapon.enchantments.Leech; +import com.watabou.pixeldungeon.sprites.BatSprite; +import com.watabou.utils.Random; + +public class Bat extends Mob { + + { + name = "vampire bat"; + spriteClass = BatSprite.class; + + HP = HT = 30; + defenseSkill = 15; + baseSpeed = 2f; + + EXP = 7; + maxLvl = 15; + + flying = true; + + loot = new PotionOfHealing(); + lootChance = 0.125f; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 6, 12 ); + } + + @Override + public int attackSkill( Char target ) { + return 16; + } + + @Override + public int dr() { + return 4; + } + + @Override + public String defenseVerb() { + return "evaded"; + } + + @Override + public int attackProc( Char enemy, int damage ) { + + int reg = Math.min( damage, HT - HP ); + + if (reg > 0) { + HP += reg; + sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); + } + + return damage; + } + + @Override + public String description() { + return + "These brisk and tenacious inhabitants of cave domes may defeat much larger opponents by " + + "replenishing their health with each successful attack."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( Leech.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Bestiary.java b/src/com/watabou/pixeldungeon/actors/mobs/Bestiary.java new file mode 100644 index 0000000000..ce0824109b --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Bestiary.java @@ -0,0 +1,183 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.utils.Random; + +public class Bestiary { + + public static Mob mob( int depth ) { + @SuppressWarnings("unchecked") + Class cl = (Class)mobClass( depth ); + try { + return cl.newInstance(); + } catch (Exception e) { + return null; + } + } + + public static Mob mutable( int depth ) { + @SuppressWarnings("unchecked") + Class cl = (Class)mobClass( depth ); + + if (Random.Int( 30 ) == 0) { + if (cl == Rat.class) { + cl = Albino.class; + } else if (cl == Thief.class) { + cl = Bandit.class; + } else if (cl == Brute.class) { + cl = Shielded.class; + } else if (cl == Monk.class) { + cl = Senior.class; + } else if (cl == Scorpio.class) { + cl = Acidic.class; + } + } + + try { + return cl.newInstance(); + } catch (Exception e) { + return null; + } + } + + private static Class mobClass( int depth ) { + + float[] chances; + Class[] classes; + + switch (depth) { + case 1: + chances = new float[]{ 1 }; + classes = new Class[]{ Rat.class }; + break; + case 2: + chances = new float[]{ 1, 1 }; + classes = new Class[]{ Rat.class, Gnoll.class }; + break; + case 3: + chances = new float[]{ 1, 2, 1, 0.02f }; + classes = new Class[]{ Rat.class, Gnoll.class, Crab.class, Swarm.class }; + break; + case 4: + chances = new float[]{ 1, 2, 3, 0.02f, 0.01f, 0.01f }; + classes = new Class[]{ Rat.class, Gnoll.class, Crab.class, Swarm.class, Skeleton.class, Thief.class }; + break; + + case 5: + chances = new float[]{ 1 }; + classes = new Class[]{ Goo.class }; + break; + + case 6: + chances = new float[]{ 4, 2, 1, 0.2f }; + classes = new Class[]{ Skeleton.class, Thief.class, Swarm.class, Shaman.class }; + break; + case 7: + chances = new float[]{ 3, 1, 1, 1 }; + classes = new Class[]{ Skeleton.class, Shaman.class, Thief.class, Swarm.class }; + break; + case 8: + chances = new float[]{ 3, 2, 1, 1, 1, 0.02f }; + classes = new Class[]{ Skeleton.class, Shaman.class, Gnoll.class, Thief.class, Swarm.class, Bat.class }; + break; + case 9: + chances = new float[]{ 3, 3, 1, 1, 0.02f, 0.01f }; + classes = new Class[]{ Skeleton.class, Shaman.class, Thief.class, Swarm.class, Bat.class, Brute.class }; + break; + + case 10: + chances = new float[]{ 1 }; + classes = new Class[]{ Tengu.class }; + break; + + case 11: + chances = new float[]{ 1, 0.2f }; + classes = new Class[]{ Bat.class, Brute.class }; + break; + case 12: + chances = new float[]{ 1, 1, 0.2f }; + classes = new Class[]{ Bat.class, Brute.class, Spinner.class }; + break; + case 13: + chances = new float[]{ 1, 3, 1, 1, 0.02f }; + classes = new Class[]{ Bat.class, Brute.class, Shaman.class, Spinner.class, Elemental.class }; + break; + case 14: + chances = new float[]{ 1, 3, 1, 4, 0.02f, 0.01f }; + classes = new Class[]{ Bat.class, Brute.class, Shaman.class, Spinner.class, Elemental.class, Monk.class }; + break; + + case 15: + chances = new float[]{ 1 }; + classes = new Class[]{ DM300.class }; + break; + + case 16: + chances = new float[]{ 1, 1, 0.2f }; + classes = new Class[]{ Elemental.class, Warlock.class, Monk.class }; + break; + case 17: + chances = new float[]{ 1, 1, 1 }; + classes = new Class[]{ Elemental.class, Monk.class, Warlock.class }; + break; + case 18: + chances = new float[]{ 1, 2, 1, 1 }; + classes = new Class[]{ Elemental.class, Monk.class, Golem.class, Warlock.class }; + break; + case 19: + chances = new float[]{ 1, 2, 3, 1, 0.02f }; + classes = new Class[]{ Elemental.class, Monk.class, Golem.class, Warlock.class, Succubus.class }; + break; + + case 20: + chances = new float[]{ 1 }; + classes = new Class[]{ King.class }; + break; + + case 22: + chances = new float[]{ 1, 1 }; + classes = new Class[]{ Succubus.class, Eye.class }; + break; + case 23: + chances = new float[]{ 1, 2, 1 }; + classes = new Class[]{ Succubus.class, Eye.class, Scorpio.class }; + break; + case 24: + chances = new float[]{ 1, 2, 3 }; + classes = new Class[]{ Succubus.class, Eye.class, Scorpio.class }; + break; + + case 25: + chances = new float[]{ 1 }; + classes = new Class[]{ Yog.class }; + break; + + default: + chances = new float[]{ 1 }; + classes = new Class[]{ Eye.class }; + } + + return classes[ Random.chances( chances )]; + } + + public static boolean isUnique( Char mob ) { + return mob instanceof Goo || mob instanceof Tengu || mob instanceof DM300 || mob instanceof King || mob instanceof Yog; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Brute.java b/src/com/watabou/pixeldungeon/actors/mobs/Brute.java new file mode 100644 index 0000000000..acc104c513 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Brute.java @@ -0,0 +1,105 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Terror; +import com.watabou.pixeldungeon.items.Gold; +import com.watabou.pixeldungeon.sprites.BruteSprite; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Brute extends Mob { + + private static final String TXT_ENRAGED = "%s becomes enraged!"; + + { + name = "gnoll brute"; + spriteClass = BruteSprite.class; + + HP = HT = 40; + defenseSkill = 15; + + EXP = 8; + maxLvl = 15; + + loot = Gold.class; + lootChance = 0.5f; + } + + private boolean enraged = false; + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + enraged = HP < HT / 4; + } + + @Override + public int damageRoll() { + return enraged ? + Random.NormalIntRange( 10, 40 ) : + Random.NormalIntRange( 8, 18 ); + } + + @Override + public int attackSkill( Char target ) { + return 20; + } + + @Override + public int dr() { + return 8; + } + + @Override + public void damage( int dmg, Object src ) { + super.damage( dmg, src ); + + if (isAlive() && !enraged && HP < HT / 4) { + enraged = true; + spend( TICK ); + if (Dungeon.visible[pos]) { + GLog.w( TXT_ENRAGED, name ); + sprite.showStatus( CharSprite.NEGATIVE, "enraged" ); + } + } + } + + @Override + public String description() { + return + "Brutes are the largest, strongest and toughest of all gnolls. When severely wounded, " + + "they go berserk, inflicting even more damage to their enemies."; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Terror.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Crab.java b/src/com/watabou/pixeldungeon/actors/mobs/Crab.java new file mode 100644 index 0000000000..53ccd7ce29 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Crab.java @@ -0,0 +1,76 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.npcs.Ghost; +import com.watabou.pixeldungeon.items.food.MysteryMeat; +import com.watabou.pixeldungeon.sprites.CrabSprite; +import com.watabou.utils.Random; + +public class Crab extends Mob { + + { + name = "sewer crab"; + spriteClass = CrabSprite.class; + + HP = HT = 15; + defenseSkill = 5; + baseSpeed = 2f; + + EXP = 3; + maxLvl = 9; + + loot = new MysteryMeat(); + lootChance = 0.167f; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 3, 6 ); + } + + @Override + public int attackSkill( Char target ) { + return 12; + } + + @Override + public int dr() { + return 4; + } + + @Override + public String defenseVerb() { + return "parried"; + } + + @Override + public void die( Object cause ) { + Ghost.Quest.process( pos ); + super.die( cause ); + } + + @Override + public String description() { + return + "These huge crabs are at the top of the food chain in the sewers. " + + "They are extremely fast and their thick exoskeleton can withstand " + + "heavy blows."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/DM300.java b/src/com/watabou/pixeldungeon/actors/mobs/DM300.java new file mode 100644 index 0000000000..1e943b2c83 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/DM300.java @@ -0,0 +1,173 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.noosa.Camera; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Paralysis; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.particles.ElmoParticle; +import com.watabou.pixeldungeon.items.keys.SkeletonKey; +import com.watabou.pixeldungeon.items.rings.RingOfThorns; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfPsionicBlast; +import com.watabou.pixeldungeon.items.weapon.enchantments.Death; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.DM300Sprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Random; + +public class DM300 extends Mob { + + { + name = "DM-300"; + spriteClass = DM300Sprite.class; + + HP = HT = 200; + EXP = 30; + defenseSkill = 18; + + loot = new RingOfThorns().random(); + lootChance = 0.333f; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 18, 24 ); + } + + @Override + public int attackSkill( Char target ) { + return 28; + } + + @Override + public int dr() { + return 10; + } + + @Override + public boolean act() { + + GameScene.add( Blob.seed( pos, 30, ToxicGas.class ) ); + + return super.act(); + } + + @Override + public void move( int step ) { + super.move( step ); + + if (Dungeon.level.map[step] == Terrain.INACTIVE_TRAP && HP < HT) { + + HP += Random.Int( 1, HT - HP ); + sprite.emitter().burst( ElmoParticle.FACTORY, 5 ); + + if (Dungeon.visible[step] && Dungeon.hero.isAlive()) { + GLog.n( "DM-300 repairs itself!" ); + } + } + + int[] cells = { + step-1, step+1, step-Level.WIDTH, step+Level.WIDTH, + step-1-Level.WIDTH, + step-1+Level.WIDTH, + step+1-Level.WIDTH, + step+1+Level.WIDTH + }; + int cell = cells[Random.Int( cells.length )]; + + if (Dungeon.visible[cell]) { + CellEmitter.get( cell ).start( Speck.factory( Speck.ROCK ), 0.07f, 10 ); + Camera.main.shake( 3, 0.7f ); + Sample.INSTANCE.play( Assets.SND_ROCKS ); + + if (Level.water[cell]) { + GameScene.ripple( cell ); + } else if (Dungeon.level.map[cell] == Terrain.EMPTY) { + Level.set( cell, Terrain.EMPTY_DECO ); + GameScene.updateMap( cell ); + } + } + + Char ch = Actor.findChar( cell ); + if (ch != null && ch != this) { + Buff.prolong( ch, Paralysis.class, 2 ); + } + } + + @Override + public void die( Object cause ) { + + super.die( cause ); + + GameScene.bossSlain(); + Dungeon.level.drop( new SkeletonKey( Dungeon.depth ), pos ).sprite.drop(); + + Badges.validateBossSlain(); + + yell( "Mission failed. Shutting down." ); + } + + @Override + public void notice() { + super.notice(); + yell( "Unauthorised personnel detected." ); + } + + @Override + public String description() { + return + "This machine was created by the Dwarves several centuries ago. Later, Dwarves started to replace machines with " + + "golems, elementals and even demons. Eventually it led their civilization to the decline. The DM-300 and similar " + + "machines were typically used for construction and mining, and in some cases, for city defense."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( Death.class ); + RESISTANCES.add( ScrollOfPsionicBlast.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( ToxicGas.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Elemental.java b/src/com/watabou/pixeldungeon/actors/mobs/Elemental.java new file mode 100644 index 0000000000..6954ce9d1b --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Elemental.java @@ -0,0 +1,110 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.actors.buffs.Frost; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.potions.PotionOfLiquidFlame; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfPsionicBlast; +import com.watabou.pixeldungeon.items.wands.WandOfFirebolt; +import com.watabou.pixeldungeon.items.weapon.enchantments.Fire; +import com.watabou.pixeldungeon.sprites.ElementalSprite; +import com.watabou.utils.Random; + +public class Elemental extends Mob { + + { + name = "fire elemental"; + spriteClass = ElementalSprite.class; + + HP = HT = 65; + defenseSkill = 20; + + EXP = 10; + maxLvl = 20; + + flying = true; + + loot = new PotionOfLiquidFlame(); + lootChance = 0.1f; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 16, 20 ); + } + + @Override + public int attackSkill( Char target ) { + return 25; + } + + @Override + public int dr() { + return 5; + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (Random.Int( 2 ) == 0) { + Buff.affect( enemy, Burning.class ).reignite( enemy ); + } + + return damage; + } + + @Override + public void add( Buff buff ) { + if (buff instanceof Burning) { + if (HP < HT) { + HP++; + sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); + } + } else { + if (buff instanceof Frost) { + damage( Random.NormalIntRange( 1, HT * 2 / 3 ), buff ); + } + super.add( buff ); + } + } + + @Override + public String description() { + return + "Wandering fire elementals are a byproduct of summoning greater entities. " + + "They are too chaotic in their nature to be controlled by even the most powerful demonologist."; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Burning.class ); + IMMUNITIES.add( Fire.class ); + IMMUNITIES.add( WandOfFirebolt.class ); + IMMUNITIES.add( ScrollOfPsionicBlast.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Eye.java b/src/com/watabou/pixeldungeon/actors/mobs/Eye.java new file mode 100644 index 0000000000..79c24982a5 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Eye.java @@ -0,0 +1,174 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Light; +import com.watabou.pixeldungeon.actors.buffs.Terror; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.PurpleParticle; +import com.watabou.pixeldungeon.items.Dewdrop; +import com.watabou.pixeldungeon.items.wands.WandOfDisintegration; +import com.watabou.pixeldungeon.items.weapon.enchantments.Death; +import com.watabou.pixeldungeon.items.weapon.enchantments.Leech; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.EyeSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Random; + +public class Eye extends Mob { + + private static final String TXT_DEATHGAZE_KILLED = "%s's deathgaze killed you..."; + + { + name = "evil eye"; + spriteClass = EyeSprite.class; + + HP = HT = 100; + defenseSkill = 20; + viewDistance = Light.DISTANCE; + + EXP = 13; + maxLvl = 25; + + flying = true; + + loot = new Dewdrop(); + lootChance = 0.5f; + } + + @Override + public int dr() { + return 10; + } + + private int hitCell; + + @Override + protected boolean canAttack( Char enemy ) { + + hitCell = Ballistica.cast( pos, enemy.pos, true, false ); + + for (int i=1; i < Ballistica.distance; i++) { + if (Ballistica.trace[i] == enemy.pos) { + return true; + } + } + return false; + } + + @Override + public int attackSkill( Char target ) { + return 30; + } + + @Override + protected float attackDelay() { + return 1.6f; + } + + @Override + protected boolean doAttack( Char enemy ) { + + spend( attackDelay() ); + + boolean rayVisible = false; + + for (int i=0; i < Ballistica.distance; i++) { + if (Dungeon.visible[Ballistica.trace[i]]) { + rayVisible = true; + } + } + + if (rayVisible) { + sprite.attack( hitCell ); + return false; + } else { + attack( enemy ); + return true; + } + } + + @Override + public boolean attack( Char enemy ) { + + for (int i=1; i < Ballistica.distance; i++) { + + int pos = Ballistica.trace[i]; + + Char ch = Actor.findChar( pos ); + if (ch == null) { + continue; + } + + if (hit( this, ch, true )) { + ch.damage( Random.NormalIntRange( 14, 20 ), this ); + + if (Dungeon.visible[pos]) { + ch.sprite.flash(); + CellEmitter.center( pos ).burst( PurpleParticle.BURST, Random.IntRange( 1, 2 ) ); + } + + if (!ch.isAlive() && ch == Dungeon.hero) { + Dungeon.fail( Utils.format( ResultDescriptions.MOB, Utils.indefinite( name ), Dungeon.depth ) ); + GLog.n( TXT_DEATHGAZE_KILLED, name ); + } + } else { + ch.sprite.showStatus( CharSprite.NEUTRAL, ch.defenseVerb() ); + } + } + + return true; + } + + @Override + public String description() { + return + "One of this demon's other names is \"orb of hatred\", because when it sees an enemy, " + + "it uses its deathgaze recklessly, often ignoring its allies and wounding them."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( WandOfDisintegration.class ); + RESISTANCES.add( Death.class ); + RESISTANCES.add( Leech.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Terror.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Gnoll.java b/src/com/watabou/pixeldungeon/actors/mobs/Gnoll.java new file mode 100644 index 0000000000..caa13a4708 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Gnoll.java @@ -0,0 +1,69 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.npcs.Ghost; +import com.watabou.pixeldungeon.items.Gold; +import com.watabou.pixeldungeon.sprites.GnollSprite; +import com.watabou.utils.Random; + +public class Gnoll extends Mob { + + { + name = "gnoll scout"; + spriteClass = GnollSprite.class; + + HP = HT = 12; + defenseSkill = 4; + + EXP = 2; + maxLvl = 8; + + loot = Gold.class; + lootChance = 0.5f; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 2, 5 ); + } + + @Override + public int attackSkill( Char target ) { + return 11; + } + + @Override + public int dr() { + return 2; + } + + @Override + public void die( Object cause ) { + Ghost.Quest.process( pos ); + super.die( cause ); + } + + @Override + public String description() { + return + "Gnolls are hyena-like humanoids. They dwell in sewers and dungeons, venturing up to raid the surface from time to time. " + + "Gnoll scouts are regular members of their pack, they are not as strong as brutes and not as intelligent as shamans."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Golem.java b/src/com/watabou/pixeldungeon/actors/mobs/Golem.java new file mode 100644 index 0000000000..f1e633a2b7 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Golem.java @@ -0,0 +1,105 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Amok; +import com.watabou.pixeldungeon.actors.buffs.Sleep; +import com.watabou.pixeldungeon.actors.buffs.Terror; +import com.watabou.pixeldungeon.actors.mobs.npcs.Imp; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfPsionicBlast; +import com.watabou.pixeldungeon.sprites.GolemSprite; +import com.watabou.utils.Random; + +public class Golem extends Mob { + + { + name = "golem"; + spriteClass = GolemSprite.class; + + HP = HT = 85; + defenseSkill = 18; + + EXP = 12; + maxLvl = 22; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 20, 40 ); + } + + @Override + public int attackSkill( Char target ) { + return 28; + } + + @Override + protected float attackDelay() { + return 1.5f; + } + + @Override + public int dr() { + return 12; + } + + @Override + public String defenseVerb() { + return "blocked"; + } + + @Override + public void die( Object cause ) { + Imp.Quest.process( this ); + + super.die( cause ); + } + + @Override + public String description() { + return + "The Dwarves tried to combine their knowledge of mechanisms with their newfound power of elemental binding. " + + "They used spirits of earth as the \"soul\" for the mechanical bodies of golems, which were believed to be " + + "most controllable of all. Despite this, the tiniest mistake in the ritual could cause an outbreak."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( ScrollOfPsionicBlast.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Amok.class ); + IMMUNITIES.add( Terror.class ); + IMMUNITIES.add( Sleep.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Goo.java b/src/com/watabou/pixeldungeon/actors/mobs/Goo.java new file mode 100644 index 0000000000..041a240011 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Goo.java @@ -0,0 +1,188 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.noosa.Camera; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Ooze; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.LloydsBeacon; +import com.watabou.pixeldungeon.items.keys.SkeletonKey; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfPsionicBlast; +import com.watabou.pixeldungeon.items.weapon.enchantments.Death; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.SewerBossLevel; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.GooSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Random; + +public class Goo extends Mob { + + private static final float PUMP_UP_DELAY = 2f; + + { + name = "Goo"; + HP = HT = 80; + EXP = 10; + defenseSkill = 12; + spriteClass = GooSprite.class; + + loot = new LloydsBeacon(); + lootChance = 0.333f; + } + + private boolean pumpedUp = false; + + @Override + public int damageRoll() { + if (pumpedUp) { + return Random.NormalIntRange( 5, 30 ); + } else { + return Random.NormalIntRange( 2, 12 ); + } + } + + @Override + public int attackSkill( Char target ) { + return pumpedUp ? 30 : 15; + } + + @Override + public int dr() { + return 2; + } + + @Override + public boolean act() { + + if (Level.water[pos] && HP < HT) { + sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); + HP++; + } + + return super.act(); + } + + @Override + protected boolean canAttack( Char enemy ) { + return pumpedUp ? distance( enemy ) <= 2 : super.canAttack(enemy); + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (Random.Int( 3 ) == 0) { + Buff.affect( enemy, Ooze.class ); + enemy.sprite.burst( 0x000000, 5 ); + } + + if (pumpedUp) { + Camera.main.shake( 3, 0.2f ); + } + + return damage; + } + + @Override + protected boolean doAttack( Char enemy ) { + if (pumpedUp || Random.Int( 3 ) > 0) { + + return super.doAttack( enemy ); + + } else { + + pumpedUp = true; + spend( PUMP_UP_DELAY ); + + ((GooSprite)sprite).pumpUp(); + + if (Dungeon.visible[pos]) { + sprite.showStatus( CharSprite.NEGATIVE, "!!!" ); + GLog.n( "Goo is pumping itself up!" ); + } + + return true; + } + } + + @Override + public boolean attack( Char enemy ) { + boolean result = super.attack( enemy ); + pumpedUp = false; + return result; + } + + @Override + protected boolean getCloser( int target ) { + pumpedUp = false; + return super.getCloser( target ); + } + + @Override + public void move( int step ) { + ((SewerBossLevel)Dungeon.level).seal(); + super.move( step ); + } + + @Override + public void die( Object cause ) { + + super.die( cause ); + + ((SewerBossLevel)Dungeon.level).unseal(); + + GameScene.bossSlain(); + Dungeon.level.drop( new SkeletonKey( Dungeon.depth ), pos ).sprite.drop(); + + Badges.validateBossSlain(); + + yell( "glurp... glurp..." ); + } + + @Override + public void notice() { + super.notice(); + yell( "GLURP-GLURP!" ); + } + + @Override + public String description() { + return + "Little known about The Goo. It's quite possible that it is not even a creature, but rather a " + + "conglomerate of substances from the sewers that gained rudiments of free will."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( ToxicGas.class ); + RESISTANCES.add( Death.class ); + RESISTANCES.add( ScrollOfPsionicBlast.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/King.java b/src/com/watabou/pixeldungeon/actors/mobs/King.java new file mode 100644 index 0000000000..dc534c7de8 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/King.java @@ -0,0 +1,328 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Paralysis; +import com.watabou.pixeldungeon.effects.Flare; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.ArmorKit; +import com.watabou.pixeldungeon.items.keys.SkeletonKey; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfPsionicBlast; +import com.watabou.pixeldungeon.items.wands.WandOfBlink; +import com.watabou.pixeldungeon.items.wands.WandOfDisintegration; +import com.watabou.pixeldungeon.items.weapon.enchantments.Death; +import com.watabou.pixeldungeon.levels.CityBossLevel; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.KingSprite; +import com.watabou.pixeldungeon.sprites.UndeadSprite; +import com.watabou.utils.Bundle; +import com.watabou.utils.PathFinder; +import com.watabou.utils.Random; + +public class King extends Mob { + + private static final int MAX_ARMY_SIZE = 5; + + { + name = "King of Dwarves"; + spriteClass = KingSprite.class; + + HP = HT = 300; + EXP = 40; + defenseSkill = 25; + + Undead.count = 0; + } + + private boolean nextPedestal = true; + + private static final String PEDESTAL = "pedestal"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( PEDESTAL, nextPedestal ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + nextPedestal = bundle.getBoolean( PEDESTAL ); + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 20, 38 ); + } + + @Override + public int attackSkill( Char target ) { + return 32; + } + + @Override + public int dr() { + return 14; + } + + @Override + public String defenseVerb() { + return "parried"; + } + + @Override + protected boolean getCloser( int target ) { + return canTryToSummon() ? + super.getCloser( CityBossLevel.pedestal( nextPedestal ) ) : + super.getCloser( target ); + } + + @Override + protected boolean canAttack( Char enemy ) { + return canTryToSummon() ? + pos == CityBossLevel.pedestal( nextPedestal ) : + Level.adjacent( pos, enemy.pos ); + } + + private boolean canTryToSummon() { + if (Undead.count < maxArmySize()) { + Char ch = Actor.findChar( CityBossLevel.pedestal( nextPedestal ) ); + return ch == this || ch == null; + } else { + return false; + } + } + + @Override + public boolean attack( Char enemy ) { + if (canTryToSummon() && pos == CityBossLevel.pedestal( nextPedestal )) { + summon(); + return true; + } else { + if (Actor.findChar( CityBossLevel.pedestal( nextPedestal ) ) == enemy) { + nextPedestal = !nextPedestal; + } + return super.attack(enemy); + } + } + + @Override + public void die( Object cause ) { + + GameScene.bossSlain(); + Dungeon.level.drop( new ArmorKit(), pos ).sprite.drop(); + Dungeon.level.drop( new SkeletonKey( Dungeon.depth ), pos ).sprite.drop(); + + super.die( cause ); + + Badges.validateBossSlain(); + + yell( "You cannot kill me, " + Dungeon.hero.heroClass.title() + "... I am... immortal..." ); + } + + private int maxArmySize() { + return 1 + MAX_ARMY_SIZE * (HT - HP) / HT; + } + + private void summon() { + + nextPedestal = !nextPedestal; + + sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.4f, 2 ); + Sample.INSTANCE.play( Assets.SND_CHALLENGE ); + + boolean[] passable = Level.passable.clone(); + for (Actor actor : Actor.all()) { + if (actor instanceof Char) { + passable[((Char)actor).pos] = false; + } + } + + int undeadsToSummon = maxArmySize() - Undead.count; + + PathFinder.buildDistanceMap( pos, passable, undeadsToSummon ); + PathFinder.distance[pos] = Integer.MAX_VALUE; + int dist = 1; + + undeadLabel: + for (int i=0; i < undeadsToSummon; i++) { + do { + for (int j=0; j < Level.LENGTH; j++) { + if (PathFinder.distance[j] == dist) { + + Undead undead = new Undead(); + undead.pos = j; + GameScene.add( undead ); + + WandOfBlink.appear( undead, j ); + new Flare( 3, 32 ).color( 0x000000, false ).show( undead.sprite, 2f ) ; + + PathFinder.distance[j] = Integer.MAX_VALUE; + + continue undeadLabel; + } + } + dist++; + } while (dist < undeadsToSummon); + } + + yell( "Arise, slaves!" ); + } + + @Override + public void notice() { + super.notice(); + yell( "How dare you!" ); + } + + @Override + public String description() { + return + "The last king of dwarves was known for his deep understanding of processes of life and death. " + + "He has persuaded members of his court to participate in a ritual, that should have granted them " + + "eternal youthfulness. In the end he was the only one, who got it - and an army of undead " + + "as a bonus."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( ToxicGas.class ); + RESISTANCES.add( Death.class ); + RESISTANCES.add( ScrollOfPsionicBlast.class ); + RESISTANCES.add( WandOfDisintegration.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Paralysis.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } + + public static class Undead extends Mob { + + public static int count = 0; + + { + name = "undead dwarf"; + spriteClass = UndeadSprite.class; + + HP = HT = 28; + defenseSkill = 15; + + EXP = 0; + + state = State.WANDERING; + } + + @Override + protected void onAdd() { + count++; + super.onAdd(); + } + + @Override + protected void onRemove() { + count--; + super.onRemove(); + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 12, 16 ); + } + + @Override + public int attackSkill( Char target ) { + return 16; + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (Random.Int( MAX_ARMY_SIZE ) == 0) { + Buff.prolong( enemy, Paralysis.class, 1 ); + } + + return damage; + } + + @Override + public void damage( int dmg, Object src ) { + super.damage( dmg, src ); + if (src instanceof ToxicGas) { + ((ToxicGas)src).clear( pos ); + } + } + + @Override + public void die( Object cause ) { + super.die( cause ); + + if (Dungeon.visible[pos]) { + Sample.INSTANCE.play( Assets.SND_BONES ); + } + } + + @Override + public int dr() { + return 5; + } + + @Override + public String defenseVerb() { + return "blocked"; + } + + @Override + public String description() { + return + "These undead dwarves, risen by the will of the King of Dwarves, were members of his court. " + + "They appear as skeletons with a stunning amount of facial hair."; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Death.class ); + IMMUNITIES.add( Paralysis.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Mob.java b/src/com/watabou/pixeldungeon/actors/mobs/Mob.java new file mode 100644 index 0000000000..e42b6c1b65 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Mob.java @@ -0,0 +1,528 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Amok; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Sleep; +import com.watabou.pixeldungeon.actors.buffs.Terror; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroSubClass; +import com.watabou.pixeldungeon.effects.Flare; +import com.watabou.pixeldungeon.effects.Wound; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public abstract class Mob extends Char { + + private static final String TXT_DIED = "You hear something died in the distance"; + + protected static final String TXT_NOTICE1 = "?!"; + protected static final String TXT_RAGE = "#$%^"; + protected static final String TXT_EXP = "%+dEXP"; + + public enum State { + SLEEPING, + HUNTING, + WANDERING, + FLEEING, + PASSIVE + } + public State state = State.SLEEPING; + + public Class spriteClass; + + protected int target = -1; + + protected int defenseSkill = 0; + + protected int EXP = 1; + protected int maxLvl = 30; + + protected Char enemy; + protected boolean enemySeen; + protected boolean alerted = false; + + protected static final float TIME_TO_WAKE_UP = 1f; + + public boolean hostile = true; + + // Unreachable target + public static final Mob DUMMY = new Mob() { + { + pos = -1; + } + }; + + private static final String STATE = "state"; + private static final String TARGET = "target"; + + @Override + public void storeInBundle( Bundle bundle ) { + + super.storeInBundle( bundle ); + + bundle.put( STATE, state.toString() ); + if (state != State.SLEEPING) { + bundle.put( TARGET, target ); + } + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + + super.restoreFromBundle( bundle ); + + state = State.valueOf( bundle.getString( STATE ) ); + if (state != State.SLEEPING) { + target = bundle.getInt( TARGET ); + } + } + + public CharSprite sprite() { + CharSprite sprite = null; + try { + sprite = spriteClass.newInstance(); + } catch (Exception e) { + } + return sprite; + } + + @Override + protected boolean act() { + + super.act(); + + boolean alertedNow = alerted; + alerted = false; + + sprite.hideAlert(); + + if (paralysed) { + enemySeen = false; + spend( TICK ); + return true; + } + + enemy = chooseEnemy(); + + boolean enemyInFOV = enemy.isAlive() && Level.fieldOfView[enemy.pos] && enemy.invisible <= 0; + + int oldPos = pos; + + switch (state) { + + case SLEEPING: + if (enemyInFOV && + Random.Int( distance( enemy ) + enemy.stealth() + (enemy.flying ? 2 : 0) ) == 0) { + + enemySeen = true; + + notice(); + state = State.HUNTING; + target = enemy.pos; + + spend( TIME_TO_WAKE_UP ); + + } else { + + enemySeen = false; + + spend( TICK ); + + } + return true; + + case WANDERING: + if (enemyInFOV && (alertedNow || Random.Int( distance( enemy ) / 2 + enemy.stealth() ) == 0)) { + + enemySeen = true; + + notice(); + state = State.HUNTING; + target = enemy.pos; + + } else { + + enemySeen = false; + + if (target != -1 && getCloser( target )) { + spend( 1 / speed() ); + return moveSprite( oldPos, pos ); + } else { + target = Dungeon.level.randomDestination(); + spend( TICK ); + } + + } + return true; + + case HUNTING: + enemySeen = enemyInFOV; + if (enemyInFOV && canAttack( enemy )) { + + return doAttack( enemy ); + + } else { + + if (enemyInFOV) { + target = enemy.pos; + } + + if (target != -1 && getCloser( target )) { + + + spend( 1 / speed() ); + return moveSprite( oldPos, pos ); + + } else { + + spend( TICK ); + state = State.WANDERING; + target = Dungeon.level.randomDestination(); // <-------- + return true; + } + } + + case FLEEING: + enemySeen = enemyInFOV; + if (enemyInFOV) { + target = enemy.pos; + } + if (target != -1 && getFurther( target )) { + + spend( 1 / speed() ); + return moveSprite( oldPos, pos ); + + } else { + + spend( TICK ); + nowhereToRun(); + + return true; + } + + case PASSIVE: + enemySeen = false; + spend( TICK ); + return true; + + } + + return true; + + } + + protected Char chooseEnemy() { + + if (buff( Amok.class ) != null) { + if (enemy == Dungeon.hero || enemy == null) { + + HashSet enemies = new HashSet(); + for (Mob mob:Dungeon.level.mobs) { + if (mob != this && Level.fieldOfView[mob.pos]) { + enemies.add( mob ); + } + } + if (enemies.size() > 0) { + return Random.element( enemies ); + } + + } else { + return enemy; + } + } + + Terror terror = (Terror)buff( Terror.class ); + if (terror != null) { + return terror.source; + } + + return Dungeon.hero; + } + + protected void nowhereToRun() { + } + + protected boolean moveSprite( int from, int to ) { + + if (sprite.isVisible() && (Dungeon.visible[from] || Dungeon.visible[to])) { + sprite.move( from, to ); + return false; + } else { + sprite.place( to ); + return true; + } + } + + @Override + public void add( Buff buff ) { + super.add( buff ); + if (buff instanceof Amok) { + if (sprite != null) { + sprite.showStatus( CharSprite.NEGATIVE, TXT_RAGE ); + } + state = State.HUNTING; + } else if (buff instanceof Terror) { + state = State.FLEEING; + } else if (buff instanceof Sleep) { + if (sprite != null) { + new Flare( 4, 32 ).color( 0x44ffff, true ).show( sprite, 2f ) ; + } + state = State.SLEEPING; + postpone( Sleep.SWS ); + } + } + + @Override + public void remove( Buff buff ) { + super.remove( buff ); + if (buff instanceof Terror) { + sprite.showStatus( CharSprite.NEGATIVE, TXT_RAGE ); + state = State.HUNTING; + } + } + + protected boolean canAttack( Char enemy ) { + return Level.adjacent( pos, enemy.pos ) && !pacified; + } + + protected boolean getCloser( int target ) { + + if (rooted) { + return false; + } + + int step = Dungeon.findPath( this, pos, target, + Level.passable, + Level.fieldOfView ); + if (step != -1) { + move( step ); + return true; + } else { + return false; + } + } + + protected boolean getFurther( int target ) { + int step = Dungeon.flee( this, pos, target, + Level.passable, + Level.fieldOfView ); + if (step != -1) { + move( step ); + return true; + } else { + return false; + } + } + + @Override + public void move( int step ) { + super.move( step ); + + if (!flying) { + Dungeon.level.mobPress( this ); + } + } + + protected float attackDelay() { + return 1f; + } + + protected boolean doAttack( Char enemy ) { + + boolean visible = Dungeon.visible[pos]; + + if (visible) { + sprite.attack( enemy.pos ); + } else { + attack( enemy ); + } + + spend( attackDelay() ); + + return !visible; + } + + @Override + public void onAttackComplete() { + attack( enemy ); + super.onAttackComplete(); + } + + @Override + public int defenseSkill( Char enemy ) { + return enemySeen && !paralysed ? defenseSkill : 0; + } + + @Override + public int defenseProc( Char enemy, int damage ) { + if (!enemySeen && enemy == Dungeon.hero && ((Hero)enemy).subClass == HeroSubClass.ASSASSIN) { + damage += Random.Int( 1, damage ); + Wound.hit( this ); + } + return damage; + } + + @Override + public void damage( int dmg, Object src ) { + + Terror.recover( this ); + + if (state == State.SLEEPING) { + state = State.WANDERING; + } + alerted = true; + + super.damage( dmg, src ); + } + + + @Override + public void destroy() { + + super.destroy(); + + Dungeon.level.mobs.remove( this ); + + if (Dungeon.hero.isAlive()) { + + if (hostile) { + Statistics.enemiesSlain++; + Badges.validateMonstersSlain(); + Statistics.qualifiedForNoKilling = false; + + if (Dungeon.nightMode) { + Statistics.nightHunt++; + } else { + Statistics.nightHunt = 0; + } + Badges.validateNightHunter(); + } + + if (Dungeon.hero.lvl <= maxLvl && EXP > 0) { + Dungeon.hero.sprite.showStatus( CharSprite.POSITIVE, TXT_EXP, EXP ); + Dungeon.hero.earnExp( EXP ); + } + } + } + + @Override + public void die( Object cause ) { + + super.die( cause ); + + if (Dungeon.hero.lvl <= maxLvl + 2) { + dropLoot(); + } + + if (Dungeon.hero.isAlive() && !Dungeon.visible[pos]) { + GLog.i( TXT_DIED ); + } + } + + protected Object loot = null; + protected float lootChance = 0; + + @SuppressWarnings("unchecked") + protected void dropLoot() { + if (loot != null && Random.Float() < lootChance) { + Item item = null; + if (loot instanceof Generator.Category) { + + item = Generator.random( (Generator.Category)loot ); + + } else if (loot instanceof Class) { + + item = Generator.random( (Class)loot ); + + } else { + + item = (Item)loot; + + } + Dungeon.level.drop( item, pos ).sprite.drop(); + } + } + + public boolean reset() { + return false; + } + + public void beckon( int cell ) { + + notice(); + + if (state != State.HUNTING) { + state = State.WANDERING; + } + target = cell; + } + + public String description() { + return "Real description is coming soon!"; + } + + public void notice() { + sprite.showAlert(); + } + + public void yell( String str ) { + GLog.n( "%s: \"%s\" ", name, str ); + } + + public static abstract class NPC extends Mob { + + { + HP = HT = 1; + EXP = 0; + + hostile = false; + state = State.PASSIVE; + } + + protected void throwItem() { + Heap heap = Dungeon.level.heaps.get( pos ); + if (heap != null) { + int n; + do { + n = pos + Level.NEIGHBOURS8[Random.Int( 8 )]; + } while (!Level.passable[n] && !Level.avoid[n]); + Dungeon.level.drop( heap.pickUp(), n ).sprite.drop( pos ); + } + } + + @Override + public void beckon( int cell ) { + } + + abstract public void interact(); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Monk.java b/src/com/watabou/pixeldungeon/actors/mobs/Monk.java new file mode 100644 index 0000000000..f3697acafd --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Monk.java @@ -0,0 +1,120 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Amok; +import com.watabou.pixeldungeon.actors.buffs.Terror; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.npcs.Imp; +import com.watabou.pixeldungeon.items.KindOfWeapon; +import com.watabou.pixeldungeon.items.food.Food; +import com.watabou.pixeldungeon.items.weapon.melee.Knuckles; +import com.watabou.pixeldungeon.sprites.MonkSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Random; + +public class Monk extends Mob { + + public static final String TXT_DISARM = "%s has knocked the %s from your hands!"; + + { + name = "dwarf monk"; + spriteClass = MonkSprite.class; + + HP = HT = 70; + defenseSkill = 30; + + EXP = 11; + maxLvl = 21; + + loot = new Food(); + lootChance = 0.083f; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 12, 16 ); + } + + @Override + public int attackSkill( Char target ) { + return 30; + } + + @Override + protected float attackDelay() { + return 0.5f; + } + + @Override + public int dr() { + return 2; + } + + @Override + public String defenseVerb() { + return "parried"; + } + + @Override + public void die( Object cause ) { + Imp.Quest.process( this ); + + super.die( cause ); + } + + @Override + public int attackProc( Char enemy, int damage ) { + + if (Random.Int( 6 ) == 0 && enemy == Dungeon.hero) { + + Hero hero = Dungeon.hero; + KindOfWeapon weapon = hero.belongings.weapon; + + if (weapon != null && !(weapon instanceof Knuckles) && !weapon.cursed) { + hero.belongings.weapon = null; + Dungeon.level.drop( weapon, hero.pos ).sprite.drop(); + GLog.w( TXT_DISARM, name, weapon.name() ); + } + } + + return damage; + } + + @Override + public String description() { + return + "These monks are fanatics, who devoted themselves to protecting their city's secrets from all aliens. " + + "They don't use any armor or weapons, relying solely on the art of hand-to-hand combat."; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Amok.class ); + IMMUNITIES.add( Terror.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Piranha.java b/src/com/watabou/pixeldungeon/actors/mobs/Piranha.java new file mode 100644 index 0000000000..551f5be1b6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Piranha.java @@ -0,0 +1,144 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.actors.buffs.Frost; +import com.watabou.pixeldungeon.actors.buffs.Paralysis; +import com.watabou.pixeldungeon.actors.buffs.Roots; +import com.watabou.pixeldungeon.items.food.MysteryMeat; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.sprites.PiranhaSprite; +import com.watabou.utils.Random; + +public class Piranha extends Mob { + + { + name = "giant piranha"; + spriteClass = PiranhaSprite.class; + + baseSpeed = 2f; + + EXP = 0; + } + + public Piranha() { + super(); + + HP = HT = 10 + Dungeon.depth * 5; + defenseSkill = 10 + Dungeon.depth * 2; + } + + @Override + protected boolean act() { + if (!Level.water[pos]) { + die( null ); + return true; + } else { + return super.act(); + } + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( Dungeon.depth, 4 + Dungeon.depth * 2 ); + } + + @Override + public int attackSkill( Char target ) { + return 20 + Dungeon.depth * 2; + } + + @Override + public int dr() { + return Dungeon.depth; + } + + @Override + public void die( Object cause ) { + Dungeon.level.drop( new MysteryMeat(), pos ).sprite.drop(); + super.die( cause ); + + Statistics.piranhasKilled++; + Badges.validatePiranhasKilled(); + } + + @Override + public boolean reset() { + return true; + } + + @Override + protected boolean getCloser( int target ) { + + if (rooted) { + return false; + } + + int step = Dungeon.findPath( this, pos, target, + Level.water, + Level.fieldOfView ); + if (step != -1) { + move( step ); + return true; + } else { + return false; + } + } + + @Override + protected boolean getFurther( int target ) { + int step = Dungeon.flee( this, pos, target, + Level.water, + Level.fieldOfView ); + if (step != -1) { + move( step ); + return true; + } else { + return false; + } + } + + @Override + public String description() { + return + "These carnivorous fish are not natural inhabitants of underground pools. " + + "They were bred specifically to protect flooded treasure vaults."; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Burning.class ); + IMMUNITIES.add( Paralysis.class ); + IMMUNITIES.add( ToxicGas.class ); + IMMUNITIES.add( Roots.class ); + IMMUNITIES.add( Frost.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Rat.java b/src/com/watabou/pixeldungeon/actors/mobs/Rat.java new file mode 100644 index 0000000000..cb06ea288a --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Rat.java @@ -0,0 +1,65 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.npcs.Ghost; +import com.watabou.pixeldungeon.sprites.RatSprite; +import com.watabou.utils.Random; + +public class Rat extends Mob { + + { + name = "marsupial rat"; + spriteClass = RatSprite.class; + + HP = HT = 8; + defenseSkill = 3; + + maxLvl = 5; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 1, 5 ); + } + + @Override + public int attackSkill( Char target ) { + return 8; + } + + @Override + public int dr() { + return 1; + } + + @Override + public void die( Object cause ) { + Ghost.Quest.process( pos ); + + super.die( cause ); + } + + @Override + public String description() { + return + "Marsupial rats are aggressive, but rather weak denizens " + + "of the sewers. They can be dangerous only in big numbers."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Scorpio.java b/src/com/watabou/pixeldungeon/actors/mobs/Scorpio.java new file mode 100644 index 0000000000..724a43f71d --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Scorpio.java @@ -0,0 +1,117 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Cripple; +import com.watabou.pixeldungeon.actors.buffs.Light; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.items.food.MysteryMeat; +import com.watabou.pixeldungeon.items.potions.PotionOfHealing; +import com.watabou.pixeldungeon.items.weapon.enchantments.Leech; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.sprites.ScorpioSprite; +import com.watabou.utils.Random; + +public class Scorpio extends Mob { + + { + name = "scorpio"; + spriteClass = ScorpioSprite.class; + + HP = HT = 95; + defenseSkill = 24; + viewDistance = Light.DISTANCE; + + EXP = 14; + maxLvl = 25; + + loot = new PotionOfHealing(); + lootChance = 0.125f; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 20, 32 ); + } + + @Override + public int attackSkill( Char target ) { + return 36; + } + + @Override + public int dr() { + return 16; + } + + @Override + protected boolean canAttack( Char enemy ) { + return !Level.adjacent( pos, enemy.pos ) && Ballistica.cast( pos, enemy.pos, false, true ) == enemy.pos; + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (Random.Int( 2 ) == 0) { + Buff.prolong( enemy, Cripple.class, Cripple.DURATION ); + } + + return damage; + } + + @Override + protected boolean getCloser( int target ) { + if (state == State.HUNTING) { + return enemySeen && getFurther( target ); + } else { + return super.getCloser( target ); + } + } + + @Override + protected void dropLoot() { + if (Random.Int( 8 ) == 0) { + Dungeon.level.drop( new PotionOfHealing(), pos ).sprite.drop(); + } else if (Random.Int( 6 ) == 0) { + Dungeon.level.drop( new MysteryMeat(), pos ).sprite.drop(); + } + } + + @Override + public String description() { + return + "These huge arachnid-like demonic creatures avoid close combat by all means, " + + "firing crippling serrated spikes from long distances."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( Leech.class ); + RESISTANCES.add( Poison.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Senior.java b/src/com/watabou/pixeldungeon/actors/mobs/Senior.java new file mode 100644 index 0000000000..4f1e2cc113 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Senior.java @@ -0,0 +1,52 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Paralysis; +import com.watabou.pixeldungeon.sprites.SeniorSprite; +import com.watabou.utils.Random; + +public class Senior extends Monk { + + { + name = "senior monk"; + spriteClass = SeniorSprite.class; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 12, 20 ); + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (Random.Int( 10 ) == 0) { + Buff.prolong( enemy, Paralysis.class, 1.1f ); + } + return super.attackProc( enemy, damage ); + } + + @Override + public void die( Object cause ) { + super.die( cause ); + Badges.validateRare( this ); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Shaman.java b/src/com/watabou/pixeldungeon/actors/mobs/Shaman.java new file mode 100644 index 0000000000..97515f9990 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Shaman.java @@ -0,0 +1,144 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.noosa.Camera; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.effects.particles.SparkParticle; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.traps.LightningTrap; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.ShamanSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Callback; +import com.watabou.utils.Random; + +public class Shaman extends Mob implements Callback { + + private static final float TIME_TO_ZAP = 2f; + + private static final String TXT_LIGHTNING_KILLED = "%s's lightning bolt killed you..."; + + { + name = "gnoll shaman"; + spriteClass = ShamanSprite.class; + + HP = HT = 18; + defenseSkill = 8; + + EXP = 6; + maxLvl = 14; + + loot = Generator.Category.SCROLL; + lootChance = 0.33f; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 2, 6 ); + } + + @Override + public int attackSkill( Char target ) { + return 11; + } + + @Override + public int dr() { + return 4; + } + + @Override + protected boolean canAttack( Char enemy ) { + return Ballistica.cast( pos, enemy.pos, false, true ) == enemy.pos; + } + + @Override + protected boolean doAttack( Char enemy ) { + + if (Level.distance( pos, enemy.pos ) <= 1) { + + return super.doAttack( enemy ); + + } else { + + boolean visible = Level.fieldOfView[pos] || Level.fieldOfView[enemy.pos]; + if (visible) { + ((ShamanSprite)sprite).zap( enemy.pos ); + } + + spend( TIME_TO_ZAP ); + + if (hit( this, enemy, true )) { + int dmg = Random.Int( 2, 12 ); + if (Level.water[enemy.pos] && !enemy.flying) { + dmg *= 1.5f; + } + enemy.damage( dmg, LightningTrap.LIGHTNING ); + + enemy.sprite.centerEmitter().burst( SparkParticle.FACTORY, 3 ); + enemy.sprite.flash(); + + if (enemy == Dungeon.hero) { + + Camera.main.shake( 2, 0.3f ); + + if (!enemy.isAlive()) { + Dungeon.fail( Utils.format( ResultDescriptions.MOB, + Utils.indefinite( name ), Dungeon.depth ) ); + GLog.n( TXT_LIGHTNING_KILLED, name ); + } + } + } else { + enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() ); + } + + return !visible; + } + } + + @Override + public void call() { + next(); + } + + @Override + public String description() { + return + "The most intelligent gnolls can master shamanistic magic. Gnoll shamans prefer " + + "battle spells to compensate for lack of might, not hesitating to use them " + + "on those who question their status in a tribe."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( LightningTrap.Electricity.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Shielded.java b/src/com/watabou/pixeldungeon/actors/mobs/Shielded.java new file mode 100644 index 0000000000..c4e4329d09 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Shielded.java @@ -0,0 +1,47 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.sprites.ShieldedSprite; + +public class Shielded extends Brute { + + { + name = "shielded brute"; + spriteClass = ShieldedSprite.class; + + defenseSkill = 20; + } + + @Override + public int dr() { + return 10; + } + + @Override + public String defenseVerb() { + return "blocked"; + } + + @Override + public void die( Object cause ) { + super.die( cause ); + Badges.validateRare( this ); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Skeleton.java b/src/com/watabou/pixeldungeon/actors/mobs/Skeleton.java new file mode 100644 index 0000000000..4c9b3a3582 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Skeleton.java @@ -0,0 +1,129 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.weapon.enchantments.Death; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.sprites.SkeletonSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Random; + +public class Skeleton extends Mob { + + private static final String TXT_HERO_KILLED = "You were killed by the explosion of bones..."; + + { + name = "skeleton"; + spriteClass = SkeletonSprite.class; + + HP = HT = 25; + defenseSkill = 9; + + EXP = 5; + maxLvl = 10; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 3, 8 ); + } + + @Override + public void die( Object cause ) { + + super.die( cause ); + + boolean heroKilled = false; + for (int i=0; i < Level.NEIGHBOURS8.length; i++) { + Char ch = findChar( pos + Level.NEIGHBOURS8[i] ); + if (ch != null && ch.isAlive()) { + int damage = Math.max( 0, damageRoll() - Random.IntRange( 0, ch.dr() / 2 ) ); + ch.damage( damage, this ); + if (ch == Dungeon.hero && !ch.isAlive()) { + heroKilled = true; + } + } + } + + if (Dungeon.visible[pos]) { + Sample.INSTANCE.play( Assets.SND_BONES ); + } + + if (heroKilled) { + Dungeon.fail( Utils.format( ResultDescriptions.MOB, Utils.indefinite( name ), Dungeon.depth ) ); + GLog.n( TXT_HERO_KILLED ); + } + } + + @Override + protected void dropLoot() { + if (Random.Int( 5 ) == 0) { + Item loot = Generator.random( Generator.Category.WEAPON ); + for (int i=0; i < 2; i++) { + Item l = Generator.random( Generator.Category.WEAPON ); + if (l.level < loot.level) { + loot = l; + } + } + Dungeon.level.drop( loot, pos ).sprite.drop(); + } + } + + @Override + public int attackSkill( Char target ) { + return 12; + } + + @Override + public int dr() { + return 5; + } + + @Override + public String defenseVerb() { + return "blocked"; + } + + @Override + public String description() { + return + "Skeletons are composed of corpses bones from unlucky adventurers and inhabitants of the dungeon, " + + "animated by emanations of evil magic from the depths below. After they have been " + + "damaged enough, they disintegrate in an explosion of bones."; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Death.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Spinner.java b/src/com/watabou/pixeldungeon/actors/mobs/Spinner.java new file mode 100644 index 0000000000..c93e73dbcf --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Spinner.java @@ -0,0 +1,130 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.Web; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.actors.buffs.Roots; +import com.watabou.pixeldungeon.actors.buffs.Terror; +import com.watabou.pixeldungeon.items.food.MysteryMeat; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.SpinnerSprite; +import com.watabou.utils.Random; + +public class Spinner extends Mob { + + { + name = "cave spinner"; + spriteClass = SpinnerSprite.class; + + HP = HT = 50; + defenseSkill = 14; + + EXP = 9; + maxLvl = 16; + + loot = new MysteryMeat(); + lootChance = 0.125f; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 12, 16 ); + } + + @Override + protected void nowhereToRun() { + if (buff( Terror.class ) == null) { + state = State.HUNTING; + } else { + super.nowhereToRun(); + } + } + + @Override + public int attackSkill( Char target ) { + return 20; + } + + @Override + public int dr() { + return 6; + } + + @Override + protected boolean act() { + boolean result = super.act(); + + if (state == State.FLEEING && buff( Terror.class ) == null && + enemySeen && enemy.buff( Poison.class ) == null) { + + state = State.HUNTING; + } + return result; + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (Random.Int( 2 ) == 0) { + Buff.affect( enemy, Poison.class ).set( Random.Int( 5, 7 ) * Poison.durationFactor( enemy ) ); + state = State.FLEEING; + } + + return damage; + } + + @Override + public void move( int step ) { + if (state == State.FLEEING) { + GameScene.add( Blob.seed( pos, Random.Int( 5, 7 ), Web.class ) ); + } + super.move( step ); + } + + @Override + public String description() { + return + "These greenish furry cave spiders try to avoid direct combat, preferring to wait in the distance " + + "while their victim, entangled in the spinner's excreted cobweb, slowly dies from their poisonous bite."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( Poison.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Roots.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Statue.java b/src/com/watabou/pixeldungeon/actors/mobs/Statue.java new file mode 100644 index 0000000000..3e9ba24a3d --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Statue.java @@ -0,0 +1,170 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Journal; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfPsionicBlast; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.items.weapon.Weapon.Enchantment; +import com.watabou.pixeldungeon.items.weapon.enchantments.Death; +import com.watabou.pixeldungeon.items.weapon.enchantments.Leech; +import com.watabou.pixeldungeon.items.weapon.melee.MeleeWeapon; +import com.watabou.pixeldungeon.sprites.StatueSprite; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Statue extends Mob { + + { + name = "animated statue"; + spriteClass = StatueSprite.class; + + EXP = 0; + state = State.PASSIVE; + } + + private Weapon weapon; + + public Statue() { + super(); + + do { + weapon = (Weapon)Generator.random( Generator.Category.WEAPON ); + } while (!(weapon instanceof MeleeWeapon) || weapon.level < 0); + + weapon.identify(); + weapon.enchant( Enchantment.random() ); + + HP = HT = 15 + Dungeon.depth * 5; + defenseSkill = 4 + Dungeon.depth; + } + + private static final String WEAPON = "weapon"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( WEAPON, weapon ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + weapon = (Weapon)bundle.get( WEAPON ); + } + + @Override + protected boolean act() { + if (Dungeon.visible[pos]) { + Journal.add( Journal.Feature.STATUE ); + } + return super.act(); + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( weapon.MIN, weapon.MAX ); + } + + @Override + public int attackSkill( Char target ) { + return (int)((9 + Dungeon.depth) * weapon.ACU); + } + + @Override + protected float attackDelay() { + return weapon.DLY; + } + + @Override + public int dr() { + return Dungeon.depth; + } + + @Override + public void damage( int dmg, Object src ) { + + if (state == State.PASSIVE) { + state = State.HUNTING; + } + + super.damage( dmg, src ); + } + + @Override + public int attackProc( Char enemy, int damage ) { + weapon.proc( this, enemy, damage ); + return damage; + } + + @Override + public void beckon( int cell ) { + } + + @Override + public void die( Object cause ) { + Dungeon.level.drop( weapon, pos ).sprite.drop(); + super.die( cause ); + } + + @Override + public void destroy() { + Journal.remove( Journal.Feature.STATUE ); + super.destroy(); + } + + @Override + public boolean reset() { + state = State.PASSIVE; + return true; + } + + @Override + public String description() { + return + "You would think that it's just another ugly statue of this dungeon, but its red glowing eyes give itself away. " + + "While the statue itself is made of stone, the _" + weapon.name() + "_, it's wielding, looks real."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + RESISTANCES.add( ToxicGas.class ); + RESISTANCES.add( Poison.class ); + RESISTANCES.add( Death.class ); + RESISTANCES.add( ScrollOfPsionicBlast.class ); + IMMUNITIES.add( Leech.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Succubus.java b/src/com/watabou/pixeldungeon/actors/mobs/Succubus.java new file mode 100644 index 0000000000..764c593241 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Succubus.java @@ -0,0 +1,142 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Charm; +import com.watabou.pixeldungeon.actors.buffs.Light; +import com.watabou.pixeldungeon.actors.buffs.Sleep; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfLullaby; +import com.watabou.pixeldungeon.items.wands.WandOfBlink; +import com.watabou.pixeldungeon.items.weapon.enchantments.Leech; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.sprites.SuccubusSprite; +import com.watabou.utils.Random; + +public class Succubus extends Mob { + + private static final int BLINK_DELAY = 5; + + private int delay = 0; + + { + name = "succubus"; + spriteClass = SuccubusSprite.class; + + HP = HT = 80; + defenseSkill = 25; + viewDistance = Light.DISTANCE; + + EXP = 12; + maxLvl = 25; + + loot = new ScrollOfLullaby(); + lootChance = 0.05f; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 15, 25 ); + } + + @Override + public int attackProc( Char enemy, int damage ) { + + if (Random.Int( 3 ) == 0) { + Buff.affect( enemy, Charm.class, Charm.durationFactor( enemy ) * Random.IntRange( 2, 5 ) ); + enemy.sprite.centerEmitter().start( Speck.factory( Speck.HEART ), 0.2f, 5 ); + Sample.INSTANCE.play( Assets.SND_CHARMS ); + } + + return damage; + } + + @Override + protected boolean getCloser( int target ) { + if (Level.fieldOfView[target] && Level.distance( pos, target ) > 2 && delay <= 0) { + + blink( target ); + spend( -1 / speed() ); + return true; + + } else { + + delay--; + return super.getCloser( target ); + + } + } + + private void blink( int target ) { + + int cell = Ballistica.cast( pos, target, true, true ); + + if (Actor.findChar( cell ) != null && Ballistica.distance > 1) { + cell = Ballistica.trace[Ballistica.distance - 2]; + } + + WandOfBlink.appear( this, cell ); + + delay = BLINK_DELAY; + } + + @Override + public int attackSkill( Char target ) { + return 40; + } + + @Override + public int dr() { + return 10; + } + + @Override + public String description() { + return + "The succubi are demons that look like seductive (in a slightly gothic way) girls. Using its magic, the succubus " + + "can charm a hero, who will become unable to attack anything until the charm wears off."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( Leech.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Sleep.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Swarm.java b/src/com/watabou/pixeldungeon/actors/mobs/Swarm.java new file mode 100644 index 0000000000..9e3dcb54b0 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Swarm.java @@ -0,0 +1,145 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.ArrayList; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.effects.Pushing; +import com.watabou.pixeldungeon.items.potions.PotionOfHealing; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.levels.features.Door; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.SwarmSprite; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Swarm extends Mob { + + { + name = "swarm of flies"; + spriteClass = SwarmSprite.class; + + HP = HT = 80; + defenseSkill = 5; + + maxLvl = 10; + + flying = true; + } + + private static final float SPLIT_DELAY = 1f; + + int generation = 0; + + private static final String GENERATION = "generation"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( GENERATION, generation ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + generation = bundle.getInt( GENERATION ); + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 1, 4 ); + } + + @Override + public int defenseProc( Char enemy, int damage ) { + + if (HP >= damage + 2) { + ArrayList candidates = new ArrayList(); + boolean[] passable = Level.passable; + + int[] neighbours = {pos + 1, pos - 1, pos + Level.WIDTH, pos - Level.WIDTH}; + for (int n : neighbours) { + if (passable[n] && Actor.findChar( n ) == null) { + candidates.add( n ); + } + } + + if (candidates.size() > 0) { + + Swarm clone = split(); + clone.HP = (HP - damage) / 2; + clone.pos = Random.element( candidates ); + clone.state = State.HUNTING; + + if (Dungeon.level.map[clone.pos] == Terrain.DOOR) { + Door.enter( clone.pos ); + } + + GameScene.add( clone, SPLIT_DELAY ); + Actor.addDelayed( new Pushing( clone, pos, clone.pos ), -1 ); + + HP -= clone.HP; + } + } + + return damage; + } + + @Override + public int attackSkill( Char target ) { + return 12; + } + + @Override + public String defenseVerb() { + return "evaded"; + } + + private Swarm split() { + Swarm clone = new Swarm(); + clone.generation = generation + 1; + if (buff( Burning.class ) != null) { + Buff.affect( clone, Burning.class ).reignite( clone ); + } + if (buff( Poison.class ) != null) { + Buff.affect( clone, Poison.class ).set( 2 ); + } + return clone; + } + + @Override + protected void dropLoot() { + if (Random.Int( 5 * (generation + 1) ) == 0) { + Dungeon.level.drop( new PotionOfHealing(), pos ).sprite.drop(); + } + } + + @Override + public String description() { + return + "The deadly swarm of flies buzzes angrily. Every non-magical attack " + + "will split it into two smaller but equally dangerous swarms."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Tengu.java b/src/com/watabou/pixeldungeon/actors/mobs/Tengu.java new file mode 100644 index 0000000000..be59824ca4 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Tengu.java @@ -0,0 +1,193 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Badges.Badge; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.TomeOfMastery; +import com.watabou.pixeldungeon.items.keys.SkeletonKey; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfMagicMapping; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfPsionicBlast; +import com.watabou.pixeldungeon.items.weapon.enchantments.Death; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.TenguSprite; +import com.watabou.utils.Random; + +public class Tengu extends Mob { + + private static final int JUMP_DELAY = 5; + + { + name = "Tengu"; + spriteClass = TenguSprite.class; + + HP = HT = 120; + EXP = 20; + defenseSkill = 20; + } + + private int timeToJump = JUMP_DELAY; + + @Override + public int damageRoll() { + return Random.NormalIntRange( 8, 15 ); + } + + @Override + public int attackSkill( Char target ) { + return 20; + } + + @Override + public int dr() { + return 5; + } + + @Override + public void die( Object cause ) { + + Badges.Badge badgeToCheck = null; + switch (Dungeon.hero.heroClass) { + case WARRIOR: + badgeToCheck = Badge.MASTERY_WARRIOR; + break; + case MAGE: + badgeToCheck = Badge.MASTERY_MAGE; + break; + case ROGUE: + badgeToCheck = Badge.MASTERY_ROGUE; + break; + case HUNTRESS: + badgeToCheck = Badge.MASTERY_HUNTRESS; + break; + } + if (!Badges.isUnlocked( badgeToCheck )) { + Dungeon.level.drop( new TomeOfMastery(), pos ).sprite.drop(); + } + + GameScene.bossSlain(); + Dungeon.level.drop( new SkeletonKey( Dungeon.depth ), pos ).sprite.drop(); + super.die( cause ); + + Badges.validateBossSlain(); + + yell( "Free at last..." ); + } + + @Override + protected boolean getCloser( int target ) { + if (Level.fieldOfView[target]) { + jump(); + return true; + } else { + return super.getCloser( target ); + } + } + + @Override + protected boolean canAttack( Char enemy ) { + return Ballistica.cast( pos, enemy.pos, false, true ) == enemy.pos; + } + + @Override + protected boolean doAttack( Char enemy ) { + timeToJump--; + if (timeToJump <= 0 && Level.adjacent( pos, enemy.pos )) { + jump(); + return true; + } else { + return super.doAttack( enemy ); + } + } + + private void jump() { + timeToJump = JUMP_DELAY; + + for (int i=0; i < 4; i++) { + int trapPos; + do { + trapPos = Random.Int( Level.LENGTH ); + } while (!Level.fieldOfView[trapPos] || !Level.passable[trapPos]); + + if (Dungeon.level.map[trapPos] == Terrain.INACTIVE_TRAP) { + Level.set( trapPos, Terrain.POISON_TRAP ); + GameScene.updateMap( trapPos ); + ScrollOfMagicMapping.discover( trapPos ); + } + } + + int newPos; + do { + newPos = Random.Int( Level.LENGTH ); + } while ( + !Level.fieldOfView[newPos] || + !Level.passable[newPos] || + Level.adjacent( newPos, enemy.pos ) || + Actor.findChar( newPos ) != null); + + sprite.move( pos, newPos ); + move( newPos ); + + if (Dungeon.visible[newPos]) { + CellEmitter.get( newPos ).burst( Speck.factory( Speck.WOOL ), 6 ); + Sample.INSTANCE.play( Assets.SND_PUFF ); + } + + spend( 1 / speed() ); + } + + @Override + public void notice() { + super.notice(); + yell( "Gotcha, " + Dungeon.hero.heroClass.title() + "!" ); + } + + @Override + public String description() { + return + "Tengu are members of the ancient assassins clan, which is also called Tengu. " + + "These assassins are noted for extensive use of shuriken and traps."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( ToxicGas.class ); + RESISTANCES.add( Poison.class ); + RESISTANCES.add( Death.class ); + RESISTANCES.add( ScrollOfPsionicBlast.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Thief.java b/src/com/watabou/pixeldungeon/actors/mobs/Thief.java new file mode 100644 index 0000000000..d73f2e636d --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Thief.java @@ -0,0 +1,156 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Terror; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Gold; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.rings.RingOfHaggler; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.ThiefSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Thief extends Mob { + + protected static final String TXT_STOLE = "%s stole %s from you!"; + protected static final String TXT_CARRIES = "\n\n%s is carrying a _%s_. Stolen obviously."; + + public Item item; + + { + name = "crazy thief"; + spriteClass = ThiefSprite.class; + + HP = HT = 20; + defenseSkill = 12; + + EXP = 5; + maxLvl = 10; + + loot = RingOfHaggler.class; + lootChance = 0.01f; + } + + private static final String ITEM = "item"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( ITEM, item ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + item = (Item)bundle.get( ITEM ); + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 1, 7 ); + } + + @Override + protected float attackDelay() { + return 0.5f; + } + + @Override + protected void nowhereToRun() { + if (buff( Terror.class ) == null) { + sprite.showStatus( CharSprite.NEGATIVE, TXT_RAGE ); + state = State.HUNTING; + } else { + super.nowhereToRun(); + } + } + + @Override + public void die( Object cause ) { + + super.die( cause ); + + if (item != null) { + Dungeon.level.drop( item, pos ).sprite.drop(); + } + } + + @Override + public int attackSkill( Char target ) { + return 12; + } + + @Override + public int dr() { + return 3; + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (item == null && enemy instanceof Hero && steal( (Hero)enemy )) { + state = State.FLEEING; + } + + return damage; + } + + @Override + public int defenseProc(Char enemy, int damage) { + if (state == State.FLEEING) { + Dungeon.level.drop( new Gold(), pos ).sprite.drop(); + } + + return damage; + } + + protected boolean steal( Hero hero ) { + + Item item = hero.belongings.randomUnequipped(); + if (item != null) { + + GLog.w( TXT_STOLE, this.name, item.name() ); + + item.detachAll( hero.belongings.backpack ); + this.item = item; + + return true; + } else { + return false; + } + } + + @Override + public String description() { + String desc = + "Deeper levels of the dungeon have always been a hiding place for all kinds of criminals. " + + "Not all of them could keep a clear mind during their extended periods so far from daylight. Long ago, " + + "these crazy thieves and bandits have forgotten who they are and why they steal."; + + if (item != null) { + desc += String.format( TXT_CARRIES, Utils.capitalize( this.name ), item.name() ); + } + + return desc; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Warlock.java b/src/com/watabou/pixeldungeon/actors/mobs/Warlock.java new file mode 100644 index 0000000000..de3e863339 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Warlock.java @@ -0,0 +1,145 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Weakness; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.weapon.enchantments.Death; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.WarlockSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Callback; +import com.watabou.utils.Random; + +public class Warlock extends Mob implements Callback { + + private static final float TIME_TO_ZAP = 1f; + + private static final String TXT_SHADOWBOLT_KILLED = "%s's shadow bolt killed you..."; + + { + name = "dwarf warlock"; + spriteClass = WarlockSprite.class; + + HP = HT = 70; + defenseSkill = 18; + + EXP = 11; + maxLvl = 21; + + loot = Generator.Category.POTION; + lootChance = 0.83f; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 12, 20 ); + } + + @Override + public int attackSkill( Char target ) { + return 25; + } + + @Override + public int dr() { + return 8; + } + + @Override + protected boolean canAttack( Char enemy ) { + return Ballistica.cast( pos, enemy.pos, false, true ) == enemy.pos; + } + + protected boolean doAttack( Char enemy ) { + + if (Level.adjacent( pos, enemy.pos )) { + + return super.doAttack( enemy ); + + } else { + + boolean visible = Level.fieldOfView[pos] || Level.fieldOfView[enemy.pos]; + if (visible) { + ((WarlockSprite)sprite).zap( enemy.pos ); + } else { + zap(); + } + + return !visible; + } + } + + private void zap() { + spend( TIME_TO_ZAP ); + + if (hit( this, enemy, true )) { + if (enemy == Dungeon.hero && Random.Int( 2 ) == 0) { + Buff.prolong( enemy, Weakness.class, Weakness.duration( enemy ) ); + } + + int dmg = Random.Int( 12, 18 ); + enemy.damage( dmg, this ); + + if (!enemy.isAlive() && enemy == Dungeon.hero) { + Dungeon.fail( Utils.format( ResultDescriptions.MOB, + Utils.indefinite( name ), Dungeon.depth ) ); + GLog.n( TXT_SHADOWBOLT_KILLED, name ); + } + } else { + enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() ); + } + } + + public void onZapComplete() { + zap(); + next(); + } + + @Override + public void call() { + next(); + } + + @Override + public String description() { + return + "When dwarves' interests have shifted from engineering to arcane arts, " + + "warlocks have come to power in the city. They started with elemental magic, " + + "but soon switched to demonology and necromancy."; + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( Death.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Wraith.java b/src/com/watabou/pixeldungeon/actors/mobs/Wraith.java new file mode 100644 index 0000000000..2a05e26d0b --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Wraith.java @@ -0,0 +1,139 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.HashSet; + +import com.watabou.noosa.tweeners.AlphaTweener; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Terror; +import com.watabou.pixeldungeon.effects.particles.ShadowParticle; +import com.watabou.pixeldungeon.items.weapon.enchantments.Death; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.WraithSprite; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Wraith extends Mob { + + private static final float SPAWN_DELAY = 2f; + + private int level; + + { + name = "wraith"; + spriteClass = WraithSprite.class; + + HP = HT = 1; + EXP = 0; + + flying = true; + } + + private static final String LEVEL = "level"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( LEVEL, level ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + level = bundle.getInt( LEVEL ); + adjustStats( level ); + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 1, 3 + level ); + } + + @Override + public int attackSkill( Char target ) { + return 10 + level; + } + + public void adjustStats( int level ) { + this.level = level; + defenseSkill = attackSkill( null ) * 5; + enemySeen = true; + } + + @Override + public String defenseVerb() { + return "evaded"; + } + + @Override + public boolean reset() { + state = State.WANDERING; + return true; + } + + @Override + public String description() { + return + "A wraith is a vengeful spirit of a sinner, whose grave or tomb was disturbed. " + + "Being an ethereal entity, it is very hard to hit with a regular weapon."; + } + + public static void spawnAround( int pos ) { + for (int n : Level.NEIGHBOURS4) { + int cell = pos + n; + if (Level.passable[cell] && Actor.findChar( cell ) == null) { + spawnAt( cell ); + } + } + } + + public static Wraith spawnAt( int pos ) { + if (Level.passable[pos] && Actor.findChar( pos ) == null) { + + Wraith w = new Wraith(); + w.adjustStats( Dungeon.depth ); + w.pos = pos; + w.state = State.HUNTING; + GameScene.add( w, SPAWN_DELAY ); + + w.sprite.alpha( 0 ); + w.sprite.parent.add( new AlphaTweener( w.sprite, 1, 0.5f ) ); + + w.sprite.emitter().burst( ShadowParticle.CURSE, 5 ); + + return w; + } else { + return null; + } + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Death.class ); + IMMUNITIES.add( Terror.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/Yog.java b/src/com/watabou/pixeldungeon/actors/mobs/Yog.java new file mode 100644 index 0000000000..e8a2dad05b --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/Yog.java @@ -0,0 +1,430 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs; + +import java.util.ArrayList; +import java.util.HashSet; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.Fire; +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.actors.buffs.Amok; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.actors.buffs.Charm; +import com.watabou.pixeldungeon.actors.buffs.Ooze; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.actors.buffs.Sleep; +import com.watabou.pixeldungeon.actors.buffs.Terror; +import com.watabou.pixeldungeon.effects.Pushing; +import com.watabou.pixeldungeon.effects.particles.ShadowParticle; +import com.watabou.pixeldungeon.items.keys.SkeletonKey; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfPsionicBlast; +import com.watabou.pixeldungeon.items.weapon.enchantments.Death; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.BurningFistSprite; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.LarvaSprite; +import com.watabou.pixeldungeon.sprites.RottingFistSprite; +import com.watabou.pixeldungeon.sprites.YogSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Random; + +public class Yog extends Mob { + + { + name = "Yog-Dzewa"; + spriteClass = YogSprite.class; + + HP = HT = 300; + + EXP = 50; + + state = State.PASSIVE; + } + + private static final String TXT_DESC = + "Yog-Dzewa is an Old God, a powerful entity from the realms of chaos. A century ago, the ancient dwarves " + + "barely won the war against its army of demons, but were unable to kill the god itself. Instead, they then " + + "imprisoned it in the halls below their city, believing it to be too weak to rise ever again."; + + private static int fistsCount = 0; + + public Yog() { + super(); + } + + public void spawnFists() { + RottingFist fist1 = new RottingFist(); + BurningFist fist2 = new BurningFist(); + + do { + fist1.pos = pos + Level.NEIGHBOURS8[Random.Int( 8 )]; + fist2.pos = pos + Level.NEIGHBOURS8[Random.Int( 8 )]; + } while (!Level.passable[fist1.pos] || !Level.passable[fist2.pos] || fist1.pos == fist2.pos); + + GameScene.add( fist1 ); + GameScene.add( fist2 ); + } + + @Override + public void damage( int dmg, Object src ) { + + if (fistsCount > 0) { + + for (Mob mob : Dungeon.level.mobs) { + if (mob instanceof BurningFist || mob instanceof RottingFist) { + mob.beckon( pos ); + } + } + + dmg >>= fistsCount; + } + + super.damage( dmg, src ); + } + + @Override + public int defenseProc( Char enemy, int damage ) { + + ArrayList spawnPoints = new ArrayList(); + + for (int i=0; i < Level.NEIGHBOURS8.length; i++) { + int p = pos + Level.NEIGHBOURS8[i]; + if (Actor.findChar( p ) == null && (Level.passable[p] || Level.avoid[p])) { + spawnPoints.add( p ); + } + } + + if (spawnPoints.size() > 0) { + Larva larva = new Larva(); + larva.pos = Random.element( spawnPoints ); + + GameScene.add( larva ); + Actor.addDelayed( new Pushing( larva, pos, larva.pos ), -1 ); + } + + return super.defenseProc(enemy, damage); + } + + @Override + public void beckon( int cell ) { + } + + @SuppressWarnings("unchecked") + @Override + public void die( Object cause ) { + + for (Mob mob : (Iterable)Dungeon.level.mobs.clone()) { + if (mob instanceof BurningFist || mob instanceof RottingFist) { + mob.die( cause ); + } + } + + GameScene.bossSlain(); + Dungeon.level.drop( new SkeletonKey( Dungeon.depth ), pos ).sprite.drop(); + super.die( cause ); + + yell( "..." ); + } + + @Override + public void notice() { + super.notice(); + yell( "Hope is an illusion..." ); + } + + @Override + public String description() { + return TXT_DESC; + + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + + IMMUNITIES.add( Death.class ); + IMMUNITIES.add( Terror.class ); + IMMUNITIES.add( Amok.class ); + IMMUNITIES.add( Charm.class ); + IMMUNITIES.add( Sleep.class ); + IMMUNITIES.add( Burning.class ); + IMMUNITIES.add( ToxicGas.class ); + IMMUNITIES.add( ScrollOfPsionicBlast.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } + + public static class RottingFist extends Mob { + + private static final int REGENERATION = 4; + + { + name = "rotting fist"; + spriteClass = RottingFistSprite.class; + + HP = HT = 300; + defenseSkill = 25; + + EXP = 0; + + state = State.WANDERING; + } + + public RottingFist() { + super(); + fistsCount++; + } + + @Override + public void die( Object cause ) { + super.die( cause ); + fistsCount--; + } + + @Override + public int attackSkill( Char target ) { + return 36; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 24, 36 ); + } + + @Override + public int dr() { + return 15; + } + + @Override + public int attackProc( Char enemy, int damage ) { + if (Random.Int( 3 ) == 0) { + Buff.affect( enemy, Ooze.class ); + enemy.sprite.burst( 0xFF000000, 5 ); + } + + return damage; + } + + @Override + public boolean act() { + + if (Level.water[pos] && HP < HT) { + sprite.emitter().burst( ShadowParticle.UP, 2 ); + HP += REGENERATION; + } + + return super.act(); + } + + @Override + public String description() { + return TXT_DESC; + + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( ToxicGas.class ); + RESISTANCES.add( Death.class ); + RESISTANCES.add( ScrollOfPsionicBlast.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Amok.class ); + IMMUNITIES.add( Sleep.class ); + IMMUNITIES.add( Terror.class ); + IMMUNITIES.add( Poison.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } + } + + public static class BurningFist extends Mob { + + { + name = "burning fist"; + spriteClass = BurningFistSprite.class; + + HP = HT = 200; + defenseSkill = 25; + + EXP = 0; + + state = State.WANDERING; + } + + public BurningFist() { + super(); + fistsCount++; + } + + @Override + public void die( Object cause ) { + super.die( cause ); + fistsCount--; + } + + @Override + public int attackSkill( Char target ) { + return 36; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 20, 32 ); + } + + @Override + public int dr() { + return 15; + } + + @Override + protected boolean canAttack( Char enemy ) { + return Ballistica.cast( pos, enemy.pos, false, true ) == enemy.pos; + } + + @Override + public boolean attack( Char enemy ) { + + if (!Level.adjacent( pos, enemy.pos )) { + spend( attackDelay() ); + + if (hit( this, enemy, true )) { + + int dmg = damageRoll(); + enemy.damage( dmg, this ); + + enemy.sprite.bloodBurstA( sprite.center(), dmg ); + enemy.sprite.flash(); + + if (!enemy.isAlive() && enemy == Dungeon.hero) { + Dungeon.fail( Utils.format( ResultDescriptions.BOSS, name, Dungeon.depth ) ); + GLog.n( TXT_KILL, name ); + } + return true; + + } else { + + enemy.sprite.showStatus( CharSprite.NEUTRAL, enemy.defenseVerb() ); + return false; + } + } else { + return super.attack( enemy ); + } + } + + @Override + public boolean act() { + + for (int i=0; i < Level.NEIGHBOURS9.length; i++) { + GameScene.add( Blob.seed( pos + Level.NEIGHBOURS9[i], 2, Fire.class ) ); + } + + return super.act(); + } + + @Override + public String description() { + return TXT_DESC; + + } + + private static final HashSet> RESISTANCES = new HashSet>(); + static { + RESISTANCES.add( ToxicGas.class ); + RESISTANCES.add( Death.class ); + RESISTANCES.add( ScrollOfPsionicBlast.class ); + } + + @Override + public HashSet> resistances() { + return RESISTANCES; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Amok.class ); + IMMUNITIES.add( Sleep.class ); + IMMUNITIES.add( Terror.class ); + IMMUNITIES.add( Burning.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } + } + + public static class Larva extends Mob { + + { + name = "god's larva"; + spriteClass = LarvaSprite.class; + + HP = HT = 25; + defenseSkill = 20; + + EXP = 0; + + state = State.HUNTING; + } + + @Override + public int attackSkill( Char target ) { + return 30; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 15, 20 ); + } + + @Override + public int dr() { + return 8; + } + + @Override + public String description() { + return TXT_DESC; + + } + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/npcs/Blacksmith.java b/src/com/watabou/pixeldungeon/actors/mobs/npcs/Blacksmith.java new file mode 100644 index 0000000000..d10529a14a --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/npcs/Blacksmith.java @@ -0,0 +1,326 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs.npcs; + +import java.util.Collection; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Journal; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.items.EquipableItem; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.quest.DarkGold; +import com.watabou.pixeldungeon.items.quest.Pickaxe; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfUpgrade; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Room.Type; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.BlacksmithSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.windows.WndBlacksmith; +import com.watabou.pixeldungeon.windows.WndQuest; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Blacksmith extends Mob.NPC { + + private static final String TXT_GOLD_1 = + "Hey human! Wanna be useful, eh? Take dis pickaxe and mine me some _dark gold ore_, _15 pieces_ should be enough. " + + "What do you mean, how am I gonna pay? You greedy...\n" + + "Ok, ok, I don't have money to pay, but I can do some smithin' for you. Consider yourself lucky, " + + "I'm the only blacksmith around."; + private static final String TXT_BLOOD_1 = + "Hey human! Wanna be useful, eh? Take dis pickaxe and _kill a bat_ wit' it, I need its blood on the head. " + + "What do you mean, how am I gonna pay? You greedy...\n" + + "Ok, ok, I don't have money to pay, but I can do some smithin' for you. Consider yourself lucky, " + + "I'm the only blacksmith around."; + private static final String TXT2 = + "Are you kiddin' me? Where is my pickaxe?!"; + private static final String TXT3 = + "Dark gold ore. 15 pieces. Seriously, is it dat hard?"; + private static final String TXT4 = + "I said I need bat blood on the pickaxe. Chop chop!"; + private static final String TXT_COMPLETED = + "Oh, you have returned... Better late dan never."; + private static final String TXT_GET_LOST = + "I'm busy. Get lost!"; + + private static final String TXT_LOOKS_BETTER = "your %s certainly looks better now"; + + { + name = "troll blacksmith"; + spriteClass = BlacksmithSprite.class; + } + + @Override + protected boolean act() { + throwItem(); + return super.act(); + } + + @Override + public void interact() { + + sprite.turnTo( pos, Dungeon.hero.pos ); + + if (!Quest.given) { + + GameScene.show( new WndQuest( this, + Quest.alternative ? TXT_BLOOD_1 : TXT_GOLD_1 ) { + + @Override + public void onBackPressed() { + super.onBackPressed(); + + Quest.given = true; + Quest.completed = false; + + Pickaxe pick = new Pickaxe(); + if (pick.doPickUp( Dungeon.hero )) { + GLog.i( Hero.TXT_YOU_NOW_HAVE, pick.name() ); + } else { + Dungeon.level.drop( pick, Dungeon.hero.pos ).sprite.drop(); + } + }; + } ); + + Journal.add( Journal.Feature.TROLL ); + + } else if (!Quest.completed) { + if (Quest.alternative) { + + Pickaxe pick = Dungeon.hero.belongings.getItem( Pickaxe.class ); + if (pick == null) { + tell( TXT2 ); + } else if (!pick.bloodStained) { + tell( TXT4 ); + } else { + if (pick.isEquipped( Dungeon.hero )) { + pick.doUnequip( Dungeon.hero, false ); + } + pick.detach( Dungeon.hero.belongings.backpack ); + tell( TXT_COMPLETED ); + + Quest.completed = true; + Quest.reforged = false; + } + + } else { + + Pickaxe pick = Dungeon.hero.belongings.getItem( Pickaxe.class ); + DarkGold gold = Dungeon.hero.belongings.getItem( DarkGold.class ); + if (pick == null) { + tell( TXT2 ); + } else if (gold == null || gold.quantity() < 15) { + tell( TXT3 ); + } else { + if (pick.isEquipped( Dungeon.hero )) { + pick.doUnequip( Dungeon.hero, false ); + } + pick.detach( Dungeon.hero.belongings.backpack ); + gold.detachAll( Dungeon.hero.belongings.backpack ); + tell( TXT_COMPLETED ); + + Quest.completed = true; + Quest.reforged = false; + } + + } + } else if (!Quest.reforged) { + + GameScene.show( new WndBlacksmith( this, Dungeon.hero ) ); + + } else { + + tell( TXT_GET_LOST ); + + } + } + + private void tell( String text ) { + GameScene.show( new WndQuest( this, text ) ); + } + + public static String verify( Item item1, Item item2 ) { + + if (item1 == item2) { + return "Select 2 different items, not the same item twice!"; + } + + if (!item1.isSimilar( item2 )) { + return "Select 2 items of the same type!"; + } + + if (!item1.isIdentified() || !item2.isIdentified()) { + return "I need to know what I'm working with, identify them first!"; + } + + if (item1.cursed || item2.cursed) { + return "I don't work with cursed items!"; + } + + if (item1.level < 0 || item2.level < 0) { + return "It's a junk, the quality is too poor!"; + } + + if (!item1.isUpgradable() || !item2.isUpgradable()) { + return "I can't reforge these items!"; + } + + return null; + } + + public static void upgrade( Item item1, Item item2 ) { + + Item first, second; + if (item2.level > item1.level) { + first = item2; + second = item1; + } else { + first = item1; + second = item2; + } + + Sample.INSTANCE.play( Assets.SND_EVOKE ); + ScrollOfUpgrade.upgrade( Dungeon.hero ); + Item.evoke( Dungeon.hero ); + + if (first.isEquipped( Dungeon.hero )) { + ((EquipableItem)first).doUnequip( Dungeon.hero, true ); + } + first.upgrade(); + GLog.p( TXT_LOOKS_BETTER, first.name() ); + Dungeon.hero.spendAndNext( 2f ); + Badges.validateItemLevelAquired( first ); + + if (second.isEquipped( Dungeon.hero )) { + ((EquipableItem)second).doUnequip( Dungeon.hero, false ); + } + second.detachAll( Dungeon.hero.belongings.backpack ); + + Quest.reforged = true; + + Journal.remove( Journal.Feature.TROLL ); + } + + @Override + public int defenseSkill( Char enemy ) { + return 1000; + } + + @Override + public void damage( int dmg, Object src ) { + } + + @Override + public void add( Buff buff ) { + } + + @Override + public boolean reset() { + return true; + } + + @Override + public String description() { + return + "This troll blacksmith looks like all trolls look: he is tall and lean, and his skin resembles stone " + + "in both color and texture. The troll blacksmith is tinkering with unproportionally small tools."; + } + + public static class Quest { + + private static boolean spawned; + + private static boolean alternative; + private static boolean given; + private static boolean completed; + private static boolean reforged; + + public static void reset() { + spawned = false; + given = false; + completed = false; + reforged = false; + } + + private static final String NODE = "blacksmith"; + + private static final String SPAWNED = "spawned"; + private static final String ALTERNATIVE = "alternative"; + private static final String GIVEN = "given"; + private static final String COMPLETED = "completed"; + private static final String REFORGED = "reforged"; + + public static void storeInBundle( Bundle bundle ) { + + Bundle node = new Bundle(); + + node.put( SPAWNED, spawned ); + + if (spawned) { + node.put( ALTERNATIVE, alternative ); + node.put( GIVEN, given ); + node.put( COMPLETED, completed ); + node.put( REFORGED, reforged ); + } + + bundle.put( NODE, node ); + } + + public static void restoreFromBundle( Bundle bundle ) { + + Bundle node = bundle.getBundle( NODE ); + + if (!node.isNull() && (spawned = node.getBoolean( SPAWNED ))) { + alternative = node.getBoolean( ALTERNATIVE ); + given = node.getBoolean( GIVEN ); + completed = node.getBoolean( COMPLETED ); + reforged = node.getBoolean( REFORGED ); + } else { + reset(); + } + } + + public static void spawn( Collection rooms ) { + if (!spawned && Dungeon.depth > 11 && Random.Int( 15 - Dungeon.depth ) == 0) { + + Room blacksmith = null; + for (Room r : rooms) { + if (r.type == Type.STANDARD && r.width() > 4 && r.height() > 4) { + blacksmith = r; + blacksmith.type = Type.BLACKSMITH; + + spawned = true; + alternative = Random.Int( 2 ) == 0; + + given = false; + + break; + } + } + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/npcs/Ghost.java b/src/com/watabou/pixeldungeon/actors/mobs/npcs/Ghost.java new file mode 100644 index 0000000000..7af8f3a099 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/npcs/Ghost.java @@ -0,0 +1,395 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs.npcs; + +import java.util.HashSet; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Journal; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.ParalyticGas; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Paralysis; +import com.watabou.pixeldungeon.actors.buffs.Roots; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.quest.DriedRose; +import com.watabou.pixeldungeon.items.quest.RatSkull; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.items.weapon.missiles.MissileWeapon; +import com.watabou.pixeldungeon.levels.SewerLevel; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.FetidRatSprite; +import com.watabou.pixeldungeon.sprites.GhostSprite; +import com.watabou.pixeldungeon.windows.WndQuest; +import com.watabou.pixeldungeon.windows.WndSadGhost; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Ghost extends Mob.NPC { + + { + name = "sad ghost"; + spriteClass = GhostSprite.class; + + flying = true; + + state = State.WANDERING; + } + + private static final String TXT_ROSE1 = + "Hello adventurer... Once I was like you - strong and confident... " + + "And now I'm dead... But I can't leave this place... Not until I have my _dried rose_... " + + "It's very important to me... Some monster stole it from my body..."; + + private static final String TXT_ROSE2 = + "Please... Help me... Find the rose..."; + + private static final String TXT_RAT1 = + "Hello adventurer... Once I was like you - strong and confident... " + + "And now I'm dead... But I can't leave this place... Not until I have my revenge... " + + "Slay the _fetid rat_, that has taken my life..."; + + private static final String TXT_RAT2 = + "Please... Help me... Slay the abomination..."; + + + public Ghost() { + super(); + + Sample.INSTANCE.load( Assets.SND_GHOST ); + } + + @Override + public int defenseSkill( Char enemy ) { + return 1000; + } + + @Override + public String defenseVerb() { + return "evaded"; + } + + @Override + public float speed() { + return 0.5f; + } + + @Override + protected Char chooseEnemy() { + return DUMMY; + } + + @Override + public void damage( int dmg, Object src ) { + } + + @Override + public void add( Buff buff ) { + } + + @Override + public boolean reset() { + return true; + } + + @Override + public void interact() { + sprite.turnTo( pos, Dungeon.hero.pos ); + + Sample.INSTANCE.play( Assets.SND_GHOST ); + + if (Quest.given) { + + Item item = Quest.alternative ? + Dungeon.hero.belongings.getItem( RatSkull.class ) : + Dungeon.hero.belongings.getItem( DriedRose.class ); + if (item != null) { + GameScene.show( new WndSadGhost( this, item ) ); + } else { + GameScene.show( new WndQuest( this, Quest.alternative ? TXT_RAT2 : TXT_ROSE2 ) ); + + int newPos = -1; + for (int i=0; i < 10; i++) { + newPos = Dungeon.level.randomRespawnCell(); + if (newPos != -1) { + break; + } + } + if (newPos != -1) { + + Actor.freeCell( pos ); + + CellEmitter.get( pos ).start( Speck.factory( Speck.LIGHT ), 0.2f, 3 ); + pos = newPos; + sprite.place( pos ); + sprite.visible = Dungeon.visible[pos]; + } + } + + } else { + GameScene.show( new WndQuest( this, Quest.alternative ? TXT_RAT1 : TXT_ROSE1 ) ); + Quest.given = true; + + Journal.add( Journal.Feature.GHOST ); + } + } + + @Override + public String description() { + return + "The ghost is barely visible. It looks like a shapeless " + + "spot of faint light with a sorrowful face."; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Paralysis.class ); + IMMUNITIES.add( Roots.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } + + public static class Quest { + + private static boolean spawned; + + private static boolean alternative; + + private static boolean given; + + private static boolean processed; + + private static int depth; + + private static int left2kill; + + public static Weapon weapon; + public static Armor armor; + + public static void reset() { + spawned = false; + + weapon = null; + armor = null; + } + + private static final String NODE = "sadGhost"; + + private static final String SPAWNED = "spawned"; + private static final String ALTERNATIVE = "alternative"; + private static final String LEFT2KILL = "left2kill"; + private static final String GIVEN = "given"; + private static final String PROCESSED = "processed"; + private static final String DEPTH = "depth"; + private static final String WEAPON = "weapon"; + private static final String ARMOR = "armor"; + + public static void storeInBundle( Bundle bundle ) { + + Bundle node = new Bundle(); + + node.put( SPAWNED, spawned ); + + if (spawned) { + + node.put( ALTERNATIVE, alternative ); + if (!alternative) { + node.put( LEFT2KILL, left2kill ); + } + + node.put( GIVEN, given ); + node.put( DEPTH, depth ); + node.put( PROCESSED, processed ); + + node.put( WEAPON, weapon ); + node.put( ARMOR, armor ); + } + + bundle.put( NODE, node ); + } + + public static void restoreFromBundle( Bundle bundle ) { + + Bundle node = bundle.getBundle( NODE ); + + if (!node.isNull() && (spawned = node.getBoolean( SPAWNED ))) { + + alternative = node.getBoolean( ALTERNATIVE ); + if (!alternative) { + left2kill = node.getInt( LEFT2KILL ); + } + + given = node.getBoolean( GIVEN ); + depth = node.getInt( DEPTH ); + processed = node.getBoolean( PROCESSED ); + + weapon = (Weapon)node.get( WEAPON ); + armor = (Armor)node.get( ARMOR ); + } else { + reset(); + } + } + + public static void spawn( SewerLevel level ) { + if (!spawned && Dungeon.depth > 1 && Random.Int( 5 - Dungeon.depth ) == 0) { + + Ghost ghost = new Ghost(); + do { + ghost.pos = level.randomRespawnCell(); + } while (ghost.pos == -1); + level.mobs.add( ghost ); + Actor.occupyCell( ghost ); + + spawned = true; + alternative = Random.Int( 2 ) == 0; + if (!alternative) { + left2kill = 8; + } + + given = false; + processed = false; + depth = Dungeon.depth; + + do { + weapon = (Weapon)Generator.random( Generator.Category.WEAPON ); + } while (weapon instanceof MissileWeapon); + armor = (Armor)Generator.random( Generator.Category.ARMOR ); + + for (int i=0; i < 3; i++) { + Item another; + do { + another = Generator.random( Generator.Category.WEAPON ); + } while (another instanceof MissileWeapon); + if (another.level > weapon.level) { + weapon = (Weapon)another; + } + another = Generator.random( Generator.Category.ARMOR ); + if (another.level > armor.level) { + armor = (Armor)another; + } + } + weapon.identify(); + armor.identify(); + } + } + + public static void process( int pos ) { + if (spawned && given && !processed && (depth == Dungeon.depth)) { + if (alternative) { + + FetidRat rat = new FetidRat(); + rat.state = Mob.State.WANDERING; + rat.pos = Dungeon.level.randomRespawnCell(); + if (rat.pos != -1) { + GameScene.add( rat ); + processed = true; + } + + } else { + + if (Random.Int( left2kill ) == 0) { + Dungeon.level.drop( new DriedRose(), pos ).sprite.drop(); + processed = true; + } else { + left2kill--; + } + + } + } + } + + public static void complete() { + weapon = null; + armor = null; + + Journal.remove( Journal.Feature.GHOST ); + } + } + + public static class FetidRat extends Mob { + + { + name = "fetid rat"; + spriteClass = FetidRatSprite.class; + + HP = HT = 15; + defenseSkill = 5; + + EXP = 0; + maxLvl = 5; + } + + @Override + public int damageRoll() { + return Random.NormalIntRange( 2, 6 ); + } + + @Override + public int attackSkill( Char target ) { + return 12; + } + + @Override + public int dr() { + return 2; + } + + @Override + public int defenseProc( Char enemy, int damage ) { + + GameScene.add( Blob.seed( pos, 20, ParalyticGas.class ) ); + + return super.defenseProc(enemy, damage); + } + + @Override + public void die( Object cause ) { + super.die( cause ); + + Dungeon.level.drop( new RatSkull(), pos ).sprite.drop(); + } + + @Override + public String description() { + return + "This marsupial rat is much larger, than a regular one. It is surrounded by a foul cloud."; + } + + private static final HashSet> IMMUNITIES = new HashSet>(); + static { + IMMUNITIES.add( Paralysis.class ); + } + + @Override + public HashSet> immunities() { + return IMMUNITIES; + } + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/npcs/Imp.java b/src/com/watabou/pixeldungeon/actors/mobs/npcs/Imp.java new file mode 100644 index 0000000000..c256246b9c --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/npcs/Imp.java @@ -0,0 +1,256 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs.npcs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Journal; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.mobs.Golem; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.actors.mobs.Monk; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.quest.DwarfToken; +import com.watabou.pixeldungeon.items.rings.Ring; +import com.watabou.pixeldungeon.levels.CityLevel; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ImpSprite; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.pixeldungeon.windows.WndImp; +import com.watabou.pixeldungeon.windows.WndQuest; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Imp extends Mob.NPC { + + { + name = "ambitious imp"; + spriteClass = ImpSprite.class; + } + + private static final String TXT_GOLEMS1 = + "Are you an adventurer? I love adventurers! You can always rely on them " + + "if something needs to be killed. Am I right? For bounty of course ;)\n" + + "In my case this is _golems_ who need to be killed. You see, I'm going to start a " + + "little business here, but these stupid golems are bad for business! " + + "It's very hard to negotiate with wandering lumps of granite, damn them! " + + "So please, kill... let's say _6 of them_ and a reward is yours."; + + private static final String TXT_MONKS1 = + "Are you an adventurer? I love adventurers! You can always rely on them " + + "if something needs to be killed. Am I right? For bounty of course ;)\n" + + "In my case this is _monks_ who need to be killed. You see, I'm going to start a " + + "little business here, but these lunatics don't buy anything themselves and " + + "will scare away other customers. " + + "So please, kill... let's say _8 of them_ and a reward is yours."; + + private static final String TXT_GOLEMS2 = + "How is your golem safari going?"; + + private static final String TXT_MONKS2 = + "Oh, you are still alive! I knew that your kung-fu is stronger ;) " + + "Just don't forget to grab these monks' tokens."; + + private static final String TXT_CYA = "See you, %s!"; + private static final String TXT_HEY = "Psst, %s!"; + + private boolean seenBefore = false; + + @Override + protected boolean act() { + + if (!Quest.given && Dungeon.visible[pos]) { + if (!seenBefore) { + yell( Utils.format( TXT_HEY, Dungeon.hero.className() ) ); + } + seenBefore = true; + } else { + seenBefore = false; + } + + throwItem(); + + return super.act(); + } + + @Override + public int defenseSkill( Char enemy ) { + return 1000; + } + + @Override + public String defenseVerb() { + return "evaded"; + } + + @Override + public void damage( int dmg, Object src ) { + } + + @Override + public void add( Buff buff ) { + } + + @Override + public boolean reset() { + return true; + } + + @Override + public void interact() { + + sprite.turnTo( pos, Dungeon.hero.pos ); + if (Quest.given) { + + DwarfToken tokens = Dungeon.hero.belongings.getItem( DwarfToken.class ); + if (tokens != null && (tokens.quantity() >= 8 || (!Quest.alternative && tokens.quantity() >= 6))) { + GameScene.show( new WndImp( this, tokens ) ); + } else { + tell( Quest.alternative ? TXT_MONKS2 : TXT_GOLEMS2, Dungeon.hero.className() ); + } + + } else { + tell( Quest.alternative ? TXT_MONKS1 : TXT_GOLEMS1 ); + Quest.given = true; + Quest.completed = false; + + Journal.add( Journal.Feature.IMP ); + } + } + + private void tell( String format, Object...args ) { + GameScene.show( + new WndQuest( this, Utils.format( format, args ) ) ); + } + + public void flee() { + + yell( Utils.format( TXT_CYA, Dungeon.hero.className() ) ); + + destroy(); + sprite.die(); + } + + @Override + public String description() { + return + "Imps are lesser demons. They are notable for neither their strength nor their magic talent, " + + "but they are quite smart and sociable. Many imps prefer to live among non-demons."; + } + + public static class Quest { + + private static boolean alternative; + + private static boolean spawned; + private static boolean given; + private static boolean completed; + + public static Ring reward; + + public static void reset() { + spawned = false; + + reward = null; + } + + private static final String NODE = "demon"; + + private static final String ALTERNATIVE = "alternative"; + private static final String SPAWNED = "spawned"; + private static final String GIVEN = "given"; + private static final String COMPLETED = "completed"; + private static final String REWARD = "reward"; + + public static void storeInBundle( Bundle bundle ) { + + Bundle node = new Bundle(); + + node.put( SPAWNED, spawned ); + + if (spawned) { + node.put( ALTERNATIVE, alternative ); + + node.put( GIVEN, given ); + node.put( COMPLETED, completed ); + node.put( REWARD, reward ); + } + + bundle.put( NODE, node ); + } + + public static void restoreFromBundle( Bundle bundle ) { + + Bundle node = bundle.getBundle( NODE ); + + if (!node.isNull() && (spawned = node.getBoolean( SPAWNED ))) { + alternative = node.getBoolean( ALTERNATIVE ); + + given = node.getBoolean( GIVEN ); + completed = node.getBoolean( COMPLETED ); + reward = (Ring)node.get( REWARD ); + } + } + + public static void spawn( CityLevel level, Room room ) { + if (!spawned && Dungeon.depth > 16 && Random.Int( 20 - Dungeon.depth ) == 0) { + + Imp npc = new Imp(); + do { + npc.pos = level.randomRespawnCell(); + } while (npc.pos == -1 || level.heaps.get( npc.pos ) != null); + level.mobs.add( npc ); + Actor.occupyCell( npc ); + + spawned = true; + alternative = Random.Int( 2 ) == 0; + + given = false; + + do { + reward = (Ring)Generator.random( Generator.Category.RING ); + } while (reward.cursed); + reward.upgrade( 2 ); + reward.cursed = true; + } + } + + public static void process( Mob mob ) { + if (spawned && given && !completed) { + if ((alternative && mob instanceof Monk) || + (!alternative && mob instanceof Golem)) { + + Dungeon.level.drop( new DwarfToken(), mob.pos ).sprite.drop(); + } + } + } + + public static void complete() { + reward = null; + completed = true; + + Journal.remove( Journal.Feature.IMP ); + } + + public static boolean isCompleted() { + return completed; + } + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/npcs/ImpShopkeeper.java b/src/com/watabou/pixeldungeon/actors/mobs/npcs/ImpShopkeeper.java new file mode 100644 index 0000000000..eed5255bec --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/npcs/ImpShopkeeper.java @@ -0,0 +1,71 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs.npcs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.particles.ElmoParticle; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.sprites.ImpSprite; +import com.watabou.pixeldungeon.utils.Utils; + +public class ImpShopkeeper extends Shopkeeper { + + private static final String TXT_GREETINGS = "Hello, friend!"; + + { + name = "ambitious imp"; + spriteClass = ImpSprite.class; + } + + private boolean seenBefore = false; + + @Override + protected boolean act() { + + if (!seenBefore && Dungeon.visible[pos]) { + yell( Utils.format( TXT_GREETINGS ) ); + seenBefore = true; + } + + return super.act(); + } + + @Override + protected void flee() { + for (Heap heap: Dungeon.level.heaps.values()) { + if (heap.type == Heap.Type.FOR_SALE) { + CellEmitter.get( heap.pos ).burst( ElmoParticle.FACTORY, 4 ); + heap.destroy(); + } + } + + destroy(); + + sprite.emitter().burst( Speck.factory( Speck.WOOL ), 15 ); + sprite.killAndErase(); + } + + @Override + public String description() { + return + "Imps are lesser demons. They are notable for neither their strength nor their magic talent. " + + "But they are quite smart and sociable, and many of imps prefer to live and do business among non-demons."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/npcs/MirrorImage.java b/src/com/watabou/pixeldungeon/actors/mobs/npcs/MirrorImage.java new file mode 100644 index 0000000000..813e036a5b --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/npcs/MirrorImage.java @@ -0,0 +1,138 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs.npcs; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.MirrorSprite; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class MirrorImage extends Mob.NPC { + + { + name = "mirror image"; + spriteClass = MirrorSprite.class; + + state = State.HUNTING; + + enemy = DUMMY; + } + + public int tier; + + private int attack; + private int damage; + + private static final String TIER = "tier"; + private static final String ATTACK = "attack"; + private static final String DAMAGE = "damage"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( TIER, tier ); + bundle.put( ATTACK, attack ); + bundle.put( DAMAGE, damage ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + tier = bundle.getInt( TIER ); + attack = bundle.getInt( ATTACK ); + damage = bundle.getInt( DAMAGE ); + } + + public void duplicate( Hero hero ) { + tier = hero.tier(); + attack = hero.attackSkill( hero ); + damage = hero.damageRoll(); + } + + @Override + public int attackSkill( Char target ) { + return attack; + } + + @Override + public int damageRoll() { + return damage; + } + + @Override + public int attackProc( Char enemy, int damage ) { + int dmg = super.attackProc( enemy, damage ); + + destroy(); + sprite.die(); + + return dmg; + } + + protected Char chooseEnemy() { + + if (enemy == DUMMY || !enemy.isAlive()) { + HashSet enemies = new HashSet(); + for (Mob mob:Dungeon.level.mobs) { + if (mob.hostile && Level.fieldOfView[mob.pos]) { + enemies.add( mob ); + } + } + + enemy = enemies.size() > 0 ? Random.element( enemies ) : DUMMY; + } + + return enemy; + } + + @Override + public String description() { + return + "This illusion bears a close resemblance to you, " + + "but it's paler and twitches a little."; + } + + @Override + public CharSprite sprite() { + CharSprite s = super.sprite(); + ((MirrorSprite)s).updateArmor( tier ); + return s; + } + + @Override + public void interact() { + + int curPos = pos; + + moveSprite( pos, Dungeon.hero.pos ); + move( Dungeon.hero.pos ); + + Dungeon.hero.sprite.move( Dungeon.hero.pos, curPos ); + Dungeon.hero.move( curPos ); + + Dungeon.hero.spend( 1 / Dungeon.hero.speed() ); + Dungeon.hero.busy(); + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/actors/mobs/npcs/RatKing.java b/src/com/watabou/pixeldungeon/actors/mobs/npcs/RatKing.java new file mode 100644 index 0000000000..67c4901210 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/npcs/RatKing.java @@ -0,0 +1,82 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs.npcs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.mobs.Mob; + +import com.watabou.pixeldungeon.sprites.RatKingSprite; + +public class RatKing extends Mob.NPC { + + { + name = "rat king"; + spriteClass = RatKingSprite.class; + + state = State.SLEEPING; + } + + @Override + public int defenseSkill( Char enemy ) { + return 1000; + } + + @Override + public float speed() { + return 2f; + } + + @Override + protected Char chooseEnemy() { + return DUMMY; + } + + @Override + public void damage( int dmg, Object src ) { + } + + @Override + public void add( Buff buff ) { + } + + @Override + public boolean reset() { + return true; + } + + @Override + public void interact() { + sprite.turnTo( pos, Dungeon.hero.pos ); + if (state == State.SLEEPING) { + notice(); + yell( "I'm not sleeping!" ); + state = State.WANDERING; + } else { + yell( "What is it? I have no time for this nonsense. My kingdom won't rule itself!" ); + } + } + + @Override + public String description() { + return + "This rat is a little bigger than a regular marsupial rat " + + "and it's wearing a tiny crown on its head."; + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/npcs/Shopkeeper.java b/src/com/watabou/pixeldungeon/actors/mobs/npcs/Shopkeeper.java new file mode 100644 index 0000000000..363b9b6689 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/npcs/Shopkeeper.java @@ -0,0 +1,103 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs.npcs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.ElmoParticle; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ShopkeeperSprite; +import com.watabou.pixeldungeon.windows.WndBag; +import com.watabou.pixeldungeon.windows.WndTradeItem; + +public class Shopkeeper extends Mob.NPC { + + { + name = "shopkeeper"; + spriteClass = ShopkeeperSprite.class; + } + + @Override + protected boolean act() { + + throwItem(); + + sprite.turnTo( pos, Dungeon.hero.pos ); + spend( TICK ); + return true; + } + + @Override + public void damage( int dmg, Object src ) { + flee(); + } + + @Override + public void add( Buff buff ) { + flee(); + } + + protected void flee() { + for (Heap heap: Dungeon.level.heaps.values()) { + if (heap.type == Heap.Type.FOR_SALE) { + CellEmitter.get( heap.pos ).burst( ElmoParticle.FACTORY, 4 ); + heap.destroy(); + } + } + + destroy(); + + sprite.killAndErase(); + CellEmitter.get( pos ).burst( ElmoParticle.FACTORY, 6 ); + } + + @Override + public boolean reset() { + return true; + } + + @Override + public String description() { + return + "This stout guy looks more appropriate for a trade district in some large city " + + "than for a dungeon. His prices explain why he prefers to do business here."; + } + + public static WndBag sell() { + return GameScene.selectItem( itemSelector, WndBag.Mode.FOR_SALE, "Select an item to sell" ); + } + + private static WndBag.Listener itemSelector = new WndBag.Listener() { + @Override + public void onSelect( Item item ) { + if (item != null) { + WndBag parentWnd = sell(); + GameScene.show( new WndTradeItem( item, parentWnd ) ); + } + } + }; + + @Override + public void interact() { + sell(); + } +} diff --git a/src/com/watabou/pixeldungeon/actors/mobs/npcs/Wandmaker.java b/src/com/watabou/pixeldungeon/actors/mobs/npcs/Wandmaker.java new file mode 100644 index 0000000000..9a68d05557 --- /dev/null +++ b/src/com/watabou/pixeldungeon/actors/mobs/npcs/Wandmaker.java @@ -0,0 +1,379 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.actors.mobs.npcs; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Journal; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Roots; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.bags.Bag; +import com.watabou.pixeldungeon.items.potions.PotionOfStrength; +import com.watabou.pixeldungeon.items.quest.CorpseDust; +import com.watabou.pixeldungeon.items.wands.Wand; +import com.watabou.pixeldungeon.items.wands.WandOfAmok; +import com.watabou.pixeldungeon.items.wands.WandOfAvalanche; +import com.watabou.pixeldungeon.items.wands.WandOfBlink; +import com.watabou.pixeldungeon.items.wands.WandOfDisintegration; +import com.watabou.pixeldungeon.items.wands.WandOfFirebolt; +import com.watabou.pixeldungeon.items.wands.WandOfLightning; +import com.watabou.pixeldungeon.items.wands.WandOfPoison; +import com.watabou.pixeldungeon.items.wands.WandOfRegrowth; +import com.watabou.pixeldungeon.items.wands.WandOfSlowness; +import com.watabou.pixeldungeon.items.wands.WandOfTelekinesis; +import com.watabou.pixeldungeon.levels.PrisonLevel; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.plants.Plant; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.sprites.WandmakerSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.pixeldungeon.windows.WndQuest; +import com.watabou.pixeldungeon.windows.WndWandmaker; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Wandmaker extends Mob.NPC { + + { + name = "old wandmaker"; + spriteClass = WandmakerSprite.class; + } + + private static final String TXT_BERRY1 = + "Oh, what a pleasant surprise to meet a decent person in such place! I came here for a rare ingredient - " + + "a _Rotberry seed_. Being a magic user, I'm quite able to defend myself against local monsters, " + + "but I'm getting lost in no time, it's very embarrassing. Probably you could help me? I would be " + + "happy to pay for your service with one of my best wands."; + + private static final String TXT_DUST1 = + "Oh, what a pleasant surprise to meet a decent person in such place! I came here for a rare ingredient - " + + "_corpse dust_. It can be gathered from skeletal remains and there is an ample number of them in the dungeon. " + + "Being a magic user, I'm quite able to defend myself against local monsters, but I'm getting lost in no time, " + + "it's very embarrassing. Probably you could help me? I would be happy to pay for your service with one of my best wands."; + + private static final String TXT_BERRY2 = + "Any luck with a Rotberry seed, %s? No? Don't worry, I'm not in a hurry."; + + private static final String TXT_DUST2 = + "Any luck with corpse dust, %s? Bone piles are the most obvious places to look."; + + @Override + protected boolean act() { + throwItem(); + return super.act(); + } + + @Override + public int defenseSkill( Char enemy ) { + return 1000; + } + + @Override + public String defenseVerb() { + return "absorbed"; + } + + @Override + public void damage( int dmg, Object src ) { + } + + @Override + public void add( Buff buff ) { + } + + @Override + public boolean reset() { + return true; + } + + @Override + public void interact() { + + sprite.turnTo( pos, Dungeon.hero.pos ); + if (Quest.given) { + + Item item = Quest.alternative ? + Dungeon.hero.belongings.getItem( CorpseDust.class ) : + Dungeon.hero.belongings.getItem( Rotberry.Seed.class ); + if (item != null) { + GameScene.show( new WndWandmaker( this, item ) ); + } else { + tell( Quest.alternative ? TXT_DUST2 : TXT_BERRY2, Dungeon.hero.className() ); + } + + } else { + tell( Quest.alternative ? TXT_DUST1 : TXT_BERRY1 ); + Quest.given = true; + + Quest.placeItem(); + + Journal.add( Journal.Feature.WANDMAKER ); + } + } + + private void tell( String format, Object...args ) { + GameScene.show( new WndQuest( this, Utils.format( format, args ) ) ); + } + + @Override + public String description() { + return + "This old but hale gentleman wears a slightly confused " + + "expression. He is protected by a magic shield."; + } + + public static class Quest { + + private static boolean spawned; + + private static boolean alternative; + + private static boolean given; + + public static Wand wand1; + public static Wand wand2; + + public static void reset() { + spawned = false; + + wand1 = null; + wand2 = null; + } + + private static final String NODE = "wandmaker"; + + private static final String SPAWNED = "spawned"; + private static final String ALTERNATIVE = "alternative"; + private static final String GIVEN = "given"; + private static final String WAND1 = "wand1"; + private static final String WAND2 = "wand2"; + + public static void storeInBundle( Bundle bundle ) { + + Bundle node = new Bundle(); + + node.put( SPAWNED, spawned ); + + if (spawned) { + + node.put( ALTERNATIVE, alternative ); + + node.put(GIVEN, given ); + + node.put( WAND1, wand1 ); + node.put( WAND2, wand2 ); + } + + bundle.put( NODE, node ); + } + + public static void restoreFromBundle( Bundle bundle ) { + + Bundle node = bundle.getBundle( NODE ); + + if (!node.isNull() && (spawned = node.getBoolean( SPAWNED ))) { + + alternative = node.getBoolean( ALTERNATIVE ); + + given = node.getBoolean( GIVEN ); + + wand1 = (Wand)node.get( WAND1 ); + wand2 = (Wand)node.get( WAND2 ); + } else { + reset(); + } + } + + public static void spawn( PrisonLevel level, Room room ) { + if (!spawned && Dungeon.depth > 6 && Random.Int( 10 - Dungeon.depth ) == 0) { + + Wandmaker npc = new Wandmaker(); + do { + npc.pos = room.random(); + } while (level.map[npc.pos] == Terrain.ENTRANCE || level.map[npc.pos] == Terrain.SIGN); + level.mobs.add( npc ); + Actor.occupyCell( npc ); + + spawned = true; + alternative = Random.Int( 2 ) == 0; + + given = false; + + switch (Random.Int( 5 )) { + case 0: + wand1 = new WandOfAvalanche(); + break; + case 1: + wand1 = new WandOfDisintegration(); + break; + case 2: + wand1 = new WandOfFirebolt(); + break; + case 3: + wand1 = new WandOfLightning(); + break; + case 4: + wand1 = new WandOfPoison(); + break; + } + wand1.random().upgrade(); + + switch (Random.Int( 5 )) { + case 0: + wand2 = new WandOfAmok(); + break; + case 1: + wand2 = new WandOfBlink(); + break; + case 2: + wand2 = new WandOfRegrowth(); + break; + case 3: + wand2 = new WandOfSlowness(); + break; + case 4: + wand2 = new WandOfTelekinesis(); + break; + } + wand2.random().upgrade(); + } + } + + public static void placeItem() { + if (alternative) { + + ArrayList candidates = new ArrayList(); + for (Heap heap : Dungeon.level.heaps.values()) { + if (heap.type == Heap.Type.SKELETON && !Dungeon.visible[heap.pos]) { + candidates.add( heap ); + } + } + + if (candidates.size() > 0) { + Random.element( candidates ).drop( new CorpseDust() ); + } else { + int pos = Dungeon.level.randomRespawnCell(); + while (Dungeon.level.heaps.get( pos ) != null) { + pos = Dungeon.level.randomRespawnCell(); + } + + Heap heap = Dungeon.level.drop( new CorpseDust(), pos ); + heap.type = Heap.Type.SKELETON; + heap.sprite.link(); + } + + } else { + + int shrubPos = Dungeon.level.randomRespawnCell(); + while (Dungeon.level.heaps.get( shrubPos ) != null) { + shrubPos = Dungeon.level.randomRespawnCell(); + } + Dungeon.level.plant( new Rotberry.Seed(), shrubPos ); + + } + } + + public static void complete() { + wand1 = null; + wand2 = null; + + Journal.remove( Journal.Feature.WANDMAKER ); + } + } + + public static class Rotberry extends Plant { + + private static final String TXT_DESC = + "Berries of this shrub taste like sweet, sweet death."; + + { + image = 7; + plantName = "Rotberry"; + } + + @Override + public void activate( Char ch ) { + super.activate( ch ); + + GameScene.add( Blob.seed( pos, 100, ToxicGas.class ) ); + + Dungeon.level.drop( new Seed(), pos ).sprite.drop(); + + if (ch != null) { + Buff.prolong( ch, Roots.class, TICK * 3 ); + } + } + + @Override + public String desc() { + return TXT_DESC; + } + + public static class Seed extends Plant.Seed { + { + plantName = "Rotberry"; + + name = "seed of " + plantName; + image = ItemSpriteSheet.SEED_ROTBERRY; + + plantClass = Rotberry.class; + alchemyClass = PotionOfStrength.class; + } + + @Override + public boolean collect( Bag container ) { + if (super.collect( container )) { + + if (Dungeon.level != null) { + for (Mob mob : Dungeon.level.mobs) { + mob.beckon( Dungeon.hero.pos ); + } + + GLog.w( "The seed emits a roar that echoes throughout the dungeon!" ); + CellEmitter.center( Dungeon.hero.pos ).start( Speck.factory( Speck.SCREAM ), 0.3f, 3 ); + Sample.INSTANCE.play( Assets.SND_CHALLENGE ); + } + + return true; + } else { + return false; + } + } + + @Override + public String desc() { + return TXT_DESC; + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/effects/BadgeBanner.java b/src/com/watabou/pixeldungeon/effects/BadgeBanner.java new file mode 100644 index 0000000000..2fc334e5dd --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/BadgeBanner.java @@ -0,0 +1,284 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.utils.PointF; + +public class BadgeBanner extends Image { + + private enum State { + FADE_IN, STATIC, FADE_OUT + }; + private State state; + + private static final float DEFAULT_SCALE = 3; + + private static final float FADE_IN_TIME = 0.2f; + private static final float STATIC_TIME = 1f; + private static final float FADE_OUT_TIME = 1.0f; + + private int index; + private float time; + + private static TextureFilm atlas; + + private static BadgeBanner current; + + private BadgeBanner( int index ) { + + super( Assets.BADGES ); + + if (atlas == null) { + atlas = new TextureFilm( texture, 16, 16 ); + } + + this.index = index; + + frame( atlas.get( index ) ); + origin.set( width / 2, height / 2 ); + + alpha( 0 ); + scale.set( 2 * DEFAULT_SCALE ); + + state = State.FADE_IN; + time = FADE_IN_TIME; + + Sample.INSTANCE.play( Assets.SND_BADGE ); + } + + @Override + public void update() { + super.update(); + + time -= Game.elapsed; + if (time >= 0) { + + switch (state) { + case FADE_IN: + float p = time / FADE_IN_TIME; + scale.set( (1 + p) * DEFAULT_SCALE ); + alpha( 1 - p ); + break; + case STATIC: + break; + case FADE_OUT: + alpha( time / FADE_OUT_TIME ); + break; + } + + } else { + + switch (state) { + case FADE_IN: + time = STATIC_TIME; + state = State.STATIC; + scale.set( DEFAULT_SCALE ); + alpha( 1 ); + highlight( this, index ); + break; + case STATIC: + time = FADE_OUT_TIME; + state = State.FADE_OUT; + break; + case FADE_OUT: + killAndErase(); + break; + } + + } + } + + @Override + public void kill() { + if (current == this) { + current = null; + } + super.kill(); + } + + public static void highlight( Image image, int index ) { + + PointF p = new PointF(); + + switch (index) { + case 0: + case 1: + case 2: + case 3: + p.offset( 7, 3 ); + break; + case 4: + case 5: + case 6: + case 7: + p.offset( 6, 5 ); + break; + case 8: + case 9: + case 10: + case 11: + p.offset( 6, 3 ); + break; + case 12: + case 13: + case 14: + case 15: + p.offset( 7, 4 ); + break; + case 16: + p.offset( 6, 3 ); + break; + case 17: + p.offset( 5, 4 ); + break; + case 18: + p.offset( 7, 3 ); + break; + case 20: + p.offset( 7, 3 ); + break; + case 21: + p.offset( 7, 3 ); + break; + case 22: + p.offset( 6, 4 ); + break; + case 23: + p.offset( 4, 5 ); + break; + case 24: + p.offset( 6, 4 ); + break; + case 25: + p.offset( 6, 5 ); + break; + case 26: + p.offset( 5, 5 ); + break; + case 27: + p.offset( 6, 4 ); + break; + case 28: + p.offset( 3, 5 ); + break; + case 29: + p.offset( 5, 4 ); + break; + case 30: + p.offset( 5, 4 ); + break; + case 31: + p.offset( 5, 5 ); + break; + case 32: + case 33: + p.offset( 7, 4 ); + break; + case 34: + p.offset( 6, 4 ); + break; + case 35: + p.offset( 6, 4 ); + break; + case 36: + p.offset( 6, 5 ); + break; + case 37: + p.offset( 4, 4 ); + break; + case 38: + p.offset( 5, 5 ); + break; + case 40: + case 41: + case 42: + case 43: + p.offset( 5, 4 ); + break; + case 44: + case 45: + case 46: + case 47: + p.offset( 5, 5 ); + break; + case 48: + case 49: + case 50: + case 51: + p.offset( 7, 4 ); + break; + case 52: + case 53: + case 54: + case 55: + p.offset( 4, 4 ); + break; + case 56: + p.offset( 3, 7 ); + break; + case 57: + p.offset( 4, 5 ); + break; + case 58: + p.offset( 6, 4 ); + break; + case 59: + p.offset( 7, 4 ); + break; + case 60: + case 61: + case 62: + case 63: + p.offset( 4, 4 ); + break; + } + + p.x *= image.scale.x; + p.y *= image.scale.y; + p.offset( + -image.origin.x * (image.scale.x - 1), + -image.origin.y * (image.scale.y - 1) ); + p.offset( image.point() ); + + Speck star = new Speck(); + star.reset( 0, p.x, p.y, Speck.DISCOVER ); + star.camera = image.camera(); + image.parent.add( star ); + } + + public static BadgeBanner show( int image ) { + if (current != null) { + current.killAndErase(); + } + return (current = new BadgeBanner( image )); + } + + public static Image image( int index ) { + Image image = new Image( Assets.BADGES ); + if (atlas == null) { + atlas = new TextureFilm( image.texture, 16, 16 ); + } + image.frame( atlas.get( index ) ); + return image; + } +} diff --git a/src/com/watabou/pixeldungeon/effects/BannerSprites.java b/src/com/watabou/pixeldungeon/effects/BannerSprites.java new file mode 100644 index 0000000000..3d323585ee --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/BannerSprites.java @@ -0,0 +1,46 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.Assets; + +public class BannerSprites { + + public enum Type { + PIXEL_DUNGEON, + BOSS_SLAIN, + GAME_OVER + }; + + public static Image get( Type type ) { + Image icon = new Image( Assets.BANNERS ); + switch (type) { + case PIXEL_DUNGEON: + icon.frame( icon.texture.uvRect( 0, 0, 128, 70 ) ); + break; + case BOSS_SLAIN: + icon.frame( icon.texture.uvRect( 0, 70, 128, 105 ) ); + break; + case GAME_OVER: + icon.frame( icon.texture.uvRect( 0, 105, 128, 140 ) ); + break; + } + return icon; + } +} diff --git a/src/com/watabou/pixeldungeon/effects/BlobEmitter.java b/src/com/watabou/pixeldungeon/effects/BlobEmitter.java new file mode 100644 index 0000000000..2e142195cc --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/BlobEmitter.java @@ -0,0 +1,59 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.utils.Random; + +public class BlobEmitter extends Emitter { + + private static final int WIDTH = Blob.WIDTH; + private static final int LENGTH = Blob.LENGTH; + + private Blob blob; + + public BlobEmitter( Blob blob ) { + + super(); + + this.blob = blob; + blob.use( this ); + } + + @Override + protected void emit( int index ) { + + if (blob.volume <= 0) { + return; + } + + int[] map = blob.cur; + float size = DungeonTilemap.SIZE; + + for (int i=0; i < LENGTH; i++) { + if (map[i] > 0 && Dungeon.visible[i]) { + float x = ((i % WIDTH) + Random.Float()) * size; + float y = ((i / WIDTH) + Random.Float()) * size; + factory.emit( this, index, x, y ); + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/effects/CellEmitter.java b/src/com/watabou/pixeldungeon/effects/CellEmitter.java new file mode 100644 index 0000000000..bb2751e290 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/CellEmitter.java @@ -0,0 +1,56 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.PointF; + +public class CellEmitter { + + public static Emitter get( int cell ) { + + PointF p = DungeonTilemap.tileToWorld( cell ); + + Emitter emitter = GameScene.emitter(); + emitter.pos( p.x, p.y, DungeonTilemap.SIZE, DungeonTilemap.SIZE ); + + return emitter; + } + + public static Emitter center( int cell ) { + + PointF p = DungeonTilemap.tileToWorld( cell ); + + Emitter emitter = GameScene.emitter(); + emitter.pos( p.x + DungeonTilemap.SIZE / 2, p.y + DungeonTilemap.SIZE / 2 ); + + return emitter; + } + + public static Emitter bottom( int cell ) { + + PointF p = DungeonTilemap.tileToWorld( cell ); + + Emitter emitter = GameScene.emitter(); + emitter.pos( p.x, p.y + DungeonTilemap.SIZE, DungeonTilemap.SIZE, 0 ); + + return emitter; + } +} diff --git a/src/com/watabou/pixeldungeon/effects/CheckedCell.java b/src/com/watabou/pixeldungeon/effects/CheckedCell.java new file mode 100644 index 0000000000..154000b42f --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/CheckedCell.java @@ -0,0 +1,50 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.gltextures.TextureCache; +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.DungeonTilemap; + +public class CheckedCell extends Image { + + private float alpha; + + public CheckedCell( int pos ) { + super( TextureCache.createSolid( 0xFF55AAFF ) ); + + origin.set( 0.5f ); + + point( DungeonTilemap.tileToWorld( pos ).offset( + DungeonTilemap.SIZE / 2, + DungeonTilemap.SIZE / 2 ) ); + + alpha = 0.8f; + } + + @Override + public void update() { + if ((alpha -= Game.elapsed) > 0) { + alpha( alpha ); + scale.set( DungeonTilemap.SIZE * alpha ); + } else { + killAndErase(); + } + } +} diff --git a/src/com/watabou/pixeldungeon/effects/DeathRay.java b/src/com/watabou/pixeldungeon/effects/DeathRay.java new file mode 100644 index 0000000000..ba58b8f12f --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/DeathRay.java @@ -0,0 +1,75 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import javax.microedition.khronos.opengles.GL10; + +import android.opengl.GLES20; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.utils.PointF; + +public class DeathRay extends Image { + + private static final double A = 180 / Math.PI; + + private static final float DURATION = 0.5f; + + private float timeLeft; + + public DeathRay( PointF s, PointF e ) { + super( Effects.get( Effects.Type.RAY ) ); + + origin.set( 0, height / 2 ); + + x = s.x - origin.x; + y = s.y - origin.y; + + float dx = e.x - s.x; + float dy = e.y - s.y; + angle = (float)(Math.atan2( dy, dx ) * A); + scale.x = (float)Math.sqrt( dx * dx + dy * dy ) / width; + + Sample.INSTANCE.play( Assets.SND_RAY ); + + timeLeft = DURATION; + } + + @Override + public void update() { + super.update(); + + float p = timeLeft / DURATION; + alpha( p ); + scale.set( scale.x, p ); + + if ((timeLeft -= Game.elapsed) <= 0) { + killAndErase(); + } + } + + @Override + public void draw() { + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE ); + super.draw(); + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); + } +} diff --git a/src/com/watabou/pixeldungeon/effects/Effects.java b/src/com/watabou/pixeldungeon/effects/Effects.java new file mode 100644 index 0000000000..744961ce08 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/Effects.java @@ -0,0 +1,50 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.Assets; + +public class Effects { + + public enum Type { + RIPPLE, + LIGHTNING, + WOUND, + RAY + }; + + public static Image get( Type type ) { + Image icon = new Image( Assets.EFFECTS ); + switch (type) { + case RIPPLE: + icon.frame( icon.texture.uvRect( 0, 0, 16, 16 ) ); + break; + case LIGHTNING: + icon.frame( icon.texture.uvRect( 16, 0, 32, 8 ) ); + break; + case WOUND: + icon.frame( icon.texture.uvRect( 16, 8, 32, 16 ) ); + break; + case RAY: + icon.frame( icon.texture.uvRect( 16, 16, 32, 24 ) ); + break; + } + return icon; + } +} diff --git a/src/com/watabou/pixeldungeon/effects/EmoIcon.java b/src/com/watabou/pixeldungeon/effects/EmoIcon.java new file mode 100644 index 0000000000..f7601c1976 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/EmoIcon.java @@ -0,0 +1,97 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.ui.Icons; +import com.watabou.utils.Random; + +public class EmoIcon extends Image { + + protected float maxSize = 2; + protected float timeScale = 1; + + protected boolean growing = true; + + protected CharSprite owner; + + public EmoIcon( CharSprite owner ) { + super(); + + this.owner = owner; + GameScene.add( this ); + } + + @Override + public void update() { + super.update(); + + if (visible) { + if (growing) { + scale.set( scale.x + Game.elapsed * timeScale ); + if (scale.x > maxSize) { + growing = false; + } + } else { + scale.set( scale.x - Game.elapsed * timeScale ); + if (scale.x < 1) { + growing = true; + } + } + + x = owner.x + owner.width - width / 2; + y = owner.y - height; + } + } + + public static class Sleep extends EmoIcon { + + public Sleep( CharSprite owner ) { + + super( owner ); + + copy( Icons.get( Icons.SLEEP ) ); + + maxSize = 1.2f; + timeScale = 0.5f; + + origin.set( width / 2, height / 2 ); + scale.set( Random.Float( 1, maxSize ) ); + } + } + + public static class Alert extends EmoIcon { + + public Alert( CharSprite owner ) { + + super( owner ); + + copy( Icons.get( Icons.ALERT ) ); + + maxSize = 1.3f; + timeScale = 2; + + origin.set( 2.5f, height - 2.5f ); + scale.set( Random.Float( 1, maxSize ) ); + } + } + +} diff --git a/src/com/watabou/pixeldungeon/effects/Fireball.java b/src/com/watabou/pixeldungeon/effects/Fireball.java new file mode 100644 index 0000000000..70b366cbd6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/Fireball.java @@ -0,0 +1,164 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import javax.microedition.khronos.opengles.GL10; + +import android.graphics.RectF; +import android.opengl.GLES20; + +import com.watabou.glwrap.Texture; +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.Image; +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.Assets; +import com.watabou.utils.ColorMath; +import com.watabou.utils.Random; + +public class Fireball extends Component { + + private static final RectF BLIGHT = new RectF( 0, 0, 0.25f, 1 ); + private static final RectF FLIGHT = new RectF( 0.25f, 0, 0.5f, 1 ); + private static final RectF FLAME1 = new RectF( 0.50f, 0, 0.75f, 1 ); + private static final RectF FLAME2 = new RectF( 0.75f, 0, 1.00f, 1 ); + + private static final int COLOR = 0xFF66FF; + + private Image bLight; + private Image fLight; + private Emitter emitter; + private Group sparks; + + @Override + protected void createChildren() { + + sparks = new Group(); + add( sparks ); + + bLight = new Image( Assets.FIREBALL ); + bLight.frame( BLIGHT ); + bLight.origin.set( bLight.width / 2 ); + bLight.angularSpeed = -90; + add( bLight ); + + emitter = new Emitter(); + emitter.pour( new Emitter.Factory() { + @Override + public void emit(Emitter emitter, int index, float x, float y) { + Flame p = (Flame)emitter.recycle( Flame.class ); + p.reset(); + p.x = x - p.width / 2; + p.y = y - p.height / 2; + } + }, 0.1f ); + add( emitter ); + + fLight = new Image( Assets.FIREBALL ); + fLight.frame( FLIGHT ); + fLight.origin.set( fLight.width / 2 ); + fLight.angularSpeed = 360; + add( fLight ); + + bLight.texture.filter( Texture.LINEAR, Texture.LINEAR ); + } + + @Override + protected void layout() { + + bLight.x = x - bLight.width / 2; + bLight.y = y - bLight.height / 2; + + emitter.pos( + x - bLight.width / 4, + y - bLight.height / 4, + bLight.width / 2, + bLight.height / 2 ); + + fLight.x = x - fLight.width / 2; + fLight.y = y - fLight.height / 2; + } + + @Override + public void update() { + + super.update(); + + if (Random.Float() < Game.elapsed) { + PixelParticle spark = (PixelParticle)sparks.recycle( PixelParticle.Shrinking.class ); + spark.reset( x, y, ColorMath.random( COLOR, 0x66FF66 ), 2, Random.Float( 0.5f, 1.0f ) ); + spark.speed.set( + Random.Float( -40, +40 ), + Random.Float( -60, +20 ) ); + spark.acc.set( 0, +80 ); + sparks.add( spark ); + } + } + + @Override + public void draw() { + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE ); + super.draw(); + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); + } + + public static class Flame extends Image { + + private static float LIFESPAN = 1f; + + private static float SPEED = -40f; + private static float ACC = -20f; + + private float timeLeft; + + public Flame() { + + super( Assets.FIREBALL ); + + frame( Random.Int( 2 ) == 0 ? FLAME1 : FLAME2 ); + origin.set( width / 2, height / 2 ); + acc.set( 0, ACC ); + } + + public void reset() { + revive(); + timeLeft = LIFESPAN; + speed.set( 0, SPEED ); + } + + @Override + public void update() { + + super.update(); + + if ((timeLeft -= Game.elapsed) <= 0) { + + kill(); + + } else { + + float p = timeLeft / LIFESPAN; + scale.set( p ); + alpha( p > 0.8f ? (1 - p) * 5f : p * 1.25f ); + + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/effects/Flare.java b/src/com/watabou/pixeldungeon/effects/Flare.java new file mode 100644 index 0000000000..7aab1984b5 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/Flare.java @@ -0,0 +1,170 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.nio.ShortBuffer; + +import javax.microedition.khronos.opengles.GL10; + +import android.annotation.SuppressLint; +import android.opengl.GLES20; +import android.util.FloatMath; + +import com.watabou.gltextures.Gradient; +import com.watabou.gltextures.SmartTexture; +import com.watabou.noosa.Game; +import com.watabou.noosa.NoosaScript; +import com.watabou.noosa.Visual; + +public class Flare extends Visual { + + private float duration = 0; + private float lifespan; + + private boolean lightMode = true; + + private SmartTexture texture; + + private FloatBuffer vertices; + private ShortBuffer indices; + + private int nRays; + + @SuppressLint("FloatMath") + public Flare( int nRays, float radius ) { + + super( 0, 0, 0, 0 ); + + // Texture is incorrectly created every time we need + // to show the effect, it must be refactored + + int gradient[] = {0xFFFFFFFF, 0x00FFFFFF}; + texture = new Gradient( gradient ); + + this.nRays = nRays; + + angle = 45; + angularSpeed = 180; + + vertices = ByteBuffer. + allocateDirect( (nRays * 2 + 1) * 4 * (Float.SIZE / 8) ). + order( ByteOrder.nativeOrder() ). + asFloatBuffer(); + + indices = ByteBuffer. + allocateDirect( nRays * 3 * Short.SIZE / 8 ). + order( ByteOrder.nativeOrder() ). + asShortBuffer(); + + float v[] = new float[4]; + + v[0] = 0; + v[1] = 0; + v[2] = 0.25f; + v[3] = 0; + vertices.put( v ); + + v[2] = 0.75f; + v[3] = 0; + + for (int i=0; i < nRays; i++) { + + float a = i * 3.1415926f * 2 / nRays; + v[0] = FloatMath.cos( a ) * radius; + v[1] = FloatMath.sin( a ) * radius; + vertices.put( v ); + + a += 3.1415926f * 2 / nRays / 2; + v[0] = FloatMath.cos( a ) * radius; + v[1] = FloatMath.sin( a ) * radius; + vertices.put( v ); + + indices.put( (short)0 ); + indices.put( (short)(1 + i * 2) ); + indices.put( (short)(2 + i * 2) ); + } + + indices.position( 0 ); + } + + public Flare color( int color, boolean lightMode ) { + this.lightMode = lightMode; + hardlight( color ); + + return this; + } + + public Flare show( Visual visual, float duration ) { + point( visual.center() ); + visual.parent.addToBack( this ); + + lifespan = this.duration = duration; + + return this; + } + + @Override + public void update() { + super.update(); + + if (duration > 0) { + if ((lifespan -= Game.elapsed) > 0) { + + float p = 1 - lifespan / duration; // 0 -> 1 + p = p < 0.25f ? p * 4 : (1 - p) * 1.333f; + scale.set( p ); + alpha( p ); + + } else { + killAndErase(); + } + } + } + + @Override + public void draw() { + + super.draw(); + + if (lightMode) { + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE ); + drawRays(); + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); + } else { + drawRays(); + } + } + + private void drawRays() { + + NoosaScript script = NoosaScript.get(); + + texture.bind(); + + script.uModel.valueM4( matrix ); + script.lighting( + rm, gm, bm, am, + ra, ga, ba, aa ); + + script.camera( camera ); + script.drawElements( vertices, indices, nRays * 3 ); + } +} diff --git a/src/com/watabou/pixeldungeon/effects/FloatingText.java b/src/com/watabou/pixeldungeon/effects/FloatingText.java new file mode 100644 index 0000000000..86f05d4487 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/FloatingText.java @@ -0,0 +1,134 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import java.util.ArrayList; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Game; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.utils.SparseArray; + +public class FloatingText extends BitmapText { + + private static final float LIFESPAN = 1f; + private static final float DISTANCE = DungeonTilemap.SIZE; + + private float timeLeft; + + private int key = -1; + + private static SparseArray> stacks = new SparseArray>(); + + public FloatingText() { + + super(); + + PixelScene.chooseFont( 9 ); + font = PixelScene.font; + scale.set( PixelScene.scale ); + + speed.y = - DISTANCE / LIFESPAN; + } + + @Override + public void update() { + super.update(); + + if (timeLeft > 0) { + if ((timeLeft -= Game.elapsed) <= 0) { + kill(); + } else { + float p = timeLeft / LIFESPAN; + alpha( p > 0.5f ? 1 : p * 2 ); + } + } + } + + @Override + public void kill() { + if (key != -1) { + stacks.get( key ).remove( this ); + key = -1; + } + super.kill(); + } + + @Override + public void destroy() { + kill(); + super.destroy(); + } + + public void reset( float x, float y, String text, int color ) { + + revive(); + + text( text ); + hardlight( color ); + + measure(); + this.x = PixelScene.align( x - width() / 2 ); + this.y = y - height(); + + timeLeft = LIFESPAN; + } + + /* STATIC METHODS */ + + public static void show( float x, float y, String text, int color ) { + GameScene.status().reset( x, y, text, color ); + } + + public static void show( float x, float y, int key, String text, int color ) { + FloatingText txt = GameScene.status(); + txt.reset( x, y, text, color ); + push( txt, key ); + } + + private static void push( FloatingText txt, int key ) { + + txt.key = key; + + ArrayList stack = stacks.get( key ); + if (stack == null) { + stack = new ArrayList(); + stacks.put( key, stack ); + } + + if (stack.size() > 0) { + FloatingText below = txt; + int aboveIndex = stack.size() - 1; + while (aboveIndex >= 0) { + FloatingText above = stack.get( aboveIndex ); + if (above.y + above.height() > below.y) { + above.y = below.y - above.height(); + + below = above; + aboveIndex--; + } else { + break; + } + } + } + + stack.add( txt ); + } +} diff --git a/src/com/watabou/pixeldungeon/effects/Halo.java b/src/com/watabou/pixeldungeon/effects/Halo.java new file mode 100644 index 0000000000..a9f42da1a7 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/Halo.java @@ -0,0 +1,74 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; + +import com.watabou.gltextures.SmartTexture; +import com.watabou.gltextures.TextureCache; +import com.watabou.noosa.Image; + +public class Halo extends Image { + + private static final Object CACHE_KEY = Halo.class; + + protected static final int RADIUS = 64; + + protected float radius = RADIUS; + protected float brightness = 1; + + public Halo() { + super(); + + if (!TextureCache.contains( CACHE_KEY )) { + Bitmap bmp = Bitmap.createBitmap( RADIUS * 2, RADIUS * 2, Bitmap.Config.ARGB_8888 ); + Canvas canvas = new Canvas( bmp ); + Paint paint = new Paint(); + paint.setColor( 0xFFFFFFFF ); + canvas.drawCircle( RADIUS, RADIUS, RADIUS * 0.75f, paint ); + paint.setColor( 0x88FFFFFF ); + canvas.drawCircle( RADIUS, RADIUS, RADIUS, paint ); + TextureCache.add( CACHE_KEY, new SmartTexture( bmp ) ); + } + + texture( CACHE_KEY ); + + origin.set( RADIUS ); + } + + public Halo( float radius, int color, float brightness ) { + + this(); + + hardlight( color ); + alpha( this.brightness = brightness ); + radius( radius ); + } + + public Halo point( float x, float y ) { + this.x = x - RADIUS; + this.y = y - RADIUS; + return this; + } + + public void radius( float value ) { + scale.set( (this.radius = value) / RADIUS ); + } +} diff --git a/src/com/watabou/pixeldungeon/effects/IceBlock.java b/src/com/watabou/pixeldungeon/effects/IceBlock.java new file mode 100644 index 0000000000..24c69b568b --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/IceBlock.java @@ -0,0 +1,68 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Gizmo; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.sprites.CharSprite; + +public class IceBlock extends Gizmo { + + private float phase; + + private CharSprite target; + + public IceBlock( CharSprite target ) { + super(); + + this.target = target; + phase = 0; + } + + @Override + public void update() { + super.update(); + + if ((phase += Game.elapsed * 2) < 1) { + target.tint( 0.83f, 1.17f, 1.33f, phase * 0.6f ); + } else { + target.tint( 0.83f, 1.17f, 1.33f, 0.6f ); + } + } + + public void melt() { + + target.resetColor(); + killAndErase(); + + if (visible) { + Splash.at( target.center(), 0xFFB2D6FF, 5 ); + Sample.INSTANCE.play( Assets.SND_SHATTER ); + } + } + + public static IceBlock freeze( CharSprite sprite ) { + + IceBlock iceBlock = new IceBlock( sprite ); + sprite.parent.add( iceBlock ); + + return iceBlock; + } +} diff --git a/src/com/watabou/pixeldungeon/effects/Identification.java b/src/com/watabou/pixeldungeon/effects/Identification.java new file mode 100644 index 0000000000..cb91bcb5dd --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/Identification.java @@ -0,0 +1,101 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import javax.microedition.khronos.opengles.GL10; + +import android.opengl.GLES20; + +import com.watabou.noosa.Group; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class Identification extends Group { + + private static int[] DOTS = { + -1, -3, + 0, -3, + +1, -3, + -1, -2, + +1, -2, + +1, -1, + 0, 0, + +1, 0, + 0, +1, + 0, +3 + }; + + public Identification( PointF p ) { + + for (int i=0; i < DOTS.length; i += 2) { + add( new Speck( p.x, p.y, DOTS[i], DOTS[i+1] ) ); + add( new Speck( p.x, p.y, DOTS[i], DOTS[i+1] ) ); + } + } + + @Override + public void update() { + super.update(); + if (countLiving() == 0) { + killAndErase(); + } + } + + @Override + public void draw() { + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE ); + super.draw(); + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); + } + + public static class Speck extends PixelParticle { + + public Speck( float x0, float y0, int mx, int my ) { + + super(); + color( 0x4488CC ); + + float x1 = x0 + mx * 3; + float y1 = y0 + my * 3; + + PointF p = new PointF().polar( Random.Float( 2 * PointF.PI ), 8 ); + x0 += p.x; + y0 += p.y; + + float dx = x1 - x0; + float dy = y1 - y0; + + x = x0; + y = y0; + speed.set( dx, dy ); + acc.set( -dx / 4, -dy / 4 ); + + left = lifespan = 2f; + } + + @Override + public void update() { + super.update(); + + am = 1 - Math.abs( left / lifespan - 0.5f ) * 2; + am *= am; + size( am * 2 ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/effects/Lightning.java b/src/com/watabou/pixeldungeon/effects/Lightning.java new file mode 100644 index 0000000000..f1ab3a1259 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/Lightning.java @@ -0,0 +1,142 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import javax.microedition.khronos.opengles.GL10; + +import android.opengl.GLES20; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.Image; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.utils.Callback; +import com.watabou.utils.Random; + +public class Lightning extends Group { + + private static final float DURATION = 0.3f; + + private float life; + + private int length; + private float[] cx; + private float[] cy; + + private Image[] arcsS; + private Image[] arcsE; + + private Callback callback; + + public Lightning( int[] cells, int length, Callback callback ) { + + super(); + + this.callback = callback; + + Image proto = Effects.get( Effects.Type.LIGHTNING ); + float ox = 0; + float oy = proto.height / 2; + + this.length = length; + cx = new float[length]; + cy = new float[length]; + + for (int i=0; i < length; i++) { + int c = cells[i]; + cx[i] = (c % Level.WIDTH + 0.5f) * DungeonTilemap.SIZE; + cy[i] = (c / Level.WIDTH + 0.5f) * DungeonTilemap.SIZE; + } + + arcsS = new Image[length - 1]; + arcsE = new Image[length - 1]; + for (int i=0; i < length - 1; i++) { + + Image arc = arcsS[i] = new Image( proto ); + + arc.x = cx[i] - arc.origin.x; + arc.y = cy[i] - arc.origin.y; + arc.origin.set( ox, oy ); + add( arc ); + + arc = arcsE[i] = new Image( proto ); + arc.origin.set( ox, oy ); + add( arc ); + } + + life = DURATION; + + Sample.INSTANCE.play( Assets.SND_LIGHTNING ); + } + + private static final double A = 180 / Math.PI; + + @Override + public void update() { + super.update(); + + if ((life -= Game.elapsed) < 0) { + + killAndErase(); + if (callback != null) { + callback.call(); + } + + } else { + + float alpha = life / DURATION; + + for (int i=0; i < length - 1; i++) { + + float sx = cx[i]; + float sy = cy[i]; + float ex = cx[i+1]; + float ey = cy[i+1]; + + float x2 = (sx + ex) / 2 + Random.Float( -4, +4 ); + float y2 = (sy + ey) / 2 + Random.Float( -4, +4 ); + + float dx = x2 - sx; + float dy = y2 - sy; + Image arc = arcsS[i]; + arc.am = alpha; + arc.angle = (float)(Math.atan2( dy, dx ) * A); + arc.scale.x = (float)Math.sqrt( dx * dx + dy * dy ) / arc.width; + + dx = ex - x2; + dy = ey - y2; + arc = arcsE[i]; + arc.am = alpha; + arc.angle = (float)(Math.atan2( dy, dx ) * A); + arc.scale.x = (float)Math.sqrt( dx * dx + dy * dy ) / arc.width; + arc.x = x2 - arc.origin.x; + arc.y = y2 - arc.origin.x; + } + } + } + + @Override + public void draw() { + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE ); + super.draw(); + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); + } +} diff --git a/src/com/watabou/pixeldungeon/effects/MagicMissile.java b/src/com/watabou/pixeldungeon/effects/MagicMissile.java new file mode 100644 index 0000000000..9e938140e5 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/MagicMissile.java @@ -0,0 +1,399 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.effects.particles.FlameParticle; +import com.watabou.pixeldungeon.effects.particles.LeafParticle; +import com.watabou.pixeldungeon.effects.particles.PoisonParticle; +import com.watabou.pixeldungeon.effects.particles.PurpleParticle; +import com.watabou.pixeldungeon.effects.particles.ShadowParticle; +import com.watabou.pixeldungeon.effects.particles.WoolParticle; +import com.watabou.utils.Callback; +import com.watabou.utils.ColorMath; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class MagicMissile extends Emitter { + + private static final float SPEED = 200f; + + private Callback callback; + + private float sx; + private float sy; + private float time; + + public void reset( int from, int to, Callback callback ) { + this.callback = callback; + + revive(); + + PointF pf = DungeonTilemap.tileCenterToWorld( from ); + PointF pt = DungeonTilemap.tileCenterToWorld( to ); + + x = pf.x; + y = pf.y; + width = 0; + height = 0; + + PointF d = PointF.diff( pt, pf ); + PointF speed = new PointF( d ).normalize().scale( SPEED ); + sx = speed.x; + sy = speed.y; + time = d.length() / SPEED; + } + + public void size( float size ) { + x -= size / 2; + y -= size / 2; + width = height = size; + } + + public static void blueLight( Group group, int from, int to, Callback callback ) { + MagicMissile missile = ((MagicMissile)group.recycle( MagicMissile.class )); + missile.reset( from, to, callback ); + missile.pour( MagicParticle.FACTORY, 0.01f ); + } + + public static void fire( Group group, int from, int to, Callback callback ) { + MagicMissile missile = ((MagicMissile)group.recycle( MagicMissile.class )); + missile.reset( from, to, callback ); + missile.size( 4 ); + missile.pour( FlameParticle.FACTORY, 0.01f ); + } + + public static void earth( Group group, int from, int to, Callback callback ) { + MagicMissile missile = ((MagicMissile)group.recycle( MagicMissile.class )); + missile.reset( from, to, callback ); + missile.size( 2 ); + missile.pour( EarthParticle.FACTORY, 0.01f ); + } + + public static void purpleLight( Group group, int from, int to, Callback callback ) { + MagicMissile missile = ((MagicMissile)group.recycle( MagicMissile.class )); + missile.reset( from, to, callback ); + missile.size( 2 ); + missile.pour( PurpleParticle.MISSILE, 0.01f ); + } + + public static void whiteLight( Group group, int from, int to, Callback callback ) { + MagicMissile missile = ((MagicMissile)group.recycle( MagicMissile.class )); + missile.reset( from, to, callback ); + missile.size( 4 ); + missile.pour( WhiteParticle.FACTORY, 0.01f ); + } + + public static void wool( Group group, int from, int to, Callback callback ) { + MagicMissile missile = ((MagicMissile)group.recycle( MagicMissile.class )); + missile.reset( from, to, callback ); + missile.size( 3 ); + missile.pour( WoolParticle.FACTORY, 0.01f ); + } + + public static void poison( Group group, int from, int to, Callback callback ) { + MagicMissile missile = ((MagicMissile)group.recycle( MagicMissile.class )); + missile.reset( from, to, callback ); + missile.size( 3 ); + missile.pour( PoisonParticle.MISSILE, 0.01f ); + } + + public static void foliage( Group group, int from, int to, Callback callback ) { + MagicMissile missile = ((MagicMissile)group.recycle( MagicMissile.class )); + missile.reset( from, to, callback ); + missile.size( 4 ); + missile.pour( LeafParticle.GENERAL, 0.01f ); + } + + public static void slowness( Group group, int from, int to, Callback callback ) { + MagicMissile missile = ((MagicMissile)group.recycle( MagicMissile.class )); + missile.reset( from, to, callback ); + missile.pour( SlowParticle.FACTORY, 0.01f ); + } + + public static void force( Group group, int from, int to, Callback callback ) { + MagicMissile missile = ((MagicMissile)group.recycle( MagicMissile.class )); + missile.reset( from, to, callback ); + missile.size( 4 ); + missile.pour( ForceParticle.FACTORY, 0.01f ); + } + + public static void coldLight( Group group, int from, int to, Callback callback ) { + MagicMissile missile = ((MagicMissile)group.recycle( MagicMissile.class )); + missile.reset( from, to, callback ); + missile.size( 4 ); + missile.pour( ColdParticle.FACTORY, 0.01f ); + } + + public static void shadow( Group group, int from, int to, Callback callback ) { + MagicMissile missile = ((MagicMissile)group.recycle( MagicMissile.class )); + missile.reset( from, to, callback ); + missile.size( 4 ); + missile.pour( ShadowParticle.MISSILE, 0.01f ); + } + + @Override + public void update() { + super.update(); + if (on) { + float d = Game.elapsed; + x += sx * d; + y += sy * d; + if ((time -= d) <= 0) { + on = false; + callback.call(); + } + } + } + + public static class MagicParticle extends PixelParticle { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((MagicParticle)emitter.recycle( MagicParticle.class )).reset( x, y ); + } + @Override + public boolean lightMode() { + return true; + }; + }; + + public MagicParticle() { + super(); + + color( 0x88CCFF ); + lifespan = 0.5f; + + speed.set( Random.Float( -10, +10 ), Random.Float( -10, +10 ) ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + } + + @Override + public void update() { + super.update(); + // alpha: 1 -> 0; size: 1 -> 4 + size( 4 - (am = left / lifespan) * 3 ); + } + } + + public static class EarthParticle extends PixelParticle.Shrinking { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((EarthParticle)emitter.recycle( EarthParticle.class )).reset( x, y ); + } + }; + + public EarthParticle() { + super(); + + lifespan = 0.5f; + + color( ColorMath.random( 0x555555, 0x777766 ) ); + + acc.set( 0, +40 ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + size = 4; + + speed.set( Random.Float( -10, +10 ), Random.Float( -10, +10 ) ); + } + } + + public static class WhiteParticle extends PixelParticle { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((WhiteParticle)emitter.recycle( WhiteParticle.class )).reset( x, y ); + } + @Override + public boolean lightMode() { + return true; + }; + }; + + public WhiteParticle() { + super(); + + lifespan = 0.4f; + + am = 0.5f; + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + } + + @Override + public void update() { + super.update(); + // size: 3 -> 0 + size( (left / lifespan) * 3 ); + } + } + + public static class SlowParticle extends PixelParticle { + + private Emitter emitter; + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((SlowParticle)emitter.recycle( SlowParticle.class )).reset( x, y, emitter ); + } + @Override + public boolean lightMode() { + return true; + }; + }; + + public SlowParticle() { + super(); + + lifespan = 0.6f; + + color( 0x664422 ); + size( 2 ); + } + + public void reset( float x, float y, Emitter emitter ) { + revive(); + + this.x = x; + this.y = y; + this.emitter = emitter; + + left = lifespan; + + acc.set( 0 ); + speed.set( Random.Float( -20, +20 ), Random.Float( -20, +20 ) ); + } + + @Override + public void update() { + super.update(); + + am = left / lifespan; + acc.set( (emitter.x - x) * 10, (emitter.y - y) * 10 ); + } + } + + public static class ForceParticle extends PixelParticle { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((ForceParticle)emitter.recycle( ForceParticle.class )).reset( x, y ); + } + }; + + public ForceParticle() { + super(); + + lifespan = 0.6f; + + size( 4 ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + + acc.set( 0 ); + speed.set( Random.Float( -40, +40 ), Random.Float( -40, +40 ) ); + } + + @Override + public void update() { + super.update(); + + am = (left / lifespan) / 2; + acc.set( -speed.x * 10, -speed.y * 10 ); + } + } + + public static class ColdParticle extends PixelParticle.Shrinking { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((ColdParticle)emitter.recycle( ColdParticle.class )).reset( x, y ); + } + @Override + public boolean lightMode() { + return true; + }; + }; + + public ColdParticle() { + super(); + + lifespan = 0.6f; + + color( 0x2244FF ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + size = 8; + } + + @Override + public void update() { + super.update(); + + am = 1 - left / lifespan; + } + } +} diff --git a/src/com/watabou/pixeldungeon/effects/Pushing.java b/src/com/watabou/pixeldungeon/effects/Pushing.java new file mode 100644 index 0000000000..7dfbb8406d --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/Pushing.java @@ -0,0 +1,100 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Visual; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.utils.PointF; + +public class Pushing extends Actor { + + private CharSprite sprite; + private int from; + private int to; + + private Effect effect; + + public Pushing( Char ch, int from, int to ) { + sprite = ch.sprite; + this.from = from; + this.to = to; + } + + @Override + protected boolean act() { + if (sprite != null) { + + if (effect == null) { + new Effect(); + } + return false; + + } else { + + Actor.remove( Pushing.this ); + return true; + } + } + + public class Effect extends Visual { + + private static final float DELAY = 0.15f; + + private PointF end; + + private float delay; + + public Effect() { + super( 0, 0, 0, 0 ); + + point( sprite.worldToCamera( from ) ); + end = sprite.worldToCamera( to ); + + speed.set( 2 * (end.x - x) / DELAY, 2 * (end.y - y) / DELAY ); + acc.set( -speed.x / DELAY, -speed.y / DELAY ); + + delay = 0; + + sprite.parent.add( this ); + } + + @Override + public void update() { + super.update(); + + if ((delay += Game.elapsed) < DELAY) { + + sprite.x = x; + sprite.y = y; + + } else { + + sprite.point( end ); + + killAndErase(); + Actor.remove( Pushing.this ); + + next(); + } + } + } + +} diff --git a/src/com/watabou/pixeldungeon/effects/Ripple.java b/src/com/watabou/pixeldungeon/effects/Ripple.java new file mode 100644 index 0000000000..d45c8df266 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/Ripple.java @@ -0,0 +1,59 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.levels.Level; + +public class Ripple extends Image { + + private static final float TIME_TO_FADE = 0.5f; + + private float time; + + public Ripple() { + super( Effects.get( Effects.Type.RIPPLE ) ); + } + + public void reset( int p ) { + revive(); + + x = (p % Level.WIDTH) * DungeonTilemap.SIZE; + y = (p / Level.WIDTH) * DungeonTilemap.SIZE; + + origin.set( width / 2, height / 2 ); + scale.set( 0 ); + + time = TIME_TO_FADE; + } + + @Override + public void update() { + super.update(); + + if ((time -= Game.elapsed) <= 0) { + kill(); + } else { + float p = time / TIME_TO_FADE; + scale.set( 1 - p ); + alpha( p ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/effects/Speck.java b/src/com/watabou/pixeldungeon/effects/Speck.java new file mode 100644 index 0000000000..0a3e5ffe49 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/Speck.java @@ -0,0 +1,419 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import android.annotation.SuppressLint; +import android.util.FloatMath; +import android.util.SparseArray; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.particles.Emitter; +import com.watabou.pixeldungeon.Assets; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class Speck extends Image { + + public static final int HEALING = 0; + public static final int STAR = 1; + public static final int LIGHT = 2; + public static final int QUESTION = 3; + public static final int UP = 4; + public static final int SCREAM = 5; + public static final int BONE = 6; + public static final int WOOL = 7; + public static final int ROCK = 8; + public static final int NOTE = 9; + public static final int CHANGE = 10; + public static final int HEART = 11; + public static final int BUBBLE = 12; + public static final int STEAM = 13; + public static final int COIN = 14; + + public static final int DISCOVER = 101; + public static final int EVOKE = 102; + public static final int MASTERY = 103; + public static final int KIT = 104; + public static final int RATTLE = 105; + public static final int JET = 106; + public static final int TOXIC = 107; + public static final int PARALYSIS = 108; + public static final int DUST = 109; + public static final int FORGE = 110; + + private static final int SIZE = 7; + + private int type; + private float lifespan; + private float left; + + private static TextureFilm film; + + private static SparseArray factories = new SparseArray(); + + public Speck() { + super(); + + texture( Assets.SPECKS ); + if (film == null) { + film = new TextureFilm( texture, SIZE, SIZE ); + } + + origin.set( SIZE / 2f ); + } + + public void reset( int index, float x, float y, int type ) { + revive(); + + this.type = type; + switch (type) { + case DISCOVER: + frame( film.get( LIGHT ) ); + break; + case EVOKE: + case MASTERY: + case KIT: + case FORGE: + frame( film.get( STAR ) ); + break; + case RATTLE: + frame( film.get( BONE ) ); + break; + case JET: + case TOXIC: + case PARALYSIS: + case DUST: + frame( film.get( STEAM ) ); + break; + default: + frame( film.get( type ) ); + } + + this.x = x - origin.x; + this.y = y - origin.y; + + resetColor(); + scale.set( 1 ); + speed.set( 0 ); + acc.set( 0 ); + angle = 0; + angularSpeed = 0; + + switch (type) { + + case HEALING: + speed.set( 0, -20 ); + lifespan = 1f; + break; + + case STAR: + speed.polar( Random.Float( 2 * 3.1415926f ), Random.Float( 128 ) ); + acc.set( 0, 128 ); + angle = Random.Float( 360 ); + angularSpeed = Random.Float( -360, +360 ); + lifespan = 1f; + break; + + case FORGE: + speed.polar( Random.Float( -3.1415926f, 0 ), Random.Float( 64 ) ); + acc.set( 0, 128 ); + angle = Random.Float( 360 ); + angularSpeed = Random.Float( -360, +360 ); + lifespan = 0.51f; + break; + + case EVOKE: + speed.polar( Random.Float( -3.1415926f, 0 ), 50 ); + acc.set( 0, 50 ); + angle = Random.Float( 360 ); + angularSpeed = Random.Float( -180, +180 ); + lifespan = 1f; + break; + + case KIT: + speed.polar( index * 3.1415926f / 5, 50 ); + acc.set( -speed.x, -speed.y ); + angle = index * 36; + angularSpeed = 360; + lifespan = 1f; + break; + + case MASTERY: + speed.set( Random.Int( 2 ) == 0 ? Random.Float( -128, -64 ) : Random.Float( +64, +128 ), 0 ); + angularSpeed = speed.x < 0 ? -180 : +180; + acc.set( -speed.x, 0 ); + lifespan = 0.5f; + break; + + case LIGHT: + angle = Random.Float( 360 ); + angularSpeed = 90; + lifespan = 1f; + break; + + case DISCOVER: + angle = Random.Float( 360 ); + angularSpeed = 90; + lifespan = 0.5f; + am = 0; + break; + + case QUESTION: + lifespan = 0.8f; + break; + + case UP: + speed.set( 0, -20 ); + lifespan = 1f; + break; + + case SCREAM: + lifespan = 0.9f; + break; + + case BONE: + lifespan = 0.2f; + speed.polar( Random.Float( 2 * 3.1415926f ), 24 / lifespan ); + acc.set( 0, 128 ); + angle = Random.Float( 360 ); + angularSpeed = 360; + break; + + case RATTLE: + lifespan = 0.5f; + speed.set( 0, -200 ); + acc.set( 0, -2 * speed.y / lifespan ); + angle = Random.Float( 360 ); + angularSpeed = 360; + break; + + case WOOL: + lifespan = 0.5f; + speed.set( 0, -50 ); + angle = Random.Float( 360 ); + angularSpeed = Random.Float( -360, +360 ); + break; + + case ROCK: + angle = Random.Float( 360 ); + angularSpeed = Random.Float( -360, +360 ); + scale.set( Random.Float( 1, 2 ) ); + speed.set( 0, 64 ); + lifespan = 0.2f; + y -= speed.y * lifespan; + break; + + case NOTE: + angularSpeed = Random.Float( -30, +30 ); + speed.polar( (angularSpeed - 90) * PointF.G2R, 30 ); + lifespan = 1f; + break; + + case CHANGE: + angle = Random.Float( 360 ); + speed.polar( (angle - 90) * PointF.G2R, Random.Float( 4, 12 ) ); + lifespan = 1.5f; + break; + + case HEART: + speed.set( Random.Int( -10, +10 ), -40 ); + angularSpeed = Random.Float( -45, +45 ); + lifespan = 1f; + break; + + case BUBBLE: + speed.set( 0, -15 ); + scale.set( Random.Float( 0.8f, 1 ) ); + lifespan = Random.Float( 0.8f, 1.5f ); + break; + + case STEAM: + speed.y = -Random.Float( 20, 30 ); + angularSpeed = Random.Float( +180 ); + angle = Random.Float( 360 ); + lifespan = 1f; + break; + + case JET: + speed.y = +32; + acc.y = -64; + angularSpeed = Random.Float( 180, 360 ); + angle = Random.Float( 360 ); + lifespan = 0.5f; + break; + + case TOXIC: + hardlight( 0x50FF60 ); + angularSpeed = 30; + angle = Random.Float( 360 ); + lifespan = Random.Float( 1f, 3f ); + break; + + case PARALYSIS: + hardlight( 0xFFFF66 ); + angularSpeed = -30; + angle = Random.Float( 360 ); + lifespan = Random.Float( 1f, 3f ); + break; + + case DUST: + hardlight( 0xFFFF66 ); + angle = Random.Float( 360 ); + speed.polar( Random.Float( 2 * 3.1415926f ), Random.Float( 16, 48 ) ); + lifespan = 0.5f; + break; + + case COIN: + speed.polar( -PointF.PI * Random.Float( 0.3f, 0.7f ), Random.Float( 48, 96 ) ); + acc.y = 256; + lifespan = -speed.y / acc.y * 2; + break; + } + + left = lifespan; + } + + @SuppressLint("FloatMath") + @Override + public void update() { + super.update(); + + left -= Game.elapsed; + if (left <= 0) { + + kill(); + + } else { + + float p = 1 - left / lifespan; // 0 -> 1 + + switch (type) { + + case STAR: + case FORGE: + scale.set( 1 - p ); + am = p < 0.2f ? p * 5f : (1 - p) * 1.25f; + break; + + case KIT: + case MASTERY: + am = 1 - p * p; + break; + + case EVOKE: + + case HEALING: + am = p < 0.5f ? 1 : 2 - p * 2; + break; + + case LIGHT: + am = scale.set( p < 0.2f ? p * 5f : (1 - p) * 1.25f ).x; + break; + + case DISCOVER: + am = 1 - p; + scale.set( (p < 0.5f ? p : 1 - p) * 2 ); + break; + + case QUESTION: + scale.set( (float)(Math.sqrt( p < 0.5f ? p : 1 - p ) * 3) ); + break; + + case UP: + scale.set( (float)(Math.sqrt( p < 0.5f ? p : 1 - p ) * 2) ); + break; + + case SCREAM: + am = (float)Math.sqrt( (p < 0.5f ? p : 1 - p) * 2f ); + scale.set( p * 7 ); + break; + + case BONE: + case RATTLE: + am = p < 0.9f ? 1 : (1 - p) * 10; + break; + + case ROCK: + am = p < 0.2f ? p * 5 : 1 ; + break; + + case NOTE: + am = 1 - p * p; + break; + + case WOOL: + scale.set( 1 - p ); + break; + + case CHANGE: + am = (float)FloatMath.sqrt( (p < 0.5f ? p : 1 - p) * 2); + scale.y = (1 + p) * 0.5f; + scale.x = scale.y * FloatMath.cos( left * 15 ); + break; + + case HEART: + scale.set( 1 - p ); + am = 1 - p * p; + break; + + case BUBBLE: + am = p < 0.2f ? p * 5 : 1; + break; + + case STEAM: + case TOXIC: + case PARALYSIS: + case DUST: + am = p < 0.5f ? p : 1 - p; + scale.set( 1 + p * 2 ); + break; + + case JET: + am = (p < 0.5f ? p : 1 - p) * 2; + scale.set( p * 1.5f ); + break; + + case COIN: + scale.x = FloatMath.cos( left * 5 ); + rm = gm = bm = (Math.abs( scale.x ) + 1) * 0.5f; + am = p < 0.9f ? 1 : (1 - p) * 10; + break; + } + } + } + + public static Emitter.Factory factory( final int type ) { + + Emitter.Factory factory = factories.get( type ); + + if (factory == null) { + factory = new Emitter.Factory() { + @Override + public void emit ( Emitter emitter, int index, float x, float y ) { + Speck p = (Speck)emitter.recycle( Speck.class ); + p.reset( index, x, y, type ); + } + }; + factories.put( type, factory ); + } + + return factory; + } +} diff --git a/src/com/watabou/pixeldungeon/effects/SpellSprite.java b/src/com/watabou/pixeldungeon/effects/SpellSprite.java new file mode 100644 index 0000000000..f27e1786f7 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/SpellSprite.java @@ -0,0 +1,135 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import java.util.HashMap; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class SpellSprite extends Image { + + public static final int FOOD = 0; + public static final int MAP = 1; + public static final int CHARGE = 2; + public static final int MASTERY = 3; + + private static final int SIZE = 16; + + private enum Phase { + FADE_IN, STATIC, FADE_OUT + }; + + private static final float FADE_IN_TIME = 0.2f; + private static final float STATIC_TIME = 0.8f; + private static final float FADE_OUT_TIME = 0.4f; + + private static TextureFilm film; + + private Char target; + + private Phase phase; + private float duration; + private float passed; + + private static HashMap all = new HashMap(); + + public SpellSprite() { + super( Assets.SPELL_ICONS ); + + if (film == null) { + film = new TextureFilm( texture, SIZE ); + } + } + + public void reset( int index ) { + frame( film.get( index ) ); + origin.set( width / 2, height / 2 ); + + phase = Phase.FADE_IN; + + duration = FADE_IN_TIME; + passed = 0; + } + + @Override + public void update() { + super.update(); + + x = target.sprite.center().x - SIZE / 2; + y = target.sprite.y - SIZE; + + switch (phase) { + case FADE_IN: + alpha( passed / duration ); + scale.set( passed / duration ); + break; + case STATIC: + break; + case FADE_OUT: + alpha( 1 - passed / duration ); + break; + } + + if ((passed += Game.elapsed) > duration) { + switch (phase) { + case FADE_IN: + phase = Phase.STATIC; + duration = STATIC_TIME; + break; + case STATIC: + phase = Phase.FADE_OUT; + duration = FADE_OUT_TIME; + break; + case FADE_OUT: + kill(); + break; + } + + passed = 0; + } + } + + @Override + public void kill() { + super.kill(); + all.remove( target ); + } + + public static void show( Char ch, int index ) { + + if (!ch.sprite.visible) { + return; + } + + SpellSprite old = all.get( ch ); + if (old != null) { + old.kill(); + } + + SpellSprite sprite = GameScene.spellSprite(); + sprite.revive(); + sprite.reset( index ); + sprite.target = ch; + all.put( ch, sprite ); + } +} diff --git a/src/com/watabou/pixeldungeon/effects/Splash.java b/src/com/watabou/pixeldungeon/effects/Splash.java new file mode 100644 index 0000000000..cf2d9ea821 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/Splash.java @@ -0,0 +1,80 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class Splash { + + public static void at( int cell, final int color, int n ) { + at( DungeonTilemap.tileCenterToWorld( cell ), color, n ); + } + + public static void at( PointF p, final int color, int n ) { + + if (n <= 0) { + return; + } + + Emitter emitter = GameScene.emitter(); + emitter.pos( p ); + + FACTORY.color = color; + FACTORY.dir = -3.1415926f / 2; + FACTORY.cone = 3.1415926f; + emitter.burst( FACTORY, n ); + } + + public static void at( PointF p, final float dir, final float cone, final int color, int n ) { + + if (n <= 0) { + return; + } + + Emitter emitter = GameScene.emitter(); + emitter.pos( p ); + + FACTORY.color = color; + FACTORY.dir = dir; + FACTORY.cone = cone; + emitter.burst( FACTORY, n ); + } + + private static final SplashFactory FACTORY = new SplashFactory(); + + private static class SplashFactory extends Emitter.Factory { + + public int color; + public float dir; + public float cone; + + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + PixelParticle p = (PixelParticle)emitter.recycle( PixelParticle.Shrinking.class ); + + p.reset( x, y, color, 4, Random.Float( 0.5f, 1.0f ) ); + p.speed.polar( Random.Float( dir - cone / 2, dir + cone / 2 ), Random.Float( 40, 80 ) ); + p.acc.set( 0, +100 ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/effects/TorchHalo.java b/src/com/watabou/pixeldungeon/effects/TorchHalo.java new file mode 100644 index 0000000000..fe89081e63 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/TorchHalo.java @@ -0,0 +1,71 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import javax.microedition.khronos.opengles.GL10; + +import android.opengl.GLES20; + +import com.watabou.noosa.Game; +import com.watabou.pixeldungeon.sprites.CharSprite; + +public class TorchHalo extends Halo { + + private CharSprite target; + + private float phase = 0; + + public TorchHalo( CharSprite sprite ) { + super( 24, 0xFFDDCC, 0.15f ); + target = sprite; + am = 0; + } + + @Override + public void update() { + super.update(); + + if (phase < 0) { + if ((phase += Game.elapsed) >= 0) { + killAndErase(); + } else { + scale.set( (2 + phase) * radius / RADIUS ); + am = -phase * brightness; + } + } else if (phase < 1) { + if ((phase += Game.elapsed) >= 1) { + phase = 1; + } + scale.set( phase * radius / RADIUS ); + am = phase * brightness; + } + + point( target.x + target.width / 2, target.y + target.height / 2 ); + } + + @Override + public void draw() { + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE ); + super.draw(); + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); + } + + public void putOut() { + phase = -1; + } +} diff --git a/src/com/watabou/pixeldungeon/effects/Wound.java b/src/com/watabou/pixeldungeon/effects/Wound.java new file mode 100644 index 0000000000..6e4c60306d --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/Wound.java @@ -0,0 +1,83 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.levels.Level; + +public class Wound extends Image { + + private static final float TIME_TO_FADE = 0.8f; + + private float time; + + public Wound() { + super( Effects.get( Effects.Type.WOUND ) ); + origin.set( width / 2, height / 2 ); + } + + public void reset( int p ) { + revive(); + + x = (p % Level.WIDTH) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - width) / 2; + y = (p / Level.WIDTH) * DungeonTilemap.SIZE + (DungeonTilemap.SIZE - height) / 2; + + time = TIME_TO_FADE; + } + + @Override + public void update() { + super.update(); + + if ((time -= Game.elapsed) <= 0) { + kill(); + } else { + float p = time / TIME_TO_FADE; + alpha( p ); + scale.x = 1 + p; + } + } + + public static void hit( Char ch ) { + hit( ch, 0 ); + } + + public static void hit( Char ch, float angle ) { + Wound w = (Wound)ch.sprite.parent.recycle( Wound.class ); + ch.sprite.parent.bringToFront( w ); + w.reset( ch.pos ); + w.angle = angle; + } + + public static void hit( int pos ) { + hit( pos, 0 ); + } + + public static void hit( int pos, float angle ) { + Group parent = Dungeon.hero.sprite.parent; + Wound w = (Wound)parent.recycle( Wound.class ); + parent.bringToFront( w ); + w.reset( pos ); + w.angle = angle; + } +} diff --git a/src/com/watabou/pixeldungeon/effects/particles/BloodParticle.java b/src/com/watabou/pixeldungeon/effects/particles/BloodParticle.java new file mode 100644 index 0000000000..33b91e5c7d --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/BloodParticle.java @@ -0,0 +1,60 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; + +public class BloodParticle extends PixelParticle.Shrinking { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((BloodParticle)emitter.recycle( BloodParticle.class )).reset( x, y ); + } + }; + + public BloodParticle() { + super(); + + color( 0xCC0000 ); + lifespan = 0.8f; + + acc.set( 0, +40 ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + + size = 4; + speed.set( 0 ); + } + + @Override + public void update() { + super.update(); + float p = left / lifespan; + am = p > 0.6f ? (1 - p) * 2.5f : 1; + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/EarthParticle.java b/src/com/watabou/pixeldungeon/effects/particles/EarthParticle.java new file mode 100644 index 0000000000..1d1cb4a706 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/EarthParticle.java @@ -0,0 +1,60 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.utils.ColorMath; +import com.watabou.utils.Random; + +public class EarthParticle extends PixelParticle { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((EarthParticle)emitter.recycle( EarthParticle.class )).reset( x, y ); + } + }; + + public EarthParticle() { + super(); + + color( ColorMath.random( 0x444444, 0x777766 ) ); + angle = Random.Float( -30, 30 ); + + lifespan = 0.5f; + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + } + + @Override + public void update() { + super.update(); + + float p = left / lifespan; + size( (p < 0.5f ? p : 1 - p) * 16 ); + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/ElmoParticle.java b/src/com/watabou/pixeldungeon/effects/particles/ElmoParticle.java new file mode 100644 index 0000000000..d87cf01125 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/ElmoParticle.java @@ -0,0 +1,64 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; + +public class ElmoParticle extends PixelParticle.Shrinking { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((ElmoParticle)emitter.recycle( ElmoParticle.class )).reset( x, y ); + } + @Override + public boolean lightMode() { + return true; + }; + }; + + public ElmoParticle() { + super(); + + color( 0x22EE66 ); + lifespan = 0.6f; + + acc.set( 0, -80 ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + + size = 4; + speed.set( 0 ); + } + + @Override + public void update() { + super.update(); + float p = left / lifespan; + am = p > 0.8f ? (1 - p) * 5 : 1; + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/EnergyParticle.java b/src/com/watabou/pixeldungeon/effects/particles/EnergyParticle.java new file mode 100644 index 0000000000..31c97d5c61 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/EnergyParticle.java @@ -0,0 +1,65 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class EnergyParticle extends PixelParticle { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((EnergyParticle)emitter.recycle( EnergyParticle.class )).reset( x, y ); + } + @Override + public boolean lightMode() { + return true; + }; + }; + + public EnergyParticle() { + super(); + + lifespan = 1f; + color( 0xFFFFAA ); + + speed.polar( Random.Float( 2 * PointF.PI ), Random.Float( 24, 32 ) ); + } + + public void reset( float x, float y ) { + revive(); + + left = lifespan; + + this.x = x - speed.x * lifespan; + this.y = y - speed.y * lifespan; + } + + @Override + public void update() { + super.update(); + + float p = left / lifespan; + am = p < 0.5f ? p * p * 4 : (1 - p) * 2; + size( Random.Float( 5 * left / lifespan ) ); + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/FlameParticle.java b/src/com/watabou/pixeldungeon/effects/particles/FlameParticle.java new file mode 100644 index 0000000000..ae344f5d46 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/FlameParticle.java @@ -0,0 +1,64 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; + +public class FlameParticle extends PixelParticle.Shrinking { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((FlameParticle)emitter.recycle( FlameParticle.class )).reset( x, y ); + } + @Override + public boolean lightMode() { + return true; + }; + }; + + public FlameParticle() { + super(); + + color( 0xEE7722 ); + lifespan = 0.6f; + + acc.set( 0, -80 ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + + size = 4; + speed.set( 0 ); + } + + @Override + public void update() { + super.update(); + float p = left / lifespan; + am = p > 0.8f ? (1 - p) * 5 : 1; + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/FlowParticle.java b/src/com/watabou/pixeldungeon/effects/particles/FlowParticle.java new file mode 100644 index 0000000000..e62780075e --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/FlowParticle.java @@ -0,0 +1,109 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class FlowParticle extends PixelParticle { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((FlowParticle)emitter.recycle( FlowParticle.class )).reset( x, y ); + } + }; + + public FlowParticle() { + super(); + + lifespan = 0.6f; + acc.set( 0, 32 ); + angularSpeed = Random.Float( -360, +360 ); + } + + public void reset( float x, float y ) { + revive(); + + left = lifespan; + + this.x = x; + this.y = y; + + am = 0; + size( 0 ); + speed.set( 0 ); + } + + @Override + public void update() { + super.update(); + + float p = left / lifespan; + am = (p < 0.5f ? p : 1 - p) * 0.6f; + size( (1 - p) * 4 ); + } + + public static class Flow extends Group { + + private static final float DELAY = 0.1f; + + private int pos; + + private float x; + private float y; + + private float delay; + + public Flow( int pos ) { + super(); + + this.pos = pos; + + PointF p = DungeonTilemap.tileToWorld( pos ); + x = p.x; + y = p.y + DungeonTilemap.SIZE - 1; + + delay = Random.Float( DELAY ); + } + + @Override + public void update() { + + if (visible = Dungeon.visible[pos]) { + + super.update(); + + if ((delay -= Game.elapsed) <= 0) { + + delay = Random.Float( DELAY ); + + ((FlowParticle)recycle( FlowParticle.class )).reset( + x + Random.Float( DungeonTilemap.SIZE ), y ); + } + } + } + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/LeafParticle.java b/src/com/watabou/pixeldungeon/effects/particles/LeafParticle.java new file mode 100644 index 0000000000..a0112a417b --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/LeafParticle.java @@ -0,0 +1,69 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.utils.ColorMath; +import com.watabou.utils.Random; + +public class LeafParticle extends PixelParticle.Shrinking { + + public static int color1; + public static int color2; + + + public static final Emitter.Factory GENERAL = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + LeafParticle p = ((LeafParticle)emitter.recycle( LeafParticle.class )); + p.color( ColorMath.random( 0x004400, 0x88CC44 ) ); + p.reset( x, y ); + } + }; + + public static final Emitter.Factory LEVEL_SPECIFIC = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + LeafParticle p = ((LeafParticle)emitter.recycle( LeafParticle.class )); + p.color( ColorMath.random( Dungeon.level.color1, Dungeon.level.color2 ) ); + p.reset( x, y ); + } + }; + + public LeafParticle() { + super(); + + lifespan = 1.2f; + acc.set( 0, 25 ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + speed.set( Random.Float( -8, +8 ), -20 ); + + left = lifespan; + size = Random.Float( 2, 3 ); + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/PoisonParticle.java b/src/com/watabou/pixeldungeon/effects/particles/PoisonParticle.java new file mode 100644 index 0000000000..16554f67a0 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/PoisonParticle.java @@ -0,0 +1,88 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.utils.ColorMath; +import com.watabou.utils.Random; + +public class PoisonParticle extends PixelParticle { + + public static final Emitter.Factory MISSILE = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((PoisonParticle)emitter.recycle( PoisonParticle.class )).resetMissile( x, y ); + } + @Override + public boolean lightMode() { + return true; + }; + }; + + public static final Emitter.Factory SPLASH = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((PoisonParticle)emitter.recycle( PoisonParticle.class )).resetSplash( x, y ); + } + @Override + public boolean lightMode() { + return true; + }; + }; + + public PoisonParticle() { + super(); + + lifespan = 0.6f; + + acc.set( 0, +30 ); + } + + public void resetMissile( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + + speed.polar( Random.Float( 3.1415926f ), Random.Float( 6 ) ); + } + + public void resetSplash( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + + speed.polar( Random.Float( 3.1415926f ), Random.Float( 10, 20 ) ); + } + + @Override + public void update() { + super.update(); + // alpha: 1 -> 0; size: 1 -> 4 + size( 4 - (am = left / lifespan) * 3 ); + // color: 0x8844FF -> 0x00FF00 + color( ColorMath.interpolate( 0x00FF00, 0x8844FF, am ) ); + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/PurpleParticle.java b/src/com/watabou/pixeldungeon/effects/particles/PurpleParticle.java new file mode 100644 index 0000000000..ca378fe525 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/PurpleParticle.java @@ -0,0 +1,82 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.utils.ColorMath; +import com.watabou.utils.Random; + +public class PurpleParticle extends PixelParticle { + + public static final Emitter.Factory MISSILE = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((PurpleParticle)emitter.recycle( PurpleParticle.class )).reset( x, y ); + } + }; + + public static final Emitter.Factory BURST = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((PurpleParticle)emitter.recycle( PurpleParticle.class )).resetBurst( x, y ); + } + @Override + public boolean lightMode() { + return true; + } + }; + + public PurpleParticle() { + super(); + + lifespan = 0.5f; + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + speed.set( Random.Float( -5, +5 ), Random.Float( -5, +5 ) ); + + left = lifespan; + } + + public void resetBurst( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + speed.polar( Random.Float( 360 ), Random.Float( 16, 32 ) ); + + left = lifespan; + } + + @Override + public void update() { + super.update(); + // alpha: 1 -> 0; size: 1 -> 5 + size( 5 - (am = left / lifespan) * 4 ); + // color: 0xFF0044 -> 0x220066 + color( ColorMath.interpolate( 0x220066, 0xFF0044, am ) ); + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/ShadowParticle.java b/src/com/watabou/pixeldungeon/effects/particles/ShadowParticle.java new file mode 100644 index 0000000000..0df72649a2 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/ShadowParticle.java @@ -0,0 +1,93 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.utils.ColorMath; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class ShadowParticle extends PixelParticle.Shrinking { + + public static final Emitter.Factory MISSILE = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((ShadowParticle)emitter.recycle( ShadowParticle.class )).reset( x, y ); + } + }; + + public static final Emitter.Factory CURSE = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((ShadowParticle)emitter.recycle( ShadowParticle.class )).resetCurse( x, y ); + } + }; + + public static final Emitter.Factory UP = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((ShadowParticle)emitter.recycle( ShadowParticle.class )).resetUp( x, y ); + } + }; + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + speed.set( Random.Float( -5, +5 ), Random.Float( -5, +5 ) ); + + size = 6; + left = lifespan = 0.5f; + } + + public void resetCurse( float x, float y ) { + revive(); + + size = 8; + left = lifespan = 0.5f; + + speed.polar( Random.Float( 2 * PointF.PI ), Random.Float( 16, 32 ) ); + this.x = x - speed.x * lifespan; + this.y = y - speed.y * lifespan; + } + + public void resetUp( float x, float y ) { + revive(); + + speed.set( Random.Float( -8, +8 ), Random.Float( -32, -48 ) ); + this.x = x; + this.y = y; + + size = 6; + left = lifespan = 1f; + } + + @Override + public void update() { + super.update(); + + float p = left / lifespan; + // alpha: 0 -> 1 -> 0; size: 6 -> 0; color: 0x660044 -> 0x000000 + color( ColorMath.interpolate( 0x000000, 0x440044, p ) ); + am = p < 0.5f ? p * p * 4 : (1 - p) * 2; + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/ShaftParticle.java b/src/com/watabou/pixeldungeon/effects/particles/ShaftParticle.java new file mode 100644 index 0000000000..ba4c2769d5 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/ShaftParticle.java @@ -0,0 +1,66 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.utils.Random; + +public class ShaftParticle extends PixelParticle { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((ShaftParticle)emitter.recycle( ShaftParticle.class )).reset( x, y ); + } + @Override + public boolean lightMode() { + return true; + } + }; + + public ShaftParticle() { + super(); + + lifespan = 1.2f; + speed.set( 0, -6 ); + } + + private float offs; + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + offs = -Random.Float( lifespan ); + left = lifespan - offs; + } + + @Override + public void update() { + super.update(); + + float p = left / lifespan; + am = p < 0.5f ? p : 1 - p; + scale.x = (1 - p) * 4; + scale.y = 16 + (1 - p) * 16; + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/SnowParticle.java b/src/com/watabou/pixeldungeon/effects/particles/SnowParticle.java new file mode 100644 index 0000000000..8b4b809ca7 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/SnowParticle.java @@ -0,0 +1,55 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.utils.Random; + +public class SnowParticle extends PixelParticle { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((SnowParticle)emitter.recycle( SnowParticle.class )).reset( x, y ); + } + }; + + public SnowParticle() { + super(); + speed.set( 0, Random.Float( 5, 8 ) ); + lifespan = 1.2f; + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y - speed.y * lifespan; + + left = lifespan; + } + + @Override + public void update() { + super.update(); + float p = left / lifespan; + am = (p < 0.5f ? p : 1 - p) * 1.5f; + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/SparkParticle.java b/src/com/watabou/pixeldungeon/effects/particles/SparkParticle.java new file mode 100644 index 0000000000..f817e432bb --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/SparkParticle.java @@ -0,0 +1,62 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.utils.Random; + +public class SparkParticle extends PixelParticle { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((SparkParticle)emitter.recycle( SparkParticle.class )).reset( x, y ); + } + @Override + public boolean lightMode() { + return true; + }; + }; + + public SparkParticle() { + super(); + + size( 2 ); + + acc.set( 0, +50 ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan = Random.Float( 0.5f, 1.0f ); + + speed.polar( Random.Float( 3.1415926f ), Random.Float( 20, 40 ) ); + } + + @Override + public void update() { + super.update(); + size( Random.Float( 5 * left / lifespan ) ); + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/WebParticle.java b/src/com/watabou/pixeldungeon/effects/particles/WebParticle.java new file mode 100644 index 0000000000..4b9ef61bb5 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/WebParticle.java @@ -0,0 +1,61 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.utils.Random; + +public class WebParticle extends PixelParticle { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + for (int i=0; i < 3; i++) { + ((WebParticle)emitter.recycle( WebParticle.class )).reset( x, y ); + } + } + }; + + public WebParticle() { + super(); + + color( 0xCCCCCC ); + lifespan = 2f; + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + angle = Random.Float( 360 ); + } + + @Override + public void update() { + super.update(); + + float p = left / lifespan; + am = p < 0.5f ? p : 1 - p; + scale.y = 16 + p * 8; + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/WindParticle.java b/src/com/watabou/pixeldungeon/effects/particles/WindParticle.java new file mode 100644 index 0000000000..676fd29e53 --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/WindParticle.java @@ -0,0 +1,114 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class WindParticle extends PixelParticle { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((WindParticle)emitter.recycle( WindParticle.class )).reset( x, y ); + } + }; + + private static float angle = Random.Float( PointF.PI * 2 ); + private static PointF speed = new PointF().polar( angle, 5 ); + + private float size; + + public WindParticle() { + super(); + + lifespan = Random.Float( 1, 2 ); + scale.set( size = Random.Float( 3 ) ); + } + + public void reset( float x, float y ) { + revive(); + + left = lifespan; + + super.speed.set( WindParticle.speed ); + super.speed.scale( size ); + + this.x = x - super.speed.x * lifespan / 2; + this.y = y - super.speed.y * lifespan / 2; + + angle += Random.Float( -0.1f, +0.1f ); + speed = new PointF().polar( angle, 5 ); + + am = 0; + } + + @Override + public void update() { + super.update(); + + float p = left / lifespan; + am = (p < 0.5f ? p : 1 - p) * size * 0.2f; + } + + public static class Wind extends Group { + + private int pos; + + private float x; + private float y; + + private float delay; + + public Wind( int pos ) { + super(); + + this.pos = pos; + PointF p = DungeonTilemap.tileToWorld( pos ); + x = p.x; + y = p.y; + + delay = Random.Float( 5 ); + } + + @Override + public void update() { + + if (visible = Dungeon.visible[pos]) { + + super.update(); + + if ((delay -= Game.elapsed) <= 0) { + + delay = Random.Float( 5 ); + + ((WindParticle)recycle( WindParticle.class )).reset( + x + Random.Float( DungeonTilemap.SIZE ), + y + Random.Float( DungeonTilemap.SIZE ) ); + } + } + } + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/effects/particles/WoolParticle.java b/src/com/watabou/pixeldungeon/effects/particles/WoolParticle.java new file mode 100644 index 0000000000..1361d962aa --- /dev/null +++ b/src/com/watabou/pixeldungeon/effects/particles/WoolParticle.java @@ -0,0 +1,54 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.effects.particles; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.noosa.particles.Emitter.Factory; +import com.watabou.utils.ColorMath; +import com.watabou.utils.Random; + +public class WoolParticle extends PixelParticle.Shrinking { + + public static final Emitter.Factory FACTORY = new Factory() { + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + ((WoolParticle)emitter.recycle( WoolParticle.class )).reset( x, y ); + } + }; + + public WoolParticle() { + super(); + + color( ColorMath.random( 0x999999, 0xEEEEE0 ) ); + + acc.set( 0, -40 ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan = Random.Float( 0.6f, 1f ); + size = 5; + + speed.set( Random.Float( -10, +10 ), Random.Float( -10, +10 ) ); + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/items/Amulet.java b/src/com/watabou/pixeldungeon/items/Amulet.java new file mode 100644 index 0000000000..09be4e437a --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/Amulet.java @@ -0,0 +1,106 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.io.IOException; +import java.util.ArrayList; + +import com.watabou.noosa.Game; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.scenes.AmuletScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Amulet extends Item { + + private static final String AC_END = "END THE GAME"; + + { + name = "Amulet of Yendor"; + image = ItemSpriteSheet.AMULET; + + unique = true; + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( AC_END ); + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + if (action == AC_END) { + + showAmuletScene( false ); + + } else { + + super.execute( hero, action ); + + } + } + + @Override + public boolean doPickUp( Hero hero ) { + if (super.doPickUp( hero )) { + + if (!Statistics.amuletObtained) { + Statistics.amuletObtained = true; + Dungeon.win( ResultDescriptions.WIN ); + Badges.validateVictory(); + + showAmuletScene( true ); + } + + return true; + } else { + return false; + } + } + + private void showAmuletScene( boolean showText ) { + try { + Dungeon.saveAll(); + AmuletScene.noText = !showText; + Game.switchScene( AmuletScene.class ); + } catch (IOException e) { + } + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public String info() { + return + "The Amulet of Yendor is the most powerful known artifact of unknown origin. It is said that the amulet " + + "is able to fulfil any wish if its owner's will-power is strong enough to \"persuade\" it to do it."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/Ankh.java b/src/com/watabou/pixeldungeon/items/Ankh.java new file mode 100644 index 0000000000..d7e94f08a1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/Ankh.java @@ -0,0 +1,51 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Ankh extends Item { + + { + stackable = true; + name = "Ankh"; + image = ItemSpriteSheet.ANKH; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public String info() { + return + "The ancient symbol of immortality grants an ability to return to life after death. " + + "Upon resurrection all non-equipped items are lost."; + } + + @Override + public int price() { + return 50 * quantity; + } +} diff --git a/src/com/watabou/pixeldungeon/items/ArmorKit.java b/src/com/watabou/pixeldungeon/items/ArmorKit.java new file mode 100644 index 0000000000..487de42bc1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/ArmorKit.java @@ -0,0 +1,124 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.armor.ClassArmor; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.HeroSprite; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.windows.WndBag; + +public class ArmorKit extends Item { + + private static final String TXT_SELECT_ARMOR = "Select an armor to upgrade"; + private static final String TXT_UPGRADED = "you applied the armor kit to upgrade your %s"; + + private static final float TIME_TO_UPGRADE = 2; + + private static final String AC_APPLY = "APPLY"; + + { + name = "armor kit"; + image = ItemSpriteSheet.KIT; + + unique = true; + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( AC_APPLY ); + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + if (action == AC_APPLY) { + + curUser = hero; + GameScene.selectItem( itemSelector, WndBag.Mode.ARMOR, TXT_SELECT_ARMOR ); + + } else { + + super.execute( hero, action ); + + } + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + private void upgrade( Armor armor ) { + + detach( curUser.belongings.backpack ); + + curUser.sprite.centerEmitter().start( Speck.factory( Speck.KIT ), 0.05f, 10 ); + curUser.spend( TIME_TO_UPGRADE ); + curUser.busy(); + + GLog.w( TXT_UPGRADED, armor.name() ); + + ClassArmor classArmor = ClassArmor.upgrade( curUser, armor ); + if (curUser.belongings.armor == armor) { + + curUser.belongings.armor = classArmor; + ((HeroSprite)curUser.sprite).updateArmor(); + + } else { + + armor.detach( curUser.belongings.backpack ); + classArmor.collect( curUser.belongings.backpack ); + + } + + curUser.sprite.operate( curUser.pos ); + Sample.INSTANCE.play( Assets.SND_EVOKE ); + } + + @Override + public String info() { + return + "Using this kit of small tools and materials anybody can transform any armor into an \"epic armor\", " + + "which will keep all properties of the original armor, but will also provide its wearer a special ability " + + "depending on his class. No skills in tailoring, leatherworking or blacksmithing are required."; + } + + private final WndBag.Listener itemSelector = new WndBag.Listener() { + @Override + public void onSelect( Item item ) { + if (item != null) { + ArmorKit.this.upgrade( (Armor)item ); + } + } + }; +} diff --git a/src/com/watabou/pixeldungeon/items/DewVial.java b/src/com/watabou/pixeldungeon/items/DewVial.java new file mode 100644 index 0000000000..57763345c8 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/DewVial.java @@ -0,0 +1,187 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.particles.ShaftParticle; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundle; + +public class DewVial extends Item { + + private static final int MAX_VOLUME = 10; + + private static final String AC_DRINK = "DRINK"; + + private static final float TIME_TO_DRINK = 1f; + + private static final String TXT_VALUE = "%+dHP"; + private static final String TXT_STATUS = "%d/%d"; + + private static final String TXT_AUTO_DRINK = "The dew vial was emptied to heal your wounds."; + private static final String TXT_COLLECTED = "You collected a dewdrop into your dew vial."; + private static final String TXT_FULL = "Your dew vial is full!"; + private static final String TXT_EMPTY = "Your dew vial is empty!"; + + { + name = "dew vial"; + image = ItemSpriteSheet.VIAL; + + defaultAction = AC_DRINK; + + unique = true; + } + + private int volume = 0; + + private static final String VOLUME = "volume"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( VOLUME, volume ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + volume = bundle.getInt( VOLUME ); + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + if (volume > 0) { + actions.add( AC_DRINK ); + } + return actions; + } + + private static final double NUM = 20; + private static final double POW = Math.log10( NUM ); + + @Override + public void execute( final Hero hero, String action ) { + if (action.equals( AC_DRINK )) { + + if (volume > 0) { + + int value = (int)Math.ceil( Math.pow( volume, POW ) / NUM * hero.HT ); + int effect = Math.min( hero.HT - hero.HP, value ); + if (effect > 0) { + hero.HP += effect; + hero.sprite.emitter().burst( Speck.factory( Speck.HEALING ), volume > 5 ? 2 : 1 ); + hero.sprite.showStatus( CharSprite.POSITIVE, TXT_VALUE, effect ); + } + + volume = 0; + + hero.spend( TIME_TO_DRINK ); + hero.busy(); + + Sample.INSTANCE.play( Assets.SND_DRINK ); + hero.sprite.operate( hero.pos ); + + updateQuickslot(); + + } else { + GLog.w( TXT_EMPTY ); + } + + } else { + + super.execute( hero, action ); + + } + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + public boolean isFull() { + return volume >= MAX_VOLUME; + } + + public void collectDew( Dewdrop dew ) { + + GLog.i( TXT_COLLECTED ); + volume += dew.quantity; + if (volume >= MAX_VOLUME) { + volume = MAX_VOLUME; + GLog.p( TXT_FULL ); + } + + updateQuickslot(); + } + + public void fill() { + volume = MAX_VOLUME; + updateQuickslot(); + } + + public static void autoDrink( Hero hero ) { + DewVial vial = hero.belongings.getItem( DewVial.class ); + if (vial != null && vial.isFull()) { + vial.execute( hero ); + hero.sprite.emitter().start( ShaftParticle.FACTORY, 0.2f, 3 ); + + GLog.w( TXT_AUTO_DRINK ); + } + } + + private static final Glowing WHITE = new Glowing( 0xFFFFCC ); + + @Override + public Glowing glowing() { + return isFull() ? WHITE : null; + } + + @Override + public String status() { + return Utils.format( TXT_STATUS, volume, MAX_VOLUME ); + } + + @Override + public String info() { + return + "You can store excess dew in this tiny vessel for drinking it later. " + + "If the vial is full, in a moment of deadly peril the dew will be " + + "consumed automatically."; + } + + @Override + public String toString() { + return super.toString() + " (" + status() + ")" ; + } +} diff --git a/src/com/watabou/pixeldungeon/items/Dewdrop.java b/src/com/watabou/pixeldungeon/items/Dewdrop.java new file mode 100644 index 0000000000..6bcc6f4e45 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/Dewdrop.java @@ -0,0 +1,75 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Dewdrop extends Item { + + private static final String TXT_VALUE = "%+dHP"; + + { + name = "dewdrop"; + image = ItemSpriteSheet.DEWDROP; + + stackable = true; + } + + @Override + public boolean doPickUp( Hero hero ) { + + DewVial vial = hero.belongings.getItem( DewVial.class ); + + if (hero.HP < hero.HT || vial == null || vial.isFull()) { + + int value = 1 + (Dungeon.depth - 1) / 5; + if (hero.heroClass == HeroClass.HUNTRESS) { + value++; + } + + int effect = Math.min( hero.HT - hero.HP, value * quantity ); + if (effect > 0) { + hero.HP += effect; + hero.sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); + hero.sprite.showStatus( CharSprite.POSITIVE, TXT_VALUE, effect ); + } + + } else if (vial != null) { + + vial.collectDew( this ); + + } + + Sample.INSTANCE.play( Assets.SND_DEWDROP ); + hero.spendAndNext( TIME_TO_PICK_UP ); + + return true; + } + + @Override + public String info() { + return "A crystal clear dewdrop."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/EquipableItem.java b/src/com/watabou/pixeldungeon/items/EquipableItem.java new file mode 100644 index 0000000000..baa71ed1d5 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/EquipableItem.java @@ -0,0 +1,68 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.particles.ShadowParticle; + +public abstract class EquipableItem extends Item { + + public static final String AC_EQUIP = "EQUIP"; + public static final String AC_UNEQUIP = "UNEQUIP"; + + @Override + public void execute( Hero hero, String action ) { + if (action.equals( AC_EQUIP )) { + doEquip( hero ); + } else if (action.equals( AC_UNEQUIP )) { + doUnequip( hero, true ); + } else { + super.execute( hero, action ); + } + } + + @Override + public void doDrop( Hero hero ) { + if (!isEquipped( hero ) || doUnequip( hero, false )) { + super.doDrop( hero ); + } + } + + @Override + public void cast( final Hero user, int dst ) { + + if (isEquipped( user )) { + + if (quantity == 1 && !this.doUnequip( user, false )) { + return; + } + } + + super.cast( user, dst ); + } + + protected static void equipCursed( Hero hero ) { + hero.sprite.emitter().burst( ShadowParticle.CURSE, 6 ); + Sample.INSTANCE.play( Assets.SND_CURSED ); + } + + public abstract boolean doEquip( Hero hero ); + public abstract boolean doUnequip( Hero hero, boolean collect ); +} diff --git a/src/com/watabou/pixeldungeon/items/Generator.java b/src/com/watabou/pixeldungeon/items/Generator.java new file mode 100644 index 0000000000..31df0d6712 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/Generator.java @@ -0,0 +1,263 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.util.HashMap; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.npcs.Wandmaker.Rotberry; +import com.watabou.pixeldungeon.items.armor.*; +import com.watabou.pixeldungeon.items.bags.Bag; +import com.watabou.pixeldungeon.items.food.Food; +import com.watabou.pixeldungeon.items.food.MysteryMeat; +import com.watabou.pixeldungeon.items.food.Pasty; +import com.watabou.pixeldungeon.items.potions.*; +import com.watabou.pixeldungeon.items.rings.*; +import com.watabou.pixeldungeon.items.scrolls.*; +import com.watabou.pixeldungeon.items.wands.*; +import com.watabou.pixeldungeon.items.weapon.*; +import com.watabou.pixeldungeon.items.weapon.melee.*; +import com.watabou.pixeldungeon.items.weapon.missiles.*; +import com.watabou.pixeldungeon.plants.*; +import com.watabou.utils.Random; + +public class Generator { + + public static enum Category { + WEAPON ( 15, Weapon.class ), + ARMOR ( 10, Armor.class ), + POTION ( 50, Potion.class ), + SCROLL ( 40, Scroll.class ), + WAND ( 4, Wand.class ), + RING ( 2, Ring.class ), + SEED ( 5, Plant.Seed.class ), + FOOD ( 0, Food.class ), + GOLD ( 50, Gold.class ); + + public Class[] classes; + public float[] probs; + + public float prob; + public Class superClass; + + private Category( float prob, Class superClass ) { + this.prob = prob; + this.superClass = superClass; + } + + public static int order( Item item ) { + for (int i=0; i < values().length; i++) { + if (values()[i].superClass.isInstance( item )) { + return i; + } + } + + return item instanceof Bag ? Integer.MAX_VALUE : Integer.MAX_VALUE - 1; + } + }; + + private static HashMap categoryProbs = new HashMap(); + + static { + + Category.GOLD.classes = new Class[]{ + Gold.class }; + Category.GOLD.probs = new float[]{ 1 }; + + Category.SCROLL.classes = new Class[]{ + ScrollOfIdentify.class, + ScrollOfTeleportation.class, + ScrollOfRemoveCurse.class, + ScrollOfUpgrade.class, + ScrollOfRecharging.class, + ScrollOfMagicMapping.class, + ScrollOfChallenge.class, + ScrollOfTerror.class, + ScrollOfLullaby.class, + ScrollOfWeaponUpgrade.class, + ScrollOfPsionicBlast.class, + ScrollOfMirrorImage.class }; + Category.SCROLL.probs = new float[]{ 30, 10, 15, 0, 10, 15, 12, 8, 8, 0, 4, 6 }; + + Category.POTION.classes = new Class[]{ + PotionOfHealing.class, + PotionOfExperience.class, + PotionOfToxicGas.class, + PotionOfParalyticGas.class, + PotionOfLiquidFlame.class, + PotionOfLevitation.class, + PotionOfStrength.class, + PotionOfMindVision.class, + PotionOfPurity.class, + PotionOfInvisibility.class, + PotionOfMight.class, + PotionOfFrost.class }; + Category.POTION.probs = new float[]{ 45, 4, 15, 10, 15, 10, 0, 20, 12, 10, 0, 10 }; + + Category.WAND.classes = new Class[]{ + WandOfTeleportation.class, + WandOfSlowness.class, + WandOfFirebolt.class, + WandOfRegrowth.class, + WandOfPoison.class, + WandOfBlink.class, + WandOfLightning.class, + WandOfAmok.class, + WandOfTelekinesis.class, + WandOfFlock.class, + WandOfMagicMissile.class, + WandOfDisintegration.class, + WandOfAvalanche.class }; + Category.WAND.probs = new float[]{ 10, 10, 15, 6, 10, 11, 15, 10, 6, 10, 0, 5, 5 }; + + Category.WEAPON.classes = new Class[]{ + Dagger.class, + Knuckles.class, + Quarterstaff.class, + Spear.class, + Mace.class, + Sword.class, + Longsword.class, + BattleAxe.class, + WarHammer.class, + Glaive.class, + ShortSword.class, + Dart.class, + Javelin.class, + IncendiaryDart.class, + CurareDart.class, + Shuriken.class, + Boomerang.class, + Tamahawk.class }; + Category.WEAPON.probs = new float[]{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1 }; + + Category.ARMOR.classes = new Class[]{ + ClothArmor.class, + LeatherArmor.class, + MailArmor.class, + ScaleArmor.class, + PlateArmor.class }; + Category.ARMOR.probs = new float[]{ 1, 1, 1, 1, 1 }; + + Category.FOOD.classes = new Class[]{ + Food.class, + Pasty.class, + MysteryMeat.class }; + Category.FOOD.probs = new float[]{ 4, 1, 0 }; + + Category.RING.classes = new Class[]{ + RingOfMending.class, + RingOfDetection.class, + RingOfShadows.class, + RingOfPower.class, + RingOfHerbalism.class, + RingOfAccuracy.class, + RingOfEvasion.class, + RingOfSatiety.class, + RingOfHaste.class, + RingOfElements.class, + RingOfHaggler.class, + RingOfThorns.class }; + Category.RING.probs = new float[]{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }; + + Category.SEED.classes = new Class[]{ + Firebloom.Seed.class, + Icecap.Seed.class, + Sorrowmoss.Seed.class, + Blindweed.Seed.class, + Sungrass.Seed.class, + Earthroot.Seed.class, + Fadeleaf.Seed.class, + Rotberry.Seed.class }; + Category.SEED.probs = new float[]{ 1, 1, 1, 1, 1, 1, 1, 0 }; + } + + public static void reset() { + for (Category cat : Category.values()) { + categoryProbs.put( cat, cat.prob ); + } + } + + public static Item random() { + return random( Random.chances( categoryProbs ) ); + } + + public static Item random( Category cat ) { + try { + + categoryProbs.put( cat, categoryProbs.get( cat ) / 2 ); + + switch (cat) { + case ARMOR: + return randomArmor(); + case WEAPON: + return randomWeapon(); + default: + return ((Item)cat.classes[Random.chances( cat.probs )].newInstance()).random(); + } + + } catch (Exception e) { + + return null; + + } + } + + public static Item random( Class cl ) { + try { + + return ((Item)cl.newInstance()).random(); + + } catch (Exception e) { + + return null; + + } + } + + public static Armor randomArmor() throws Exception { + + int curStr = Hero.STARTING_STR + Dungeon.potionOfStrength; + + Category cat = Category.ARMOR; + + Armor a1 = (Armor)cat.classes[Random.chances( cat.probs )].newInstance(); + Armor a2 = (Armor)cat.classes[Random.chances( cat.probs )].newInstance(); + + a1.random(); + a2.random(); + + return Math.abs( curStr - a1.STR ) < Math.abs( curStr - a2.STR ) ? a1 : a2; + } + + public static Weapon randomWeapon() throws Exception { + + int curStr = Hero.STARTING_STR + Dungeon.potionOfStrength; + + Category cat = Category.WEAPON; + + Weapon w1 = (Weapon)cat.classes[Random.chances( cat.probs )].newInstance(); + Weapon w2 = (Weapon)cat.classes[Random.chances( cat.probs )].newInstance(); + + w1.random(); + w2.random(); + + return Math.abs( curStr - w1.STR ) < Math.abs( curStr - w2.STR ) ? w1 : w2; + } +} diff --git a/src/com/watabou/pixeldungeon/items/Gold.java b/src/com/watabou/pixeldungeon/items/Gold.java new file mode 100644 index 0000000000..26ea0f86bc --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/Gold.java @@ -0,0 +1,118 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Gold extends Item { + + private static final String TXT_COLLECT = "Collect gold coins to spend them later in a shop."; + private static final String TXT_INFO = "A pile of %d gold coins. " + TXT_COLLECT; + private static final String TXT_INFO_1 = "One gold coin. " + TXT_COLLECT; + private static final String TXT_VALUE = "%+d"; + + { + name = "gold"; + image = ItemSpriteSheet.GOLD; + stackable = true; + } + + public Gold() { + this( 1 ); + } + + public Gold( int value ) { + this.quantity = value; + } + + @Override + public ArrayList actions( Hero hero ) { + return new ArrayList(); + } + + @Override + public boolean doPickUp( Hero hero ) { + + Dungeon.gold += quantity; + Statistics.goldCollected += quantity; + Badges.validateGoldCollected(); + + GameScene.pickUp( this ); + hero.sprite.showStatus( CharSprite.NEUTRAL, TXT_VALUE, quantity ); + hero.spendAndNext( TIME_TO_PICK_UP ); + + Sample.INSTANCE.play( Assets.SND_GOLD, 1, 1, Random.Float( 0.9f, 1.1f ) ); + + return true; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public String info() { + switch (quantity) { + case 0: + return TXT_COLLECT; + case 1: + return TXT_INFO_1; + default: + return Utils.format( TXT_INFO, quantity ); + } + } + + @Override + public Item random() { + quantity = Random.Int( 20 + Dungeon.depth * 10, 40 + Dungeon.depth * 20 ); + return this; + } + + private static final String VALUE = "value"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( VALUE, quantity ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle(bundle); + quantity = bundle.getInt( VALUE ); + } +} diff --git a/src/com/watabou/pixeldungeon/items/Heap.java b/src/com/watabou/pixeldungeon/items/Heap.java new file mode 100644 index 0000000000..59325bcb07 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/Heap.java @@ -0,0 +1,337 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.util.Collection; +import java.util.LinkedList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.Wraith; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.Splash; +import com.watabou.pixeldungeon.effects.particles.ElmoParticle; +import com.watabou.pixeldungeon.effects.particles.ShadowParticle; +import com.watabou.pixeldungeon.items.food.ChargrilledMeat; +import com.watabou.pixeldungeon.items.food.FrozenCarpaccio; +import com.watabou.pixeldungeon.items.food.MysteryMeat; +import com.watabou.pixeldungeon.items.scrolls.Scroll; +import com.watabou.pixeldungeon.plants.Plant.Seed; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Heap implements Bundlable { + + private static final int SEEDS_TO_POTION = 3; + + public enum Type { + HEAP, + FOR_SALE, + CHEST, + LOCKED_CHEST, + CRYSTAL_CHEST, + TOMB, + SKELETON + } + public Type type = Type.HEAP; + + public int pos = 0; + + public ItemSprite sprite; + + protected LinkedList items = new LinkedList(); + + public int image() { + switch (type) { + case HEAP: + case FOR_SALE: + return size() > 0 ? items.peek().image() : 0; + case CHEST: + return ItemSpriteSheet.CHEST; + case LOCKED_CHEST: + return ItemSpriteSheet.LOCKED_CHEST; + case CRYSTAL_CHEST: + return ItemSpriteSheet.CRYSTAL_CHEST; + case TOMB: + return ItemSpriteSheet.TOMB; + case SKELETON: + return ItemSpriteSheet.BONES; + default: + return 0; + } + } + + public ItemSprite.Glowing glowing() { + return (type == Type.HEAP || type == Type.FOR_SALE) && items.size() > 0 ? items.peek().glowing() : null; + } + + public void open( Hero hero ) { + switch (type) { + case TOMB: + Wraith.spawnAround( hero.pos ); + break; + case SKELETON: + CellEmitter.center( pos ).start( Speck.factory( Speck.RATTLE ), 0.1f, 3 ); + for (Item item : items) { + if (item.cursed) { + if (Wraith.spawnAt( pos ) == null) { + hero.sprite.emitter().burst( ShadowParticle.CURSE, 6 ); + hero.damage( hero.HP / 2, this ); + } + Sample.INSTANCE.play( Assets.SND_CURSED ); + break; + } + } + break; + default: + } + + type = Type.HEAP; + sprite.link(); + sprite.drop(); + } + + public int size() { + return items.size(); + } + + public Item pickUp() { + + Item item = items.removeFirst(); + if (items.isEmpty()) { + destroy(); + } else if (sprite != null) { + sprite.view( image(), glowing() ); + } + + return item; + } + + public Item peek() { + return items.peek(); + } + + public void drop( Item item ) { + + if (item.stackable) { + + for (Item i : items) { + if (i.isSimilar( item )) { + i.quantity += item.quantity; + item = i; + break; + } + } + items.remove( item ); + + } + + if (item instanceof Dewdrop) { + items.add( item ); + } else { + items.addFirst( item ); + } + + if (sprite != null) { + sprite.view( image(), glowing() ); + } + } + + public void replace( Item a, Item b ) { + int index = items.indexOf( a ); + if (index != -1) { + items.remove( index ); + items.add( index, b ); + } + } + + public void burn() { + + if (type != Type.HEAP) { + return; + } + + boolean burnt = false; + boolean evaporated = false; + + for (Item item : items.toArray( new Item[0] )) { + if (item instanceof Scroll) { + items.remove( item ); + burnt = true; + } else if (item instanceof Dewdrop) { + items.remove( item ); + evaporated = true; + } else if (item instanceof MysteryMeat) { + replace( item, ChargrilledMeat.cook( (MysteryMeat)item ) ); + burnt = true; + } + } + + if (burnt || evaporated) { + + if (Dungeon.visible[pos]) { + if (burnt) { + burnFX( pos ); + } else { + evaporateFX( pos ); + } + } + + if (isEmpty()) { + destroy(); + } else if (sprite != null) { + sprite.view( image(), glowing() ); + } + + } + } + + public void freeze() { + + if (type != Type.HEAP) { + return; + } + + boolean frozen = false; + for (Item item : items.toArray( new Item[0] )) { + if (item instanceof MysteryMeat) { + replace( item, FrozenCarpaccio.cook( (MysteryMeat)item ) ); + frozen = true; + } + } + + if (frozen) { + if (isEmpty()) { + destroy(); + } else if (sprite != null) { + sprite.view( image(), glowing() ); + } + } + } + + public Item transmute() { + + CellEmitter.get( pos ).burst( Speck.factory( Speck.BUBBLE ), 3 ); + Splash.at( pos, 0xFFFFFF, 3 ); + + float chances[] = new float[items.size()]; + int count = 0; + + int index = 0; + for (Item item : items) { + if (item instanceof Seed) { + count += item.quantity; + chances[index++] = item.quantity; + } else { + count = 0; + break; + } + } + + if (count >= SEEDS_TO_POTION) { + + CellEmitter.get( pos ).burst( Speck.factory( Speck.WOOL ), 6 ); + Sample.INSTANCE.play( Assets.SND_PUFF ); + + if (Random.Int( count ) == 0) { + + CellEmitter.center( pos ).burst( Speck.factory( Speck.EVOKE ), 3 ); + + destroy(); + + Statistics.potionsCooked++; + Badges.validatePotionsCooked(); + + return Generator.random( Generator.Category.POTION ); + + } else { + + Seed proto = (Seed)items.get( Random.chances( chances ) ); + Class itemClass = proto.alchemyClass; + + destroy(); + + Statistics.potionsCooked++; + Badges.validatePotionsCooked(); + + if (itemClass == null) { + return Generator.random( Generator.Category.POTION ); + } else { + try { + return itemClass.newInstance(); + } catch (Exception e) { + return null; + } + } + } + + } else { + return null; + } + } + + public static void burnFX( int pos ) { + CellEmitter.get( pos ).burst( ElmoParticle.FACTORY, 6 ); + Sample.INSTANCE.play( Assets.SND_BURNING ); + } + + public static void evaporateFX( int pos ) { + CellEmitter.get( pos ).burst( Speck.factory( Speck.STEAM ), 5 ); + } + + public boolean isEmpty() { + return items == null || items.size() == 0; + } + + public void destroy() { + Dungeon.level.heaps.remove( this.pos ); + if (sprite != null) { + sprite.kill(); + } + items.clear(); + items = null; + } + + private static final String POS = "pos"; + private static final String TYPE = "type"; + private static final String ITEMS = "items"; + + @SuppressWarnings("unchecked") + @Override + public void restoreFromBundle( Bundle bundle ) { + pos = bundle.getInt( POS ); + type = Type.valueOf( bundle.getString( TYPE ) ); + items = new LinkedList( (Collection) bundle.getCollection( ITEMS ) ); + } + + @Override + public void storeInBundle( Bundle bundle ) { + bundle.put( POS, pos ); + bundle.put( TYPE, type.toString() ); + bundle.put( ITEMS, items ); + } + +} diff --git a/src/com/watabou/pixeldungeon/items/Item.java b/src/com/watabou/pixeldungeon/items/Item.java new file mode 100644 index 0000000000..47d6c9328b --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/Item.java @@ -0,0 +1,463 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.SnipersMark; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.bags.Bag; +import com.watabou.pixeldungeon.items.weapon.missiles.MissileWeapon; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.scenes.CellSelector; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.MissileSprite; +import com.watabou.pixeldungeon.ui.QuickSlot; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; +import com.watabou.utils.Callback; + +public class Item implements Bundlable { + + private static final String TXT_PACK_FULL = "Your pack is too full for the %s"; + + private static final String TXT_TO_STRING = "%s"; + private static final String TXT_TO_STRING_X = "%s x%d"; + private static final String TXT_TO_STRING_LVL = "%s%+d"; + private static final String TXT_TO_STRING_LVL_X = "%s%+d x%d"; + + protected static final float TIME_TO_THROW = 1.0f; + protected static final float TIME_TO_PICK_UP = 1.0f; + protected static final float TIME_TO_DROP = 0.5f; + + public static final String AC_DROP = "DROP"; + public static final String AC_THROW = "THROW"; + + public String defaultAction; + + protected String name = "smth"; + protected int image = 0; + + public boolean stackable = false; + protected int quantity = 1; + + public int level = 0; + public boolean levelKnown = false; + + public boolean cursed; + public boolean cursedKnown; + + // Unique items persist through revival + public boolean unique = false; + + private static Comparator itemComparator = new Comparator() { + @Override + public int compare( Item lhs, Item rhs ) { + return Generator.Category.order( lhs ) - Generator.Category.order( rhs ); + } + }; + + public ArrayList actions( Hero hero ) { + ArrayList actions = new ArrayList(); + actions.add( AC_DROP ); + actions.add( AC_THROW ); + return actions; + } + + public boolean doPickUp( Hero hero ) { + if (collect( hero.belongings.backpack )) { + + GameScene.pickUp( this ); + Sample.INSTANCE.play( Assets.SND_ITEM ); + hero.spendAndNext( TIME_TO_PICK_UP ); + return true; + + } else { + return false; + } + } + + public void doDrop( Hero hero ) { + hero.spendAndNext( TIME_TO_DROP ); + Dungeon.level.drop( detachAll( hero.belongings.backpack ), hero.pos ).sprite.drop( hero.pos ); + } + + public void doThrow( Hero hero ) { + GameScene.selectCell( thrower ); + } + + public void execute( Hero hero, String action ) { + + curUser = hero; + curItem = this; + + if (action.equals( AC_DROP )) { + + doDrop( hero ); + + } else if (action.equals( AC_THROW )) { + + doThrow( hero ); + + } + } + + public void execute( Hero hero ) { + execute( hero, defaultAction ); + } + + protected void onThrow( int cell ) { + Heap heap = Dungeon.level.drop( this, cell ); + if (!heap.isEmpty()) { + heap.sprite.drop( cell ); + } + } + + public boolean collect( Bag container ) { + + ArrayList items = container.items; + + if (items.contains( this )) { + return true; + } + + for (Item item:items) { + if (item instanceof Bag && ((Bag)item).grab( this )) { + return collect( (Bag)item ); + } + } + + if (stackable) { + for (Item item:items) { + if (isSimilar( item )) { + item.quantity += quantity; + item.updateQuickslot(); + return true; + } + } + } + + if (items.size() < container.size) { + + if (Dungeon.hero != null && Dungeon.hero.isAlive()) { + Badges.validateItemLevelAquired( this ); + } + + items.add( this ); + QuickSlot.refresh(); + Collections.sort( items, itemComparator ); + return true; + + } else { + + GLog.n( TXT_PACK_FULL, name() ); + return false; + + } + } + + public boolean collect() { + return collect( Dungeon.hero.belongings.backpack ); + } + + public Item detach( Bag container ) { + + if (quantity <= 0) { + + return null; + + } else + if (quantity == 1) { + + return detachAll( container ); + + } else { + + quantity--; + updateQuickslot(); + + try { + return getClass().newInstance(); + } catch (Exception e) { + return null; + } + } + } + + public Item detachAll( Bag container ) { + for (Item item : container.items) { + if (item == this) { + container.items.remove( this ); + QuickSlot.refresh(); + return this; + } else if (item instanceof Bag) { + Bag bag = (Bag)item; + if (bag.contains( this )) { + detachAll( bag ); + return this; + } + } + } + + return this; + } + + public boolean isSimilar( Item item ) { + return getClass() == item.getClass(); + } + + public Item upgrade() { + + cursed = false; + cursedKnown = true; + this.level++; + + return this; + } + + public Item upgrade( int n ) { + for (int i=0; i < n; i++) { + upgrade(); + } + + return this; + } + + public Item degrade() { + + this.level--; + + return this; + } + + public Item degrade( int n ) { + for (int i=0; i < n; i++) { + degrade(); + } + + return this; + } + + public int visiblyUpgraded() { + return levelKnown ? level : 0; + } + + public boolean visiblyCursed() { + return cursed && cursedKnown; + } + + public boolean isUpgradable() { + return true; + } + + public boolean isIdentified() { + return levelKnown && cursedKnown; + } + + public boolean isEquipped( Hero hero ) { + return false; + } + + public Item identify() { + + levelKnown = true; + cursedKnown = true; + + return this; + } + + public static void evoke( Hero hero ) { + hero.sprite.emitter().burst( Speck.factory( Speck.EVOKE ), 5 ); + } + + @Override + public String toString() { + + if (levelKnown && level != 0) { + if (quantity > 1) { + return Utils.format( TXT_TO_STRING_LVL_X, name(), level, quantity ); + } else { + return Utils.format( TXT_TO_STRING_LVL, name(), level ); + } + } else { + if (quantity > 1) { + return Utils.format( TXT_TO_STRING_X, name(), quantity ); + } else { + return Utils.format( TXT_TO_STRING, name() ); + } + } + } + + public String name() { + return name; + } + + public final String trueName() { + return name; + } + + public int image() { + return image; + } + + public ItemSprite.Glowing glowing() { + return null; + } + + public String info() { + return desc(); + } + + public String desc() { + return ""; + } + + public int quantity() { + return quantity; + } + + public void quantity( int value ) { + quantity = value; + } + + public int price() { + return 0; + } + + public static Item virtual( Class cl ) { + try { + + Item item = (Item)cl.newInstance(); + item.quantity = 0; + return item; + + } catch (Exception e) { + return null; + } + } + + public Item random() { + return this; + } + + public String status() { + return quantity != 1 ? Integer.toString( quantity ) : null; + } + + public void updateQuickslot() { + if ((stackable && Dungeon.quickslot == getClass()) || Dungeon.quickslot == this) { + QuickSlot.refresh(); + } + } + + private static final String QUANTITY = "quantity"; + private static final String LEVEL = "level"; + private static final String LEVEL_KNOWN = "levelKnown"; + private static final String CURSED = "cursed"; + private static final String CURSED_KNOWN = "cursedKnown"; + private static final String QUICKSLOT = "quickslot"; + + @Override + public void storeInBundle( Bundle bundle ) { + bundle.put( QUANTITY, quantity ); + bundle.put( LEVEL, level ); + bundle.put( LEVEL_KNOWN, levelKnown ); + bundle.put( CURSED, cursed ); + bundle.put( CURSED_KNOWN, cursedKnown ); + if (this == Dungeon.quickslot) { + bundle.put( QUICKSLOT, true ); + } + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + quantity = bundle.getInt( QUANTITY ); + levelKnown = bundle.getBoolean( LEVEL_KNOWN ); + cursedKnown = bundle.getBoolean( CURSED_KNOWN ); + + int level = bundle.getInt( LEVEL ); + if (level > 0) { + upgrade( level ); + } else if (level < 0) { + degrade( -level ); + } + + cursed = bundle.getBoolean( CURSED ); + + if (bundle.getBoolean( QUICKSLOT )) { + Dungeon.quickslot = this; + } + } + + public void cast( final Hero user, int dst ) { + + final int cell = Ballistica.cast( user.pos, dst, false, true ); + user.sprite.zap( cell ); + user.busy(); + + Char enemy = Actor.findChar( cell ); + QuickSlot.target( this, enemy ); + + float delay = TIME_TO_THROW; + if (this instanceof MissileWeapon) { + + // Refactoring needed! + delay *= ((MissileWeapon)this).speedFactor( user ); + if (enemy != null && enemy.buff( SnipersMark.class ) != null) { + delay *= 0.5f; + } + } + final float finalDelay = delay; + + ((MissileSprite)user.sprite.parent.recycle( MissileSprite.class )). + reset( user.pos, cell, this, new Callback() { + @Override + public void call() { + Item.this.detach( user.belongings.backpack ).onThrow( cell ); + user.spendAndNext( finalDelay ); + } + } ); + } + + protected static Hero curUser = null; + protected static Item curItem = null; + protected static CellSelector.Listener thrower = new CellSelector.Listener() { + @Override + public void onSelect( Integer target ) { + if (target != null) { + curItem.cast( curUser, target ); + } + } + @Override + public String prompt() { + return "Choose direction of throw"; + } + }; +} diff --git a/src/com/watabou/pixeldungeon/items/ItemStatusHandler.java b/src/com/watabou/pixeldungeon/items/ItemStatusHandler.java new file mode 100644 index 0000000000..ca3e41cd46 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/ItemStatusHandler.java @@ -0,0 +1,162 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; + +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class ItemStatusHandler { + + private Class[] items; + + private HashMap, Integer> images; + private HashMap, String> labels; + private HashSet> known; + + public ItemStatusHandler( Class[] items, String[] allLabels, Integer[] allImages ) { + + this.items = items; + + this.images = new HashMap, Integer>(); + this.labels = new HashMap, String>(); + known = new HashSet>(); + + ArrayList labelsLeft = new ArrayList( Arrays.asList( allLabels ) ); + ArrayList imagesLeft = new ArrayList( Arrays.asList( allImages ) ); + + for (int i=0; i < items.length; i++) { + + Class item = (Class)(items[i]); + + int index = Random.Int( labelsLeft.size() ); + + labels.put( item, labelsLeft.get( index ) ); + labelsLeft.remove( index ); + + images.put( item, imagesLeft.get( index ) ); + imagesLeft.remove( index ); + } + } + + public ItemStatusHandler( Class[] items, String[] labels, Integer[] images, Bundle bundle ) { + + this.items = items; + + this.images = new HashMap, Integer>(); + this.labels = new HashMap, String>(); + known = new HashSet>(); + + restore( bundle, labels, images ); + } + + private static final String PFX_IMAGE = "_image"; + private static final String PFX_LABEL = "_label"; + private static final String PFX_KNOWN = "_known"; + + public void save( Bundle bundle ) { + for (int i=0; i < items.length; i++) { + String itemName = items[i].toString(); + bundle.put( itemName + PFX_IMAGE, images.get( items[i] ) ); + bundle.put( itemName + PFX_LABEL, labels.get( items[i] ) ); + bundle.put( itemName + PFX_KNOWN, known.contains( items[i] ) ); + } + } + + private void restore( Bundle bundle, String[] allLabels, Integer[] allImages ) { + + ArrayList labelsLeft = new ArrayList( Arrays.asList( allLabels ) ); + ArrayList imagesLeft = new ArrayList( Arrays.asList( allImages ) ); + + for (int i=0; i < items.length; i++) { + + Class item = (Class)(items[i]); + String itemName = item.toString(); + + if (bundle.contains( itemName + PFX_LABEL )) { + + String label = bundle.getString( itemName + PFX_LABEL ); + labels.put( item, label ); + labelsLeft.remove( label ); + + Integer image = bundle.getInt( itemName + PFX_IMAGE ); + images.put( item, image ); + imagesLeft.remove( image ); + + if (bundle.getBoolean( itemName + PFX_KNOWN )) { + known.add( item ); + } + + } else { + + int index = Random.Int( labelsLeft.size() ); + + labels.put( item, labelsLeft.get( index ) ); + labelsLeft.remove( index ); + + images.put( item, imagesLeft.get( index ) ); + imagesLeft.remove( index ); + + } + } + } + + public int image( T item ) { + return images.get( item.getClass() ); + } + + public String label( T item ) { + return labels.get( item.getClass() ); + } + + public boolean isKnown( T item ) { + return known.contains( item.getClass() ); + } + + @SuppressWarnings("unchecked") + public void know( T item ) { + known.add( (Class)item.getClass() ); + + if (known.size() == items.length - 1) { + for (int i=0; i < items.length; i++) { + if (!known.contains( items[i] )) { + known.add( items[i] ); + break; + } + } + } + } + + public HashSet> known() { + return known; + } + + public HashSet> unknown() { + HashSet> result = new HashSet>(); + for (Class i : items) { + if (!known.contains( i )) { + result.add( i ); + } + } + return result; + } +} diff --git a/src/com/watabou/pixeldungeon/items/KindOfWeapon.java b/src/com/watabou/pixeldungeon/items/KindOfWeapon.java new file mode 100644 index 0000000000..ba651e1890 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/KindOfWeapon.java @@ -0,0 +1,115 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.util.ArrayList; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.ui.QuickSlot; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Random; + +public class KindOfWeapon extends EquipableItem { + + private static final String TXT_EQUIP_CURSED = "you wince as your grip involuntarily tightens around your %s"; + private static final String TXT_UNEQUIP_CURSED = "you can't remove cursed %s!"; + + protected static final float TIME_TO_EQUIP = 1f; + + public int MIN = 0; + public int MAX = 1; + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( isEquipped( hero ) ? AC_UNEQUIP : AC_EQUIP ); + return actions; + } + + @Override + public boolean isEquipped( Hero hero ) { + return hero.belongings.weapon == this; + } + + @Override + public boolean doEquip( Hero hero ) { + + detachAll( hero.belongings.backpack ); + + if (hero.belongings.weapon == null || hero.belongings.weapon.doUnequip( hero, true )) { + + hero.belongings.weapon = this; + activate( hero ); + + QuickSlot.refresh(); + + cursedKnown = true; + if (cursed) { + equipCursed( hero ); + GLog.n( TXT_EQUIP_CURSED, name() ); + } + + hero.spendAndNext( TIME_TO_EQUIP ); + return true; + + } else { + + collect( hero.belongings.backpack ); + return false; + } + } + + @Override + public boolean doUnequip( Hero hero, boolean collect ) { + + if (cursed) { + GLog.w( TXT_UNEQUIP_CURSED, name() ); + return false; + } + + hero.belongings.weapon = null; + hero.spendAndNext( TIME_TO_EQUIP ); + + if (collect && !collect( hero.belongings.backpack )) { + Dungeon.level.drop( this, hero.pos ); + } + + return true; + } + + public void activate( Hero hero ) { + } + + public int damageRoll( Hero owner ) { + return Random.NormalIntRange( MIN, MAX ); + } + + public float acuracyFactor( Hero hero ) { + return 1f; + } + + public float speedFactor( Hero hero ) { + return 1f; + } + + public void proc( Char attacker, Char defender, int damage ) { + } + +} diff --git a/src/com/watabou/pixeldungeon/items/LloydsBeacon.java b/src/com/watabou/pixeldungeon/items/LloydsBeacon.java new file mode 100644 index 0000000000..5be193943f --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/LloydsBeacon.java @@ -0,0 +1,178 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.util.ArrayList; + +import com.watabou.noosa.Game; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.wands.WandOfBlink; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.InterlevelScene; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundle; + +public class LloydsBeacon extends Item { + + private static final String TXT_PREVENTING = + "Strong magic aura of this place prevents you from using the lloyd's beacon!"; + + private static final String TXT_CREATURES = + "Psychic aura of neighbouring creatures doesn't allow you to use the lloyd's beacon at this moment."; + + private static final String TXT_RETURN = + "The lloyd's beacon is successfully set at your current location, now you can return here anytime."; + + private static final String TXT_INFO = + "Lloyd's beacon is an intricate magic device, that allows you to return to a place you have already been."; + + private static final String TXT_SET = + "\n\nThis beacon was set somewhere on the level %d of Pixel Dungeon."; + + public static final float TIME_TO_USE = 1; + + public static final String AC_SET = "SET"; + public static final String AC_RETURN = "RETURN"; + + private int returnDepth = -1; + private int returnPos; + + { + name = "lloyd's beacon"; + image = ItemSpriteSheet.BEACON; + + unique = true; + } + + private static final String DEPTH = "depth"; + private static final String POS = "pos"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( DEPTH, returnDepth ); + if (returnDepth != -1) { + bundle.put( POS, returnPos ); + } + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle(bundle); + returnDepth = bundle.getInt( DEPTH ); + returnPos = bundle.getInt( POS ); + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( AC_SET ); + if (returnDepth != -1) { + actions.add( AC_RETURN ); + } + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + + if (action == AC_SET || action == AC_RETURN) { + + if (Dungeon.bossLevel()) { + hero.spend( LloydsBeacon.TIME_TO_USE ); + GLog.w( TXT_PREVENTING ); + return; + } + + for (int i=0; i < Level.NEIGHBOURS8.length; i++) { + if (Actor.findChar( hero.pos + Level.NEIGHBOURS8[i] ) != null) { + GLog.w( TXT_CREATURES ); + return; + } + } + } + + if (action == AC_SET) { + + returnDepth = Dungeon.depth; + returnPos = hero.pos; + + hero.spend( LloydsBeacon.TIME_TO_USE ); + hero.busy(); + + hero.sprite.operate( hero.pos ); + Sample.INSTANCE.play( Assets.SND_BEACON ); + + GLog.i( TXT_RETURN ); + + } else if (action == AC_RETURN) { + + if (returnDepth == Dungeon.depth) { + reset(); + WandOfBlink.appear( hero, returnPos ); + Dungeon.level.press( returnPos, hero ); + Dungeon.observe(); + } else { + InterlevelScene.mode = InterlevelScene.Mode.RETURN; + InterlevelScene.returnDepth = returnDepth; + InterlevelScene.returnPos = returnPos; + reset(); + Game.switchScene( InterlevelScene.class ); + } + + + } else { + + super.execute( hero, action ); + + } + } + + public void reset() { + returnDepth = -1; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + private static final Glowing WHITE = new Glowing( 0xFFFFFF ); + + @Override + public Glowing glowing() { + return returnDepth != -1 ? WHITE : null; + } + + @Override + public String info() { + return TXT_INFO + (returnDepth == -1 ? "" : Utils.format( TXT_SET, returnDepth ) ); + } +} diff --git a/src/com/watabou/pixeldungeon/items/Stylus.java b/src/com/watabou/pixeldungeon/items/Stylus.java new file mode 100644 index 0000000000..2ad363ff7f --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/Stylus.java @@ -0,0 +1,122 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.particles.PurpleParticle; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.windows.WndBag; + +public class Stylus extends Item { + + private static final String TXT_SELECT_ARMOR = "Select an armor to inscribe on"; + private static final String TXT_INSCRIBED = "you inscribed the %s on your %s"; + + private static final float TIME_TO_INSCRIBE = 2; + + private static final String AC_INSCRIBE = "INSCRIBE"; + + { + name = "arcane stylus"; + image = ItemSpriteSheet.STYLUS; + + stackable = true; + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( AC_INSCRIBE ); + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + if (action == AC_INSCRIBE) { + + curUser = hero; + GameScene.selectItem( itemSelector, WndBag.Mode.ARMOR, TXT_SELECT_ARMOR ); + + } else { + + super.execute( hero, action ); + + } + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + private void inscribe( Armor armor ) { + + detach( curUser.belongings.backpack ); + + Class oldGlyphClass = armor.glyph != null ? armor.glyph.getClass() : null; + Armor.Glyph glyph = Armor.Glyph.random(); + while (glyph.getClass() == oldGlyphClass) { + glyph = Armor.Glyph.random(); + } + + GLog.w( TXT_INSCRIBED, glyph.name(), armor.name() ); + + armor.inscribe( glyph ); + + curUser.sprite.operate( curUser.pos ); + curUser.sprite.centerEmitter().start( PurpleParticle.BURST, 0.05f, 10 ); + Sample.INSTANCE.play( Assets.SND_BURNING ); + + curUser.spend( TIME_TO_INSCRIBE ); + curUser.busy(); + } + + @Override + public int price() { + return 50 * quantity; + } + + @Override + public String info() { + return + "This arcane stylus is made of some dark, very hard stone. Using it you can inscribe " + + "a magical glyph on your armor, but you have no power over choosing what glyph it will be, " + + "the stylus will decide it for you."; + } + + private final WndBag.Listener itemSelector = new WndBag.Listener() { + @Override + public void onSelect( Item item ) { + if (item != null) { + Stylus.this.inscribe( (Armor)item ); + } + } + }; +} diff --git a/src/com/watabou/pixeldungeon/items/TomeOfMastery.java b/src/com/watabou/pixeldungeon/items/TomeOfMastery.java new file mode 100644 index 0000000000..6b27c0ba18 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/TomeOfMastery.java @@ -0,0 +1,145 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.buffs.Blindness; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Fury; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroSubClass; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.SpellSprite; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.pixeldungeon.windows.WndChooseWay; + +public class TomeOfMastery extends Item { + + private static final String TXT_BLINDED = "You can't read while blinded"; + + public static final float TIME_TO_READ = 10; + + public static final String AC_READ = "READ"; + + { + stackable = false; + name = "Tome of Mastery"; + image = ItemSpriteSheet.MASTERY; + + unique = true; + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( AC_READ ); + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + if (action.equals( AC_READ )) { + + if (hero.buff( Blindness.class ) != null) { + GLog.w( TXT_BLINDED ); + return; + } + + curUser = hero; + + HeroSubClass way1 = null; + HeroSubClass way2 = null; + switch (hero.heroClass) { + case WARRIOR: + way1 = HeroSubClass.GLADIATOR; + way2 = HeroSubClass.BERSERKER; + break; + case MAGE: + way1 = HeroSubClass.BATTLEMAGE; + way2 = HeroSubClass.WARLOCK; + break; + case ROGUE: + way1 = HeroSubClass.FREERUNNER; + way2 = HeroSubClass.ASSASSIN; + break; + case HUNTRESS: + way1 = HeroSubClass.SNIPER; + way2 = HeroSubClass.WARDEN; + break; + } + GameScene.show( new WndChooseWay( this, way1, way2 ) ); + + } else { + + super.execute( hero, action ); + + } + } + + @Override + public boolean doPickUp( Hero hero ) { + Badges.validateMastery(); + return super.doPickUp( hero ); + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public String info() { + return + "This worn leather book is not that thick, but you feel somehow, " + + "that you can gather a lot from it. Remember though that reading " + + "this tome may require some time."; + } + + public void choose( HeroSubClass way ) { + + detach( curUser.belongings.backpack ); + + curUser.spend( TomeOfMastery.TIME_TO_READ ); + curUser.busy(); + + curUser.subClass = way; + + curUser.sprite.operate( curUser.pos ); + Sample.INSTANCE.play( Assets.SND_MASTERY ); + + SpellSprite.show( curUser, SpellSprite.MASTERY ); + curUser.sprite.emitter().burst( Speck.factory( Speck.MASTERY ), 12 ); + GLog.w( "You have chosen the way of the %s!", Utils.capitalize( way.title() ) ); + + if (way == HeroSubClass.BERSERKER && curUser.HP <= curUser.HT * Fury.LEVEL) { + Buff.affect( curUser, Fury.class ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/items/Torch.java b/src/com/watabou/pixeldungeon/items/Torch.java new file mode 100644 index 0000000000..d4b2104a21 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/Torch.java @@ -0,0 +1,94 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items; + +import java.util.ArrayList; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Light; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.particles.FlameParticle; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Torch extends Item { + + public static final String AC_LIGHT = "LIGHT"; + + public static final float TIME_TO_LIGHT = 1; + + { + name = "torch"; + image = ItemSpriteSheet.TORCH; + + stackable = true; + + defaultAction = AC_LIGHT; + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( AC_LIGHT ); + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + + if (action == AC_LIGHT) { + + hero.spend( TIME_TO_LIGHT ); + hero.busy(); + + hero.sprite.operate( hero.pos ); + + detach( hero.belongings.backpack ); + Buff.affect( hero, Light.class, Light.DURATION ); + + Emitter emitter = hero.sprite.centerEmitter(); + emitter.start( FlameParticle.FACTORY, 0.2f, 3 ); + + } else { + + super.execute( hero, action ); + + } + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public int price() { + return 10 * quantity; + } + + @Override + public String info() { + return + "It's an indispensable item in The Demon Halls, which are notorious for their poor ambient lighting."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/Armor.java b/src/com/watabou/pixeldungeon/items/armor/Armor.java new file mode 100644 index 0000000000..2bebad28ab --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/Armor.java @@ -0,0 +1,376 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor; + +import java.util.ArrayList; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.EquipableItem; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.armor.glyphs.*; +import com.watabou.pixeldungeon.sprites.HeroSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Armor extends EquipableItem { + + private static final String TXT_EQUIP_CURSED = "your %s constricts around you painfully"; + private static final String TXT_UNEQUIP_CURSED = "You can't remove cursed %s!"; + + private static final String TXT_IDENTIFY = "you are now familiar enough with your %s to identify it. It is %s."; + + private static final String TXT_TO_STRING = "%s :%d"; + + private static final String TXT_INCOMPATIBLE = + "Interaction of different types of magic has erased the glyph on this armor!"; + + public int tier; + + public int STR; + public int DR; + + private int hitsToKnow = 10; + + public Glyph glyph; + + public Armor( int tier ) { + + this.tier = tier; + + STR = typicalSTR(); + DR = typicalDR(); + } + + private static final String GLYPH = "glyph"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( GLYPH, glyph ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + glyph = (Glyph)bundle.get( GLYPH ); + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( isEquipped( hero ) ? AC_UNEQUIP : AC_EQUIP ); + return actions; + } + + @Override + public boolean doEquip( Hero hero ) { + + detach( hero.belongings.backpack ); + + if (hero.belongings.armor == null || hero.belongings.armor.doUnequip( hero, true )) { + + hero.belongings.armor = this; + + cursedKnown = true; + if (cursed) { + equipCursed( hero ); + GLog.n( TXT_EQUIP_CURSED, toString() ); + } + + ((HeroSprite)hero.sprite).updateArmor(); + + hero.spendAndNext( 2 * hero.speed() ); + return true; + + } else { + + collect( hero.belongings.backpack ); + return false; + + } + } + + @Override + public boolean doUnequip( Hero hero, boolean collect ) { + if (cursed) { + + GLog.w( TXT_UNEQUIP_CURSED, name() ); + return false; + + } else { + + hero.belongings.armor = null; + hero.spendAndNext( hero.speed() ); + + ((HeroSprite)hero.sprite).updateArmor(); + + if (collect && !collect( hero.belongings.backpack )) { + Dungeon.level.drop( this, hero.pos ); + } + + return true; + + } + } + + @Override + public boolean isEquipped( Hero hero ) { + return hero.belongings.armor == this; + } + + @Override + public Item upgrade() { + return upgrade( false ); + } + + public Item upgrade( boolean inscribe ) { + + if (glyph != null) { + if (!inscribe && Random.Int( level ) > 0) { + GLog.w( TXT_INCOMPATIBLE ); + inscribe( null ); + } + } else { + if (inscribe) { + inscribe( Glyph.random() ); + } + }; + + DR += tier; + STR--; + + return super.upgrade(); + } + + public Item safeUpgrade() { + return upgrade( glyph != null ); + } + + @Override + public Item degrade() { + DR -= tier; + STR++; + + return super.degrade(); + } + + public int proc( Char attacker, Char defender, int damage ) { + + if (glyph != null) { + damage = glyph.proc( this, attacker, defender, damage ); + } + + if (!levelKnown) { + if (--hitsToKnow <= 0) { + levelKnown = true; + GLog.w( TXT_IDENTIFY, name(), toString() ); + Badges.validateItemLevelAquired( this ); + } + } + + return damage; + } + + @Override + public String toString() { + return levelKnown ? Utils.format( TXT_TO_STRING, super.toString(), STR ) : super.toString(); + } + + @Override + public String name() { + return glyph == null ? super.name() : glyph.name( super.name() ); + } + + @Override + public String info() { + String name = name(); + StringBuilder info = new StringBuilder( desc() ); + + if (levelKnown) { + info.append( + "\n\nThis " + name + " provides damage absorption up to " + + "" + Math.max( DR, 0 ) + " points per attack. " ); + + if (STR > Dungeon.hero.STR()) { + + if (isEquipped( Dungeon.hero )) { + info.append( + "\n\nBecause of your inadequate strength your " + + "movement speed and defense skill is decreased. " ); + } else { + info.append( + "\n\nBecause of your inadequate strength wearing this armor " + + "will decrease your movement speed and defense skill. " ); + } + + } + } else { + info.append( + "\n\nTypical " + name + " provides damage absorption up to " + typicalDR() + " points per attack " + + " and requires " + typicalSTR() + " points of strength. " ); + if (typicalSTR() > Dungeon.hero.STR()) { + info.append( "Probably this armor is too heavy for you. " ); + } + } + + if (glyph != null) { + info.append( "It is inscribed." ); + } + + if (isEquipped( Dungeon.hero )) { + info.append( "\n\nYou are wearing the " + name + + (cursed ? ", and because it is cursed, you are powerless to remove it." : ".") ); + } else { + if (cursedKnown && cursed) { + info.append( "\n\nYou can feel a malevolent magic lurking within the " + name + "." ); + } + } + + return info.toString(); + } + + @Override + public Item random() { + if (Random.Float() < 0.4) { + int n = 1; + if (Random.Int( 3 ) == 0) { + n++; + if (Random.Int( 3 ) == 0) { + n++; + } + } + if (Random.Int( 2 ) == 0) { + upgrade( n ); + } else { + degrade( n ); + cursed = true; + } + } + + if (Random.Int( 10 ) == 0) { + inscribe( Glyph.random() ); + } + + return this; + } + + public int typicalSTR() { + return 7 + tier * 2; + } + + public int typicalDR() { + return tier * 2; + } + + @Override + public int price() { + int price = 10 * (1 << (tier - 1)); + if (glyph != null) { + price *= 1.5; + } + if (cursed && cursedKnown) { + price /= 2; + } + if (levelKnown) { + if (level > 0) { + price *= (level + 1); + } else if (level < 0) { + price /= (1 - level); + } + } + if (price < 1) { + price = 1; + } + return price; + } + + public Armor inscribe( Glyph glyph ) { + this.glyph = glyph; + return this; + } + + public boolean isInscribed() { + return glyph != null; + } + + @Override + public ItemSprite.Glowing glowing() { + return glyph != null ? glyph.glowing() : null; + } + + public static abstract class Glyph implements Bundlable { + + private static final Class[] glyphs = new Class[]{ + Bounce.class, Affection.class, AntiEntropy.class, Multiplicity.class, + Potential.class, Metabolism.class, Stench.class, Viscosity.class, + Displacement.class, Entanglement.class }; + + private static final float[] chances= new float[]{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + + public abstract int proc( Armor armor, Char attacker, Char defender, int damage ); + + public String name() { + return name( "glyph" ); + } + + public String name( String armorName ) { + return armorName; + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + } + + @Override + public void storeInBundle( Bundle bundle ) { + } + + public ItemSprite.Glowing glowing() { + return ItemSprite.Glowing.WHITE; + } + + public boolean checkOwner( Char owner ) { + if (!owner.isAlive() && owner instanceof Hero) { + + ((Hero)owner).killerGlyph = this; + Badges.validateDeathFromGlyph(); + return true; + + } else { + return false; + } + } + + @SuppressWarnings("unchecked") + public static Glyph random() { + try { + return ((Class)glyphs[ Random.chances( chances ) ]).newInstance(); + } catch (Exception e) { + return null; + } + } + + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/ClassArmor.java b/src/com/watabou/pixeldungeon/items/armor/ClassArmor.java new file mode 100644 index 0000000000..0baebc821e --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/ClassArmor.java @@ -0,0 +1,134 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor; + +import java.util.ArrayList; + +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Bundle; + +abstract public class ClassArmor extends Armor { + + private static final String TXT_LOW_HEALTH = "Your health is too low!"; + private static final String TXT_NOT_EQUIPPED = "You need to be wearing this armor to use its special power!"; + + { + levelKnown = true; + cursedKnown = true; + defaultAction = special(); + } + + public ClassArmor() { + super( 6 ); + } + + public static ClassArmor upgrade ( Hero owner, Armor armor ) { + + ClassArmor classArmor = null; + + switch (owner.heroClass) { + case WARRIOR: + classArmor = new WarriorArmor(); + break; + case ROGUE: + classArmor = new RogueArmor(); + break; + case MAGE: + classArmor = new MageArmor(); + break; + case HUNTRESS: + classArmor = new HuntressArmor(); + break; + } + + classArmor.STR = armor.STR; + classArmor.DR = armor.DR; + + classArmor.inscribe( armor.glyph ); + + return classArmor; + } + + private static final String ARMOR_STR = "STR"; + private static final String ARMOR_DR = "DR"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( ARMOR_STR, STR ); + bundle.put( ARMOR_DR, DR ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + STR = bundle.getInt( ARMOR_STR ); + DR = bundle.getInt( ARMOR_DR ); + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + if (hero.HP >= 2 && isEquipped( hero )) { + actions.add( special() ); + } + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + if (action == special()) { + + if (hero.HP < 2) { + GLog.w( TXT_LOW_HEALTH ); + } else if (!isEquipped( hero )) { + GLog.w( TXT_NOT_EQUIPPED ); + } else { + curUser = hero; + doSpecial(); + } + + } else { + super.execute( hero, action ); + } + } + + abstract public String special(); + abstract public void doSpecial(); + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public int price() { + return 0; + } + + @Override + public String desc() { + return "The thing looks awesome!"; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/ClothArmor.java b/src/com/watabou/pixeldungeon/items/armor/ClothArmor.java new file mode 100644 index 0000000000..182bb0d42e --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/ClothArmor.java @@ -0,0 +1,38 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + + +public class ClothArmor extends Armor { + + { + name = "cloth armor"; + image = ItemSpriteSheet.ARMOR_CLOTH; + } + + public ClothArmor() { + super( 1 ); + } + + @Override + public String desc() { + return "This lightweight armor offers basic protection."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/HuntressArmor.java b/src/com/watabou/pixeldungeon/items/armor/HuntressArmor.java new file mode 100644 index 0000000000..7135d7e5a6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/HuntressArmor.java @@ -0,0 +1,107 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor; + +import java.util.HashMap; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.weapon.missiles.Shuriken; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.sprites.MissileSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Callback; + +public class HuntressArmor extends ClassArmor { + + private static final String TXT_NO_ENEMIES = "No enemies in sight"; + private static final String TXT_NOT_HUNTRESS = "Only huntresses can use this armor!"; + + private static final String AC_SPECIAL = "SPECTRAL BLADES"; + + { + name = "huntress cloak"; + image = ItemSpriteSheet.ARMOR_HUNTRESS; + } + + private HashMap targets = new HashMap(); + + @Override + public String special() { + return AC_SPECIAL; + } + + @Override + public void doSpecial() { + + Item proto = new Shuriken(); + + for (Mob mob : Dungeon.level.mobs) { + if (Level.fieldOfView[mob.pos]) { + + Callback callback = new Callback() { + @Override + public void call() { + curUser.attack( targets.get( this ) ); + targets.remove( this ); + if (targets.isEmpty()) { + curUser.spendAndNext( curUser.attackDelay() ); + } + } + }; + + ((MissileSprite)curUser.sprite.parent.recycle( MissileSprite.class )). + reset( curUser.pos, mob.pos, proto, callback ); + + targets.put( callback, mob ); + } + } + + if (targets.size() == 0) { + GLog.w( TXT_NO_ENEMIES ); + return; + } + + curUser.HP /= 2; + + curUser.sprite.zap( curUser.pos ); + curUser.busy(); + } + + @Override + public boolean doEquip( Hero hero ) { + if (hero.heroClass == HeroClass.HUNTRESS) { + return super.doEquip( hero ); + } else { + GLog.w( TXT_NOT_HUNTRESS ); + return false; + } + } + + @Override + public String desc() { + return + "A huntress in such cloak can create a fan of spectral blades. Each of these blades " + + "will target a single enemy in the huntress's field of view, inflicting damage depending " + + "on her currently equipped melee weapon."; + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/items/armor/LeatherArmor.java b/src/com/watabou/pixeldungeon/items/armor/LeatherArmor.java new file mode 100644 index 0000000000..e4e53437ec --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/LeatherArmor.java @@ -0,0 +1,38 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + + +public class LeatherArmor extends Armor { + + { + name = "leather armor"; + image = ItemSpriteSheet.ARMOR_LEATHER; + } + + public LeatherArmor() { + super( 2 ); + } + + @Override + public String desc() { + return "Armor made from tanned monster hide. Not as light as cloth armor but provides better protection."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/MageArmor.java b/src/com/watabou/pixeldungeon/items/armor/MageArmor.java new file mode 100644 index 0000000000..cadc05bf5f --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/MageArmor.java @@ -0,0 +1,87 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.actors.buffs.Roots; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.particles.ElmoParticle; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; + +public class MageArmor extends ClassArmor { + + private static final String AC_SPECIAL = "MOLTEN EARTH"; + + private static final String TXT_NOT_MAGE = "Only mages can use this armor!"; + + { + name = "mage robe"; + image = ItemSpriteSheet.ARMOR_MAGE; + } + + @Override + public String special() { + return AC_SPECIAL; + } + + @Override + public String desc() { + return + "Wearing this gorgeous robe, a mage can cast a spell of molten earth: all the enemies " + + "in his field of view will be set on fire and unable to move at the same time."; + } + + @Override + public void doSpecial() { + + for (Mob mob : Dungeon.level.mobs) { + if (Level.fieldOfView[mob.pos]) { + Buff.affect( mob, Burning.class ).reignite( mob ); + Buff.prolong( mob, Roots.class, 3 ); + } + } + + curUser.HP /= 2; + + curUser.spend( Actor.TICK ); + curUser.sprite.operate( curUser.pos ); + curUser.busy(); + + curUser.sprite.centerEmitter().start( ElmoParticle.FACTORY, 0.15f, 4 ); + Sample.INSTANCE.play( Assets.SND_READ ); + } + + @Override + public boolean doEquip( Hero hero ) { + if (hero.heroClass == HeroClass.MAGE) { + return super.doEquip( hero ); + } else { + GLog.w( TXT_NOT_MAGE ); + return false; + } + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/items/armor/MailArmor.java b/src/com/watabou/pixeldungeon/items/armor/MailArmor.java new file mode 100644 index 0000000000..1039c5fff9 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/MailArmor.java @@ -0,0 +1,39 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + + +public class MailArmor extends Armor { + + { + name = "mail armor"; + image = ItemSpriteSheet.ARMOR_MAIL; + } + + public MailArmor() { + super( 3 ); + } + + @Override + public String desc() { + return + "Interlocking metal links make for a tough but flexible suit of armor."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/PlateArmor.java b/src/com/watabou/pixeldungeon/items/armor/PlateArmor.java new file mode 100644 index 0000000000..c69822b61c --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/PlateArmor.java @@ -0,0 +1,40 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + + +public class PlateArmor extends Armor { + + { + name = "plate armor"; + image = ItemSpriteSheet.ARMOR_PLATE; + } + + public PlateArmor() { + super( 5 ); + } + + @Override + public String desc() { + return + "Enormous plates of metal are joined together into a suit that provides " + + "unmatched protection to any adventurer strong enough to bear its staggering weight."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/RogueArmor.java b/src/com/watabou/pixeldungeon/items/armor/RogueArmor.java new file mode 100644 index 0000000000..fe75a1e851 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/RogueArmor.java @@ -0,0 +1,117 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.buffs.Blindness; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.actors.mobs.Mob.State; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.wands.WandOfBlink; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.CellSelector; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; + +public class RogueArmor extends ClassArmor { + + private static final String TXT_FOV = "You can only jump to an empty location in your field of view"; + private static final String TXT_NOT_ROGUE = "Only rogues can use this armor!"; + + private static final String AC_SPECIAL = "SMOKE BOMB"; + + { + name = "rogue garb"; + image = ItemSpriteSheet.ARMOR_ROGUE; + } + + @Override + public String special() { + return AC_SPECIAL; + } + + @Override + public void doSpecial() { + GameScene.selectCell( teleporter ); + } + + @Override + public boolean doEquip( Hero hero ) { + if (hero.heroClass == HeroClass.ROGUE) { + return super.doEquip( hero ); + } else { + GLog.w( TXT_NOT_ROGUE ); + return false; + } + } + + @Override + public String desc() { + return + "Wearing this dark garb, a rogue can perform a trick, that is called \"smoke bomb\" " + + "(though no real explosives are used): he blinds enemies who could see him and jumps aside."; + } + + protected static CellSelector.Listener teleporter = new CellSelector.Listener() { + + @Override + public void onSelect( Integer target ) { + if (target != null) { + + if (!Level.fieldOfView[target] || + !(Level.passable[target] || Level.avoid[target]) || + Actor.findChar( target ) != null) { + + GLog.w( TXT_FOV ); + return; + } + + curUser.HP /= 2; + + for (Mob mob : Dungeon.level.mobs) { + if (Level.fieldOfView[mob.pos]) { + Buff.prolong( mob, Blindness.class, 2 ); + mob.state = State.WANDERING; + mob.sprite.emitter().burst( Speck.factory( Speck.LIGHT ), 4 ); + } + } + + WandOfBlink.appear( curUser, target ); + CellEmitter.get( target ).burst( Speck.factory( Speck.WOOL ), 10 ); + Sample.INSTANCE.play( Assets.SND_PUFF ); + Dungeon.level.press( target, curUser ); + Dungeon.observe(); + + curUser.spendAndNext( Actor.TICK ); + } + } + + @Override + public String prompt() { + return "Choose a location to jump to"; + } + }; +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/items/armor/ScaleArmor.java b/src/com/watabou/pixeldungeon/items/armor/ScaleArmor.java new file mode 100644 index 0000000000..5d46e31c96 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/ScaleArmor.java @@ -0,0 +1,39 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + + +public class ScaleArmor extends Armor { + + { + name = "scale armor"; + image = ItemSpriteSheet.ARMOR_SCALE; + } + + public ScaleArmor() { + super( 4 ); + } + + @Override + public String desc() { + return + "The metal scales sewn onto a leather vest create a flexible, yet protective armor."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/WarriorArmor.java b/src/com/watabou/pixeldungeon/items/armor/WarriorArmor.java new file mode 100644 index 0000000000..8988a8d668 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/WarriorArmor.java @@ -0,0 +1,129 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor; + +import com.watabou.noosa.Camera; +import com.watabou.noosa.tweeners.PosTweener; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Fury; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.buffs.Paralysis; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.actors.hero.HeroSubClass; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.scenes.CellSelector; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.PointF; + +public class WarriorArmor extends ClassArmor { + + private static int LEAP_TIME = 1; + private static int SHOCK_TIME = 3; + + private static final String AC_SPECIAL = "HEROIC LEAP"; + + private static final String TXT_NOT_WARRIOR = "Only warriors can use this armor!"; + + { + name = "warrior suit of armor"; + image = ItemSpriteSheet.ARMOR_WARRIOR; + } + + @Override + public String special() { + return AC_SPECIAL; + } + + @Override + public void doSpecial() { + GameScene.selectCell( leaper ); + } + + @Override + public boolean doEquip( Hero hero ) { + if (hero.heroClass == HeroClass.WARRIOR) { + return super.doEquip( hero ); + } else { + GLog.w( TXT_NOT_WARRIOR ); + return false; + } + } + + @Override + public String desc() { + return + "While this armor looks heavy, it allows a warrior to perform heroic leap towards " + + "a targeted location, slamming down to stun all neighbouring enemies."; + } + + protected static CellSelector.Listener leaper = new CellSelector.Listener() { + + @Override + public void onSelect( Integer target ) { + if (target != null && target != curUser.pos) { + + int cell = Ballistica.cast( curUser.pos, target, false, true ); + if (Actor.findChar( cell ) != null && cell != curUser.pos) { + cell = Ballistica.trace[Ballistica.distance - 2]; + } + + curUser.HP /= 2; + if (curUser.subClass == HeroSubClass.BERSERKER && curUser.HP <= curUser.HT * Fury.LEVEL) { + Buff.affect( curUser, Fury.class ); + } + + Invisibility.dispel(); + + curUser.move( cell ); + curUser.sprite.place( cell ); + Dungeon.level.press( target, curUser ); + Dungeon.observe(); + + for (int i=0; i < Level.NEIGHBOURS8.length; i++) { + Char mob = Actor.findChar( curUser.pos + Level.NEIGHBOURS8[i] ); + if (mob != null && mob != curUser) { + Buff.prolong( mob, Paralysis.class, SHOCK_TIME ); + } + } + + PointF pos = curUser.sprite.point(); + Camera.main.target = null; + curUser.sprite.y -= 16; + curUser.sprite.parent.add( new PosTweener( curUser.sprite, pos, 0.1f ) ); + + CellEmitter.center( cell ).burst( Speck.factory( Speck.DUST ), 10 ); + + curUser.spendAndNext( LEAP_TIME ); + } + } + + @Override + public String prompt() { + return "Choose direction to leap"; + } + }; +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/items/armor/glyphs/Affection.java b/src/com/watabou/pixeldungeon/items/armor/glyphs/Affection.java new file mode 100644 index 0000000000..7e62d96538 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/glyphs/Affection.java @@ -0,0 +1,66 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor.glyphs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Charm; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.armor.Armor.Glyph; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.GameMath; +import com.watabou.utils.Random; + +public class Affection extends Glyph { + + private static final String TXT_AFFECTION = "%s of affection"; + + private static ItemSprite.Glowing PINK = new ItemSprite.Glowing( 0xFF4488 ); + + @Override + public int proc( Armor armor, Char attacker, Char defender, int damage) { + + int level = (int)GameMath.gate( 0, armor.level, 6 ); + + if (Level.adjacent( attacker.pos, defender.pos ) && Random.Int( level / 2 + 5 ) >= 4) { + + int duration = Random.IntRange( 2, 5 ); + + Buff.affect( attacker, Charm.class, Charm.durationFactor( attacker ) * duration ); + attacker.sprite.centerEmitter().start( Speck.factory( Speck.HEART ), 0.2f, 5 ); + + Buff.affect( defender, Charm.class, Random.Float( Charm.durationFactor( defender ) * duration / 2, duration ) ); + defender.sprite.centerEmitter().start( Speck.factory( Speck.HEART ), 0.2f, 5 ); + } + + return damage; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_AFFECTION, weaponName ); + } + + @Override + public Glowing glowing() { + return PINK; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/glyphs/AntiEntropy.java b/src/com/watabou/pixeldungeon/items/armor/glyphs/AntiEntropy.java new file mode 100644 index 0000000000..86a4283a15 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/glyphs/AntiEntropy.java @@ -0,0 +1,67 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor.glyphs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.actors.buffs.Frost; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.FlameParticle; +import com.watabou.pixeldungeon.effects.particles.SnowParticle; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.armor.Armor.Glyph; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class AntiEntropy extends Glyph { + + private static final String TXT_ANTI_ENTROPY = "%s of anti-entropy"; + + private static ItemSprite.Glowing BLUE = new ItemSprite.Glowing( 0x0000FF ); + + @Override + public int proc( Armor armor, Char attacker, Char defender, int damage) { + + int level = Math.max( 0, armor.level ); + + if (Level.adjacent( attacker.pos, defender.pos ) && Random.Int( level + 6 ) >= 5) { + + Buff.prolong( attacker, Frost.class, Frost.duration( attacker ) * Random.Float( 1f, 1.5f )); + CellEmitter.get( attacker.pos ).start( SnowParticle.FACTORY, 0.2f, 6 ); + + Buff.affect( defender, Burning.class ).reignite( defender ); + defender.sprite.emitter().burst( FlameParticle.FACTORY, 5 ); + + } + + return damage; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_ANTI_ENTROPY, weaponName ); + } + + @Override + public Glowing glowing() { + return BLUE; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/glyphs/Bounce.java b/src/com/watabou/pixeldungeon/items/armor/glyphs/Bounce.java new file mode 100644 index 0000000000..241da599b8 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/glyphs/Bounce.java @@ -0,0 +1,72 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor.glyphs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.Pushing; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.armor.Armor.Glyph; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.utils.Random; + +public class Bounce extends Glyph { + + private static final String TXT_BOUNCE = "%s of bounce"; + + @Override + public int proc( Armor armor, Char attacker, Char defender, int damage) { + + int level = Math.max( 0, armor.level ); + + if (Level.adjacent( attacker.pos, defender.pos ) && Random.Int( level + 5) >= 4) { + + for (int i=0; i < Level.NEIGHBOURS8.length; i++) { + int ofs = Level.NEIGHBOURS8[i]; + if (attacker.pos - defender.pos == ofs) { + int newPos = attacker.pos + ofs; + if ((Level.passable[newPos] || Level.avoid[newPos]) && Actor.findChar( newPos ) == null) { + + Actor.addDelayed( new Pushing( attacker, attacker.pos, newPos ), -1 ); + + attacker.pos = newPos; + // Âîò ýòî âîò êðèâî :( + if (attacker instanceof Mob) { + Dungeon.level.mobPress( (Mob)attacker ); + } else { + Dungeon.level.press( newPos, attacker ); + } + + } + break; + } + } + + } + + return damage; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_BOUNCE, weaponName ); + } + +} diff --git a/src/com/watabou/pixeldungeon/items/armor/glyphs/Displacement.java b/src/com/watabou/pixeldungeon/items/armor/glyphs/Displacement.java new file mode 100644 index 0000000000..6174244272 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/glyphs/Displacement.java @@ -0,0 +1,69 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor.glyphs; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.armor.Armor.Glyph; +import com.watabou.pixeldungeon.items.wands.WandOfBlink; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class Displacement extends Glyph { + + private static final String TXT_DISPLACEMENT = "%s of displacement"; + + private static ItemSprite.Glowing BLUE = new ItemSprite.Glowing( 0x66AAFF ); + + @Override + public int proc( Armor armor, Char attacker, Char defender, int damage ) { + + if (Dungeon.bossLevel()) { + return damage; + } + + int nTries = (armor.level < 0 ? 1 : armor.level + 1) * 5; + for (int i=0; i < nTries; i++) { + int pos = Random.Int( Level.LENGTH ); + if (Dungeon.visible[pos] && Level.passable[pos] && Actor.findChar( pos ) == null) { + + WandOfBlink.appear( defender, pos ); + Dungeon.level.press( pos, defender ); + Dungeon.observe(); + + break; + } + } + + return damage; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_DISPLACEMENT, weaponName ); + } + + @Override + public Glowing glowing() { + return BLUE; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/glyphs/Entanglement.java b/src/com/watabou/pixeldungeon/items/armor/glyphs/Entanglement.java new file mode 100644 index 0000000000..e41652b354 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/glyphs/Entanglement.java @@ -0,0 +1,66 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor.glyphs; + +import com.watabou.noosa.Camera; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Roots; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.EarthParticle; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.armor.Armor.Glyph; +import com.watabou.pixeldungeon.plants.Earthroot; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class Entanglement extends Glyph { + + private static final String TXT_ENTANGLEMENT = "%s of entanglement"; + + private static ItemSprite.Glowing GREEN = new ItemSprite.Glowing( 0x448822 ); + + @Override + public int proc( Armor armor, Char attacker, Char defender, int damage ) { + + int level = Math.max( 0, armor.level ); + + if (Random.Int( 4 ) == 0) { + + Buff.prolong( defender, Roots.class, 5 - level / 5 ); + Buff.affect( defender, Earthroot.Armor.class ).level( 5 * (level + 1) ); + CellEmitter.bottom( defender.pos ).start( EarthParticle.FACTORY, 0.05f, 8 ); + Camera.main.shake( 1, 0.4f ); + + } + + return damage; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_ENTANGLEMENT, weaponName ); + } + + @Override + public Glowing glowing() { + return GREEN; + } + +} diff --git a/src/com/watabou/pixeldungeon/items/armor/glyphs/Metabolism.java b/src/com/watabou/pixeldungeon/items/armor/glyphs/Metabolism.java new file mode 100644 index 0000000000..7555f231f1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/glyphs/Metabolism.java @@ -0,0 +1,74 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor.glyphs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Hunger; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.armor.Armor.Glyph; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.utils.Random; + +public class Metabolism extends Glyph { + + private static final String TXT_METABOLISM = "%s of metabolism"; + + private static ItemSprite.Glowing RED = new ItemSprite.Glowing( 0xCC0000 ); + + @Override + public int proc( Armor armor, Char attacker, Char defender, int damage) { + + int level = Math.max( 0, armor.level ); + if (Random.Int( level / 2 + 5 ) >= 4) { + + int healing = Math.min( defender.HT - defender.HP, Random.Int( 1, defender.HT / 5 ) ); + + if (healing > 0) { + + Hunger hunger = defender.buff( Hunger.class ); + + if (hunger != null && !hunger.isStarving()) { + + hunger.satisfy( -Hunger.STARVING / 10 ); + BuffIndicator.refreshHero(); + + defender.HP += healing; + defender.sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); + defender.sprite.showStatus( CharSprite.POSITIVE, Integer.toString( healing ) ); + } + } + + } + + return damage; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_METABOLISM, weaponName ); + } + + @Override + public Glowing glowing() { + return RED; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/glyphs/Multiplicity.java b/src/com/watabou/pixeldungeon/items/armor/glyphs/Multiplicity.java new file mode 100644 index 0000000000..9ce857fc73 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/glyphs/Multiplicity.java @@ -0,0 +1,81 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor.glyphs; + +import java.util.ArrayList; + +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.npcs.MirrorImage; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.armor.Armor.Glyph; +import com.watabou.pixeldungeon.items.wands.WandOfBlink; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class Multiplicity extends Glyph { + + private static final String TXT_MULTIPLICITY = "%s of multiplicity"; + + private static ItemSprite.Glowing PINK = new ItemSprite.Glowing( 0xCCAA88 ); + + @Override + public int proc( Armor armor, Char attacker, Char defender, int damage) { + + int level = Math.max( 0, armor.level ); + + if (Random.Int( level / 2 + 6 ) >= 5) { + + ArrayList respawnPoints = new ArrayList(); + + for (int i=0; i < Level.NEIGHBOURS8.length; i++) { + int p = defender.pos + Level.NEIGHBOURS8[i]; + if (Actor.findChar( p ) == null && (Level.passable[p] || Level.avoid[p])) { + respawnPoints.add( p ); + } + } + + if (respawnPoints.size() > 0) { + MirrorImage mob = new MirrorImage(); + mob.duplicate( (Hero)defender ); + GameScene.add( mob ); + WandOfBlink.appear( mob, Random.element( respawnPoints ) ); + + defender.damage( Random.IntRange( 1, defender.HT / 6 ), /*attacker*/ this ); + checkOwner( defender ); + } + + } + + return damage; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_MULTIPLICITY, weaponName ); + } + + @Override + public Glowing glowing() { + return PINK; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/glyphs/Potential.java b/src/com/watabou/pixeldungeon/items/armor/glyphs/Potential.java new file mode 100644 index 0000000000..331cfb5492 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/glyphs/Potential.java @@ -0,0 +1,72 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor.glyphs; + +import com.watabou.noosa.Camera; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.effects.Lightning; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.armor.Armor.Glyph; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.traps.LightningTrap; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class Potential extends Glyph { + + private static final String TXT_POTENTIAL = "%s of potential"; + + private static ItemSprite.Glowing BLUE = new ItemSprite.Glowing( 0x66CCEE ); + + @Override + public int proc( Armor armor, Char attacker, Char defender, int damage) { + + int level = Math.max( 0, armor.level ); + + if (Level.adjacent( attacker.pos, defender.pos ) && Random.Int( level + 7 ) >= 6) { + + int dmg = Random.IntRange( 1, damage ); + attacker.damage( dmg, LightningTrap.LIGHTNING ); + dmg = Random.IntRange( 1, dmg ); + defender.damage( dmg, LightningTrap.LIGHTNING ); + + checkOwner( defender ); + if (defender == Dungeon.hero) { + Camera.main.shake( 2, 0.3f ); + } + + int[] points = {attacker.pos, defender.pos}; + attacker.sprite.parent.add( new Lightning( points, 2, null ) ); + + } + + return damage; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_POTENTIAL, weaponName ); + } + + @Override + public Glowing glowing() { + return BLUE; + } +} diff --git a/src/com/watabou/pixeldungeon/items/armor/glyphs/Stench.java b/src/com/watabou/pixeldungeon/items/armor/glyphs/Stench.java new file mode 100644 index 0000000000..af2e29a938 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/glyphs/Stench.java @@ -0,0 +1,61 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor.glyphs; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.armor.Armor.Glyph; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class Stench extends Glyph { + + private static final String TXT_STENCH = "%s of stench"; + + private static ItemSprite.Glowing GREEN = new ItemSprite.Glowing( 0x22CC44 ); + + @Override + public int proc( Armor armor, Char attacker, Char defender, int damage) { + + int level = Math.max( 0, armor.level ); + + if (Level.adjacent( attacker.pos, defender.pos ) && Random.Int( level + 5 ) >= 4) { + + GameScene.add( Blob.seed( attacker.pos, 20, ToxicGas.class ) ); + + } + + return damage; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_STENCH, weaponName ); + } + + @Override + public Glowing glowing() { + return GREEN; + } + +} diff --git a/src/com/watabou/pixeldungeon/items/armor/glyphs/Viscosity.java b/src/com/watabou/pixeldungeon/items/armor/glyphs/Viscosity.java new file mode 100644 index 0000000000..ae8253d55d --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/armor/glyphs/Viscosity.java @@ -0,0 +1,150 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.armor.glyphs; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.armor.Armor.Glyph; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Viscosity extends Glyph { + + private static final String TXT_VISCOSITY = "%s of viscosity"; + + private static ItemSprite.Glowing PURPLE = new ItemSprite.Glowing( 0x8844CC ); + + @Override + public int proc( Armor armor, Char attacker, Char defender, int damage ) { + + if (damage == 0) { + return 0; + } + + int level = Math.max( 0, armor.level ); + + if (Random.Int( level + 7 ) >= 6) { + + DeferedDamage debuff = defender.buff( DeferedDamage.class ); + if (debuff == null) { + debuff = new DeferedDamage(); + debuff.attachTo( defender ); + } + debuff.prolong( damage ); + + defender.sprite.showStatus( CharSprite.WARNING, "deferred %d", damage ); + + return 0; + + } else { + return damage; + } + } + + @Override + public String name( String weaponName) { + return String.format( TXT_VISCOSITY, weaponName ); + } + + @Override + public Glowing glowing() { + return PURPLE; + } + + public static class DeferedDamage extends Buff { + + protected int damage = 0; + + private static final String DAMAGE = "damage"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( DAMAGE, damage ); + + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + damage = bundle.getInt( DAMAGE ); + } + + @Override + public boolean attachTo( Char target ) { + if (super.attachTo( target )) { + postpone( TICK ); + return true; + } else { + return false; + } + } + + public void prolong( int damage ) { + this.damage += damage; + }; + + @Override + public int icon() { + return BuffIndicator.DEFERRED; + } + + @Override + public String toString() { + return Utils.format( "Defered damage (%d)", damage ); + } + + @Override + public boolean act() { + if (target.isAlive()) { + + target.damage( 1, this ); + if (target == Dungeon.hero && !target.isAlive()) { + // Refactoring needed! + Glyph glyph = new Viscosity(); + Dungeon.fail( Utils.format( ResultDescriptions.GLYPH, glyph.name(), Dungeon.depth ) ); + GLog.n( "%s killed you...", glyph.name() ); + + Badges.validateDeathFromGlyph(); + } + spend( TICK ); + + if (--damage <= 0) { + detach(); + } + + } else { + + detach(); + + } + + return true; + } + } +} diff --git a/src/com/watabou/pixeldungeon/items/bags/Bag.java b/src/com/watabou/pixeldungeon/items/bags/Bag.java new file mode 100644 index 0000000000..fcd2d2e21a --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/bags/Bag.java @@ -0,0 +1,186 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.bags; + +import java.util.ArrayList; +import java.util.Iterator; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.windows.WndBag; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; + +public class Bag extends Item implements Iterable { + + public static final String AC_OPEN = "OPEN"; + + { + image = 11; + + defaultAction = AC_OPEN; + } + + public Char owner; + + public ArrayList items = new ArrayList(); + + public int size = 1; + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + if (action.equals( AC_OPEN )) { + + GameScene.show( new WndBag( this, null, WndBag.Mode.ALL, null ) ); + + } else { + + super.execute( hero, action ); + + } + } + + @Override + public boolean collect( Bag container ) { + if (super.collect( container )) { + + owner = container.owner; + + for (Item item : container.items.toArray( new Item[0] )) { + if (grab( item )) { + item.detachAll( container ); + item.collect( this ); + } + } + + Badges.validateAllBagsBought( this ); + + return true; + } else { + return false; + } + } + + @Override + public Item detach( Bag container ) { + owner = null; + return super.detach( container ); + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + public void clear() { + items.clear(); + } + + private static final String ITEMS = "inventory"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( ITEMS, items ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + for (Bundlable item : bundle.getCollection( ITEMS )) { + ((Item)item).collect( this ); + }; + } + + public boolean contains( Item item ) { + for (Item i : items) { + if (i == item) { + return true; + } else if (i instanceof Bag && ((Bag)i).contains( item )) { + return true; + } + } + return false; + } + + public boolean grab( Item item ) { + return false; + } + + @Override + public Iterator iterator() { + return new ItemIterator(); + } + + private class ItemIterator implements Iterator { + + private int index = 0; + private Iterator nested = null; + + @Override + public boolean hasNext() { + if (nested != null) { + return nested.hasNext() || index < items.size(); + } else { + return index < items.size(); + } + } + + @Override + public Item next() { + if (nested != null && nested.hasNext()) { + + return nested.next(); + + } else { + + nested = null; + + Item item = items.get( index++ ); + if (item instanceof Bag) { + nested = ((Bag)item).iterator(); + } + + return item; + } + } + + @Override + public void remove() { + if (nested != null) { + nested.remove(); + } else { + items.remove( index ); + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/items/bags/ScrollHolder.java b/src/com/watabou/pixeldungeon/items/bags/ScrollHolder.java new file mode 100644 index 0000000000..0bef891de0 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/bags/ScrollHolder.java @@ -0,0 +1,49 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.bags; + +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.scrolls.Scroll; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class ScrollHolder extends Bag { + + { + name = "scroll holder"; + image = ItemSpriteSheet.HOLDER; + + size = 12; + } + + @Override + public boolean grab( Item item ) { + return item instanceof Scroll; + } + + @Override + public int price() { + return 50; + } + + @Override + public String info() { + return + "You can place any number of scrolls into this tubular container. " + + "It saves room in your backpack and protects scrolls from fire."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/bags/SeedPouch.java b/src/com/watabou/pixeldungeon/items/bags/SeedPouch.java new file mode 100644 index 0000000000..b3515d3f5a --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/bags/SeedPouch.java @@ -0,0 +1,48 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.bags; + +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.plants.Plant; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class SeedPouch extends Bag { + + { + name = "seed pouch"; + image = ItemSpriteSheet.POUCH; + + size = 8; + } + + @Override + public boolean grab( Item item ) { + return item instanceof Plant.Seed; + } + + @Override + public int price() { + return 50; + } + + @Override + public String info() { + return + "This small velvet pouch allows you to store any number of seeds in it. Very convenient."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/bags/WandHolster.java b/src/com/watabou/pixeldungeon/items/bags/WandHolster.java new file mode 100644 index 0000000000..eec81b4014 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/bags/WandHolster.java @@ -0,0 +1,73 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.bags; + +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.wands.Wand; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class WandHolster extends Bag { + + { + name = "wand holster"; + image = ItemSpriteSheet.HOLSTER; + + size = 12; + } + + @Override + public boolean grab( Item item ) { + return item instanceof Wand; + } + + @Override + public boolean collect( Bag container ) { + if (super.collect( container )) { + if (owner != null) { + for (Item item : items) { + ((Wand)item).charge( owner ); + } + } + return true; + } else { + return false; + } + } + + @Override + public Item detach( Bag container ) { + + for (Item item : items) { + ((Wand)item).stopCharging(); + } + + return super.detach( container ); + } + + @Override + public int price() { + return 50; + } + + @Override + public String info() { + return + "This slim holder is made of leather of some exotic animal. " + + "It allows to compactly carry up to " + size + " wands."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/food/ChargrilledMeat.java b/src/com/watabou/pixeldungeon/items/food/ChargrilledMeat.java new file mode 100644 index 0000000000..67ffbdea87 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/food/ChargrilledMeat.java @@ -0,0 +1,46 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.food; + +import com.watabou.pixeldungeon.actors.buffs.Hunger; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class ChargrilledMeat extends Food { + + { + name = "chargrilled meat"; + image = ItemSpriteSheet.STEAK; + energy = Hunger.STARVING - Hunger.HUNGRY; + } + + @Override + public String info() { + return "It looks like a decent steak."; + } + + @Override + public int price() { + return 5 * quantity; + } + + public static Food cook( MysteryMeat ingredient ) { + ChargrilledMeat result = new ChargrilledMeat(); + result.quantity = ingredient.quantity(); + return result; + } +} diff --git a/src/com/watabou/pixeldungeon/items/food/Food.java b/src/com/watabou/pixeldungeon/items/food/Food.java new file mode 100644 index 0000000000..00e7fbf177 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/food/Food.java @@ -0,0 +1,120 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.food; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.buffs.Hunger; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.SpellSprite; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfRecharging; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; + +public class Food extends Item { + + private static final float TIME_TO_EAT = 3f; + + public static final String AC_EAT = "EAT"; + + public float energy = Hunger.HUNGRY; + public String message = "That food tasted delicious!"; + + { + stackable = true; + name = "ration of food"; + image = ItemSpriteSheet.RATION; + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( AC_EAT ); + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + if (action.equals( AC_EAT )) { + + detach( hero.belongings.backpack ); + + ((Hunger)hero.buff( Hunger.class )).satisfy( energy ); + GLog.i( message ); + + switch (hero.heroClass) { + case WARRIOR: + if (hero.HP < hero.HT) { + hero.HP = Math.min( hero.HP + 5, hero.HT ); + hero.sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); + } + break; + case MAGE: + hero.belongings.charge( false ); + ScrollOfRecharging.charge( hero ); + break; + case ROGUE: + case HUNTRESS: + break; + } + + hero.sprite.operate( hero.pos ); + hero.busy(); + SpellSprite.show( hero, SpellSprite.FOOD ); + Sample.INSTANCE.play( Assets.SND_EAT ); + + hero.spend( TIME_TO_EAT ); + + Statistics.foodEaten++; + Badges.validateFoodEaten(); + + } else { + + super.execute( hero, action ); + + } + } + + @Override + public String info() { + return + "Nothing fancy here: dried meat, " + + "some biscuits - things like that."; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public int price() { + return 10 * quantity; + } +} diff --git a/src/com/watabou/pixeldungeon/items/food/FrozenCarpaccio.java b/src/com/watabou/pixeldungeon/items/food/FrozenCarpaccio.java new file mode 100644 index 0000000000..a280076025 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/food/FrozenCarpaccio.java @@ -0,0 +1,92 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.food; + +import com.watabou.pixeldungeon.actors.buffs.Barkskin; +import com.watabou.pixeldungeon.actors.buffs.Bleeding; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Cripple; +import com.watabou.pixeldungeon.actors.buffs.Hunger; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.actors.buffs.Weakness; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Random; + +public class FrozenCarpaccio extends Food { + + { + name = "frozen carpaccio"; + image = ItemSpriteSheet.CARPACCIO; + energy = Hunger.STARVING - Hunger.HUNGRY; + } + + @Override + public void execute( Hero hero, String action ) { + + super.execute( hero, action ); + + if (action.equals( AC_EAT )) { + + switch (Random.Int( 5 )) { + case 0: + GLog.i( "You see your hands turn invisible!" ); + Buff.affect( hero, Invisibility.class, Invisibility.DURATION ); + break; + case 1: + GLog.i( "You feel your skin hardens!" ); + Buff.affect( hero, Barkskin.class ).level( hero.HT / 4 ); + break; + case 2: + GLog.i( "Refreshing!" ); + Buff.detach( hero, Poison.class ); + Buff.detach( hero, Cripple.class ); + Buff.detach( hero, Weakness.class ); + Buff.detach( hero, Bleeding.class ); + break; + case 3: + GLog.i( "You feel better!" ); + if (hero.HP < hero.HT) { + hero.HP = Math.min( hero.HP + hero.HT / 4, hero.HT ); + hero.sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); + } + break; + } + } + } + + @Override + public String info() { + return + "It's a piece of frozen raw meat. The only way to eat it is " + + "by cutting thin slices of it. And this way it's suprisingly good."; + } + + public int price() { + return 10 * quantity; + }; + + public static Food cook( MysteryMeat ingredient ) { + FrozenCarpaccio result = new FrozenCarpaccio(); + result.quantity = ingredient.quantity(); + return result; + } +} diff --git a/src/com/watabou/pixeldungeon/items/food/MysteryMeat.java b/src/com/watabou/pixeldungeon/items/food/MysteryMeat.java new file mode 100644 index 0000000000..56ebf3d8b2 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/food/MysteryMeat.java @@ -0,0 +1,77 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.food; + +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.actors.buffs.Hunger; +import com.watabou.pixeldungeon.actors.buffs.Paralysis; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.actors.buffs.Roots; +import com.watabou.pixeldungeon.actors.buffs.Slow; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Random; + +public class MysteryMeat extends Food { + + { + name = "mystery meat"; + image = ItemSpriteSheet.MEAT; + energy = Hunger.STARVING - Hunger.HUNGRY; + message = "That food tasted... strange."; + } + + @Override + public void execute( Hero hero, String action ) { + + super.execute( hero, action ); + + if (action.equals( AC_EAT )) { + + switch (Random.Int( 5 )) { + case 0: + GLog.w( "Oh it's hot!" ); + Buff.affect( hero, Burning.class ).reignite( hero ); + break; + case 1: + GLog.w( "You can't feel your legs!" ); + Buff.prolong( hero, Roots.class, Paralysis.duration( hero ) ); + break; + case 2: + GLog.w( "You are not feeling well." ); + Buff.affect( hero, Poison.class ).set( Poison.durationFactor( hero ) * hero.HT / 2 / Poison.DOT ); + break; + case 3: + GLog.w( "You are stuffed." ); + Buff.prolong( hero, Slow.class, Slow.duration( hero ) ); + break; + } + } + } + + @Override + public String info() { + return "Eat at your own risk!"; + } + + public int price() { + return 5 * quantity; + }; +} diff --git a/src/com/watabou/pixeldungeon/items/food/OverpricedRation.java b/src/com/watabou/pixeldungeon/items/food/OverpricedRation.java new file mode 100644 index 0000000000..4e33d64cef --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/food/OverpricedRation.java @@ -0,0 +1,41 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.food; + +import com.watabou.pixeldungeon.actors.buffs.Hunger; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class OverpricedRation extends Food { + + { + name = "overpriced food ration"; + image = ItemSpriteSheet.OVERPRICED; + energy = Hunger.STARVING - Hunger.HUNGRY; + message = "That food tasted ok."; + } + + @Override + public String info() { + return "It looks exactly like a standard ration of food but smaller."; + } + + @Override + public int price() { + return 20 * quantity; + } +} diff --git a/src/com/watabou/pixeldungeon/items/food/Pasty.java b/src/com/watabou/pixeldungeon/items/food/Pasty.java new file mode 100644 index 0000000000..af0706d841 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/food/Pasty.java @@ -0,0 +1,40 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.food; + +import com.watabou.pixeldungeon.actors.buffs.Hunger; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Pasty extends Food { + + { + name = "pasty"; + image = ItemSpriteSheet.PASTY; + energy = Hunger.STARVING; + } + + @Override + public String info() { + return "This is authentic Cornish pasty with traditional filling of beef and potato."; + } + + @Override + public int price() { + return 20 * quantity; + } +} diff --git a/src/com/watabou/pixeldungeon/items/keys/GoldenKey.java b/src/com/watabou/pixeldungeon/items/keys/GoldenKey.java new file mode 100644 index 0000000000..3a8f4fa458 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/keys/GoldenKey.java @@ -0,0 +1,44 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.keys; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class GoldenKey extends Key { + + { + name = "golden key"; + image = ItemSpriteSheet.GOLDEN_KEY; + } + + public GoldenKey() { + this( 0 ); + } + + public GoldenKey( int depth ) { + super(); + this.depth = depth; + } + + @Override + public String info() { + return + "The notches on this golden key are tiny and intricate. " + + "Maybe it can open some chest lock?"; + } +} diff --git a/src/com/watabou/pixeldungeon/items/keys/IronKey.java b/src/com/watabou/pixeldungeon/items/keys/IronKey.java new file mode 100644 index 0000000000..ccf33147f2 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/keys/IronKey.java @@ -0,0 +1,75 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.keys; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.bags.Bag; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.Utils; + +public class IronKey extends Key { + + private static final String TXT_FROM_DEPTH = "iron key from depth %d"; + + public static int curDepthQunatity = 0; + + { + name = "iron key"; + image = ItemSpriteSheet.IRON_KEY; + } + + public IronKey() { + this( 0 ); + } + + public IronKey( int depth ) { + super(); + this.depth = depth; + } + + @Override + public boolean collect( Bag bag ) { + boolean result = super.collect( bag ); + if (result && depth == Dungeon.depth && Dungeon.hero != null) { + Dungeon.hero.belongings.countIronKeys(); + } + return result; + } + + @Override + public Item detach( Bag bag ) { + Item result = super.detach( bag ); + if (result != null && depth == Dungeon.depth) { + Dungeon.hero.belongings.countIronKeys(); + } + return result; + } + + @Override + public String toString() { + return Utils.format( TXT_FROM_DEPTH, depth ); + } + + @Override + public String info() { + return + "The notches on this ancient iron key are well worn; its leather lanyard " + + "is battered by age. What door might it open?"; + } +} diff --git a/src/com/watabou/pixeldungeon/items/keys/Key.java b/src/com/watabou/pixeldungeon/items/keys/Key.java new file mode 100644 index 0000000000..c1fba7c0ae --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/keys/Key.java @@ -0,0 +1,69 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.keys; + +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.bags.Bag; +import com.watabou.utils.Bundle; + +public class Key extends Item { + + public static final float TIME_TO_UNLOCK = 1f; + + { + stackable = true; + } + + public int depth; + + @Override + public boolean isSimilar( Item item ) { + return item.getClass() == getClass() && ((Key)item).depth == depth; + } + + @Override + public Item detach( Bag container ) { + Key key = (Key)super.detach( container ); + key.depth = depth; + return key; + } + + private static final String DEPTH = "depth"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( DEPTH, depth ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + depth = bundle.getInt( DEPTH ); + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } +} diff --git a/src/com/watabou/pixeldungeon/items/keys/SkeletonKey.java b/src/com/watabou/pixeldungeon/items/keys/SkeletonKey.java new file mode 100644 index 0000000000..95131e4836 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/keys/SkeletonKey.java @@ -0,0 +1,50 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.keys; + +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class SkeletonKey extends Key { + + { + name = "skeleton key"; + image = ItemSpriteSheet.SKELETON_KEY; + stackable = false; + } + + public SkeletonKey() { + this( 0 ); + } + + public SkeletonKey( int depth ) { + super(); + this.depth = depth; + } + + @Override + public boolean isSimilar( Item item ) { + return false; + } + + @Override + public String info() { + return + "This key looks serious: its head is shaped like a skull. Probably it can open some serious door."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/Potion.java b/src/com/watabou/pixeldungeon/items/potions/Potion.java new file mode 100644 index 0000000000..07ed50a741 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/Potion.java @@ -0,0 +1,287 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import java.util.ArrayList; +import java.util.HashSet; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.Splash; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.ItemStatusHandler; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.windows.WndOptions; +import com.watabou.utils.Bundle; + +public class Potion extends Item { + + public static final String AC_DRINK = "DRINK"; + + private static final String TXT_HARMFUL = "Harmful potion!"; + private static final String TXT_BENEFICIAL = "Beneficial potion"; + private static final String TXT_YES = "Yes, I know what I'm doing"; + private static final String TXT_NO = "No, I changed my mind"; + private static final String TXT_R_U_SURE_DRINK = + "Are you sure you want to drink it? In most cases you should throw such potions at your enemies."; + private static final String TXT_R_U_SURE_THROW = + "Are you sure you want to throw it? In most cases it makes sense to drink it."; + + private static final float TIME_TO_DRINK = 1f; + + private static final Class[] potions = { + PotionOfHealing.class, + PotionOfExperience.class, + PotionOfToxicGas.class, + PotionOfLiquidFlame.class, + PotionOfStrength.class, + PotionOfParalyticGas.class, + PotionOfLevitation.class, + PotionOfMindVision.class, + PotionOfPurity.class, + PotionOfInvisibility.class, + PotionOfMight.class, + PotionOfFrost.class + }; + private static final String[] colors = { + "turquoise", "crimson", "azure", "jade", "golden", "magenta", + "charcoal", "ivory", "amber", "bistre", "indigo", "silver"}; + private static final Integer[] images = { + ItemSpriteSheet.POTION_TURQUOISE, + ItemSpriteSheet.POTION_CRIMSON, + ItemSpriteSheet.POTION_AZURE, + ItemSpriteSheet.POTION_JADE, + ItemSpriteSheet.POTION_GOLDEN, + ItemSpriteSheet.POTION_MAGENTA, + ItemSpriteSheet.POTION_CHARCOAL, + ItemSpriteSheet.POTION_IVORY, + ItemSpriteSheet.POTION_AMBER, + ItemSpriteSheet.POTION_BISTRE, + ItemSpriteSheet.POTION_INDIGO, + ItemSpriteSheet.POTION_SILVER}; + + private static ItemStatusHandler handler; + + private String color; + + { + stackable = true; + defaultAction = AC_DRINK; + } + + @SuppressWarnings("unchecked") + public static void initColors() { + handler = new ItemStatusHandler( (Class[])potions, colors, images ); + } + + public static void save( Bundle bundle ) { + handler.save( bundle ); + } + + @SuppressWarnings("unchecked") + public static void restore( Bundle bundle ) { + handler = new ItemStatusHandler( (Class[])potions, colors, images, bundle ); + } + + public Potion() { + super(); + image = handler.image( this ); + color = handler.label( this ); + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( AC_DRINK ); + return actions; + } + + @Override + public void execute( final Hero hero, String action ) { + if (action.equals( AC_DRINK )) { + + if (isKnown() && ( + this instanceof PotionOfLiquidFlame || + this instanceof PotionOfToxicGas || + this instanceof PotionOfParalyticGas)) { + + GameScene.show( + new WndOptions( TXT_HARMFUL, TXT_R_U_SURE_DRINK, TXT_YES, TXT_NO ) { + @Override + protected void onSelect(int index) { + if (index == 0) { + drink( hero ); + } + }; + } + ); + + } else { + drink( hero ); + } + + } else { + + super.execute( hero, action ); + + } + } + + @Override + public void doThrow( final Hero hero ) { + + if (isKnown() && ( + this instanceof PotionOfExperience || + this instanceof PotionOfHealing || + this instanceof PotionOfLevitation || + this instanceof PotionOfMindVision || + this instanceof PotionOfStrength || + this instanceof PotionOfInvisibility || + this instanceof PotionOfMight)) { + + GameScene.show( + new WndOptions( TXT_BENEFICIAL, TXT_R_U_SURE_THROW, TXT_YES, TXT_NO ) { + @Override + protected void onSelect(int index) { + if (index == 0) { + Potion.super.doThrow( hero ); + } + }; + } + ); + + } else { + super.doThrow( hero ); + } + } + + protected void drink( Hero hero ) { + + detach( hero.belongings.backpack ); + + hero.spend( TIME_TO_DRINK ); + hero.busy(); + onThrow( hero.pos ); + + Sample.INSTANCE.play( Assets.SND_DRINK ); + + hero.sprite.operate( hero.pos ); + } + + @Override + protected void onThrow( int cell ) { + if (Dungeon.hero.pos == cell) { + + apply( Dungeon.hero ); + + } else if (Dungeon.level.map[cell] == Terrain.WELL || Level.pit[cell]) { + + super.onThrow( cell ); + + } else { + + shatter( cell ); + + } + } + + protected void apply( Hero hero ) { + shatter( hero.pos ); + } + + protected void shatter( int cell ) { + GLog.i( "The flask shatters and " + color() + " liquid splashes harmlessly" ); + Sample.INSTANCE.play( Assets.SND_SHATTER ); + splash( cell ); + } + + public boolean isKnown() { + return handler.isKnown( this ); + } + + public void setKnown() { + if (!isKnown()) { + handler.know( this ); + } + + Badges.validateAllPotionsIdentified(); + } + + @Override + public Item identify() { + setKnown(); + return this; + } + + protected String color() { + return color; + } + + @Override + public String name() { + return isKnown() ? name : color + " potion"; + } + + @Override + public String info() { + return isKnown() ? + desc() : + "This flask contains a swirling " + color + " liquid. " + + "Who knows what it will do when drunk or thrown?"; + } + + @Override + public boolean isIdentified() { + return isKnown(); + } + + @Override + public boolean isUpgradable() { + return false; + } + + public static HashSet> getKnown() { + return handler.known(); + } + + public static HashSet> getUnknown() { + return handler.unknown(); + } + + public static boolean allKnown() { + return handler.known().size() == potions.length; + } + + protected void splash( int cell ) { + final int color = ItemSprite.pick( image, 8, 10 ); + Splash.at( cell, color, 5 ); + } + + @Override + public int price() { + return 20 * quantity; + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/PotionOfExperience.java b/src/com/watabou/pixeldungeon/items/potions/PotionOfExperience.java new file mode 100644 index 0000000000..2288619331 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/PotionOfExperience.java @@ -0,0 +1,45 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import com.watabou.pixeldungeon.actors.hero.Hero; + +public class PotionOfExperience extends Potion { + + { + name = "Potion of Experience"; + } + + @Override + protected void apply( Hero hero ) { + setKnown(); + hero.earnExp( hero.maxExp() - hero.exp ); + } + + @Override + public String desc() { + return + "The storied experiences of multitudes of battles reduced to liquid form, " + + "this draught will instantly raise your experience level."; + } + + @Override + public int price() { + return isKnown() ? 80 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/PotionOfFrost.java b/src/com/watabou/pixeldungeon/items/potions/PotionOfFrost.java new file mode 100644 index 0000000000..408b918221 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/PotionOfFrost.java @@ -0,0 +1,67 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.blobs.Fire; +import com.watabou.pixeldungeon.actors.blobs.Freezing; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.utils.BArray; +import com.watabou.utils.PathFinder; + +public class PotionOfFrost extends Potion { + + private static final int DISTANCE = 2; + + { + name = "Potion of Frost"; + } + + @Override + protected void shatter( int cell ) { + + PathFinder.buildDistanceMap( cell, BArray.not( Level.losBlocking, null ), DISTANCE ); + + Fire fire = (Fire)Dungeon.level.blobs.get( Fire.class ); + + for (int i=0; i < Level.LENGTH; i++) { + if (PathFinder.distance[i] < Integer.MAX_VALUE) { + Freezing.affect( i, fire ); + } + } + + splash( cell ); + Sample.INSTANCE.play( Assets.SND_SHATTER ); + + setKnown(); + } + + @Override + public String desc() { + return + "Upon exposure to open air this chemical will evaporate into a freezing cloud, causing " + + "any creature that contacts it to be frozen in place unable to act and move."; + } + + @Override + public int price() { + return isKnown() ? 50 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/PotionOfHealing.java b/src/com/watabou/pixeldungeon/items/potions/PotionOfHealing.java new file mode 100644 index 0000000000..aa2e46a782 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/PotionOfHealing.java @@ -0,0 +1,64 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.buffs.Bleeding; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Cripple; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.actors.buffs.Weakness; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.utils.GLog; + +public class PotionOfHealing extends Potion { + + { + name = "Potion of Healing"; + } + + @Override + protected void apply( Hero hero ) { + setKnown(); + heal( Dungeon.hero ); + GLog.p( "Your wounds heal completely." ); + } + + public static void heal( Hero hero ) { + + hero.HP = hero.HT; + Buff.detach( hero, Poison.class ); + Buff.detach( hero, Cripple.class ); + Buff.detach( hero, Weakness.class ); + Buff.detach( hero, Bleeding.class ); + + hero.sprite.emitter().start( Speck.factory( Speck.HEALING ), 0.4f, 4 ); + } + + @Override + public String desc() { + return + "An elixir that will instantly return you to full health and cure poison."; + } + + @Override + public int price() { + return isKnown() ? 30 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/PotionOfInvisibility.java b/src/com/watabou/pixeldungeon/items/potions/PotionOfInvisibility.java new file mode 100644 index 0000000000..5cd804f18b --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/PotionOfInvisibility.java @@ -0,0 +1,65 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.tweeners.AlphaTweener; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.utils.GLog; + +public class PotionOfInvisibility extends Potion { + + private static final float ALPHA = 0.4f; + + { + name = "Potion of Invisibility"; + } + + @Override + protected void apply( Hero hero ) { + setKnown(); + Buff.affect( hero, Invisibility.class, Invisibility.DURATION ); + GLog.i( "You see your hands turn invisible!" ); + Sample.INSTANCE.play( Assets.SND_MELD ); + } + + @Override + public String desc() { + return + "Drinking this potion will render you temporarily invisible. While invisible, " + + "enemies will be unable to see you. Attacking an enemy, as well as using a wand or a scroll " + + "before enemy's eyes, will dispel the effect."; + } + + @Override + public int price() { + return isKnown() ? 40 * quantity : super.price(); + } + + public static void melt( Char ch ) { + if (ch.sprite.parent != null) { + ch.sprite.parent.add( new AlphaTweener( ch.sprite, ALPHA, 0.4f ) ); + } else { + ch.sprite.alpha( ALPHA ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/PotionOfLevitation.java b/src/com/watabou/pixeldungeon/items/potions/PotionOfLevitation.java new file mode 100644 index 0000000000..cc5e9d7bb4 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/PotionOfLevitation.java @@ -0,0 +1,50 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Levitation; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.utils.GLog; + +public class PotionOfLevitation extends Potion { + + { + name = "Potion of Levitation"; + } + + @Override + protected void apply( Hero hero ) { + setKnown(); + Buff.affect( hero, Levitation.class, Levitation.DURATION ); + GLog.i( "You float into the air!" ); + } + + @Override + public String desc() { + return + "Drinking this curious liquid will cause you to hover in the air, " + + "able to drift effortlessly over traps. Flames and gases " + + "fill the air, however, and cannot be bypassed while airborne."; + } + + @Override + public int price() { + return isKnown() ? 35 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/PotionOfLiquidFlame.java b/src/com/watabou/pixeldungeon/items/potions/PotionOfLiquidFlame.java new file mode 100644 index 0000000000..f728124592 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/PotionOfLiquidFlame.java @@ -0,0 +1,55 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.Fire; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class PotionOfLiquidFlame extends Potion { + + { + name = "Potion of Liquid Flame"; + } + + @Override + protected void shatter( int cell ) { + + setKnown(); + + splash( cell ); + Sample.INSTANCE.play( Assets.SND_SHATTER ); + + Fire fire = Blob.seed( cell, 2, Fire.class ); + GameScene.add( fire ); + } + + @Override + public String desc() { + return + "This flask contains an unstable compound which will burst " + + "violently into flame upon exposure to open air."; + } + + @Override + public int price() { + return isKnown() ? 40 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/PotionOfMight.java b/src/com/watabou/pixeldungeon/items/potions/PotionOfMight.java new file mode 100644 index 0000000000..d560a550e1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/PotionOfMight.java @@ -0,0 +1,52 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.utils.GLog; + +public class PotionOfMight extends PotionOfStrength { + + { + name = "Potion of Might"; + } + + @Override + protected void apply( Hero hero ) { + setKnown(); + + hero.STR++; + hero.HT += 5; + hero.HP += 5; + hero.sprite.showStatus( CharSprite.POSITIVE, "+1 str, +5 ht" ); + GLog.p( "Newfound strength surges through your body." ); + } + + @Override + public String desc() { + return + "This powerful liquid will course through your muscles, permanently " + + "increasing your strength by one point and health by five points."; + } + + @Override + public int price() { + return isKnown() ? 200 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/PotionOfMindVision.java b/src/com/watabou/pixeldungeon/items/potions/PotionOfMindVision.java new file mode 100644 index 0000000000..7b155bb368 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/PotionOfMindVision.java @@ -0,0 +1,57 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.MindVision; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.utils.GLog; + +public class PotionOfMindVision extends Potion { + + { + name = "Potion of Mind Vision"; + } + + @Override + protected void apply( Hero hero ) { + setKnown(); + Buff.affect( hero, MindVision.class, MindVision.DURATION ); + Dungeon.observe(); + + if (Dungeon.level.mobs.size() > 0) { + GLog.i( "You can somehow feel the presence of other creatures' minds!" ); + } else { + GLog.i( "You can somehow tell that you are alone on this level at the moment." ); + } + } + + @Override + public String desc() { + return + "After drinking this, your mind will become attuned to the psychic signature " + + "of distant creatures, enabling you to sense biological presences through walls. " + + "Also this potion will permit you to see through nearby walls and doors."; + } + + @Override + public int price() { + return isKnown() ? 35 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/PotionOfParalyticGas.java b/src/com/watabou/pixeldungeon/items/potions/PotionOfParalyticGas.java new file mode 100644 index 0000000000..7678bd2c7e --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/PotionOfParalyticGas.java @@ -0,0 +1,56 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.ParalyticGas; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class PotionOfParalyticGas extends Potion { + + { + name = "Potion of Paralytic Gas"; + } + + @Override + protected void shatter( int cell ) { + + setKnown(); + + splash( cell ); + Sample.INSTANCE.play( Assets.SND_SHATTER ); + + GameScene.add( Blob.seed( cell, 1000, ParalyticGas.class ) ); + } + + @Override + public String desc() { + return + "Upon exposure to open air, the liquid in this flask will vaporize " + + "into a numbing yellow haze. Anyone who inhales the cloud will be paralyzed " + + "instantly, unable to move for some time after the cloud dissipates. This " + + "item can be thrown at distant enemies to catch them within the effect of the gas."; + } + + @Override + public int price() { + return isKnown() ? 40 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/PotionOfPurity.java b/src/com/watabou/pixeldungeon/items/potions/PotionOfPurity.java new file mode 100644 index 0000000000..d0e04ff52f --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/PotionOfPurity.java @@ -0,0 +1,126 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.ParalyticGas; +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.GasesImmunity; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.utils.BArray; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.PathFinder; + +public class PotionOfPurity extends Potion { + + private static final String TXT_FRESHNESS = "You feel uncommon freshness in the air."; + private static final String TXT_NO_SMELL = "You've stopped sensing any smells!"; + + private static final int DISTANCE = 2; + + { + name = "Potion of Purification"; + } + + @Override + protected void shatter( int cell ) { + + PathFinder.buildDistanceMap( cell, BArray.not( Level.losBlocking, null ), DISTANCE ); + + boolean procd = false; + + Blob[] blobs = { + Dungeon.level.blobs.get( ToxicGas.class ), + Dungeon.level.blobs.get( ParalyticGas.class ) + }; + + for (int j=0; j < blobs.length; j++) { + + Blob blob = blobs[j]; + if (blob == null) { + continue; + } + + for (int i=0; i < Level.LENGTH; i++) { + if (PathFinder.distance[i] < Integer.MAX_VALUE) { + + int value = blob.cur[i]; + if (value > 0) { + + blob.cur[i] = 0; + blob.volume -= value; + procd = true; + + CellEmitter.get( i ).burst( Speck.factory( Speck.DISCOVER ), 1 ); + } + + } + } + } + + boolean heroAffected = PathFinder.distance[Dungeon.hero.pos] < Integer.MAX_VALUE; + + if (procd) { + + splash( cell ); + Sample.INSTANCE.play( Assets.SND_SHATTER ); + + setKnown(); + + if (heroAffected) { + GLog.p( TXT_FRESHNESS ); + } + + } else { + + super.shatter( cell ); + + if (heroAffected) { + GLog.i( TXT_FRESHNESS ); + setKnown(); + } + + } + } + + @Override + protected void apply( Hero hero ) { + GLog.w( TXT_NO_SMELL ); + Buff.prolong( hero, GasesImmunity.class, GasesImmunity.DURATION ); + setKnown(); + } + + @Override + public String desc() { + return + "This reagent will quickly neutralize all harmful gases in the area of effect. " + + "Drinking it will give you a temporary immunity to such gases."; + } + + @Override + public int price() { + return isKnown() ? 50 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/PotionOfStrength.java b/src/com/watabou/pixeldungeon/items/potions/PotionOfStrength.java new file mode 100644 index 0000000000..1e0b072b01 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/PotionOfStrength.java @@ -0,0 +1,53 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.utils.GLog; + +public class PotionOfStrength extends Potion { + + { + name = "Potion of Strength"; + } + + @Override + protected void apply( Hero hero ) { + setKnown(); + + hero.STR++; + hero.sprite.showStatus( CharSprite.POSITIVE, "+1 str" ); + GLog.p( "Newfound strength surges through your body." ); + + Badges.validateStrengthAttained(); + } + + @Override + public String desc() { + return + "This powerful liquid will course through your muscles, " + + "permanently increasing your strength by one point."; + } + + @Override + public int price() { + return isKnown() ? 100 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/potions/PotionOfToxicGas.java b/src/com/watabou/pixeldungeon/items/potions/PotionOfToxicGas.java new file mode 100644 index 0000000000..be8a32cab7 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/potions/PotionOfToxicGas.java @@ -0,0 +1,59 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.potions; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class PotionOfToxicGas extends Potion { + + { + name = "Potion of Toxic Gas"; + } + + @Override + protected void shatter( int cell ) { + + setKnown(); + + splash( cell ); + Sample.INSTANCE.play( Assets.SND_SHATTER ); + + ToxicGas gas = Blob.seed( cell, 1000, ToxicGas.class ); + Actor.add( gas ); + GameScene.add( gas ); + } + + @Override + public String desc() { + return + "Uncorking or shattering this pressurized glass will cause " + + "its contents to explode into a deadly cloud of toxic green gas. " + + "You might choose to fling this potion at distant enemies " + + "instead of uncorking it by hand."; + } + + @Override + public int price() { + return isKnown() ? 40 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/quest/CorpseDust.java b/src/com/watabou/pixeldungeon/items/quest/CorpseDust.java new file mode 100644 index 0000000000..be30f17477 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/quest/CorpseDust.java @@ -0,0 +1,51 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.quest; + +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class CorpseDust extends Item { + + { + name = "corpse dust"; + image = ItemSpriteSheet.DUST; + + cursed = true; + cursedKnown = true; + + unique = true; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public String info() { + return + "The ball of corpse dust doesn't differ outwardly from a regular dust ball. However, " + + "you know somehow that it's better to get rid of it as soon as possible."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/quest/DarkGold.java b/src/com/watabou/pixeldungeon/items/quest/DarkGold.java new file mode 100644 index 0000000000..ef94c85a97 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/quest/DarkGold.java @@ -0,0 +1,54 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.quest; + +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class DarkGold extends Item { + + { + name = "dark gold ore"; + image = ItemSpriteSheet.ORE; + + stackable = true; + unique = true; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public String info() { + return + "This metal is called dark not because of its color (it doesn't differ from the normal gold), " + + "but because it melts under the daylight, making it useless on the surface."; + } + + @Override + public int price() { + return quantity; + } +} diff --git a/src/com/watabou/pixeldungeon/items/quest/DriedRose.java b/src/com/watabou/pixeldungeon/items/quest/DriedRose.java new file mode 100644 index 0000000000..be751a5c2d --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/quest/DriedRose.java @@ -0,0 +1,47 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.quest; + +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class DriedRose extends Item { + + { + name = "dried rose"; + image = ItemSpriteSheet.ROSE; + + unique = true; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public String info() { + return + "The rose has dried long ago, but it has kept all its petals somehow."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/quest/DwarfToken.java b/src/com/watabou/pixeldungeon/items/quest/DwarfToken.java new file mode 100644 index 0000000000..3ab8873472 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/quest/DwarfToken.java @@ -0,0 +1,54 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.quest; + +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class DwarfToken extends Item { + + { + name = "dwarf token"; + image = ItemSpriteSheet.TOKEN; + + stackable = true; + unique = true; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public String info() { + return + "Many dwarves and some of their larger creations carry these small pieces of metal of unknown purpose. " + + "Maybe they are jewelry or maybe some kind of ID. Dwarves are strange folk."; + } + + @Override + public int price() { + return quantity * 100; + } +} diff --git a/src/com/watabou/pixeldungeon/items/quest/Pickaxe.java b/src/com/watabou/pixeldungeon/items/quest/Pickaxe.java new file mode 100644 index 0000000000..03caf593fa --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/quest/Pickaxe.java @@ -0,0 +1,177 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.quest; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Hunger; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.Bat; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Bundle; +import com.watabou.utils.Callback; + +public class Pickaxe extends Weapon { + + public static final String AC_MINE = "MINE"; + + public static final float TIME_TO_MINE = 2; + + private static final String TXT_NO_VEIN = "There is no dark gold vein near you to mine"; + + private static final Glowing BLOODY = new Glowing( 0x550000 ); + + { + name = "pickaxe"; + image = ItemSpriteSheet.PICKAXE; + + unique = true; + + defaultAction = AC_MINE; + + STR = 14; + MIN = 3; + MAX = 12; + } + + public boolean bloodStained = false; + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( AC_MINE ); + return actions; + } + + @Override + public void execute( final Hero hero, String action ) { + + if (action == AC_MINE) { + + if (Dungeon.depth < 11 || Dungeon.depth > 15) { + GLog.w( TXT_NO_VEIN ); + return; + } + + for (int i=0; i < Level.NEIGHBOURS8.length; i++) { + + final int pos = hero.pos + Level.NEIGHBOURS8[i]; + if (Dungeon.level.map[pos] == Terrain.WALL_DECO) { + + hero.spend( TIME_TO_MINE ); + hero.busy(); + + hero.sprite.attack( pos, new Callback() { + + @Override + public void call() { + + CellEmitter.center( pos ).burst( Speck.factory( Speck.STAR ), 7 ); + Sample.INSTANCE.play( Assets.SND_EVOKE ); + + Level.set( pos, Terrain.WALL ); + GameScene.updateMap( pos ); + + DarkGold gold = new DarkGold(); + if (gold.doPickUp( Dungeon.hero )) { + GLog.i( Hero.TXT_YOU_NOW_HAVE, gold.name() ); + } else { + Dungeon.level.drop( gold, hero.pos ).sprite.drop(); + } + + Hunger hunger = hero.buff( Hunger.class ); + if (hunger != null && !hunger.isStarving()) { + hunger.satisfy( -Hunger.STARVING / 10 ); + BuffIndicator.refreshHero(); + } + + hero.onOperateComplete(); + } + } ); + + return; + } + } + + GLog.w( TXT_NO_VEIN ); + + } else { + + super.execute( hero, action ); + + } + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public void proc( Char attacker, Char defender, int damage ) { + if (!bloodStained && defender instanceof Bat && (defender.HP <= damage)) { + bloodStained = true; + updateQuickslot(); + } + } + + private static final String BLOODSTAINED = "bloodStained"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + + bundle.put( BLOODSTAINED, bloodStained ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + + bloodStained = bundle.getBoolean( BLOODSTAINED ); + } + + @Override + public Glowing glowing() { + return bloodStained ? BLOODY : null; + } + + @Override + public String info() { + return + "This is a large and sturdy tool for breaking rocks. Probably it can be used as a weapon."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/quest/RatSkull.java b/src/com/watabou/pixeldungeon/items/quest/RatSkull.java new file mode 100644 index 0000000000..612e0af7fa --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/quest/RatSkull.java @@ -0,0 +1,52 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.quest; + +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class RatSkull extends Item { + + { + name = "giant rat skull"; + image = ItemSpriteSheet.SKULL; + + unique = true; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public String info() { + return + "It could be a nice hunting trophy, but it smells too bad to place it on a wall."; + } + + @Override + public int price() { + return 100; + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/Ring.java b/src/com/watabou/pixeldungeon/items/rings/Ring.java new file mode 100644 index 0000000000..3f54863aff --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/Ring.java @@ -0,0 +1,324 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +import java.util.ArrayList; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.items.EquipableItem; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.ItemStatusHandler; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Ring extends EquipableItem { + + private static final float TIME_TO_EQUIP = 1f; + + private static final String TXT_IDENTIFY = + "you are now familiar enough with your %s to identify it. It is %s."; + + protected Buff buff; + + private static final Class[] rings = { + RingOfMending.class, + RingOfDetection.class, + RingOfShadows.class, + RingOfPower.class, + RingOfHerbalism.class, + RingOfAccuracy.class, + RingOfEvasion.class, + RingOfSatiety.class, + RingOfHaste.class, + RingOfHaggler.class, + RingOfElements.class, + RingOfThorns.class + }; + private static final String[] gems = + {"diamond", "opal", "garnet", "ruby", "amethyst", "topaz", "onyx", "tourmaline", "emerald", "sapphire", "quartz", "agate"}; + private static final Integer[] images = { + ItemSpriteSheet.RING_DIAMOND, + ItemSpriteSheet.RING_OPAL, + ItemSpriteSheet.RING_GARNET, + ItemSpriteSheet.RING_RUBY, + ItemSpriteSheet.RING_AMETHYST, + ItemSpriteSheet.RING_TOPAZ, + ItemSpriteSheet.RING_ONYX, + ItemSpriteSheet.RING_TOURMALINE, + ItemSpriteSheet.RING_EMERALD, + ItemSpriteSheet.RING_SAPPHIRE, + ItemSpriteSheet.RING_QUARTZ, + ItemSpriteSheet.RING_AGATE}; + + private static ItemStatusHandler handler; + + private String gem; + + private int ticksToKnow = 200; + + @SuppressWarnings("unchecked") + public static void initGems() { + handler = new ItemStatusHandler( (Class[])rings, gems, images ); + } + + public static void save( Bundle bundle ) { + handler.save( bundle ); + } + + @SuppressWarnings("unchecked") + public static void restore( Bundle bundle ) { + handler = new ItemStatusHandler( (Class[])rings, gems, images, bundle ); + } + + public Ring() { + super(); + syncGem(); + } + + public void syncGem() { + image = handler.image( this ); + gem = handler.label( this ); + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( isEquipped( hero ) ? AC_UNEQUIP : AC_EQUIP ); + return actions; + } + + @Override + public boolean doEquip( Hero hero ) { + + if (hero.belongings.ring1 != null && hero.belongings.ring2 != null) { + + GLog.w( "you can only wear 2 rings at a time" ); + return false; + + } else { + + if (hero.belongings.ring1 == null) { + hero.belongings.ring1 = this; + } else { + hero.belongings.ring2 = this; + } + + detach( hero.belongings.backpack ); + + activate( hero ); + + cursedKnown = true; + if (cursed) { + equipCursed( hero ); + GLog.n( "your " + this + " tightens around your finger painfully" ); + } + + hero.spendAndNext( TIME_TO_EQUIP ); + return true; + + } + + } + + public void activate( Char ch ) { + buff = buff(); + buff.attachTo( ch ); + } + + @Override + public boolean doUnequip( Hero hero, boolean collect ) { + + if (cursed) { + GLog.w( "You can't remove cursed " + name() + "!" ); + return false; + } + + if (hero.belongings.ring1 == this) { + hero.belongings.ring1 = null; + } else { + hero.belongings.ring2 = null; + } + + hero.remove( buff ); + buff = null; + + hero.spendAndNext( TIME_TO_EQUIP ); + + if (collect && !collect( hero.belongings.backpack )) { + Dungeon.level.drop( this, hero.pos ); + } + + return true; + } + + @Override + public boolean isEquipped( Hero hero ) { + return hero.belongings.ring1 == this || hero.belongings.ring2 == this; + } + + @Override + public Item upgrade() { + + super.upgrade(); + + if (buff != null) { + + Char owner = buff.target; + buff.detach(); + if ((buff = buff()) != null) { + buff.attachTo( owner ); + } + } + + return this; + } + + public boolean isKnown() { + return handler.isKnown( this ); + } + + protected void setKnown() { + if (!isKnown()) { + handler.know( this ); + } + + Badges.validateAllRingsIdentified(); + } + + @Override + public String name() { + return isKnown() ? name : gem + " ring"; + } + + @Override + public String desc() { + return + "This metal band is adorned with a large " + gem + " gem " + + "that glitters in the darkness. Who knows what effect it has when worn?"; + } + + @Override + public String info() { + if (isEquipped( Dungeon.hero )) { + + return desc() + "\n\n" + "The " + name() + " is on your finger" + + (cursed ? ", and because it is cursed, you are powerless to remove it." : "." ); + + } else if (cursed && cursedKnown) { + + return desc() + "\n\nYou can feel a malevolent magic lurking within the " + name() + "."; + + } else { + + return desc(); + + } + } + + @Override + public boolean isIdentified() { + return super.isIdentified() && isKnown(); + } + + @Override + public Item identify() { + setKnown(); + return super.identify(); + } + + @Override + public Item random() { + level = Random.Int( 1, 3 ); + if (Random.Float() < 0.3f) { + level = -level; + cursed = true; + } + return this; + } + + public static boolean allKnown() { + return handler.known().size() == rings.length - 2; + } + + @Override + public int price() { + int price = 80; + if (cursed && cursedKnown) { + price /= 2; + } + if (levelKnown) { + if (level > 0) { + price *= (level + 1); + } else if (level < 0) { + price /= (1 - level); + } + } + if (price < 1) { + price = 1; + } + return price; + } + + protected RingBuff buff() { + return null; + } + + public class RingBuff extends Buff { + + private static final String TXT_KNOWN = "This is a %s"; + + public int level; + public RingBuff() { + level = Ring.this.level; + } + + @Override + public boolean attachTo( Char target ) { + + if (target instanceof Hero && ((Hero)target).heroClass == HeroClass.ROGUE && !isKnown()) { + setKnown(); + GLog.i( TXT_KNOWN, name() ); + Badges.validateItemLevelAquired( Ring.this ); + } + + return super.attachTo(target); + } + + @Override + public boolean act() { + + if (!isIdentified() && --ticksToKnow <= 0) { + String gemName = name(); + identify(); + GLog.w( TXT_IDENTIFY, gemName, Ring.this.toString() ); + Badges.validateItemLevelAquired( Ring.this ); + } + + spend( TICK ); + + return true; + } + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/RingOfAccuracy.java b/src/com/watabou/pixeldungeon/items/rings/RingOfAccuracy.java new file mode 100644 index 0000000000..1fd4799b8f --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/RingOfAccuracy.java @@ -0,0 +1,40 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +public class RingOfAccuracy extends Ring { + + { + name = "Ring of Accuracy"; + } + + @Override + protected RingBuff buff( ) { + return new Accuracy(); + } + + @Override + public String desc() { + return isKnown() ? + "This ring increases your chance to hit the enemy." : + super.desc(); + } + + public class Accuracy extends RingBuff { + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/RingOfDetection.java b/src/com/watabou/pixeldungeon/items/rings/RingOfDetection.java new file mode 100644 index 0000000000..6f54dfa02c --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/RingOfDetection.java @@ -0,0 +1,55 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.Hero; + +public class RingOfDetection extends Ring { + + { + name = "Ring of Detection"; + } + + @Override + public boolean doEquip( Hero hero ) { + if (super.doEquip( hero )) { + Dungeon.hero.search( false ); + return true; + } else { + return false; + } + } + + @Override + protected RingBuff buff( ) { + return new Detection(); + } + + @Override + public String desc() { + return isKnown() ? + "Wearing this ring will allow the wearer to notice hidden secrets - " + + "traps and secret doors - without taking time to search. Degraded rings of detection " + + "will dull your senses, making it harder to notice secrets even when actively searching for them." : + super.desc(); + } + + public class Detection extends RingBuff { + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/RingOfElements.java b/src/com/watabou/pixeldungeon/items/rings/RingOfElements.java new file mode 100644 index 0000000000..bfc8ab1945 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/RingOfElements.java @@ -0,0 +1,77 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +import java.util.HashSet; + +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.actors.mobs.Eye; +import com.watabou.pixeldungeon.actors.mobs.Warlock; +import com.watabou.pixeldungeon.actors.mobs.Yog; +import com.watabou.pixeldungeon.levels.traps.LightningTrap; +import com.watabou.utils.Random; + +public class RingOfElements extends Ring { + + { + name = "Ring of Elements"; + } + + @Override + protected RingBuff buff( ) { + return new Resistance(); + } + + @Override + public String desc() { + return isKnown() ? + "This ring provides resistance to different elements, such as fire, " + + "electricity, gases etc. Also it decreases duration of negative effects." : + super.desc(); + } + + private static final HashSet> EMPTY = new HashSet>(); + private static final HashSet> FULL; + static { + FULL = new HashSet>(); + FULL.add( Burning.class ); + FULL.add( ToxicGas.class ); + FULL.add( Poison.class ); + FULL.add( LightningTrap.Electricity.class ); + FULL.add( Warlock.class ); + FULL.add( Eye.class ); + FULL.add( Yog.BurningFist.class ); + } + + public class Resistance extends RingBuff { + + public HashSet> resistances() { + if (Random.Int( level + 3 ) >= 3) { + return FULL; + } else { + return EMPTY; + } + } + + public float durationFactor() { + return level < 0 ? 1 : (2 + 0.5f * level) / (2 + level); + } + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/RingOfEvasion.java b/src/com/watabou/pixeldungeon/items/rings/RingOfEvasion.java new file mode 100644 index 0000000000..bcdadbc459 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/RingOfEvasion.java @@ -0,0 +1,40 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +public class RingOfEvasion extends Ring { + + { + name = "Ring of Evasion"; + } + + @Override + protected RingBuff buff( ) { + return new Evasion(); + } + + @Override + public String desc() { + return isKnown() ? + "This ring increases your chance to dodge enemy attack." : + super.desc(); + } + + public class Evasion extends RingBuff { + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/RingOfHaggler.java b/src/com/watabou/pixeldungeon/items/rings/RingOfHaggler.java new file mode 100644 index 0000000000..704641f31f --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/RingOfHaggler.java @@ -0,0 +1,68 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Item; + +public class RingOfHaggler extends Ring { + + { + name = "Ring of Haggler"; + } + + @Override + protected RingBuff buff( ) { + return new Haggling(); + } + + @Override + public Item random() { + level = +1; + return this; + } + + @Override + public boolean doPickUp( Hero hero ) { + identify(); + Badges.validateRingOfHaggler(); + Badges.validateItemLevelAquired( this ); + return super.doPickUp(hero); + } + + @Override + public boolean isUpgradable() { + return false; + } + + + @Override + public String desc() { + return isKnown() ? + "In fact this ring doesn't provide any magic effect, but it demonstrates " + + "to shopkeepers and vendors, that the owner of the ring is a member of " + + "The Thieves' Guild. Usually they are glad to give a discount in exchange " + + "for temporary immunity guarantee. Upgrading this ring won't give any additional " + + "bonuses." : + super.desc(); + } + + public class Haggling extends RingBuff { + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/RingOfHaste.java b/src/com/watabou/pixeldungeon/items/rings/RingOfHaste.java new file mode 100644 index 0000000000..26c9afbdbf --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/RingOfHaste.java @@ -0,0 +1,40 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +public class RingOfHaste extends Ring { + + { + name = "Ring of Haste"; + } + + @Override + protected RingBuff buff( ) { + return new Haste(); + } + + @Override + public String desc() { + return isKnown() ? + "This ring accelerates the wearer's flow of time, allowing one to perform all actions a little faster." : + super.desc(); + } + + public class Haste extends RingBuff { + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/RingOfHerbalism.java b/src/com/watabou/pixeldungeon/items/rings/RingOfHerbalism.java new file mode 100644 index 0000000000..4ed07ec84d --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/RingOfHerbalism.java @@ -0,0 +1,40 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +public class RingOfHerbalism extends Ring { + + { + name = "Ring of Herbalism"; + } + + @Override + protected RingBuff buff( ) { + return new Herbalism(); + } + + @Override + public String desc() { + return isKnown() ? + "This ring increases your chance to gather dew and seeds from trampled grass." : + super.desc(); + } + + public class Herbalism extends RingBuff { + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/RingOfMending.java b/src/com/watabou/pixeldungeon/items/rings/RingOfMending.java new file mode 100644 index 0000000000..f1a3490871 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/RingOfMending.java @@ -0,0 +1,42 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +public class RingOfMending extends Ring { + + { + name = "Ring of Mending"; + } + + @Override + protected RingBuff buff( ) { + return new Rejuvenation(); + } + + @Override + public String desc() { + return isKnown() ? + "This ring increases the body's regenerative properties, allowing " + + "one to recover lost health at an accelerated rate. Degraded rings will " + + "decrease or even halt one's natural regeneration." : + super.desc(); + } + + public class Rejuvenation extends RingBuff { + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/RingOfPower.java b/src/com/watabou/pixeldungeon/items/rings/RingOfPower.java new file mode 100644 index 0000000000..372a300d1c --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/RingOfPower.java @@ -0,0 +1,41 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +public class RingOfPower extends Ring { + + { + name = "Ring of Power"; + } + + @Override + protected RingBuff buff( ) { + return new Power(); + } + + @Override + public String desc() { + return isKnown() ? + "Your wands will become more powerful in the energy field " + + "that radiates from this ring. Degraded rings of power will instead weaken your wands." : + super.desc(); + } + + public class Power extends RingBuff { + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/RingOfSatiety.java b/src/com/watabou/pixeldungeon/items/rings/RingOfSatiety.java new file mode 100644 index 0000000000..c2adb20f94 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/RingOfSatiety.java @@ -0,0 +1,40 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +public class RingOfSatiety extends Ring { + + { + name = "Ring of Satiety"; + } + + @Override + protected RingBuff buff( ) { + return new Satiety(); + } + + @Override + public String desc() { + return isKnown() ? + "Wearing this ring you can go without food longer. Degraded rings of satiety will cause the opposite effect." : + super.desc(); + } + + public class Satiety extends RingBuff { + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/RingOfShadows.java b/src/com/watabou/pixeldungeon/items/rings/RingOfShadows.java new file mode 100644 index 0000000000..999f829f19 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/RingOfShadows.java @@ -0,0 +1,41 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +public class RingOfShadows extends Ring { + + { + name = "Ring of Shadows"; + } + + @Override + protected RingBuff buff( ) { + return new Shadows(); + } + + @Override + public String desc() { + return isKnown() ? + "Enemies will be less likely to notice you if you wear this ring. Degraded rings " + + "of shadows will alert enemies who might otherwise not have noticed your presence." : + super.desc(); + } + + public class Shadows extends RingBuff { + } +} diff --git a/src/com/watabou/pixeldungeon/items/rings/RingOfThorns.java b/src/com/watabou/pixeldungeon/items/rings/RingOfThorns.java new file mode 100644 index 0000000000..43bd431fd8 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/rings/RingOfThorns.java @@ -0,0 +1,66 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.rings; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Item; + +public class RingOfThorns extends Ring { + + { + name = "Ring of Thorns"; + } + + @Override + protected RingBuff buff( ) { + return new Thorns(); + } + + @Override + public Item random() { + level = +1; + return this; + } + + @Override + public boolean doPickUp( Hero hero ) { + identify(); + Badges.validateRingOfThorns(); + Badges.validateItemLevelAquired( this ); + return super.doPickUp(hero); + } + + @Override + public boolean isUpgradable() { + return false; + } + + + @Override + public String desc() { + return isKnown() ? + "Though this ring doesn't provide real thorns, an enemy that attacks you " + + "will itself be wounded by a fraction of the damage that it inflicts. " + + "Upgrading this ring won't give any additional bonuses." : + super.desc(); + } + + public class Thorns extends RingBuff { + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/InventoryScroll.java b/src/com/watabou/pixeldungeon/items/scrolls/InventoryScroll.java new file mode 100644 index 0000000000..ec217e1753 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/InventoryScroll.java @@ -0,0 +1,95 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.windows.WndBag; +import com.watabou.pixeldungeon.windows.WndOptions; + +public abstract class InventoryScroll extends Scroll { + + protected String inventoryTitle = "Select an item"; + protected WndBag.Mode mode = WndBag.Mode.ALL; + + private static final String TXT_WARNING = + "Do you really want to cancel this scroll usage? " + + "It will be consumed anyway."; + private static final String TXT_YES = "Yes, I'm positive"; + private static final String TXT_NO = "No, I changed my mind"; + + @Override + protected void doRead() { + + if (!isKnown()) { + setKnown(); + identifiedByUse = true; + } else { + identifiedByUse = false; + } + + GameScene.selectItem( itemSelector, mode, inventoryTitle ); + } + + private void confirmCancelation() { + GameScene.show( new WndOptions( name(), TXT_WARNING, TXT_YES, TXT_NO ) { + @Override + protected void onSelect( int index ) { + switch (index) { + case 0: + curUser.spendAndNext( TIME_TO_READ ); + identifiedByUse = false; + break; + case 1: + GameScene.selectItem( itemSelector, mode, inventoryTitle ); + break; + } + } + public void onBackPressed() {}; + } ); + } + + protected abstract void onItemSelected( Item item ); + + protected static boolean identifiedByUse = false; + protected static WndBag.Listener itemSelector = new WndBag.Listener() { + @Override + public void onSelect( Item item ) { + if (item != null) { + + ((InventoryScroll)curItem).onItemSelected( item ); + curUser.spendAndNext( TIME_TO_READ ); + + Sample.INSTANCE.play( Assets.SND_READ ); + Invisibility.dispel(); + + } else if (identifiedByUse) { + + ((InventoryScroll)curItem).confirmCancelation(); + + } else { + + curItem.collect( curUser.belongings.backpack ); + + } + } + }; +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/Scroll.java b/src/com/watabou/pixeldungeon/items/scrolls/Scroll.java new file mode 100644 index 0000000000..711dac28d2 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/Scroll.java @@ -0,0 +1,184 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import java.util.ArrayList; +import java.util.HashSet; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.buffs.Blindness; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.ItemStatusHandler; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Bundle; + +public abstract class Scroll extends Item { + + private static final String TXT_BLINDED = "You can't read a scroll while blinded"; + + public static final String AC_READ = "READ"; + + protected static final float TIME_TO_READ = 1f; + + private static final Class[] scrolls = { + ScrollOfIdentify.class, + ScrollOfMagicMapping.class, + ScrollOfRecharging.class, + ScrollOfRemoveCurse.class, + ScrollOfTeleportation.class, + ScrollOfUpgrade.class, + ScrollOfChallenge.class, + ScrollOfTerror.class, + ScrollOfLullaby.class, + ScrollOfWeaponUpgrade.class, + ScrollOfPsionicBlast.class, + ScrollOfMirrorImage.class + }; + private static final String[] runes = + {"KAUNAN", "SOWILO", "LAGUZ", "YNGVI", "GYFU", "RAIDO", "ISAZ", "MANNAZ", "NAUDIZ", "BERKANAN", "ODAL", "TIWAZ"}; + private static final Integer[] images = { + ItemSpriteSheet.SCROLL_KAUNAN, + ItemSpriteSheet.SCROLL_SOWILO, + ItemSpriteSheet.SCROLL_LAGUZ, + ItemSpriteSheet.SCROLL_YNGVI, + ItemSpriteSheet.SCROLL_GYFU, + ItemSpriteSheet.SCROLL_RAIDO, + ItemSpriteSheet.SCROLL_ISAZ, + ItemSpriteSheet.SCROLL_MANNAZ, + ItemSpriteSheet.SCROLL_NAUDIZ, + ItemSpriteSheet.SCROLL_BERKANAN, + ItemSpriteSheet.SCROLL_ODAL, + ItemSpriteSheet.SCROLL_TIWAZ}; + + private static ItemStatusHandler handler; + + private String rune; + + { + stackable = true; + defaultAction = AC_READ; + } + + @SuppressWarnings("unchecked") + public static void initLabels() { + handler = new ItemStatusHandler( (Class[])scrolls, runes, images ); + } + + public static void save( Bundle bundle ) { + handler.save( bundle ); + } + + @SuppressWarnings("unchecked") + public static void restore( Bundle bundle ) { + handler = new ItemStatusHandler( (Class[])scrolls, runes, images, bundle ); + } + + public Scroll() { + super(); + image = handler.image( this ); + rune = handler.label( this ); + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( AC_READ ); + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + if (action.equals( AC_READ )) { + + if (hero.buff( Blindness.class ) != null) { + GLog.w( TXT_BLINDED ); + } else { + curUser = hero; + curItem = detach( hero.belongings.backpack ); + doRead(); + } + + } else { + + super.execute( hero, action ); + + } + } + + abstract protected void doRead(); + + public boolean isKnown() { + return handler.isKnown( this ); + } + + public void setKnown() { + if (!isKnown()) { + handler.know( this ); + } + + Badges.validateAllScrollsIdentified(); + } + + @Override + public Item identify() { + setKnown(); + return super.identify(); + } + + @Override + public String name() { + return isKnown() ? name : "scroll \"" + rune + "\""; + } + + @Override + public String info() { + return isKnown() ? + desc() : + "This parchment is covered with indecipherable writing, and bears a title " + + "of rune " + rune + ". Who knows what it will do when read aloud?"; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return isKnown(); + } + + public static HashSet> getKnown() { + return handler.known(); + } + + public static HashSet> getUnknown() { + return handler.unknown(); + } + + public static boolean allKnown() { + return handler.known().size() == scrolls.length; + } + + @Override + public int price() { + return 15 * quantity; + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfChallenge.java b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfChallenge.java new file mode 100644 index 0000000000..b15446ed05 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfChallenge.java @@ -0,0 +1,57 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.utils.GLog; + +public class ScrollOfChallenge extends Scroll { + + { + name = "Scroll of Challenge"; + } + + @Override + protected void doRead() { + + for (Mob mob : Dungeon.level.mobs) { + mob.beckon( curUser.pos ); + } + + GLog.w( "The scroll emits a challenging roar that echoes throughout the dungeon!" ); + setKnown(); + + curUser.sprite.centerEmitter().start( Speck.factory( Speck.SCREAM ), 0.3f, 3 ); + Sample.INSTANCE.play( Assets.SND_CHALLENGE ); + Invisibility.dispel(); + + curUser.spendAndNext( TIME_TO_READ ); + } + + @Override + public String desc() { + return + "When read aloud, this scroll will unleash a challenging roar " + + "that will awaken all monsters and alert them to the reader's location."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfIdentify.java b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfIdentify.java new file mode 100644 index 0000000000..b4c8929de2 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfIdentify.java @@ -0,0 +1,55 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.effects.Identification; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.windows.WndBag; + +public class ScrollOfIdentify extends InventoryScroll { + + { + name = "Scroll of Identify"; + inventoryTitle = "Select an item to identify"; + mode = WndBag.Mode.UNIDENTIFED; + } + + @Override + protected void onItemSelected( Item item ) { + + curUser.sprite.parent.add( new Identification( curUser.sprite.center().offset( 0, -16 ) ) ); + + item.identify(); + GLog.i( "It is " + item ); + + Badges.validateItemLevelAquired( item ); + } + + @Override + public String desc() { + return + "Permanently reveals all of the secrets of a single item."; + } + + @Override + public int price() { + return isKnown() ? 30 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfLullaby.java b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfLullaby.java new file mode 100644 index 0000000000..439fd4d6f9 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfLullaby.java @@ -0,0 +1,82 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.buffs.Sleep; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.utils.GLog; + +public class ScrollOfLullaby extends Scroll { + + { + name = "Scroll of Lullaby"; + } + + @Override + protected void doRead() { + + curUser.sprite.centerEmitter().start( Speck.factory( Speck.NOTE ), 0.3f, 5 ); + Sample.INSTANCE.play( Assets.SND_LULLABY ); + Invisibility.dispel(); + + int count = 0; + Mob affected = null; + for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] )) { + if (Level.fieldOfView[mob.pos]) { + Buff.affect( mob, Sleep.class ); + if (mob.buff( Sleep.class ) != null) { + affected = mob; + count++; + } + } + } + + switch (count) { + case 0: + GLog.i( "The scroll utters a soothing melody." ); + break; + case 1: + GLog.i( "The scroll utters a soothing melody and the " + affected.name + " falls asleep!" ); + break; + default: + GLog.i( "The scroll utters a soothing melody and the monsters fall asleep!" ); + } + setKnown(); + + curUser.spendAndNext( TIME_TO_READ ); + } + + @Override + public String desc() { + return + "A soothing melody will put all creatures in your field of view into a deep sleep, " + + "giving you a chance to flee or make a surprise attack on them."; + } + + @Override + public int price() { + return isKnown() ? 50 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfMagicMapping.java b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfMagicMapping.java new file mode 100644 index 0000000000..540139636a --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfMagicMapping.java @@ -0,0 +1,103 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.SpellSprite; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.utils.GLog; + +public class ScrollOfMagicMapping extends Scroll { + + private static final String TXT_LAYOUT = "You are now aware of the level layout."; + + { + name = "Scroll of Magic Mapping"; + } + + @Override + protected void doRead() { + + int length = Level.LENGTH; + int[] map = Dungeon.level.map; + boolean[] mapped = Dungeon.level.mapped; + boolean[] discoverable = Level.discoverable; + + boolean noticed = false; + + for (int i=0; i < length; i++) { + + int terr = map[i]; + + if (discoverable[i]) { + + mapped[i] = true; + if ((Terrain.flags[terr] & Terrain.SECRET) != 0) { + + Level.set( i, Terrain.discover( terr ) ); + GameScene.updateMap( i ); + + if (Dungeon.visible[i]) { + GameScene.discoverTile( i, terr ); + discover( i ); + + noticed = true; + } + } + } + } + Dungeon.observe(); + + GLog.i( TXT_LAYOUT ); + if (noticed) { + Sample.INSTANCE.play( Assets.SND_SECRET ); + } + + SpellSprite.show( curUser, SpellSprite.MAP ); + Sample.INSTANCE.play( Assets.SND_READ ); + Invisibility.dispel(); + + setKnown(); + + curUser.spendAndNext( TIME_TO_READ ); + } + + @Override + public String desc() { + return + "When this scroll is read, an image of crystal clarity will be etched into your memory, " + + "alerting you to the precise layout of the level and revealing all hidden secrets. " + + "The locations of items and creatures will remain unknown."; + } + + @Override + public int price() { + return isKnown() ? 25 * quantity : super.price(); + } + + public static void discover( int cell ) { + CellEmitter.get( cell ).start( Speck.factory( Speck.DISCOVER ), 0.1f, 4 ); + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfMirrorImage.java b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfMirrorImage.java new file mode 100644 index 0000000000..7048b5af1b --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfMirrorImage.java @@ -0,0 +1,80 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.mobs.npcs.MirrorImage; +import com.watabou.pixeldungeon.items.wands.WandOfBlink; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.Random; + +public class ScrollOfMirrorImage extends Scroll { + + private static final int NIMAGES = 3; + + { + name = "Scroll of Mirror Image"; + } + + @Override + protected void doRead() { + + ArrayList respawnPoints = new ArrayList(); + + for (int i=0; i < Level.NEIGHBOURS8.length; i++) { + int p = curUser.pos + Level.NEIGHBOURS8[i]; + if (Actor.findChar( p ) == null && (Level.passable[p] || Level.avoid[p])) { + respawnPoints.add( p ); + } + } + + int nImages = NIMAGES; + while (nImages > 0 && respawnPoints.size() > 0) { + int index = Random.index( respawnPoints ); + + MirrorImage mob = new MirrorImage(); + mob.duplicate( curUser ); + GameScene.add( mob ); + WandOfBlink.appear( mob, respawnPoints.get( index ) ); + + respawnPoints.remove( index ); + nImages--; + } + + if (nImages < NIMAGES) { + setKnown(); + } + + Sample.INSTANCE.play( Assets.SND_READ ); + Invisibility.dispel(); + + curUser.spendAndNext( TIME_TO_READ ); + } + + @Override + public String desc() { + return + "The incantation on this scroll will create illusionary twins of the reader, which will chase his enemies."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfPsionicBlast.java b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfPsionicBlast.java new file mode 100644 index 0000000000..82c50cdd79 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfPsionicBlast.java @@ -0,0 +1,72 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.buffs.Blindness; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.Random; + +public class ScrollOfPsionicBlast extends Scroll { + + { + name = "Scroll of Psionic Blast"; + } + + @Override + protected void doRead() { + + GameScene.flash( 0xFFFFFF ); + + Sample.INSTANCE.play( Assets.SND_BLAST ); + Invisibility.dispel(); + + for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] )) { + if (Level.fieldOfView[mob.pos]) { + Buff.prolong( mob, Blindness.class, Random.Int( 3, 6 ) ); + mob.damage( Random.IntRange( 1, mob.HT * 2 / 3 ), this ); + } + } + + Buff.prolong( curUser, Blindness.class, Random.Int( 3, 6 ) ); + Dungeon.observe(); + + setKnown(); + + curUser.spendAndNext( TIME_TO_READ ); + } + + @Override + public String desc() { + return + "This scroll contains destructive energy, that can be psionically channeled to inflict a " + + "massive damage to all creatures within a field of view. An accompanying flash of light will " + + "temporarily blind everybody in the area of effect including the reader of the scroll."; + } + + @Override + public int price() { + return isKnown() ? 80 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfRecharging.java b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfRecharging.java new file mode 100644 index 0000000000..c20ca6effe --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfRecharging.java @@ -0,0 +1,69 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.SpellSprite; +import com.watabou.pixeldungeon.effects.particles.EnergyParticle; +import com.watabou.pixeldungeon.utils.GLog; + +public class ScrollOfRecharging extends Scroll { + + { + name = "Scroll of Recharging"; + } + + @Override + protected void doRead() { + + int count = curUser.belongings.charge( true ); + charge( curUser ); + + Sample.INSTANCE.play( Assets.SND_READ ); + Invisibility.dispel(); + + if (count > 0) { + GLog.i( "a surge of energy courses through your pack, recharging your wand" + (count > 1 ? "s" : "") ); + SpellSprite.show( curUser, SpellSprite.CHARGE ); + } else { + GLog.i( "a surge of energy courses through your pack, but nothing happens" ); + } + setKnown(); + + curUser.spendAndNext( TIME_TO_READ ); + } + + @Override + public String desc() { + return + "The raw magical power bound up in this parchment will, when released, " + + "recharge all of the reader's wands to full power."; + } + + public static void charge( Hero hero ) { + hero.sprite.centerEmitter().burst( EnergyParticle.FACTORY, 15 ); + } + + @Override + public int price() { + return isKnown() ? 40 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfRemoveCurse.java b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfRemoveCurse.java new file mode 100644 index 0000000000..93cdd932cc --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfRemoveCurse.java @@ -0,0 +1,98 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.buffs.Weakness; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.Flare; +import com.watabou.pixeldungeon.effects.particles.ShadowParticle; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.utils.GLog; + +public class ScrollOfRemoveCurse extends Scroll { + + private static final String TXT_PROCCED = + "Your pack glows with a cleansing light, and a malevolent energy disperses."; + private static final String TXT_NOT_PROCCED = + "Your pack glows with a cleansing light, but nothing happens."; + + { + name = "Scroll of Remove Curse"; + } + + @Override + protected void doRead() { + + new Flare( 6, 32 ).show( curUser.sprite, 2f ) ; + Sample.INSTANCE.play( Assets.SND_READ ); + Invisibility.dispel(); + + boolean procced = uncurse( curUser, curUser.belongings.backpack.items.toArray( new Item[0] ) ); + procced = uncurse( curUser, + curUser.belongings.weapon, + curUser.belongings.armor, + curUser.belongings.ring1, + curUser.belongings.ring2 ) || procced; + + Weakness.detach( curUser, Weakness.class ); + + if (procced) { + GLog.p( TXT_PROCCED ); + } else { + GLog.i( TXT_NOT_PROCCED ); + } + + setKnown(); + + curUser.spendAndNext( TIME_TO_READ ); + } + + @Override + public String desc() { + return + "The incantation on this scroll will instantly strip from " + + "the reader's weapon, armor, rings and carried items any evil " + + "enchantments that might prevent the wearer from removing them."; + } + + public static boolean uncurse( Hero hero, Item... items ) { + + boolean procced = false; + for (int i=0; i < items.length; i++) { + Item item = items[i]; + if (item != null && item.cursed) { + item.cursed = false; + procced = true; + } + } + + if (procced) { + hero.sprite.emitter().start( ShadowParticle.UP, 0.05f, 10 ); + } + + return procced; + } + + @Override + public int price() { + return isKnown() ? 30 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfTeleportation.java b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfTeleportation.java new file mode 100644 index 0000000000..a0e7df6a21 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfTeleportation.java @@ -0,0 +1,91 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.wands.WandOfBlink; +import com.watabou.pixeldungeon.utils.GLog; + +public class ScrollOfTeleportation extends Scroll { + + public static final String TXT_TELEPORTED = + "In a blink of an eye you were teleported to another location of the level."; + + public static final String TXT_NO_TELEPORT = + "Strong magic aura of this place prevents you from teleporting!"; + + { + name = "Scroll of Teleportation"; + } + + @Override + protected void doRead() { + + Sample.INSTANCE.play( Assets.SND_READ ); + Invisibility.dispel(); + + teleportHero( curUser ); + setKnown(); + + curUser.spendAndNext( TIME_TO_READ ); + } + + public static void teleportHero( Hero hero ) { + + int count = 10; + int pos; + do { + pos = Dungeon.level.randomRespawnCell(); + if (count-- <= 0) { + break; + } + } while (pos == -1); + + if (pos == -1) { + + GLog.w( TXT_NO_TELEPORT ); + + } else { + + WandOfBlink.appear( hero, pos ); + Dungeon.level.press( pos, hero ); + Dungeon.observe(); + + GLog.i( TXT_TELEPORTED ); + + } + } + + @Override + public String desc() { + return + "The spell on this parchment instantly transports the reader " + + "to a random location on the dungeon level. It can be used " + + "to escape a dangerous situation, but the unlucky reader might " + + "find himself in an even more dangerous place."; + } + + @Override + public int price() { + return isKnown() ? 40 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfTerror.java b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfTerror.java new file mode 100644 index 0000000000..71c1b7884a --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfTerror.java @@ -0,0 +1,82 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.buffs.Terror; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.Flare; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.utils.GLog; + +public class ScrollOfTerror extends Scroll { + + { + name = "Scroll of Terror"; + } + + @Override + protected void doRead() { + + new Flare( 5, 32 ).color( 0xFF0000, true ).show( curUser.sprite, 2f ); + Sample.INSTANCE.play( Assets.SND_READ ); + Invisibility.dispel(); + + int count = 0; + Mob affected = null; + for (Mob mob : Dungeon.level.mobs.toArray( new Mob[0] )) { + if (Level.fieldOfView[mob.pos]) { + Terror terror = Buff.affect( mob, Terror.class, Terror.DURATION ); + terror.source = curUser; + + count++; + affected = mob; + } + } + + switch (count) { + case 0: + GLog.i( "The scroll emits a brilliant flash of red light" ); + break; + case 1: + GLog.i( "The scroll emits a brilliant flash of red light and the " + affected.name + " flees!" ); + break; + default: + GLog.i( "The scroll emits a brilliant flash of red light and the monsters flee!" ); + } + setKnown(); + + curUser.spendAndNext( TIME_TO_READ ); + } + + @Override + public String desc() { + return + "A flash of red light will overwhelm all creatures in your field of view with terror, " + + "and they will turn and flee. Attacking a fleeing enemy will dispel the effect."; + } + + @Override + public int price() { + return isKnown() ? 50 * quantity : super.price(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfUpgrade.java b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfUpgrade.java new file mode 100644 index 0000000000..ae6bf8050a --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfUpgrade.java @@ -0,0 +1,64 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.windows.WndBag; + +public class ScrollOfUpgrade extends InventoryScroll { + + private static final String TXT_LOOKS_BETTER = "your %s certainly looks better now"; + + { + name = "Scroll of Upgrade"; + inventoryTitle = "Select an item to upgrade"; + mode = WndBag.Mode.UPGRADEABLE; + } + + @Override + protected void onItemSelected( Item item ) { + + ScrollOfRemoveCurse.uncurse( Dungeon.hero, item ); + item.upgrade(); + + GLog.p( TXT_LOOKS_BETTER, item.name() ); + + Badges.validateItemLevelAquired( item ); + + upgrade( curUser ); + } + + public static void upgrade( Hero hero ) { + hero.sprite.emitter().start( Speck.factory( Speck.UP ), 0.2f, 3 ); + } + + @Override + public String desc() { + return + "This scroll will upgrade a single item, improving its quality. A wand will " + + "increase in power and in number of charges; a weapon will inflict more damage " + + "or find its mark more frequently; a suit of armor will deflect additional blows; " + + "the effect of a ring on its wearer will intensify. Weapons and armor will also " + + "require less strength to use, and any curses on the item will be lifted."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfWeaponUpgrade.java b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfWeaponUpgrade.java new file mode 100644 index 0000000000..2666c1f79a --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/scrolls/ScrollOfWeaponUpgrade.java @@ -0,0 +1,60 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.scrolls; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.windows.WndBag; + +public class ScrollOfWeaponUpgrade extends InventoryScroll { + + private static final String TXT_LOOKS_BETTER = "your %s certainly looks better now"; + + { + name = "Scroll of Weapon Upgrade"; + inventoryTitle = "Select a weapon to upgrade"; + mode = WndBag.Mode.WEAPON; + } + + @Override + protected void onItemSelected( Item item ) { + + Weapon weapon = (Weapon)item; + + ScrollOfRemoveCurse.uncurse( Dungeon.hero, weapon ); + weapon.upgrade( true ); + + GLog.p( TXT_LOOKS_BETTER, weapon.name() ); + + Badges.validateItemLevelAquired( weapon ); + + curUser.sprite.emitter().start( Speck.factory( Speck.UP ), 0.2f, 3 ); + } + + @Override + public String desc() { + return + "This scroll will upgrade a melee weapon, improving its quality. In contrast to a regular Scroll of Upgrade, " + + "this specialized version will never destroy an enchantment on a weapon. On the contrary, it is able to imbue " + + "an unenchanted weapon with a random enchantment."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/Wand.java b/src/com/watabou/pixeldungeon/items/wands/Wand.java new file mode 100644 index 0000000000..4dbb29176c --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/Wand.java @@ -0,0 +1,475 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Invisibility; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.ItemStatusHandler; +import com.watabou.pixeldungeon.items.KindOfWeapon; +import com.watabou.pixeldungeon.items.bags.Bag; +import com.watabou.pixeldungeon.items.rings.RingOfPower.Power; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.scenes.CellSelector; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.ui.QuickSlot; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Bundle; +import com.watabou.utils.Callback; +import com.watabou.utils.Random; + +public abstract class Wand extends KindOfWeapon { + + public static final String AC_ZAP = "ZAP"; + + private static final String TXT_WOOD = "This thin %s wand is warm to the touch. Who knows what it will do when used?"; + private static final String TXT_DAMAGE = "When this wand is used as a melee weapon, its average damage is %d points per hit."; + private static final String TXT_WEAPON = "You can use this wand as a melee weapon."; + + private static final String TXT_FIZZLES = "your wand fizzles; it must be out of charges for now"; + private static final String TXT_SELF_TARGET = "You can't target yourself"; + + private static final float TIME_TO_ZAP = 1f; + + public int maxCharges = initialCharges(); + public int curCharges = maxCharges; + + protected Charger charger; + + private boolean curChargeKnown = false; + + protected boolean hitChars = true; + + private static final Class[] wands = { + WandOfTeleportation.class, + WandOfSlowness.class, + WandOfFirebolt.class, + WandOfPoison.class, + WandOfRegrowth.class, + WandOfBlink.class, + WandOfLightning.class, + WandOfAmok.class, + WandOfTelekinesis.class, + WandOfFlock.class, + WandOfDisintegration.class, + WandOfAvalanche.class + }; + private static final String[] woods = + {"holly", "yew", "ebony", "cherry", "teak", "rowan", "willow", "mahogany", "bamboo", "purpleheart", "oak", "birch"}; + private static final Integer[] images = { + ItemSpriteSheet.WAND_HOLLY, + ItemSpriteSheet.WAND_YEW, + ItemSpriteSheet.WAND_EBONY, + ItemSpriteSheet.WAND_CHERRY, + ItemSpriteSheet.WAND_TEAK, + ItemSpriteSheet.WAND_ROWAN, + ItemSpriteSheet.WAND_WILLOW, + ItemSpriteSheet.WAND_MAHOGANY, + ItemSpriteSheet.WAND_BAMBOO, + ItemSpriteSheet.WAND_PURPLEHEART, + ItemSpriteSheet.WAND_OAK, + ItemSpriteSheet.WAND_BIRCH}; + + private static ItemStatusHandler handler; + + private String wood; + + { + defaultAction = AC_ZAP; + } + + @SuppressWarnings("unchecked") + public static void initWoods() { + handler = new ItemStatusHandler( (Class[])wands, woods, images ); + } + + public static void save( Bundle bundle ) { + handler.save( bundle ); + } + + @SuppressWarnings("unchecked") + public static void restore( Bundle bundle ) { + handler = new ItemStatusHandler( (Class[])wands, woods, images, bundle ); + } + + public Wand() { + super(); + + calculateDamage(); + + try { + image = handler.image( this ); + wood = handler.label( this ); + } catch (Exception e) { + // Wand of Magic Missile + } + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + if (curCharges > 0 || !curChargeKnown) { + actions.add( AC_ZAP ); + } + if (hero.heroClass != HeroClass.MAGE) { + actions.remove( AC_EQUIP ); + actions.remove( AC_UNEQUIP ); + } + return actions; + } + + @Override + public boolean doUnequip( Hero hero, boolean collect ) { + charger.detach(); + return super.doUnequip(hero, collect); + } + + @Override + public void activate( Hero hero ) { + charge( hero ); + } + + @Override + public void execute( Hero hero, String action ) { + if (action.equals( AC_ZAP )) { + + curUser = hero; + curItem = this; + GameScene.selectCell( zapper ); + + } else { + + super.execute( hero, action ); + + } + } + + protected abstract void onZap( int cell ); + + @Override + public boolean collect( Bag container ) { + if (super.collect( container )) { + if (container.owner != null) { + charge( container.owner ); + } + return true; + } else { + return false; + } + }; + + public void charge( Char owner ) { + (charger = new Charger()).attachTo( owner ); + } + + @Override + public Item detach( Bag container ) { + stopCharging(); + return super.detach( container ); + } + + public void stopCharging() { + if (charger != null) { + charger.detach(); + charger = null; + } + } + + public int level() { + if (charger != null) { + Power power = charger.target.buff( Power.class ); + return power == null ? level : Math.max( level + power.level, 0 ); + } else { + return level; + } + } + + protected boolean isKnown() { + return handler.isKnown( this ); + } + + public void setKnown() { + if (!isKnown()) { + handler.know( this ); + } + + Badges.validateAllWandsIdentified(); + } + + @Override + public Item identify() { + + setKnown(); + curChargeKnown = true; + super.identify(); + + updateQuickslot(); + + return this; + } + + @Override + public String toString() { + + StringBuilder sb = new StringBuilder( super.toString() ); + + String status = status(); + if (status != null) { + sb.append( " (" + status + ")" ); + } + + return sb.toString(); + } + + @Override + public String name() { + return isKnown() ? name : wood + " wand"; + } + + @Override + public String info() { + StringBuilder info = new StringBuilder( isKnown() ? desc() : String.format( TXT_WOOD, wood ) ); + if (Dungeon.hero.heroClass == HeroClass.MAGE) { + info.append( "\n\n" ); + if (levelKnown) { + info.append( String.format( TXT_DAMAGE, MIN + (MAX - MIN) / 2 ) ); + } else { + info.append( String.format( TXT_WEAPON ) ); + } + } + return info.toString(); + } + + @Override + public boolean isIdentified() { + return super.isIdentified() && isKnown() && curChargeKnown; + } + + @Override + public String status() { + if (levelKnown) { + return (curChargeKnown ? curCharges : "?") + "/" + maxCharges; + } else { + return null; + } + } + + @Override + public Item upgrade() { + + super.upgrade(); + + updateLevel(); + curCharges = Math.min( curCharges + 1, maxCharges ); + updateQuickslot(); + + return this; + } + + @Override + public Item degrade() { + super.degrade(); + + updateLevel(); + updateQuickslot(); + + return this; + } + + protected void updateLevel() { + maxCharges = Math.min( initialCharges() + level, 9 ); + curCharges = Math.min( curCharges, maxCharges ); + + calculateDamage(); + } + + protected int initialCharges() { + return 2; + } + + private void calculateDamage() { + int tier = 1 + level / 3; + MIN = tier; + MAX = (tier * tier - tier + 10) / 2 + level; + } + + protected void fx( int cell, Callback callback ) { + MagicMissile.blueLight( curUser.sprite.parent, curUser.pos, cell, callback ); + Sample.INSTANCE.play( Assets.SND_ZAP ); + } + + protected void wandUsed() { + curCharges--; + updateQuickslot(); + + curUser.spendAndNext( TIME_TO_ZAP ); + } + + @Override + public Item random() { + if (Random.Float() < 0.5f) { + upgrade(); + if (Random.Float() < 0.15f) { + upgrade(); + } + } + + return this; + } + + public static boolean allKnown() { + return handler.known().size() == wands.length; + } + + @Override + public int price() { + int price = 50; + if (cursed && cursedKnown) { + price /= 2; + } + if (levelKnown) { + if (level > 0) { + price *= (level + 1); + } else if (level < 0) { + price /= (1 - level); + } + } + if (price < 1) { + price = 1; + } + return price; + } + + private static final String MAX_CHARGES = "maxCharges"; + private static final String CUR_CHARGES = "curCharges"; + private static final String CUR_CHARGE_KNOWN = "curChargeKnown"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( MAX_CHARGES, maxCharges ); + bundle.put( CUR_CHARGES, curCharges ); + bundle.put( CUR_CHARGE_KNOWN, curChargeKnown ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + maxCharges = bundle.getInt( MAX_CHARGES ); + curCharges = bundle.getInt( CUR_CHARGES ); + curChargeKnown = bundle.getBoolean( CUR_CHARGE_KNOWN ); + } + + protected static CellSelector.Listener zapper = new CellSelector.Listener() { + + @Override + public void onSelect( Integer target ) { + + if (target != null) { + + if (target == curUser.pos) { + GLog.i( TXT_SELF_TARGET ); + return; + } + + final Wand curWand = (Wand)Wand.curItem; + + curWand.setKnown(); + + final int cell = Ballistica.cast( curUser.pos, target, true, curWand.hitChars ); + curUser.sprite.zap( cell ); + + QuickSlot.target( curItem, Actor.findChar( cell ) ); + + if (curWand.curCharges > 0) { + + curUser.busy(); + + curWand.fx( cell, new Callback() { + @Override + public void call() { + curWand.onZap( cell ); + curWand.wandUsed(); + } + } ); + + Invisibility.dispel(); + + } else { + + curUser.spendAndNext( TIME_TO_ZAP ); + GLog.w( TXT_FIZZLES ); + curWand.levelKnown = true; + + curWand.updateQuickslot(); + } + + } + } + + @Override + public String prompt() { + return "Choose direction to zap"; + } + }; + + protected class Charger extends Buff { + + private static final float TIME_TO_CHARGE = 40f; + + @Override + public boolean attachTo( Char target ) { + super.attachTo( target ); + delay(); + + return true; + } + + @Override + public boolean act() { + + if (curCharges < maxCharges) { + curCharges++; + updateQuickslot(); + } + + delay(); + + return true; + } + + protected void delay() { + float time2charge = ((Hero)target).heroClass == HeroClass.MAGE ? + TIME_TO_CHARGE / (float)Math.sqrt( 1 + level ) : + TIME_TO_CHARGE; + spend( time2charge ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfAmok.java b/src/com/watabou/pixeldungeon/items/wands/WandOfAmok.java new file mode 100644 index 0000000000..b77f27ce73 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfAmok.java @@ -0,0 +1,61 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Amok; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Callback; + +public class WandOfAmok extends Wand { + + { + name = "Wand of Amok"; + } + + @Override + protected void onZap( int cell ) { + Char ch = Actor.findChar( cell ); + if (ch != null) { + + Buff.affect( ch, Amok.class, 3f + level() ); + + } else { + + GLog.i( "nothing happened" ); + + } + } + + protected void fx( int cell, Callback callback ) { + MagicMissile.purpleLight( curUser.sprite.parent, curUser.pos, cell, callback ); + Sample.INSTANCE.play( Assets.SND_ZAP ); + } + + @Override + public String desc() { + return + "The purple light from this wand will make the target run amok " + + "attacking random creatures in its vicinity."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfAvalanche.java b/src/com/watabou/pixeldungeon/items/wands/WandOfAvalanche.java new file mode 100644 index 0000000000..45f98d5d03 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfAvalanche.java @@ -0,0 +1,100 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import com.watabou.noosa.Camera; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Paralysis; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.utils.BArray; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Callback; +import com.watabou.utils.PathFinder; +import com.watabou.utils.Random; + +public class WandOfAvalanche extends Wand { + + { + name = "Wand of Avalanche"; + hitChars = false; + } + + @Override + protected void onZap( int cell ) { + + Sample.INSTANCE.play( Assets.SND_ROCKS ); + + int level = level(); + + Ballistica.distance = Math.min( Ballistica.distance, 8 + level ); + + int size = 1 + level / 3; + PathFinder.buildDistanceMap( cell, BArray.not( Level.solid, null ), size ); + + for (int i=0; i < Level.LENGTH; i++) { + + int d = PathFinder.distance[i]; + + if (d < Integer.MAX_VALUE) { + + Char ch = Actor.findChar( i ); + if (ch != null) { + + ch.sprite.flash(); + + ch.damage( Random.Int( 2, 6 + (size - d) * 2 ), this ); + + if (ch.isAlive() && Random.Int( 2 + d ) == 0) { + Buff.prolong( ch, Paralysis.class, Random.IntRange( 2, 6 ) ); + } + } + + CellEmitter.get( i ).start( Speck.factory( Speck.ROCK ), 0.07f, 3 + (size - d) ); + Camera.main.shake( 3, 0.07f * (3 + (size - d)) ); + } + } + + if (!curUser.isAlive()) { + Dungeon.fail( Utils.format( ResultDescriptions.WAND, name, Dungeon.depth ) ); + GLog.n( "You killed yourself with your own Wand of Avalanche..." ); + } + } + + protected void fx( int cell, Callback callback ) { + MagicMissile.earth( curUser.sprite.parent, curUser.pos, cell, callback ); + Sample.INSTANCE.play( Assets.SND_ZAP ); + } + + @Override + public String desc() { + return + "When a discharge of this wand hits a wall (or any other solid obstacle) it causes " + + "an avalanche of stones, damaging and stunning all creatures in the affected area."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfBlink.java b/src/com/watabou/pixeldungeon/items/wands/WandOfBlink.java new file mode 100644 index 0000000000..1389f81f66 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfBlink.java @@ -0,0 +1,82 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.tweeners.AlphaTweener; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.utils.Callback; + +public class WandOfBlink extends Wand { + + { + name = "Wand of Blink"; + } + + @Override + protected void onZap( int cell ) { + + int level = level(); + + if (Ballistica.distance > level + 4) { + cell = Ballistica.trace[level + 3]; + } else if (Actor.findChar( cell ) != null && Ballistica.distance > 1) { + cell = Ballistica.trace[Ballistica.distance - 2]; + } + + curUser.sprite.visible = true; + appear( Dungeon.hero, cell ); + Dungeon.observe(); + } + + @Override + protected void fx( int cell, Callback callback ) { + MagicMissile.whiteLight( curUser.sprite.parent, curUser.pos, cell, callback ); + Sample.INSTANCE.play( Assets.SND_ZAP ); + curUser.sprite.visible = false; + } + + public static void appear( Char ch, int pos ) { + + ch.sprite.interruptMotion(); + + ch.move( pos ); + ch.sprite.place( pos ); + + if (ch.invisible == 0) { + ch.sprite.alpha( 0 ); + ch.sprite.parent.add( new AlphaTweener( ch.sprite, 1, 0.4f ) ); + } + + ch.sprite.emitter().start( Speck.factory( Speck.LIGHT ), 0.2f, 3 ); + Sample.INSTANCE.play( Assets.SND_TELEPORT ); + } + + @Override + public String desc() { + return + "This wand will allow you to teleport in the chosen direction. " + + "Creatures and inanimate obstructions will block the teleportation."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfDisintegration.java b/src/com/watabou/pixeldungeon/items/wands/WandOfDisintegration.java new file mode 100644 index 0000000000..de315f354e --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfDisintegration.java @@ -0,0 +1,114 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import java.util.ArrayList; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.DeathRay; +import com.watabou.pixeldungeon.effects.particles.PurpleParticle; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.Callback; +import com.watabou.utils.Random; + +public class WandOfDisintegration extends Wand { + + { + name = "Wand of Disintegration"; + hitChars = false; + } + + @Override + protected void onZap( int cell ) { + + boolean terrainAffected = false; + + int level = level(); + + int maxDistance = distance(); + Ballistica.distance = Math.min( Ballistica.distance, maxDistance ); + + ArrayList chars = new ArrayList(); + + for (int i=1; i < Ballistica.distance; i++) { + + int c = Ballistica.trace[i]; + + Char ch; + if ((ch = Actor.findChar( c )) != null) { + chars.add( ch ); + } + + int terr = Dungeon.level.map[c]; + if (terr == Terrain.DOOR || terr == Terrain.BARRICADE) { + + Level.set( c, Terrain.EMBERS ); + GameScene.updateMap( c ); + terrainAffected = true; + + } else if (terr == Terrain.HIGH_GRASS) { + + Level.set( c, Terrain.GRASS ); + GameScene.updateMap( c ); + terrainAffected = true; + + } + + CellEmitter.center( c ).burst( PurpleParticle.BURST, Random.IntRange( 1, 2 ) ); + } + + if (terrainAffected) { + Dungeon.observe(); + } + + int lvl = level + chars.size(); + int dmgMin = lvl; + int dmgMax = 8 + lvl * lvl / 3; + for (Char ch : chars) { + ch.damage( Random.NormalIntRange( dmgMin, dmgMax ), this ); + ch.sprite.centerEmitter().burst( PurpleParticle.BURST, Random.IntRange( 1, 2 ) ); + ch.sprite.flash(); + } + } + + private int distance() { + return level() + 4; + } + + @Override + protected void fx( int cell, Callback callback ) { + + cell = Ballistica.trace[Math.min( Ballistica.distance, distance() ) - 1]; + curUser.sprite.parent.add( new DeathRay( curUser.sprite.center(), DungeonTilemap.tileCenterToWorld( cell ) ) ); + callback.call(); + } + + @Override + public String desc() { + return + "This wand emits a beam of destructive energy, which pierces all creatures in its way. " + + "The more targets it hits, the more damage it inflicts to each of them."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfFirebolt.java b/src/com/watabou/pixeldungeon/items/wands/WandOfFirebolt.java new file mode 100644 index 0000000000..f6b1841c5f --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfFirebolt.java @@ -0,0 +1,86 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.Fire; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.pixeldungeon.effects.particles.FlameParticle; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Callback; +import com.watabou.utils.Random; + +public class WandOfFirebolt extends Wand { + + { + name = "Wand of Firebolt"; + } + + @Override + protected void onZap( int cell ) { + + int level = level(); + + for (int i=1; i < Ballistica.distance - 1; i++) { + int c = Ballistica.trace[i]; + if (Level.flamable[c]) { + GameScene.add( Blob.seed( c, 1, Fire.class ) ); + } + } + + GameScene.add( Blob.seed( cell, 1, Fire.class ) ); + + Char ch = Actor.findChar( cell ); + if (ch != null) { + + ch.damage( Random.Int( 1, 8 + level * level ), this ); + Buff.affect( ch, Burning.class ).reignite( ch ); + + ch.sprite.emitter().burst( FlameParticle.FACTORY, 5 ); + + if (ch == curUser && !ch.isAlive()) { + Dungeon.fail( Utils.format( ResultDescriptions.WAND, name, Dungeon.depth ) ); + GLog.n( "You killed yourself with your own Wand of Firebolt..." ); + } + } + } + + protected void fx( int cell, Callback callback ) { + MagicMissile.fire( curUser.sprite.parent, curUser.pos, cell, callback ); + Sample.INSTANCE.play( Assets.SND_ZAP ); + } + + @Override + public String desc() { + return + "This wand unleashes bursts of magical fire. It will ignite " + + "flammable terrain, and will damage and burn a creature it hits."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfFlock.java b/src/com/watabou/pixeldungeon/items/wands/WandOfFlock.java new file mode 100644 index 0000000000..66f31d5329 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfFlock.java @@ -0,0 +1,151 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.SheepSprite; +import com.watabou.pixeldungeon.utils.BArray; +import com.watabou.utils.Callback; +import com.watabou.utils.PathFinder; +import com.watabou.utils.Random; + +public class WandOfFlock extends Wand { + + { + name = "Wand of Flock"; + } + + @Override + protected void onZap( int cell ) { + + int level = level(); + + int n = level + 2; + + if (Actor.findChar( cell ) != null && Ballistica.distance > 2) { + cell = Ballistica.trace[Ballistica.distance - 2]; + } + + boolean[] passable = BArray.or( Level.passable, Level.avoid, null ); + for (Actor actor : Actor.all()) { + if (actor instanceof Char) { + passable[((Char)actor).pos] = false; + } + } + + PathFinder.buildDistanceMap( cell, passable, n ); + int dist = 0; + + if (Actor.findChar( cell ) != null) { + PathFinder.distance[cell] = Integer.MAX_VALUE; + dist = 1; + } + + float lifespan = level + 3; + + sheepLabel: + for (int i=0; i < n; i++) { + do { + for (int j=0; j < Level.LENGTH; j++) { + if (PathFinder.distance[j] == dist) { + + Sheep sheep = new Sheep(); + sheep.lifespan = lifespan; + sheep.pos = j; + GameScene.add( sheep ); + Dungeon.level.mobPress( sheep ); + + CellEmitter.get( j ).burst( Speck.factory( Speck.WOOL ), 4 ); + + PathFinder.distance[j] = Integer.MAX_VALUE; + + continue sheepLabel; + } + } + dist++; + } while (dist < n); + } + } + + protected void fx( int cell, Callback callback ) { + MagicMissile.wool( curUser.sprite.parent, curUser.pos, cell, callback ); + Sample.INSTANCE.play( Assets.SND_ZAP ); + } + + @Override + public String desc() { + return + "A flick of this wand summons a flock of magic sheep, creating temporary impenetrable obstacle."; + } + + public static class Sheep extends Mob.NPC { + + private static final String[] QUOTES = {"Baa!", "Baa?", "Baa.", "Baa..."}; + + { + name = "sheep"; + spriteClass = SheepSprite.class; + } + + public float lifespan; + + private boolean initialized = false; + + @Override + protected boolean act() { + if (initialized) { + HP = 0; + + destroy(); + sprite.die(); + + } else { + initialized = true; + spend( lifespan + Random.Float( 2 ) ); + } + return true; + } + + @Override + public void damage( int dmg, Object src ) { + } + + @Override + public String description() { + return + "This is a magic sheep. What's so magical about it? You can't kill it. " + + "It will stand there until it magcially fades away, all the while chewing cud with a blank stare."; + } + + @Override + public void interact() { + yell( Random.element( QUOTES ) ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfLightning.java b/src/com/watabou/pixeldungeon/items/wands/WandOfLightning.java new file mode 100644 index 0000000000..21772ebf74 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfLightning.java @@ -0,0 +1,118 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import java.util.ArrayList; +import java.util.HashSet; + +import com.watabou.noosa.Camera; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Lightning; +import com.watabou.pixeldungeon.effects.particles.SparkParticle; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.traps.LightningTrap; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Callback; +import com.watabou.utils.Random; + +public class WandOfLightning extends Wand { + + { + name = "Wand of Lightning"; + } + + private ArrayList affected = new ArrayList(); + + private int[] points = new int[20]; + private int nPoints; + + @Override + protected void onZap( int cell ) { + // The actual effect is processed in "fx" method + + if (!curUser.isAlive()) { + Dungeon.fail( Utils.format( ResultDescriptions.WAND, name, Dungeon.depth ) ); + GLog.n( "You killed yourself with your own Wand of Lightning..." ); + } + } + + private void hit( Char ch, int damage ) { + + if (damage < 1) { + return; + } + + if (ch == Dungeon.hero) { + Camera.main.shake( 2, 0.3f ); + } + + affected.add( ch ); + ch.damage( Level.water[ch.pos] && !ch.flying ? (int)(damage * 2) : damage, LightningTrap.LIGHTNING ); + + ch.sprite.centerEmitter().burst( SparkParticle.FACTORY, 3 ); + ch.sprite.flash(); + + points[nPoints++] = ch.pos; + + HashSet ns = new HashSet(); + for (int i=0; i < Level.NEIGHBOURS8.length; i++) { + Char n = Actor.findChar( ch.pos + Level.NEIGHBOURS8[i] ); + if (n != null && !affected.contains( n )) { + ns.add( n ); + } + } + + if (ns.size() > 0) { + hit( Random.element( ns ), Random.Int( damage / 2, damage ) ); + } + } + + @Override + protected void fx( int cell, Callback callback ) { + + nPoints = 0; + points[nPoints++] = Dungeon.hero.pos; + + Char ch = Actor.findChar( cell ); + if (ch != null) { + + affected.clear(); + int lvl = level(); + hit( ch, Random.Int( 5 + lvl / 2, 10 + lvl ) ); + + } else { + + points[nPoints++] = cell; + CellEmitter.center( cell ).burst( SparkParticle.FACTORY, 3 ); + + } + curUser.sprite.parent.add( new Lightning( points, nPoints, callback ) ); + } + + @Override + public String desc() { + return + "This wand conjures forth deadly arcs of electricity, which deal damage " + + "to several creatures standing close to each other."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfMagicMissile.java b/src/com/watabou/pixeldungeon/items/wands/WandOfMagicMissile.java new file mode 100644 index 0000000000..0858ce4e11 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfMagicMissile.java @@ -0,0 +1,153 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfUpgrade; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.pixeldungeon.windows.WndBag; +import com.watabou.utils.Random; + +public class WandOfMagicMissile extends Wand { + + public static final String AC_DISENCHANT = "DISENCHANT"; + + private static final String TXT_SELECT_WAND = "Select a wand to upgrade"; + + private static final String TXT_DISENCHANTED = + "you disenchanted the Wand of Magic Missile and used its essence to upgrade your %s"; + + private static final float TIME_TO_DISENCHANT = 2f; + + private boolean disenchantEquipped; + + { + name = "Wand of Magic Missile"; + image = ItemSpriteSheet.WAND_MAGIC_MISSILE; + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + if (level > 0) { + actions.add( AC_DISENCHANT ); + } + return actions; + } + + @Override + protected void onZap( int cell ) { + + Char ch = Actor.findChar( cell ); + if (ch != null) { + + int level = level(); + + ch.damage( Random.Int( 1, 6 + level * 2 ), this ); + + ch.sprite.burst( 0xFF99CCFF, level / 2 + 2 ); + + if (ch == curUser && !ch.isAlive()) { + Dungeon.fail( Utils.format( ResultDescriptions.WAND, name, Dungeon.depth ) ); + GLog.n( "You killed yourself with your own Wand of Magic Missile..." ); + } + } + } + + @Override + public void execute( Hero hero, String action ) { + if (action.equals( AC_DISENCHANT )) { + + if (hero.belongings.weapon == this) { + disenchantEquipped = true; + hero.belongings.weapon = null; + updateQuickslot(); + } else { + disenchantEquipped = false; + detach( hero.belongings.backpack ); + } + + curUser = hero; + GameScene.selectItem( itemSelector, WndBag.Mode.WAND, TXT_SELECT_WAND ); + + } else { + + super.execute( hero, action ); + + } + } + + @Override + protected boolean isKnown() { + return true; + } + + @Override + public void setKnown() { + } + + protected int initialCharges() { + return 3; + } + + @Override + public String desc() { + return + "This wand launches missiles of pure magical energy, dealing moderate damage to a target creature."; + } + + private final WndBag.Listener itemSelector = new WndBag.Listener() { + @Override + public void onSelect( Item item ) { + if (item != null) { + + Sample.INSTANCE.play( Assets.SND_EVOKE ); + ScrollOfUpgrade.upgrade( curUser ); + evoke( curUser ); + + GLog.w( TXT_DISENCHANTED, item.name() ); + + item.upgrade(); + curUser.spendAndNext( TIME_TO_DISENCHANT ); + + Badges.validateItemLevelAquired( item ); + + } else { + if (disenchantEquipped) { + curUser.belongings.weapon = WandOfMagicMissile.this; + WandOfMagicMissile.this.updateQuickslot(); + } else { + collect( curUser.belongings.backpack ); + } + } + } + }; +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfPoison.java b/src/com/watabou/pixeldungeon/items/wands/WandOfPoison.java new file mode 100644 index 0000000000..902ece037b --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfPoison.java @@ -0,0 +1,63 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Callback; + +public class WandOfPoison extends Wand { + + { + name = "Wand of Poison"; + } + + @Override + protected void onZap( int cell ) { + Char ch = Actor.findChar( cell ); + if (ch != null) { + + Buff.affect( ch, Poison.class ).set( Poison.durationFactor( ch ) * (1 + 2 * (float)Math.pow( 1.5, level() )) ); + + } else { + + GLog.i( "nothing happened" ); + + } + } + + protected void fx( int cell, Callback callback ) { + MagicMissile.poison( curUser.sprite.parent, curUser.pos, cell, callback ); + Sample.INSTANCE.play( Assets.SND_ZAP ); + } + + @Override + public String desc() { + return + "The vile blast of this twisted bit of wood will imbue its target " + + "with a deadly venom. A creature that is poisoned will suffer periodic " + + "damage until the effect ends. The duration of the effect increases " + + "with the level of the staff."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfRegrowth.java b/src/com/watabou/pixeldungeon/items/wands/WandOfRegrowth.java new file mode 100644 index 0000000000..cedf5ab259 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfRegrowth.java @@ -0,0 +1,80 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.Regrowth; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Callback; + +public class WandOfRegrowth extends Wand { + + { + name = "Wand of Regrowth"; + } + + @Override + protected void onZap( int cell ) { + + for (int i=1; i < Ballistica.distance-1; i++) { + int p = Ballistica.trace[i]; + int c = Dungeon.level.map[p]; + if (c == Terrain.EMPTY || + c == Terrain.EMBERS || + c == Terrain.EMPTY_DECO) { + + Level.set( p, Terrain.GRASS ); + + } + } + + int c = Dungeon.level.map[cell]; + if (c == Terrain.EMPTY || + c == Terrain.EMBERS || + c == Terrain.EMPTY_DECO || + c == Terrain.GRASS || + c == Terrain.HIGH_GRASS) { + + GameScene.add( Blob.seed( cell, (level() + 2) * 20, Regrowth.class ) ); + + } else { + + GLog.i( "nothing happened" ); + + } + } + + protected void fx( int cell, Callback callback ) { + MagicMissile.foliage( curUser.sprite.parent, curUser.pos, cell, callback ); + Sample.INSTANCE.play( Assets.SND_ZAP ); + } + + @Override + public String desc() { + return + "\"When life ceases new life always begins to grow... The eternal cycle always remains!\""; + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfSlowness.java b/src/com/watabou/pixeldungeon/items/wands/WandOfSlowness.java new file mode 100644 index 0000000000..80f1104aa5 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfSlowness.java @@ -0,0 +1,61 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Slow; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Callback; + +public class WandOfSlowness extends Wand { + + { + name = "Wand of Slowness"; + } + + @Override + protected void onZap( int cell ) { + Char ch = Actor.findChar( cell ); + if (ch != null) { + + Buff.affect( ch, Slow.class, Slow.duration( ch ) / 3 + level() ); + + } else { + + GLog.i( "nothing happened" ); + + } + } + + protected void fx( int cell, Callback callback ) { + MagicMissile.slowness( curUser.sprite.parent, curUser.pos, cell, callback ); + Sample.INSTANCE.play( Assets.SND_ZAP ); + } + + @Override + public String desc() { + return + "This wand will cause a creature to move and attack " + + "at half its ordinary speed until the effect ends"; + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfTelekinesis.java b/src/com/watabou/pixeldungeon/items/wands/WandOfTelekinesis.java new file mode 100644 index 0000000000..fd816a4c53 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfTelekinesis.java @@ -0,0 +1,170 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.pixeldungeon.effects.Pushing; +import com.watabou.pixeldungeon.items.Dewdrop; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.Heap.Type; +import com.watabou.pixeldungeon.items.potions.PotionOfStrength; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfUpgrade; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.mechanics.Ballistica; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Callback; + +public class WandOfTelekinesis extends Wand { + + private static final String TXT_YOU_NOW_HAVE = "You have magically transported %s into your backpack"; + + { + name = "Wand of Telekinesis"; + hitChars = false; + } + + @Override + protected void onZap( int cell ) { + + boolean mapUpdated = false; + + int maxDistance = level() + 4; + Ballistica.distance = Math.min( Ballistica.distance, maxDistance ); + + Char ch; + Heap heap = null; + + for (int i=1; i < Ballistica.distance; i++) { + + int c = Ballistica.trace[i]; + + int before = Dungeon.level.map[c]; + + if ((ch = Actor.findChar( c )) != null) { + + if (i == Ballistica.distance-1) { + + ch.damage( maxDistance-1 - i, this ); + + } else { + + int next = Ballistica.trace[i + 1]; + if ((Level.passable[next] || Level.avoid[next]) && Actor.findChar( next ) == null) { + + Actor.addDelayed( new Pushing( ch, ch.pos, next ), -1 ); + + ch.pos = next; + Actor.freeCell( next ); + + // Refactoring needed! + if (ch instanceof Mob) { + Dungeon.level.mobPress( (Mob)ch ); + } else { + Dungeon.level.press( ch.pos, ch ); + } + + } else { + + ch.damage( maxDistance-1 - i, this ); + + } + } + } + + if (heap == null && (heap = Dungeon.level.heaps.get( c )) != null) { + switch (heap.type) { + case HEAP: + transport( heap ); + break; + case CHEST: + open( heap ); + break; + default: + } + } + + Dungeon.level.press( c, null ); + if (before == Terrain.OPEN_DOOR && Actor.findChar( c ) == null) { + + Level.set( c, Terrain.DOOR ); + GameScene.updateMap( c ); + + } else if (Level.water[c]) { + + GameScene.ripple( c ); + + } + + if (!mapUpdated && Dungeon.level.map[c] != before) { + mapUpdated = true; + } + } + + if (mapUpdated) { + Dungeon.observe(); + } + } + + private void transport( Heap heap ) { + Item item = heap.pickUp(); + if (item.doPickUp( curUser )) { + + if (item instanceof Dewdrop) { + + } else { + + if ((item instanceof ScrollOfUpgrade && ((ScrollOfUpgrade)item).isKnown()) || + (item instanceof PotionOfStrength && ((PotionOfStrength)item).isKnown())) { + GLog.p( TXT_YOU_NOW_HAVE, item.name() ); + } else { + GLog.i( TXT_YOU_NOW_HAVE, item.name() ); + } + } + + } else { + Dungeon.level.drop( item, curUser.pos ).sprite.drop(); + } + } + + private void open( Heap heap ) { + heap.type = Type.HEAP; + heap.sprite.link(); + heap.sprite.drop(); + } + + protected void fx( int cell, Callback callback ) { + MagicMissile.force( curUser.sprite.parent, curUser.pos, cell, callback ); + Sample.INSTANCE.play( Assets.SND_ZAP ); + } + + @Override + public String desc() { + return + "Waves of magic force from this wand will affect all cells on their way triggering traps, trampling high vegetation, " + + "opening closed doors and closing open ones. They also push back monsters."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/wands/WandOfTeleportation.java b/src/com/watabou/pixeldungeon/items/wands/WandOfTeleportation.java new file mode 100644 index 0000000000..889d637aa6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/wands/WandOfTeleportation.java @@ -0,0 +1,88 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.wands; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfTeleportation; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Callback; + +public class WandOfTeleportation extends Wand { + + { + name = "Wand of Teleportation"; + } + + @Override + protected void onZap( int cell ) { + + Char ch = Actor.findChar( cell ); + + if (ch == curUser) { + + setKnown(); + ScrollOfTeleportation.teleportHero( curUser ); + + } else if (ch != null) { + + int count = 10; + int pos; + do { + pos = Dungeon.level.randomRespawnCell(); + if (count-- <= 0) { + break; + } + } while (pos == -1); + + if (pos == -1) { + + GLog.w( ScrollOfTeleportation.TXT_NO_TELEPORT ); + + } else { + + ch.pos = pos; + ch.sprite.place( ch.pos ); + ch.sprite.visible = Dungeon.visible[pos]; + GLog.i( curUser.name + " teleported " + ch.name + " to somewhere" ); + + } + + } else { + + GLog.i( "nothing happened" ); + + } + } + + protected void fx( int cell, Callback callback ) { + MagicMissile.coldLight( curUser.sprite.parent, curUser.pos, cell, callback ); + Sample.INSTANCE.play( Assets.SND_ZAP ); + } + + @Override + public String desc() { + return + "A blast from this wand will teleport a creature against " + + "its will to a random place on the current level."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/Weapon.java b/src/com/watabou/pixeldungeon/items/weapon/Weapon.java new file mode 100644 index 0000000000..9dc7275a1c --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/Weapon.java @@ -0,0 +1,221 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.KindOfWeapon; +import com.watabou.pixeldungeon.items.weapon.enchantments.*; +import com.watabou.pixeldungeon.items.weapon.missiles.MissileWeapon; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Weapon extends KindOfWeapon { + + private static final String TXT_IDENTIFY = + "You are now familiar enough with your %s to identify it. It is %s."; + private static final String TXT_INCOMPATIBLE = + "Interaction of different types of magic has negated the enchantment on this weapon!"; + private static final String TXT_TO_STRING = "%s :%d"; + + public int STR = 10; + public float ACU = 1; // Accuracy modifier + public float DLY = 1f; // Speed modifier + + private int hitsToKnow = 20; + + protected Enchantment enchantment; + + @Override + public void proc( Char attacker, Char defender, int damage ) { + + if (enchantment != null) { + enchantment.proc( this, attacker, defender, damage ); + } + + if (!levelKnown) { + if (--hitsToKnow <= 0) { + levelKnown = true; + GLog.i( TXT_IDENTIFY, name(), toString() ); + Badges.validateItemLevelAquired( this ); + } + } + } + + private static final String ENCHANTMENT = "enchantment"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( ENCHANTMENT, enchantment ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + enchantment = (Enchantment)bundle.get( ENCHANTMENT ); + } + + @Override + public float acuracyFactor( Hero hero ) { + + int encumbrance = STR - hero.STR(); + + if (this instanceof MissileWeapon) { + switch (hero.heroClass) { + case WARRIOR: + encumbrance += 3; + break; + case HUNTRESS: + encumbrance -= 2; + break; + default: + } + } + + return encumbrance > 0 ? (float)(ACU / Math.pow( 1.5, encumbrance )) : ACU; + } + + @Override + public float speedFactor( Hero hero ) { + + int encumrance = STR - hero.STR(); + if (this instanceof MissileWeapon && hero.heroClass == HeroClass.HUNTRESS) { + encumrance -= 2; + } + + return encumrance > 0 ? (float)(DLY * Math.pow( 1.2, encumrance )) : DLY; + } + + @Override + public int damageRoll( Hero hero ) { + + int damage = super.damageRoll( hero ); + + if (hero.usingRanged == (hero.heroClass == HeroClass.HUNTRESS)) { + int exStr = hero.STR() - STR; + if (exStr > 0) { + damage += Random.IntRange( 0, exStr ); + } + } + + return damage; + } + + public Item upgrade( boolean enchant ) { + if (enchantment != null) { + if (!enchant && Random.Int( level ) > 0) { + GLog.w( TXT_INCOMPATIBLE ); + enchant( null ); + } + } else { + if (enchant) { + enchant( Enchantment.random() ); + } + } + + return super.upgrade(); + } + + @Override + public String toString() { + return levelKnown ? Utils.format( TXT_TO_STRING, super.toString(), STR ) : super.toString(); + } + + @Override + public String name() { + return enchantment == null ? super.name() : enchantment.name( super.name() ); + } + + @Override + public Item random() { + if (Random.Float() < 0.4) { + int n = 1; + if (Random.Int( 3 ) == 0) { + n++; + if (Random.Int( 3 ) == 0) { + n++; + } + } + if (Random.Int( 2 ) == 0) { + upgrade( n ); + } else { + degrade( n ); + cursed = true; + } + } + return this; + } + + public Weapon enchant( Enchantment ench ) { + this.enchantment = ench; + return this; + } + + public boolean isEnchanted() { + return enchantment != null; + } + + @Override + public ItemSprite.Glowing glowing() { + return enchantment != null ? enchantment.glowing() : null; + } + + public static abstract class Enchantment implements Bundlable { + + private static final Class[] enchants = new Class[]{ + Fire.class, Poison.class, Death.class, Paralysis.class, Leech.class, + Slow.class, Swing.class, Piercing.class, Instability.class, Horror.class, Luck.class }; + private static final float[] chances= new float[]{ 10, 10, 1, 2, 1, 2, 3, 3, 3, 2, 2 }; + + public abstract boolean proc( Weapon weapon, Char attacker, Char defender, int damage ); + + public String name( String weaponName ) { + return weaponName; + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + } + + @Override + public void storeInBundle( Bundle bundle ) { + } + + public ItemSprite.Glowing glowing() { + return ItemSprite.Glowing.WHITE; + } + + @SuppressWarnings("unchecked") + public static Enchantment random() { + try { + return ((Class)enchants[ Random.chances( chances ) ]).newInstance(); + } catch (Exception e) { + return null; + } + } + + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/enchantments/Death.java b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Death.java new file mode 100644 index 0000000000..4aad905ea8 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Death.java @@ -0,0 +1,70 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.enchantments; + +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.particles.ShadowParticle; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class Death extends Weapon.Enchantment { + + private static final String TXT_GRIM = "Grim %s"; + + private static ItemSprite.Glowing BLACK = new ItemSprite.Glowing( 0x000000 ); + + @Override + public boolean proc( Weapon weapon, Char attacker, Char defender, int damage ) { + // lvl 0 - 8% + // lvl 1 ~ 9% + // lvl 2 ~ 10% + int level = Math.max( 0, weapon.level ); + + if (Random.Int( level + 100 ) >= 92) { + + defender.damage( defender.HP, this ); + defender.sprite.emitter().burst( ShadowParticle.UP, 5 ); + + if (!defender.isAlive() && attacker instanceof Hero) { + Badges.validateGrimWeapon(); + } + + return true; + + } else { + + return false; + + } + } + + @Override + public Glowing glowing() { + return BLACK; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_GRIM, weaponName ); + } + +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/enchantments/Fire.java b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Fire.java new file mode 100644 index 0000000000..24184208bb --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Fire.java @@ -0,0 +1,70 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.enchantments; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.effects.particles.FlameParticle; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class Fire extends Weapon.Enchantment { + + private static final String TXT_BLAZING = "Blazing %s"; + + private static ItemSprite.Glowing ORANGE = new ItemSprite.Glowing( 0xFF4400 ); + + @Override + public boolean proc( Weapon weapon, Char attacker, Char defender, int damage ) { + // lvl 0 - 33% + // lvl 1 - 50% + // lvl 2 - 60% + int level = Math.max( 0, weapon.level ); + + if (Random.Int( level + 3 ) >= 2) { + + if (Random.Int( 2 ) == 0) { + Buff.affect( defender, Burning.class ).reignite( defender ); + } + defender.damage( Random.Int( 1, level + 2 ), this ); + + defender.sprite.emitter().burst( FlameParticle.FACTORY, level + 1 ); + + return true; + + } else { + + return false; + + } + } + + @Override + public Glowing glowing() { + return ORANGE; + } + + @Override + public String name( String weaponName ) { + return String.format( TXT_BLAZING, weaponName ); + } + +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/enchantments/Horror.java b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Horror.java new file mode 100644 index 0000000000..7e1322c332 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Horror.java @@ -0,0 +1,62 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.enchantments; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Terror; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class Horror extends Weapon.Enchantment { + + private static final String TXT_ELDRITCH = "Eldritch %s"; + + private static ItemSprite.Glowing GREY = new ItemSprite.Glowing( 0x222222 ); + + @Override + public boolean proc( Weapon weapon, Char attacker, Char defender, int damage ) { + // lvl 0 - 20% + // lvl 1 - 33% + // lvl 2 - 43% + int level = Math.max( 0, weapon.level ); + + if (Random.Int( level + 5 ) >= 4) { + + Terror terror = Buff.affect( defender, Terror.class, Terror.DURATION ); + terror.source = attacker; + + return true; + } else { + return false; + } + } + + @Override + public Glowing glowing() { + return GREY; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_ELDRITCH, weaponName ); + } + +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/enchantments/Instability.java b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Instability.java new file mode 100644 index 0000000000..f728b44b31 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Instability.java @@ -0,0 +1,45 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.enchantments; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.items.weapon.Weapon.Enchantment; +import com.watabou.pixeldungeon.items.weapon.missiles.Boomerang; + +public class Instability extends Weapon.Enchantment { + + private static final String TXT_UNSTABLE = "Unstable %s"; + + @Override + public boolean proc( Weapon weapon, Char attacker, Char defender, int damage ) { + Enchantment ench = random(); + if (weapon instanceof Boomerang) { + while (ench instanceof Piercing || ench instanceof Swing) { + ench = Enchantment.random(); + } + } + return ench.proc( weapon, attacker, defender, damage ); + } + + @Override + public String name( String weaponName) { + return String.format( TXT_UNSTABLE, weaponName ); + } + +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/enchantments/Leech.java b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Leech.java new file mode 100644 index 0000000000..9fca84de06 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Leech.java @@ -0,0 +1,68 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.enchantments; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class Leech extends Weapon.Enchantment { + + private static final String TXT_VAMPIRIC = "Vampiric %s"; + + private static ItemSprite.Glowing RED = new ItemSprite.Glowing( 0x660022 ); + + @Override + public boolean proc( Weapon weapon, Char attacker, Char defender, int damage ) { + + int level = Math.max( 0, weapon.level ); + + // lvl 0 - 33% + // lvl 1 - 43% + // lvl 2 - 50% + int maxValue = damage * (level + 2) / (level + 6); + int effValue = Math.min( Random.IntRange( 0, maxValue ), attacker.HT - attacker.HP ); + + if (effValue > 0) { + + attacker.HP += effValue; + attacker.sprite.emitter().start( Speck.factory( Speck.HEALING ), 0.4f, 1 ); + attacker.sprite.showStatus( CharSprite.POSITIVE, Integer.toString( effValue ) ); + + return true; + + } else { + return false; + } + } + + @Override + public Glowing glowing() { + return RED; + } + + @Override + public String name( String weaponName ) { + return String.format( TXT_VAMPIRIC, weaponName ); + } + +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/enchantments/Luck.java b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Luck.java new file mode 100644 index 0000000000..0d7e265ac9 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Luck.java @@ -0,0 +1,57 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.enchantments; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; + +public class Luck extends Weapon.Enchantment { + + private static final String TXT_LUCKY = "Lucky %s"; + + private static ItemSprite.Glowing GREEN = new ItemSprite.Glowing( 0x00FF00 ); + + @Override + public boolean proc( Weapon weapon, Char attacker, Char defender, int damage ) { + int level = Math.max( 0, weapon.level ); + + int dmg = damage; + for (int i=1; i <= level+1; i++) { + dmg = Math.max( dmg, attacker.damageRoll() - i ); + } + + if (dmg > damage) { + defender.damage( dmg - damage, this ); + return true; + } else { + return false; + } + } + + @Override + public String name( String weaponName) { + return String.format( TXT_LUCKY, weaponName ); + } + + @Override + public Glowing glowing() { + return GREEN; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/enchantments/Paralysis.java b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Paralysis.java new file mode 100644 index 0000000000..5223a9610d --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Paralysis.java @@ -0,0 +1,61 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.enchantments; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class Paralysis extends Weapon.Enchantment { + + private static final String TXT_STUNNING = "Stunning %s"; + + private static ItemSprite.Glowing YELLOW = new ItemSprite.Glowing( 0xCCAA44 ); + + @Override + public boolean proc( Weapon weapon, Char attacker, Char defender, int damage ) { + // lvl 0 - 13% + // lvl 1 - 22% + // lvl 2 - 30% + int level = Math.max( 0, weapon.level ); + + if (Random.Int( level + 8 ) >= 7) { + + Buff.prolong( defender, com.watabou.pixeldungeon.actors.buffs.Paralysis.class, + Random.Float( 1, 1.5f + level ) ); + + return true; + } else { + return false; + } + } + + @Override + public Glowing glowing() { + return YELLOW; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_STUNNING, weaponName ); + } + +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/enchantments/Piercing.java b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Piercing.java new file mode 100644 index 0000000000..674ded334c --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Piercing.java @@ -0,0 +1,75 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.enchantments; + +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.items.weapon.Weapon.Enchantment; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.utils.Random; + +public class Piercing extends Enchantment { + + private static final String TXT_PIERCING = "Piercing %s"; + + @Override + public boolean proc( Weapon weapon, Char attacker, Char defender, int damage ) { + + int level = Math.max( 0, weapon.level ); + + int maxDamage = (int)(damage * Math.pow( 2, -1d / (level + 1) )); + if (maxDamage >= 1) { + + int d = defender.pos - attacker.pos; + int pos = defender.pos + d; + + do { + + Char ch = Actor.findChar( pos ); + if (ch == null) { + break; + } + + int dr = Random.IntRange( 0, ch.dr() ); + int dmg = Random.Int( 1, maxDamage ); + int effectiveDamage = Math.max( dmg - dr, 0 ); + + ch.damage( effectiveDamage, this ); + + ch.sprite.bloodBurstA( attacker.sprite.center(), effectiveDamage ); + ch.sprite.flash(); + + pos += d; + } while (pos >= 0 && pos < Level.LENGTH); + + return true; + + } else { + + return false; + + } + } + + @Override + public String name( String weaponName) { + return String.format( TXT_PIERCING, weaponName ); + } + +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/enchantments/Poison.java b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Poison.java new file mode 100644 index 0000000000..6d2bb5898d --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Poison.java @@ -0,0 +1,61 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.enchantments; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class Poison extends Weapon.Enchantment { + + private static final String TXT_VENOMOUS = "Venomous %s"; + + private static ItemSprite.Glowing PURPLE = new ItemSprite.Glowing( 0x4400AA ); + + @Override + public boolean proc( Weapon weapon, Char attacker, Char defender, int damage ) { + // lvl 0 - 33% + // lvl 1 - 50% + // lvl 2 - 60% + int level = Math.max( 0, weapon.level ); + + if (Random.Int( level + 3 ) >= 2) { + + Buff.affect( defender, com.watabou.pixeldungeon.actors.buffs.Poison.class ). + set( com.watabou.pixeldungeon.actors.buffs.Poison.durationFactor( defender ) * (level + 1) ); + + return true; + } else { + return false; + } + } + + @Override + public Glowing glowing() { + return PURPLE; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_VENOMOUS, weaponName ); + } + +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/enchantments/Slow.java b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Slow.java new file mode 100644 index 0000000000..b34fefd8fd --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Slow.java @@ -0,0 +1,61 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.enchantments; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite.Glowing; +import com.watabou.utils.Random; + +public class Slow extends Weapon.Enchantment { + + private static final String TXT_CHILLING = "Chilling %s"; + + private static ItemSprite.Glowing BLUE = new ItemSprite.Glowing( 0x0044FF ); + + @Override + public boolean proc( Weapon weapon, Char attacker, Char defender, int damage ) { + // lvl 0 - 25% + // lvl 1 - 40% + // lvl 2 - 50% + int level = Math.max( 0, weapon.level ); + + if (Random.Int( level + 4 ) >= 3) { + + Buff.prolong( defender, com.watabou.pixeldungeon.actors.buffs.Slow.class, + Random.Float( 1, 1.5f + level ) ); + + return true; + } else { + return false; + } + } + + @Override + public Glowing glowing() { + return BLUE; + } + + @Override + public String name( String weaponName) { + return String.format( TXT_CHILLING, weaponName ); + } + +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/enchantments/Swing.java b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Swing.java new file mode 100644 index 0000000000..3719c09883 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/enchantments/Swing.java @@ -0,0 +1,74 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.enchantments; + +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.items.weapon.Weapon.Enchantment; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.utils.Random; + +public class Swing extends Enchantment { + + private static final String TXT_WILD = "Wild %s"; + + @Override + public boolean proc( Weapon weapon, Char attacker, Char defender, int damage ) { + + int level = Math.max( 0, weapon.level ); + + int maxDamage = (int)(damage * Math.pow( 2, -1d / (level + 1) )); + if (maxDamage >= 1) { + + int p = attacker.pos; + int[] neighbours = { + p+1, p-1, p+Level.WIDTH, p-Level.WIDTH, + p+1+Level.WIDTH, p+1-Level.WIDTH, p-1+Level.WIDTH, p-1-Level.WIDTH}; + + for (int n : neighbours) { + Char ch = Actor.findChar( n ); + if (ch != null && ch != defender && ch.isAlive()) { + + int dr = Random.IntRange( 0, ch.dr() ); + int dmg = Random.Int( 1, maxDamage ); + int effectiveDamage = Math.max( dmg - dr, 0 ); + + ch.damage( effectiveDamage, this ); + + ch.sprite.bloodBurstA( attacker.sprite.center(), effectiveDamage ); + ch.sprite.flash(); + + } + } + + return true; + + } else { + + return false; + + } + } + + @Override + public String name( String weaponName) { + return String.format( TXT_WILD, weaponName ); + } + +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/melee/BattleAxe.java b/src/com/watabou/pixeldungeon/items/weapon/melee/BattleAxe.java new file mode 100644 index 0000000000..e658df7a8e --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/melee/BattleAxe.java @@ -0,0 +1,37 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.melee; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class BattleAxe extends MeleeWeapon { + + { + name = "battle axe"; + image = ItemSpriteSheet.BATTLE_AXE; + } + + public BattleAxe() { + super( 4, 1.2f, 1f ); + } + + @Override + public String desc() { + return "The enormous steel head of this battle axe puts considerable heft behind each stroke."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/melee/Dagger.java b/src/com/watabou/pixeldungeon/items/weapon/melee/Dagger.java new file mode 100644 index 0000000000..baab2fd282 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/melee/Dagger.java @@ -0,0 +1,37 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.melee; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Dagger extends MeleeWeapon { + + { + name = "dagger"; + image = ItemSpriteSheet.DAGGER; + } + + public Dagger() { + super( 1, 1.2f, 1f ); + } + + @Override + public String desc() { + return "A simple iron dagger with a well worn wooden handle."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/melee/Glaive.java b/src/com/watabou/pixeldungeon/items/weapon/melee/Glaive.java new file mode 100644 index 0000000000..965855c22c --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/melee/Glaive.java @@ -0,0 +1,37 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.melee; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Glaive extends MeleeWeapon { + + { + name = "glaive"; + image = ItemSpriteSheet.GLAIVE; + } + + public Glaive() { + super( 5, 1f, 1f ); + } + + @Override + public String desc() { + return "A polearm consisting of a sword blade on the end of a pole."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/melee/Knuckles.java b/src/com/watabou/pixeldungeon/items/weapon/melee/Knuckles.java new file mode 100644 index 0000000000..5f0cdf33e9 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/melee/Knuckles.java @@ -0,0 +1,37 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.melee; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Knuckles extends MeleeWeapon { + + { + name = "knuckleduster"; + image = ItemSpriteSheet.KNUCKLEDUSTER; + } + + public Knuckles() { + super( 1, 1f, 0.5f ); + } + + @Override + public String desc() { + return "A piece of iron shaped to fit around the knuckles."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/melee/Longsword.java b/src/com/watabou/pixeldungeon/items/weapon/melee/Longsword.java new file mode 100644 index 0000000000..9ea294590b --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/melee/Longsword.java @@ -0,0 +1,37 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.melee; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Longsword extends MeleeWeapon { + + { + name = "longsword"; + image = ItemSpriteSheet.LONG_SWORD; + } + + public Longsword() { + super( 4, 1f, 1f ); + } + + @Override + public String desc() { + return "This towering blade inflicts heavy damage by investing its heft into every cut."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/melee/Mace.java b/src/com/watabou/pixeldungeon/items/weapon/melee/Mace.java new file mode 100644 index 0000000000..4e4d987175 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/melee/Mace.java @@ -0,0 +1,37 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.melee; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Mace extends MeleeWeapon { + + { + name = "mace"; + image = ItemSpriteSheet.MACE; + } + + public Mace() { + super( 3, 1f, 0.8f ); + } + + @Override + public String desc() { + return "The iron head of this weapon inflicts substantial damage."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/melee/MeleeWeapon.java b/src/com/watabou/pixeldungeon/items/weapon/melee/MeleeWeapon.java new file mode 100644 index 0000000000..13347d3c68 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/melee/MeleeWeapon.java @@ -0,0 +1,184 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.melee; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Random; + +public class MeleeWeapon extends Weapon { + + private int tier; + + public MeleeWeapon( int tier, float acu, float dly ) { + super(); + + this.tier = tier; + + ACU = acu; + DLY = dly; + + STR = typicalSTR(); + + MIN = min(); + MAX = max(); + } + + private int min() { + return tier; + } + + private int max() { + return (int)((tier * tier - tier + 10) / ACU * DLY); + } + + @Override + public Item upgrade() { + return upgrade( false ); + } + + public Item upgrade( boolean enchant ) { + STR--; + MIN++; + MAX += tier; + + return super.upgrade( enchant ); + } + + public Item safeUpgrade() { + return upgrade( enchantment != null ); + } + + @Override + public Item degrade() { + STR++; + MIN--; + MAX -= tier; + return super.degrade(); + } + + public int typicalSTR() { + return 8 + tier * 2; + } + + @Override + public String info() { + + final String p = "\n\n"; + + StringBuilder info = new StringBuilder( desc() ); + + String quality = levelKnown && level != 0 ? (level > 0 ? "upgraded" : "degraded") : ""; + info.append( p ); + info.append( "This " + name + " is " + Utils.indefinite( quality ) ); + info.append( " tier-" + tier + " melee weapon. " ); + + if (levelKnown) { + info.append( "Its average damage is " + (MIN + (MAX - MIN) / 2) + " points per hit. " ); + } else { + info.append( + "Its typical average damage is " + (min() + (max() - min()) / 2) + " points per hit " + + "and usually it requires " + typicalSTR() + " points of strength. " ); + if (typicalSTR() > Dungeon.hero.STR()) { + info.append( "Probably this weapon is too heavy for you. " ); + } + } + + if (DLY != 1f) { + info.append( "This is a rather " + (DLY < 1f ? "fast" : "slow") ); + if (ACU != 1f) { + if ((ACU > 1f) == (DLY < 1f)) { + info.append( " and "); + } else { + info.append( " but "); + } + info.append( ACU > 1f ? "accurate" : "inaccurate" ); + } + info.append( " weapon. "); + } else if (ACU != 1f) { + info.append( "This is a rather " + (ACU > 1f ? "accurate" : "inaccurate") + " weapon. " ); + } + + if (enchantment != null) { + info.append( "It is enchanted." ); + } + + if (levelKnown && Dungeon.hero.belongings.backpack.items.contains( this )) { + if (STR > Dungeon.hero.STR()) { + info.append( p ); + info.append( + "Because of your inadequate strength the accuracy and speed " + + "of your attack with this " + name + " is decreased." ); + } + if (STR < Dungeon.hero.STR()) { + info.append( p ); + info.append( + "Because of your excess strength the damage " + + "of your attack with this " + name + " is increased." ); + } + } + + if (isEquipped( Dungeon.hero )) { + info.append( p ); + info.append( "You hold the " + name + " at the ready" + + (cursed ? ", and because it is cursed, you are powerless to let go." : ".") ); + } else { + if (cursedKnown && cursed) { + info.append( p ); + info.append( "You can feel a malevolent magic lurking within " + name +"." ); + } + } + + return info.toString(); + } + + @Override + public int price() { + int price = 20 * (1 << (tier - 1)); + if (enchantment != null) { + price *= 1.5; + } + if (cursed && cursedKnown) { + price /= 2; + } + if (levelKnown) { + if (level > 0) { + price *= (level + 1); + } else if (level < 0) { + price /= (1 - level); + } + } + if (price < 1) { + price = 1; + } + return price; + } + + @Override + public Item random() { + super.random(); + + if (Random.Int( 10 + level ) == 0) { + enchant( Enchantment.random() ); + } + + return this; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/melee/Quarterstaff.java b/src/com/watabou/pixeldungeon/items/weapon/melee/Quarterstaff.java new file mode 100644 index 0000000000..6458a09a5f --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/melee/Quarterstaff.java @@ -0,0 +1,38 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.melee; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Quarterstaff extends MeleeWeapon { + + { + name = "quarterstaff"; + image = ItemSpriteSheet.QUARTERSTAFF; + } + + public Quarterstaff() { + super( 2, 1f, 1f ); + } + + @Override + public String desc() { + // TODO Auto-generated method stub + return "A staff of hardwood, its ends are shod with iron."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/melee/ShortSword.java b/src/com/watabou/pixeldungeon/items/weapon/melee/ShortSword.java new file mode 100644 index 0000000000..1531b3254d --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/melee/ShortSword.java @@ -0,0 +1,129 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.melee; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfUpgrade; +import com.watabou.pixeldungeon.items.weapon.missiles.Boomerang; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.windows.WndBag; + +public class ShortSword extends MeleeWeapon { + + public static final String AC_REFORGE = "REFORGE"; + + private static final String TXT_SELECT_WEAPON = "Select a weapon to upgrade"; + + private static final String TXT_REFORGED = + "you reforged the short sword to upgrade your %s"; + private static final String TXT_NOT_BOOMERANG = + "you can't upgrade a boomerang this way"; + + private static final float TIME_TO_REFORGE = 2f; + + private boolean equipped; + + { + name = "short sword"; + image = ItemSpriteSheet.SHORT_SWORD; + } + + public ShortSword() { + super( 1, 1f, 1f ); + + STR = 11; + MAX = 12; + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + if (level > 0) { + actions.add( AC_REFORGE ); + } + return actions; + } + + @Override + public void execute( Hero hero, String action ) { + if (action == AC_REFORGE) { + + if (hero.belongings.weapon == this) { + equipped = true; + hero.belongings.weapon = null; + } else { + equipped = false; + detach( hero.belongings.backpack ); + } + + curUser = hero; + + GameScene.selectItem( itemSelector, WndBag.Mode.WEAPON, TXT_SELECT_WEAPON ); + + } else { + + super.execute( hero, action ); + + } + } + + @Override + public String desc() { + return + "It is indeed quite short, just a few inches longer, than a dagger."; + } + + private final WndBag.Listener itemSelector = new WndBag.Listener() { + @Override + public void onSelect( Item item ) { + if (item != null && !(item instanceof Boomerang)) { + + Sample.INSTANCE.play( Assets.SND_EVOKE ); + ScrollOfUpgrade.upgrade( curUser ); + evoke( curUser ); + + GLog.w( TXT_REFORGED, item.name() ); + + ((MeleeWeapon)item).safeUpgrade(); + curUser.spendAndNext( TIME_TO_REFORGE ); + + Badges.validateItemLevelAquired( item ); + + } else { + + if (item instanceof Boomerang) { + GLog.w( TXT_NOT_BOOMERANG ); + } + + if (equipped) { + curUser.belongings.weapon = ShortSword.this; + } else { + collect( curUser.belongings.backpack ); + } + } + } + }; +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/melee/Spear.java b/src/com/watabou/pixeldungeon/items/weapon/melee/Spear.java new file mode 100644 index 0000000000..0a9e711bf6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/melee/Spear.java @@ -0,0 +1,37 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.melee; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Spear extends MeleeWeapon { + + { + name = "spear"; + image = ItemSpriteSheet.SPEAR; + } + + public Spear() { + super( 2, 1f, 1.5f ); + } + + @Override + public String desc() { + return "A slender wooden rod tipped with sharpened iron."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/melee/Sword.java b/src/com/watabou/pixeldungeon/items/weapon/melee/Sword.java new file mode 100644 index 0000000000..14b015f382 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/melee/Sword.java @@ -0,0 +1,37 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.melee; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Sword extends MeleeWeapon { + + { + name = "sword"; + image = ItemSpriteSheet.SWORD; + } + + public Sword() { + super( 3, 1f, 1f ); + } + + @Override + public String desc() { + return "The razor-sharp length of steel blade shines reassuringly."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/melee/WarHammer.java b/src/com/watabou/pixeldungeon/items/weapon/melee/WarHammer.java new file mode 100644 index 0000000000..3a8a3258d7 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/melee/WarHammer.java @@ -0,0 +1,39 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.melee; + +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class WarHammer extends MeleeWeapon { + + { + name = "war hammer"; + image = ItemSpriteSheet.WAR_HAMMER; + } + + public WarHammer() { + super( 5, 1.2f, 1f ); + } + + @Override + public String desc() { + return + "Few creatures can withstand the crushing blow of this towering mass of lead and steel, " + + "but only the strongest of adventurers can use it effectively."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/missiles/Boomerang.java b/src/com/watabou/pixeldungeon/items/weapon/missiles/Boomerang.java new file mode 100644 index 0000000000..4d1bb886c2 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/missiles/Boomerang.java @@ -0,0 +1,106 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.missiles; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.items.weapon.enchantments.Piercing; +import com.watabou.pixeldungeon.items.weapon.enchantments.Swing; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.sprites.MissileSprite; + +public class Boomerang extends MissileWeapon { + + { + name = "boomerang"; + image = ItemSpriteSheet.BOOMERANG; + + STR = 10; + + MIN = 1; + MAX = 4; + + stackable = false; + } + + @Override + public boolean isUpgradable() { + return true; + } + + @Override + public Item upgrade() { + return upgrade( false ); + } + + @Override + public Item upgrade( boolean enchant ) { + MIN += 1; + MAX += 2; + super.upgrade( enchant ); + + updateQuickslot(); + + return this; + } + + @Override + public Item degrade() { + MIN -= 1; + MAX -= 2; + return super.degrade(); + } + + @Override + public Weapon enchant( Enchantment ench ) { + while (ench instanceof Piercing || ench instanceof Swing) { + ench = Enchantment.random(); + } + + return super.enchant( ench ); + } + + @Override + public void proc( Char attacker, Char defender, int damage ) { + super.proc( attacker, defender, damage ); + if (attacker instanceof Hero && ((Hero)attacker).usingRanged) { + circleBack( defender.pos, (Hero)attacker ); + } + } + + @Override + protected void miss( int cell ) { + circleBack( cell, curUser ); + } + + private void circleBack( int from, Hero owner ) { + if (!collect( curUser.belongings.backpack )) { + Dungeon.level.drop( this, owner.pos ).sprite.drop(); + } + ((MissileSprite)curUser.sprite.parent.recycle( MissileSprite.class )). + reset( from, curUser.pos, curItem, null ); + } + + @Override + public String desc() { + return + "Thrown to the enemy this flat curved wooden missile will return to the hands of its thrower."; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/missiles/CurareDart.java b/src/com/watabou/pixeldungeon/items/weapon/missiles/CurareDart.java new file mode 100644 index 0000000000..409be7da68 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/missiles/CurareDart.java @@ -0,0 +1,73 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.missiles; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Paralysis; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class CurareDart extends MissileWeapon { + + public static final float DURATION = 3f; + + { + name = "curare dart"; + image = ItemSpriteSheet.CURARE_DART; + + STR = 14; + + MIN = 1; + MAX = 3; + } + + public CurareDart() { + this( 1 ); + } + + public CurareDart( int number ) { + super(); + quantity = number; + } + + @Override + public void proc( Char attacker, Char defender, int damage ) { + Buff.prolong( defender, Paralysis.class, DURATION ); + super.proc( attacker, defender, damage ); + } + + @Override + public String desc() { + return + "These little evil darts don't do much damage but they can paralyze " + + "the target leaving it helpless and motionless for some time."; + } + + @Override + public Item random() { + quantity = Random.Int( 2, 5 ); + return this; + } + + @Override + public int price() { + return 12 * quantity; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/missiles/Dart.java b/src/com/watabou/pixeldungeon/items/weapon/missiles/Dart.java new file mode 100644 index 0000000000..bebc5790de --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/missiles/Dart.java @@ -0,0 +1,60 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.missiles; + +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class Dart extends MissileWeapon { + + { + name = "dart"; + image = ItemSpriteSheet.DART; + + MIN = 1; + MAX = 4; + } + + public Dart() { + this( 1 ); + } + + public Dart( int number ) { + super(); + quantity = number; + } + + @Override + public String desc() { + return + "These simple metal spikes are weighted to fly true and " + + "sting their prey with a flick of the wrist."; + } + + @Override + public Item random() { + quantity = Random.Int( 5, 15 ); + return this; + } + + @Override + public int price() { + return quantity * 2; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/missiles/IncendiaryDart.java b/src/com/watabou/pixeldungeon/items/weapon/missiles/IncendiaryDart.java new file mode 100644 index 0000000000..d8bbc88c84 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/missiles/IncendiaryDart.java @@ -0,0 +1,93 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.missiles; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.Fire; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Burning; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class IncendiaryDart extends MissileWeapon { + + { + name = "incendiary dart"; + image = ItemSpriteSheet.INCENDIARY_DART; + + STR = 12; + + MIN = 1; + MAX = 2; + } + + public IncendiaryDart() { + this( 1 ); + } + + public IncendiaryDart( int number ) { + super(); + quantity = number; + } + + @Override + protected void onThrow( int cell ) { + Char enemy = Actor.findChar( cell ); + if (enemy == null || enemy == curUser) { + if (Level.flamable[cell]) { + GameScene.add( Blob.seed( cell, 4, Fire.class ) ); + } else { + super.onThrow( cell ); + } + } else { + if (!curUser.shoot( enemy, this )) { + Dungeon.level.drop( this, cell ).sprite.drop(); + } + } + } + + @Override + public void proc( Char attacker, Char defender, int damage ) { + Buff.affect( defender, Burning.class ).reignite( defender ); + super.proc( attacker, defender, damage ); + } + + @Override + public String desc() { + return + "The spike on each of these darts is designed to pin it to its target " + + "while the unstable compounds strapped to its length burst into brilliant flames."; + } + + @Override + public Item random() { + quantity = Random.Int( 3, 6 ); + return this; + } + + @Override + public int price() { + return 10 * quantity; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/missiles/Javelin.java b/src/com/watabou/pixeldungeon/items/weapon/missiles/Javelin.java new file mode 100644 index 0000000000..6fb7cc7bf1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/missiles/Javelin.java @@ -0,0 +1,71 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.missiles; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Cripple; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class Javelin extends MissileWeapon { + + { + name = "javelin"; + image = ItemSpriteSheet.JAVELIN; + + STR = 15; + + MIN = 2; + MAX = 15; + } + + public Javelin() { + this( 1 ); + } + + public Javelin( int number ) { + super(); + quantity = number; + } + + @Override + public void proc( Char attacker, Char defender, int damage ) { + super.proc( attacker, defender, damage ); + Buff.prolong( defender, Cripple.class, Cripple.DURATION ); + } + + @Override + public String desc() { + return + "This length of metal is weighted to keep the spike " + + "at its tip foremost as it sails through the air."; + } + + @Override + public Item random() { + quantity = Random.Int( 5, 15 ); + return this; + } + + @Override + public int price() { + return 15 * quantity; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/missiles/MissileWeapon.java b/src/com/watabou/pixeldungeon/items/weapon/missiles/MissileWeapon.java new file mode 100644 index 0000000000..62c3be8058 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/missiles/MissileWeapon.java @@ -0,0 +1,144 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.missiles; + +import java.util.ArrayList; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.windows.WndOptions; + +public class MissileWeapon extends Weapon { + + private static final String TXT_MISSILES = "Missile weapon"; + private static final String TXT_YES = "Yes, I know what I'm doing"; + private static final String TXT_NO = "No, I changed my mind"; + private static final String TXT_R_U_SURE = + "Do you really want to equip it as a melee weapon?"; + + { + stackable = true; + levelKnown = true; + defaultAction = AC_THROW; + } + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + if (hero.heroClass != HeroClass.HUNTRESS && hero.heroClass != HeroClass.ROGUE) { + actions.remove( AC_EQUIP ); + actions.remove( AC_UNEQUIP ); + } + return actions; + } + + @Override + protected void onThrow( int cell ) { + Char enemy = Actor.findChar( cell ); + if (enemy == null || enemy == curUser) { + super.onThrow( cell ); + } else { + if (!curUser.shoot( enemy, this )) { + miss( cell ); + } + } + } + + protected void miss( int cell ) { + super.onThrow( cell ); + } + + @Override + public void proc( Char attacker, Char defender, int damage ) { + + super.proc( attacker, defender, damage ); + + Hero hero = (Hero)attacker; + if (!hero.usingRanged && stackable) { + if (quantity == 1) { + doUnequip( hero, false ); + } else { + detach( null ); + } + } + } + + @Override + public boolean doEquip( final Hero hero ) { + GameScene.show( + new WndOptions( TXT_MISSILES, TXT_R_U_SURE, TXT_YES, TXT_NO ) { + @Override + protected void onSelect(int index) { + if (index == 0) { + MissileWeapon.super.doEquip( hero ); + } + }; + } + ); + + return false; + } + + @Override + public Item random() { + return this; + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public String info() { + + StringBuilder info = new StringBuilder( desc() ); + + info.append( "\n\nAverage damage of this weapon equals to " + (MIN + (MAX - MIN) / 2) + " points per hit. " ); + + if (Dungeon.hero.belongings.backpack.items.contains( this )) { + if (STR > Dungeon.hero.STR()) { + info.append( + "Because of your inadequate strength the accuracy and speed " + + "of your attack with this " + name + " is decreased." ); + } + if (STR < Dungeon.hero.STR()) { + info.append( + "Because of your excess strength the damage " + + "of your attack with this " + name + " is increased." ); + } + } + + if (isEquipped( Dungeon.hero )) { + info.append( "\n\nYou hold the " + name + " at the ready." ); + } + + return info.toString(); + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/missiles/Shuriken.java b/src/com/watabou/pixeldungeon/items/weapon/missiles/Shuriken.java new file mode 100644 index 0000000000..a5f37a73c8 --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/missiles/Shuriken.java @@ -0,0 +1,64 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.missiles; + +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class Shuriken extends MissileWeapon { + + { + name = "shuriken"; + image = ItemSpriteSheet.SHURIKEN; + + STR = 13; + + MIN = 2; + MAX = 6; + + DLY = 0.5f; + } + + public Shuriken() { + this( 1 ); + } + + public Shuriken( int number ) { + super(); + quantity = number; + } + + @Override + public String desc() { + return + "Star-shaped pieces of metal with razor-sharp blades do significant damage " + + "when they hit a target. They can be thrown at very high rate."; + } + + @Override + public Item random() { + quantity = Random.Int( 5, 15 ); + return this; + } + + @Override + public int price() { + return 15 * quantity; + } +} diff --git a/src/com/watabou/pixeldungeon/items/weapon/missiles/Tamahawk.java b/src/com/watabou/pixeldungeon/items/weapon/missiles/Tamahawk.java new file mode 100644 index 0000000000..baa9cd1a8d --- /dev/null +++ b/src/com/watabou/pixeldungeon/items/weapon/missiles/Tamahawk.java @@ -0,0 +1,71 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.items.weapon.missiles; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Bleeding; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class Tamahawk extends MissileWeapon { + + { + name = "tomahawk"; + image = ItemSpriteSheet.TOMAHAWK; + + STR = 17; + + MIN = 4; + MAX = 20; + } + + public Tamahawk() { + this( 1 ); + } + + public Tamahawk( int number ) { + super(); + quantity = number; + } + + @Override + public void proc( Char attacker, Char defender, int damage ) { + super.proc( attacker, defender, damage ); + Buff.affect( defender, Bleeding.class ).set( damage ); + } + + @Override + public String desc() { + return + "This throwing axe is not that heavy, but it still " + + "requires significant strength to be used effectively."; + } + + @Override + public Item random() { + quantity = Random.Int( 5, 12 ); + return this; + } + + @Override + public int price() { + return 20 * quantity; + } +} diff --git a/src/com/watabou/pixeldungeon/levels/CavesBossLevel.java b/src/com/watabou/pixeldungeon/levels/CavesBossLevel.java new file mode 100644 index 0000000000..0d6ef21eb1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/CavesBossLevel.java @@ -0,0 +1,299 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import com.watabou.noosa.Camera; +import com.watabou.noosa.Scene; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Bones; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.Bestiary; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.keys.SkeletonKey; +import com.watabou.pixeldungeon.levels.painters.Painter; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class CavesBossLevel extends Level { + + { + color1 = 0x534f3e; + color2 = 0xb9d661; + + viewDistance = 6; + } + + private static final int ROOM_LEFT = WIDTH / 2 - 2; + private static final int ROOM_RIGHT = WIDTH / 2 + 2; + private static final int ROOM_TOP = HEIGHT / 2 - 2; + private static final int ROOM_BOTTOM = HEIGHT / 2 + 2; + + private int arenaDoor; + private boolean enteredArena = false; + private boolean keyDropped = false; + + @Override + public String tilesTex() { + return Assets.TILES_CAVES; + } + + @Override + public String waterTex() { + return Assets.WATER_CAVES; + } + + private static final String DOOR = "door"; + private static final String ENTERED = "entered"; + private static final String DROPPED = "droppped"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( DOOR, arenaDoor ); + bundle.put( ENTERED, enteredArena ); + bundle.put( DROPPED, keyDropped ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + arenaDoor = bundle.getInt( DOOR ); + enteredArena = bundle.getBoolean( ENTERED ); + keyDropped = bundle.getBoolean( DROPPED ); + } + + @Override + protected boolean build() { + + int topMost = Integer.MAX_VALUE; + + for (int i=0; i < 8; i++) { + int left, right, top, bottom; + if (Random.Int( 2 ) == 0) { + left = Random.Int( 1, ROOM_LEFT - 3 ); + right = ROOM_RIGHT + 3; + } else { + left = ROOM_LEFT - 3; + right = Random.Int( ROOM_RIGHT + 3, WIDTH - 1 ); + } + if (Random.Int( 2 ) == 0) { + top = Random.Int( 2, ROOM_TOP - 3 ); + bottom = ROOM_BOTTOM + 3; + } else { + top = ROOM_LEFT - 3; + bottom = Random.Int( ROOM_TOP + 3, HEIGHT - 1 ); + } + + Painter.fill( this, left, top, right - left + 1, bottom - top + 1, Terrain.EMPTY ); + + if (top < topMost) { + topMost = top; + exit = Random.Int( left, right ) + (top - 1) * WIDTH; + } + } + + map[exit] = Terrain.LOCKED_EXIT; + + for (int i=0; i < LENGTH; i++) { + if (map[i] == Terrain.EMPTY && Random.Int( 6 ) == 0) { + map[i] = Terrain.INACTIVE_TRAP; + } + } + + Painter.fill( this, ROOM_LEFT - 1, ROOM_TOP - 1, + ROOM_RIGHT - ROOM_LEFT + 3, ROOM_BOTTOM - ROOM_TOP + 3, Terrain.WALL ); + Painter.fill( this, ROOM_LEFT, ROOM_TOP + 1, + ROOM_RIGHT - ROOM_LEFT + 1, ROOM_BOTTOM - ROOM_TOP, Terrain.EMPTY ); + + Painter.fill( this, ROOM_LEFT, ROOM_TOP, + ROOM_RIGHT - ROOM_LEFT + 1, 1, Terrain.TOXIC_TRAP ); + + arenaDoor = Random.Int( ROOM_LEFT, ROOM_RIGHT ) + (ROOM_BOTTOM + 1) * WIDTH; + map[arenaDoor] = Terrain.DOOR; + + entrance = Random.Int( ROOM_LEFT + 1, ROOM_RIGHT - 1 ) + + Random.Int( ROOM_TOP + 1, ROOM_BOTTOM - 1 ) * WIDTH; + map[entrance] = Terrain.ENTRANCE; + + boolean[] patch = Patch.generate( 0.45f, 6 ); + for (int i=0; i < LENGTH; i++) { + if (map[i] == Terrain.EMPTY && patch[i]) { + map[i] = Terrain.WATER; + } + } + + return true; + } + + @Override + protected void decorate() { + + for (int i=WIDTH + 1; i < LENGTH - WIDTH; i++) { + if (map[i] == Terrain.EMPTY) { + int n = 0; + if (map[i+1] == Terrain.WALL) { + n++; + } + if (map[i-1] == Terrain.WALL) { + n++; + } + if (map[i+WIDTH] == Terrain.WALL) { + n++; + } + if (map[i-WIDTH] == Terrain.WALL) { + n++; + } + if (Random.Int( 8 ) <= n) { + map[i] = Terrain.EMPTY_DECO; + } + } + } + + for (int i=0; i < LENGTH; i++) { + if (map[i] == Terrain.WALL && Random.Int( 8 ) == 0) { + map[i] = Terrain.WALL_DECO; + } + } + + int sign; + do { + sign = Random.Int( ROOM_LEFT, ROOM_RIGHT ) + Random.Int( ROOM_TOP, ROOM_BOTTOM ) * WIDTH; + } while (sign == entrance); + map[sign] = Terrain.SIGN; + } + + @Override + protected void createMobs() { + } + + public Actor respawner() { + return null; + } + + @Override + protected void createItems() { + Item item = Bones.get(); + if (item != null) { + int pos; + do { + pos = Random.IntRange( ROOM_LEFT, ROOM_RIGHT ) + Random.IntRange( ROOM_TOP + 1, ROOM_BOTTOM ) * WIDTH; + } while (pos == entrance || map[pos] == Terrain.SIGN); + drop( item, pos ).type = Heap.Type.SKELETON; + } + } + + @Override + public int randomRespawnCell() { + return -1; + } + + @Override + public void press( int cell, Char hero ) { + + super.press( cell, hero ); + + if (!enteredArena && outsideEntraceRoom( cell ) && hero == Dungeon.hero) { + + enteredArena = true; + + Mob boss = Bestiary.mob( Dungeon.depth ); + boss.state = Mob.State.HUNTING; + do { + boss.pos = Random.Int( LENGTH ); + } while ( + !passable[boss.pos] || + !outsideEntraceRoom( boss.pos ) || + Dungeon.visible[boss.pos]); + GameScene.add( boss ); + + set( arenaDoor, Terrain.WALL ); + GameScene.updateMap( arenaDoor ); + Dungeon.observe(); + + CellEmitter.get( arenaDoor ).start( Speck.factory( Speck.ROCK ), 0.07f, 10 ); + Camera.main.shake( 3, 0.7f ); + Sample.INSTANCE.play( Assets.SND_ROCKS ); + } + } + + @Override + public Heap drop( Item item, int cell ) { + + if (!keyDropped && item instanceof SkeletonKey) { + + keyDropped = true; + + CellEmitter.get( arenaDoor ).start( Speck.factory( Speck.ROCK ), 0.07f, 10 ); + + set( arenaDoor, Terrain.EMPTY_DECO ); + GameScene.updateMap( arenaDoor ); + Dungeon.observe(); + } + + return super.drop( item, cell ); + } + + private boolean outsideEntraceRoom( int cell ) { + int cx = cell % WIDTH; + int cy = cell / WIDTH; + return cx < ROOM_LEFT-1 || cx > ROOM_RIGHT+1 || cy < ROOM_TOP-1 || cy > ROOM_BOTTOM+1; + } + + @Override + public String tileName( int tile ) { + switch (tile) { + case Terrain.GRASS: + return "Fluorescent moss"; + case Terrain.HIGH_GRASS: + return "Fluorescent mushrooms"; + case Terrain.WATER: + return "Freezing cold water."; + default: + return super.tileName( tile ); + } + } + + @Override + public String tileDesc( int tile ) { + switch (tile) { + case Terrain.ENTRANCE: + return "The ladder leads up to the upper depth."; + case Terrain.EXIT: + return "The ladder leads down to the lower depth."; + case Terrain.HIGH_GRASS: + return "Huge mushrooms block the view."; + case Terrain.WALL_DECO: + return "A vein of some ore is visible on the wall. Gold?"; + default: + return super.tileDesc( tile ); + } + } + + @Override + public void addVisuals( Scene scene ) { + CavesLevel.addVisuals( this, scene ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/CavesLevel.java b/src/com/watabou/pixeldungeon/levels/CavesLevel.java new file mode 100644 index 0000000000..0a1744910e --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/CavesLevel.java @@ -0,0 +1,284 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.Scene; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.actors.mobs.npcs.Blacksmith; +import com.watabou.pixeldungeon.levels.Room.Type; +import com.watabou.pixeldungeon.levels.painters.Painter; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; +import com.watabou.utils.Rect; + +public class CavesLevel extends RegularLevel { + + { + color1 = 0x534f3e; + color2 = 0xb9d661; + + viewDistance = 6; + } + + @Override + public String tilesTex() { + return Assets.TILES_CAVES; + } + + @Override + public String waterTex() { + return Assets.WATER_CAVES; + } + + protected boolean[] water() { + return Patch.generate( feeling == Feeling.WATER ? 0.60f : 0.45f, 6 ); + } + + protected boolean[] grass() { + return Patch.generate( feeling == Feeling.GRASS ? 0.55f : 0.35f, 3 ); + } + + @Override + protected void assignRoomType() { + super.assignRoomType(); + + Blacksmith.Quest.spawn( rooms ); + } + + @Override + protected void decorate() { + + for (Room room : rooms) { + if (room.type != Room.Type.STANDARD) { + continue; + } + + if (room.width() <= 3 || room.height() <= 3) { + continue; + } + + int s = room.square(); + + if (Random.Int( s ) > 8) { + int corner = (room.left + 1) + (room.top + 1) * WIDTH; + if (map[corner - 1] == Terrain.WALL && map[corner - WIDTH] == Terrain.WALL) { + map[corner] = Terrain.WALL; + } + } + + if (Random.Int( s ) > 8) { + int corner = (room.right - 1) + (room.top + 1) * WIDTH; + if (map[corner + 1] == Terrain.WALL && map[corner - WIDTH] == Terrain.WALL) { + map[corner] = Terrain.WALL; + } + } + + if (Random.Int( s ) > 8) { + int corner = (room.left + 1) + (room.bottom - 1) * WIDTH; + if (map[corner - 1] == Terrain.WALL && map[corner + WIDTH] == Terrain.WALL) { + map[corner] = Terrain.WALL; + } + } + + if (Random.Int( s ) > 8) { + int corner = (room.right - 1) + (room.bottom - 1) * WIDTH; + if (map[corner + 1] == Terrain.WALL && map[corner + WIDTH] == Terrain.WALL) { + map[corner] = Terrain.WALL; + } + } + + for (Room n : room.connected.keySet()) { + if ((n.type == Room.Type.STANDARD || n.type == Room.Type.TUNNEL) && Random.Int( 3 ) == 0) { + Painter.set( this, room.connected.get( n ), Terrain.EMPTY_DECO ); + } + } + } + + for (int i=WIDTH + 1; i < LENGTH - WIDTH; i++) { + if (map[i] == Terrain.EMPTY) { + int n = 0; + if (map[i+1] == Terrain.WALL) { + n++; + } + if (map[i-1] == Terrain.WALL) { + n++; + } + if (map[i+WIDTH] == Terrain.WALL) { + n++; + } + if (map[i-WIDTH] == Terrain.WALL) { + n++; + } + if (Random.Int( 6 ) <= n) { + map[i] = Terrain.EMPTY_DECO; + } + } + } + + for (int i=0; i < LENGTH; i++) { + if (map[i] == Terrain.WALL && Random.Int( 12 ) == 0) { + map[i] = Terrain.WALL_DECO; + } + } + + while (true) { + int pos = roomEntrance.random(); + if (pos != entrance) { + map[pos] = Terrain.SIGN; + break; + } + } + + if (Dungeon.bossLevel( Dungeon.depth + 1 )) { + return; + } + + for (Room r : rooms) { + if (r.type == Type.STANDARD) { + for (Room n : r.neigbours) { + if (n.type == Type.STANDARD && !r.connected.containsKey( n )/* && Random.Int( 2 ) == 0*/) { + Rect w = r.intersect( n ); + if (w.left == w.right && w.bottom - w.top >= 5) { + + w.top += 2; + w.bottom -= 1; + + w.right++; + + Painter.fill( this, w.left, w.top, 1, w.height(), Terrain.CHASM ); + + } else if (w.top == w.bottom && w.right - w.left >= 5) { + + w.left += 2; + w.right -= 1; + + w.bottom++; + + Painter.fill( this, w.left, w.top, w.width(), 1, Terrain.CHASM ); + } + } + } + } + } + } + + @Override + public String tileName( int tile ) { + switch (tile) { + case Terrain.GRASS: + return "Fluorescent moss"; + case Terrain.HIGH_GRASS: + return "Fluorescent mushrooms"; + case Terrain.WATER: + return "Freezing cold water."; + default: + return super.tileName( tile ); + } + } + + @Override + public String tileDesc( int tile ) { + switch (tile) { + case Terrain.ENTRANCE: + return "The ladder leads up to the upper depth."; + case Terrain.EXIT: + return "The ladder leads down to the lower depth."; + case Terrain.HIGH_GRASS: + return "Huge mushrooms block the view."; + case Terrain.WALL_DECO: + return "A vein of some ore is visible on the wall. Gold?"; + case Terrain.BOOKSHELF: + return "Who would need a bookshelf in a cave?"; + default: + return super.tileDesc( tile ); + } + } + + @Override + public void addVisuals( Scene scene ) { + super.addVisuals( scene ); + addVisuals( this, scene ); + } + + public static void addVisuals( Level level, Scene scene ) { + for (int i=0; i < LENGTH; i++) { + if (level.map[i] == Terrain.WALL_DECO) { + scene.add( new Vein( i ) ); + } + } + } + + private static class Vein extends Group { + + private int pos; + + private float delay; + + public Vein( int pos ) { + super(); + + this.pos = pos; + + delay = Random.Float( 2 ); + } + + @Override + public void update() { + + if (visible = Dungeon.visible[pos]) { + + super.update(); + + if ((delay -= Game.elapsed) <= 0) { + + delay = Random.Float(); + + PointF p = DungeonTilemap.tileToWorld( pos ); + ((Sparkle)recycle( Sparkle.class )).reset( + p.x + Random.Float( DungeonTilemap.SIZE ), + p.y + Random.Float( DungeonTilemap.SIZE ) ); + } + } + } + } + + public static final class Sparkle extends PixelParticle { + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan = 0.5f; + } + + @Override + public void update() { + super.update(); + + float p = left / lifespan; + size( (am = p < 0.5f ? p * 2 : (1 - p) * 2) * 2 ); + } + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/levels/CityBossLevel.java b/src/com/watabou/pixeldungeon/levels/CityBossLevel.java new file mode 100644 index 0000000000..8278cfc694 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/CityBossLevel.java @@ -0,0 +1,253 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import com.watabou.noosa.Scene; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Bones; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.Bestiary; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.keys.SkeletonKey; +import com.watabou.pixeldungeon.levels.painters.Painter; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class CityBossLevel extends Level { + + { + color1 = 0x4b6636; + color2 = 0xf2f2f2; + } + + private static final int TOP = 2; + private static final int HALL_WIDTH = 7; + private static final int HALL_HEIGHT = 15; + private static final int CHAMBER_HEIGHT = 3; + + private static final int LEFT = (WIDTH - HALL_WIDTH) / 2; + private static final int CENTER = LEFT + HALL_WIDTH / 2; + + private int arenaDoor; + private boolean enteredArena = false; + private boolean keyDropped = false; + + @Override + public String tilesTex() { + return Assets.TILES_CITY; + } + + @Override + public String waterTex() { + return Assets.WATER_CITY; + } + + private static final String DOOR = "door"; + private static final String ENTERED = "entered"; + private static final String DROPPED = "droppped"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( DOOR, arenaDoor ); + bundle.put( ENTERED, enteredArena ); + bundle.put( DROPPED, keyDropped ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + arenaDoor = bundle.getInt( DOOR ); + enteredArena = bundle.getBoolean( ENTERED ); + keyDropped = bundle.getBoolean( DROPPED ); + } + + @Override + protected boolean build() { + + Painter.fill( this, LEFT, TOP, HALL_WIDTH, HALL_HEIGHT, Terrain.EMPTY ); + Painter.fill( this, CENTER, TOP, 1, HALL_HEIGHT, Terrain.EMPTY_SP ); + + int y = TOP + 1; + while (y < TOP + HALL_HEIGHT) { + map[y * WIDTH + CENTER - 2] = Terrain.STATUE_SP; + map[y * WIDTH + CENTER + 2] = Terrain.STATUE_SP; + y += 2; + } + + int left = pedestal( true ); + int right = pedestal( false ); + map[left] = map[right] = Terrain.PEDESTAL; + for (int i=left+1; i < right; i++) { + map[i] = Terrain.EMPTY_SP; + } + + exit = (TOP - 1) * WIDTH + CENTER; + map[exit] = Terrain.LOCKED_EXIT; + + arenaDoor = (TOP + HALL_HEIGHT) * WIDTH + CENTER; + map[arenaDoor] = Terrain.DOOR; + + Painter.fill( this, LEFT, TOP + HALL_HEIGHT + 1, HALL_WIDTH, CHAMBER_HEIGHT, Terrain.EMPTY ); + Painter.fill( this, LEFT, TOP + HALL_HEIGHT + 1, 1, CHAMBER_HEIGHT, Terrain.BOOKSHELF ); + Painter.fill( this, LEFT + HALL_WIDTH - 1, TOP + HALL_HEIGHT + 1, 1, CHAMBER_HEIGHT, Terrain.BOOKSHELF ); + + entrance = (TOP + HALL_HEIGHT + 2 + Random.Int( CHAMBER_HEIGHT - 1 )) * WIDTH + LEFT + (/*1 +*/ Random.Int( HALL_WIDTH-2 )); + map[entrance] = Terrain.ENTRANCE; + + return true; + } + + @Override + protected void decorate() { + + for (int i=0; i < LENGTH; i++) { + if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) { + map[i] = Terrain.EMPTY_DECO; + } else if (map[i] == Terrain.WALL && Random.Int( 8 ) == 0) { + map[i] = Terrain.WALL_DECO; + } + } + + int sign = arenaDoor + WIDTH + 1; + map[sign] = Terrain.SIGN; + } + + public static int pedestal( boolean left ) { + if (left) { + return (TOP + HALL_HEIGHT / 2) * WIDTH + CENTER - 2; + } else { + return (TOP + HALL_HEIGHT / 2) * WIDTH + CENTER + 2; + } + } + + @Override + protected void createMobs() { + } + + public Actor respawner() { + return null; + } + + @Override + protected void createItems() { + Item item = Bones.get(); + if (item != null) { + int pos; + do { + pos = + Random.IntRange( LEFT + 1, LEFT + HALL_WIDTH - 2 ) + + Random.IntRange( TOP + HALL_HEIGHT + 1, TOP + HALL_HEIGHT + CHAMBER_HEIGHT ) * WIDTH; + } while (pos == entrance || map[pos] == Terrain.SIGN); + drop( item, pos ).type = Heap.Type.SKELETON; + } + } + + @Override + public int randomRespawnCell() { + return -1; + } + + @Override + public void press( int cell, Char hero ) { + + super.press( cell, hero ); + + if (!enteredArena && outsideEntraceRoom( cell ) && hero == Dungeon.hero) { + + enteredArena = true; + + Mob boss = Bestiary.mob( Dungeon.depth ); + boss.state = Mob.State.HUNTING; + do { + boss.pos = Random.Int( LENGTH ); + } while ( + !passable[boss.pos] || + !outsideEntraceRoom( boss.pos ) || + Dungeon.visible[boss.pos]); + GameScene.add( boss ); + + set( arenaDoor, Terrain.LOCKED_DOOR ); + GameScene.updateMap( arenaDoor ); + Dungeon.observe(); + } + } + + @Override + public Heap drop( Item item, int cell ) { + + if (!keyDropped && item instanceof SkeletonKey) { + + keyDropped = true; + + set( arenaDoor, Terrain.DOOR ); + GameScene.updateMap( arenaDoor ); + Dungeon.observe(); + } + + return super.drop( item, cell ); + } + + private boolean outsideEntraceRoom( int cell ) { + return cell / WIDTH < arenaDoor / WIDTH; + } + + @Override + public String tileName( int tile ) { + switch (tile) { + case Terrain.WATER: + return "Suspiciously colored water"; + case Terrain.HIGH_GRASS: + return "High blooming flowers"; + default: + return super.tileName( tile ); + } + } + + @Override + public String tileDesc(int tile) { + switch (tile) { + case Terrain.ENTRANCE: + return "A ramp leads up to the upper depth."; + case Terrain.EXIT: + return "A ramp leads down to the lower depth."; + case Terrain.WALL_DECO: + case Terrain.EMPTY_DECO: + return "Several tiles are missing here."; + case Terrain.EMPTY_SP: + return "Thick carpet covers the floor."; + case Terrain.STATUE: + case Terrain.STATUE_SP: + return "The statue depicts some dwarf standing in a heroic stance."; + case Terrain.BOOKSHELF: + return "The rows of books on different disciplines fill the bookshelf."; + default: + return super.tileDesc( tile ); + } + } + + @Override + public void addVisuals( Scene scene ) { + CityLevel.addVisuals( this, scene ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/CityLevel.java b/src/com/watabou/pixeldungeon/levels/CityLevel.java new file mode 100644 index 0000000000..38778a43cd --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/CityLevel.java @@ -0,0 +1,200 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import com.watabou.noosa.Scene; +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.actors.mobs.npcs.Imp; +import com.watabou.pixeldungeon.levels.Room.Type; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class CityLevel extends RegularLevel { + + { + color1 = 0x4b6636; + color2 = 0xf2f2f2; + } + + @Override + public String tilesTex() { + return Assets.TILES_CITY; + } + + @Override + public String waterTex() { + return Assets.WATER_CITY; + } + + protected boolean[] water() { + return Patch.generate( feeling == Feeling.WATER ? 0.65f : 0.45f, 4 ); + } + + protected boolean[] grass() { + return Patch.generate( feeling == Feeling.GRASS ? 0.60f : 0.40f, 3 ); + } + + @Override + protected void assignRoomType() { + super.assignRoomType(); + + for (Room r : rooms) { + if (r.type == Type.TUNNEL) { + r.type = Type.PASSAGE; + } + } + } + + @Override + protected void decorate() { + + for (int i=0; i < LENGTH; i++) { + if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) { + map[i] = Terrain.EMPTY_DECO; + } else if (map[i] == Terrain.WALL && Random.Int( 8 ) == 0) { + map[i] = Terrain.WALL_DECO; + } + } + + while (true) { + int pos = roomEntrance.random(); + if (pos != entrance) { + map[pos] = Terrain.SIGN; + break; + } + } + } + + @Override + protected void createItems() { + super.createItems(); + + Imp.Quest.spawn( this, roomEntrance ); + } + + @Override + public String tileName( int tile ) { + switch (tile) { + case Terrain.WATER: + return "Suspiciously colored water"; + case Terrain.HIGH_GRASS: + return "High blooming flowers"; + default: + return super.tileName( tile ); + } + } + + @Override + public String tileDesc(int tile) { + switch (tile) { + case Terrain.ENTRANCE: + return "A ramp leads up to the upper depth."; + case Terrain.EXIT: + return "A ramp leads down to the lower depth."; + case Terrain.WALL_DECO: + case Terrain.EMPTY_DECO: + return "Several tiles are missing here."; + case Terrain.EMPTY_SP: + return "Thick carpet covers the floor."; + case Terrain.STATUE: + case Terrain.STATUE_SP: + return "The statue depicts some dwarf standing in a heroic stance."; + case Terrain.BOOKSHELF: + return "The rows of books on different disciplines fill the bookshelf."; + default: + return super.tileDesc( tile ); + } + } + + @Override + public void addVisuals( Scene scene ) { + super.addVisuals( scene ); + addVisuals( this, scene ); + } + + public static void addVisuals( Level level, Scene scene ) { + for (int i=0; i < LENGTH; i++) { + if (level.map[i] == Terrain.WALL_DECO) { + scene.add( new Smoke( i ) ); + } + } + } + + private static class Smoke extends Emitter { + + private int pos; + + private static final Emitter.Factory factory = new Factory() { + + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + SmokeParticle p = (SmokeParticle)emitter.recycle( SmokeParticle.class ); + p.reset( x, y ); + } + }; + + public Smoke( int pos ) { + super(); + + this.pos = pos; + + PointF p = DungeonTilemap.tileCenterToWorld( pos ); + pos( p.x - 4, p.y - 2, 4, 0 ); + + pour( factory, 0.2f ); + } + + @Override + public void update() { + if (visible = Dungeon.visible[pos]) { + super.update(); + } + } + } + + public static final class SmokeParticle extends PixelParticle { + + public SmokeParticle() { + super(); + + color( 0x000000 ); + speed.set( Random.Float( 8 ), -Random.Float( 8 ) ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan = 2f; + } + + @Override + public void update() { + super.update(); + float p = left / lifespan; + am = p > 0.8f ? 1 - p : p * 0.25f; + size( 8 - p * 4 ); + } + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/levels/DeadEndLevel.java b/src/com/watabou/pixeldungeon/levels/DeadEndLevel.java new file mode 100644 index 0000000000..5d87f4b29d --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/DeadEndLevel.java @@ -0,0 +1,97 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import java.util.Arrays; + +import com.watabou.pixeldungeon.Assets; +import com.watabou.utils.Random; + +public class DeadEndLevel extends Level { + + private static final int SIZE = 5; + + { + color1 = 0x534f3e; + color2 = 0xb9d661; + } + + @Override + public String tilesTex() { + return Assets.TILES_CAVES; + } + + @Override + public String waterTex() { + return Assets.WATER_HALLS; + } + + @Override + protected boolean build() { + + Arrays.fill( map, Terrain.WALL ); + + for (int i=2; i < SIZE; i++) { + for (int j=2; j < SIZE; j++) { + map[i * WIDTH + j] = Terrain.EMPTY; + } + } + + for (int i=1; i <= SIZE; i++) { + map[WIDTH + i] = + map[WIDTH * SIZE + i] = + map[WIDTH * i + 1] = + map[WIDTH * i + SIZE] = + Terrain.WATER; + } + + entrance = SIZE * WIDTH + SIZE / 2 + 1; + map[entrance] = Terrain.ENTRANCE; + + exit = -1; + + map[(SIZE / 2 + 1) * (WIDTH + 1)] = Terrain.SIGN; + + return true; + } + + @Override + protected void decorate() { + for (int i=0; i < LENGTH; i++) { + if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) { + map[i] = Terrain.EMPTY_DECO; + } else if (map[i] == Terrain.WALL && Random.Int( 8 ) == 0) { + map[i] = Terrain.WALL_DECO; + } + } + } + + @Override + protected void createMobs() { + } + + @Override + protected void createItems() { + } + + @Override + public int randomRespawnCell() { + return -1; + } + +} diff --git a/src/com/watabou/pixeldungeon/levels/HallsBossLevel.java b/src/com/watabou/pixeldungeon/levels/HallsBossLevel.java new file mode 100644 index 0000000000..1c22aea583 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/HallsBossLevel.java @@ -0,0 +1,253 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import com.watabou.noosa.Scene; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Bones; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.Yog; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.FlameParticle; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.keys.SkeletonKey; +import com.watabou.pixeldungeon.levels.painters.Painter; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class HallsBossLevel extends Level { + + { + color1 = 0x801500; + color2 = 0xa68521; + + viewDistance = 3; + } + + private static final int ROOM_LEFT = WIDTH / 2 - 1; + private static final int ROOM_RIGHT = WIDTH / 2 + 1; + private static final int ROOM_TOP = HEIGHT / 2 - 1; + private static final int ROOM_BOTTOM = HEIGHT / 2 + 1; + + private int stairs = -1; + private boolean enteredArena = false; + private boolean keyDropped = false; + + @Override + public String tilesTex() { + return Assets.TILES_HALLS; + } + + @Override + public String waterTex() { + return Assets.WATER_HALLS; + } + + private static final String STAIRS = "stairs"; + private static final String ENTERED = "entered"; + private static final String DROPPED = "droppped"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( STAIRS, stairs ); + bundle.put( ENTERED, enteredArena ); + bundle.put( DROPPED, keyDropped ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + stairs = bundle.getInt( STAIRS ); + enteredArena = bundle.getBoolean( ENTERED ); + keyDropped = bundle.getBoolean( DROPPED ); + } + + @Override + protected boolean build() { + + for (int i=0; i < 5; i++) { + + int top = Random.IntRange( 2, ROOM_TOP - 1 ); + int bottom = Random.IntRange( ROOM_BOTTOM + 1, 22 ); + Painter.fill( this, 2 + i * 4, top, 4, bottom - top + 1, Terrain.EMPTY ); + + if (i == 2) { + exit = (i * 4 + 3) + (top - 1) * WIDTH ; + } + + for (int j=0; j < 4; j++) { + if (Random.Int( 2 ) == 0) { + int y = Random.IntRange( top + 1, bottom - 1 ); + map[i*4+j + y*WIDTH] = Terrain.WALL_DECO; + } + } + } + + map[exit] = Terrain.LOCKED_EXIT; + + Painter.fill( this, ROOM_LEFT - 1, ROOM_TOP - 1, + ROOM_RIGHT - ROOM_LEFT + 3, ROOM_BOTTOM - ROOM_TOP + 3, Terrain.WALL ); + Painter.fill( this, ROOM_LEFT, ROOM_TOP, + ROOM_RIGHT - ROOM_LEFT + 1, ROOM_BOTTOM - ROOM_TOP + 1, Terrain.EMPTY ); + + entrance = Random.Int( ROOM_LEFT + 1, ROOM_RIGHT - 1 ) + + Random.Int( ROOM_TOP + 1, ROOM_BOTTOM - 1 ) * WIDTH; + map[entrance] = Terrain.ENTRANCE; + + boolean[] patch = Patch.generate( 0.45f, 6 ); + for (int i=0; i < LENGTH; i++) { + if (map[i] == Terrain.EMPTY && patch[i]) { + map[i] = Terrain.WATER; + } + } + + return true; + } + + @Override + protected void decorate() { + + for (int i=0; i < LENGTH; i++) { + if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) { + map[i] = Terrain.EMPTY_DECO; + } + } + } + + @Override + protected void createMobs() { + } + + public Actor respawner() { + return null; + } + + @Override + protected void createItems() { + Item item = Bones.get(); + if (item != null) { + int pos; + do { + pos = Random.IntRange( ROOM_LEFT, ROOM_RIGHT ) + Random.IntRange( ROOM_TOP + 1, ROOM_BOTTOM ) * WIDTH; + } while (pos == entrance || map[pos] == Terrain.SIGN); + drop( item, pos ).type = Heap.Type.SKELETON; + } + } + + @Override + public int randomRespawnCell() { + return -1; + } + + @Override + public void press( int cell, Char hero ) { + + super.press( cell, hero ); + + if (!enteredArena && hero == Dungeon.hero && cell != entrance) { + + enteredArena = true; + + for (int i=ROOM_LEFT-1; i <= ROOM_RIGHT + 1; i++) { + doMagic( (ROOM_TOP - 1) * WIDTH + i ); + doMagic( (ROOM_BOTTOM + 1) * WIDTH + i ); + } + for (int i=ROOM_TOP; i < ROOM_BOTTOM + 1; i++) { + doMagic( i * WIDTH + ROOM_LEFT - 1 ); + doMagic( i * WIDTH + ROOM_RIGHT + 1 ); + } + doMagic( entrance ); + GameScene.updateMap(); + + Dungeon.observe(); + + Yog boss = new Yog(); + do { + boss.pos = Random.Int( LENGTH ); + } while ( + !passable[boss.pos] || + Dungeon.visible[boss.pos]); + GameScene.add( boss ); + boss.spawnFists(); + + stairs = entrance; + entrance = -1; + } + } + + private void doMagic( int cell ) { + set( cell, Terrain.EMPTY_SP ); + CellEmitter.get( cell ).start( FlameParticle.FACTORY, 0.1f, 3 ); + } + + @Override + public Heap drop( Item item, int cell ) { + + if (!keyDropped && item instanceof SkeletonKey) { + keyDropped = true; + + entrance = stairs; + set( entrance, Terrain.ENTRANCE ); + GameScene.updateMap( entrance ); + } + + return super.drop( item, cell ); + } + + @Override + public String tileName( int tile ) { + switch (tile) { + case Terrain.WATER: + return "Cold lava"; + case Terrain.GRASS: + return "Embermoss"; + case Terrain.HIGH_GRASS: + return "Emberfungi"; + case Terrain.STATUE: + case Terrain.STATUE_SP: + return "Pillar"; + default: + return super.tileName( tile ); + } + } + + @Override + public String tileDesc(int tile) { + switch (tile) { + case Terrain.WATER: + return "It looks like lava, but it's cold and probably safe to touch."; + case Terrain.EMPTY_DECO: + return "Candles on the floor are probably remains of some ritual that took place here."; + case Terrain.STATUE: + case Terrain.STATUE_SP: + return "The pillar is made of real humanoid skulls. Awesome."; + default: + return super.tileDesc( tile ); + } + } + + @Override + public void addVisuals( Scene scene ) { + HallsLevel.addVisuals( this, scene ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/HallsLevel.java b/src/com/watabou/pixeldungeon/levels/HallsLevel.java new file mode 100644 index 0000000000..9c02248dd0 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/HallsLevel.java @@ -0,0 +1,232 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import javax.microedition.khronos.opengles.GL10; + +import android.opengl.GLES20; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.Scene; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.items.Torch; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class HallsLevel extends RegularLevel { + + { + minRoomSize = 6; + + viewDistance = Math.max( 25 - Dungeon.depth, 1 ); + + color1 = 0x801500; + color2 = 0xa68521; + } + + @Override + public void create() { + addItemToSpawn( new Torch() ); + super.create(); + } + + @Override + public String tilesTex() { + return Assets.TILES_HALLS; + } + + @Override + public String waterTex() { + return Assets.WATER_HALLS; + } + + protected boolean[] water() { + return Patch.generate( feeling == Feeling.WATER ? 0.55f : 0.40f, 6 ); + } + + protected boolean[] grass() { + return Patch.generate( feeling == Feeling.GRASS ? 0.55f : 0.30f, 3 ); + } + + @Override + protected void decorate() { + + for (int i=WIDTH + 1; i < LENGTH - WIDTH - 1; i++) { + if (map[i] == Terrain.EMPTY) { + + int count = 0; + for (int j=0; j < NEIGHBOURS8.length; j++) { + if ((Terrain.flags[map[i + NEIGHBOURS8[j]]] & Terrain.PASSABLE) > 0) { + count++; + } + } + + if (Random.Int( 80 ) < count) { + map[i] = Terrain.EMPTY_DECO; + } + + } else + if (map[i] == Terrain.WALL) { + + int count = 0; + for (int j=0; j < NEIGHBOURS4.length; j++) { + if (map[i + NEIGHBOURS4[j]] == Terrain.WATER) { + count++; + } + } + + if (Random.Int( 4 ) < count) { + map[i] = Terrain.WALL_DECO; + } + + } + } + + while (true) { + int pos = roomEntrance.random(); + if (pos != entrance) { + map[pos] = Terrain.SIGN; + break; + } + } + } + + @Override + public String tileName( int tile ) { + switch (tile) { + case Terrain.WATER: + return "Cold lava"; + case Terrain.GRASS: + return "Embermoss"; + case Terrain.HIGH_GRASS: + return "Emberfungi"; + case Terrain.STATUE: + case Terrain.STATUE_SP: + return "Pillar"; + default: + return super.tileName( tile ); + } + } + + @Override + public String tileDesc(int tile) { + switch (tile) { + case Terrain.WATER: + return "It looks like lava, but it's cold and probably safe to touch."; + case Terrain.EMPTY_DECO: + return "Candles on the floor are probably remains of some ritual that took place here."; + case Terrain.STATUE: + case Terrain.STATUE_SP: + return "The pillar is made of real humanoid skulls. Awesome."; + case Terrain.BOOKSHELF: + return "Books in ancient languages smoulder in the bookshelf."; + default: + return super.tileDesc( tile ); + } + } + + @Override + public void addVisuals( Scene scene ) { + super.addVisuals( scene ); + addVisuals( this, scene ); + } + + public static void addVisuals( Level level, Scene scene ) { + for (int i=0; i < LENGTH; i++) { + if (level.map[i] == 63) { + scene.add( new Stream( i ) ); + } + } + } + + private static class Stream extends Group { + + private int pos; + + private float delay; + + public Stream( int pos ) { + super(); + + this.pos = pos; + + delay = Random.Float( 2 ); + } + + @Override + public void update() { + + if (visible = Dungeon.visible[pos]) { + + super.update(); + + if ((delay -= Game.elapsed) <= 0) { + + delay = Random.Float( 2 ); + + PointF p = DungeonTilemap.tileToWorld( pos ); + ((FireParticle)recycle( FireParticle.class )).reset( + p.x + Random.Float( DungeonTilemap.SIZE ), + p.y + Random.Float( DungeonTilemap.SIZE ) ); + } + } + } + + @Override + public void draw() { + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE ); + super.draw(); + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); + } + } + + public static class FireParticle extends PixelParticle.Shrinking { + + public FireParticle() { + super(); + + color( 0xEE7722 ); + lifespan = 1f; + + acc.set( 0, +80 ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + left = lifespan; + + speed.set( 0, -40 ); + size = 4; + } + + @Override + public void update() { + super.update(); + float p = left / lifespan; + am = p > 0.8f ? (1 - p) * 5 : 1; + } + } +} diff --git a/src/com/watabou/pixeldungeon/levels/LastLevel.java b/src/com/watabou/pixeldungeon/levels/LastLevel.java new file mode 100644 index 0000000000..6df523ea75 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/LastLevel.java @@ -0,0 +1,131 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import java.util.Arrays; + +import com.watabou.noosa.Scene; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.items.Amulet; +import com.watabou.pixeldungeon.levels.painters.Painter; +import com.watabou.utils.Random; + +public class LastLevel extends Level { + + private static final int SIZE = 7; + + { + color1 = 0x801500; + color2 = 0xa68521; + } + + private int pedestal; + + @Override + public String tilesTex() { + return Assets.TILES_HALLS; + } + + @Override + public String waterTex() { + return Assets.WATER_HALLS; + } + + @Override + protected boolean build() { + + Arrays.fill( map, Terrain.WALL ); + Painter.fill( this, 1, 1, SIZE, SIZE, Terrain.WATER ); + Painter.fill( this, 2, 2, SIZE-2, SIZE-2, Terrain.EMPTY ); + Painter.fill( this, SIZE/2, SIZE/2, 3, 3, Terrain.EMPTY_SP ); + + entrance = SIZE * WIDTH + SIZE / 2 + 1; + map[entrance] = Terrain.ENTRANCE; + + exit = entrance - WIDTH * SIZE; + map[exit] = Terrain.LOCKED_EXIT; + + pedestal = (SIZE / 2 + 1) * (WIDTH + 1); + map[pedestal] = Terrain.PEDESTAL; + map[pedestal-1] = map[pedestal+1] = Terrain.STATUE_SP; + + feeling = Feeling.NONE; + + return true; + } + + @Override + protected void decorate() { + for (int i=0; i < LENGTH; i++) { + if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) { + map[i] = Terrain.EMPTY_DECO; + } + } + } + + @Override + protected void createMobs() { + } + + @Override + protected void createItems() { + drop( new Amulet(), pedestal ); + } + + @Override + public int randomRespawnCell() { + return -1; + } + + @Override + public String tileName( int tile ) { + switch (tile) { + case Terrain.WATER: + return "Cold lava"; + case Terrain.GRASS: + return "Embermoss"; + case Terrain.HIGH_GRASS: + return "Emberfungi"; + case Terrain.STATUE: + case Terrain.STATUE_SP: + return "Pillar"; + default: + return super.tileName( tile ); + } + } + + @Override + public String tileDesc(int tile) { + switch (tile) { + case Terrain.WATER: + return "It looks like lava, but it's cold and probably safe to touch."; + case Terrain.EMPTY_DECO: + return "Candles on the floor are probably remains of some ritual that took place here."; + case Terrain.STATUE: + case Terrain.STATUE_SP: + return "The pillar is made of real humanoid skulls. Awesome."; + default: + return super.tileDesc( tile ); + } + } + + @Override + public void addVisuals( Scene scene ) { + HallsLevel.addVisuals( this, scene ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/LastShopLevel.java b/src/com/watabou/pixeldungeon/levels/LastShopLevel.java new file mode 100644 index 0000000000..981cbc1cb0 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/LastShopLevel.java @@ -0,0 +1,225 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import java.util.List; + +import com.watabou.noosa.Scene; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Bones; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.mobs.npcs.Imp; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.levels.Room.Type; +import com.watabou.utils.Graph; +import com.watabou.utils.Random; + +public class LastShopLevel extends RegularLevel { + + { + color1 = 0x4b6636; + color2 = 0xf2f2f2; + } + + @Override + public String tilesTex() { + return Assets.TILES_CITY; + } + + @Override + public String waterTex() { + return Assets.WATER_CITY; + } + + @Override + protected boolean build() { + + initRooms(); + + int distance; + int retry = 0; + int minDistance = (int)Math.sqrt( rooms.size() ); + do { + int innerRetry = 0; + do { + if (innerRetry++ > 10) { + return false; + } + roomEntrance = Random.element( rooms ); + } while (roomEntrance.width() < 4 || roomEntrance.height() < 4); + + innerRetry = 0; + do { + if (innerRetry++ > 10) { + return false; + } + roomExit = Random.element( rooms ); + } while (roomExit == roomEntrance || roomExit.width() < 6 || roomExit.height() < 6 || roomExit.top == 0); + + Graph.buildDistanceMap( rooms, roomExit ); + distance = Graph.buildPath( rooms, roomEntrance, roomExit ).size(); + + if (retry++ > 10) { + return false; + } + + } while (distance < minDistance); + + roomEntrance.type = Type.ENTRANCE; + roomExit.type = Type.EXIT; + + Graph.buildDistanceMap( rooms, roomExit ); + List path = Graph.buildPath( rooms, roomEntrance, roomExit ); + + Graph.setPrice( path, roomEntrance.distance ); + + Graph.buildDistanceMap( rooms, roomExit ); + path = Graph.buildPath( rooms, roomEntrance, roomExit ); + + Room room = roomEntrance; + for (Room next : path) { + room.connect( next ); + room = next; + } + + Room roomShop = null; + int shopSquare = 0; + for (Room r : rooms) { + if (r.type == Type.NULL && r.connected.size() > 0) { + r.type = Type.PASSAGE; + if (r.square() > shopSquare) { + roomShop = r; + shopSquare = r.square(); + } + } + } + + if (roomShop == null || shopSquare < 30) { + return false; + } else { + roomShop.type = Imp.Quest.isCompleted() ? Room.Type.SHOP : Room.Type.STANDARD; + } + + paint(); + + paintWater(); + paintGrass(); + + return true; + } + + @Override + protected void decorate() { + + for (int i=0; i < LENGTH; i++) { + if (map[i] == Terrain.EMPTY && Random.Int( 10 ) == 0) { + + map[i] = Terrain.EMPTY_DECO; + + } else if (map[i] == Terrain.WALL && Random.Int( 8 ) == 0) { + + map[i] = Terrain.WALL_DECO; + + } else if (map[i] == Terrain.SECRET_DOOR) { + + map[i] = Terrain.DOOR; + + } + } + + if (Imp.Quest.isCompleted()) { + while (true) { + int pos = roomEntrance.random(); + if (pos != entrance) { + map[pos] = Terrain.SIGN; + break; + } + } + } + } + + @Override + protected void createMobs() { + } + + public Actor respawner() { + return null; + } + + @Override + protected void createItems() { + Item item = Bones.get(); + if (item != null) { + int pos; + do { + pos = roomEntrance.random(); + } while (pos == entrance || map[pos] == Terrain.SIGN); + drop( item, pos ).type = Heap.Type.SKELETON; + } + } + + @Override + public int randomRespawnCell() { + return -1; + } + + @Override + public String tileName( int tile ) { + switch (tile) { + case Terrain.WATER: + return "Suspiciously colored water"; + case Terrain.HIGH_GRASS: + return "High blooming flowers"; + default: + return super.tileName( tile ); + } + } + + @Override + public String tileDesc(int tile) { + switch (tile) { + case Terrain.ENTRANCE: + return "A ramp leads up to the upper depth."; + case Terrain.EXIT: + return "A ramp leads down to the Inferno."; + case Terrain.WALL_DECO: + case Terrain.EMPTY_DECO: + return "Several tiles are missing here."; + case Terrain.EMPTY_SP: + return "Thick carpet covers the floor."; + default: + return super.tileDesc( tile ); + } + } + + @Override + protected boolean[] water() { + return Patch.generate( 0.35f, 4 ); + } + + @Override + protected boolean[] grass() { + return Patch.generate( 0.30f, 3 ); + } + + @Override + public void addVisuals( Scene scene ) { + CityLevel.addVisuals( this, scene ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/Level.java b/src/com/watabou/pixeldungeon/levels/Level.java new file mode 100644 index 0000000000..4aa1ff729c --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/Level.java @@ -0,0 +1,973 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; + +import com.watabou.noosa.Scene; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Alchemy; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.WellWater; +import com.watabou.pixeldungeon.actors.buffs.Awareness; +import com.watabou.pixeldungeon.actors.buffs.Blindness; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.MindVision; +import com.watabou.pixeldungeon.actors.buffs.Shadows; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.actors.mobs.Bestiary; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.particles.FlowParticle; +import com.watabou.pixeldungeon.effects.particles.WindParticle; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.Stylus; +import com.watabou.pixeldungeon.items.potions.PotionOfStrength; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfUpgrade; +import com.watabou.pixeldungeon.levels.features.Chasm; +import com.watabou.pixeldungeon.levels.features.Door; +import com.watabou.pixeldungeon.levels.features.HighGrass; +import com.watabou.pixeldungeon.levels.painters.Painter; +import com.watabou.pixeldungeon.levels.traps.*; +import com.watabou.pixeldungeon.mechanics.ShadowCaster; +import com.watabou.pixeldungeon.plants.Plant; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; +import com.watabou.utils.SparseArray; + +public abstract class Level implements Bundlable { + + public static enum Feeling { + NONE, + CHASM, + WATER, + GRASS + }; + + public static final int WIDTH = 32; + public static final int HEIGHT = 32; + public static final int LENGTH = WIDTH * HEIGHT; + + public static final int[] NEIGHBOURS4 = {-WIDTH, +1, +WIDTH, -1}; + public static final int[] NEIGHBOURS8 = {+1, -1, +WIDTH, -WIDTH, +1+WIDTH, +1-WIDTH, -1+WIDTH, -1-WIDTH}; + public static final int[] NEIGHBOURS9 = {0, +1, -1, +WIDTH, -WIDTH, +1+WIDTH, +1-WIDTH, -1+WIDTH, -1-WIDTH}; + + protected static final float TIME_TO_RESPAWN = 50; + + private static final String TXT_HIDDEN_PLATE_CLICKS = "A hidden pressure plate clicks!"; + + public static boolean resizingNeeded; + // This one can be different from resizingNeeded if the level + // was created in the older version of the game + public static int loadedMapSize; + + public int[] map; + public boolean[] visited; + public boolean[] mapped; + + public int viewDistance = 8; + + public static boolean[] fieldOfView = new boolean[LENGTH]; + + public static boolean[] passable = new boolean[LENGTH]; + public static boolean[] losBlocking = new boolean[LENGTH]; + public static boolean[] flamable = new boolean[LENGTH]; + public static boolean[] secret = new boolean[LENGTH]; + public static boolean[] solid = new boolean[LENGTH]; + public static boolean[] avoid = new boolean[LENGTH]; + public static boolean[] water = new boolean[LENGTH]; + public static boolean[] pit = new boolean[LENGTH]; + + public static boolean[] discoverable = new boolean[LENGTH]; + + public Feeling feeling = Feeling.NONE; + + public int entrance; + public int exit; + + public HashSet mobs; + public SparseArray heaps; + public HashMap,Blob> blobs; + public SparseArray plants; + + protected ArrayList itemsToSpawn = new ArrayList(); + + public int color1 = 0x004400; + public int color2 = 0x88CC44; + + protected static boolean pitRoomNeeded = false; + protected static boolean weakFloorCreated = false; + + private static final String MAP = "map"; + private static final String VISITED = "visited"; + private static final String MAPPED = "mapped"; + private static final String ENTRANCE = "entrance"; + private static final String EXIT = "exit"; + private static final String HEAPS = "heaps"; + private static final String PLANTS = "plants"; + private static final String MOBS = "mobs"; + private static final String BLOBS = "blobs"; + + public void create() { + + resizingNeeded = false; + + map = new int[LENGTH]; + visited = new boolean[LENGTH]; + Arrays.fill( visited, false ); + mapped = new boolean[LENGTH]; + Arrays.fill( mapped, false ); + + mobs = new HashSet(); + heaps = new SparseArray(); + blobs = new HashMap,Blob>(); + plants = new SparseArray(); + + if (!Dungeon.bossLevel()) { + addItemToSpawn( Generator.random( Generator.Category.FOOD ) ); + if (Dungeon.posNeeded()) { + addItemToSpawn( new PotionOfStrength() ); + Dungeon.potionOfStrength++; + } + if (Dungeon.soeNeeded()) { + addItemToSpawn( new ScrollOfUpgrade() ); + Dungeon.scrollsOfUpgrade++; + } + if (Dungeon.asNeeded()) { + addItemToSpawn( new Stylus() ); + Dungeon.arcaneStyli++; + } + + if (Dungeon.depth > 1) { + switch (Random.Int( 10 )) { + case 0: + if (!Dungeon.bossLevel( Dungeon.depth + 1 )) { + feeling = Feeling.CHASM; + } + break; + case 1: + feeling = Feeling.WATER; + break; + case 2: + feeling = Feeling.GRASS; + break; + } + } + } + + boolean pitNeeded = Dungeon.depth == 1 ? false : weakFloorCreated; + + do { + Arrays.fill( map, feeling == Feeling.CHASM ? Terrain.CHASM : Terrain.WALL ); + + pitRoomNeeded = pitNeeded; + weakFloorCreated = false; + + } while (!build()); + decorate(); + + buildFlagMaps(); + cleanWalls(); + + createMobs(); + createItems(); + } + + public void reset() { + + for (Mob mob : mobs.toArray( new Mob[0] )) { + if (!mob.reset()) { + mobs.remove( mob ); + } + } + createMobs(); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + + mobs = new HashSet(); + heaps = new SparseArray(); + blobs = new HashMap, Blob>(); + plants = new SparseArray(); + + map = bundle.getIntArray( MAP ); + visited = bundle.getBooleanArray( VISITED ); + mapped = bundle.getBooleanArray( MAPPED ); + + entrance = bundle.getInt( ENTRANCE ); + exit = bundle.getInt( EXIT ); + + adjustMapSize(); + + Collection collection = bundle.getCollection( HEAPS ); + for (Bundlable h : collection) { + Heap heap = (Heap)h; + if (resizingNeeded) { + heap.pos = adjustPos( heap.pos ); + } + heaps.put( heap.pos, heap ); + } + + collection = bundle.getCollection( PLANTS ); + for (Bundlable p : collection) { + Plant plant = (Plant)p; + if (resizingNeeded) { + plant.pos = adjustPos( plant.pos ); + } + plants.put( plant.pos, plant ); + } + + collection = bundle.getCollection( MOBS ); + for (Bundlable m : collection) { + Mob mob = (Mob)m; + if (mob != null) { + if (resizingNeeded) { + mob.pos = adjustPos( mob.pos ); + } + mobs.add( mob ); + } + } + + collection = bundle.getCollection( BLOBS ); + for (Bundlable b : collection) { + Blob blob = (Blob)b; + blobs.put( blob.getClass(), blob ); + } + + buildFlagMaps(); + cleanWalls(); + } + + @Override + public void storeInBundle( Bundle bundle ) { + bundle.put( MAP, map ); + bundle.put( VISITED, visited ); + bundle.put( MAPPED, mapped ); + bundle.put( ENTRANCE, entrance ); + bundle.put( EXIT, exit ); + bundle.put( HEAPS, heaps.values() ); + bundle.put( PLANTS, plants.values() ); + bundle.put( MOBS, mobs ); + bundle.put( BLOBS, blobs.values() ); + } + + public int tunnelTile() { + return feeling == Feeling.CHASM ? Terrain.EMPTY_SP : Terrain.EMPTY; + } + + private void adjustMapSize() { + // For levels from older saves + if (map.length < LENGTH) { + + resizingNeeded = true; + loadedMapSize = (int)Math.sqrt( map.length ); + + int[] map = new int[LENGTH]; + Arrays.fill( map, Terrain.WALL ); + + boolean[] visited = new boolean[LENGTH]; + Arrays.fill( visited, false ); + + boolean[] mapped = new boolean[LENGTH]; + Arrays.fill( mapped, false ); + + for (int i=0; i < loadedMapSize; i++) { + System.arraycopy( this.map, i * loadedMapSize, map, i * WIDTH, loadedMapSize ); + System.arraycopy( this.visited, i * loadedMapSize, visited, i * WIDTH, loadedMapSize ); + System.arraycopy( this.mapped, i * loadedMapSize, mapped, i * WIDTH, loadedMapSize ); + } + + this.map = map; + this.visited = visited; + this.mapped = mapped; + + entrance = adjustPos( entrance ); + exit = adjustPos( exit ); + } else { + resizingNeeded = false; + } + } + + public int adjustPos( int pos ) { + return (pos / loadedMapSize) * WIDTH + (pos % loadedMapSize); + } + + public String tilesTex() { + return null; + } + + public String waterTex() { + return null; + } + + abstract protected boolean build(); + abstract protected void decorate(); + abstract protected void createMobs(); + abstract protected void createItems(); + + public void addVisuals( Scene scene ) { + for (int i=0; i < LENGTH; i++) { + if (pit[i]) { + scene.add( new WindParticle.Wind( i ) ); + if (i >= WIDTH && water[i-WIDTH]) { + scene.add( new FlowParticle.Flow( i - WIDTH ) ); + } + } + } + } + + public int nMobs() { + return 0; + } + + public Actor respawner() { + return new Actor() { + @Override + protected boolean act() { + if (mobs.size() < nMobs()) { + + Mob mob = Bestiary.mutable( Dungeon.depth ); + mob.state = Mob.State.WANDERING; + mob.pos = randomRespawnCell(); + if (Dungeon.hero.isAlive() && mob.pos != -1) { + GameScene.add( mob ); + if (Statistics.amuletObtained) { + mob.beckon( Dungeon.hero.pos ); + } + } + } + spend( Dungeon.nightMode || Statistics.amuletObtained ? TIME_TO_RESPAWN / 2 : TIME_TO_RESPAWN ); + return true; + } + }; + } + + public int randomRespawnCell() { + int cell; + do { + cell = Random.Int( LENGTH ); + } while (!passable[cell] || Dungeon.visible[cell] || Actor.findChar( cell ) != null); + return cell; + } + + public int randomDestination() { + int cell; + do { + cell = Random.Int( LENGTH ); + } while (!passable[cell]); + return cell; + } + + public void addItemToSpawn( Item item ) { + if (item != null) { + itemsToSpawn.add( item ); + } + } + + public Item itemToSpanAsPrize() { + if (Random.Int( itemsToSpawn.size() + 1 ) > 0) { + Item item = Random.element( itemsToSpawn ); + itemsToSpawn.remove( item ); + return item; + } else { + return null; + } + } + + private void buildFlagMaps() { + + for (int i=0; i < LENGTH; i++) { + int flags = Terrain.flags[map[i]]; + passable[i] = (flags & Terrain.PASSABLE) != 0; + losBlocking[i] = (flags & Terrain.LOS_BLOCKING) != 0; + flamable[i] = (flags & Terrain.FLAMABLE) != 0; + secret[i] = (flags & Terrain.SECRET) != 0; + solid[i] = (flags & Terrain.SOLID) != 0; + avoid[i] = (flags & Terrain.AVOID) != 0; + water[i] = (flags & Terrain.LIQUID) != 0; + pit[i] = (flags & Terrain.PIT) != 0; + } + + int lastRow = LENGTH - WIDTH; + for (int i=0; i < WIDTH; i++) { + passable[i] = avoid[i] = false; + passable[lastRow + i] = avoid[lastRow + i] = false; + } + for (int i=WIDTH; i < lastRow; i += WIDTH) { + passable[i] = avoid[i] = false; + passable[i + WIDTH-1] = avoid[i + WIDTH-1] = false; + } + + for (int i=WIDTH; i < LENGTH - WIDTH; i++) { + + if (water[i]) { + int t = Terrain.WATER_TILES; + for (int j=0; j < NEIGHBOURS4.length; j++) { + if ((Terrain.flags[map[i + NEIGHBOURS4[j]]] & Terrain.UNSTITCHABLE) != 0) { + t += 1 << j; + } + } + map[i] = t; + } + + if (pit[i]) { + if (!pit[i - WIDTH]) { + int c = map[i - WIDTH]; + if (c == Terrain.EMPTY_SP || c == Terrain.STATUE_SP) { + map[i] = Terrain.CHASM_FLOOR_SP; + } else if (water[i - WIDTH]) { + map[i] = Terrain.CHASM_WATER; + } else if ((Terrain.flags[c] & Terrain.UNSTITCHABLE) != 0) { + map[i] = Terrain.CHASM_WALL; + } else { + map[i] = Terrain.CHASM_FLOOR; + } + } + } + } + } + + private void cleanWalls() { + for (int i=0; i < LENGTH; i++) { + + boolean d = false; + + for (int j=0; j < NEIGHBOURS9.length; j++) { + int n = i + NEIGHBOURS9[j]; + if (n >= 0 && n < LENGTH && map[n] != Terrain.WALL && map[n] != Terrain.WALL_DECO) { + d = true; + break; + } + } + + if (d) { + d = false; + + for (int j=0; j < NEIGHBOURS9.length; j++) { + int n = i + NEIGHBOURS9[j]; + if (n >= 0 && n < LENGTH && !pit[n]) { + d = true; + break; + } + } + } + + discoverable[i] = d; + } + } + + public static void set( int cell, int terrain ) { + Painter.set( Dungeon.level, cell, terrain ); + + int flags = Terrain.flags[terrain]; + passable[cell] = (flags & Terrain.PASSABLE) != 0; + losBlocking[cell] = (flags & Terrain.LOS_BLOCKING) != 0; + flamable[cell] = (flags & Terrain.FLAMABLE) != 0; + secret[cell] = (flags & Terrain.SECRET) != 0; + solid[cell] = (flags & Terrain.SOLID) != 0; + avoid[cell] = (flags & Terrain.AVOID) != 0; + pit[cell] = (flags & Terrain.PIT) != 0; + water[cell] = terrain == Terrain.WATER || terrain >= Terrain.WATER_TILES; + } + + public Heap drop( Item item, int cell ) { + + if ((map[cell] == Terrain.ALCHEMY) && !(item instanceof Plant.Seed)) { + int n; + do { + n = cell + NEIGHBOURS8[Random.Int( 8 )]; + } while (map[n] != Terrain.EMPTY_SP); + cell = n; + } + + Heap heap = heaps.get( cell ); + if (heap == null) { + + heap = new Heap(); + heap.pos = cell; + if (map[cell] == Terrain.CHASM || (Dungeon.level != null && pit[cell])) { + GameScene.discard( heap ); + } else { + heaps.put( cell, heap ); + GameScene.add( heap ); + } + + } else if (heap.type == Heap.Type.LOCKED_CHEST || heap.type == Heap.Type.CRYSTAL_CHEST) { + + int n; + do { + n = cell + Level.NEIGHBOURS8[Random.Int( 8 )]; + } while (!Level.passable[n] && !Level.avoid[n]); + return drop( item, n ); + + } + heap.drop( item ); + + if (Dungeon.level != null) { + press( cell, null ); + } + + return heap; + } + + public Plant plant( Plant.Seed seed, int pos ) { + + Plant plant = plants.get( pos ); + if (plant != null) { + plant.wither(); + } + + plant = seed.couch( pos ); + plants.put( pos, plant ); + + GameScene.add( plant ); + + return plant; + } + + public void uproot( int pos ) { + plants.delete( pos ); + } + + public int pitCell() { + return randomRespawnCell(); + } + + public void press( int cell, Char ch ) { + + if (pit[cell] && ch == Dungeon.hero) { + Chasm.heroFall( cell ); + return; + } + + boolean trap = false; + + switch (map[cell]) { + + case Terrain.SECRET_TOXIC_TRAP: + GLog.i( TXT_HIDDEN_PLATE_CLICKS ); + case Terrain.TOXIC_TRAP: + trap = true; + ToxicTrap.trigger( cell, ch ); + break; + + case Terrain.SECRET_FIRE_TRAP: + GLog.i( TXT_HIDDEN_PLATE_CLICKS ); + case Terrain.FIRE_TRAP: + trap = true; + FireTrap.trigger( cell, ch ); + break; + + case Terrain.SECRET_PARALYTIC_TRAP: + GLog.i( TXT_HIDDEN_PLATE_CLICKS ); + case Terrain.PARALYTIC_TRAP: + trap = true; + ParalyticTrap.trigger( cell, ch ); + break; + + case Terrain.SECRET_POISON_TRAP: + GLog.i( TXT_HIDDEN_PLATE_CLICKS ); + case Terrain.POISON_TRAP: + trap = true; + PoisonTrap.trigger( cell, ch ); + break; + + case Terrain.SECRET_ALARM_TRAP: + GLog.i( TXT_HIDDEN_PLATE_CLICKS ); + case Terrain.ALARM_TRAP: + trap = true; + AlarmTrap.trigger( cell, ch ); + break; + + case Terrain.SECRET_LIGHTNING_TRAP: + GLog.i( TXT_HIDDEN_PLATE_CLICKS ); + case Terrain.LIGHTNING_TRAP: + trap = true; + LightningTrap.trigger( cell, ch ); + break; + + case Terrain.SECRET_GRIPPING_TRAP: + GLog.i( TXT_HIDDEN_PLATE_CLICKS ); + case Terrain.GRIPPING_TRAP: + trap = true; + GrippingTrap.trigger( cell, ch ); + break; + + case Terrain.SECRET_SUMMONING_TRAP: + GLog.i( TXT_HIDDEN_PLATE_CLICKS ); + case Terrain.SUMMONING_TRAP: + trap = true; + SummoningTrap.trigger( cell, ch ); + break; + + case Terrain.HIGH_GRASS: + HighGrass.trample( this, cell, ch ); + break; + + case Terrain.WELL: + WellWater.affectCell( cell ); + break; + + case Terrain.ALCHEMY: + if (ch == null) { + Alchemy.transmute( cell ); + } + break; + + case Terrain.DOOR: + Door.enter( cell ); + break; + } + + if (trap) { + Sample.INSTANCE.play( Assets.SND_TRAP ); + if (ch == Dungeon.hero) { + Dungeon.hero.interrupt(); + } + set( cell, Terrain.INACTIVE_TRAP ); + GameScene.updateMap( cell ); + } + + Plant plant = plants.get( cell ); + if (plant != null) { + plant.activate( ch ); + } + } + + public void mobPress( Mob mob ) { + + int cell = mob.pos; + + if (pit[cell] && !mob.flying) { + Chasm.mobFall( mob ); + return; + } + + boolean trap = true; + switch (map[cell]) { + + case Terrain.TOXIC_TRAP: + ToxicTrap.trigger( cell, mob ); + break; + + case Terrain.FIRE_TRAP: + FireTrap.trigger( cell, mob ); + break; + + case Terrain.PARALYTIC_TRAP: + ParalyticTrap.trigger( cell, mob ); + break; + + case Terrain.POISON_TRAP: + PoisonTrap.trigger( cell, mob ); + break; + + case Terrain.ALARM_TRAP: + AlarmTrap.trigger( cell, mob ); + break; + + case Terrain.LIGHTNING_TRAP: + LightningTrap.trigger( cell, mob ); + break; + + case Terrain.GRIPPING_TRAP: + GrippingTrap.trigger( cell, mob ); + break; + + case Terrain.SUMMONING_TRAP: + SummoningTrap.trigger( cell, mob ); + break; + + case Terrain.DOOR: + Door.enter( cell ); + + default: + trap = false; + } + + if (trap) { + if (Dungeon.visible[cell]) { + Sample.INSTANCE.play( Assets.SND_TRAP ); + } + set( cell, Terrain.INACTIVE_TRAP ); + GameScene.updateMap( cell ); + } + + Plant plant = plants.get( cell ); + if (plant != null) { + plant.activate( mob ); + } + } + + public boolean[] updateFieldOfView( Char c ) { + + int cx = c.pos % WIDTH; + int cy = c.pos / WIDTH; + + boolean sighted = c.buff( Blindness.class ) == null && c.buff( Shadows.class ) == null && c.isAlive(); + if (sighted) { + ShadowCaster.castShadow( cx, cy, fieldOfView, c.viewDistance ); + } else { + Arrays.fill( fieldOfView, false ); + } + + int sense = 1; + if (c.isAlive()) { + for (Buff b : c.buffs( MindVision.class )) { + sense = Math.max( ((MindVision)b).distance, sense ); + } + } + + if ((sighted && sense > 1) || !sighted) { + + int ax = Math.max( 0, cx - sense ); + int bx = Math.min( cx + sense, WIDTH - 1 ); + int ay = Math.max( 0, cy - sense ); + int by = Math.min( cy + sense, HEIGHT - 1 ); + + int len = bx - ax + 1; + int pos = ax + ay * WIDTH; + for (int y = ay; y <= by; y++, pos+=WIDTH) { + Arrays.fill( fieldOfView, pos, pos + len, true ); + } + + for (int i=0; i < LENGTH; i++) { + fieldOfView[i] &= discoverable[i]; + } + } + + if (c.isAlive()) { + if (c.buff( MindVision.class ) != null) { + for (Mob mob : mobs) { + int p = mob.pos; + fieldOfView[p] = true; + fieldOfView[p + 1] = true; + fieldOfView[p - 1] = true; + fieldOfView[p + WIDTH + 1] = true; + fieldOfView[p + WIDTH - 1] = true; + fieldOfView[p - WIDTH + 1] = true; + fieldOfView[p - WIDTH - 1] = true; + fieldOfView[p + WIDTH] = true; + fieldOfView[p - WIDTH] = true; + } + } else if (c == Dungeon.hero && ((Hero)c).heroClass == HeroClass.HUNTRESS) { + for (Mob mob : mobs) { + int p = mob.pos; + if (distance( c.pos, p) == 2) { + fieldOfView[p] = true; + fieldOfView[p + 1] = true; + fieldOfView[p - 1] = true; + fieldOfView[p + WIDTH + 1] = true; + fieldOfView[p + WIDTH - 1] = true; + fieldOfView[p - WIDTH + 1] = true; + fieldOfView[p - WIDTH - 1] = true; + fieldOfView[p + WIDTH] = true; + fieldOfView[p - WIDTH] = true; + } + } + } + if (c.buff( Awareness.class ) != null) { + + for (Heap heap : heaps.values()) { + int p = heap.pos; + fieldOfView[p] = true; + fieldOfView[p + 1] = true; + fieldOfView[p - 1] = true; + fieldOfView[p + WIDTH + 1] = true; + fieldOfView[p + WIDTH - 1] = true; + fieldOfView[p - WIDTH + 1] = true; + fieldOfView[p - WIDTH - 1] = true; + fieldOfView[p + WIDTH] = true; + fieldOfView[p - WIDTH] = true; + } + } + } + + return fieldOfView; + } + + public static int distance( int a, int b ) { + int ax = a % WIDTH; + int ay = a / WIDTH; + int bx = b % WIDTH; + int by = b / WIDTH; + return Math.max( Math.abs( ax - bx ), Math.abs( ay - by ) ); + } + + public static boolean adjacent( int a, int b ) { + int diff = Math.abs( a - b ); + return diff == 1 || diff == WIDTH || diff == WIDTH + 1 || diff == WIDTH - 1; + } + + public String tileName( int tile ) { + + if (tile >= Terrain.WATER_TILES) { + return tileName( Terrain.WATER ); + } + + if (tile != Terrain.CHASM && (Terrain.flags[tile] & Terrain.PIT) != 0) { + return tileName( Terrain.CHASM ); + } + + switch (tile) { + case Terrain.CHASM: + return "Chasm"; + case Terrain.EMPTY: + case Terrain.EMPTY_SP: + case Terrain.EMPTY_DECO: + case Terrain.SECRET_TOXIC_TRAP: + case Terrain.SECRET_FIRE_TRAP: + case Terrain.SECRET_PARALYTIC_TRAP: + case Terrain.SECRET_POISON_TRAP: + case Terrain.SECRET_ALARM_TRAP: + case Terrain.SECRET_LIGHTNING_TRAP: + return "Floor"; + case Terrain.GRASS: + return "Grass"; + case Terrain.WATER: + return "Water"; + case Terrain.WALL: + case Terrain.WALL_DECO: + case Terrain.SECRET_DOOR: + return "Wall"; + case Terrain.DOOR: + return "Closed door"; + case Terrain.OPEN_DOOR: + return "Open door"; + case Terrain.ENTRANCE: + return "Depth entrance"; + case Terrain.EXIT: + return "Depth exit"; + case Terrain.EMBERS: + return "Embers"; + case Terrain.LOCKED_DOOR: + return "Locked door"; + case Terrain.PEDESTAL: + return "Pedestal"; + case Terrain.BARRICADE: + return "Barricade"; + case Terrain.HIGH_GRASS: + return "High grass"; + case Terrain.LOCKED_EXIT: + return "Locked depth exit"; + case Terrain.UNLOCKED_EXIT: + return "Unlocked depth exit"; + case Terrain.SIGN: + return "Sign"; + case Terrain.WELL: + return "Well"; + case Terrain.EMPTY_WELL: + return "Empty well"; + case Terrain.STATUE: + case Terrain.STATUE_SP: + return "Statue"; + case Terrain.TOXIC_TRAP: + return "Toxic gas trap"; + case Terrain.FIRE_TRAP: + return "Fire trap"; + case Terrain.PARALYTIC_TRAP: + return "Paralytic gas trap"; + case Terrain.POISON_TRAP: + return "Poison dart trap"; + case Terrain.ALARM_TRAP: + return "Alarm trap"; + case Terrain.LIGHTNING_TRAP: + return "Lightning trap"; + case Terrain.GRIPPING_TRAP: + return "Gripping trap"; + case Terrain.SUMMONING_TRAP: + return "Summoning trap"; + case Terrain.INACTIVE_TRAP: + return "Triggered trap"; + case Terrain.BOOKSHELF: + return "Bookshelf"; + case Terrain.ALCHEMY: + return "Alchemy pot"; + default: + return "???"; + } + } + + public String tileDesc( int tile ) { + + switch (tile) { + case Terrain.CHASM: + return "You can't see the bottom."; + case Terrain.WATER: + return "In case of burning step into the water to extinguish the fire."; + case Terrain.ENTRANCE: + return "Stairs lead up to the upper depth."; + case Terrain.EXIT: + case Terrain.UNLOCKED_EXIT: + return "Stairs lead down to the lower depth."; + case Terrain.EMBERS: + return "Embers cover the floor."; + case Terrain.HIGH_GRASS: + return "Dense vegetation blocks the view."; + case Terrain.LOCKED_DOOR: + return "This door is locked, you need a matching key to unlock it."; + case Terrain.LOCKED_EXIT: + return "Heavy bars block the stairs leading down."; + case Terrain.BARRICADE: + return "The wooden barricade is firmly set but has dried over the years. Might it burn?"; + case Terrain.SIGN: + return "You can't read the text from here."; + case Terrain.TOXIC_TRAP: + case Terrain.FIRE_TRAP: + case Terrain.PARALYTIC_TRAP: + case Terrain.POISON_TRAP: + case Terrain.ALARM_TRAP: + case Terrain.LIGHTNING_TRAP: + case Terrain.GRIPPING_TRAP: + case Terrain.SUMMONING_TRAP: + return "Stepping onto a hidden pressure plate will activate the trap."; + case Terrain.INACTIVE_TRAP: + return "The trap has been triggered before and it's not dangerous anymore."; + case Terrain.STATUE: + case Terrain.STATUE_SP: + return "Someone wanted to adorn this place, but failed, obviously."; + case Terrain.ALCHEMY: + return "Drop some seeds here to cook a potion."; + case Terrain.EMPTY_WELL: + return "The well has run dry."; + default: + if (tile >= Terrain.WATER_TILES) { + return tileDesc( Terrain.WATER ); + } + if ((Terrain.flags[tile] & Terrain.PIT) != 0) { + return tileDesc( Terrain.CHASM ); + } + return ""; + } + } +} diff --git a/src/com/watabou/pixeldungeon/levels/Patch.java b/src/com/watabou/pixeldungeon/levels/Patch.java new file mode 100644 index 0000000000..85563a8314 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/Patch.java @@ -0,0 +1,85 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import com.watabou.utils.Random; + +public class Patch { + + private static boolean[] cur = new boolean[Level.LENGTH]; + private static boolean[] off = new boolean[Level.LENGTH]; + + public static boolean[] generate( float seed, int nGen ) { + + int w = Level.WIDTH; + int h = Level.HEIGHT; + + for (int i=0; i < Level.LENGTH; i++) { + off[i] = Random.Float() < seed; + } + + for (int i=0; i < nGen; i++) { + + for (int y=1; y < h-1; y++) { + for (int x=1; x < w-1; x++) { + + int pos = x + y * w; + int count = 0; + if (off[pos-w-1]) { + count++; + } + if (off[pos-w]) { + count++; + } + if (off[pos-w+1]) { + count++; + } + if (off[pos-1]) { + count++; + } + if (off[pos+1]) { + count++; + } + if (off[pos+w-1]) { + count++; + } + if (off[pos+w]) { + count++; + } + if (off[pos+w+1]) { + count++; + } + + if (!off[pos] && count >= 5) { + cur[pos] = true; + } else if (off[pos] && count >= 4) { + cur[pos] = true; + } else { + cur[pos] = false; + } + } + } + + boolean[] tmp = cur; + cur = off; + off = tmp; + } + + return off; + } +} diff --git a/src/com/watabou/pixeldungeon/levels/PrisonBossLevel.java b/src/com/watabou/pixeldungeon/levels/PrisonBossLevel.java new file mode 100644 index 0000000000..8d27cf5c19 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/PrisonBossLevel.java @@ -0,0 +1,376 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import java.util.List; + +import com.watabou.noosa.Scene; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Bones; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.Bestiary; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.keys.IronKey; +import com.watabou.pixeldungeon.items.keys.SkeletonKey; +import com.watabou.pixeldungeon.levels.Room.Type; +import com.watabou.pixeldungeon.levels.painters.Painter; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.Bundle; +import com.watabou.utils.Graph; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class PrisonBossLevel extends RegularLevel { + + { + color1 = 0x6a723d; + color2 = 0x88924c; + } + + private Room anteroom; + private int arenaDoor; + + private boolean enteredArena = false; + private boolean keyDropped = false; + + @Override + public String tilesTex() { + return Assets.TILES_PRISON; + } + + @Override + public String waterTex() { + return Assets.WATER_PRISON; + } + + private static final String ARENA = "arena"; + private static final String DOOR = "door"; + private static final String ENTERED = "entered"; + private static final String DROPPED = "droppped"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( ARENA, roomExit ); + bundle.put( DOOR, arenaDoor ); + bundle.put( ENTERED, enteredArena ); + bundle.put( DROPPED, keyDropped ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + roomExit = (Room)bundle.get( ARENA ); + arenaDoor = bundle.getInt( DOOR ); + enteredArena = bundle.getBoolean( ENTERED ); + keyDropped = bundle.getBoolean( DROPPED ); + } + + @Override + protected boolean build() { + + initRooms(); + + int distance; + int retry = 0; + + do { + + if (retry++ > 10) { + return false; + } + + int innerRetry = 0; + do { + if (innerRetry++ > 10) { + return false; + } + roomEntrance = Random.element( rooms ); + } while (roomEntrance.width() < 4 || roomEntrance.height() < 4); + + innerRetry = 0; + do { + if (innerRetry++ > 10) { + return false; + } + roomExit = Random.element( rooms ); + } while ( + roomExit == roomEntrance || + roomExit.width() < 7 || + roomExit.height() < 7 || + roomExit.top == 0); + + Graph.buildDistanceMap( rooms, roomExit ); + distance = Graph.buildPath( rooms, roomEntrance, roomExit ).size(); + + } while (distance < 3); + + roomEntrance.type = Type.ENTRANCE; + roomExit.type = Type.BOSS_EXIT; + + List path = Graph.buildPath( rooms, roomEntrance, roomExit ); + Graph.setPrice( path, roomEntrance.distance ); + + Graph.buildDistanceMap( rooms, roomExit ); + path = Graph.buildPath( rooms, roomEntrance, roomExit ); + + anteroom = path.get( path.size() - 2 ); + anteroom.type = Type.STANDARD; + + Room room = roomEntrance; + for (Room next : path) { + room.connect( next ); + room = next; + } + + for (Room r : rooms) { + if (r.type == Type.NULL && r.connected.size() > 0) { + r.type = Type.PASSAGE; + } + } + + paint(); + + Room r = (Room)roomExit.connected.keySet().toArray()[0]; + if (roomExit.connected.get( r ).y == roomExit.top) { + return false; + } + + paintWater(); + paintGrass(); + + placeTraps(); + + return true; + } + + protected boolean[] water() { + return Patch.generate( 0.45f, 5 ); + } + + protected boolean[] grass() { + return Patch.generate( 0.30f, 4 ); + } + + protected void paintDoors( Room r ) { + + for (Room n : r.connected.keySet()) { + + if (r.type == Type.NULL) { + continue; + } + + Point door = r.connected.get( n ); + + if (r.type == Room.Type.PASSAGE && n.type == Room.Type.PASSAGE) { + + Painter.set( this, door, Terrain.EMPTY ); + + } else { + + Painter.set( this, door, Terrain.DOOR ); + + } + + } + } + + @Override + protected void placeTraps() { + + int nTraps = nTraps(); + + for (int i=0; i < nTraps; i++) { + + int trapPos = Random.Int( LENGTH ); + + if (map[trapPos] == Terrain.EMPTY) { + map[trapPos] = Terrain.POISON_TRAP; + } + } + } + + @Override + protected void decorate() { + + for (int i=WIDTH + 1; i < LENGTH - WIDTH - 1; i++) { + if (map[i] == Terrain.EMPTY) { + + float c = 0.15f; + if (map[i + 1] == Terrain.WALL && map[i + WIDTH] == Terrain.WALL) { + c += 0.2f; + } + if (map[i - 1] == Terrain.WALL && map[i + WIDTH] == Terrain.WALL) { + c += 0.2f; + } + if (map[i + 1] == Terrain.WALL && map[i - WIDTH] == Terrain.WALL) { + c += 0.2f; + } + if (map[i - 1] == Terrain.WALL && map[i - WIDTH] == Terrain.WALL) { + c += 0.2f; + } + + if (Random.Float() < c) { + map[i] = Terrain.EMPTY_DECO; + } + } + } + + for (int i=0; i < WIDTH; i++) { + if (map[i] == Terrain.WALL && + (map[i + WIDTH] == Terrain.EMPTY || map[i + WIDTH] == Terrain.EMPTY_SP) && + Random.Int( 4 ) == 0) { + + map[i] = Terrain.WALL_DECO; + } + } + + for (int i=WIDTH; i < LENGTH - WIDTH; i++) { + if (map[i] == Terrain.WALL && + map[i - WIDTH] == Terrain.WALL && + (map[i + WIDTH] == Terrain.EMPTY || map[i + WIDTH] == Terrain.EMPTY_SP) && + Random.Int( 2 ) == 0) { + + map[i] = Terrain.WALL_DECO; + } + } + + while (true) { + int pos = roomEntrance.random(); + if (pos != entrance) { + map[pos] = Terrain.SIGN; + break; + } + } + + Point door = roomExit.entrance(); + arenaDoor = door.x + door.y * WIDTH; + Painter.set( this, arenaDoor, Terrain.LOCKED_DOOR ); + + Painter.fill( this, + roomExit.left + 2, + roomExit.top + 2, + roomExit.width() - 3, + roomExit.height() - 3, + Terrain.INACTIVE_TRAP ); + } + + @Override + protected void createMobs() { + } + + public Actor respawner() { + return null; + } + + @Override + protected void createItems() { + + int keyPos = anteroom.random(); + while (!passable[keyPos]) { + keyPos = anteroom.random(); + } + drop( new IronKey( Dungeon.depth ), keyPos ).type = Heap.Type.CHEST; + + Item item = Bones.get(); + if (item != null) { + int pos; + do { + pos = roomEntrance.random(); + } while (pos == entrance || map[pos] == Terrain.SIGN); + drop( item, pos ).type = Heap.Type.SKELETON; + } + } + + @Override + public void press( int cell, Char ch ) { + + super.press( cell, ch ); + + if (ch == Dungeon.hero && !enteredArena && roomExit.inside( cell )) { + + enteredArena = true; + + int pos; + do { + pos = roomExit.random(); + } while (pos == cell || Actor.findChar( pos ) != null); + + Mob boss = Bestiary.mob( Dungeon.depth ); + boss.state = Mob.State.HUNTING; + boss.pos = pos; + GameScene.add( boss ); + boss.notice(); + + mobPress( boss ); + + set( arenaDoor, Terrain.LOCKED_DOOR ); + GameScene.updateMap( arenaDoor ); + Dungeon.observe(); + } + } + + @Override + public Heap drop( Item item, int cell ) { + + if (!keyDropped && item instanceof SkeletonKey) { + + keyDropped = true; + + set( arenaDoor, Terrain.DOOR ); + GameScene.updateMap( arenaDoor ); + Dungeon.observe(); + } + + return super.drop( item, cell ); + } + + @Override + public int randomRespawnCell() { + return -1; + } + + @Override + public String tileName( int tile ) { + switch (tile) { + case Terrain.WATER: + return "Dark cold water."; + default: + return super.tileName( tile ); + } + } + + @Override + public String tileDesc(int tile) { + switch (tile) { + case Terrain.EMPTY_DECO: + return "There are old blood stains on the floor."; + default: + return super.tileDesc( tile ); + } + } + + @Override + public void addVisuals( Scene scene ) { + PrisonLevel.addVisuals( this, scene ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/PrisonLevel.java b/src/com/watabou/pixeldungeon/levels/PrisonLevel.java new file mode 100644 index 0000000000..92773a7a92 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/PrisonLevel.java @@ -0,0 +1,189 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import com.watabou.noosa.Scene; +import com.watabou.noosa.particles.Emitter; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.actors.mobs.npcs.Wandmaker; +import com.watabou.pixeldungeon.effects.Halo; +import com.watabou.pixeldungeon.effects.particles.FlameParticle; +import com.watabou.pixeldungeon.levels.Room.Type; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class PrisonLevel extends RegularLevel { + + { + color1 = 0x6a723d; + color2 = 0x88924c; + } + + @Override + public String tilesTex() { + return Assets.TILES_PRISON; + } + + @Override + public String waterTex() { + return Assets.WATER_PRISON; + } + + protected boolean[] water() { + return Patch.generate( feeling == Feeling.WATER ? 0.65f : 0.45f, 4 ); + } + + protected boolean[] grass() { + return Patch.generate( feeling == Feeling.GRASS ? 0.60f : 0.40f, 3 ); + } + + @Override + protected void assignRoomType() { + super.assignRoomType(); + + for (Room r : rooms) { + if (r.type == Type.TUNNEL) { + r.type = Type.PASSAGE; + } + } + } + + @Override + protected void createMobs() { + super.createMobs(); + + Wandmaker.Quest.spawn( this, roomEntrance ); + } + + @Override + protected void decorate() { + + for (int i=WIDTH + 1; i < LENGTH - WIDTH - 1; i++) { + if (map[i] == Terrain.EMPTY) { + + float c = 0.05f; + if (map[i + 1] == Terrain.WALL && map[i + WIDTH] == Terrain.WALL) { + c += 0.2f; + } + if (map[i - 1] == Terrain.WALL && map[i + WIDTH] == Terrain.WALL) { + c += 0.2f; + } + if (map[i + 1] == Terrain.WALL && map[i - WIDTH] == Terrain.WALL) { + c += 0.2f; + } + if (map[i - 1] == Terrain.WALL && map[i - WIDTH] == Terrain.WALL) { + c += 0.2f; + } + + if (Random.Float() < c) { + map[i] = Terrain.EMPTY_DECO; + } + } + } + + for (int i=0; i < WIDTH; i++) { + if (map[i] == Terrain.WALL && + (map[i + WIDTH] == Terrain.EMPTY || map[i + WIDTH] == Terrain.EMPTY_SP) && + Random.Int( 6 ) == 0) { + + map[i] = Terrain.WALL_DECO; + } + } + + for (int i=WIDTH; i < LENGTH - WIDTH; i++) { + if (map[i] == Terrain.WALL && + map[i - WIDTH] == Terrain.WALL && + (map[i + WIDTH] == Terrain.EMPTY || map[i + WIDTH] == Terrain.EMPTY_SP) && + Random.Int( 3 ) == 0) { + + map[i] = Terrain.WALL_DECO; + } + } + + while (true) { + int pos = roomEntrance.random(); + if (pos != entrance) { + map[pos] = Terrain.SIGN; + break; + } + } + } + + @Override + public String tileName( int tile ) { + switch (tile) { + case Terrain.WATER: + return "Dark cold water."; + default: + return super.tileName( tile ); + } + } + + @Override + public String tileDesc(int tile) { + switch (tile) { + case Terrain.EMPTY_DECO: + return "There are old blood stains on the floor."; + case Terrain.BOOKSHELF: + return "This is probably a vestige of a prison library. Might it burn?"; + default: + return super.tileDesc( tile ); + } + } + + @Override + public void addVisuals( Scene scene ) { + super.addVisuals( scene ); + addVisuals( this, scene ); + } + + public static void addVisuals( Level level, Scene scene ) { + for (int i=0; i < LENGTH; i++) { + if (level.map[i] == Terrain.WALL_DECO) { + scene.add( new Torch( i ) ); + } + } + } + + private static class Torch extends Emitter { + + private int pos; + + public Torch( int pos ) { + super(); + + this.pos = pos; + + PointF p = DungeonTilemap.tileCenterToWorld( pos ); + pos( p.x - 1, p.y + 3, 2, 0 ); + + pour( FlameParticle.FACTORY, 0.15f ); + + add( new Halo( 16, 0xFFFFCC, 0.2f ).point( p.x, p.y ) ); + } + + @Override + public void update() { + if (visible = Dungeon.visible[pos]) { + super.update(); + } + } + } +} \ No newline at end of file diff --git a/src/com/watabou/pixeldungeon/levels/RegularLevel.java b/src/com/watabou/pixeldungeon/levels/RegularLevel.java new file mode 100644 index 0000000000..94b0b0025e --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/RegularLevel.java @@ -0,0 +1,696 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; + +import com.watabou.pixeldungeon.Bones; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.mobs.Bestiary; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfUpgrade; +import com.watabou.pixeldungeon.levels.Room.Type; +import com.watabou.pixeldungeon.levels.painters.*; +import com.watabou.utils.Bundle; +import com.watabou.utils.Graph; +import com.watabou.utils.Random; +import com.watabou.utils.Rect; + +public abstract class RegularLevel extends Level { + + protected HashSet rooms; + + protected Room roomEntrance; + protected Room roomExit; + + protected ArrayList specials; + + public int secretDoors; + + @Override + protected boolean build() { + + if (!initRooms()) { + return false; + } + + int distance; + int retry = 0; + int minDistance = (int)Math.sqrt( rooms.size() ); + do { + do { + roomEntrance = Random.element( rooms ); + } while (roomEntrance.width() < 4 || roomEntrance.height() < 4); + + do { + roomExit = Random.element( rooms ); + } while (roomExit == roomEntrance || roomExit.width() < 4 || roomExit.height() < 4); + + Graph.buildDistanceMap( rooms, roomExit ); + distance = roomEntrance.distance(); + + if (retry++ > 10) { + return false; + } + + } while (distance < minDistance); + + roomEntrance.type = Type.ENTRANCE; + roomExit.type = Type.EXIT; + + HashSet connected = new HashSet(); + connected.add( roomEntrance ); + + Graph.buildDistanceMap( rooms, roomExit ); + List path = Graph.buildPath( rooms, roomEntrance, roomExit ); + + Room room = roomEntrance; + for (Room next : path) { + room.connect( next ); + room = next; + connected.add( room ); + } + + Graph.setPrice( path, roomEntrance.distance ); + + Graph.buildDistanceMap( rooms, roomExit ); + path = Graph.buildPath( rooms, roomEntrance, roomExit ); + + room = roomEntrance; + for (Room next : path) { + room.connect( next ); + room = next; + connected.add( room ); + } + + int nConnected = (int)(rooms.size() * Random.Float( 0.5f, 0.7f )); + while (connected.size() < nConnected) { + + Room cr = Random.element( connected ); + Room or = Random.element( cr.neigbours ); + if (!connected.contains( or )) { + + cr.connect( or ); + connected.add( or ); + } + } + + if (Dungeon.shopOnLevel()) { + Room shop = null; + for (Room r : roomEntrance.connected.keySet()) { + if (r.connected.size() == 1 && r.width() >= 5 && r.height() >= 5) { + shop = r; + break; + } + } + + if (shop == null) { + return false; + } else { + shop.type = Room.Type.SHOP; + } + } + + specials = new ArrayList( Room.SPECIALS ); + if (Dungeon.bossLevel( Dungeon.depth + 1 )) { + specials.remove( Room.Type.WEAK_FLOOR ); + } + assignRoomType(); + + paint(); + paintWater(); + paintGrass(); + + placeTraps(); + + return true; + } + + protected boolean initRooms() { + + rooms = new HashSet(); + split( new Rect( 0, 0, WIDTH - 1, HEIGHT - 1 ) ); + + if (rooms.size() < 8) { + return false; + } + + Room[] ra = rooms.toArray( new Room[0] ); + for (int i=0; i < ra.length-1; i++) { + for (int j=i+1; j < ra.length; j++) { + ra[i].addNeigbour( ra[j] ); + } + } + + return true; + } + + protected void assignRoomType() { + + int specialRooms = 0; + + for (Room r : rooms) { + if (r.type == Type.NULL && + r.connected.size() == 1) { + + if (specials.size() > 0 && + r.width() > 3 && r.height() > 3 && + Random.Int( specialRooms * specialRooms + 2 ) == 0) { + + if (pitRoomNeeded) { + + r.type = Type.PIT; + pitRoomNeeded = false; + + specials.remove( Type.ARMORY ); + specials.remove( Type.CRYPT ); + specials.remove( Type.LABORATORY ); + specials.remove( Type.LIBRARY ); + specials.remove( Type.STATUE ); + specials.remove( Type.TREASURY ); + specials.remove( Type.VAULT ); + specials.remove( Type.WEAK_FLOOR ); + + } else if (Dungeon.depth % 5 == 2 && specials.contains( Type.LABORATORY )) { + + r.type = Type.LABORATORY; + + } else if (Dungeon.depth >= Dungeon.transmutation && specials.contains( Type.MAGIC_WELL )) { + + r.type = Type.MAGIC_WELL; + + } else { + + int n = specials.size(); + r.type = specials.get( Math.min( Random.Int( n ), Random.Int( n ) ) ); + if (r.type == Type.WEAK_FLOOR) { + weakFloorCreated = true; + } + + } + + Room.useType( r.type ); + specials.remove( r.type ); + specialRooms++; + + } else if (Random.Int( 2 ) == 0){ + + HashSet neigbours = new HashSet(); + for (Room n : r.neigbours) { + if (!r.connected.containsKey( n ) && + !Room.SPECIALS.contains( n.type ) && + n.type != Type.PIT) { + + neigbours.add( n ); + } + } + if (neigbours.size() > 1) { + r.connect( Random.element( neigbours ) ); + } + } + } + } + + int count = 0; + for (Room r : rooms) { + if (r.type == Type.NULL) { + int connections = r.connected.size(); + if (connections == 0) { + + } else if (Random.Int( connections * connections ) == 0) { + r.type = Type.STANDARD; + count++; + } else { + r.type = Type.TUNNEL; + } + } + } + + while (count < 4) { + Room r = randomRoom( Type.TUNNEL, 1 ); + if (r != null) { + r.type = Type.STANDARD; + count++; + } + } + } + + protected void paintWater() { + boolean[] lake = water(); + for (int i=0; i < LENGTH; i++) { + if (map[i] == Terrain.EMPTY && lake[i]) { + map[i] = Terrain.WATER; + } + } + } + + protected void paintGrass() { + boolean[] grass = grass(); + + if (feeling == Feeling.GRASS) { + + for (Room room : rooms) { + if (room.type != Type.NULL && room.type != Type.PASSAGE && room.type != Type.TUNNEL) { + grass[(room.left + 1) + (room.top + 1) * WIDTH] = true; + grass[(room.right - 1) + (room.top + 1) * WIDTH] = true; + grass[(room.left + 1) + (room.bottom - 1) * WIDTH] = true; + grass[(room.right - 1) + (room.bottom - 1) * WIDTH] = true; + } + } + } + + for (int i=WIDTH+1; i < LENGTH-WIDTH-1; i++) { + if (map[i] == Terrain.EMPTY && grass[i]) { + int count = 1; + for (int n : NEIGHBOURS8) { + if (grass[i + n]) { + count++; + } + } + map[i] = (Random.Float() < count / 12f) ? Terrain.HIGH_GRASS : Terrain.GRASS; + } + } + } + + protected abstract boolean[] water(); + protected abstract boolean[] grass(); + + protected void placeTraps() { + + int nTraps = nTraps(); + float[] trapChances = trapChances(); + + for (int i=0; i < nTraps; i++) { + + int trapPos = Random.Int( LENGTH ); + + if (map[trapPos] == Terrain.EMPTY) { + switch (Random.chances( trapChances )) { + case 0: + map[trapPos] = Terrain.SECRET_TOXIC_TRAP; + break; + case 1: + map[trapPos] = Terrain.SECRET_FIRE_TRAP; + break; + case 2: + map[trapPos] = Terrain.SECRET_PARALYTIC_TRAP; + break; + case 3: + map[trapPos] = Terrain.SECRET_POISON_TRAP; + break; + case 4: + map[trapPos] = Terrain.SECRET_ALARM_TRAP; + break; + case 5: + map[trapPos] = Terrain.SECRET_LIGHTNING_TRAP; + break; + case 6: + map[trapPos] = Terrain.SECRET_GRIPPING_TRAP; + break; + case 7: + map[trapPos] = Terrain.SECRET_SUMMONING_TRAP; + break; + } + } + } + } + + protected int nTraps() { + return Dungeon.depth <= 1 ? 0 : Random.Int( 1, rooms.size() + Dungeon.depth ); + } + + protected float[] trapChances() { + float[] chances = { 1, 1, 1, 1, 1, 1, 1, 1 }; + return chances; + } + + protected int minRoomSize = 7; + protected int maxRoomSize = 9; + + protected void split( Rect rect ) { + + int w = rect.width(); + int h = rect.height(); + + if (w > maxRoomSize && h < minRoomSize) { + + int vw = Random.Int( rect.left + 3, rect.right - 3 ); + split( new Rect( rect.left, rect.top, vw, rect.bottom ) ); + split( new Rect( vw, rect.top, rect.right, rect.bottom ) ); + + } else + if (h > maxRoomSize && w < minRoomSize) { + + int vh = Random.Int( rect.top + 3, rect.bottom - 3 ); + split( new Rect( rect.left, rect.top, rect.right, vh ) ); + split( new Rect( rect.left, vh, rect.right, rect.bottom ) ); + + } else + if ((Math.random() <= (minRoomSize * minRoomSize / rect.square()) && w <= maxRoomSize && h <= maxRoomSize) || w < minRoomSize || h < minRoomSize) { + + rooms.add( (Room)new Room().set( rect ) ); + + } else { + + if (Random.Float() < (float)(w - 2) / (w + h - 4)) { + int vw = Random.Int( rect.left + 3, rect.right - 3 ); + split( new Rect( rect.left, rect.top, vw, rect.bottom ) ); + split( new Rect( vw, rect.top, rect.right, rect.bottom ) ); + } else { + int vh = Random.Int( rect.top + 3, rect.bottom - 3 ); + split( new Rect( rect.left, rect.top, rect.right, vh ) ); + split( new Rect( rect.left, vh, rect.right, rect.bottom ) ); + } + + } + } + + protected void paint() { + + for (Room r : rooms) { + if (r.type != Type.NULL) { + placeDoors( r ); + r.type.paint( this, r ); + } else { + if (feeling == Feeling.CHASM && Random.Int( 2 ) == 0) { + Painter.fill( this, r, Terrain.WALL ); + } + } + } + + for (Room r : rooms) { + paintDoors( r ); + } + } + + private void placeDoors( Room r ) { + for (Room n : r.connected.keySet()) { + Room.Door door = r.connected.get( n ); + if (door == null) { + + Rect i = r.intersect( n ); + if (i.width() == 0) { + door = new Room.Door( + i.left, + Random.Int( i.top + 1, i.bottom ) ); + } else { + door = new Room.Door( + Random.Int( i.left + 1, i.right ), + i.top); + } + + r.connected.put( n, door ); + n.connected.put( r, door ); + } + } + } + + protected void paintDoors( Room r ) { + for (Room n : r.connected.keySet()) { + + if (joinRooms( r, n )) { + continue; + } + + Room.Door d = r.connected.get( n ); + int door = d.x + d.y * WIDTH; + + switch (d.type) { + case EMPTY: + map[door] = Terrain.EMPTY; + break; + case TUNNEL: + map[door] = tunnelTile(); + break; + case REGULAR: + if (Dungeon.depth <= 1) { + map[door] = Terrain.DOOR; + } else { + boolean secret = (Dungeon.depth < 6 ? Random.Int( 12 - Dungeon.depth ) : Random.Int( 6 )) == 0; + map[door] = secret ? Terrain.SECRET_DOOR : Terrain.DOOR; + if (secret) { + secretDoors++; + } + } + break; + case UNLOCKED: + map[door] = Terrain.DOOR; + break; + case HIDDEN: + map[door] = Terrain.SECRET_DOOR; + break; + case BARRICADE: + map[door] = Random.Int( 3 ) == 0 ? Terrain.BOOKSHELF : Terrain.BARRICADE; + break; + case LOCKED: + map[door] = Terrain.LOCKED_DOOR; + break; + } + } + } + + protected boolean joinRooms( Room r, Room n ) { + + if (r.type != Room.Type.STANDARD || n.type != Room.Type.STANDARD) { + return false; + } + + Rect w = r.intersect( n ); + if (w.left == w.right) { + + if (w.bottom - w.top < 3) { + return false; + } + + if (w.height() == Math.max( r.height(), n.height() )) { + return false; + } + + if (r.width() + n.width() > maxRoomSize) { + return false; + } + + w.top += 1; + w.bottom -= 0; + + w.right++; + + Painter.fill( this, w.left, w.top, 1, w.height(), Terrain.EMPTY ); + + } else { + + if (w.right - w.left < 3) { + return false; + } + + if (w.width() == Math.max( r.width(), n.width() )) { + return false; + } + + if (r.height() + n.height() > maxRoomSize) { + return false; + } + + w.left += 1; + w.right -= 0; + + w.bottom++; + + Painter.fill( this, w.left, w.top, w.width(), 1, Terrain.EMPTY ); + } + + return true; + } + + @Override + public int nMobs() { + return 2 + Dungeon.depth % 5 + Random.Int( 3 ); + } + + @Override + protected void createMobs() { + int nMobs = nMobs(); + for (int i=0; i < nMobs; i++) { + Mob mob = Bestiary.mob( Dungeon.depth ); + do { + mob.pos = randomRespawnCell(); + } while (mob.pos == -1); + mobs.add( mob ); + Actor.occupyCell( mob ); + } + } + + @Override + public int randomRespawnCell() { + int count = 0; + int cell = -1; + + while (true) { + + if (++count > 10) { + return -1; + } + + Room room = randomRoom( Room.Type.STANDARD, 10 ); + if (room == null) { + continue; + } + + cell = room.random(); + if (!Dungeon.visible[cell] && Actor.findChar( cell ) == null && Level.passable[cell]) { + return cell; + } + + } + } + + @Override + public int randomDestination() { + + int cell = -1; + + while (true) { + + Room room = Random.element( rooms ); + if (room == null) { + continue; + } + + cell = room.random(); + if (Level.passable[cell]) { + return cell; + } + + } + } + + @Override + protected void createItems() { + + int nItems = 3; + while (Random.Float() < 0.3f) { + nItems++; + } + + for (int i=0; i < nItems; i++) { + Heap.Type type = null; + switch (Random.Int( 20 )) { + case 0: + type = Heap.Type.SKELETON; + break; + case 1: + case 2: + case 3: + case 4: + type = Heap.Type.CHEST; + break; + default: + type = Heap.Type.HEAP; + } + drop( Generator.random(), randomDropCell() ).type = type; + } + + for (Item item : itemsToSpawn) { + int cell = randomDropCell(); + if (item instanceof ScrollOfUpgrade) { + while (map[cell] == Terrain.FIRE_TRAP || map[cell] == Terrain.SECRET_FIRE_TRAP) { + cell = randomDropCell(); + } + } + drop( item, cell ).type = Heap.Type.HEAP; + } + + Item item = Bones.get(); + if (item != null) { + drop( item, randomDropCell() ).type = Heap.Type.SKELETON; + } + } + + protected Room randomRoom( Room.Type type, int tries ) { + for (int i=0; i < tries; i++) { + Room room = Random.element( rooms ); + if (room.type == type) { + return room; + } + } + return null; + } + + public Room room( int pos ) { + for (Room room : rooms) { + if (room.type != Type.NULL && room.inside( pos )) { + return room; + } + } + + return null; + } + + protected int randomDropCell() { + while (true) { + Room room = randomRoom( Room.Type.STANDARD, 1 ); + if (room != null) { + int pos = room.random(); + if (passable[pos]) { + return pos; + } + } + } + } + + @Override + public int pitCell() { + for (Room room : rooms) { + if (room.type == Type.PIT) { + return room.random(); + } + } + + return super.pitCell(); + } + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( "rooms", rooms ); + } + + @SuppressWarnings("unchecked") + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + + weakFloorCreated = false; + + rooms = new HashSet( (Collection) bundle.getCollection( "rooms" ) ); + for (Room r : rooms) { + if (r.type == Type.WEAK_FLOOR) { + weakFloorCreated = true; + break; + } + } + } + +} diff --git a/src/com/watabou/pixeldungeon/levels/Room.java b/src/com/watabou/pixeldungeon/levels/Room.java new file mode 100644 index 0000000000..b4ff9f4642 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/Room.java @@ -0,0 +1,255 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; + +import com.watabou.pixeldungeon.PixelDungeon; +import com.watabou.pixeldungeon.levels.painters.*; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; +import com.watabou.utils.Graph; +import com.watabou.utils.Point; +import com.watabou.utils.Random; +import com.watabou.utils.Rect; + +public class Room extends Rect implements Graph.Node, Bundlable { + + public HashSet neigbours = new HashSet(); + public HashMap connected = new HashMap(); + + public int distance; + public int price = 1; + + public static enum Type { + NULL( null ), + STANDARD ( StandardPainter.class ), + ENTRANCE ( EntrancePainter.class ), + EXIT ( ExitPainter.class ), + BOSS_EXIT ( BossExitPainter.class ), + TUNNEL ( TunnelPainter.class ), + PASSAGE ( PassagePainter.class ), + SHOP ( ShopPainter.class ), + BLACKSMITH ( BlacksmithPainter.class ), + TREASURY ( TreasuryPainter.class ), + ARMORY ( ArmoryPainter.class ), + LIBRARY ( LibraryPainter.class ), + LABORATORY ( LaboratoryPainter.class ), + VAULT ( VaultPainter.class ), + TRAPS ( TrapsPainter.class ), + STORAGE ( StoragePainter.class ), + MAGIC_WELL ( MagicWellPainter.class ), + GARDEN ( GardenPainter.class ), + CRYPT ( CryptPainter.class ), + STATUE ( StatuePainter.class ), + POOL ( PoolPainter.class ), + RAT_KING ( RatKingPainter.class ), + WEAK_FLOOR ( WeakFloorPainter.class ), + PIT ( PitPainter.class ); + + private Method paint; + + private Type( Class painter ) { + try { + paint = painter.getMethod( "paint", Level.class, Room.class ); + } catch (Exception e) { + paint = null; + } + } + + public void paint( Level level, Room room ) { + try { + paint.invoke( null, level, room ); + } catch (Exception e) { + PixelDungeon.reportException( e ); + } + } + }; + + public static final ArrayList SPECIALS = new ArrayList( Arrays.asList( + Type.WEAK_FLOOR, Type.MAGIC_WELL, Type.CRYPT, Type.POOL, Type.GARDEN, Type.LIBRARY, Type.ARMORY, + Type.TREASURY, Type.TRAPS, Type.STORAGE, Type.STATUE, Type.LABORATORY, Type.VAULT + ) ); + + public Type type = Type.NULL; + + public int random() { + return random( 0 ); + } + + public int random( int m ) { + int x = Random.Int( left + 1 + m, right - m ); + int y = Random.Int( top + 1 + m, bottom - m ); + return x + y * Level.WIDTH; + } + + public void addNeigbour( Room other ) { + + Rect i = intersect( other ); + if ((i.width() == 0 && i.height() >= 3) || + (i.height() == 0 && i.width() >= 3)) { + neigbours.add( other ); + other.neigbours.add( this ); + } + + } + + public void connect( Room room ) { + if (!connected.containsKey( room )) { + connected.put( room, null ); + room.connected.put( this, null ); + } + } + + public Door entrance() { + return connected.values().iterator().next(); + } + + public boolean inside( int p ) { + int x = p % Level.WIDTH; + int y = p / Level.WIDTH; + return x > left && y > top && x < right && y < bottom; + } + + public Point center() { + return new Point( + (left + right) / 2 + (((right - left) & 1) == 1 ? Random.Int( 2 ) : 0), + (top + bottom) / 2 + (((bottom - top) & 1) == 1 ? Random.Int( 2 ) : 0) ); + } + + // **** Graph.Node interface **** + + @Override + public int distance() { + return distance; + } + + @Override + public void distance( int value ) { + distance = value; + } + + @Override + public int price() { + return price; + } + + @Override + public void price( int value ) { + price = value; + } + + @Override + public Collection edges() { + return neigbours; + } + + @Override + public void storeInBundle( Bundle bundle ) { + bundle.put( "left", left ); + bundle.put( "top", top ); + bundle.put( "right", right ); + bundle.put( "bottom", bottom ); + bundle.put( "type", type.toString() ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + left = bundle.getInt( "left" ); + top = bundle.getInt( "top" ); + right = bundle.getInt( "right" ); + bottom = bundle.getInt( "bottom" ); + type = Type.valueOf( bundle.getString( "type" ) ); + } + + public static void shuffleTypes() { + int size = SPECIALS.size(); + for (int i=0; i < size - 1; i++) { + int j = Random.Int( i, size ); + if (j != i) { + Type t = SPECIALS.get( i ); + SPECIALS.set( i, SPECIALS.get( j ) ); + SPECIALS.set( j, t ); + } + } + } + + public static void useType( Type type ) { + if (SPECIALS.remove( type )) { + SPECIALS.add( type ); + } + } + + private static final String ROOMS = "rooms"; + + public static void restoreRoomsFromBundle( Bundle bundle ) { + if (bundle.contains( ROOMS )) { + SPECIALS.clear(); + for (String type : bundle.getStringArray( ROOMS )) { + SPECIALS.add( Type.valueOf( type )); + } + } else { + shuffleTypes(); + } + } + + public static void storeRoomsInBundle( Bundle bundle ) { + String[] array = new String[SPECIALS.size()]; + for (int i=0; i < array.length; i++) { + array[i] = SPECIALS.get( i ).toString(); + } + bundle.put( ROOMS, array ); + } + + public static class Door extends Point { + + public static enum Type { + EMPTY, TUNNEL, REGULAR, UNLOCKED, HIDDEN, BARRICADE, LOCKED + } + public Type type = Type.EMPTY; + + public Door( int x, int y ) { + super( x, y ); + } + + public void set( Type type ) { + if (type.compareTo( this.type ) > 0) { + this.type = type; + } + } + } +} + + + + + + + + + + + + + + diff --git a/src/com/watabou/pixeldungeon/levels/SewerBossLevel.java b/src/com/watabou/pixeldungeon/levels/SewerBossLevel.java new file mode 100644 index 0000000000..d3e0a45a33 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/SewerBossLevel.java @@ -0,0 +1,257 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import java.util.ArrayList; +import java.util.List; + +import com.watabou.noosa.Scene; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Bones; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.mobs.Bestiary; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.levels.Room.Type; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.Bundle; +import com.watabou.utils.Graph; +import com.watabou.utils.Random; + +public class SewerBossLevel extends RegularLevel { + + { + color1 = 0x48763c; + color2 = 0x59994a; + } + + private int stairs = 0; + + @Override + public String tilesTex() { + return Assets.TILES_SEWERS; + } + + @Override + public String waterTex() { + return Assets.WATER_SEWERS; + } + + @Override + protected boolean build() { + + initRooms(); + + int distance; + int retry = 0; + int minDistance = (int)Math.sqrt( rooms.size() ); + do { + int innerRetry = 0; + do { + if (innerRetry++ > 10) { + return false; + } + roomEntrance = Random.element( rooms ); + } while (roomEntrance.width() < 4 || roomEntrance.height() < 4); + + innerRetry = 0; + do { + if (innerRetry++ > 10) { + return false; + } + roomExit = Random.element( rooms ); + } while (roomExit == roomEntrance || roomExit.width() < 6 || roomExit.height() < 6 || roomExit.top == 0); + + Graph.buildDistanceMap( rooms, roomExit ); + distance = roomEntrance.distance(); + + if (retry++ > 10) { + return false; + } + + } while (distance < minDistance); + + roomEntrance.type = Type.ENTRANCE; + roomExit.type = Type.BOSS_EXIT; + + Graph.buildDistanceMap( rooms, roomExit ); + List path = Graph.buildPath( rooms, roomEntrance, roomExit ); + + Graph.setPrice( path, roomEntrance.distance ); + + Graph.buildDistanceMap( rooms, roomExit ); + path = Graph.buildPath( rooms, roomEntrance, roomExit ); + + Room room = roomEntrance; + for (Room next : path) { + room.connect( next ); + room = next; + } + + room = (Room)roomExit.connected.keySet().toArray()[0]; + if (roomExit.top == room.bottom) { + return false; + } + + for (Room r : rooms) { + if (r.type == Type.NULL && r.connected.size() > 0) { + r.type = Type.TUNNEL; + } + } + + ArrayList candidates = new ArrayList(); + for (Room r : roomExit.neigbours) { + if (!roomExit.connected.containsKey( r ) && + (roomExit.left == r.right || roomExit.right == r.left || roomExit.bottom == r.top)) { + candidates.add( r ); + } + } + if (candidates.size() > 0) { + Room kingsRoom = Random.element( candidates ); + kingsRoom.connect( roomExit ); + kingsRoom.type = Room.Type.RAT_KING; + } + + paint(); + + paintWater(); + paintGrass(); + + placeTraps(); + + return true; + } + + protected boolean[] water() { + return Patch.generate( 0.5f, 5 ); + } + + protected boolean[] grass() { + return Patch.generate( 0.40f, 4 ); + } + + @Override + protected void decorate() { + int start = roomExit.top * WIDTH + roomExit.left + 1; + int end = start + roomExit.width() - 1; + for (int i=start; i < end; i++) { + if (i != exit) { + map[i] = Terrain.WALL_DECO; + map[i + WIDTH] = Terrain.WATER; + } else { + map[i + WIDTH] = Terrain.EMPTY; + } + } + + while (true) { + int pos = roomEntrance.random(); + if (pos != entrance) { + map[pos] = Terrain.SIGN; + break; + } + } + } + + @Override + public void addVisuals( Scene scene ) { + SewerLevel.addVisuals( this, scene ); + } + + + @Override + protected void createMobs() { + Mob mob = Bestiary.mob( Dungeon.depth ); + mob.pos = roomExit.random(); + mobs.add( mob ); + } + + public Actor respawner() { + return null; + } + + @Override + protected void createItems() { + Item item = Bones.get(); + if (item != null) { + int pos; + do { + pos = roomEntrance.random(); + } while (pos == entrance || map[pos] == Terrain.SIGN); + drop( item, pos ).type = Heap.Type.SKELETON; + } + } + + public void seal() { + if (entrance != 0) { + + set( entrance, Terrain.WATER_TILES ); + GameScene.updateMap( entrance ); + GameScene.ripple( entrance ); + + stairs = entrance; + entrance = 0; + } + } + + public void unseal() { + if (stairs != 0) { + + entrance = stairs; + stairs = 0; + + set( entrance, Terrain.ENTRANCE ); + GameScene.updateMap( entrance ); + } + } + + private static final String STAIRS = "stairs"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( STAIRS, stairs ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + stairs = bundle.getInt( STAIRS ); + } + + @Override + public String tileName( int tile ) { + switch (tile) { + case Terrain.WATER: + return "Murky water"; + default: + return super.tileName( tile ); + } + } + + @Override + public String tileDesc( int tile ) { + switch (tile) { + case Terrain.EMPTY_DECO: + return "Wet yellowish moss covers the floor."; + default: + return super.tileDesc( tile ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/levels/SewerLevel.java b/src/com/watabou/pixeldungeon/levels/SewerLevel.java new file mode 100644 index 0000000000..e538effc66 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/SewerLevel.java @@ -0,0 +1,220 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Scene; +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.actors.mobs.npcs.Ghost; +import com.watabou.pixeldungeon.items.DewVial; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.ColorMath; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class SewerLevel extends RegularLevel { + + { + color1 = 0x48763c; + color2 = 0x59994a; + } + + @Override + public String tilesTex() { + return Assets.TILES_SEWERS; + } + + @Override + public String waterTex() { + return Assets.WATER_SEWERS; + } + + protected boolean[] water() { + return Patch.generate( feeling == Feeling.WATER ? 0.60f : 0.45f, 5 ); + } + + protected boolean[] grass() { + return Patch.generate( feeling == Feeling.GRASS ? 0.60f : 0.40f, 4 ); + } + + @Override + protected void decorate() { + + for (int i=0; i < WIDTH; i++) { + if (map[i] == Terrain.WALL && + map[i + WIDTH] == Terrain.WATER && + Random.Int( 4 ) == 0) { + + map[i] = Terrain.WALL_DECO; + } + } + + for (int i=WIDTH; i < LENGTH - WIDTH; i++) { + if (map[i] == Terrain.WALL && + map[i - WIDTH] == Terrain.WALL && + map[i + WIDTH] == Terrain.WATER && + Random.Int( 2 ) == 0) { + + map[i] = Terrain.WALL_DECO; + } + } + + for (int i=WIDTH + 1; i < LENGTH - WIDTH - 1; i++) { + if (map[i] == Terrain.EMPTY) { + + int count = + (map[i + 1] == Terrain.WALL ? 1 : 0) + + (map[i - 1] == Terrain.WALL ? 1 : 0) + + (map[i + WIDTH] == Terrain.WALL ? 1 : 0) + + (map[i - WIDTH] == Terrain.WALL ? 1 : 0); + + if (Random.Int( 16 ) < count * count) { + map[i] = Terrain.EMPTY_DECO; + } + } + } + + while (true) { + int pos = roomEntrance.random(); + if (pos != entrance) { + map[pos] = Terrain.SIGN; + break; + } + } + } + + @Override + protected void createMobs() { + super.createMobs(); + + Ghost.Quest.spawn( this ); + } + + @Override + protected void createItems() { + if (Dungeon.dewVial && Random.Int( 4 - Dungeon.depth ) == 0) { + addItemToSpawn( new DewVial() ); + Dungeon.dewVial = false; + } + + super.createItems(); + } + + @Override + public void addVisuals( Scene scene ) { + super.addVisuals( scene ); + addVisuals( this, scene ); + } + + public static void addVisuals( Level level, Scene scene ) { + for (int i=0; i < LENGTH; i++) { + if (level.map[i] == Terrain.WALL_DECO) { + scene.add( new Sink( i ) ); + } + } + } + + @Override + public String tileName( int tile ) { + switch (tile) { + case Terrain.WATER: + return "Murky water"; + default: + return super.tileName( tile ); + } + } + + @Override + public String tileDesc(int tile) { + switch (tile) { + case Terrain.EMPTY_DECO: + return "Wet yellowish moss covers the floor."; + case Terrain.BOOKSHELF: + return "The bookshelf is packed with cheap useless books. Might it burn?"; + default: + return super.tileDesc( tile ); + } + } + + private static class Sink extends Emitter { + + private int pos; + private float rippleDelay = 0; + + private static final Emitter.Factory factory = new Factory() { + + @Override + public void emit( Emitter emitter, int index, float x, float y ) { + WaterParticle p = (WaterParticle)emitter.recycle( WaterParticle.class ); + p.reset( x, y ); + } + }; + + public Sink( int pos ) { + super(); + + this.pos = pos; + + PointF p = DungeonTilemap.tileCenterToWorld( pos ); + pos( p.x - 2, p.y + 1, 4, 0 ); + + pour( factory, 0.05f ); + } + + @Override + public void update() { + if (visible = Dungeon.visible[pos]) { + + super.update(); + + if ((rippleDelay -= Game.elapsed) <= 0) { + GameScene.ripple( pos + WIDTH ).y -= DungeonTilemap.SIZE / 2; + rippleDelay = Random.Float( 0.2f, 0.3f ); + } + } + } + } + + public static final class WaterParticle extends PixelParticle { + + public WaterParticle() { + super(); + + acc.y = 50; + am = 0.5f; + + color( ColorMath.random( 0xb6ccc2, 0x3b6653 ) ); + size( 2 ); + } + + public void reset( float x, float y ) { + revive(); + + this.x = x; + this.y = y; + + speed.set( Random.Float( -2, +2 ), 0 ); + + left = lifespan = 0.5f; + } + } +} diff --git a/src/com/watabou/pixeldungeon/levels/Terrain.java b/src/com/watabou/pixeldungeon/levels/Terrain.java new file mode 100644 index 0000000000..ee3b7e3eb3 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/Terrain.java @@ -0,0 +1,167 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels; + +public class Terrain { + + public static final int CHASM = 0; + public static final int EMPTY = 1; + public static final int GRASS = 2; + public static final int EMPTY_WELL = 3; + public static final int WALL = 4; + public static final int DOOR = 5; + public static final int OPEN_DOOR = 6; + public static final int ENTRANCE = 7; + public static final int EXIT = 8; + public static final int EMBERS = 9; + public static final int LOCKED_DOOR = 10; + public static final int PEDESTAL = 11; + public static final int WALL_DECO = 12; + public static final int BARRICADE = 13; + public static final int EMPTY_SP = 14; + public static final int HIGH_GRASS = 15; + public static final int EMPTY_DECO = 24; + public static final int LOCKED_EXIT = 25; + public static final int UNLOCKED_EXIT = 26; + public static final int SIGN = 29; + public static final int WELL = 34; + public static final int STATUE = 35; + public static final int STATUE_SP = 36; + public static final int BOOKSHELF = 41; + public static final int ALCHEMY = 42; + public static final int CHASM_FLOOR = 43; + public static final int CHASM_FLOOR_SP = 44; + public static final int CHASM_WALL = 45; + public static final int CHASM_WATER = 46; + + public static final int SECRET_DOOR = 16; + public static final int TOXIC_TRAP = 17; + public static final int SECRET_TOXIC_TRAP = 18; + public static final int FIRE_TRAP = 19; + public static final int SECRET_FIRE_TRAP = 20; + public static final int PARALYTIC_TRAP = 21; + public static final int SECRET_PARALYTIC_TRAP = 22; + public static final int INACTIVE_TRAP = 23; + public static final int POISON_TRAP = 27; + public static final int SECRET_POISON_TRAP = 28; + public static final int ALARM_TRAP = 30; + public static final int SECRET_ALARM_TRAP = 31; + public static final int LIGHTNING_TRAP = 32; + public static final int SECRET_LIGHTNING_TRAP = 33; + public static final int GRIPPING_TRAP = 37; + public static final int SECRET_GRIPPING_TRAP = 38; + public static final int SUMMONING_TRAP = 39; + public static final int SECRET_SUMMONING_TRAP = 40; + + public static final int WATER_TILES = 48; + public static final int WATER = 63; + + public static final int PASSABLE = 0x01; + public static final int LOS_BLOCKING = 0x02; + public static final int FLAMABLE = 0x04; + public static final int SECRET = 0x08; + public static final int SOLID = 0x10; + public static final int AVOID = 0x20; + public static final int LIQUID = 0x40; + public static final int PIT = 0x80; + + public static final int UNSTITCHABLE = 0x100; + + public static final int[] flags = new int[256]; + static { + flags[CHASM] = AVOID | PIT | UNSTITCHABLE; + flags[EMPTY] = PASSABLE; + flags[GRASS] = PASSABLE | FLAMABLE; + flags[EMPTY_WELL] = PASSABLE; + flags[WATER] = PASSABLE | LIQUID | UNSTITCHABLE; + flags[WALL] = LOS_BLOCKING | SOLID | UNSTITCHABLE; + flags[DOOR] = PASSABLE | LOS_BLOCKING | FLAMABLE | SOLID | UNSTITCHABLE; + flags[OPEN_DOOR] = PASSABLE | FLAMABLE | UNSTITCHABLE; + flags[ENTRANCE] = PASSABLE; + flags[EXIT] = PASSABLE; + flags[EMBERS] = PASSABLE; + flags[LOCKED_DOOR] = LOS_BLOCKING | SOLID | UNSTITCHABLE; + flags[PEDESTAL] = PASSABLE | UNSTITCHABLE; + flags[WALL_DECO] = flags[WALL]; + flags[BARRICADE] = FLAMABLE | SOLID | LOS_BLOCKING; + flags[EMPTY_SP] = flags[EMPTY] | UNSTITCHABLE; + flags[HIGH_GRASS] = PASSABLE | LOS_BLOCKING | FLAMABLE; + flags[EMPTY_DECO] = flags[EMPTY]; + flags[LOCKED_EXIT] = SOLID; + flags[UNLOCKED_EXIT]= PASSABLE; + flags[SIGN] = PASSABLE | FLAMABLE; + flags[WELL] = AVOID; + flags[STATUE] = SOLID; + flags[STATUE_SP] = flags[STATUE] | UNSTITCHABLE; + flags[BOOKSHELF] = flags[BARRICADE] | UNSTITCHABLE; + flags[ALCHEMY] = PASSABLE; + + flags[CHASM_WALL] = flags[CHASM]; + flags[CHASM_FLOOR] = flags[CHASM]; + flags[CHASM_FLOOR_SP] = flags[CHASM]; + flags[CHASM_WATER] = flags[CHASM]; + + flags[SECRET_DOOR] = flags[WALL] | SECRET | UNSTITCHABLE; + flags[TOXIC_TRAP] = AVOID; + flags[SECRET_TOXIC_TRAP] = flags[EMPTY] | SECRET; + flags[FIRE_TRAP] = AVOID; + flags[SECRET_FIRE_TRAP] = flags[EMPTY] | SECRET; + flags[PARALYTIC_TRAP] = AVOID; + flags[SECRET_PARALYTIC_TRAP] = flags[EMPTY] | SECRET; + flags[POISON_TRAP] = AVOID; + flags[SECRET_POISON_TRAP] = flags[EMPTY] | SECRET; + flags[ALARM_TRAP] = AVOID; + flags[SECRET_ALARM_TRAP] = flags[EMPTY] | SECRET; + flags[LIGHTNING_TRAP] = AVOID; + flags[SECRET_LIGHTNING_TRAP] = flags[EMPTY] | SECRET; + flags[GRIPPING_TRAP] = AVOID; + flags[SECRET_GRIPPING_TRAP] = flags[EMPTY] | SECRET; + flags[SUMMONING_TRAP] = AVOID; + flags[SECRET_SUMMONING_TRAP] = flags[EMPTY] | SECRET; + flags[INACTIVE_TRAP] = flags[EMPTY]; + + for (int i=WATER_TILES; i < WATER_TILES + 16; i++) { + flags[i] = flags[WATER]; + } + }; + + public static int discover( int terr ) { + switch (terr) { + case SECRET_DOOR: + return DOOR; + case SECRET_FIRE_TRAP: + return FIRE_TRAP; + case SECRET_PARALYTIC_TRAP: + return PARALYTIC_TRAP; + case SECRET_TOXIC_TRAP: + return TOXIC_TRAP; + case SECRET_POISON_TRAP: + return POISON_TRAP; + case SECRET_ALARM_TRAP: + return ALARM_TRAP; + case SECRET_LIGHTNING_TRAP: + return LIGHTNING_TRAP; + case SECRET_GRIPPING_TRAP: + return GRIPPING_TRAP; + case SECRET_SUMMONING_TRAP: + return SUMMONING_TRAP; + default: + return terr; + } + } +} diff --git a/src/com/watabou/pixeldungeon/levels/features/AlchemyPot.java b/src/com/watabou/pixeldungeon/levels/features/AlchemyPot.java new file mode 100644 index 0000000000..2d4fee824b --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/features/AlchemyPot.java @@ -0,0 +1,48 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.features; + +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.windows.WndBag; + +public class AlchemyPot { + + private static final String TXT_SELECT_SEED = "Select a seed to throw"; + + private static Hero hero; + private static int pos; + + public static void operate( Hero hero, int pos ) { + + AlchemyPot.hero = hero; + AlchemyPot.pos = pos; + + GameScene.selectItem( itemSelector, WndBag.Mode.SEED, TXT_SELECT_SEED ); + } + + private static final WndBag.Listener itemSelector = new WndBag.Listener() { + @Override + public void onSelect( Item item ) { + if (item != null) { + item.cast( hero, pos ); + } + } + }; +} diff --git a/src/com/watabou/pixeldungeon/levels/features/Chasm.java b/src/com/watabou/pixeldungeon/levels/features/Chasm.java new file mode 100644 index 0000000000..57b892b2ec --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/features/Chasm.java @@ -0,0 +1,111 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.features; + +import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Cripple; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.levels.RegularLevel; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.scenes.InterlevelScene; +import com.watabou.pixeldungeon.sprites.MobSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.pixeldungeon.windows.WndOptions; +import com.watabou.utils.Random; + +public class Chasm { + + private static final String TXT_CHASM = "Chasm"; + private static final String TXT_YES = "Yes, I know what I'm doing"; + private static final String TXT_NO = "No, I changed my mind"; + private static final String TXT_JUMP = + "Do you really want to jump into the chasm? You can probably die."; + + public static boolean jumpConfirmed = false; + + public static void heroJump( final Hero hero ) { + GameScene.show( + new WndOptions( TXT_CHASM, TXT_JUMP, TXT_YES, TXT_NO ) { + @Override + protected void onSelect( int index ) { + if (index == 0) { + jumpConfirmed = true; + hero.resume(); + } + }; + } + ); + } + + public static void heroFall( int pos ) { + + jumpConfirmed = false; + + Sample.INSTANCE.play( Assets.SND_FALLING ); + + if (Dungeon.hero.isAlive()) { + Dungeon.hero.interrupt(); + InterlevelScene.mode = InterlevelScene.Mode.FALL; + if (Dungeon.level instanceof RegularLevel) { + Room room = ((RegularLevel)Dungeon.level).room( pos ); + InterlevelScene.fallIntoPit = room != null && room.type == Room.Type.WEAK_FLOOR; + } else { + InterlevelScene.fallIntoPit = false; + } + Game.switchScene( InterlevelScene.class ); + } else { + Dungeon.hero.sprite.visible = false; + } + } + + public static void heroLand() { + + Hero hero = Dungeon.hero; + + hero.sprite.burst( hero.sprite.blood(), 10 ); + Camera.main.shake( 4, 0.2f ); + + Buff.prolong( hero, Cripple.class, Cripple.DURATION ); + hero.damage( Random.IntRange( hero.HT / 3, hero.HT / 2 ), new Hero.Doom() { + @Override + public void onDeath() { + Badges.validateDeathFromFalling(); + + Dungeon.fail( Utils.format( ResultDescriptions.FALL, Dungeon.depth ) ); + GLog.n( "You fell to death..." ); + } + } ); + } + + public static void mobFall( Mob mob ) { + // Destroy instead of kill to prevent dropping loot + mob.destroy(); + + ((MobSprite)mob.sprite).fall(); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/features/Door.java b/src/com/watabou/pixeldungeon/levels/features/Door.java new file mode 100644 index 0000000000..29904910b2 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/features/Door.java @@ -0,0 +1,46 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.features; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class Door { + + public static void enter( int pos ) { + Level.set( pos, Terrain.OPEN_DOOR ); + GameScene.updateMap( pos ); + Dungeon.observe(); + + if (Dungeon.visible[pos]) { + Sample.INSTANCE.play( Assets.SND_OPEN ); + } + } + + public static void leave( int pos ) { + if (Dungeon.level.heaps.get( pos ) == null) { + Level.set( pos, Terrain.DOOR ); + GameScene.updateMap( pos ); + Dungeon.observe(); + } + } +} diff --git a/src/com/watabou/pixeldungeon/levels/features/HighGrass.java b/src/com/watabou/pixeldungeon/levels/features/HighGrass.java new file mode 100644 index 0000000000..afb516c01b --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/features/HighGrass.java @@ -0,0 +1,72 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.features; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Barkskin; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroSubClass; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.LeafParticle; +import com.watabou.pixeldungeon.items.Dewdrop; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.rings.RingOfHerbalism.Herbalism; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.Random; + +public class HighGrass { + + public static void trample( Level level, int pos, Char ch ) { + + Level.set( pos, Terrain.GRASS ); + GameScene.updateMap( pos ); + + int herbalismLevel = 0; + if (ch != null) { + Herbalism herbalism = ch.buff( Herbalism.class ); + if (herbalism != null) { + herbalismLevel = herbalism.level; + } + } + + // Seed + if (herbalismLevel >= 0 && Random.Int( 18 ) <= Random.Int( herbalismLevel + 1 )) { + level.drop( Generator.random( Generator.Category.SEED ), pos ).sprite.drop(); + } + + // Dew + if (herbalismLevel >= 0 && Random.Int( 6 ) <= Random.Int( herbalismLevel + 1 )) { + level.drop( new Dewdrop(), pos ).sprite.drop(); + } + + int leaves = 4; + + // Barkskin + if (ch instanceof Hero && ((Hero)ch).subClass == HeroSubClass.WARDEN) { + Buff.affect( ch, Barkskin.class ).level( ch.HT / 3 ); + leaves = 8; + } + + CellEmitter.get( pos ).burst( LeafParticle.LEVEL_SPECIFIC, leaves ); + Dungeon.observe(); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/ArmoryPainter.java b/src/com/watabou/pixeldungeon/levels/painters/ArmoryPainter.java new file mode 100644 index 0000000000..542974fdb0 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/ArmoryPainter.java @@ -0,0 +1,71 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.keys.IronKey; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class ArmoryPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY ); + + Room.Door entrance = room.entrance(); + Point statue = null; + if (entrance.x == room.left) { + statue = new Point( room.right-1, Random.Int( 2 ) == 0 ? room.top+1 : room.bottom-1 ); + } else if (entrance.x == room.right) { + statue = new Point( room.left+1, Random.Int( 2 ) == 0 ? room.top+1 : room.bottom-1 ); + } else if (entrance.y == room.top) { + statue = new Point( Random.Int( 2 ) == 0 ? room.left+1 : room.right-1, room.bottom-1 ); + } else if (entrance.y == room.bottom) { + statue = new Point( Random.Int( 2 ) == 0 ? room.left+1 : room.right-1, room.top+1 ); + } + if (statue != null) { + set( level, statue, Terrain.STATUE ); + } + + int n = Random.IntRange( 2, 3 ); + for (int i=0; i < n; i++) { + int pos; + do { + pos = room.random(); + } while (level.map[pos] != Terrain.EMPTY || level.heaps.get( pos ) != null); + level.drop( prize( level ), pos ); + } + + entrance.set( Room.Door.Type.LOCKED ); + level.addItemToSpawn( new IronKey( Dungeon.depth ) ); + } + + private static Item prize( Level level ) { + return Generator.random( Random.oneOf( + Generator.Category.ARMOR, + Generator.Category.WEAPON + ) ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/BlacksmithPainter.java b/src/com/watabou/pixeldungeon/levels/painters/BlacksmithPainter.java new file mode 100644 index 0000000000..ac98fc7cfc --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/BlacksmithPainter.java @@ -0,0 +1,60 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.mobs.npcs.Blacksmith; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Random; + +public class BlacksmithPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.FIRE_TRAP ); + fill( level, room, 2, Terrain.EMPTY_SP ); + + for (int i=0; i < 2; i++) { + int pos; + do { + pos = room.random(); + } while (level.map[pos] != Terrain.EMPTY_SP); + level.drop( + Generator.random( Random.oneOf( + Generator.Category.ARMOR, + Generator.Category.WEAPON + ) ), pos ); + } + + for (Room.Door door : room.connected.values()) { + door.set( Room.Door.Type.UNLOCKED ); + drawInside( level, room, door, 1, Terrain.EMPTY ); + } + + Blacksmith npc = new Blacksmith(); + do { + npc.pos = room.random( 1 ); + } while (level.heaps.get( npc.pos ) != null); + level.mobs.add( npc ); + Actor.occupyCell( npc ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/BossExitPainter.java b/src/com/watabou/pixeldungeon/levels/painters/BossExitPainter.java new file mode 100644 index 0000000000..e2fa8be890 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/BossExitPainter.java @@ -0,0 +1,39 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; + +public class BossExitPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY ); + + for (Room.Door door : room.connected.values()) { + door.set( Room.Door.Type.REGULAR ); + } + + level.exit = room.top * Level.WIDTH + (room.left + room.right) / 2; + set( level, level.exit, Terrain.LOCKED_EXIT ); + } + +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/CryptPainter.java b/src/com/watabou/pixeldungeon/levels/painters/CryptPainter.java new file mode 100644 index 0000000000..cd26321f30 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/CryptPainter.java @@ -0,0 +1,80 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.Heap.Type; +import com.watabou.pixeldungeon.items.keys.IronKey; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Point; + +public class CryptPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY ); + + Point c = room.center(); + int cx = c.x; + int cy = c.y; + + Room.Door entrance = room.entrance(); + + entrance.set( Room.Door.Type.LOCKED ); + level.addItemToSpawn( new IronKey( Dungeon.depth ) ); + + if (entrance.x == room.left) { + set( level, new Point( room.right-1, room.top+1 ), Terrain.STATUE ); + set( level, new Point( room.right-1, room.bottom-1 ), Terrain.STATUE ); + cx = room.right - 2; + } else if (entrance.x == room.right) { + set( level, new Point( room.left+1, room.top+1 ), Terrain.STATUE ); + set( level, new Point( room.left+1, room.bottom-1 ), Terrain.STATUE ); + cx = room.left + 2; + } else if (entrance.y == room.top) { + set( level, new Point( room.left+1, room.bottom-1 ), Terrain.STATUE ); + set( level, new Point( room.right-1, room.bottom-1 ), Terrain.STATUE ); + cy = room.bottom - 2; + } else if (entrance.y == room.bottom) { + set( level, new Point( room.left+1, room.top+1 ), Terrain.STATUE ); + set( level, new Point( room.right-1, room.top+1 ), Terrain.STATUE ); + cy = room.top + 2; + } + + level.drop( prize( level ), cx + cy * Level.WIDTH ).type = Type.TOMB; + } + + private static Item prize( Level level ) { + + Item prize = Generator.random( Generator.Category.ARMOR ); + + for (int i=0; i < 3; i++) { + Item another = Generator.random( Generator.Category.ARMOR ); + if (another.level > prize.level) { + prize = another; + } + } + + return prize; + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/EntrancePainter.java b/src/com/watabou/pixeldungeon/levels/painters/EntrancePainter.java new file mode 100644 index 0000000000..8f89496922 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/EntrancePainter.java @@ -0,0 +1,39 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; + +public class EntrancePainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY ); + + for (Room.Door door : room.connected.values()) { + door.set( Room.Door.Type.REGULAR ); + } + + level.entrance = room.random( 1 ); + set( level, level.entrance, Terrain.ENTRANCE ); + } + +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/ExitPainter.java b/src/com/watabou/pixeldungeon/levels/painters/ExitPainter.java new file mode 100644 index 0000000000..ca9a96eaad --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/ExitPainter.java @@ -0,0 +1,39 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; + +public class ExitPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY ); + + for (Room.Door door : room.connected.values()) { + door.set( Room.Door.Type.REGULAR ); + } + + level.exit = room.random( 1 ); + set( level, level.exit, Terrain.EXIT ); + } + +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/GardenPainter.java b/src/com/watabou/pixeldungeon/levels/painters/GardenPainter.java new file mode 100644 index 0000000000..3189ed9da4 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/GardenPainter.java @@ -0,0 +1,53 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.actors.blobs.Foliage; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.plants.Sungrass; +import com.watabou.utils.Random; + +public class GardenPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.HIGH_GRASS ); + fill( level, room, 2, Terrain.GRASS ); + + room.entrance().set( Room.Door.Type.REGULAR ); + + int bushes = Random.Int( 3 ) == 0 ? (Random.Int( 5 ) == 0 ? 2 : 1) : 0; + for (int i=0; i < bushes; i++) { + level.plant( new Sungrass.Seed(), room.random() ); + } + + Foliage light = (Foliage)level.blobs.get( Foliage.class ); + if (light == null) { + light = new Foliage(); + } + for (int i=room.top + 1; i < room.bottom; i++) { + for (int j=room.left + 1; j < room.right; j++) { + light.seed( j + Level.WIDTH * i, 1 ); + } + } + level.blobs.put( Foliage.class, light ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/LaboratoryPainter.java b/src/com/watabou/pixeldungeon/levels/painters/LaboratoryPainter.java new file mode 100644 index 0000000000..e5e0f39409 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/LaboratoryPainter.java @@ -0,0 +1,83 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.blobs.Alchemy; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.keys.IronKey; +import com.watabou.pixeldungeon.items.potions.Potion; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class LaboratoryPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY_SP ); + + Room.Door entrance = room.entrance(); + + Point pot = null; + if (entrance.x == room.left) { + pot = new Point( room.right-1, Random.Int( 2 ) == 0 ? room.top + 1 : room.bottom - 1 ); + } else if (entrance.x == room.right) { + pot = new Point( room.left+1, Random.Int( 2 ) == 0 ? room.top + 1 : room.bottom - 1 ); + } else if (entrance.y == room.top) { + pot = new Point( Random.Int( 2 ) == 0 ? room.left + 1 : room.right - 1, room.bottom-1 ); + } else if (entrance.y == room.bottom) { + pot = new Point( Random.Int( 2 ) == 0 ? room.left + 1 : room.right - 1, room.top+1 ); + } + set( level, pot, Terrain.ALCHEMY ); + + Alchemy alchemy = new Alchemy(); + alchemy.seed( pot.x + Level.WIDTH * pot.y, 1 ); + level.blobs.put( Alchemy.class, alchemy ); + + int n = Random.IntRange( 2, 3 ); + for (int i=0; i < n; i++) { + int pos; + do { + pos = room.random(); + } while ( + level.map[pos] != Terrain.EMPTY_SP || + level.heaps.get( pos ) != null); + level.drop( prize( level ), pos ); + } + + entrance.set( Room.Door.Type.LOCKED ); + level.addItemToSpawn( new IronKey( Dungeon.depth ) ); + } + + private static Item prize( Level level ) { + + Item prize = level.itemToSpanAsPrize(); + if (prize instanceof Potion) { + return prize; + } else if (prize != null) { + level.addItemToSpawn( prize ); + } + + return Generator.random( Generator.Category.POTION ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/LibraryPainter.java b/src/com/watabou/pixeldungeon/levels/painters/LibraryPainter.java new file mode 100644 index 0000000000..5794992c7a --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/LibraryPainter.java @@ -0,0 +1,90 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.keys.IronKey; +import com.watabou.pixeldungeon.items.scrolls.Scroll; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class LibraryPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY ); + + Room.Door entrance = room.entrance(); + Point a = null; + Point b = null; + + if (entrance.x == room.left) { + a = new Point( room.left+1, entrance.y-1 ); + b = new Point( room.left+1, entrance.y+1 ); + fill( level, room.right - 1, room.top + 1, 1, room.height() - 1 , Terrain.BOOKSHELF ); + } else if (entrance.x == room.right) { + a = new Point( room.right-1, entrance.y-1 ); + b = new Point( room.right-1, entrance.y+1 ); + fill( level, room.left+1, room.top + 1, 1, room.height() - 1 , Terrain.BOOKSHELF ); + } else if (entrance.y == room.top) { + a = new Point( entrance.x+1, room.top+1 ); + b = new Point( entrance.x-1, room.top+1 ); + fill( level, room.left + 1, room.bottom-1, room.width() - 1, 1 , Terrain.BOOKSHELF ); + } else if (entrance.y == room.bottom) { + a = new Point( entrance.x+1, room.bottom-1 ); + b = new Point( entrance.x-1, room.bottom-1 ); + fill( level, room.left + 1, room.top+1, room.width() - 1, 1 , Terrain.BOOKSHELF ); + } + if (a != null && level.map[a.x + a.y * Level.WIDTH] == Terrain.EMPTY) { + set( level, a, Terrain.STATUE ); + } + if (b != null && level.map[b.x + b.y * Level.WIDTH] == Terrain.EMPTY) { + set( level, b, Terrain.STATUE ); + } + + int n = Random.IntRange( 2, 3 ); + for (int i=0; i < n; i++) { + int pos; + do { + pos = room.random(); + } while (level.map[pos] != Terrain.EMPTY || level.heaps.get( pos ) != null); + level.drop( prize( level), pos ); + } + + entrance.set( Room.Door.Type.LOCKED ); + level.addItemToSpawn( new IronKey( Dungeon.depth ) ); + } + + private static Item prize( Level level ) { + + Item prize = level.itemToSpanAsPrize(); + if (prize instanceof Scroll) { + return prize; + } else if (prize != null) { + level.addItemToSpawn( prize ); + } + + return Generator.random( Generator.Category.SCROLL ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/MagicWellPainter.java b/src/com/watabou/pixeldungeon/levels/painters/MagicWellPainter.java new file mode 100644 index 0000000000..aa83b49566 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/MagicWellPainter.java @@ -0,0 +1,67 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.blobs.WaterOfAwareness; +import com.watabou.pixeldungeon.actors.blobs.WaterOfHealth; +import com.watabou.pixeldungeon.actors.blobs.WaterOfTransmutation; +import com.watabou.pixeldungeon.actors.blobs.WellWater; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class MagicWellPainter extends Painter { + + private static final Class[] WATERS = + {WaterOfAwareness.class, WaterOfHealth.class, WaterOfTransmutation.class}; + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY ); + + Point c = room.center(); + set( level, c.x, c.y, Terrain.WELL ); + + @SuppressWarnings("unchecked") + Class waterClass = + Dungeon.depth >= Dungeon.transmutation ? + WaterOfTransmutation.class : + (Class)Random.element( WATERS ); + + if (waterClass == WaterOfTransmutation.class) { + Dungeon.transmutation = Integer.MAX_VALUE; + } + + WellWater water = (WellWater)level.blobs.get( waterClass ); + if (water == null) { + try { + water = waterClass.newInstance(); + } catch (Exception e) { + water = null; + } + } + water.seed( c.x + Level.WIDTH * c.y, 1 ); + level.blobs.put( waterClass, water ); + + room.entrance().set( Room.Door.Type.REGULAR ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/Painter.java b/src/com/watabou/pixeldungeon/levels/painters/Painter.java new file mode 100644 index 0000000000..cef7487b46 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/Painter.java @@ -0,0 +1,86 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import java.util.Arrays; + +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.utils.Point; +import com.watabou.utils.Rect; + +public class Painter { + + public static void set( Level level, int cell, int value ) { + level.map[cell] = value; + } + + public static void set( Level level, int x, int y, int value ) { + set( level, x + y * Level.WIDTH, value ); + } + + public static void set( Level level, Point p, int value ) { + set( level, p.x, p.y, value ); + } + + public static void fill( Level level, int x, int y, int w, int h, int value ) { + + int width = Level.WIDTH; + + int pos = y * width + x; + for (int i=y; i < y + h; i++, pos += width) { + Arrays.fill( level.map, pos, pos + w, value ); + } + } + + public static void fill( Level level, Rect rect, int value ) { + fill( level, rect.left, rect.top, rect.width() + 1, rect.height() + 1, value ); + } + + public static void fill( Level level, Rect rect, int m, int value ) { + fill( level, rect.left + m, rect.top + m, rect.width() + 1 - m*2, rect.height() + 1 - m*2, value ); + } + + public static void fill( Level level, Rect rect, int l, int t, int r, int b, int value ) { + fill( level, rect.left + l, rect.top + t, rect.width() + 1 - (l + r), rect.height() + 1 - (t + b), value ); + } + + public static Point drawInside( Level level, Room room, Point from, int n, int value ) { + + Point step = new Point(); + if (from.x == room.left) { + step.set( +1, 0 ); + } else if (from.x == room.right) { + step.set( -1, 0 ); + } else if (from.y == room.top) { + step.set( 0, +1 ); + } else if (from.y == room.bottom) { + step.set( 0, -1 ); + } + + Point p = new Point( from ).offset( step ); + for (int i=0; i < n; i++) { + if (value != -1) { + set( level, p, value ); + } + p.offset( step ); + } + + return p; + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/PassagePainter.java b/src/com/watabou/pixeldungeon/levels/painters/PassagePainter.java new file mode 100644 index 0000000000..cc04549191 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/PassagePainter.java @@ -0,0 +1,116 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import java.util.ArrayList; +import java.util.Collections; + +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.utils.Point; + +public class PassagePainter extends Painter { + + private static int pasWidth; + private static int pasHeight; + + public static void paint( Level level, Room room ) { + + pasWidth = room.width() - 2; + pasHeight = room.height() - 2; + + int floor = level.tunnelTile(); + + ArrayList joints = new ArrayList(); + for (Point door : room.connected.values()) { + joints.add( xy2p( room, door ) ); + } + Collections.sort( joints ); + + int nJoints = joints.size(); + int perimeter = pasWidth * 2 + pasHeight * 2; + + int start = 0; + int maxD = joints.get( 0 ) + perimeter - joints.get( nJoints - 1 ); + for (int i=1; i < nJoints; i++) { + int d = joints.get( i ) - joints.get( i - 1 ); + if (d > maxD) { + maxD = d; + start = i; + } + } + + int end = (start + nJoints - 1) % nJoints; + + int p = joints.get( start ); + do { + set( level, p2xy( room, p ), floor ); + p = (p + 1) % perimeter; + } while (p != joints.get( end )); + + set( level, p2xy( room, p ), floor ); + + for (Room.Door door : room.connected.values()) { + door.set( Room.Door.Type.TUNNEL ); + } + } + + private static int xy2p( Room room, Point xy ) { + if (xy.y == room.top) { + + return (xy.x - room.left - 1); + + } else if (xy.x == room.right) { + + return (xy.y - room.top - 1) + pasWidth; + + } else if (xy.y == room.bottom) { + + return (room.right - xy.x - 1) + pasWidth + pasHeight; + + } else { + + if (xy.y == room.top + 1) { + return 0; + } else { + return (room.bottom - xy.y - 1) + pasWidth * 2 + pasHeight; + } + + } + } + + private static Point p2xy( Room room, int p ) { + if (p < pasWidth) { + + return new Point( room.left + 1 + p, room.top + 1); + + } else if (p < pasWidth + pasHeight) { + + return new Point( room.right - 1, room.top + 1 + (p - pasWidth) ); + + } else if (p < pasWidth * 2 + pasHeight) { + + return new Point( room.right - 1 - (p - (pasWidth + pasHeight)), room.bottom - 1 ); + + } else { + + return new Point( room.left + 1, room.bottom - 1 - (p - (pasWidth * 2 + pasHeight)) ); + + } + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/PitPainter.java b/src/com/watabou/pixeldungeon/levels/painters/PitPainter.java new file mode 100644 index 0000000000..0ebbb0bdd0 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/PitPainter.java @@ -0,0 +1,89 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.Heap.Type; +import com.watabou.pixeldungeon.items.keys.IronKey; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class PitPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY ); + + Room.Door entrance = room.entrance(); + entrance.set( Room.Door.Type.LOCKED ); + + Point well = null; + if (entrance.x == room.left) { + well = new Point( room.right-1, Random.Int( 2 ) == 0 ? room.top + 1 : room.bottom - 1 ); + } else if (entrance.x == room.right) { + well = new Point( room.left+1, Random.Int( 2 ) == 0 ? room.top + 1 : room.bottom - 1 ); + } else if (entrance.y == room.top) { + well = new Point( Random.Int( 2 ) == 0 ? room.left + 1 : room.right - 1, room.bottom-1 ); + } else if (entrance.y == room.bottom) { + well = new Point( Random.Int( 2 ) == 0 ? room.left + 1 : room.right - 1, room.top+1 ); + } + set( level, well, Terrain.EMPTY_WELL ); + + int remains = room.random(); + while (level.map[remains] == Terrain.EMPTY_WELL) { + remains = room.random(); + } + + level.drop( new IronKey( Dungeon.depth ), remains ).type = Type.SKELETON; + + if (Random.Int( 5 ) == 0) { + level.drop( Generator.random( Generator.Category.RING ), remains ); + } else { + level.drop( Generator.random( Random.oneOf( + Generator.Category.WEAPON, + Generator.Category.ARMOR + ) ), remains ); + } + + int n = Random.IntRange( 1, 2 ); + for (int i=0; i < n; i++) { + level.drop( prize( level ), remains ); + } + } + + private static Item prize( Level level ) { + + Item prize = level.itemToSpanAsPrize(); + if (prize != null) { + return prize; + } + + return Generator.random( Random.oneOf( + Generator.Category.POTION, + Generator.Category.SCROLL, + Generator.Category.FOOD, + Generator.Category.GOLD + ) ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/PoolPainter.java b/src/com/watabou/pixeldungeon/levels/painters/PoolPainter.java new file mode 100644 index 0000000000..92a117d93c --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/PoolPainter.java @@ -0,0 +1,108 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.mobs.Piranha; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.potions.PotionOfInvisibility; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Random; + +public class PoolPainter extends Painter { + + private static final int NPIRANHAS = 3; + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.WATER ); + + Room.Door door = room.entrance(); + door.set( Room.Door.Type.REGULAR ); + + int x = -1; + int y = -1; + if (door.x == room.left) { + + x = room.right - 1; + y = room.top + room.height() / 2; + + } else if (door.x == room.right) { + + x = room.left + 1; + y = room.top + room.height() / 2; + + } else if (door.y == room.top) { + + x = room.left + room.width() / 2; + y = room.bottom - 1; + + } else if (door.y == room.bottom) { + + x = room.left + room.width() / 2; + y = room.top + 1; + + } + + int pos = x + y * Level.WIDTH; + level.drop( prize( level ), pos ).type = + Random.Int( 3 ) == 0 ? Heap.Type.CHEST : Heap.Type.HEAP; + set( level, pos, Terrain.PEDESTAL ); + + level.addItemToSpawn( new PotionOfInvisibility() ); + + for (int i=0; i < NPIRANHAS; i++) { + Piranha piranha = new Piranha(); + do { + piranha.pos = room.random(); + } while (level.map[piranha.pos] != Terrain.WATER|| Actor.findChar( piranha.pos ) != null); + level.mobs.add( piranha ); + Actor.occupyCell( piranha ); + } + } + + private static Item prize( Level level ) { + + Item prize = level.itemToSpanAsPrize(); + if (prize != null) { + return prize; + } + + prize = Generator.random( Random.oneOf( + Generator.Category.WEAPON, + Generator.Category.ARMOR + ) ); + + for (int i=0; i < 4; i++) { + Item another = Generator.random( Random.oneOf( + Generator.Category.WEAPON, + Generator.Category.ARMOR + ) ); + if (another.level > prize.level) { + prize = another; + } + } + + return prize; + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/RatKingPainter.java b/src/com/watabou/pixeldungeon/levels/painters/RatKingPainter.java new file mode 100644 index 0000000000..3af1d78ef6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/RatKingPainter.java @@ -0,0 +1,86 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.actors.mobs.npcs.RatKing; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Gold; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.weapon.missiles.MissileWeapon; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Random; + +public class RatKingPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY_SP ); + + Room.Door entrance = room.entrance(); + entrance.set( Room.Door.Type.HIDDEN ); + int door = entrance.x + entrance.y * Level.WIDTH; + + for (int i=room.left + 1; i < room.right; i++) { + addChest( level, (room.top + 1) * Level.WIDTH + i, door ); + addChest( level, (room.bottom - 1) * Level.WIDTH + i, door ); + } + + for (int i=room.top + 2; i < room.bottom - 1; i++) { + addChest( level, i * Level.WIDTH + room.left + 1, door ); + addChest( level, i * Level.WIDTH + room.right - 1, door ); + } + + RatKing king = new RatKing(); + king.pos = room.random( 1 ); + level.mobs.add( king ); + } + + private static void addChest( Level level, int pos, int door ) { + + if (pos == door - 1 || + pos == door + 1 || + pos == door - Level.WIDTH || + pos == door + Level.WIDTH) { + return; + } + + Item prize; + switch (Random.Int( 10 )) { + case 0: + prize = Generator.random( Generator.Category.WEAPON ); + if (prize instanceof MissileWeapon) { + prize.quantity( 1 ); + } else { + prize.degrade( Random.Int( 3 ) ); + } + break; + case 1: + prize = Generator.random( Generator.Category.ARMOR ).degrade( Random.Int( 3 ) ); + break; + default: + prize = new Gold( Random.IntRange( 1, 5 ) ); + break; + } + + level.drop( prize, pos ).type = Heap.Type.CHEST; + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/ShopPainter.java b/src/com/watabou/pixeldungeon/levels/painters/ShopPainter.java new file mode 100644 index 0000000000..38b4997c59 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/ShopPainter.java @@ -0,0 +1,214 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import java.util.ArrayList; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.actors.mobs.npcs.ImpShopkeeper; +import com.watabou.pixeldungeon.actors.mobs.npcs.Shopkeeper; +import com.watabou.pixeldungeon.items.Ankh; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.Torch; +import com.watabou.pixeldungeon.items.armor.*; +import com.watabou.pixeldungeon.items.bags.ScrollHolder; +import com.watabou.pixeldungeon.items.bags.SeedPouch; +import com.watabou.pixeldungeon.items.bags.WandHolster; +import com.watabou.pixeldungeon.items.food.OverpricedRation; +import com.watabou.pixeldungeon.items.potions.PotionOfHealing; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfIdentify; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfMagicMapping; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfRemoveCurse; +import com.watabou.pixeldungeon.items.weapon.melee.*; +import com.watabou.pixeldungeon.levels.LastShopLevel; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class ShopPainter extends Painter { + + private static int pasWidth; + private static int pasHeight; + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY_SP ); + + pasWidth = room.width() - 2; + pasHeight = room.height() - 2; + int per = pasWidth * 2 + pasHeight * 2; + + Item[] range = range(); + + int pos = xy2p( room, room.entrance() ) + (per - range.length) / 2; + for (int i=0; i < range.length; i++) { + + Point xy = p2xy( room, (pos + per) % per ); + int cell = xy.x + xy.y * Level.WIDTH; + + if (level.heaps.get( cell ) != null) { + do { + cell = room.random(); + } while (level.heaps.get( cell ) != null); + } + + level.drop( range[i], cell ).type = Heap.Type.FOR_SALE; + + pos++; + } + + placeShopkeeper( level, room ); + + for (Room.Door door : room.connected.values()) { + door.set( Room.Door.Type.REGULAR ); + } + } + + private static Item[] range() { + + ArrayList items = new ArrayList(); + + switch (Dungeon.depth) { + + case 6: + items.add( (Random.Int( 2 ) == 0 ? new Quarterstaff() : new Spear()).identify() ); + items.add( new LeatherArmor().identify() ); + items.add( new SeedPouch() ); + break; + + case 11: + items.add( (Random.Int( 2 ) == 0 ? new Sword() : new Mace()).identify() ); + items.add( new MailArmor().identify() ); + items.add( new ScrollHolder() ); + break; + + case 16: + items.add( (Random.Int( 2 ) == 0 ? new Longsword() : new BattleAxe()).identify() ); + items.add( new ScaleArmor().identify() ); + items.add( new WandHolster() ); + break; + + case 21: + switch (Random.Int( 3 )) { + case 0: + items.add( new Glaive().identify() ); + break; + case 1: + items.add( new WarHammer().identify() ); + break; + case 2: + items.add( new PlateArmor().identify() ); + break; + } + items.add( new Torch() ); + items.add( new Torch() ); + break; + } + + items.add( new PotionOfHealing() ); + for (int i=0; i < 3; i++) { + items.add( Generator.random( Generator.Category.POTION ) ); + } + + items.add( new ScrollOfIdentify() ); + items.add( new ScrollOfRemoveCurse() ); + items.add( new ScrollOfMagicMapping() ); + items.add( Generator.random( Generator.Category.SCROLL ) ); + + items.add( new OverpricedRation() ); + items.add( new OverpricedRation() ); + + items.add( new Ankh() ); + + Item[] range =items.toArray( new Item[0] ); + Random.shuffle( range ); + + return range; + } + + private static void placeShopkeeper( Level level, Room room ) { + + int pos; + do { + pos = room.random(); + } while (level.heaps.get( pos ) != null); + + Mob shopkeeper = level instanceof LastShopLevel ? new ImpShopkeeper() : new Shopkeeper(); + shopkeeper.pos = pos; + level.mobs.add( shopkeeper ); + + if (level instanceof LastShopLevel) { + for (int i=0; i < Level.NEIGHBOURS9.length; i++) { + int p = shopkeeper.pos + Level.NEIGHBOURS9[i]; + if (level.map[p] == Terrain.EMPTY_SP) { + level.map[p] = Terrain.WATER; + } + } + } + } + + private static int xy2p( Room room, Point xy ) { + if (xy.y == room.top) { + + return (xy.x - room.left - 1); + + } else if (xy.x == room.right) { + + return (xy.y - room.top - 1) + pasWidth; + + } else if (xy.y == room.bottom) { + + return (room.right - xy.x - 1) + pasWidth + pasHeight; + + } else { + + if (xy.y == room.top + 1) { + return 0; + } else { + return (room.bottom - xy.y - 1) + pasWidth * 2 + pasHeight; + } + + } + } + + private static Point p2xy( Room room, int p ) { + if (p < pasWidth) { + + return new Point( room.left + 1 + p, room.top + 1); + + } else if (p < pasWidth + pasHeight) { + + return new Point( room.right - 1, room.top + 1 + (p - pasWidth) ); + + } else if (p < pasWidth * 2 + pasHeight) { + + return new Point( room.right - 1 - (p - (pasWidth + pasHeight)), room.bottom - 1 ); + + } else { + + return new Point( room.left + 1, room.bottom - 1 - (p - (pasWidth * 2 + pasHeight)) ); + + } + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/StandardPainter.java b/src/com/watabou/pixeldungeon/levels/painters/StandardPainter.java new file mode 100644 index 0000000000..e941a07683 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/StandardPainter.java @@ -0,0 +1,240 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Gold; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class StandardPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + for (Room.Door door : room.connected.values()) { + door.set( Room.Door.Type.REGULAR ); + } + + if (!Dungeon.bossLevel() && Random.Int( 5 ) == 0) { + switch (Random.Int( 6 )) { + case 0: + if (level.feeling != Level.Feeling.GRASS) { + if (Math.min( room.width(), room.height() ) >= 4 && Math.max( room.width(), room.height() ) >= 6) { + paintGraveyard( level, room ); + return; + } + break; + } else { + // Burned room + } + case 1: + if (Dungeon.depth > 1) { + paintBurned( level, room ); + return; + } + break; + case 2: + if (Math.max( room.width(), room.height() ) >= 4) { + paintStriped( level, room ); + return; + } + break; + case 3: + if (room.width() >= 6 && room.height() >= 6) { + paintStudy( level, room ); + return; + } + break; + case 4: + if (level.feeling != Level.Feeling.WATER) { + if (room.connected.size() == 2 && room.width() >= 4 && room.height() >= 4) { + paintBridge( level, room ); + return; + } + break; + } else { + // Fissure + } + case 5: + if (!Dungeon.bossLevel() && !Dungeon.bossLevel( Dungeon.depth + 1 ) && + Math.min( room.width(), room.height() ) >= 5) { + paintFissure( level, room ); + return; + } + break; + } + } + + fill( level, room, 1, Terrain.EMPTY ); + } + + private static void paintBurned( Level level, Room room ) { + for (int i=room.top + 1; i < room.bottom; i++) { + for (int j=room.left + 1; j < room.right; j++) { + int t = Terrain.EMBERS; + switch (Random.Int( 5 )) { + case 0: + t = Terrain.EMPTY; + break; + case 1: + t = Terrain.FIRE_TRAP; + break; + case 2: + t = Terrain.SECRET_FIRE_TRAP; + break; + case 3: + t = Terrain.INACTIVE_TRAP; + break; + } + level.map[i * Level.WIDTH + j] = t; + } + } + } + + private static void paintGraveyard( Level level, Room room ) { + fill( level, room.left + 1, room.top + 1, room.width() - 1, room.height() - 1 , Terrain.GRASS ); + + int w = room.width() - 1; + int h = room.height() - 1; + int nGraves = Math.max( w, h ) / 2; + + int index = Random.Int( nGraves ); + + int shift = Random.Int( 2 ); + for (int i=0; i < nGraves; i++) { + int pos = w > h ? + room.left + 1 + shift + i * 2 + (room.top + 2 + Random.Int( h-2 )) * Level.WIDTH : + (room.left + 2 + Random.Int( w-2 )) + (room.top + 1 + shift + i * 2) * Level.WIDTH; + level.drop( i == index ? Generator.random() : new Gold(), pos ).type = Heap.Type.TOMB; + } + } + + private static void paintStriped( Level level, Room room ) { + fill( level, room.left + 1, room.top + 1, room.width() - 1, room.height() - 1 , Terrain.EMPTY_SP ); + + if (room.width() > room.height()) { + for (int i=room.left + 2; i < room.right; i += 2) { + fill( level, i, room.top + 1, 1, room.height() - 1, Terrain.HIGH_GRASS ); + } + } else { + for (int i=room.top + 2; i < room.bottom; i += 2) { + fill( level, room.left + 1, i, room.width() - 1, 1, Terrain.HIGH_GRASS ); + } + } + } + + private static void paintStudy( Level level, Room room ) { + fill( level, room.left + 1, room.top + 1, room.width() - 1, room.height() - 1 , Terrain.BOOKSHELF ); + fill( level, room.left + 2, room.top + 2, room.width() - 3, room.height() - 3 , Terrain.EMPTY_SP ); + + for (Point door : room.connected.values()) { + if (door.x == room.left) { + set( level, door.x + 1, door.y, Terrain.EMPTY ); + } else if (door.x == room.right) { + set( level, door.x - 1, door.y, Terrain.EMPTY ); + } else if (door.y == room.top) { + set( level, door.x, door.y + 1, Terrain.EMPTY ); + } else if (door.y == room.bottom) { + set( level, door.x , door.y - 1, Terrain.EMPTY ); + } + } + + set( level, room.center(), Terrain.PEDESTAL ); + } + + private static void paintBridge( Level level, Room room ) { + + fill( level, room.left + 1, room.top + 1, room.width() - 1, room.height() - 1 , + !Dungeon.bossLevel() && !Dungeon.bossLevel( Dungeon.depth + 1 ) && Random.Int( 3 ) == 0 ? + Terrain.CHASM : + Terrain.WATER ); + + Point door1 = null; + Point door2 = null; + for (Point p : room.connected.values()) { + if (door1 == null) { + door1 = p; + } else { + door2 = p; + } + } + + if ((door1.x == room.left && door2.x == room.right) || + (door1.x == room.right && door2.x == room.left)) { + + int s = room.width() / 2; + + drawInside( level, room, door1, s, Terrain.EMPTY_SP ); + drawInside( level, room, door2, s, Terrain.EMPTY_SP ); + fill( level, room.center().x, Math.min( door1.y, door2.y ), 1, Math.abs( door1.y - door2.y ) + 1, Terrain.EMPTY_SP ); + + } else + if ((door1.y == room.top && door2.y == room.bottom) || + (door1.y == room.bottom && door2.y == room.top)) { + + int s = room.height() / 2; + + drawInside( level, room, door1, s, Terrain.EMPTY_SP ); + drawInside( level, room, door2, s, Terrain.EMPTY_SP ); + fill( level, Math.min( door1.x, door2.x ), room.center().y, Math.abs( door1.x - door2.x ) + 1, 1, Terrain.EMPTY_SP ); + + } else + if (door1.x == door2.x) { + + fill( level, door1.x == room.left ? room.left + 1 : room.right - 1, Math.min( door1.y, door2.y ), 1, Math.abs( door1.y - door2.y ) + 1, Terrain.EMPTY_SP ); + + } else + if (door1.y == door2.y) { + + fill( level, Math.min( door1.x, door2.x ), door1.y == room.top ? room.top + 1 : room.bottom - 1, Math.abs( door1.x - door2.x ) + 1, 1, Terrain.EMPTY_SP ); + + } else + if (door1.y == room.top || door1.y == room.bottom) { + + drawInside( level, room, door1, Math.abs( door1.y - door2.y ), Terrain.EMPTY_SP ); + drawInside( level, room, door2, Math.abs( door1.x - door2.x ), Terrain.EMPTY_SP ); + + } else + if (door1.x == room.left || door1.x == room.right) { + + drawInside( level, room, door1, Math.abs( door1.x - door2.x ), Terrain.EMPTY_SP ); + drawInside( level, room, door2, Math.abs( door1.y - door2.y ), Terrain.EMPTY_SP ); + + } + } + + private static void paintFissure( Level level, Room room ) { + fill( level, room.left + 1, room.top + 1, room.width() - 1, room.height() - 1 ,Terrain.EMPTY ); + + for (int i=room.top + 2; i < room.bottom - 1; i++) { + for (int j=room.left + 2; j < room.right - 1; j++) { + int v = Math.min( i - room.top, room.bottom - i ); + int h = Math.min( j - room.left, room.right - j ); + if (Math.min( v, h ) > 2 || Random.Int( 2 ) == 0) { + set( level, j, i, Terrain.CHASM ); + } + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/StatuePainter.java b/src/com/watabou/pixeldungeon/levels/painters/StatuePainter.java new file mode 100644 index 0000000000..0f4af20ac3 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/StatuePainter.java @@ -0,0 +1,72 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.mobs.Statue; +import com.watabou.pixeldungeon.items.keys.IronKey; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Point; + +public class StatuePainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY ); + + Point c = room.center(); + int cx = c.x; + int cy = c.y; + + Room.Door door = room.entrance(); + + door.set( Room.Door.Type.LOCKED ); + level.addItemToSpawn( new IronKey( Dungeon.depth ) ); + + if (door.x == room.left) { + + fill( level, room.right - 1, room.top + 1, 1, room.height() - 1 , Terrain.STATUE ); + cx = room.right - 2; + + } else if (door.x == room.right) { + + fill( level, room.left + 1, room.top + 1, 1, room.height() - 1 , Terrain.STATUE ); + cx = room.left + 2; + + } else if (door.y == room.top) { + + fill( level, room.left + 1, room.bottom - 1, room.width() - 1, 1 , Terrain.STATUE ); + cy = room.bottom - 2; + + } else if (door.y == room.bottom) { + + fill( level, room.left + 1, room.top + 1, room.width() - 1, 1 , Terrain.STATUE ); + cy = room.top + 2; + + } + + Statue statue = new Statue(); + statue.pos = cx + cy * Level.WIDTH; + level.mobs.add( statue ); + Actor.occupyCell( statue ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/StoragePainter.java b/src/com/watabou/pixeldungeon/levels/painters/StoragePainter.java new file mode 100644 index 0000000000..3cdd40829a --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/StoragePainter.java @@ -0,0 +1,64 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.potions.PotionOfLiquidFlame; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Random; + +public class StoragePainter extends Painter { + + public static void paint( Level level, Room room ) { + + final int floor = Terrain.EMPTY_SP; + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, floor ); + + int n = Random.IntRange( 3, 4 ); + for (int i=0; i < n; i++) { + int pos; + do { + pos = room.random(); + } while (level.map[pos] != floor); + level.drop( prize( level ), pos ); + } + + room.entrance().set( Room.Door.Type.BARRICADE ); + level.addItemToSpawn( new PotionOfLiquidFlame() ); + } + + private static Item prize( Level level ) { + + Item prize = level.itemToSpanAsPrize(); + if (prize != null) { + return prize; + } + + return Generator.random( Random.oneOf( + Generator.Category.POTION, + Generator.Category.SCROLL, + Generator.Category.FOOD, + Generator.Category.GOLD + ) ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/TrapsPainter.java b/src/com/watabou/pixeldungeon/levels/painters/TrapsPainter.java new file mode 100644 index 0000000000..45ba75fabd --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/TrapsPainter.java @@ -0,0 +1,104 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.potions.PotionOfLevitation; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Random; + +public class TrapsPainter extends Painter { + + public static void paint( Level level, Room room ) { + + Integer traps[] = { + Terrain.TOXIC_TRAP, Terrain.TOXIC_TRAP, Terrain.TOXIC_TRAP, + Terrain.PARALYTIC_TRAP, Terrain.PARALYTIC_TRAP, + !Dungeon.bossLevel( Dungeon.depth + 1 ) ? Terrain.CHASM : Terrain.SUMMONING_TRAP }; + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Random.element( traps ) ); + + Room.Door door = room.entrance(); + door.set( Room.Door.Type.REGULAR ); + + int lastRow = level.map[room.left + 1 + (room.top + 1) * Level.WIDTH] == Terrain.CHASM ? Terrain.CHASM : Terrain.EMPTY; + + int x = -1; + int y = -1; + if (door.x == room.left) { + x = room.right - 1; + y = room.top + room.height() / 2; + fill( level, x, room.top + 1, 1, room.height() - 1 , lastRow ); + } else if (door.x == room.right) { + x = room.left + 1; + y = room.top + room.height() / 2; + fill( level, x, room.top + 1, 1, room.height() - 1 , lastRow ); + } else if (door.y == room.top) { + x = room.left + room.width() / 2; + y = room.bottom - 1; + fill( level, room.left + 1, y, room.width() - 1, 1 , lastRow ); + } else if (door.y == room.bottom) { + x = room.left + room.width() / 2; + y = room.top + 1; + fill( level, room.left + 1, y, room.width() - 1, 1 , lastRow ); + } + + int pos = x + y * Level.WIDTH; + if (Random.Int( 3 ) == 0) { + if (lastRow == Terrain.CHASM) { + set( level, pos, Terrain.EMPTY ); + } + level.drop( prize( level ), pos ).type = Heap.Type.CHEST; + } else { + set( level, pos, Terrain.PEDESTAL ); + level.drop( prize( level ), pos ); + } + + level.addItemToSpawn( new PotionOfLevitation() ); + } + + private static Item prize( Level level ) { + + Item prize = level.itemToSpanAsPrize(); + if (prize != null) { + return prize; + } + + prize = Generator.random( Random.oneOf( + Generator.Category.WEAPON, + Generator.Category.ARMOR + ) ); + + for (int i=0; i < 3; i++) { + Item another = Generator.random( Random.oneOf( + Generator.Category.WEAPON, + Generator.Category.ARMOR + ) ); + if (another.level > prize.level) { + prize = another; + } + } + + return prize; + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/TreasuryPainter.java b/src/com/watabou/pixeldungeon/levels/painters/TreasuryPainter.java new file mode 100644 index 0000000000..ea3c6163c3 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/TreasuryPainter.java @@ -0,0 +1,62 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Gold; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.keys.IronKey; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Random; + +public class TreasuryPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY ); + + set( level, room.center(), Terrain.STATUE ); + + Heap.Type heapType = Random.Int( 2 ) == 0 ? Heap.Type.CHEST : Heap.Type.HEAP; + + int n = Random.IntRange( 2, 3 ); + for (int i=0; i < n; i++) { + int pos; + do { + pos = room.random(); + } while (level.map[pos] != Terrain.EMPTY || level.heaps.get( pos ) != null); + level.drop( new Gold().random(), pos ).type = heapType; + } + + if (heapType == Heap.Type.HEAP) { + for (int i=0; i < 6; i++) { + int pos; + do { + pos = room.random(); + } while (level.map[pos] != Terrain.EMPTY); + level.drop( new Gold( Random.IntRange( 1, 3 ) ), pos ); + } + } + + room.entrance().set( Room.Door.Type.LOCKED ); + level.addItemToSpawn( new IronKey( Dungeon.depth ) ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/TunnelPainter.java b/src/com/watabou/pixeldungeon/levels/painters/TunnelPainter.java new file mode 100644 index 0000000000..2544f777e9 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/TunnelPainter.java @@ -0,0 +1,120 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class TunnelPainter extends Painter { + + public static void paint( Level level, Room room ) { + + int floor = level.tunnelTile(); + + Point c = room.center(); + + if (room.width() > room.height() || (room.width() == room.height() && Random.Int( 2 ) == 0)) { + + int from = room.right - 1; + int to = room.left + 1; + + for (Room.Door door : room.connected.values()) { + + int step = door.y < c.y ? +1 : -1; + + if (door.x == room.left) { + + from = room.left + 1; + for (int i=door.y; i != c.y; i += step) { + set( level, from, i, floor ); + } + + } else if (door.x == room.right) { + + to = room.right - 1; + for (int i=door.y; i != c.y; i += step) { + set( level, to, i, floor ); + } + + } else { + if (door.x < from) { + from = door.x; + } + if (door.x > to) { + to = door.x; + } + + for (int i=door.y+step; i != c.y; i += step) { + set( level, door.x, i, floor ); + } + } + } + + for (int i=from; i <= to; i++) { + set( level, i, c.y, floor ); + } + + } else { + + int from = room.bottom - 1; + int to = room.top + 1; + + for (Room.Door door : room.connected.values()) { + + int step = door.x < c.x ? +1 : -1; + + if (door.y == room.top) { + + from = room.top + 1; + for (int i=door.x; i != c.x; i += step) { + set( level, i, from, floor ); + } + + } else if (door.y == room.bottom) { + + to = room.bottom - 1; + for (int i=door.x; i != c.x; i += step) { + set( level, i, to, floor ); + } + + } else { + if (door.y < from) { + from = door.y; + } + if (door.y > to) { + to = door.y; + } + + for (int i=door.x+step; i != c.x; i += step) { + set( level, i, door.y, floor ); + } + } + } + + for (int i=from; i <= to; i++) { + set( level, c.x, i, floor ); + } + } + + for (Room.Door door : room.connected.values()) { + door.set( Room.Door.Type.TUNNEL ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/VaultPainter.java b/src/com/watabou/pixeldungeon/levels/painters/VaultPainter.java new file mode 100644 index 0000000000..9de626b698 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/VaultPainter.java @@ -0,0 +1,76 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.Heap.Type; +import com.watabou.pixeldungeon.items.keys.GoldenKey; +import com.watabou.pixeldungeon.items.keys.IronKey; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Random; + +public class VaultPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.EMPTY ); + + int cx = (room.left + room.right) / 2; + int cy = (room.top + room.bottom) / 2; + int c = cx + cy * Level.WIDTH; + + switch (Random.Int( 3 )) { + + case 0: + level.drop( prize( level ), c ).type = Type.LOCKED_CHEST; + level.addItemToSpawn( new GoldenKey( Dungeon.depth ) ); + break; + + case 1: + Item i1, i2; + do { + i1 = prize( level ); + i2 = prize( level ); + } while (i1.getClass() == i2.getClass()); + level.drop( i1, c ).type = Type.CRYSTAL_CHEST; + level.drop( i2, c + Level.NEIGHBOURS8[Random.Int( 8 )]).type = Type.CRYSTAL_CHEST; + level.addItemToSpawn( new GoldenKey( Dungeon.depth ) ); + break; + + case 2: + level.drop( prize( level ), c ); + set( level, c, Terrain.PEDESTAL ); + break; + } + + room.entrance().set( Room.Door.Type.LOCKED ); + level.addItemToSpawn( new IronKey( Dungeon.depth ) ); + } + + private static Item prize( Level level ) { + return Generator.random( Random.oneOf( + Generator.Category.WAND, + Generator.Category.RING + ) ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/painters/WeakFloorPainter.java b/src/com/watabou/pixeldungeon/levels/painters/WeakFloorPainter.java new file mode 100644 index 0000000000..5da8bd3d12 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/painters/WeakFloorPainter.java @@ -0,0 +1,54 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.painters; + +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Room; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class WeakFloorPainter extends Painter { + + public static void paint( Level level, Room room ) { + + fill( level, room, Terrain.WALL ); + fill( level, room, 1, Terrain.CHASM ); + + Room.Door door = room.entrance(); + door.set( Room.Door.Type.REGULAR ); + + if (door.x == room.left) { + for (int i=room.top + 1; i < room.bottom; i++) { + drawInside( level, room, new Point( room.left, i ), Random.IntRange( 1, room.width() - 2 ), Terrain.EMPTY_SP ); + } + } else if (door.x == room.right) { + for (int i=room.top + 1; i < room.bottom; i++) { + drawInside( level, room, new Point( room.right, i ), Random.IntRange( 1, room.width() - 2 ), Terrain.EMPTY_SP ); + } + } else if (door.y == room.top) { + for (int i=room.left + 1; i < room.right; i++) { + drawInside( level, room, new Point( i, room.top ), Random.IntRange( 1, room.height() - 2 ), Terrain.EMPTY_SP ); + } + } else if (door.y == room.bottom) { + for (int i=room.left + 1; i < room.right; i++) { + drawInside( level, room, new Point( i, room.bottom ), Random.IntRange( 1, room.height() - 2 ), Terrain.EMPTY_SP ); + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/levels/traps/AlarmTrap.java b/src/com/watabou/pixeldungeon/levels/traps/AlarmTrap.java new file mode 100644 index 0000000000..7eeca71aaf --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/traps/AlarmTrap.java @@ -0,0 +1,48 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.traps; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.utils.GLog; + +public class AlarmTrap { + + // 0xDD3333 + + public static void trigger( int pos, Char ch ) { + + for (Mob mob : Dungeon.level.mobs) { + if (mob != ch) { + mob.beckon( pos ); + } + } + + if (Dungeon.visible[pos]) { + GLog.w( "The trap emits a piercing sound that echoes throughout the dungeon!" ); + CellEmitter.center( pos ).start( Speck.factory( Speck.SCREAM ), 0.3f, 3 ); + } + + Sample.INSTANCE.play( Assets.SND_ALERT ); + } +} diff --git a/src/com/watabou/pixeldungeon/levels/traps/FireTrap.java b/src/com/watabou/pixeldungeon/levels/traps/FireTrap.java new file mode 100644 index 0000000000..64d638d368 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/traps/FireTrap.java @@ -0,0 +1,37 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.traps; + +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.Fire; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.FlameParticle; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class FireTrap { + + // 0xFF7708 + + public static void trigger( int pos, Char ch ) { + + GameScene.add( Blob.seed( pos, 2, Fire.class ) ); + CellEmitter.get( pos ).burst( FlameParticle.FACTORY, 5 ); + + } +} diff --git a/src/com/watabou/pixeldungeon/levels/traps/GrippingTrap.java b/src/com/watabou/pixeldungeon/levels/traps/GrippingTrap.java new file mode 100644 index 0000000000..7e5878ed02 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/traps/GrippingTrap.java @@ -0,0 +1,42 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.traps; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Bleeding; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Cripple; +import com.watabou.pixeldungeon.effects.Wound; +import com.watabou.utils.Random; + +public class GrippingTrap { + + public static void trigger( int pos, Char c ) { + + if (c != null) { + int damage = Math.max( 0, (Dungeon.depth + 3) - Random.IntRange( 0, c.dr() / 2 ) ); + Buff.affect( c, Bleeding.class ).set( damage ); + Buff.prolong( c, Cripple.class, Cripple.DURATION ); + Wound.hit( c ); + } else { + Wound.hit( pos ); + } + + } +} diff --git a/src/com/watabou/pixeldungeon/levels/traps/LightningTrap.java b/src/com/watabou/pixeldungeon/levels/traps/LightningTrap.java new file mode 100644 index 0000000000..d1b16a5300 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/traps/LightningTrap.java @@ -0,0 +1,73 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.traps; + +import com.watabou.noosa.Camera; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.ResultDescriptions; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Lightning; +import com.watabou.pixeldungeon.effects.particles.SparkParticle; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Random; + +public class LightningTrap { + + private static final String name = "lightning trap"; + + // 00x66CCEE + + public static void trigger( int pos, Char ch ) { + + if (ch != null) { + ch.damage( Math.max( 1, Random.Int( ch.HP / 3, 2 * ch.HP / 3 ) ), LIGHTNING ); + if (ch == Dungeon.hero) { + + Camera.main.shake( 2, 0.3f ); + + if (!ch.isAlive()) { + Dungeon.fail( Utils.format( ResultDescriptions.TRAP, name, Dungeon.depth ) ); + GLog.n( "You were killed by a discharge of a lightning trap..." ); + } else { + ((Hero)ch).belongings.charge( false ); + } + } + + int[] points = new int[2]; + + points[0] = pos - Level.WIDTH; + points[1] = pos + Level.WIDTH; + ch.sprite.parent.add( new Lightning( points, 2, null ) ); + + points[0] = pos - 1; + points[1] = pos + 1; + ch.sprite.parent.add( new Lightning( points, 2, null ) ); + } + + CellEmitter.center( pos ).burst( SparkParticle.FACTORY, Random.IntRange( 3, 4 ) ); + + } + + public static final Electricity LIGHTNING = new Electricity(); + public static class Electricity { + } +} diff --git a/src/com/watabou/pixeldungeon/levels/traps/ParalyticTrap.java b/src/com/watabou/pixeldungeon/levels/traps/ParalyticTrap.java new file mode 100644 index 0000000000..a858fef6ec --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/traps/ParalyticTrap.java @@ -0,0 +1,35 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.traps; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.ParalyticGas; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class ParalyticTrap { + + // 0xCCCC55 + + public static void trigger( int pos, Char ch ) { + + GameScene.add( Blob.seed( pos, 80 + 5 * Dungeon.depth, ParalyticGas.class ) ); + + } +} diff --git a/src/com/watabou/pixeldungeon/levels/traps/PoisonTrap.java b/src/com/watabou/pixeldungeon/levels/traps/PoisonTrap.java new file mode 100644 index 0000000000..50a109d22c --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/traps/PoisonTrap.java @@ -0,0 +1,40 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.traps; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.PoisonParticle; + +public class PoisonTrap { + + // 0xBB66EE + + public static void trigger( int pos, Char ch ) { + + if (ch != null) { + Buff.affect( ch, Poison.class ).set( 5 + Math.min( Dungeon.depth, 15 ) ); + } + + CellEmitter.center( pos ).burst( PoisonParticle.SPLASH, 3 ); + + } +} diff --git a/src/com/watabou/pixeldungeon/levels/traps/SummoningTrap.java b/src/com/watabou/pixeldungeon/levels/traps/SummoningTrap.java new file mode 100644 index 0000000000..ba9e678b0b --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/traps/SummoningTrap.java @@ -0,0 +1,88 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.traps; + +import java.util.ArrayList; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.Bestiary; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.items.wands.WandOfBlink; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.Random; + +public class SummoningTrap { + + private static final float DELAY = 2f; + + private static final Mob DUMMY = new Mob() {}; + + // 0x770088 + + public static void trigger( int pos, Char c ) { + + if (Dungeon.bossLevel()) { + return; + } + + if (c != null) { + Actor.occupyCell( c ); + } + + int nMobs = 1; + if (Random.Int( 2 ) == 0) { + nMobs++; + if (Random.Int( 2 ) == 0) { + nMobs++; + } + } + + // It's complicated here, because these traps can be activated in chain + + ArrayList candidates = new ArrayList(); + + for (int i=0; i < Level.NEIGHBOURS8.length; i++) { + int p = pos + Level.NEIGHBOURS8[i]; + if (Actor.findChar( p ) == null && (Level.passable[p] || Level.avoid[p])) { + candidates.add( p ); + } + } + + ArrayList respawnPoints = new ArrayList(); + + while (nMobs > 0 && candidates.size() > 0) { + int index = Random.index( candidates ); + + DUMMY.pos = candidates.get( index ); + Actor.occupyCell( DUMMY ); + + respawnPoints.add( candidates.remove( index ) ); + nMobs--; + } + + for (Integer point : respawnPoints) { + Mob mob = Bestiary.mob( Dungeon.depth ); + mob.state = Mob.State.WANDERING; + GameScene.add( mob, DELAY ); + WandOfBlink.appear( mob, point ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/levels/traps/ToxicTrap.java b/src/com/watabou/pixeldungeon/levels/traps/ToxicTrap.java new file mode 100644 index 0000000000..61957c59f7 --- /dev/null +++ b/src/com/watabou/pixeldungeon/levels/traps/ToxicTrap.java @@ -0,0 +1,35 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.levels.traps; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.ToxicGas; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class ToxicTrap { + + // 0x40CC55 + + public static void trigger( int pos, Char ch ) { + + GameScene.add( Blob.seed( pos, 300 + 20 * Dungeon.depth, ToxicGas.class ) ); + + } +} diff --git a/src/com/watabou/pixeldungeon/mechanics/Ballistica.java b/src/com/watabou/pixeldungeon/mechanics/Ballistica.java new file mode 100644 index 0000000000..4f71a1f2ab --- /dev/null +++ b/src/com/watabou/pixeldungeon/mechanics/Ballistica.java @@ -0,0 +1,98 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.mechanics; + +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.levels.Level; + +public class Ballistica { + + public static int[] trace = new int[Math.max( Level.WIDTH, Level.HEIGHT )]; + public static int distance; + + public static int cast( int from, int to, boolean magic, boolean hitChars ) { + + int w = Level.WIDTH; + + int x0 = from % w; + int x1 = to % w; + int y0 = from / w; + int y1 = to / w; + + int dx = x1 - x0; + int dy = y1 - y0; + + int stepX = dx > 0 ? +1 : -1; + int stepY = dy > 0 ? +1 : -1; + + dx = Math.abs( dx ); + dy = Math.abs( dy ); + + int stepA; + int stepB; + int dA; + int dB; + + if (dx > dy) { + + stepA = stepX; + stepB = stepY * w; + dA = dx; + dB = dy; + + } else { + + stepA = stepY * w; + stepB = stepX; + dA = dy; + dB = dx; + + } + + distance = 1; + trace[0] = from; + + int cell = from; + + int err = dA / 2; + while (cell != to || magic) { + + cell += stepA; + + err += dB; + if (err >= dA) { + err = err - dA; + cell = cell + stepB; + } + + trace[distance++] = cell; + + if (!Level.passable[cell] && !Level.avoid[cell]) { + return trace[--distance - 1]; + } + + if (Level.losBlocking[cell] || (hitChars && Actor.findChar( cell ) != null)) { + return cell; + } + } + + trace[distance++] = cell; + + return to; + } +} diff --git a/src/com/watabou/pixeldungeon/mechanics/ShadowCaster.java b/src/com/watabou/pixeldungeon/mechanics/ShadowCaster.java new file mode 100644 index 0000000000..696bd7a243 --- /dev/null +++ b/src/com/watabou/pixeldungeon/mechanics/ShadowCaster.java @@ -0,0 +1,152 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.mechanics; + +import java.util.Arrays; + +import com.watabou.pixeldungeon.levels.Level; + +public final class ShadowCaster { + + private static final int MAX_DISTANCE = 8; + + private static final int WIDTH = Level.WIDTH; + private static final int HEIGHT = Level.HEIGHT; + + private static int distance; + private static int limits[]; + + private static boolean[] losBlocking; + private static boolean[] fieldOfView; + + private static int[][] rounding; + static { + rounding = new int[MAX_DISTANCE+1][]; + for (int i=1; i <= MAX_DISTANCE; i++) { + rounding[i] = new int[i+1]; + for (int j=1; j <= i; j++) { + rounding[i][j] = (int)Math.min( j, Math.round( i * Math.cos( Math.asin( j / (i + 0.5) )))); + } + } + } + + private static Obstacles obs = new Obstacles(); + + public static void castShadow( int x, int y, boolean[] fieldOfView, int distance ) { + + losBlocking = Level.losBlocking; + + ShadowCaster.distance = distance; + limits = rounding[distance]; + + ShadowCaster.fieldOfView = fieldOfView; + Arrays.fill( fieldOfView, false ); + fieldOfView[y * WIDTH + x] = true; + + scanSector( x, y, +1, +1, 0, 0 ); + scanSector( x, y, -1, +1, 0, 0 ); + scanSector( x, y, +1, -1, 0, 0 ); + scanSector( x, y, -1, -1, 0, 0 ); + scanSector( x, y, 0, 0, +1, +1 ); + scanSector( x, y, 0, 0, -1, +1 ); + scanSector( x, y, 0, 0, +1, -1 ); + scanSector( x, y, 0, 0, -1, -1 ); + } + + private static void scanSector( int cx, int cy, int m1, int m2, int m3, int m4 ) { + + obs.reset(); + + for (int p=1; p <= distance; p++) { + + float dq2 = 0.5f / p; + + int pp = limits[p]; + for (int q=0; q <= pp; q++) { + + int x = cx + q * m1 + p * m3; + int y = cy + p * m2 + q * m4; + + if (y >= 0 && y < HEIGHT && x >= 0 && x < WIDTH) { + + float a0 = (float)q / p; + float a1 = a0 - dq2; + float a2 = a0 + dq2; + + int pos = y * WIDTH + x; + + if (obs.isBlocked( a0 ) && obs.isBlocked( a1 ) && obs.isBlocked( a2 )) { + + } else { + fieldOfView[pos] = true; + } + + if (losBlocking[pos]) { + obs.add( a1, a2 ); + } + + } + } + + obs.nextRow(); + } + } + + private static final class Obstacles { + + private static int SIZE = (MAX_DISTANCE+1) * (MAX_DISTANCE+1) / 2; + private static float[] a1 = new float[SIZE]; + private static float[] a2 = new float[SIZE]; + + private int length; + private int limit; + + public void reset() { + length = 0; + limit = 0; + } + + public void add( float o1, float o2 ) { + + if (length > limit && o1 <= a2[length-1]) { + + a2[length-1] = o2; + + } else { + + a1[length] = o1; + a2[length++] = o2; + + } + + } + + public boolean isBlocked( float a ) { + for (int i=0; i < limit; i++) { + if (a >= a1[i] && a <= a2[i]) { + return true; + } + } + return false; + } + + public void nextRow() { + limit = length; + } + } +} diff --git a/src/com/watabou/pixeldungeon/plants/Blindweed.java b/src/com/watabou/pixeldungeon/plants/Blindweed.java new file mode 100644 index 0000000000..0e3f806053 --- /dev/null +++ b/src/com/watabou/pixeldungeon/plants/Blindweed.java @@ -0,0 +1,80 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.plants; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Blindness; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.actors.mobs.Mob.State; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.potions.PotionOfInvisibility; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.utils.Random; + +public class Blindweed extends Plant { + + private static final String TXT_DESC = + "Upon touching a Blindweed it perishes in a blinding flash of light."; + + { + image = 3; + plantName = "Blindweed"; + } + + @Override + public void activate( Char ch ) { + super.activate( ch ); + + if (ch != null) { + Buff.prolong( ch, Blindness.class, Random.Int( 5, 10 ) ); + if (ch instanceof Mob) { + ((Mob)ch).state = State.WANDERING; + ((Mob)ch).beckon( Dungeon.level.randomDestination() ); + } + } + + if (Dungeon.visible[pos]) { + CellEmitter.get( pos ).burst( Speck.factory( Speck.LIGHT ), 4 ); + } + } + + @Override + public String desc() { + return TXT_DESC; + } + + public static class Seed extends Plant.Seed { + { + plantName = "Blindweed"; + + name = "seed of " + plantName; + image = ItemSpriteSheet.SEED_BLINDWEED; + + plantClass = Blindweed.class; + alchemyClass = PotionOfInvisibility.class; + } + + @Override + public String desc() { + return TXT_DESC; + } + } +} diff --git a/src/com/watabou/pixeldungeon/plants/Earthroot.java b/src/com/watabou/pixeldungeon/plants/Earthroot.java new file mode 100644 index 0000000000..400614ebc5 --- /dev/null +++ b/src/com/watabou/pixeldungeon/plants/Earthroot.java @@ -0,0 +1,143 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.plants; + +import com.watabou.noosa.Camera; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.EarthParticle; +import com.watabou.pixeldungeon.items.potions.PotionOfParalyticGas; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.utils.Bundle; + +public class Earthroot extends Plant { + + private static final String TXT_DESC = + "When a creature touches an Earthroot, its roots " + + "create a kind of natural armor around it."; + + { + image = 5; + plantName = "Earthroot"; + } + + @Override + public void activate( Char ch ) { + super.activate( ch ); + + if (ch != null) { + Buff.affect( ch, Armor.class ).level = ch.HT; + } + + if (Dungeon.visible[pos]) { + CellEmitter.bottom( pos ).start( EarthParticle.FACTORY, 0.05f, 8 ); + Camera.main.shake( 1, 0.4f ); + } + } + + @Override + public String desc() { + return TXT_DESC; + } + + public static class Seed extends Plant.Seed { + { + plantName = "Earthroot"; + + name = "seed of " + plantName; + image = ItemSpriteSheet.SEED_EARTHROOT; + + plantClass = Earthroot.class; + alchemyClass = PotionOfParalyticGas.class; + } + + @Override + public String desc() { + return TXT_DESC; + } + } + + public static class Armor extends Buff { + + private static final float STEP = 1f; + + private int pos; + private int level; + + @Override + public boolean attachTo( Char target ) { + pos = target.pos; + return super.attachTo( target ); + } + + @Override + public boolean act() { + if (target.pos != pos) { + detach(); + } + spend( STEP ); + return true; + } + + public int absorb( int damage ) { + if (damage >= level) { + detach(); + return damage - level; + } else { + level -= damage; + return 0; + } + } + + public void level( int value ) { + if (level < value) { + level = value; + } + } + + @Override + public int icon() { + return BuffIndicator.ARMOR; + } + + @Override + public String toString() { + return "Herbal armor"; + } + + private static final String POS = "pos"; + private static final String LEVEL = "level"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( POS, pos ); + bundle.put( LEVEL, level ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + pos = bundle.getInt( POS ); + level = bundle.getInt( LEVEL ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/plants/Fadeleaf.java b/src/com/watabou/pixeldungeon/plants/Fadeleaf.java new file mode 100644 index 0000000000..fda8c78e27 --- /dev/null +++ b/src/com/watabou/pixeldungeon/plants/Fadeleaf.java @@ -0,0 +1,99 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.plants; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.potions.PotionOfMindVision; +import com.watabou.pixeldungeon.items.scrolls.ScrollOfTeleportation; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Fadeleaf extends Plant { + + private static final String TXT_DESC = + "Touching a Fadeleaf will teleport any creature " + + "to a random place on the current level."; + + { + image = 6; + plantName = "Fadeleaf"; + } + + @Override + public void activate( Char ch ) { + super.activate( ch ); + + if (ch instanceof Hero) { + + ScrollOfTeleportation.teleportHero( (Hero)ch ); + ((Hero)ch).curAction = null; + + } else if (ch instanceof Mob) { + + // Why do I try to choose a new position 10 times? + // I don't remember... + int count = 10; + int newPos; + do { + newPos = Dungeon.level.randomRespawnCell(); + if (count-- <= 0) { + break; + } + } while (newPos == -1); + + if (newPos != -1) { + + ch.pos = newPos; + ch.sprite.place( ch.pos ); + ch.sprite.visible = Dungeon.visible[pos]; + + } + + } + + if (Dungeon.visible[pos]) { + CellEmitter.get( pos ).start( Speck.factory( Speck.LIGHT ), 0.2f, 3 ); + } + } + + @Override + public String desc() { + return TXT_DESC; + } + + public static class Seed extends Plant.Seed { + { + plantName = "Fadeleaf"; + + name = "seed of " + plantName; + image = ItemSpriteSheet.SEED_FADELEAF; + + plantClass = Fadeleaf.class; + alchemyClass = PotionOfMindVision.class; + } + + @Override + public String desc() { + return TXT_DESC; + } + } +} diff --git a/src/com/watabou/pixeldungeon/plants/Firebloom.java b/src/com/watabou/pixeldungeon/plants/Firebloom.java new file mode 100644 index 0000000000..8b5e9a19a6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/plants/Firebloom.java @@ -0,0 +1,71 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.plants; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.blobs.Fire; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.FlameParticle; +import com.watabou.pixeldungeon.items.potions.PotionOfLiquidFlame; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Firebloom extends Plant { + + private static final String TXT_DESC = "When something touches a Firebloom, it bursts into flames."; + + { + image = 0; + plantName = "Firebloom"; + } + + @Override + public void activate( Char ch ) { + super.activate( ch ); + + GameScene.add( Blob.seed( pos, 2, Fire.class ) ); + + if (Dungeon.visible[pos]) { + CellEmitter.get( pos ).burst( FlameParticle.FACTORY, 5 ); + } + } + + @Override + public String desc() { + return TXT_DESC; + } + + public static class Seed extends Plant.Seed { + { + plantName = "Firebloom"; + + name = "seed of " + plantName; + image = ItemSpriteSheet.SEED_FIREBLOOM; + + plantClass = Firebloom.class; + alchemyClass = PotionOfLiquidFlame.class; + } + + @Override + public String desc() { + return TXT_DESC; + } + } +} diff --git a/src/com/watabou/pixeldungeon/plants/Icecap.java b/src/com/watabou/pixeldungeon/plants/Icecap.java new file mode 100644 index 0000000000..b14084cdab --- /dev/null +++ b/src/com/watabou/pixeldungeon/plants/Icecap.java @@ -0,0 +1,77 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.plants; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.blobs.Fire; +import com.watabou.pixeldungeon.actors.blobs.Freezing; +import com.watabou.pixeldungeon.items.potions.PotionOfFrost; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.BArray; +import com.watabou.utils.PathFinder; + +public class Icecap extends Plant { + + private static final String TXT_DESC = + "Upon touching an Icecap excretes a pollen, which freezes everything in its vicinity."; + + { + image = 1; + plantName = "Icecap"; + } + + @Override + public void activate( Char ch ) { + super.activate( ch ); + + PathFinder.buildDistanceMap( pos, BArray.not( Level.losBlocking, null ), 1 ); + + Fire fire = (Fire)Dungeon.level.blobs.get( Fire.class ); + + for (int i=0; i < Level.LENGTH; i++) { + if (PathFinder.distance[i] < Integer.MAX_VALUE) { + + Freezing.affect( i, fire ); + } + } + } + + @Override + public String desc() { + return TXT_DESC; + } + + public static class Seed extends Plant.Seed { + { + plantName = "Icecap"; + + name = "seed of " + plantName; + image = ItemSpriteSheet.SEED_ICECAP; + + plantClass = Icecap.class; + alchemyClass = PotionOfFrost.class; + } + + @Override + public String desc() { + return TXT_DESC; + } + } +} diff --git a/src/com/watabou/pixeldungeon/plants/Plant.java b/src/com/watabou/pixeldungeon/plants/Plant.java new file mode 100644 index 0000000000..c3632c8edb --- /dev/null +++ b/src/com/watabou/pixeldungeon/plants/Plant.java @@ -0,0 +1,177 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.plants; + +import java.util.ArrayList; + +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Barkskin; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroSubClass; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.LeafParticle; +import com.watabou.pixeldungeon.items.Dewdrop; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.sprites.PlantSprite; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Bundlable; +import com.watabou.utils.Bundle; +import com.watabou.utils.Random; + +public class Plant implements Bundlable { + + public String plantName; + + public int image; + public int pos; + + public PlantSprite sprite; + + public void activate( Char ch ) { + + if (ch instanceof Hero && ((Hero)ch).subClass == HeroSubClass.WARDEN) { + Buff.affect( ch, Barkskin.class ).level( ch.HT / 3 ); + } + + wither(); + } + + public void wither() { + Dungeon.level.uproot( pos ); + + sprite.kill(); + if (Dungeon.visible[pos]) { + CellEmitter.get( pos ).burst( LeafParticle.GENERAL, 6 ); + } + + if (Dungeon.hero.subClass == HeroSubClass.WARDEN) { + if (Random.Int( 5 ) == 0) { + Dungeon.level.drop( Generator.random( Generator.Category.SEED ), pos ).sprite.drop(); + } + if (Random.Int( 5 ) == 0) { + Dungeon.level.drop( new Dewdrop(), pos ).sprite.drop(); + } + } + } + + private static final String POS = "pos"; + + @Override + public void restoreFromBundle( Bundle bundle ) { + pos = bundle.getInt( POS ); + } + + @Override + public void storeInBundle( Bundle bundle ) { + bundle.put( POS, pos ); + } + + public String desc() { + return null; + } + + public static class Seed extends Item { + + public static final String AC_PLANT = "PLANT"; + + private static final String TXT_INFO = "Throw this seed to the place where you want to grow %s.\n\n%s"; + + private static final float TIME_TO_PLANT = 1f; + + { + stackable = true; + defaultAction = AC_THROW; + } + + protected Class plantClass; + protected String plantName; + + public Class alchemyClass; + + @Override + public ArrayList actions( Hero hero ) { + ArrayList actions = super.actions( hero ); + actions.add( AC_PLANT ); + return actions; + } + + @Override + protected void onThrow( int cell ) { + if (Dungeon.level.map[cell] == Terrain.ALCHEMY || Level.pit[cell]) { + super.onThrow( cell ); + } else { + Dungeon.level.plant( this, cell ); + } + } + + @Override + public void execute( Hero hero, String action ) { + if (action.equals( AC_PLANT )) { + + hero.spend( TIME_TO_PLANT ); + hero.busy(); + ((Seed)detach( hero.belongings.backpack )).onThrow( hero.pos ); + + hero.sprite.operate( hero.pos ); + + } else { + + super.execute (hero, action ); + + } + } + + public Plant couch( int pos ) { + try { + Sample.INSTANCE.play( Assets.SND_PLANT ); + Plant plant = plantClass.newInstance(); + plant.pos = pos; + return plant; + } catch (Exception e) { + return null; + } + } + + @Override + public boolean isUpgradable() { + return false; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public int price() { + return 10 * quantity; + } + + @Override + public String info() { + return String.format( TXT_INFO, Utils.indefinite( plantName ), desc() ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/plants/Sorrowmoss.java b/src/com/watabou/pixeldungeon/plants/Sorrowmoss.java new file mode 100644 index 0000000000..54bf56f13a --- /dev/null +++ b/src/com/watabou/pixeldungeon/plants/Sorrowmoss.java @@ -0,0 +1,73 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.plants; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.buffs.Poison; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.particles.PoisonParticle; +import com.watabou.pixeldungeon.items.potions.PotionOfToxicGas; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; + +public class Sorrowmoss extends Plant { + + private static final String TXT_DESC = + "A Sorrowmoss is a flower (not a moss) with razor-sharp petals, coated with a deadly venom."; + + { + image = 2; + plantName = "Sorrowmoss"; + } + + @Override + public void activate( Char ch ) { + super.activate( ch ); + + if (ch != null) { + Buff.affect( ch, Poison.class ).set( 5 + Math.min( Dungeon.depth, 15 ) ); + } + + if (Dungeon.visible[pos]) { + CellEmitter.center( pos ).burst( PoisonParticle.SPLASH, 3 ); + } + } + + @Override + public String desc() { + return TXT_DESC; + } + + public static class Seed extends Plant.Seed { + { + plantName = "Sorrowmoss"; + + name = "seed of " + plantName; + image = ItemSpriteSheet.SEED_SORROWMOSS; + + plantClass = Sorrowmoss.class; + alchemyClass = PotionOfToxicGas.class; + } + + @Override + public String desc() { + return TXT_DESC; + } + } +} diff --git a/src/com/watabou/pixeldungeon/plants/Sungrass.java b/src/com/watabou/pixeldungeon/plants/Sungrass.java new file mode 100644 index 0000000000..c1a1e82aba --- /dev/null +++ b/src/com/watabou/pixeldungeon/plants/Sungrass.java @@ -0,0 +1,123 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.plants; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.particles.ShaftParticle; +import com.watabou.pixeldungeon.items.potions.PotionOfHealing; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.utils.Bundle; + +public class Sungrass extends Plant { + + private static final String TXT_DESC = "Sungrass is renowned for its sap's healing properties."; + + { + image = 4; + plantName = "Sungrass"; + } + + @Override + public void activate( Char ch ) { + super.activate( ch ); + + if (ch != null) { + Buff.affect( ch, Health.class ); + } + + if (Dungeon.visible[pos]) { + CellEmitter.get( pos ).start( ShaftParticle.FACTORY, 0.2f, 3 ); + } + } + + @Override + public String desc() { + return TXT_DESC; + } + + public static class Seed extends Plant.Seed { + { + plantName = "Sungrass"; + + name = "seed of " + plantName; + image = ItemSpriteSheet.SEED_SUNGRASS; + + plantClass = Sungrass.class; + alchemyClass = PotionOfHealing.class; + } + + @Override + public String desc() { + return TXT_DESC; + } + } + + public static class Health extends Buff { + + private static final float STEP = 5f; + + private int pos; + + @Override + public boolean attachTo( Char target ) { + pos = target.pos; + return super.attachTo( target ); + } + + @Override + public boolean act() { + if (target.pos != pos || target.HP >= target.HT) { + detach(); + } else { + target.HP = Math.min( target.HT, target.HP + target.HT / 10 ); + target.sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 ); + } + spend( STEP ); + return true; + } + + @Override + public int icon() { + return BuffIndicator.HEALING; + } + + @Override + public String toString() { + return "Herbal healing"; + } + + private static final String POS = "pos"; + + @Override + public void storeInBundle( Bundle bundle ) { + super.storeInBundle( bundle ); + bundle.put( POS, pos ); + } + + @Override + public void restoreFromBundle( Bundle bundle ) { + super.restoreFromBundle( bundle ); + pos = bundle.getInt( POS ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/scenes/AboutScene.java b/src/com/watabou/pixeldungeon/scenes/AboutScene.java new file mode 100644 index 0000000000..a459f72a95 --- /dev/null +++ b/src/com/watabou/pixeldungeon/scenes/AboutScene.java @@ -0,0 +1,93 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.scenes; + +import android.content.Intent; +import android.net.Uri; + +import com.watabou.input.Touchscreen.Touch; +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.noosa.TouchArea; +import com.watabou.pixeldungeon.effects.Flare; +import com.watabou.pixeldungeon.ui.Archs; +import com.watabou.pixeldungeon.ui.Icons; +import com.watabou.pixeldungeon.ui.Window; + +public class AboutScene extends PixelScene { + + private static final String TXT = + "Code & graphics: Watabou\n" + + "Music: Cube_Code\n\n" + + "This game is inspired by Brian Walker's Brogue. " + + "Try it on Windows, Mac OS or Linux - it's awesome! ;)\n\n" + + "Please visit official website for additional info:"; + + private static final String LNK = "pixeldungeon.watabou.ru"; + + @Override + public void create() { + super.create(); + + BitmapTextMultiline text = createMultiline( TXT, 8 ); + text.maxWidth = Math.min( Camera.main.width, 120 ); + text.measure(); + add( text ); + + text.x = align( (Camera.main.width - text.width()) / 2 ); + text.y = align( (Camera.main.height - text.height()) / 2 ); + + BitmapTextMultiline link = createMultiline( LNK, 8 ); + link.maxWidth = Math.min( Camera.main.width, 120 ); + link.measure(); + link.hardlight( Window.TITLE_COLOR ); + add( link ); + + link.x = text.x; + link.y = text.y + text.height(); + + TouchArea hotArea = new TouchArea( link ) { + @Override + protected void onClick( Touch touch ) { + Intent intent = new Intent( Intent.ACTION_VIEW, Uri.parse( "http://" + LNK ) ); + Game.instance.startActivity( intent ); + } + }; + add( hotArea ); + + Image wata = Icons.WATA.get(); + wata.x = align( text.x + (text.width() - wata.width) / 2 ); + wata.y = text.y - wata.height - 8; + add( wata ); + + new Flare( 7, 64 ).color( 0x112233, true ).show( wata, 0 ).angularSpeed = +20; + + Archs archs = new Archs(); + archs.setSize( Camera.main.width, Camera.main.height ); + addToBack( archs ); + + fadeIn(); + } + + @Override + protected void onBackPressed() { + Game.switchScene( TitleScene.class ); + } +} diff --git a/src/com/watabou/pixeldungeon/scenes/AmuletScene.java b/src/com/watabou/pixeldungeon/scenes/AmuletScene.java new file mode 100644 index 0000000000..2de787018e --- /dev/null +++ b/src/com/watabou/pixeldungeon/scenes/AmuletScene.java @@ -0,0 +1,133 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.scenes; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.effects.Flare; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.utils.Random; + +public class AmuletScene extends PixelScene { + + private static final String TXT_EXIT = "Let's call it a day"; + private static final String TXT_STAY = "I'm not done yet"; + + private static final int WIDTH = 120; + private static final int BTN_HEIGHT = 18; + private static final float SMALL_GAP = 2; + private static final float LARGE_GAP = 8; + + private static final String TXT = + "You finally hold it in your hands, the Amulet of Yendor. Using its power " + + "you can take over the world or bring peace and prosperity to people or whatever. " + + "Anyway, your life will change forever and this game will end here. " + + "Or you can stay a mere mortal a little longer."; + + public static boolean noText = false; + + private Image amulet; + + @Override + public void create() { + super.create(); + + BitmapTextMultiline text = null; + if (!noText) { + text = createMultiline( TXT, 8 ); + text.maxWidth = WIDTH; + text.measure(); + add( text ); + } + + amulet = new Image( Assets.AMULET ); + add( amulet ); + + RedButton btnExit = new RedButton( TXT_EXIT ) { + @Override + protected void onClick() { + Dungeon.deleteGame( Dungeon.hero.heroClass, true ); + Game.switchScene( noText ? TitleScene.class : RankingsScene.class ); + } + }; + btnExit.setSize( WIDTH, BTN_HEIGHT ); + add( btnExit ); + + RedButton btnStay = new RedButton( TXT_STAY ) { + @Override + protected void onClick() { + onBackPressed(); + } + }; + btnStay.setSize( WIDTH, BTN_HEIGHT ); + add( btnStay ); + + float height; + if (noText) { + height = amulet.height + LARGE_GAP + btnExit.height() + SMALL_GAP + btnStay.height(); + + amulet.x = align( (Camera.main.width - amulet.width) / 2 ); + amulet.y = align( (Camera.main.height - height) / 2 ); + + btnExit.setPos( (Camera.main.width - btnExit.width()) / 2, amulet.y + amulet.height + LARGE_GAP ); + btnStay.setPos( btnExit.left(), btnExit.bottom() + SMALL_GAP ); + + } else { + height = amulet.height + LARGE_GAP + text.height() + LARGE_GAP + btnExit.height() + SMALL_GAP + btnStay.height(); + + amulet.x = align( (Camera.main.width - amulet.width) / 2 ); + amulet.y = align( (Camera.main.height - height) / 2 ); + + text.x = align( (Camera.main.width - text.width()) / 2 ); + text.y = amulet.y + amulet.height + LARGE_GAP; + + btnExit.setPos( (Camera.main.width - btnExit.width()) / 2, text.y + text.height() + LARGE_GAP ); + btnStay.setPos( btnExit.left(), btnExit.bottom() + SMALL_GAP ); + } + + new Flare( 8, 48 ).color( 0xFFDDBB, true ).show( amulet, 0 ).angularSpeed = +30; + + fadeIn(); + } + + @Override + protected void onBackPressed() { + InterlevelScene.mode = InterlevelScene.Mode.CONTINUE; + Game.switchScene( InterlevelScene.class ); + } + + private float timer = 0; + + @Override + public void update() { + super.update(); + + if ((timer -= Game.elapsed) < 0) { + timer = Random.Float( 0.5f, 5f ); + + Speck star = (Speck)recycle( Speck.class ); + star.reset( 0, amulet.x + 10.5f, amulet.y + 5.5f, Speck.DISCOVER ); + add( star ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/scenes/BadgesScene.java b/src/com/watabou/pixeldungeon/scenes/BadgesScene.java new file mode 100644 index 0000000000..55579c1a65 --- /dev/null +++ b/src/com/watabou/pixeldungeon/scenes/BadgesScene.java @@ -0,0 +1,88 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.scenes; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; +import com.watabou.noosa.NinePatch; +import com.watabou.noosa.audio.Music; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Chrome; +import com.watabou.pixeldungeon.ui.Archs; +import com.watabou.pixeldungeon.ui.BadgesList; +import com.watabou.pixeldungeon.ui.ScrollPane; +import com.watabou.pixeldungeon.ui.Window; + +public class BadgesScene extends PixelScene { + + private static final String TXT_TITLE = "Your Badges"; + + @Override + public void create() { + + super.create(); + + Music.INSTANCE.play( Assets.THEME, true ); + Music.INSTANCE.volume( 1f ); + + uiCamera.visible = false; + + int w = Camera.main.width; + int h = Camera.main.height; + + Archs archs = new Archs(); + archs.setSize( w, h ); + add( archs ); + + int pw = Math.min( 160, w - 10 ); + int ph = h - 24; + + NinePatch panel = Chrome.get( Chrome.Type.WINDOW ); + panel.size( pw, ph ); + panel.x = (w - pw) / 2; + panel.y = (h - ph) / 2; + add( panel ); + + BitmapText title = PixelScene.createText( TXT_TITLE, 9 ); + title.hardlight( Window.TITLE_COLOR ); + title.measure(); + title.x = align( (w - title.width()) / 2 ); + title.y = align( (panel.y - title.baseLine()) / 2 ); + add( title ); + + Badges.loadGlobal(); + + ScrollPane list = new BadgesList( true ); + add( list ); + + list.setRect( + panel.x + panel.marginLeft(), + panel.y + panel.marginTop(), + panel.innerWidth(), + panel.innerHeight() ); + + fadeIn(); + } + + @Override + protected void onBackPressed() { + Game.switchScene( TitleScene.class ); + } +} diff --git a/src/com/watabou/pixeldungeon/scenes/CellSelector.java b/src/com/watabou/pixeldungeon/scenes/CellSelector.java new file mode 100644 index 0000000000..dbfd1d6d27 --- /dev/null +++ b/src/com/watabou/pixeldungeon/scenes/CellSelector.java @@ -0,0 +1,158 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.scenes; + +import com.watabou.input.Touchscreen.Touch; +import com.watabou.noosa.TouchArea; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.PixelDungeon; +import com.watabou.utils.GameMath; +import com.watabou.utils.PointF; + +public class CellSelector extends TouchArea { + + public Listener listener = null; + + public boolean enabled; + + private float dragThreshold; + + public CellSelector( DungeonTilemap map ) { + super( map ); + camera = map.camera(); + + dragThreshold = PixelScene.defaultZoom * DungeonTilemap.SIZE / 2; + } + + @Override + protected void onClick( Touch touch ) { + if (dragging) { + + dragging = false; + + } else { + + select( ((DungeonTilemap)target).screenToTile( + (int)touch.current.x, + (int)touch.current.y ) ); + } + } + + public void select( int cell ) { + if (enabled && listener != null && cell != -1) { + + listener.onSelect( cell ); + GameScene.ready(); + + } else { + + GameScene.cancel(); + + } + } + + private boolean pinching = false; + private Touch another; + private float startZoom; + private float startSpan; + + @Override + protected void onTouchDown( Touch t ) { + + if (t != touch && another == null) { + + if (!touch.down) { + touch = t; + onTouchDown( t ); + return; + } + + pinching = true; + + another = t; + startSpan = PointF.distance( touch.current, another.current ); + startZoom = camera.zoom; + + dragging = false; + } + } + + @Override + protected void onTouchUp( Touch t ) { + if (pinching && (t == touch || t == another)) { + + pinching = false; + + int zoom = Math.round( camera.zoom ); + camera.zoom( zoom ); + PixelDungeon.zoom( (int)(zoom - PixelScene.defaultZoom) ); + + dragging = true; + if (t == touch) { + touch = another; + } + another = null; + lastPos.set( touch.current ); + } + } + + private boolean dragging = false; + private PointF lastPos = new PointF(); + + @Override + protected void onDrag( Touch t ) { + + camera.target = null; + + if (pinching) { + + float curSpan = PointF.distance( touch.current, another.current ); + camera.zoom( GameMath.gate( + PixelScene.minZoom, + startZoom * curSpan / startSpan, + PixelScene.maxZoom ) ); + + } else { + + if (!dragging && PointF.distance( t.current, t.start ) > dragThreshold) { + + dragging = true; + lastPos.set( t.current ); + + } else if (dragging) { + camera.scroll.offset( PointF.diff( lastPos, t.current ).invScale( camera.zoom ) ); + lastPos.set( t.current ); + } + } + + } + + public void cancel() { + + if (listener != null) { + listener.onSelect( null ); + } + + GameScene.ready(); + } + + public interface Listener { + void onSelect( Integer cell ); + String prompt(); + } +} diff --git a/src/com/watabou/pixeldungeon/scenes/GameScene.java b/src/com/watabou/pixeldungeon/scenes/GameScene.java new file mode 100644 index 0000000000..d6ff401530 --- /dev/null +++ b/src/com/watabou/pixeldungeon/scenes/GameScene.java @@ -0,0 +1,618 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.scenes; + +import java.io.IOException; + +import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.SkinnedBlock; +import com.watabou.noosa.Visual; +import com.watabou.noosa.audio.Music; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.particles.Emitter; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.FogOfWar; +import com.watabou.pixeldungeon.PixelDungeon; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.effects.BannerSprites; +import com.watabou.pixeldungeon.effects.BlobEmitter; +import com.watabou.pixeldungeon.effects.EmoIcon; +import com.watabou.pixeldungeon.effects.Flare; +import com.watabou.pixeldungeon.effects.FloatingText; +import com.watabou.pixeldungeon.effects.Ripple; +import com.watabou.pixeldungeon.effects.SpellSprite; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.wands.WandOfBlink; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.RegularLevel; +import com.watabou.pixeldungeon.levels.features.Chasm; +import com.watabou.pixeldungeon.plants.Plant; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.sprites.DiscardedItemSprite; +import com.watabou.pixeldungeon.sprites.HeroSprite; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.PlantSprite; +import com.watabou.pixeldungeon.ui.AttackIndicator; +import com.watabou.pixeldungeon.ui.Banner; +import com.watabou.pixeldungeon.ui.BusyIndicator; +import com.watabou.pixeldungeon.ui.GameLog; +import com.watabou.pixeldungeon.ui.HealthIndicator; +import com.watabou.pixeldungeon.ui.QuickSlot; +import com.watabou.pixeldungeon.ui.StatusPane; +import com.watabou.pixeldungeon.ui.Toast; +import com.watabou.pixeldungeon.ui.Toolbar; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.windows.WndBag.Mode; +import com.watabou.pixeldungeon.windows.WndGame; +import com.watabou.pixeldungeon.windows.WndBag; +import com.watabou.pixeldungeon.windows.WndStory; +import com.watabou.utils.Random; + +public class GameScene extends PixelScene { + + private static final String TXT_WELCOME = "Welcome to the level %d of Pixel Dungeon!"; + private static final String TXT_WELCOME_BACK = "Welcome back to the level %d of Pixel Dungeon!"; + private static final String TXT_NIGHT_MODE = "Be cautious, since the dungeon is even more dangerous at night!"; + + private static final String TXT_CHASM = "Your steps echo across the dungeon."; + private static final String TXT_WATER = "You hear the water splashing around you."; + private static final String TXT_GRASS = "The smell of vegetation is thick in the air."; + private static final String TXT_SECRETS = "The atmosphere hints that this floor hides many secrets."; + + static GameScene scene; + + private SkinnedBlock water; + private DungeonTilemap tiles; + private FogOfWar fog; + private HeroSprite hero; + + private GameLog log; + + private BusyIndicator busy; + + private static CellSelector cellSelector; + + private Group terrain; + private Group ripples; + private Group plants; + private Group heaps; + private Group mobs; + private Group emitters; + private Group effects; + private Group gases; + private Group spells; + private Group statuses; + private Group emoicons; + + private Toolbar toolbar; + private Toast prompt; + + @Override + public void create() { + + Music.INSTANCE.play( Assets.TUNE, true ); + Music.INSTANCE.volume( 1f ); + + PixelDungeon.lastClass( Dungeon.hero.heroClass.ordinal() ); + + super.create(); + Camera.main.zoom( defaultZoom + PixelDungeon.zoom() ); + + scene = this; + + terrain = new Group(); + add( terrain ); + + water = new SkinnedBlock( + Level.WIDTH * DungeonTilemap.SIZE, + Level.HEIGHT * DungeonTilemap.SIZE, + Dungeon.level.waterTex() ); + terrain.add( water ); + + ripples = new Group(); + terrain.add( ripples ); + + tiles = new DungeonTilemap(); + terrain.add( tiles ); + + Dungeon.level.addVisuals( this ); + + plants = new Group(); + add( plants ); + + int size = Dungeon.level.plants.size(); + for (int i=0; i < size; i++) { + addPlantSprite( Dungeon.level.plants.valueAt( i ) ); + } + + heaps = new Group(); + add( heaps ); + + size = Dungeon.level.heaps.size(); + for (int i=0; i < size; i++) { + addHeapSprite( Dungeon.level.heaps.valueAt( i ) ); + } + + emitters = new Group(); + effects = new Group(); + emoicons = new Group(); + + mobs = new Group(); + add( mobs ); + + for (Mob mob : Dungeon.level.mobs) { + addMobSprite( mob ); + if (Statistics.amuletObtained) { + mob.beckon( Dungeon.hero.pos ); + } + } + + add( emitters ); + add( effects ); + + gases = new Group(); + add( gases ); + + for (Blob blob : Dungeon.level.blobs.values()) { + blob.emitter = null; + addBlobSprite( blob ); + } + + fog = new FogOfWar( Level.WIDTH, Level.HEIGHT ); + fog.updateVisibility( Dungeon.visible, Dungeon.level.visited, Dungeon.level.mapped ); + add( fog ); + + brightness( PixelDungeon.brightness() ); + + spells = new Group(); + add( spells ); + + statuses = new Group(); + add( statuses ); + + add( emoicons ); + + hero = new HeroSprite(); + hero.place( Dungeon.hero.pos ); + hero.updateArmor(); + mobs.add( hero ); + + + add( new HealthIndicator() ); + + add( cellSelector = new CellSelector( tiles ) ); + + StatusPane sb = new StatusPane(); + sb.camera = uiCamera; + sb.setSize( uiCamera.width, 0 ); + add( sb ); + + toolbar = new Toolbar(); + toolbar.camera = uiCamera; + toolbar.setRect( 0,uiCamera.height - toolbar.height(), uiCamera.width, toolbar.height() ); + add( toolbar ); + + AttackIndicator attack = new AttackIndicator(); + attack.camera = uiCamera; + attack.setPos( + uiCamera.width - attack.width(), + toolbar.top() - attack.height() ); + add( attack ); + + log = new GameLog(); + log.camera = uiCamera; + log.setRect( 0, toolbar.top(), attack.left(), 0 ); + add( log ); + + if (Dungeon.depth < Statistics.deepestFloor) { + GLog.i( TXT_WELCOME_BACK, Dungeon.depth ); + } else { + GLog.i( TXT_WELCOME, Dungeon.depth ); + Sample.INSTANCE.play( Assets.SND_DESCEND ); + } + switch (Dungeon.level.feeling) { + case CHASM: + GLog.w( TXT_CHASM ); + break; + case WATER: + GLog.w( TXT_WATER ); + break; + case GRASS: + GLog.w( TXT_GRASS ); + break; + default: + } + if (Dungeon.level instanceof RegularLevel && + ((RegularLevel)Dungeon.level).secretDoors > Random.IntRange( 3, 4 )) { + GLog.w( TXT_SECRETS ); + } + if (Dungeon.nightMode && !Dungeon.bossLevel()) { + GLog.w( TXT_NIGHT_MODE ); + } + + busy = new BusyIndicator(); + busy.camera = uiCamera; + busy.x = 1; + busy.y = sb.bottom() + 1; + add( busy ); + + switch (InterlevelScene.mode) { + case RESURRECT: + WandOfBlink.appear( Dungeon.hero, Dungeon.level.entrance ); + new Flare( 8, 32 ).color( 0xFFFF66, true ).show( hero, 2f ) ; + break; + case RETURN: + WandOfBlink.appear( Dungeon.hero, Dungeon.hero.pos ); + break; + case FALL: + Chasm.heroLand(); + break; + case DESCEND: + switch (Dungeon.depth) { + case 1: + WndStory.showChapter( WndStory.ID_SEWERS ); + break; + case 6: + WndStory.showChapter( WndStory.ID_PRISON ); + break; + case 11: + WndStory.showChapter( WndStory.ID_CAVES ); + break; + case 16: + WndStory.showChapter( WndStory.ID_METROPOLIS ); + break; + case 22: + WndStory.showChapter( WndStory.ID_HALLS ); + break; + } + if (Dungeon.hero.isAlive() && Dungeon.depth != 22) { + Badges.validateNoKilling(); + } + break; + default: + } + + Camera.main.target = hero; + fadeIn(); + } + + public void destroy() { + + scene = null; + Badges.saveGlobal(); + + super.destroy(); + } + + @Override + public synchronized void pause() { + try { + Dungeon.saveAll(); + Badges.saveGlobal(); + } catch (IOException e) { + // + } + } + + @Override + public synchronized void update() { + if (Dungeon.hero == null) { + return; + } + + super.update(); + + water.offset( 0, -5 * Game.elapsed ); + + Actor.process(); + + if (Dungeon.hero.ready && !Dungeon.hero.paralysed) { + log.newLine(); + } + + cellSelector.enabled = Dungeon.hero.ready; + } + + @Override + protected void onBackPressed() { + if (!cancel()) { + add( new WndGame() ); + } + } + + @Override + protected void onMenuPressed() { + if (Dungeon.hero.ready) { + selectItem( null, WndBag.Mode.ALL, null ); + } + } + + public void brightness( boolean value ) { + water.rm = water.gm = water.bm = + tiles.rm = tiles.gm = tiles.bm = + value ? 1.5f : 1.0f; + if (value) { + fog.am = +2f; + fog.aa = -1f; + } else { + fog.am = +1f; + fog.aa = 0f; + } + } + + private void addHeapSprite( Heap heap ) { + ItemSprite sprite = heap.sprite = (ItemSprite)heaps.recycle( ItemSprite.class ); + sprite.revive(); + sprite.link( heap ); + heaps.add( sprite ); + } + + private void addDiscardedSprite( Heap heap ) { + heap.sprite = (DiscardedItemSprite)heaps.recycle( DiscardedItemSprite.class ); + heap.sprite.revive(); + heap.sprite.link( heap ); + heaps.add( heap.sprite ); + } + + private void addPlantSprite( Plant plant ) { + (plant.sprite = (PlantSprite)plants.recycle( PlantSprite.class )).reset( plant ); + } + + private void addBlobSprite( final Blob gas ) { + if (gas.emitter == null) { + gases.add( new BlobEmitter( gas ) ); + } + } + + private void addMobSprite( Mob mob ) { + CharSprite sprite = mob.sprite(); + sprite.visible = Dungeon.visible[mob.pos]; + mobs.add( sprite ); + sprite.link( mob ); + } + + private void prompt( String text ) { + + if (prompt != null) { + prompt.killAndErase(); + prompt = null; + } + + if (text != null) { + prompt = new Toast( text ) { + @Override + protected void onClose() { + cancel(); + } + }; + prompt.camera = uiCamera; + prompt.setPos( (uiCamera.width - prompt.width()) / 2, uiCamera.height - 60 ); + add( prompt ); + } + } + + private void showBanner( Banner banner ) { + banner.camera = uiCamera; + banner.x = align( uiCamera, (uiCamera.width - banner.width) / 2 ); + banner.y = align( uiCamera, (uiCamera.height - banner.height) / 3 ); + add( banner ); + } + + // ------------------------------------------------------- + + public static void add( Plant plant ) { + if (scene != null) { + scene.addPlantSprite( plant ); + } + } + + public static void add( Blob gas ) { + Actor.add( gas ); + if (scene != null) { + scene.addBlobSprite( gas ); + } + } + + public static void add( Heap heap ) { + if (scene != null) { + scene.addHeapSprite( heap ); + } + } + + public static void discard( Heap heap ) { + if (scene != null) { + scene.addDiscardedSprite( heap ); + } + } + + public static void add( Mob mob ) { + Dungeon.level.mobs.add( mob ); + Actor.add( mob ); + Actor.occupyCell( mob ); + scene.addMobSprite( mob ); + } + + public static void add( Mob mob, float delay ) { + Dungeon.level.mobs.add( mob ); + Actor.addDelayed( mob, delay ); + Actor.occupyCell( mob ); + scene.addMobSprite( mob ); + } + + public static void add( EmoIcon icon ) { + scene.emoicons.add( icon ); + } + + public static void effect( Visual effect ) { + scene.effects.add( effect ); + } + + public static Ripple ripple( int pos ) { + Ripple ripple = (Ripple)scene.ripples.recycle( Ripple.class ); + ripple.reset( pos ); + return ripple; + } + + public static SpellSprite spellSprite() { + return (SpellSprite)scene.spells.recycle( SpellSprite.class ); + } + + public static Emitter emitter() { + if (scene != null) { + Emitter emitter = (Emitter)scene.emitters.recycle( Emitter.class ); + emitter.revive(); + return emitter; + } else { + return null; + } + } + + public static FloatingText status() { + return scene != null ? (FloatingText)scene.statuses.recycle( FloatingText.class ) : null; + } + + public static void pickUp( Item item ) { + scene.toolbar.pickup( item ); + } + + public static void updateMap() { + if (scene != null) { + scene.tiles.updated.set( 0, 0, Level.WIDTH, Level.HEIGHT ); + } + } + + public static void updateMap( int cell ) { + if (scene != null) { + scene.tiles.updated.union( cell % Level.WIDTH, cell / Level.WIDTH ); + } + } + + public static void discoverTile( int pos, int oldValue ) { + if (scene != null) { + scene.tiles.discover( pos, oldValue ); + } + } + + public static void show( Window wnd ) { + cancelCellSelector(); + scene.add( wnd ); + } + + public static void afterObserve() { + if (scene != null) { + scene.fog.updateVisibility( Dungeon.visible, Dungeon.level.visited, Dungeon.level.mapped ); + + for (Mob mob : Dungeon.level.mobs) { + mob.sprite.visible = Dungeon.visible[mob.pos]; + } + } + } + + public static void flash( int color ) { + scene.fadeIn( 0xFF000000 | color, true ); + } + + public static void gameOver() { + Banner gameOver = new Banner( BannerSprites.get( BannerSprites.Type.GAME_OVER ) ); + gameOver.show( 0x000000, 1f ); + scene.showBanner( gameOver ); + + Sample.INSTANCE.play( Assets.SND_DEATH ); + } + + public static void bossSlain() { + if (Dungeon.hero.isAlive()) { + Banner bossSlain = new Banner( BannerSprites.get( BannerSprites.Type.BOSS_SLAIN ) ); + bossSlain.show( 0xFFFFFF, 0.3f, 5f ); + scene.showBanner( bossSlain ); + + Sample.INSTANCE.play( Assets.SND_BOSS ); + } + } + + public static void handleCell( int cell ) { + cellSelector.select( cell ); + } + + public static void selectCell( CellSelector.Listener listener ) { + cellSelector.listener = listener; + scene.prompt( listener.prompt() ); + } + + private static boolean cancelCellSelector() { + if (cellSelector.listener != null && cellSelector.listener != defaultCellListener) { + cellSelector.cancel(); + return true; + } else { + return false; + } + } + + public static WndBag selectItem( WndBag.Listener listener, WndBag.Mode mode, String title ) { + cancelCellSelector(); + + WndBag wnd = mode == Mode.SEED ? + WndBag.seedPouch( listener, mode, title ) : + WndBag.lastBag( listener, mode, title ); + scene.add( wnd ); + + return wnd; + } + + static boolean cancel() { + if (Dungeon.hero.curAction != null || Dungeon.hero.restoreHealth) { + + Dungeon.hero.curAction = null; + Dungeon.hero.restoreHealth = false; + return true; + + } else { + + return cancelCellSelector(); + + } + } + + public static void ready() { + selectCell( defaultCellListener ); + QuickSlot.cancel(); + } + + private static final CellSelector.Listener defaultCellListener = new CellSelector.Listener() { + @Override + public void onSelect( Integer cell ) { + if (cell != -1) { + Dungeon.hero.handle( cell ); + } + } + @Override + public String prompt() { + return null; + } + }; +} diff --git a/src/com/watabou/pixeldungeon/scenes/InterlevelScene.java b/src/com/watabou/pixeldungeon/scenes/InterlevelScene.java new file mode 100644 index 0000000000..091470ae58 --- /dev/null +++ b/src/com/watabou/pixeldungeon/scenes/InterlevelScene.java @@ -0,0 +1,335 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.scenes; + +import java.io.FileNotFoundException; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; +import com.watabou.noosa.audio.Music; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.items.Generator; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.windows.WndError; +import com.watabou.pixeldungeon.windows.WndStory; + +public class InterlevelScene extends PixelScene { + + private static final float TIME_TO_FADE = 0.3f; + + private static final String TXT_DESCENDING = "Descending..."; + private static final String TXT_ASCENDING = "Ascending..."; + private static final String TXT_LOADING = "Loading..."; + private static final String TXT_RESURRECTING= "Resurrecting..."; + private static final String TXT_RETURNING = "Returning..."; + private static final String TXT_FALLING = "Falling..."; + + private static final String ERR_FILE_NOT_FOUND = "File not found. For some reason."; + private static final String ERR_GENERIC = "Something went wrong..." ; + + public static enum Mode { + DESCEND, ASCEND, CONTINUE, RESURRECT, RETURN, FALL + }; + public static Mode mode; + + public static int returnDepth; + public static int returnPos; + + public static boolean noStory = false; + + public static boolean fallIntoPit; + + private enum Phase { + FADE_IN, STATIC, FADE_OUT + }; + private Phase phase; + private float timeLeft; + + private BitmapText message; + + private Thread thread; + private String error = null; + + @Override + public void create() { + super.create(); + + String text = ""; + switch (mode) { + case DESCEND: + text = TXT_DESCENDING; + break; + case ASCEND: + text = TXT_ASCENDING; + break; + case CONTINUE: + text = TXT_LOADING; + break; + case RESURRECT: + text = TXT_RESURRECTING; + break; + case RETURN: + text = TXT_RETURNING; + break; + case FALL: + text = TXT_FALLING; + break; + } + + message = PixelScene.createText( text, 9 ); + message.measure(); + message.x = (Camera.main.width - message.width()) / 2; + message.y = (Camera.main.height - message.height()) / 2; + add( message ); + + phase = Phase.FADE_IN; + timeLeft = TIME_TO_FADE; + + thread = new Thread() { + @Override + public void run() { + + try { + + Generator.reset(); + + Sample.INSTANCE.load( + Assets.SND_OPEN, + Assets.SND_UNLOCK, + Assets.SND_ITEM, + Assets.SND_DEWDROP, + Assets.SND_HIT, + Assets.SND_MISS, + Assets.SND_STEP, + Assets.SND_WATER, + Assets.SND_DESCEND, + Assets.SND_EAT, + Assets.SND_READ, + Assets.SND_LULLABY, + Assets.SND_DRINK, + Assets.SND_SHATTER, + Assets.SND_ZAP, + Assets.SND_LIGHTNING, + Assets.SND_LEVELUP, + Assets.SND_DEATH, + Assets.SND_CHALLENGE, + Assets.SND_CURSED, + Assets.SND_EVOKE, + Assets.SND_TRAP, + Assets.SND_TOMB, + Assets.SND_ALERT, + Assets.SND_MELD, + Assets.SND_BOSS, + Assets.SND_BLAST, + Assets.SND_PLANT, + Assets.SND_RAY, + Assets.SND_BEACON, + Assets.SND_TELEPORT, + Assets.SND_CHARMS, + Assets.SND_MASTERY, + Assets.SND_PUFF, + Assets.SND_ROCKS, + Assets.SND_BURNING, + Assets.SND_FALLING, + Assets.SND_GHOST, + Assets.SND_SECRET, + Assets.SND_BONES ); + + switch (mode) { + case DESCEND: + descend(); + break; + case ASCEND: + ascend(); + break; + case CONTINUE: + restore(); + break; + case RESURRECT: + resurrect(); + break; + case RETURN: + returnTo(); + break; + case FALL: + fall(); + break; + } + + if ((Dungeon.depth % 5) == 0) { + Sample.INSTANCE.load( Assets.SND_BOSS ); + } + + } catch (FileNotFoundException e) { + + error = ERR_FILE_NOT_FOUND; + + } catch (Exception e ) { + + error = ERR_GENERIC; + + } + + if (phase == Phase.STATIC && error == null) { + phase = Phase.FADE_OUT; + timeLeft = TIME_TO_FADE; + } + } + }; + thread.start(); + } + + @Override + public void update() { + super.update(); + + float p = timeLeft / TIME_TO_FADE; + + switch (phase) { + + case FADE_IN: + message.alpha( 1 - p ); + if ((timeLeft -= Game.elapsed) <= 0) { + if (!thread.isAlive() && error == null) { + phase = Phase.FADE_OUT; + timeLeft = TIME_TO_FADE; + } else { + phase = Phase.STATIC; + } + } + break; + + case FADE_OUT: + message.alpha( p ); + + if (mode == Mode.CONTINUE || (mode == Mode.DESCEND && Dungeon.depth == 1)) { + Music.INSTANCE.volume( p ); + } + if ((timeLeft -= Game.elapsed) <= 0) { + Game.switchScene( GameScene.class ); + } + break; + + case STATIC: + if (error != null) { + add( new WndError( error ) { + public void onBackPressed() { + super.onBackPressed(); + Game.switchScene( StartScene.class ); + }; + } ); + } + break; + } + } + + private void descend() throws Exception { + + Actor.fixTime(); + if (Dungeon.hero == null) { + Dungeon.init(); + if (noStory) { + Dungeon.chapters.add( WndStory.ID_SEWERS ); + noStory = false; + } + } else { + Dungeon.saveLevel(); + } + + Level level; + if (Dungeon.depth >= Statistics.deepestFloor) { + level = Dungeon.newLevel(); + } else { + Dungeon.depth++; + level = Dungeon.loadLevel( Dungeon.hero.heroClass ); + } + Dungeon.switchLevel( level, level.entrance ); + } + + private void fall() throws Exception { + + Actor.fixTime(); + Dungeon.saveLevel(); + + Level level; + if (Dungeon.depth >= Statistics.deepestFloor) { + level = Dungeon.newLevel(); + } else { + Dungeon.depth++; + level = Dungeon.loadLevel( Dungeon.hero.heroClass ); + } + Dungeon.switchLevel( level, fallIntoPit ? level.pitCell() : level.randomRespawnCell() ); + } + + private void ascend() throws Exception { + Actor.fixTime(); + + Dungeon.saveLevel(); + Dungeon.depth--; + Level level = Dungeon.loadLevel( Dungeon.hero.heroClass ); + Dungeon.switchLevel( level, level.exit ); + } + + private void returnTo() throws Exception { + + Actor.fixTime(); + + Dungeon.saveLevel(); + Dungeon.depth = returnDepth; + Level level = Dungeon.loadLevel( Dungeon.hero.heroClass ); + Dungeon.switchLevel( level, Level.resizingNeeded ? level.adjustPos( returnPos ) : returnPos ); + } + + private void restore() throws Exception { + + Actor.fixTime(); + + Dungeon.loadGame( StartScene.curClass ); + if (Dungeon.depth == -1) { + Dungeon.depth = Statistics.deepestFloor; + Dungeon.switchLevel( Dungeon.loadLevel( StartScene.curClass ), -1 ); + } else { + Level level = Dungeon.loadLevel( StartScene.curClass ); + Dungeon.switchLevel( level, Level.resizingNeeded ? level.adjustPos( Dungeon.hero.pos ) : Dungeon.hero.pos ); + } + } + + private void resurrect() throws Exception { + + Actor.fixTime(); + + if (Dungeon.bossLevel()) { + Dungeon.hero.resurrect( Dungeon.depth ); + Dungeon.depth--; + Level level = Dungeon.newLevel(/* true */); + Dungeon.switchLevel( level, level.entrance ); + } else { + Dungeon.hero.resurrect( -1 ); + Dungeon.resetLevel(); + } + } + + @Override + protected void onBackPressed() { + } +} diff --git a/src/com/watabou/pixeldungeon/scenes/IntroScene.java b/src/com/watabou/pixeldungeon/scenes/IntroScene.java new file mode 100644 index 0000000000..a28d32ec07 --- /dev/null +++ b/src/com/watabou/pixeldungeon/scenes/IntroScene.java @@ -0,0 +1,47 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.scenes; + +import com.watabou.noosa.Game; +import com.watabou.pixeldungeon.windows.WndStory; + +public class IntroScene extends PixelScene { + + private static final String TEXT = + "Many heroes of all kinds ventured into the Dungeon before you. Some of them have returned with treasures and magical " + + "artifacts, most have never been heard of since. But none have succeeded in retrieving the Amulet of Yendor, " + + "which is told to be hidden in the depths of the Dungeon.\n\n" + + "" + + "You consider yourself ready for the challenge, but most importantly, you feel that fortune smiles on you. " + + "It's time to start your own adventure!"; + + @Override + public void create() { + super.create(); + + add( new WndStory( TEXT ) { + @Override + public void hide() { + super.hide(); + Game.switchScene( InterlevelScene.class ); + } + } ); + + fadeIn(); + } +} diff --git a/src/com/watabou/pixeldungeon/scenes/PixelScene.java b/src/com/watabou/pixeldungeon/scenes/PixelScene.java new file mode 100644 index 0000000000..898c49dbb8 --- /dev/null +++ b/src/com/watabou/pixeldungeon/scenes/PixelScene.java @@ -0,0 +1,325 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.scenes; + +import javax.microedition.khronos.opengles.GL10; + +import android.opengl.GLES20; + +import com.watabou.input.Touchscreen; +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.BitmapText.Font; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.Camera; +import com.watabou.noosa.ColorBlock; +import com.watabou.noosa.Game; +import com.watabou.noosa.Scene; +import com.watabou.noosa.Visual; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.PixelDungeon; +import com.watabou.pixeldungeon.effects.BadgeBanner; +import com.watabou.utils.BitmapCache; + +public class PixelScene extends Scene { + + public static final float MIN_WIDTH = 128; + public static final float MIN_HEIGHT = 224; + + public static float defaultZoom = 0; + public static float minZoom; + public static float maxZoom; + + public static boolean landscapeAvailable; + + public static Camera uiCamera; + + public static BitmapText.Font font1x; + public static BitmapText.Font font15x; + public static BitmapText.Font font2x; + public static BitmapText.Font font25x; + public static BitmapText.Font font3x; + + @Override + public void create() { + + super.create(); + + GameScene.scene = null; + + defaultZoom = (int)Math.ceil( Game.density * 2.5 ); + while (( + Game.width / defaultZoom < MIN_WIDTH || + Game.height / defaultZoom < MIN_HEIGHT + ) && defaultZoom > 1) { + + defaultZoom--; + } + + landscapeAvailable = + Game.height / defaultZoom >= MIN_WIDTH && + Game.width / defaultZoom >= MIN_HEIGHT; + + if (PixelDungeon.scaleUp()) { + while ((Game.width / (defaultZoom + 1) >= MIN_WIDTH && Game.height / (defaultZoom + 1) >= MIN_HEIGHT)) { + defaultZoom++; + } + } + minZoom = 1; + maxZoom = defaultZoom * 2; + + + Camera.reset( new PixelCamera( defaultZoom ) ); + + float uiZoom = defaultZoom; + uiCamera = Camera.createFullscreen( uiZoom ); + Camera.add( uiCamera ); + + if (font1x == null) { + + // 3x5 (6) + font1x = Font.colorMarked( + BitmapCache.get( Assets.FONTS1X ), 0x00000000, BitmapText.Font.LATIN_FULL ); + font1x.baseLine = 6; + font1x.tracking = -1; + + // 5x8 (10) + font15x = Font.colorMarked( + BitmapCache.get( Assets.FONTS15X ), 12, 0x00000000, BitmapText.Font.LATIN_FULL ); + font15x.baseLine = 9; + font15x.tracking = -1; + + // 6x10 (12) + font2x = Font.colorMarked( + BitmapCache.get( Assets.FONTS2X ), 14, 0x00000000, BitmapText.Font.LATIN_FULL ); + font2x.baseLine = 11; + font2x.tracking = -1; + + // 7x12 (15) + font25x = Font.colorMarked( + BitmapCache.get( Assets.FONTS25X ), 17, 0x00000000, BitmapText.Font.LATIN_FULL ); + font25x.baseLine = 13; + font25x.tracking = -1; + + // 9x15 (18) + font3x = Font.colorMarked( + BitmapCache.get( Assets.FONTS3X ), 22, 0x00000000, BitmapText.Font.LATIN_FULL ); + font3x.baseLine = 17; + font3x.tracking = -2; + } + + Sample.INSTANCE.load( + Assets.SND_CLICK, + Assets.SND_BADGE, + Assets.SND_GOLD ); + } + + @Override + public void destroy() { + super.destroy(); + Touchscreen.event.removeAll(); + } + + public static BitmapText.Font font; + public static float scale; + + public static void chooseFont( float size ) { + + float pt = size * defaultZoom; + + if (pt >= 19) { + + scale = pt / 19; + if (1.5 <= scale && scale < 2) { + font = font25x; + scale = (int)(pt / 14); + } else { + font = font3x; + scale = (int)scale; + } + + } else if (pt >= 14) { + + scale = pt / 14; + if (1.8 <= scale && scale < 2) { + font = font2x; + scale = (int)(pt / 12); + } else { + font = font25x; + scale = (int)scale; + } + + } else if (pt >= 12) { + + scale = pt / 12; + if (1.7 <= scale && scale < 2) { + font = font15x; + scale = (int)(pt / 10); + } else { + font = font2x; + scale = (int)scale; + } + + } else if (pt >= 10) { + + scale = pt / 10; + if (1.4 <= scale && scale < 2) { + font = font1x; + scale = (int)(pt / 7); + } else { + font = font15x; + scale = (int)scale; + } + + } else { + + font = font1x; + scale = Math.max( 1, (int)(pt / 7) ); + + } + + scale /= defaultZoom; + } + + public static BitmapText createText( float size ) { + return createText( null, size ); + } + + public static BitmapText createText( String text, float size ) { + + chooseFont( size ); + + BitmapText result = new BitmapText( text, font ); + result.scale.set( scale ); + + return result; + } + + public static BitmapTextMultiline createMultiline( float size ) { + return createMultiline( null, size ); + } + + public static BitmapTextMultiline createMultiline( String text, float size ) { + + chooseFont( size ); + + BitmapTextMultiline result = new BitmapTextMultiline( text, font ); + result.scale.set( scale ); + + return result; + } + + public static float align( Camera camera, float pos ) { + return ((int)(pos * camera.zoom)) / camera.zoom; + } + + public static float align( float pos ) { + return ((int)(pos * defaultZoom)) / defaultZoom; + } + + public static void align( Visual v ) { + Camera c = v.camera(); + v.x = align( c, v.x ); + v.y = align( c, v.y ); + } + + protected void fadeIn() { + fadeIn( 0xFF000000, false ); + } + + protected void fadeIn( int color, boolean light ) { + add( new Fader( color, light ) ); + } + + public static void showBadge( Badges.Badge badge ) { + BadgeBanner banner = BadgeBanner.show( badge.image ); + banner.camera = uiCamera; + banner.x = align( banner.camera, (banner.camera.width - banner.width) / 2 ); + banner.y = align( banner.camera, (banner.camera.height - banner.height) / 3 ); + Game.scene().add( banner ); + } + + protected static class Fader extends ColorBlock { + + private static float FADE_TIME = 1f; + + private boolean light; + + private float time; + + public Fader( int color, boolean light ) { + super( uiCamera.width, uiCamera.height, color ); + + this.light = light; + + camera = uiCamera; + + alpha( 1f ); + time = FADE_TIME; + } + + @Override + public void update() { + + super.update(); + + if ((time -= Game.elapsed) <= 0) { + alpha( 0f ); + parent.remove( this ); + } else { + alpha( time / FADE_TIME ); + } + } + + @Override + public void draw() { + if (light) { + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE ); + super.draw(); + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); + } else { + super.draw(); + } + } + } + + private static class PixelCamera extends Camera { + + public PixelCamera( float zoom ) { + super( + (int)(Game.width - Math.ceil( Game.width / zoom ) * zoom) / 2, + (int)(Game.height - Math.ceil( Game.height / zoom ) * zoom) / 2, + (int)Math.ceil( Game.width / zoom ), + (int)Math.ceil( Game.height / zoom ), zoom ); + } + + @Override + protected void updateMatrix() { + float sx = align( this, scroll.x + shakeX ); + float sy = align( this, scroll.y + shakeY ); + + matrix[0] = +zoom * invW2; + matrix[5] = -zoom * invH2; + + matrix[12] = -1 + x * invW2 - sx * matrix[0]; + matrix[13] = +1 - y * invH2 - sy * matrix[5]; + + } + } +} diff --git a/src/com/watabou/pixeldungeon/scenes/RankingsScene.java b/src/com/watabou/pixeldungeon/scenes/RankingsScene.java new file mode 100644 index 0000000000..36f9d04460 --- /dev/null +++ b/src/com/watabou/pixeldungeon/scenes/RankingsScene.java @@ -0,0 +1,219 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.scenes; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.noosa.audio.Music; +import com.watabou.noosa.ui.Button; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Rankings; +import com.watabou.pixeldungeon.effects.Flare; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.ui.Archs; +import com.watabou.pixeldungeon.ui.Icons; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.pixeldungeon.windows.WndError; +import com.watabou.pixeldungeon.windows.WndRanking; + +public class RankingsScene extends PixelScene { + + private static final String TXT_TITLE = "Top Rankings"; + private static final String TXT_TOTAL = "Total games played: %d"; + private static final String TXT_NO_GAMES = "No games have been played yet."; + + private static final String TXT_NO_INFO = "No additional information"; + + private static final float ROW_HEIGHT = 30; + private static final float GAP = 4; + + private Archs archs; + + @Override + public void create() { + + super.create(); + + Music.INSTANCE.play( Assets.THEME, true ); + Music.INSTANCE.volume( 1f ); + + uiCamera.visible = false; + + int w = Camera.main.width; + int h = Camera.main.height; + + archs = new Archs(); + archs.setSize( w, h ); + add( archs ); + + Rankings.INSTANCE.load(); + + if (Rankings.INSTANCE.records.size() > 0) { + + float left = (w - Math.min( 160, w )) / 2 + GAP; + float top = align( (h - ROW_HEIGHT * Rankings.INSTANCE.records.size()) / 2 ); + + BitmapText title = PixelScene.createText( TXT_TITLE, 9 ); + title.hardlight( Window.TITLE_COLOR ); + title.measure(); + title.x = align( (w - title.width()) / 2 ); + title.y = align( top - title.height() - GAP ); + add( title ); + + int pos = 0; + + for (Rankings.Record rec : Rankings.INSTANCE.records) { + Record row = new Record( pos, pos == Rankings.INSTANCE.lastRecord, rec ); + row.setRect( left, top + pos * ROW_HEIGHT, w - left * 2, ROW_HEIGHT ); + add( row ); + + pos++; + } + + if (Rankings.INSTANCE.totalNumber >= Rankings.TABLE_SIZE) { + BitmapText total = PixelScene.createText( Utils.format( TXT_TOTAL, Rankings.INSTANCE.totalNumber ), 8 ); + total.hardlight( Window.TITLE_COLOR ); + total.measure(); + total.x = align( (w - total.width()) / 2 ); + total.y = align( top + pos * ROW_HEIGHT + GAP ); + add( total ); + } + + } else { + + BitmapText title = PixelScene.createText( TXT_NO_GAMES, 8 ); + title.hardlight( Window.TITLE_COLOR ); + title.measure(); + title.x = align( (w - title.width()) / 2 ); + title.y = align( (h - title.height()) / 2 ); + add( title ); + + } + + fadeIn(); + } + + @Override + protected void onBackPressed() { + Game.switchScene( TitleScene.class ); + } + + public static class Record extends Button { + + private static final float GAP = 4; + + private static final int TEXT_WIN = 0xFFFF88; + private static final int TEXT_LOSE = 0xCCCCCC; + private static final int FLARE_WIN = 0x888866; + private static final int FLARE_LOSE = 0x666666; + + private Rankings.Record rec; + + private ItemSprite shield; + private Flare flare; + private BitmapText position; + private BitmapTextMultiline desc; + private Image classIcon; + + public Record( int pos, boolean latest, Rankings.Record rec ) { + super(); + + this.rec = rec; + + if (latest) { + flare = new Flare( 6, 24 ); + flare.angularSpeed = 90; + flare.color( rec.win ? FLARE_WIN : FLARE_LOSE ); + addToBack( flare ); + } + + position.text( Integer.toString( pos+1 ) ); + position.measure(); + + desc.text( rec.info ); + desc.measure(); + + if (rec.win) { + shield.view( ItemSpriteSheet.AMULET, null ); + position.hardlight( TEXT_WIN ); + desc.hardlight( TEXT_WIN ); + } else { + position.hardlight( TEXT_LOSE ); + desc.hardlight( TEXT_LOSE ); + } + + classIcon.copy( Icons.get( rec.heroClass ) ); + } + + @Override + protected void createChildren() { + + super.createChildren(); + + shield = new ItemSprite( ItemSpriteSheet.TOMB, null ); + add( shield ); + + position = new BitmapText( PixelScene.font1x ); + add( position ); + + desc = createMultiline( 9 ); + add( desc ); + + classIcon = new Image(); + add( classIcon ); + } + + @Override + protected void layout() { + + super.layout(); + + shield.x = x; + shield.y = y + (height - shield.height) / 2; + + position.x = align( shield.x + (shield.width - position.width()) / 2 ); + position.y = align( shield.y + (shield.height - position.height()) / 2 + 1 ); + + if (flare != null) { + flare.point( shield.center() ); + } + + classIcon.x = align( x + width - classIcon.width ); + classIcon.y = shield.y; + + desc.x = shield.x + shield.width + GAP; + desc.maxWidth = (int)(classIcon.x - desc.x); + desc.measure(); + desc.y = position.y + position.baseLine() - desc.baseLine(); + } + + @Override + protected void onClick() { + if (rec.gameFile.length() > 0) { + parent.add( new WndRanking( rec.gameFile ) ); + } else { + parent.add( new WndError( TXT_NO_INFO ) ); + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/scenes/StartScene.java b/src/com/watabou/pixeldungeon/scenes/StartScene.java new file mode 100644 index 0000000000..8bd55f37c5 --- /dev/null +++ b/src/com/watabou/pixeldungeon/scenes/StartScene.java @@ -0,0 +1,510 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.scenes; + +import java.util.HashMap; + +import com.watabou.input.Touchscreen; +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.Image; +import com.watabou.noosa.NinePatch; +import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.TouchArea; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.ui.Button; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Chrome; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.GamesInProgress; +import com.watabou.pixeldungeon.PixelDungeon; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.actors.hero.HeroSubClass; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.ui.Archs; +import com.watabou.pixeldungeon.ui.Icons; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.ui.SimpleButton; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.pixeldungeon.windows.WndList; +import com.watabou.pixeldungeon.windows.WndOptions; +import com.watabou.pixeldungeon.windows.WndTitledMessage; + +public class StartScene extends PixelScene { + + private static final float BUTTON_HEIGHT = 24; + private static final float GAP = 2; + + private static final String TXT_TITLE = "Select Your Hero"; + + private static final String TXT_LOAD = "Load Game"; + private static final String TXT_NEW = "New Game"; + + private static final String TXT_ERASE = "Erase current game"; + private static final String TXT_DPTH_LVL = "Depth: %d, level: %d"; + + private static final String TXT_REALLY = "Do you really want to start new game?"; + private static final String TXT_WARNING = "Your current game progress will be erased."; + private static final String TXT_YES = "Yes, start new game"; + private static final String TXT_NO = "No, return to main menu"; + + private static final String TXT_UNLOCK = "To unlock this character class, slay the 3rd boss with any other class"; + + private float width; + private float height; + private float top; + private float left; + + private static HashMap gems = new HashMap(); + + private Avatar avatar; + private NinePatch frame; + private BitmapText className; + + private SimpleButton btnMastery; + + private GameButton btnLoad; + private GameButton btnNewGame; + + private boolean huntressUnlocked; + private Group unlock; + + public static HeroClass curClass; + + @Override + public void create() { + + super.create(); + + Badges.loadGlobal(); + + uiCamera.visible = false; + + int w = Camera.main.width; + int h = Camera.main.height; + + width = 128; + height = 220; + left = (w - width) / 2; + top = (h - height) / 2; + + Archs archs = new Archs(); + archs.setSize( w, h ); + add( archs ); + + BitmapText title = PixelScene.createText( TXT_TITLE, 9 ); + title.hardlight( Window.TITLE_COLOR ); + title.measure(); + title.x = align( (w - title.width()) / 2 ); + title.y = align( top ); + add( title ); + + float pos = title.y + title.height() + GAP; + + GemButton btns[] = { + new GemButton( HeroClass.WARRIOR ), + new GemButton( HeroClass.MAGE ), + new GemButton( HeroClass.ROGUE ), + new GemButton( HeroClass.HUNTRESS ) }; + + float space = width; + for (GemButton btn : btns) { + space -= btn.width(); + } + + float p = 0; + for (GemButton btn : btns) { + add( btn ); + btn.setPos( align( left + p ), align( pos ) ); + p += btn.width() + space / 3; + } + + + frame = Chrome.get( Chrome.Type.TOAST_TR ); + add( frame ); + + btnNewGame = new GameButton( TXT_NEW ) { + @Override + protected void onClick() { + if (GamesInProgress.check( curClass ) != null) { + StartScene.this.add( new WndOptions( TXT_REALLY, TXT_WARNING, TXT_YES, TXT_NO ) { + @Override + protected void onSelect( int index ) { + if (index == 0) { + startNewGame(); + } + } + } ); + + } else { + startNewGame(); + } + } + }; + add( btnNewGame ); + + btnLoad = new GameButton( TXT_LOAD ) { + @Override + protected void onClick() { + InterlevelScene.mode = InterlevelScene.Mode.CONTINUE; + Game.switchScene( InterlevelScene.class ); + } + }; + add( btnLoad ); + + frame.size( width, BUTTON_HEIGHT + frame.marginVer() ); + frame.x = align( left ); + frame.y = align( h - top - frame.height() ); + + avatar = new Avatar(); + + NinePatch avFrame = Chrome.get( Chrome.Type.TOAST_TR ); + avFrame.size( avatar.width() * 1.6f, avatar.height() * 1.6f ); + avFrame.x = align( (w - avFrame.width()) / 2 ); + avFrame.y = align( (frame.y + btns[0].bottom() - avFrame.height()) / 2 ); + add( avFrame ); + + className = PixelScene.createText( "Placeholder", 9 ); + className.measure(); + className.y = align( avFrame.y + avFrame.innerBottom() - className.height() ); + add( className ); + + avatar.point( avFrame.center() ); + avatar.camera = Camera.main; + align( avatar ); + add( avatar ); + + Image iconInfo = Icons.INFO.get(); + iconInfo.x = avFrame.x + avFrame.innerRight() - iconInfo.width(); + iconInfo.y = avFrame.y + avFrame.marginTop(); + add( iconInfo ); + + add( new TouchArea( avFrame ) { + @Override + protected void onClick( Touchscreen.Touch touch ) { + add( new WndList( curClass.perks() ) ); + } + } ); + + btnMastery = new SimpleButton( Icons.MASTERY.get() ) { + @Override + protected void onClick() { + String text = null; + switch (curClass) { + case WARRIOR: + text = HeroSubClass.GLADIATOR.desc() + "\n\n" + HeroSubClass.BERSERKER.desc(); + break; + case MAGE: + text = HeroSubClass.BATTLEMAGE.desc() + "\n\n" + HeroSubClass.WARLOCK.desc(); + break; + case ROGUE: + text = HeroSubClass.FREERUNNER.desc() + "\n\n" + HeroSubClass.ASSASSIN.desc(); + break; + case HUNTRESS: + text = HeroSubClass.SNIPER.desc() + "\n\n" + HeroSubClass.WARDEN.desc(); + break; + } + StartScene.this.add( new WndTitledMessage( Icons.MASTERY.get(), "Mastery", text ) ); + } + }; + btnMastery.setPos( + avFrame.x + avFrame.innerRight() - btnMastery.width(), + avFrame.y + avFrame.innerBottom() - btnMastery.height() ); + add( btnMastery ); + + unlock = new Group(); + add( unlock ); + + if (!(huntressUnlocked = Badges.isUnlocked( Badges.Badge.BOSS_SLAIN_3 ))) { + + BitmapTextMultiline text = PixelScene.createMultiline( TXT_UNLOCK, 5 ); + text.maxWidth = (int)frame.innerWidth(); + text.measure(); + + pos = frame.center().y - text.height() / 2; + for (BitmapText line : text.new LineSplitter().split()) { + line.measure(); + line.hardlight( 0xFFFF00 ); + line.x = PixelScene.align( frame.center().x - line.width() / 2 ); + line.y = PixelScene.align( pos ); + unlock.add( line ); + + pos += line.height(); + } + } + + curClass = null; + updateClass( HeroClass.values()[PixelDungeon.lastClass()] ); + + fadeIn(); + } + + private void updateClass( HeroClass cl ) { + + if (curClass == cl) { + return; + } + + if (curClass != null) { + gems.get( curClass ).highlight( false ); + } + + gems.get( curClass = cl ).highlight( true ); + + className.text( Utils.capitalize( cl.title() ) ); + className.measure(); + className.x = align( frame.center().x - className.width() / 2 ); + + if (cl != HeroClass.HUNTRESS || huntressUnlocked) { + + unlock.visible = false; + + float buttonPos = frame.y + frame.innerBottom() - BUTTON_HEIGHT; + + GamesInProgress.Info info = GamesInProgress.check( curClass ); + if (info != null) { + + btnLoad.visible = true; + btnLoad.secondary( Utils.format( TXT_DPTH_LVL, info.depth, info.level ) ); + btnNewGame.visible = true; + btnNewGame.secondary( TXT_ERASE ); + + float w = (frame.innerWidth() - GAP) / 2; + + btnLoad.setRect( + frame.x + frame.marginLeft(), buttonPos, w, BUTTON_HEIGHT ); + btnNewGame.setRect( + btnLoad.right() + GAP, buttonPos, w, BUTTON_HEIGHT ); + + } else { + btnLoad.visible = false; + + btnNewGame.visible = true; + btnNewGame.secondary( null ); + btnNewGame.setRect( + frame.x + frame.marginLeft(), buttonPos, frame.innerWidth(), BUTTON_HEIGHT ); + } + + Badges.Badge badgeToCheck = null; + switch (curClass) { + case WARRIOR: + badgeToCheck = Badges.Badge.MASTERY_WARRIOR; + break; + case MAGE: + badgeToCheck = Badges.Badge.MASTERY_MAGE; + break; + case ROGUE: + badgeToCheck = Badges.Badge.MASTERY_ROGUE; + break; + case HUNTRESS: + badgeToCheck = Badges.Badge.MASTERY_HUNTRESS; + break; + } + btnMastery.active = + btnMastery.visible = + Badges.isUnlocked( badgeToCheck ); + + } else { + + unlock.visible = true; + btnLoad.visible = false; + btnNewGame.visible = false; + btnMastery.active = btnMastery.visible = false; + + } + + avatar.selectClass( curClass ); + } + + private void startNewGame() { + + Dungeon.hero = null; + InterlevelScene.mode = InterlevelScene.Mode.DESCEND; + + if (PixelDungeon.intro()) { + PixelDungeon.intro( false ); + Game.switchScene( IntroScene.class ); + } else { + Game.switchScene( InterlevelScene.class ); + } + } + + @Override + protected void onBackPressed() { + Game.switchScene( TitleScene.class ); + } + + private static class Avatar extends Image { + + private static final int WIDTH = 24; + private static final int HEIGHT = 32; + private static final int SCALE = 2; + + private TextureFilm frames; + + private float brightness = 0; + + public Avatar() { + super( Assets.AVATARS ); + + frames = new TextureFilm( texture, WIDTH, HEIGHT ); + selectClass( HeroClass.WARRIOR ); + scale.set( SCALE ); + + origin.set( width() / 2, height() / 2 ); + } + + public void selectClass( HeroClass cl ) { + frame( frames.get( cl.ordinal() ) ); + } + + public void flash() { + brightness = 1f; + } + + @Override + public void update() { + super.update(); + + if (brightness > 0) { + ra = ga = ba = brightness; + brightness -= Game.elapsed * 4; + if (brightness < 0) { + resetColor(); + } + } + } + } + + private class GemButton extends Button { + + private NinePatch bg; + private Image icon; + + private HeroClass cl; + + public GemButton( HeroClass cl ) { + super(); + + this.cl = cl; + gems.put( cl, this ); + + icon.copy( Icons.get( cl ) ); + setSize( 32, 32 ); + + highlight( false ); + } + + @Override + protected void createChildren() { + super.createChildren(); + + bg = Chrome.get( Chrome.Type.GEM ); + add( bg ); + + icon = new Image(); + add( icon ); + } + + @Override + protected void layout() { + super.layout(); + + bg.x = x; + bg.y = y; + bg.size( width, height ); + + icon.x = x + (width - icon.width) / 2; + icon.y = y + (height - icon.height) / 2; + } + + @Override + protected void onTouchDown() { + Emitter emitter = (Emitter)recycle( Emitter.class ); + emitter.revive(); + emitter.pos( bg ); + emitter.burst( Speck.factory( Speck.LIGHT ), 3 ); + + updateClass( cl ); + avatar.flash(); + + Sample.INSTANCE.play( Assets.SND_CLICK, 1, 1, 1.2f ); + } + + public void highlight( boolean value ) { + if (value) { + bg.rm = 1.2f; + bg.gm = 1.2f; + bg.bm = 1.1f; + bg.am = 0.8f; + } else { + bg.rm = 1.0f; + bg.gm = 1.0f; + bg.bm = 1.0f; + bg.am = 0.6f; + } + } + } + + private static class GameButton extends RedButton { + + private static final int SECONDARY_COLOR = 0xCACFC2; + + private BitmapText secondary; + + public GameButton( String primary ) { + super( primary ); + + this.secondary.text( null ); + } + + @Override + protected void createChildren() { + super.createChildren(); + + secondary = createText( 6 ); + secondary.hardlight( SECONDARY_COLOR ); + add( secondary ); + } + + @Override + protected void layout() { + super.layout(); + + if (secondary.text().length() > 0) { + text.y = y + (height - text.height() - secondary.baseLine()) / 2; + + secondary.x = align( x + (width - secondary.width()) / 2 ); + secondary.y = align( text.y + text.height() ); + } else { + text.y = y + (height - text.baseLine()) / 2; + } + } + + public void secondary( String text ) { + secondary.text( text ); + secondary.measure(); + } + } +} diff --git a/src/com/watabou/pixeldungeon/scenes/SurfaceScene.java b/src/com/watabou/pixeldungeon/scenes/SurfaceScene.java new file mode 100644 index 0000000000..d707e4d74e --- /dev/null +++ b/src/com/watabou/pixeldungeon/scenes/SurfaceScene.java @@ -0,0 +1,361 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.scenes; + +import java.nio.FloatBuffer; + +import com.watabou.gltextures.Gradient; +import com.watabou.gltextures.SmartTexture; +import com.watabou.glwrap.Matrix; +import com.watabou.glwrap.Quad; +import com.watabou.input.Touchscreen.Touch; +import com.watabou.noosa.Camera; +import com.watabou.noosa.ColorBlock; +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.Image; +import com.watabou.noosa.NoosaScript; +import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.TouchArea; +import com.watabou.noosa.Visual; +import com.watabou.noosa.audio.Music; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.HeroClass; +import com.watabou.pixeldungeon.sprites.RatSprite; +import com.watabou.pixeldungeon.ui.Archs; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.utils.Point; +import com.watabou.utils.Random; + +public class SurfaceScene extends PixelScene { + + private static final int WIDTH = 80; + private static final int HEIGHT = 112; + + private static final int NSTARS = 100; + private static final int NCLOUDS = 5; + + private Camera viewport; + @Override + public void create() { + + super.create(); + + Music.INSTANCE.play( Assets.HAPPY, true ); + Music.INSTANCE.volume( 1f ); + + uiCamera.visible = false; + + int w = Camera.main.width; + int h = Camera.main.height; + + Archs archs = new Archs(); + archs.reversed = true; + archs.setSize( w, h ); + add( archs ); + + float vx = align( (w - WIDTH) / 2 ); + float vy = align( (h - HEIGHT) / 2 ); + + Point s = Camera.main.cameraToScreen( vx, vy ); + viewport = new Camera( s.x, s.y, WIDTH, HEIGHT, defaultZoom ); + Camera.add( viewport ); + + Group window = new Group(); + window.camera = viewport; + add( window ); + + boolean dayTime = !Dungeon.nightMode; + + Sky sky = new Sky( dayTime ); + sky.scale.set( WIDTH, HEIGHT ); + window.add( sky ); + + if (!dayTime) { + for (int i=0; i < NSTARS; i++) { + float size = Random.Float(); + ColorBlock star = new ColorBlock( size, size, 0xFFFFFFFF ); + star.x = Random.Float( WIDTH ) - size / 2; + star.y = Random.Float( HEIGHT ) - size / 2; + star.am = size * (1 - star.y / HEIGHT); + window.add( star ); + } + } + + float range = HEIGHT * 2 / 3; + for (int i=0; i < NCLOUDS; i++) { + Cloud cloud = new Cloud( (NCLOUDS - 1 - i) * (range / NCLOUDS) + Random.Float( range / NCLOUDS ), dayTime ); + window.add( cloud ); + } + + int nPatches = (int)(sky.width() / GrassPatch.WIDTH + 1); + + for (int i=0; i < nPatches * 4; i++) { + GrassPatch patch = new GrassPatch( (i - 0.75f) * GrassPatch.WIDTH / 4, HEIGHT + 1, dayTime ); + patch.brightness( dayTime ? 0.7f : 0.4f ); + window.add( patch ); + } + + Avatar a = new Avatar( Dungeon.hero.heroClass ); + // Removing semitransparent contour + a.am = 2; a.aa = -1; + a.x = PixelScene.align( (WIDTH - a.width) / 2 ); + a.y = HEIGHT - a.height + 1; + window.add( a ); + + final Pet pet = new Pet(); + pet.rm = pet.gm = pet.bm = 1.2f; + pet.x = WIDTH / 2 + 2; + pet.y = HEIGHT - pet.height; + window.add( pet ); + + if (dayTime) { + a.brightness( 1.2f ); + pet.brightness( 1.2f ); + } + + window.add( new TouchArea( sky ) { + protected void onClick( Touch touch ) { + pet.jump(); + }; + } ); + + for (int i=0; i < nPatches; i++) { + GrassPatch patch = new GrassPatch( (i - 0.5f) * GrassPatch.WIDTH, HEIGHT, dayTime ); + patch.brightness( dayTime ? 1.0f : 0.8f ); + window.add( patch ); + } + + Image frame = new Image( Assets.SURFACE ); + if (!dayTime) { + frame.hardlight( 0xDDEEFF ); + } + frame.frame( 0, 0, 88, 125 ); + frame.x = vx - 4; + frame.y = vy - 9; + add( frame ); + + RedButton gameOver = new RedButton( "Game Over" ) { + protected void onClick() { + Game.switchScene( TitleScene.class ); + } + }; + gameOver.setSize( WIDTH - 10, 20 ); + gameOver.setPos( 5 + frame.x + 4, frame.y + frame.height + 4 ); + add( gameOver ); + + Badges.validateHappyEnd(); + + fadeIn(); + } + + @Override + public void destroy() { + Camera.remove( viewport ); + super.destroy(); + } + + @Override + protected void onBackPressed() { + } + + private static class Sky extends Visual { + + private static final int[] day = {0xFF4488FF, 0xFFCCEEFF}; + private static final int[] night = {0xFF001155, 0xFF335980}; + + private SmartTexture texture; + private FloatBuffer verticesBuffer; + + public Sky( boolean dayTime ) { + super( 0, 0, 1, 1 ); + + texture = new Gradient( dayTime ? day : night ); + + float[] vertices = new float[16]; + verticesBuffer = Quad.create(); + + vertices[2] = 0.25f; + vertices[6] = 0.25f; + vertices[10] = 0.75f; + vertices[14] = 0.75f; + + vertices[3] = 0; + vertices[7] = 1; + vertices[11] = 1; + vertices[15] = 0; + + + vertices[0] = 0; + vertices[1] = 0; + + vertices[4] = 1; + vertices[5] = 0; + + vertices[8] = 1; + vertices[9] = 1; + + vertices[12] = 0; + vertices[13] = 1; + + verticesBuffer.position( 0 ); + verticesBuffer.put( vertices ); + } + + @Override + public void draw() { + + super.draw(); + + NoosaScript script = NoosaScript.get(); + + texture.bind(); + + script.camera( camera() ); + + script.uModel.valueM4( matrix ); + script.lighting( + rm, gm, bm, am, + ra, ga, ba, aa ); + + script.drawQuad( verticesBuffer ); + } + } + + private static class Cloud extends Image { + + private static int lastIndex = -1; + + public Cloud( float y, boolean dayTime ) { + super( Assets.SURFACE ); + + int index; + do { + index = Random.Int( 3 ); + } while (index == lastIndex); + + switch (index) { + case 0: + frame( 88, 0, 49, 20 ); + break; + case 1: + frame( 88, 20, 49, 22 ); + break; + case 2: + frame( 88, 42, 50, 18 ); + break; + } + + lastIndex = index; + + this.y = y; + + scale.set( 1 - y / HEIGHT ); + x = Random.Float( WIDTH + width() ) - width(); + speed.x = scale.x * (dayTime ? +8 : -8); + + if (dayTime) { + tint( 0xCCEEFF, 1 - scale.y ); + } else { + rm = gm = bm = +3.0f; + ra = ga = ba = -2.1f; + } + } + + @Override + public void update() { + super.update(); + if (speed.x > 0 && x > WIDTH) { + x = -width(); + } else if (speed.x < 0 && x < -width()) { + x = WIDTH; + } + } + } + + private static class Avatar extends Image { + + private static final int WIDTH = 24; + private static final int HEIGHT = 32; + + public Avatar( HeroClass cl ) { + super( Assets.AVATARS ); + frame( new TextureFilm( texture, WIDTH, HEIGHT ).get( cl.ordinal() ) ); + } + } + + private static class Pet extends RatSprite { + + public void jump() { + play( run ); + } + + @Override + public void onComplete( Animation anim ) { + if (anim == run) { + idle(); + } + } + } + + private static class GrassPatch extends Image { + + public static final int WIDTH = 16; + public static final int HEIGHT = 14; + + private float tx; + private float ty; + + private double a = Random.Float( 5 ); + private double angle; + + private boolean forward; + + public GrassPatch( float tx, float ty, boolean forward ) { + + super( Assets.SURFACE ); + + frame( 88 + Random.Int( 4 ) * WIDTH, 60, WIDTH, HEIGHT ); + + this.tx = tx; + this.ty = ty; + + this.forward = forward; + } + + @Override + public void update() { + super.update(); + a += Random.Float( Game.elapsed * 5 ); + angle = (2 + Math.cos( a )) * (forward ? +0.2 : -0.2); + + scale.y = (float)Math.cos( angle ); + + x = tx + (float)Math.tan( angle ) * width; + y = ty - scale.y * height; + } + + @Override + protected void updateMatrix() { + super.updateMatrix(); + Matrix.skewX( matrix, (float)(angle / Matrix.G2RAD) ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/scenes/TitleScene.java b/src/com/watabou/pixeldungeon/scenes/TitleScene.java new file mode 100644 index 0000000000..074a9535fb --- /dev/null +++ b/src/com/watabou/pixeldungeon/scenes/TitleScene.java @@ -0,0 +1,176 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.scenes; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.noosa.audio.Music; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.ui.Button; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.effects.BannerSprites; +import com.watabou.pixeldungeon.effects.Fireball; +import com.watabou.pixeldungeon.ui.Archs; +import com.watabou.pixeldungeon.ui.PrefsButton; + +public class TitleScene extends PixelScene { + + private static final String TXT_PLAY = "Play"; + private static final String TXT_HIGHSCORES = "Rankings"; + private static final String TXT_BADGES = "Badges"; + private static final String TXT_ABOUT = "About"; + + @Override + public void create() { + + super.create(); + + Music.INSTANCE.play( Assets.THEME, true ); + Music.INSTANCE.volume( 1f ); + + uiCamera.visible = false; + + int w = Camera.main.width; + int h = Camera.main.height; + + float height = 180; + + Archs archs = new Archs(); + archs.setSize( w, h ); + add( archs ); + + Image title = BannerSprites.get( BannerSprites.Type.PIXEL_DUNGEON ); + add( title ); + + title.x = (w - title.width()) / 2; + title.y = (h - height) / 2; + + placeTorch( title.x + 18, title.y + 20 ); + placeTorch( title.x + title.width - 18, title.y + 20 ); + + DashboardItem btnBadges = new DashboardItem( TXT_BADGES, 3 ) { + @Override + protected void onClick() { + Game.switchScene( BadgesScene.class ); + } + }; + btnBadges.setPos( w / 2 - btnBadges.width(), (h + height) / 2 - DashboardItem.SIZE ); + add( btnBadges ); + + DashboardItem btnAbout = new DashboardItem( TXT_ABOUT, 1 ) { + @Override + protected void onClick() { + Game.switchScene( AboutScene.class ); + } + }; + btnAbout.setPos( w / 2, (h + height) / 2 - DashboardItem.SIZE ); + add( btnAbout ); + + DashboardItem btnPlay = new DashboardItem( TXT_PLAY, 0 ) { + @Override + protected void onClick() { + Game.switchScene( StartScene.class ); + } + }; + btnPlay.setPos( w / 2 - btnPlay.width(), btnAbout.top() - DashboardItem.SIZE ); + add( btnPlay ); + + DashboardItem btnHighscores = new DashboardItem( TXT_HIGHSCORES, 2 ) { + @Override + protected void onClick() { + Game.switchScene( RankingsScene.class ); + } + }; + btnHighscores.setPos( w / 2, btnPlay.top() ); + add( btnHighscores ); + + BitmapText version = new BitmapText( "v " + Game.version, font1x ); + version.measure(); + version.hardlight( 0x888888 ); + version.x = w - version.width(); + version.y = h - version.height(); + add( version ); + + PrefsButton btnPrefs = new PrefsButton(); + btnPrefs.setPos( w - btnPrefs.width() - 1, 1 ); + add( btnPrefs ); + + fadeIn(); + } + + private void placeTorch( float x, float y ) { + Fireball fb = new Fireball(); + fb.setPos( x, y ); + add( fb ); + } + + private static class DashboardItem extends Button { + + public static final float SIZE = 48; + + private static final int IMAGE_SIZE = 32; + + private Image image; + private BitmapText label; + + public DashboardItem( String text, int index ) { + super(); + + image.frame( image.texture.uvRect( index * IMAGE_SIZE, 0, (index + 1) * IMAGE_SIZE, IMAGE_SIZE ) ); + this.label.text( text ); + this.label.measure(); + + setSize( SIZE, SIZE ); + } + + @Override + protected void createChildren() { + super.createChildren(); + + image = new Image( Assets.DASHBOARD ); + add( image ); + + label = createText( 9 ); + add( label ); + } + + @Override + protected void layout() { + super.layout(); + + image.x = align( x + (width - image.width()) / 2 ); + image.y = align( y ); + + label.x = align( x + (width - label.width()) / 2 ); + label.y = align( image.y + image.height() +2 ); + } + + @Override + protected void onTouchDown() { + image.brightness( 1.5f ); + Sample.INSTANCE.play( Assets.SND_CLICK, 1, 1, 0.8f ); + } + + @Override + protected void onTouchUp() { + image.resetColor(); + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/AcidicSprite.java b/src/com/watabou/pixeldungeon/sprites/AcidicSprite.java new file mode 100644 index 0000000000..eeac79c0f1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/AcidicSprite.java @@ -0,0 +1,53 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class AcidicSprite extends ScorpioSprite { + + public AcidicSprite() { + super(); + + texture( Assets.SCORPIO ); + + TextureFilm frames = new TextureFilm( texture, 18, 17 ); + + idle = new Animation( 12, true ); + idle.frames( frames, 14, 14, 14, 14, 14, 14, 14, 14, 15, 16, 15, 16, 15, 16 ); + + run = new Animation( 4, true ); + run.frames( frames, 19, 20 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 14, 17, 18 ); + + zap = attack.clone(); + + die = new Animation( 12, false ); + die.frames( frames, 14, 21, 22, 23, 24 ); + + play( idle ); + } + + @Override + public int blood() { + return 0xFF66FF22; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/AlbinoSprite.java b/src/com/watabou/pixeldungeon/sprites/AlbinoSprite.java new file mode 100644 index 0000000000..473dcec543 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/AlbinoSprite.java @@ -0,0 +1,46 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class AlbinoSprite extends MobSprite { + + public AlbinoSprite() { + super(); + + texture( Assets.RAT ); + + TextureFilm frames = new TextureFilm( texture, 16, 15 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 16, 16, 16, 17 ); + + run = new Animation( 10, true ); + run.frames( frames, 22, 23, 24, 25, 26 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 18, 19, 20, 21 ); + + die = new Animation( 10, false ); + die.frames( frames, 27, 28, 29, 30 ); + + play( idle ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/BanditSprite.java b/src/com/watabou/pixeldungeon/sprites/BanditSprite.java new file mode 100644 index 0000000000..a4d8cc6a52 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/BanditSprite.java @@ -0,0 +1,45 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class BanditSprite extends MobSprite { + + public BanditSprite() { + super(); + + texture( Assets.THIEF ); + TextureFilm film = new TextureFilm( texture, 12, 13 ); + + idle = new Animation( 1, true ); + idle.frames( film, 21, 21, 21, 22, 21, 21, 21, 21, 22 ); + + run = new Animation( 15, true ); + run.frames( film, 21, 21, 23, 24, 24, 25 ); + + die = new Animation( 10, false ); + die.frames( film, 25, 27, 28, 29, 30 ); + + attack = new Animation( 12, false ); + attack.frames( film, 31, 32, 33 ); + + idle(); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/BatSprite.java b/src/com/watabou/pixeldungeon/sprites/BatSprite.java new file mode 100644 index 0000000000..050e139f9f --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/BatSprite.java @@ -0,0 +1,46 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class BatSprite extends MobSprite { + + public BatSprite() { + super(); + + texture( Assets.BAT ); + + TextureFilm frames = new TextureFilm( texture, 15, 15 ); + + idle = new Animation( 8, true ); + idle.frames( frames, 0, 1 ); + + run = new Animation( 12, true ); + run.frames( frames, 0, 1 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 2, 3, 0, 1 ); + + die = new Animation( 12, false ); + die.frames( frames, 4, 5, 6 ); + + play( idle ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/BlacksmithSprite.java b/src/com/watabou/pixeldungeon/sprites/BlacksmithSprite.java new file mode 100644 index 0000000000..fb8e6be00e --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/BlacksmithSprite.java @@ -0,0 +1,82 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.particles.Emitter; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.levels.Level; + +public class BlacksmithSprite extends MobSprite { + + private Emitter emitter; + + public BlacksmithSprite() { + super(); + + texture( Assets.TROLL ); + + TextureFilm frames = new TextureFilm( texture, 13, 16 ); + + idle = new Animation( 15, true ); + idle.frames( frames, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3 ); + + run = new Animation( 20, true ); + run.frames( frames, 0 ); + + die = new Animation( 20, false ); + die.frames( frames, 0 ); + + play( idle ); + } + + @Override + public void link( Char ch ) { + super.link( ch ); + + emitter = new Emitter(); + emitter.autoKill = false; + emitter.pos( x + 7, y + 12 ); + parent.add( emitter ); + } + + @Override + public void update() { + super.update(); + + if (emitter != null) { + emitter.visible = visible; + } + } + + @Override + public void onComplete( Animation anim ) { + super.onComplete( anim ); + + if (visible && emitter != null && anim == idle) { + emitter.burst( Speck.factory( Speck.FORGE ), 3 ); + float volume = 0.2f / (Level.distance( ch.pos, Dungeon.hero.pos )); + Sample.INSTANCE.play( Assets.SND_EVOKE, volume, volume, 0.8f ); + } + } + +} diff --git a/src/com/watabou/pixeldungeon/sprites/BruteSprite.java b/src/com/watabou/pixeldungeon/sprites/BruteSprite.java new file mode 100644 index 0000000000..90ccc923d7 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/BruteSprite.java @@ -0,0 +1,46 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class BruteSprite extends MobSprite { + + public BruteSprite() { + super(); + + texture( Assets.BRUTE ); + + TextureFilm frames = new TextureFilm( texture, 12, 16 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 0, 0, 0, 1, 0, 0, 1, 1 ); + + run = new Animation( 12, true ); + run.frames( frames, 4, 5, 6, 7 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 2, 3, 0 ); + + die = new Animation( 12, false ); + die.frames( frames, 8, 9, 10 ); + + play( idle ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/BurningFistSprite.java b/src/com/watabou/pixeldungeon/sprites/BurningFistSprite.java new file mode 100644 index 0000000000..ae56f1d792 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/BurningFistSprite.java @@ -0,0 +1,77 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.utils.Callback; + +public class BurningFistSprite extends MobSprite { + + public BurningFistSprite() { + super(); + + texture( Assets.BURNING ); + + TextureFilm frames = new TextureFilm( texture, 24, 17 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 0, 0, 1 ); + + run = new Animation( 3, true ); + run.frames( frames, 0, 1 ); + + attack = new Animation( 8, false ); + attack.frames( frames, 0, 5, 6 ); + + die = new Animation( 10, false ); + die.frames( frames, 0, 2, 3, 4 ); + + play( idle ); + } + + private int posToShoot; + + @Override + public void attack( int cell ) { + posToShoot = cell; + super.attack( cell ); + } + + @Override + public void onComplete( Animation anim ) { + if (anim == attack) { + + Sample.INSTANCE.play( Assets.SND_ZAP ); + MagicMissile.shadow( parent, ch.pos, posToShoot, + new Callback() { + @Override + public void call() { + ch.onAttackComplete(); + } + } ); + + idle(); + + } else { + super.onComplete( anim ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/CharSprite.java b/src/com/watabou/pixeldungeon/sprites/CharSprite.java new file mode 100644 index 0000000000..24981b9a4d --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/CharSprite.java @@ -0,0 +1,407 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.Game; +import com.watabou.noosa.MovieClip; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.tweeners.PosTweener; +import com.watabou.noosa.tweeners.Tweener; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.effects.EmoIcon; +import com.watabou.pixeldungeon.effects.FloatingText; +import com.watabou.pixeldungeon.effects.IceBlock; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.Splash; +import com.watabou.pixeldungeon.effects.TorchHalo; +import com.watabou.pixeldungeon.effects.particles.FlameParticle; +import com.watabou.pixeldungeon.items.potions.PotionOfInvisibility; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Callback; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip.Listener { + + // Color constants for floating text + public static final int DEFAULT = 0xFFFFFF; + public static final int POSITIVE = 0x00FF00; + public static final int NEGATIVE = 0xFF0000; + public static final int WARNING = 0xFF8800; + public static final int NEUTRAL = 0xFFFF00; + + private static final float MOVE_INTERVAL = 0.1f; + private static final float FLASH_INTERVAL = 0.05f; + + public enum State { + BURNING, LEVITATING, INVISIBLE, PARALYSED, FROZEN, ILLUMINATED + } + + protected Animation idle; + protected Animation run; + protected Animation attack; + protected Animation operate; + protected Animation zap; + protected Animation die; + + protected Callback animCallback; + + protected Tweener motion; + + protected Emitter burning; + protected Emitter levitation; + + protected IceBlock iceBlock; + protected TorchHalo halo; + + protected EmoIcon emo; + + private float flashTime = 0; + + protected boolean sleeping = false; + + // Char owner + public Char ch; + + public CharSprite() { + super(); + listener = this; + } + + public void link( Char ch ) { + this.ch = ch; + ch.sprite = this; + + place( ch.pos ); + turnTo( ch.pos, Random.Int( Level.LENGTH ) ); + + ch.updateSpriteState(); + } + + public PointF worldToCamera( int cell ) { + + final int csize = DungeonTilemap.SIZE; + + return new PointF( + ((cell % Level.WIDTH) + 0.5f) * csize - width * 0.5f, + ((cell / Level.WIDTH) + 1.0f) * csize - height + ); + } + + public void place( int cell ) { + point( worldToCamera( cell ) ); + } + + public void showStatus( int color, String text, Object... args ) { + if (visible) { + if (args.length > 0) { + text = Utils.format( text, args ); + } + if (ch != null) { + FloatingText.show( x + width * 0.5f, y, ch.pos, text, color ); + } else { + FloatingText.show( x + width * 0.5f, y, text, color ); + } + } + } + + public void idle() { + play( idle ); + } + + public void move( int from, int to ) { + play( run ); + + motion = new PosTweener( this, worldToCamera( to ), MOVE_INTERVAL ); + motion.listener = this; + parent.add( motion ); + + turnTo( from , to ); + + if (visible && Level.water[from] && !ch.flying) { + GameScene.ripple( from ); + } + } + + public void interruptMotion() { + if (motion != null) { + onComplete( motion ); + } + } + + public void attack( int cell ) { + turnTo( ch.pos, cell ); + play( attack ); + } + + public void attack( int cell, Callback callback ) { + animCallback = callback; + turnTo( ch.pos, cell ); + play( attack ); + } + + public void operate( int cell ) { + turnTo( ch.pos, cell ); + play( operate ); + } + + public void zap( int cell ) { + turnTo( ch.pos, cell ); + play( zap ); + } + + public void turnTo( int from, int to ) { + int fx = from % Level.WIDTH; + int tx = to % Level.WIDTH; + if (tx > fx) { + flipHorizontal = false; + } else if (tx < fx) { + flipHorizontal = true; + } + } + + public void die() { + sleeping = false; + play( die ); + + if (emo != null) { + emo.killAndErase(); + } + } + + public Emitter emitter() { + Emitter emitter = GameScene.emitter(); + emitter.pos( this ); + return emitter; + } + + public Emitter centerEmitter() { + Emitter emitter = GameScene.emitter(); + emitter.pos( center() ); + return emitter; + } + + public Emitter bottomEmitter() { + Emitter emitter = GameScene.emitter(); + emitter.pos( x, y + height, width, 0 ); + return emitter; + } + + public void burst( final int color, int n ) { + if (visible) { + Splash.at( center(), color, n ); + } + } + + public void bloodBurstA( PointF from, int damage ) { + if (visible) { + PointF c = center(); + int n = (int)Math.min( 9 * Math.sqrt( (double)damage / ch.HT ), 9 ); + Splash.at( c, PointF.angle( from, c ), 3.1415926f / 2, blood(), n ); + } + } + + // Blood color + public int blood() { + return 0xFFBB0000; + } + + public void flash() { + ra = ba = ga = 1f; + flashTime = FLASH_INTERVAL; + } + + public void add( State state ) { + switch (state) { + case BURNING: + burning = emitter(); + burning.pour( FlameParticle.FACTORY, 0.06f ); + if (visible) { + Sample.INSTANCE.play( Assets.SND_BURNING ); + } + break; + case LEVITATING: + levitation = emitter(); + levitation.pour( Speck.factory( Speck.JET ), 0.02f ); + break; + case INVISIBLE: + PotionOfInvisibility.melt( ch ); + break; + case PARALYSED: + paused = true; + break; + case FROZEN: + iceBlock = IceBlock.freeze( this ); + paused = true; + break; + case ILLUMINATED: + GameScene.effect( halo = new TorchHalo( this ) ); + break; + } + } + + public void remove( State state ) { + switch (state) { + case BURNING: + if (burning != null) { + burning.on = false; + burning = null; + } + break; + case LEVITATING: + if (levitation != null) { + levitation.on = false; + levitation = null; + } + break; + case INVISIBLE: + alpha( 1f ); + break; + case PARALYSED: + paused = false; + break; + case FROZEN: + if (iceBlock != null) { + iceBlock.melt(); + iceBlock = null; + } + paused = false; + break; + case ILLUMINATED: + if (halo != null) { + halo.putOut(); + } + break; + } + } + + @Override + public void update() { + + super.update(); + + if (paused && listener != null) { + listener.onComplete( curAnim ); + } + + if (flashTime > 0 && (flashTime -= Game.elapsed) <= 0) { + resetColor(); + } + + if (burning != null) { + burning.visible = visible; + } + if (levitation != null) { + levitation.visible = visible; + } + if (iceBlock != null) { + iceBlock.visible = visible; + } + if (sleeping) { + showSleep(); + } else { + hideSleep(); + } + if (emo != null) { + emo.visible = visible; + } + } + + public void showSleep() { + if (emo instanceof EmoIcon.Sleep) { + + } else { + if (emo != null) { + emo.killAndErase(); + } + emo = new EmoIcon.Sleep( this ); + } + } + + public void hideSleep() { + if (emo instanceof EmoIcon.Sleep) { + emo.killAndErase(); + emo = null; + } + } + + public void showAlert() { + if (emo instanceof EmoIcon.Alert) { + + } else { + if (emo != null) { + emo.killAndErase(); + } + emo = new EmoIcon.Alert( this ); + } + } + + public void hideAlert() { + if (emo instanceof EmoIcon.Alert) { + emo.killAndErase(); + emo = null; + } + } + + @Override + public void kill() { + super.kill(); + + if (emo != null) { + emo.killAndErase(); + emo = null; + } + } + + @Override + public void onComplete( Tweener tweener ) { + if (tweener == motion) { + motion.killAndErase(); + motion = null; + ch.onMotionComplete(); + } + } + + @Override + public void onComplete( Animation anim ) { + + if (animCallback != null) { + animCallback.call(); + animCallback = null; + } else { + + if (anim == attack) { + + idle(); + ch.onAttackComplete(); + + } else if (anim == operate) { + + idle(); + ch.onOperateComplete(); + + } + + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/CrabSprite.java b/src/com/watabou/pixeldungeon/sprites/CrabSprite.java new file mode 100644 index 0000000000..f06c2f5189 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/CrabSprite.java @@ -0,0 +1,51 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class CrabSprite extends MobSprite { + + public CrabSprite() { + super(); + + texture( Assets.CRAB ); + + TextureFilm frames = new TextureFilm( texture, 16 ); + + idle = new Animation( 5, true ); + idle.frames( frames, 0, 1, 0, 2 ); + + run = new Animation( 15, true ); + run.frames( frames, 3, 4, 5, 6 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 7, 8, 9 ); + + die = new Animation( 12, false ); + die.frames( frames, 10, 11, 12, 13 ); + + play( idle ); + } + + @Override + public int blood() { + return 0xFFFFEA80; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/DM300Sprite.java b/src/com/watabou/pixeldungeon/sprites/DM300Sprite.java new file mode 100644 index 0000000000..29527ef1f1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/DM300Sprite.java @@ -0,0 +1,62 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.effects.Speck; + +public class DM300Sprite extends MobSprite { + + public DM300Sprite() { + super(); + + texture( Assets.DM300 ); + + TextureFilm frames = new TextureFilm( texture, 22, 20 ); + + idle = new Animation( 10, true ); + idle.frames( frames, 0, 1 ); + + run = new Animation( 10, true ); + run.frames( frames, 2, 3 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 4, 5, 6 ); + + die = new Animation( 20, false ); + die.frames( frames, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 8 ); + + play( idle ); + } + + @Override + public void onComplete( Animation anim ) { + + super.onComplete( anim ); + + if (anim == die) { + emitter().burst( Speck.factory( Speck.WOOL ), 15 ); + } + } + + @Override + public int blood() { + return 0xFFFFFF88; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/DiscardedItemSprite.java b/src/com/watabou/pixeldungeon/sprites/DiscardedItemSprite.java new file mode 100644 index 0000000000..1f14ba904f --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/DiscardedItemSprite.java @@ -0,0 +1,48 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.Game; + +public class DiscardedItemSprite extends ItemSprite { + + public DiscardedItemSprite() { + + super(); + + originToCenter(); + angularSpeed = 720; + } + + @Override + public void drop() { + scale.set( 1 ); + am = 1; + } + + @Override + public void update() { + + super.update(); + + scale.set( scale.x * 0.9f ); + if ((am -= Game.elapsed) <= 0) { + remove(); + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/ElementalSprite.java b/src/com/watabou/pixeldungeon/sprites/ElementalSprite.java new file mode 100644 index 0000000000..a74a358a59 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/ElementalSprite.java @@ -0,0 +1,64 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.Char; + +public class ElementalSprite extends MobSprite { + + public ElementalSprite() { + super(); + + texture( Assets.ELEMENTAL ); + + TextureFilm frames = new TextureFilm( texture, 12, 14 ); + + idle = new Animation( 10, true ); + idle.frames( frames, 0, 1, 2 ); + + run = new Animation( 12, true ); + run.frames( frames, 0, 1, 3 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 4, 5, 6 ); + + die = new Animation( 15, false ); + die.frames( frames, 7, 8, 9, 10, 11, 12, 13, 12 ); + + play( idle ); + } + + @Override + public void link( Char ch ) { + super.link( ch ); + add( State.BURNING ); + } + + @Override + public void die() { + super.die(); + remove( State.BURNING ); + } + + @Override + public int blood() { + return 0xFFFF7D13; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/EyeSprite.java b/src/com/watabou/pixeldungeon/sprites/EyeSprite.java new file mode 100644 index 0000000000..f56bd601bf --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/EyeSprite.java @@ -0,0 +1,68 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.effects.DeathRay; + +public class EyeSprite extends MobSprite { + + private int attackPos; + + public EyeSprite() { + super(); + + texture( Assets.EYE ); + + TextureFilm frames = new TextureFilm( texture, 16, 18 ); + + idle = new Animation( 8, true ); + idle.frames( frames, 0, 1, 2 ); + + run = new Animation( 12, true ); + run.frames( frames, 5, 6 ); + + attack = new Animation( 8, false ); + attack.frames( frames, 4, 3 ); + + die = new Animation( 8, false ); + die.frames( frames, 7, 8, 9 ); + + play( idle ); + } + + @Override + public void attack( int pos ) { + attackPos = pos; + super.attack( pos ); + } + + @Override + public void onComplete( Animation anim ) { + super.onComplete( anim ); + + if (anim == attack) { + if (Dungeon.visible[ch.pos] || Dungeon.visible[attackPos]) { + parent.add( new DeathRay( center(), DungeonTilemap.tileCenterToWorld( attackPos ) ) ); + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/FetidRatSprite.java b/src/com/watabou/pixeldungeon/sprites/FetidRatSprite.java new file mode 100644 index 0000000000..3942f4041c --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/FetidRatSprite.java @@ -0,0 +1,56 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.particles.Emitter; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.effects.Speck; + +public class FetidRatSprite extends RatSprite { + + private Emitter cloud; + + @Override + public void link( Char ch ) { + super.link( ch ); + + if (cloud == null) { + cloud = emitter(); + cloud.pour( Speck.factory( Speck.PARALYSIS ), 0.7f ); + } + } + + @Override + public void update() { + + super.update(); + + if (cloud != null) { + cloud.visible = visible; + } + } + + @Override + public void die() { + super.die(); + + if (cloud != null) { + cloud.on = false; + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/GhostSprite.java b/src/com/watabou/pixeldungeon/sprites/GhostSprite.java new file mode 100644 index 0000000000..917f49797e --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/GhostSprite.java @@ -0,0 +1,68 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import javax.microedition.khronos.opengles.GL10; + +import android.opengl.GLES20; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.particles.ShaftParticle; + +public class GhostSprite extends MobSprite { + + public GhostSprite() { + super(); + + texture( Assets.GHOST ); + + TextureFilm frames = new TextureFilm( texture, 14, 15 ); + + idle = new Animation( 5, true ); + idle.frames( frames, 0, 1 ); + + run = new Animation( 10, true ); + run.frames( frames, 0, 1 ); + + die = new Animation( 20, false ); + die.frames( frames, 0 ); + + play( idle ); + } + + @Override + public void draw() { + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE ); + super.draw(); + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); + } + + @Override + public void die() { + super.die(); + emitter().start( ShaftParticle.FACTORY, 0.3f, 4 ); + emitter().start( Speck.factory( Speck.LIGHT ), 0.2f, 3 ); + } + + @Override + public int blood() { + return 0xFFFFFF; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/GnollSprite.java b/src/com/watabou/pixeldungeon/sprites/GnollSprite.java new file mode 100644 index 0000000000..a4bc706bd1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/GnollSprite.java @@ -0,0 +1,46 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class GnollSprite extends MobSprite { + + public GnollSprite() { + super(); + + texture( Assets.GNOLL ); + + TextureFilm frames = new TextureFilm( texture, 12, 15 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 0, 0, 0, 1, 0, 0, 1, 1 ); + + run = new Animation( 12, true ); + run.frames( frames, 4, 5, 6, 7 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 2, 3, 0 ); + + die = new Animation( 12, false ); + die.frames( frames, 8, 9, 10 ); + + play( idle ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/GolemSprite.java b/src/com/watabou/pixeldungeon/sprites/GolemSprite.java new file mode 100644 index 0000000000..7179e9d724 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/GolemSprite.java @@ -0,0 +1,60 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.effects.particles.ElmoParticle; + +public class GolemSprite extends MobSprite { + + public GolemSprite() { + super(); + + texture( Assets.GOLEM ); + + TextureFilm frames = new TextureFilm( texture, 16, 16 ); + + idle = new Animation( 4, true ); + idle.frames( frames, 0, 1 ); + + run = new Animation( 12, true ); + run.frames( frames, 2, 3, 4, 5 ); + + attack = new Animation( 10, false ); + attack.frames( frames, 6, 7, 8 ); + + die = new Animation( 15, false ); + die.frames( frames, 9, 10, 11, 12, 13 ); + + play( idle ); + } + + @Override + public int blood() { + return 0xFF80706c; + } + + @Override + public void onComplete( Animation anim ) { + if (anim == die) { + emitter().burst( ElmoParticle.FACTORY, 4 ); + } + super.onComplete( anim ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/GooSprite.java b/src/com/watabou/pixeldungeon/sprites/GooSprite.java new file mode 100644 index 0000000000..ae730e8af2 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/GooSprite.java @@ -0,0 +1,60 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class GooSprite extends MobSprite { + + private Animation pump; + + public GooSprite() { + super(); + + texture( Assets.GOO ); + + TextureFilm frames = new TextureFilm( texture, 20, 14 ); + + idle = new Animation( 10, true ); + idle.frames( frames, 0, 1 ); + + run = new Animation( 10, true ); + run.frames( frames, 0, 1 ); + + pump = new Animation( 20, true ); + pump.frames( frames, 0, 1 ); + + attack = new Animation( 10, false ); + attack.frames( frames, 5, 0, 6 ); + + die = new Animation( 10, false ); + die.frames( frames, 2, 3, 4 ); + + play( idle ); + } + + public void pumpUp() { + play( pump ); + } + + @Override + public int blood() { + return 0xFF000000; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/HeroSprite.java b/src/com/watabou/pixeldungeon/sprites/HeroSprite.java new file mode 100644 index 0000000000..c7ae8c9383 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/HeroSprite.java @@ -0,0 +1,127 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import android.graphics.RectF; + +import com.watabou.gltextures.SmartTexture; +import com.watabou.gltextures.TextureCache; +import com.watabou.noosa.Camera; +import com.watabou.noosa.Image; +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.hero.HeroClass; + +public class HeroSprite extends CharSprite { + + private static final int FRAME_WIDTH = 12; + private static final int FRAME_HEIGHT = 15; + + private static final int RUN_FRAMERATE = 20; + + private static TextureFilm tiers; + + private Animation fly; + + public HeroSprite() { + super(); + + link( Dungeon.hero ); + + texture( Dungeon.hero.heroClass.spritesheet() ); + updateArmor(); + + idle(); + } + + public void updateArmor() { + + TextureFilm film = new TextureFilm( tiers(), ((Hero)ch).tier(), FRAME_WIDTH, FRAME_HEIGHT ); + + idle = new Animation( 1, true ); + idle.frames( film, 0, 0, 0, 1, 0, 0, 1, 1 ); + + run = new Animation( RUN_FRAMERATE, true ); + run.frames( film, 2, 3, 4, 5, 6, 7 ); + + die = new Animation( 20, false ); + die.frames( film, 8, 9, 10, 11, 12, 11 ); + + attack = new Animation( 15, false ); + attack.frames( film, 13, 14, 15, 0 ); + + zap = attack.clone(); + + operate = new Animation( 8, false ); + operate.frames( film, 16, 17, 16, 17 ); + + fly = new Animation( 1, true ); + fly.frames( film, 18 ); + } + + @Override + public void place( int p ) { + super.place( p ); + Camera.main.target = this; + } + + @Override + public void move( int from, int to ) { + super.move( from, to ); + if (ch.flying) { + play( fly ); + } + Camera.main.target = this; + } + + @Override + public void update() { + sleeping = ((Hero)ch).restoreHealth; + + super.update(); + } + + public boolean sprint( boolean on ) { + run.delay = on ? 0.625f / RUN_FRAMERATE : 1f / RUN_FRAMERATE; + return on; + } + + public static TextureFilm tiers() { + if (tiers == null) { + // Sprites for all classes are the same in size + SmartTexture texture = TextureCache.get( Assets.ROGUE ); + tiers = new TextureFilm( texture, texture.width, FRAME_HEIGHT ); + } + + return tiers; + } + + public static Image avatar( HeroClass cl, int armorTier ) { + + RectF patch = tiers().get( armorTier ); + Image avatar = new Image( cl.spritesheet() ); + RectF frame = avatar.texture.uvRect( 1, 0, FRAME_WIDTH, FRAME_HEIGHT ); + frame.offset( patch.left, patch.top ); + avatar.frame( frame ); + + return avatar; + } + +} diff --git a/src/com/watabou/pixeldungeon/sprites/ImpSprite.java b/src/com/watabou/pixeldungeon/sprites/ImpSprite.java new file mode 100644 index 0000000000..abd6edebb6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/ImpSprite.java @@ -0,0 +1,69 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.npcs.Imp; +import com.watabou.pixeldungeon.effects.Speck; + +public class ImpSprite extends MobSprite { + + public ImpSprite() { + super(); + + texture( Assets.IMP ); + + TextureFilm frames = new TextureFilm( texture, 12, 14 ); + + idle = new Animation( 10, true ); + idle.frames( frames, + 0, 1, 2, 3, 0, 1, 2, 3, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 3, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4 ); + + run = new Animation( 20, true ); + run.frames( frames, 0 ); + + die = new Animation( 10, false ); + die.frames( frames, 0, 3, 2, 1, 0, 3, 2, 1, 0 ); + + play( idle ); + } + + @Override + public void link( Char ch ) { + super.link( ch ); + + if (ch instanceof Imp) { + alpha( 0.4f ); + } + } + + @Override + public void onComplete( Animation anim ) { + if (anim == die) { + + emitter().burst( Speck.factory( Speck.WOOL ), 15 ); + killAndErase(); + + } else { + super.onComplete( anim ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/ItemSprite.java b/src/com/watabou/pixeldungeon/sprites/ItemSprite.java new file mode 100644 index 0000000000..e4597fac92 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/ItemSprite.java @@ -0,0 +1,224 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import android.graphics.Bitmap; + +import com.watabou.gltextures.TextureCache; +import com.watabou.noosa.Game; +import com.watabou.noosa.MovieClip; +import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.effects.CellEmitter; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.items.Gold; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class ItemSprite extends MovieClip { + + public static final int SIZE = 16; + + private static final float DROP_INTERVAL = 0.4f; + + protected static TextureFilm film; + + public Heap heap; + + private Glowing glowing; + private float phase; + private boolean glowUp; + + private float dropInterval; + + public ItemSprite() { + this( ItemSpriteSheet.SMTH, null ); + } + + public ItemSprite( Item item ) { + this( item.image(), item.glowing() ); + } + + public ItemSprite( int image, Glowing glowing ) { + super( Assets.ITEMS ); + + if (film == null) { + film = new TextureFilm( texture, SIZE, SIZE ); + } + + view( image, glowing ); + } + + public void originToCenter() { + origin.set(SIZE / 2 ); + } + + public void link() { + link( heap ); + } + + public void link( Heap heap ) { + this.heap = heap; + view( heap.image(), heap.glowing() ); + place( heap.pos ); + } + + @Override + public void revive() { + super.revive(); + + speed.set( 0 ); + acc.set( 0 ); + dropInterval = 0; + + heap = null; + } + + public PointF worldToCamera( int cell ) { + final int csize = DungeonTilemap.SIZE; + + return new PointF( + cell % Level.WIDTH * csize + (csize - SIZE) * 0.5f, + cell / Level.WIDTH * csize + (csize - SIZE) * 0.5f + ); + } + + public void place( int p ) { + point( worldToCamera( p ) ); + } + + public void drop() { + + if (heap.isEmpty()) { + return; + } + + dropInterval = DROP_INTERVAL; + + speed.set( 0, -100 ); + acc.set( 0, -speed.y / DROP_INTERVAL * 2 ); + + if (visible && heap != null && heap.peek() instanceof Gold) { + CellEmitter.center( heap.pos ).burst( Speck.factory( Speck.COIN ), 5 ); + Sample.INSTANCE.play( Assets.SND_GOLD, 1, 1, Random.Float( 0.9f, 1.1f ) ); + } + } + + public void drop( int from ) { + + if (heap.pos == from) { + drop(); + } else { + + float px = x; + float py = y; + drop(); + + place( from ); + + speed.offset( (px-x) / DROP_INTERVAL, (py-y) / DROP_INTERVAL ); + } + } + + public ItemSprite view( int image, Glowing glowing ) { + frame( film.get( image ) ); + if ((this.glowing = glowing) == null) { + resetColor(); + } + return this; + } + + @Override + public void update() { + super.update(); + + // Visibility + visible = heap == null || Dungeon.visible[heap.pos]; + + // Dropping + if (dropInterval > 0 && (dropInterval -= Game.elapsed) <= 0) { + + speed.set( 0 ); + acc.set( 0 ); + place( heap.pos ); + + if (Level.water[heap.pos]) { + GameScene.ripple( heap.pos ); + } + } + + // Glowing + if (visible && glowing != null) { + if (glowUp && (phase += Game.elapsed) > glowing.period) { + + glowUp = false; + phase = glowing.period; + + } else if (!glowUp && (phase -= Game.elapsed) < 0) { + + glowUp = true; + phase = 0; + + } + + float value = phase / glowing.period * 0.6f; + + rm = gm = bm = 1 - value; + ra = glowing.red * value; + ga = glowing.green * value; + ba = glowing.blue * value; + } + } + + public static int pick( int index, int x, int y ) { + Bitmap bmp = TextureCache.get( Assets.ITEMS ).bitmap; + int rows = bmp.getWidth() / SIZE; + int row = index / rows; + int col = index % rows; + return bmp.getPixel( col * SIZE + x, row * SIZE + y ); + } + + public static class Glowing { + + public static final Glowing WHITE = new Glowing( 0xFFFFFF, 0.6f ); + + public float red; + public float green; + public float blue; + public float period; + + public Glowing( int color ) { + this( color, 1f ); + } + + public Glowing( int color, float period ) { + red = (color >> 16) / 255f; + green = ((color >> 8) & 0xFF) / 255f; + blue = (color & 0xFF) / 255f; + + this.period = period; + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/ItemSpriteSheet.java b/src/com/watabou/pixeldungeon/sprites/ItemSpriteSheet.java new file mode 100644 index 0000000000..f0b5a5139f --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/ItemSpriteSheet.java @@ -0,0 +1,172 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +public class ItemSpriteSheet { + + // Placeholders + public static final int WEAPON = 5; + public static final int ARMOR = 6; + public static final int RING = 7; + public static final int SMTH = 127; + + // Keys + public static final int SKELETON_KEY = 8; + public static final int IRON_KEY = 9; + public static final int GOLDEN_KEY = 10; + + // Melee weapons + public static final int SHORT_SWORD = 2; + public static final int KNUCKLEDUSTER = 16; + public static final int QUARTERSTAFF = 17; + public static final int MACE = 18; + public static final int DAGGER = 19; + public static final int SWORD = 20; + public static final int LONG_SWORD = 21; + public static final int BATTLE_AXE = 22; + public static final int WAR_HAMMER = 23; + public static final int SPEAR = 29; + public static final int GLAIVE = 30; + + // Missile weapons + public static final int SHURIKEN = 15; + public static final int DART = 31; + public static final int BOOMERANG = 106; + public static final int TOMAHAWK = 107; + public static final int INCENDIARY_DART = 108; + public static final int CURARE_DART = 109; + public static final int JAVELIN = 110; + + // Armors + public static final int ARMOR_CLOTH = 24; + public static final int ARMOR_LEATHER = 25; + public static final int ARMOR_MAIL = 26; + public static final int ARMOR_SCALE = 27; + public static final int ARMOR_PLATE = 28; + public static final int ARMOR_ROGUE = 96; + public static final int ARMOR_WARRIOR = 97; + public static final int ARMOR_MAGE = 98; + public static final int ARMOR_HUNTRESS = 99; + + // Wands + public static final int WAND_MAGIC_MISSILE = 3; + public static final int WAND_HOLLY = 48; + public static final int WAND_YEW = 49; + public static final int WAND_EBONY = 50; + public static final int WAND_CHERRY = 51; + public static final int WAND_TEAK = 52; + public static final int WAND_ROWAN = 53; + public static final int WAND_WILLOW = 54; + public static final int WAND_MAHOGANY = 55; + public static final int WAND_BAMBOO = 68; + public static final int WAND_PURPLEHEART = 69; + public static final int WAND_OAK = 70; + public static final int WAND_BIRCH = 71; + + // Rings + public static final int RING_DIAMOND = 32; + public static final int RING_OPAL = 33; + public static final int RING_GARNET = 34; + public static final int RING_RUBY = 35; + public static final int RING_AMETHYST = 36; + public static final int RING_TOPAZ = 37; + public static final int RING_ONYX = 38; + public static final int RING_TOURMALINE = 39; + public static final int RING_EMERALD = 72; + public static final int RING_SAPPHIRE = 73; + public static final int RING_QUARTZ = 74; + public static final int RING_AGATE = 75; + + // Potions + public static final int POTION_TURQUOISE = 56; + public static final int POTION_CRIMSON = 57; + public static final int POTION_AZURE = 58; + public static final int POTION_JADE = 59; + public static final int POTION_GOLDEN = 60; + public static final int POTION_MAGENTA = 61; + public static final int POTION_CHARCOAL = 62; + public static final int POTION_IVORY = 63; + public static final int POTION_AMBER = 64; + public static final int POTION_BISTRE = 65; + public static final int POTION_INDIGO = 66; + public static final int POTION_SILVER = 67; + + // Scrolls + public static final int SCROLL_KAUNAN = 40; + public static final int SCROLL_SOWILO = 41; + public static final int SCROLL_LAGUZ = 42; + public static final int SCROLL_YNGVI = 43; + public static final int SCROLL_GYFU = 44; + public static final int SCROLL_RAIDO = 45; + public static final int SCROLL_ISAZ = 46; + public static final int SCROLL_MANNAZ = 47; + public static final int SCROLL_NAUDIZ = 76; + public static final int SCROLL_BERKANAN = 77; + public static final int SCROLL_ODAL = 78; + public static final int SCROLL_TIWAZ = 79; + + // Seeds + public static final int SEED_FIREBLOOM = 88; + public static final int SEED_ICECAP = 89; + public static final int SEED_SORROWMOSS = 90; + public static final int SEED_BLINDWEED = 91; + public static final int SEED_SUNGRASS = 92; + public static final int SEED_EARTHROOT = 93; + public static final int SEED_FADELEAF = 94; + public static final int SEED_ROTBERRY = 95; + + // Quest items + public static final int ROSE = 100; + public static final int PICKAXE = 101; + public static final int ORE = 102; + public static final int SKULL = 103; + public static final int DUST = 121; + public static final int TOKEN = 122; + + // Heaps (containers) + public static final int BONES = 0; + public static final int CHEST = 11; + public static final int LOCKED_CHEST = 12; + public static final int TOMB = 13; + public static final int CRYSTAL_CHEST = 105; + + // Food + public static final int RATION = 4; + public static final int PASTY = 112; + public static final int MEAT = 113; + public static final int STEAK = 114; + public static final int OVERPRICED = 115; + public static final int CARPACCIO = 116; + + // Bags + public static final int POUCH = 83; + public static final int HOLDER = 104; + public static final int HOLSTER = 111; + + // Misc + public static final int ANKH = 1; + public static final int GOLD = 14; + public static final int STYLUS = 80; + public static final int DEWDROP = 81; + public static final int MASTERY = 82; + public static final int TORCH = 84; + public static final int BEACON = 85; + public static final int KIT = 86; + public static final int AMULET = 87; + public static final int VIAL = 120; +} diff --git a/src/com/watabou/pixeldungeon/sprites/KingSprite.java b/src/com/watabou/pixeldungeon/sprites/KingSprite.java new file mode 100644 index 0000000000..30b45aea9f --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/KingSprite.java @@ -0,0 +1,46 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class KingSprite extends MobSprite { + + public KingSprite() { + super(); + + texture( Assets.KING ); + + TextureFilm frames = new TextureFilm( texture, 16, 16 ); + + idle = new Animation( 12, true ); + idle.frames( frames, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2 ); + + run = new Animation( 15, true ); + run.frames( frames, 3, 4, 5, 6, 7, 8 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 9, 10, 11 ); + + die = new Animation( 8, false ); + die.frames( frames, 12, 13, 14, 15 ); + + play( idle ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/LarvaSprite.java b/src/com/watabou/pixeldungeon/sprites/LarvaSprite.java new file mode 100644 index 0000000000..bb11bd44d2 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/LarvaSprite.java @@ -0,0 +1,58 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.effects.Splash; + +public class LarvaSprite extends MobSprite { + + public LarvaSprite() { + super(); + + texture( Assets.LARVA ); + + TextureFilm frames = new TextureFilm( texture, 12, 8 ); + + idle = new Animation( 5, true ); + idle.frames( frames, 4, 4, 4, 4, 4, 5, 5 ); + + run = new Animation( 12, true ); + run.frames( frames, 0, 1, 2, 3 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 6, 5, 7 ); + + die = new Animation( 10, false ); + die.frames( frames, 8 ); + + play( idle ); + } + + @Override + public int blood() { + return 0xbbcc66; + } + + @Override + public void die() { + Splash.at( center(), blood(), 10 ); + super.die(); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/MirrorSprite.java b/src/com/watabou/pixeldungeon/sprites/MirrorSprite.java new file mode 100644 index 0000000000..0f9335a61d --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/MirrorSprite.java @@ -0,0 +1,61 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.npcs.MirrorImage; + +public class MirrorSprite extends MobSprite { + + private static final int FRAME_WIDTH = 12; + private static final int FRAME_HEIGHT = 15; + + public MirrorSprite() { + super(); + + texture( Dungeon.hero.heroClass.spritesheet() ); + updateArmor( 0 ); + idle(); + } + + @Override + public void link( Char ch ) { + super.link( ch ); + updateArmor( ((MirrorImage)ch).tier ); + } + + 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(); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/MissileSprite.java b/src/com/watabou/pixeldungeon/sprites/MissileSprite.java new file mode 100644 index 0000000000..2b3f46044d --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/MissileSprite.java @@ -0,0 +1,78 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.tweeners.PosTweener; +import com.watabou.noosa.tweeners.Tweener; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.utils.Callback; +import com.watabou.utils.PointF; + +public class MissileSprite extends ItemSprite implements Tweener.Listener { + + private static final float SPEED = 240f; + + private Callback callback; + + public MissileSprite() { + super(); + originToCenter(); + } + + public void reset( int from, int to, Item item, Callback listener ) { + if (item == null) { + reset( from, to, 0, null, listener ); + } else { + reset( from, to, item.image(), item.glowing(), listener ); + } + } + + public void reset( int from, int to, int image, Glowing glowing, Callback listener ) { + revive(); + + view( image, glowing ); + + this.callback = listener; + + point( DungeonTilemap.tileToWorld( from ) ); + PointF dest = DungeonTilemap.tileToWorld( to ); + + PointF d = PointF.diff( dest, point() ); + speed.set( d ).normalize().scale( SPEED ); + + if (image == 31 || image == 108 || image == 109 || image == 110) { + angularSpeed = 0; + angle = 135 - (float)(Math.atan2( d.x, d.y ) / 3.1415926 * 180); + } else { + angularSpeed = image == 15 || image == 106 ? 1440 : 720; + } + + PosTweener tweener = new PosTweener( this, dest, d.length() / SPEED ); + tweener.listener = this; + parent.add( tweener ); + } + + @Override + public void onComplete( Tweener tweener ) { + kill(); + if (callback != null) { + callback.call(); + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/MobSprite.java b/src/com/watabou/pixeldungeon/sprites/MobSprite.java new file mode 100644 index 0000000000..bbe59b0383 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/MobSprite.java @@ -0,0 +1,73 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.tweeners.AlphaTweener; +import com.watabou.noosa.tweeners.ScaleTweener; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.utils.PointF; +import com.watabou.utils.Random; + +public class MobSprite extends CharSprite { + + private static final float FADE_TIME = 3f; + private static final float FALL_TIME = 1f; + + @Override + public void update() { + sleeping = ch != null && ((Mob)ch).state == Mob.State.SLEEPING; + + super.update(); + } + + @Override + public void onComplete( Animation anim ) { + + super.onComplete( anim ); + + if (anim == die) { + parent.add( new AlphaTweener( this, 0, FADE_TIME ) { + @Override + protected void onComplete() { + MobSprite.this.killAndErase(); + parent.erase( this ); + }; + } ); + } + } + + public void fall() { + + origin.set( width / 2, height - DungeonTilemap.SIZE / 2 ); + angularSpeed = Random.Int( 2 ) == 0 ? -720 : 720; + + parent.add( new ScaleTweener( this, new PointF( 0, 0 ), FALL_TIME ) { + @Override + protected void onComplete() { + MobSprite.this.killAndErase(); + parent.erase( this ); + }; + @Override + protected void updateValues( float progress ) { + super.updateValues( progress ); + am = 1 - progress; + } + } ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/MonkSprite.java b/src/com/watabou/pixeldungeon/sprites/MonkSprite.java new file mode 100644 index 0000000000..6dedb1dc71 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/MonkSprite.java @@ -0,0 +1,65 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.utils.Random; + +public class MonkSprite extends MobSprite { + + private Animation kick; + + public MonkSprite() { + super(); + + texture( Assets.MONK ); + + TextureFilm frames = new TextureFilm( texture, 15, 14 ); + + idle = new Animation( 6, true ); + idle.frames( frames, 1, 0, 1, 2 ); + + run = new Animation( 15, true ); + run.frames( frames, 11, 12, 13, 14, 15, 16 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 3, 4, 3, 4 ); + + kick = new Animation( 10, false ); + kick.frames( frames, 5, 6, 5 ); + + die = new Animation( 15, false ); + die.frames( frames, 1, 7, 8, 8, 9, 10 ); + + play( idle ); + } + + @Override + public void attack( int cell ) { + super.attack( cell ); + if (Random.Float() < 0.5f) { + play( kick ); + } + } + + @Override + public void onComplete( Animation anim ) { + super.onComplete( anim == kick ? attack : anim ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/PiranhaSprite.java b/src/com/watabou/pixeldungeon/sprites/PiranhaSprite.java new file mode 100644 index 0000000000..77d128577d --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/PiranhaSprite.java @@ -0,0 +1,56 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.scenes.GameScene; + +public class PiranhaSprite extends MobSprite { + + public PiranhaSprite() { + super(); + + texture( Assets.PIRANHA ); + + TextureFilm frames = new TextureFilm( texture, 12, 16 ); + + idle = new Animation( 8, true ); + idle.frames( frames, 0, 1, 2, 1 ); + + run = new Animation( 20, true ); + run.frames( frames, 0, 1, 2, 1 ); + + attack = new Animation( 20, false ); + attack.frames( frames, 3, 4, 5, 6, 7, 8, 9, 10, 11 ); + + die = new Animation( 4, false ); + die.frames( frames, 12, 13, 14 ); + + play( idle ); + } + + @Override + public void onComplete( Animation anim ) { + super.onComplete( anim ); + + if (anim == attack) { + GameScene.ripple( ch.pos ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/PlantSprite.java b/src/com/watabou/pixeldungeon/sprites/PlantSprite.java new file mode 100644 index 0000000000..e4acaa4bef --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/PlantSprite.java @@ -0,0 +1,110 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.plants.Plant; + +public class PlantSprite extends Image { + + private static final float DELAY = 0.2f; + + private static enum State { + GROWING, NORMAL, WITHERING + } + private State state = State.NORMAL; + private float time; + + private static TextureFilm frames; + + private int pos = -1; + + public PlantSprite() { + super( Assets.PLANTS ); + + if (frames == null) { + // Hardcoded size + frames = new TextureFilm( texture, 16, 16 ); + } + + // Hardcoded origin + origin.set( 8, 12 ); + } + + public PlantSprite( int image ) { + this(); + reset( image ); + } + + public void reset( Plant plant ) { + + revive(); + + reset( plant.image ); + alpha( 1f ); + + pos = plant.pos; + x = pos % Level.WIDTH * DungeonTilemap.SIZE; + y = pos / Level.WIDTH * DungeonTilemap.SIZE; + + state = State.GROWING; + time = DELAY; + } + + public void reset( int image ) { + frame( frames.get( image ) ); + } + + @Override + public void update() { + super.update(); + + visible = pos == -1 || Dungeon.visible[pos]; + + switch (state) { + case GROWING: + if ((time -= Game.elapsed) <= 0) { + state = State.NORMAL; + scale.set( 1 ); + } else { + scale.set( 1 - time / DELAY ); + } + break; + case WITHERING: + if ((time -= Game.elapsed) <= 0) { + super.kill(); + } else { + alpha( time / DELAY ); + } + break; + default: + } + } + + @Override + public void kill() { + state = State.WITHERING; + time = DELAY; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/RatKingSprite.java b/src/com/watabou/pixeldungeon/sprites/RatKingSprite.java new file mode 100644 index 0000000000..c0350bff4c --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/RatKingSprite.java @@ -0,0 +1,46 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class RatKingSprite extends MobSprite { + + public RatKingSprite() { + super(); + + texture( Assets.RATKING ); + + TextureFilm frames = new TextureFilm( texture, 16, 16 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 0, 0, 0, 1 ); + + run = new Animation( 10, true ); + run.frames( frames, 2, 3, 4, 5, 6 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 0 ); + + die = new Animation( 10, false ); + die.frames( frames, 0 ); + + play( idle ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/RatSprite.java b/src/com/watabou/pixeldungeon/sprites/RatSprite.java new file mode 100644 index 0000000000..5cf5494fe5 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/RatSprite.java @@ -0,0 +1,46 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class RatSprite extends MobSprite { + + public RatSprite() { + super(); + + texture( Assets.RAT ); + + TextureFilm frames = new TextureFilm( texture, 16, 15 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 0, 0, 0, 1 ); + + run = new Animation( 10, true ); + run.frames( frames, 6, 7, 8, 9, 10 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 2, 3, 4, 5, 0 ); + + die = new Animation( 10, false ); + die.frames( frames, 11, 12, 13, 14 ); + + play( idle ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/RottingFistSprite.java b/src/com/watabou/pixeldungeon/sprites/RottingFistSprite.java new file mode 100644 index 0000000000..76872c53bd --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/RottingFistSprite.java @@ -0,0 +1,69 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.Camera; +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class RottingFistSprite extends MobSprite { + + private static final float FALL_SPEED = 64; + + public RottingFistSprite() { + super(); + + texture( Assets.ROTTING ); + + TextureFilm frames = new TextureFilm( texture, 24, 17 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 0, 0, 1 ); + + run = new Animation( 3, true ); + run.frames( frames, 0, 1 ); + + attack = new Animation( 2, false ); + attack.frames( frames, 0 ); + + die = new Animation( 10, false ); + die.frames( frames, 0, 2, 3, 4 ); + + play( idle ); + } + + @Override + public void attack( int cell ) { + super.attack( cell ); + + speed.set( 0, -FALL_SPEED ); + acc.set( 0, FALL_SPEED * 4 ); + } + + @Override + public void onComplete( Animation anim ) { + super.onComplete( anim ); + if (anim == attack) { + speed.set( 0 ); + acc.set( 0 ); + place( ch.pos ); + + Camera.main.shake( 4, 0.2f ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/ScorpioSprite.java b/src/com/watabou/pixeldungeon/sprites/ScorpioSprite.java new file mode 100644 index 0000000000..c730ca2f46 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/ScorpioSprite.java @@ -0,0 +1,90 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.items.weapon.missiles.Dart; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.utils.Callback; + +public class ScorpioSprite extends MobSprite { + + private int cellToAttack; + + public ScorpioSprite() { + super(); + + texture( Assets.SCORPIO ); + + TextureFilm frames = new TextureFilm( texture, 18, 17 ); + + idle = new Animation( 12, true ); + idle.frames( frames, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2 ); + + run = new Animation( 8, true ); + run.frames( frames, 5, 5, 6, 6 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 0, 3, 4 ); + + zap = attack.clone(); + + die = new Animation( 12, false ); + die.frames( frames, 0, 7, 8, 9, 10 ); + + play( idle ); + } + + @Override + public int blood() { + return 0xFF44FF22; + } + + @Override + public void attack( int cell ) { + if (!Level.adjacent( cell, ch.pos )) { + + cellToAttack = cell; + turnTo( ch.pos , cell ); + play( zap ); + + } else { + + super.attack( cell ); + + } + } + + @Override + public void onComplete( Animation anim ) { + if (anim == zap) { + idle(); + + ((MissileSprite)parent.recycle( MissileSprite.class )). + reset( ch.pos, cellToAttack, new Dart(), new Callback() { + @Override + public void call() { + ch.onAttackComplete(); + } + } ); + } else { + super.onComplete( anim ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/SeniorSprite.java b/src/com/watabou/pixeldungeon/sprites/SeniorSprite.java new file mode 100644 index 0000000000..c32d2d4e65 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/SeniorSprite.java @@ -0,0 +1,65 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.utils.Random; + +public class SeniorSprite extends MobSprite { + + private Animation kick; + + public SeniorSprite() { + super(); + + texture( Assets.MONK ); + + TextureFilm frames = new TextureFilm( texture, 15, 14 ); + + idle = new Animation( 6, true ); + idle.frames( frames, 18, 17, 18, 19 ); + + run = new Animation( 15, true ); + run.frames( frames, 28, 29, 30, 31, 32, 33 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 20, 21, 20, 21 ); + + kick = new Animation( 10, false ); + kick.frames( frames, 22, 23, 22 ); + + die = new Animation( 15, false ); + die.frames( frames, 18, 24, 25, 25, 26, 27 ); + + play( idle ); + } + + @Override + public void attack( int cell ) { + super.attack( cell ); + if (Random.Float() < 0.3f) { + play( kick ); + } + } + + @Override + public void onComplete( Animation anim ) { + super.onComplete( anim == kick ? attack : anim ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/ShamanSprite.java b/src/com/watabou/pixeldungeon/sprites/ShamanSprite.java new file mode 100644 index 0000000000..8aefaf3a92 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/ShamanSprite.java @@ -0,0 +1,62 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.mobs.Shaman; +import com.watabou.pixeldungeon.effects.Lightning; + +public class ShamanSprite extends MobSprite { + + private int[] points = new int[2]; + + public ShamanSprite() { + super(); + + texture( Assets.SHAMAN ); + + TextureFilm frames = new TextureFilm( texture, 12, 15 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 0, 0, 0, 1, 0, 0, 1, 1 ); + + run = new Animation( 12, true ); + run.frames( frames, 4, 5, 6, 7 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 2, 3, 0 ); + + zap = attack.clone(); + + die = new Animation( 12, false ); + die.frames( frames, 8, 9, 10 ); + + play( idle ); + } + + public void zap( int pos ) { + + points[0] = ch.pos; + points[1] = pos; + parent.add( new Lightning( points, 2, (Shaman)ch ) ); + + turnTo( ch.pos, pos ); + play( zap ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/SheepSprite.java b/src/com/watabou/pixeldungeon/sprites/SheepSprite.java new file mode 100644 index 0000000000..bd733e9d19 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/SheepSprite.java @@ -0,0 +1,45 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.utils.Random; + +public class SheepSprite extends MobSprite { + + public SheepSprite() { + super(); + + texture( Assets.SHEEP ); + + TextureFilm frames = new TextureFilm( texture, 16, 15 ); + + idle = new Animation( 8, true ); + idle.frames( frames, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0 ); + + run = idle.clone(); + attack = idle.clone(); + + die = new Animation( 20, false ); + die.frames( frames, 0 ); + + play( idle ); + curFrame = Random.Int( curAnim.frames.length ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/ShieldedSprite.java b/src/com/watabou/pixeldungeon/sprites/ShieldedSprite.java new file mode 100644 index 0000000000..705232b43f --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/ShieldedSprite.java @@ -0,0 +1,46 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class ShieldedSprite extends MobSprite { + + public ShieldedSprite() { + super(); + + texture( Assets.BRUTE ); + + TextureFilm frames = new TextureFilm( texture, 12, 16 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 21, 21, 21, 22, 21, 21, 22, 22 ); + + run = new Animation( 12, true ); + run.frames( frames, 25, 26, 27, 28 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 23, 24 ); + + die = new Animation( 12, false ); + die.frames( frames, 29, 30, 31 ); + + play( idle ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/ShopkeeperSprite.java b/src/com/watabou/pixeldungeon/sprites/ShopkeeperSprite.java new file mode 100644 index 0000000000..a7094e0695 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/ShopkeeperSprite.java @@ -0,0 +1,58 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.particles.PixelParticle; +import com.watabou.pixeldungeon.Assets; + +public class ShopkeeperSprite extends MobSprite { + + private PixelParticle coin; + + public ShopkeeperSprite() { + super(); + + texture( Assets.KEEPER ); + TextureFilm film = new TextureFilm( texture, 14, 14 ); + + idle = new Animation( 10, true ); + idle.frames( film, 1, 1, 1, 1, 1, 0, 0, 0, 0 ); + + run = idle.clone(); + die = idle.clone(); + attack = idle.clone(); + + idle(); + } + + @Override + public void onComplete( Animation anim ) { + super.onComplete( anim ); + + if (visible && anim == idle) { + if (coin == null) { + coin = new PixelParticle(); + parent.add( coin ); + } + coin.reset( x + (flipHorizontal ? 0 : 13), y + 7, 0xFFFF00, 1, 0.5f ); + coin.speed.y = -40; + coin.acc.y = +160; + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/SkeletonSprite.java b/src/com/watabou/pixeldungeon/sprites/SkeletonSprite.java new file mode 100644 index 0000000000..4340d0dc6a --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/SkeletonSprite.java @@ -0,0 +1,61 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.effects.Speck; + +public class SkeletonSprite extends MobSprite { + + public SkeletonSprite() { + super(); + + texture( Assets.SKELETON ); + + TextureFilm frames = new TextureFilm( texture, 12, 15 ); + + idle = new Animation( 12, true ); + idle.frames( frames, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 ); + + run = new Animation( 15, true ); + run.frames( frames, 4, 5, 6, 7, 8, 9 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 14, 15, 16 ); + + die = new Animation( 12, false ); + die.frames( frames, 10, 11, 12, 13 ); + + play( idle ); + } + + @Override + public void die() { + super.die(); + if (Dungeon.visible[ch.pos]) { + emitter().burst( Speck.factory( Speck.BONE ), 6 ); + } + } + + @Override + public int blood() { + return 0xFFcccccc; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/SpinnerSprite.java b/src/com/watabou/pixeldungeon/sprites/SpinnerSprite.java new file mode 100644 index 0000000000..87f73c50d1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/SpinnerSprite.java @@ -0,0 +1,51 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class SpinnerSprite extends MobSprite { + + public SpinnerSprite() { + super(); + + texture( Assets.SPINNER ); + + TextureFilm frames = new TextureFilm( texture, 16, 16 ); + + idle = new Animation( 10, true ); + idle.frames( frames, 0, 0, 0, 0, 0, 1, 0, 1 ); + + run = new Animation( 15, true ); + run.frames( frames, 0, 2, 0, 3 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 0, 4, 5, 0 ); + + die = new Animation( 12, false ); + die.frames( frames, 6, 7, 8, 9 ); + + play( idle ); + } + + @Override + public int blood() { + return 0xFFBFE5B8; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/StatueSprite.java b/src/com/watabou/pixeldungeon/sprites/StatueSprite.java new file mode 100644 index 0000000000..39be3052a1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/StatueSprite.java @@ -0,0 +1,51 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class StatueSprite extends MobSprite { + + public StatueSprite() { + super(); + + texture( Assets.STATUE ); + + TextureFilm frames = new TextureFilm( texture, 12, 15 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 0, 0, 0, 0, 0, 1, 1 ); + + run = new Animation( 15, true ); + run.frames( frames, 2, 3, 4, 5, 6, 7 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 8, 9, 10 ); + + die = new Animation( 5, false ); + die.frames( frames, 11, 12, 13, 14, 15, 15 ); + + play( idle ); + } + + @Override + public int blood() { + return 0xFFcdcdb7; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/SuccubusSprite.java b/src/com/watabou/pixeldungeon/sprites/SuccubusSprite.java new file mode 100644 index 0000000000..95fd8cdbf1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/SuccubusSprite.java @@ -0,0 +1,55 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.particles.ShadowParticle; + +public class SuccubusSprite extends MobSprite { + + public SuccubusSprite() { + super(); + + texture( Assets.SUCCUBUS ); + + TextureFilm frames = new TextureFilm( texture, 12, 15 ); + + idle = new Animation( 8, true ); + idle.frames( frames, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 1 ); + + run = new Animation( 15, true ); + run.frames( frames, 3, 4, 5, 6, 7, 8 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 9, 10, 11 ); + + die = new Animation( 10, false ); + die.frames( frames, 12 ); + + play( idle ); + } + + @Override + public void die() { + super.die(); + emitter().burst( Speck.factory( Speck.HEART ), 6 ); + emitter().burst( ShadowParticle.UP, 8 ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/SwarmSprite.java b/src/com/watabou/pixeldungeon/sprites/SwarmSprite.java new file mode 100644 index 0000000000..d9a97ef5fb --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/SwarmSprite.java @@ -0,0 +1,51 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class SwarmSprite extends MobSprite { + + public SwarmSprite() { + super(); + + texture( Assets.SWARM ); + + TextureFilm frames = new TextureFilm( texture, 16, 16 ); + + idle = new Animation( 15, true ); + idle.frames( frames, 0, 1, 2, 3, 4, 5 ); + + run = new Animation( 15, true ); + run.frames( frames, 0, 1, 2, 3, 4, 5 ); + + attack = new Animation( 20, false ); + attack.frames( frames, 6, 7, 8, 9 ); + + die = new Animation( 15, false ); + die.frames( frames, 10, 11, 12, 13, 14 ); + + play( idle ); + } + + @Override + public int blood() { + return 0xFF8BA077; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/TenguSprite.java b/src/com/watabou/pixeldungeon/sprites/TenguSprite.java new file mode 100644 index 0000000000..16fd336121 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/TenguSprite.java @@ -0,0 +1,99 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.items.weapon.missiles.Shuriken; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.utils.Callback; + +public class TenguSprite extends MobSprite { + + private Animation cast; + + public TenguSprite() { + super(); + + texture( Assets.TENGU ); + + TextureFilm frames = new TextureFilm( texture, 14, 16 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 0, 0, 0, 1 ); + + run = new Animation( 15, false ); + run.frames( frames, 2, 3, 4, 5, 0 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 6, 7, 7, 0 ); + + cast = attack.clone(); + + die = new Animation( 8, false ); + die.frames( frames, 8, 9, 10, 10, 10, 10, 10, 10 ); + + play( run.clone() ); + } + + @Override + public void move( int from, int to ) { + + place( to ); + + play( run ); + turnTo( from , to ); + + if (Level.water[to]) { + GameScene.ripple( to ); + } + } + + @Override + public void attack( int cell ) { + if (!Level.adjacent( cell, ch.pos )) { + + ((MissileSprite)parent.recycle( MissileSprite.class )). + reset( ch.pos, cell, new Shuriken(), new Callback() { + @Override + public void call() { + ch.onAttackComplete(); + } + } ); + + play( cast ); + turnTo( ch.pos , cell ); + + } else { + + super.attack( cell ); + + } + } + + @Override + public void onComplete( Animation anim ) { + if (anim == run) { + idle(); + ch.onMotionComplete(); + } else { + super.onComplete( anim ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/ThiefSprite.java b/src/com/watabou/pixeldungeon/sprites/ThiefSprite.java new file mode 100644 index 0000000000..b1cb86fabb --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/ThiefSprite.java @@ -0,0 +1,45 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class ThiefSprite extends MobSprite { + + public ThiefSprite() { + super(); + + texture( Assets.THIEF ); + TextureFilm film = new TextureFilm( texture, 12, 13 ); + + idle = new Animation( 1, true ); + idle.frames( film, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); + + run = new Animation( 15, true ); + run.frames( film, 0, 0, 2, 3, 3, 4 ); + + die = new Animation( 10, false ); + die.frames( film, 5, 6, 7, 8, 9 ); + + attack = new Animation( 12, false ); + attack.frames( film, 10, 11, 12, 0 ); + + idle(); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/UndeadSprite.java b/src/com/watabou/pixeldungeon/sprites/UndeadSprite.java new file mode 100644 index 0000000000..52c5d5d599 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/UndeadSprite.java @@ -0,0 +1,61 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.effects.Speck; + +public class UndeadSprite extends MobSprite { + + public UndeadSprite() { + super(); + + texture( Assets.UNDEAD ); + + TextureFilm frames = new TextureFilm( texture, 12, 16 ); + + idle = new Animation( 12, true ); + idle.frames( frames, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 ); + + run = new Animation( 15, true ); + run.frames( frames, 4, 5, 6, 7, 8, 9 ); + + attack = new Animation( 15, false ); + attack.frames( frames, 14, 15, 16 ); + + die = new Animation( 12, false ); + die.frames( frames, 10, 11, 12, 13 ); + + play( idle ); + } + + @Override + public void die() { + super.die(); + if (Dungeon.visible[ch.pos]) { + emitter().burst( Speck.factory( Speck.BONE ), 3 ); + } + } + + @Override + public int blood() { + return 0xFFcccccc; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/WandmakerSprite.java b/src/com/watabou/pixeldungeon/sprites/WandmakerSprite.java new file mode 100644 index 0000000000..f4f29902b6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/WandmakerSprite.java @@ -0,0 +1,120 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import javax.microedition.khronos.opengles.GL10; + +import android.opengl.GLES20; + +import com.watabou.noosa.Game; +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.effects.Halo; +import com.watabou.pixeldungeon.effects.particles.ElmoParticle; +import com.watabou.utils.PointF; + +public class WandmakerSprite extends MobSprite { + + private Shield shield; + + public WandmakerSprite() { + super(); + + texture( Assets.MAKER ); + + TextureFilm frames = new TextureFilm( texture, 12, 14 ); + + idle = new Animation( 10, true ); + idle.frames( frames, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 3, 3, 2, 1 ); + + run = new Animation( 20, true ); + run.frames( frames, 0 ); + + die = new Animation( 20, false ); + die.frames( frames, 0 ); + + play( idle ); + } + + @Override + public void link( Char ch ) { + super.link( ch ); + + if (shield == null) { + parent.add( shield = new Shield() ); + } + } + + @Override + public void die() { + super.die(); + + if (shield != null) { + shield.putOut(); + } + emitter().start( ElmoParticle.FACTORY, 0.03f, 60 ); + } + + public class Shield extends Halo { + + private float phase; + + public Shield() { + + super( 14, 0xBBAACC, 1f ); + + am = -1; + aa = +1; + + phase = 1; + } + + @Override + public void update() { + super.update(); + + if (phase < 1) { + if ((phase -= Game.elapsed) <= 0) { + killAndErase(); + } else { + scale.set( (2 - phase) * radius / RADIUS ); + am = phase * (-1); + aa = phase * (+1); + } + } + + if (visible = WandmakerSprite.this.visible) { + PointF p = WandmakerSprite.this.center(); + point(p.x, p.y ); + } + } + + @Override + public void draw() { + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE ); + super.draw(); + GLES20.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); + } + + public void putOut() { + phase = 0.999f; + } + } + +} diff --git a/src/com/watabou/pixeldungeon/sprites/WarlockSprite.java b/src/com/watabou/pixeldungeon/sprites/WarlockSprite.java new file mode 100644 index 0000000000..21c51ab3a9 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/WarlockSprite.java @@ -0,0 +1,75 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.mobs.Warlock; +import com.watabou.pixeldungeon.effects.MagicMissile; +import com.watabou.utils.Callback; + +public class WarlockSprite extends MobSprite { + + public WarlockSprite() { + super(); + + texture( Assets.WARLOCK ); + + TextureFilm frames = new TextureFilm( texture, 12, 15 ); + + idle = new Animation( 2, true ); + idle.frames( frames, 0, 0, 0, 1, 0, 0, 1, 1 ); + + run = new Animation( 15, true ); + run.frames( frames, 0, 2, 3, 4 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 0, 5, 6 ); + + zap = attack.clone(); + + die = new Animation( 15, false ); + die.frames( frames, 0, 7, 8, 8, 9, 10 ); + + play( idle ); + } + + public void zap( int cell ) { + + turnTo( ch.pos , cell ); + play( zap ); + + MagicMissile.shadow( parent, ch.pos, cell, + new Callback() { + @Override + public void call() { + ((Warlock)ch).onZapComplete(); + } + } ); + Sample.INSTANCE.play( Assets.SND_ZAP ); + } + + @Override + public void onComplete( Animation anim ) { + if (anim == zap) { + idle(); + } + super.onComplete( anim ); + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/WraithSprite.java b/src/com/watabou/pixeldungeon/sprites/WraithSprite.java new file mode 100644 index 0000000000..1364948557 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/WraithSprite.java @@ -0,0 +1,51 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; + +public class WraithSprite extends MobSprite { + + public WraithSprite() { + super(); + + texture( Assets.WRAITH ); + + TextureFilm frames = new TextureFilm( texture, 14, 15 ); + + idle = new Animation( 5, true ); + idle.frames( frames, 0, 1 ); + + run = new Animation( 10, true ); + run.frames( frames, 0, 1 ); + + attack = new Animation( 10, false ); + attack.frames( frames, 0, 2, 3 ); + + die = new Animation( 8, false ); + die.frames( frames, 0, 4, 5, 6, 7 ); + + play( idle ); + } + + @Override + public int blood() { + return 0x88000000; + } +} diff --git a/src/com/watabou/pixeldungeon/sprites/YogSprite.java b/src/com/watabou/pixeldungeon/sprites/YogSprite.java new file mode 100644 index 0000000000..848f3240a2 --- /dev/null +++ b/src/com/watabou/pixeldungeon/sprites/YogSprite.java @@ -0,0 +1,54 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.sprites; + +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.effects.Splash; + +public class YogSprite extends MobSprite { + + public YogSprite() { + super(); + + texture( Assets.YOG ); + + TextureFilm frames = new TextureFilm( texture, 20, 19 ); + + idle = new Animation( 10, true ); + idle.frames( frames, 0, 1, 2, 2, 1, 0, 3, 4, 4, 3, 0, 5, 6, 6, 5 ); + + run = new Animation( 12, true ); + run.frames( frames, 0 ); + + attack = new Animation( 12, false ); + attack.frames( frames, 0 ); + + die = new Animation( 10, false ); + die.frames( frames, 0, 7, 8, 9 ); + + play( idle ); + } + + @Override + public void die() { + super.die(); + + Splash.at( center(), blood(), 12 ); + } +} diff --git a/src/com/watabou/pixeldungeon/ui/Archs.java b/src/com/watabou/pixeldungeon/ui/Archs.java new file mode 100644 index 0000000000..64579674fc --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/Archs.java @@ -0,0 +1,65 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.Game; +import com.watabou.noosa.SkinnedBlock; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.Assets; + +public class Archs extends Component { + + private static final float SCROLL_SPEED = 20f; + + private SkinnedBlock arcsBg; + private SkinnedBlock arcsFg; + + public boolean reversed = false; + + @Override + protected void createChildren() { + arcsBg = new SkinnedBlock( 1, 1, Assets.ARCS_BG ); + add( arcsBg ); + + arcsFg = new SkinnedBlock( 1, 1, Assets.ARCS_FG ); + add( arcsFg ); + } + + @Override + protected void layout() { + arcsBg.size( width, height ); + arcsBg.offset( arcsBg.texture.width / 4 - (width % arcsBg.texture.width) / 2, 0 ); + + arcsFg.size( width, height ); + arcsFg.offset( arcsFg.texture.width / 4 - (width % arcsFg.texture.width) / 2, 0 ); + } + + @Override + public void update() { + + super.update(); + + float shift = Game.elapsed * SCROLL_SPEED; + if (reversed) { + shift = -shift; + } + + arcsBg.offset( 0, shift ); + arcsFg.offset( 0, shift * 2 ); + } +} diff --git a/src/com/watabou/pixeldungeon/ui/AttackIndicator.java b/src/com/watabou/pixeldungeon/ui/AttackIndicator.java new file mode 100644 index 0000000000..7e64ede5f8 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/AttackIndicator.java @@ -0,0 +1,167 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import java.util.ArrayList; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.utils.Random; + +public class AttackIndicator extends Tag { + + private static final float ENABLED = 1.0f; + private static final float DISABLED = 0.3f; + + private static AttackIndicator instance; + + private CharSprite sprite = null; + + private static Mob lastTarget = null; + private ArrayList candidates = new ArrayList(); + + public AttackIndicator() { + super( DangerIndicator.COLOR ); + + instance = this; + + setSize( 24, 24 ); + visible( false ); + enable( false ); + } + + @Override + protected void createChildren() { + super.createChildren(); + } + + @Override + protected void layout() { + super.layout(); + + if (sprite != null) { + sprite.x = x + (width - sprite.width()) / 2; + sprite.y = y + (height - sprite.height()) / 2; + PixelScene.align( sprite ); + } + } + + @Override + public void update() { + super.update(); + + if (Dungeon.hero.isAlive()) { + + if (!Dungeon.hero.ready) { + enable( false ); + } + + } else { + visible( false ); + enable( false ); + } + } + + private void checkEnemies() { + + int heroPos = Dungeon.hero.pos; + candidates.clear(); + int v = Dungeon.hero.visibleEnemies(); + for (int i=0; i < v; i++) { + Mob mob = Dungeon.hero.visibleEnemy( i ); + if (Level.adjacent( heroPos, mob.pos )) { + candidates.add( mob ); + } + } + + if (!candidates.contains( lastTarget )) { + if (candidates.isEmpty()) { + lastTarget = null; + } else { + lastTarget = Random.element( candidates ); + updateImage(); + flash(); + } + } else { + if (!bg.visible) { + flash(); + } + } + + visible( lastTarget != null ); + enable( bg.visible ); + } + + private void updateImage() { + + if (sprite != null) { + sprite.killAndErase(); + sprite = null; + } + + try { + sprite = lastTarget.spriteClass.newInstance(); + sprite.idle(); + sprite.paused = true; + add( sprite ); + + sprite.x = x + (width - sprite.width()) / 2 + 1; + sprite.y = y + (height - sprite.height()) / 2; + PixelScene.align( sprite ); + + } catch (Exception e) { + } + } + + private boolean enabled = true; + private void enable( boolean value ) { + enabled = value; + if (sprite != null) { + sprite.alpha( value ? ENABLED : DISABLED ); + } + } + + private void visible( boolean value ) { + bg.visible = value; + if (sprite != null) { + sprite.visible = value; + } + } + + @Override + protected void onClick() { + if (enabled) { + Dungeon.hero.handle( lastTarget.pos ); + } + } + + public static void target( Char target ) { + lastTarget = (Mob)target; + instance.updateImage(); + + HealthIndicator.instance.target( target ); + } + + public static void updateState() { + instance.checkEnemies(); + } +} diff --git a/src/com/watabou/pixeldungeon/ui/BadgesList.java b/src/com/watabou/pixeldungeon/ui/BadgesList.java new file mode 100644 index 0000000000..044f6d04f1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/BadgesList.java @@ -0,0 +1,122 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import java.util.ArrayList; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.effects.BadgeBanner; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.windows.WndBadge; + +public class BadgesList extends ScrollPane { + + private ArrayList items = new ArrayList(); + + public BadgesList( boolean global ) { + super( new Component() ); + + for (Badges.Badge badge : Badges.filtered( global )) { + + if (badge.image == -1) { + continue; + } + + ListItem item = new ListItem( badge ); + content.add( item ); + items.add( item ); + } + } + + @Override + protected void layout() { + super.layout(); + + float pos = 0; + + int size = items.size(); + for (int i=0; i < size; i++) { + items.get( i ).setRect( 0, pos, width, ListItem.HEIGHT ); + pos += ListItem.HEIGHT; + } + + content.setSize( width, pos ); + } + + @Override + public void onClick( float x, float y ) { + int size = items.size(); + for (int i=0; i < size; i++) { + if (items.get( i ).onClick( x, y )) { + break; + } + } + } + + private class ListItem extends Component { + + private static final float HEIGHT = 20; + + private Badges.Badge badge; + + private Image icon; + private BitmapText label; + + public ListItem( Badges.Badge badge ) { + super(); + + this.badge = badge; + icon.copy( BadgeBanner.image( badge.image )); + label.text( badge.description ); + } + + @Override + protected void createChildren() { + icon = new Image(); + add( icon ); + + label = PixelScene.createText( 6 ); + add( label ); + } + + @Override + protected void layout() { + icon.x = x; + icon.y = PixelScene.align( y + (height - icon.height) / 2 ); + + label.x = icon.x + icon.width + 2; + label.y = PixelScene.align( y + (height - label.baseLine()) / 2 ); + } + + public boolean onClick( float x, float y ) { + if (inside( x, y )) { + Sample.INSTANCE.play( Assets.SND_CLICK, 0.7f, 0.7f, 1.2f ); + Game.scene().add( new WndBadge( badge ) ); + return true; + } else { + return false; + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/ui/Banner.java b/src/com/watabou/pixeldungeon/ui/Banner.java new file mode 100644 index 0000000000..2dcb59dbc1 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/Banner.java @@ -0,0 +1,101 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Image; + +public class Banner extends Image { + + private enum State { + FADE_IN, STATIC, FADE_OUT + }; + private State state; + + private float time; + + private int color; + private float fadeTime; + private float showTime; + + public Banner( Image sample ) { + super(); + copy( sample ); + alpha( 0 ); + } + + public Banner( Object tx ) { + super( tx ); + alpha( 0 ); + } + + public void show( int color, float fadeTime, float showTime ) { + + this.color = color; + this.fadeTime = fadeTime; + this.showTime = showTime; + + state = State.FADE_IN; + + time = fadeTime; + } + + public void show( int color, float fadeTime ) { + show( color, fadeTime, Float.MAX_VALUE ); + } + + @Override + public void update() { + super.update(); + + time -= Game.elapsed; + if (time >= 0) { + + float p = time / fadeTime; + + switch (state) { + case FADE_IN: + tint( color, p ); + alpha( 1 - p ); + break; + case STATIC: + break; + case FADE_OUT: + alpha( p ); + break; + } + + } else { + + switch (state) { + case FADE_IN: + time = showTime; + state = State.STATIC; + break; + case STATIC: + time = fadeTime; + state = State.FADE_OUT; + break; + case FADE_OUT: + killAndErase(); + break; + } + + } + } +} diff --git a/src/com/watabou/pixeldungeon/ui/BuffIndicator.java b/src/com/watabou/pixeldungeon/ui/BuffIndicator.java new file mode 100644 index 0000000000..080edc0f23 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/BuffIndicator.java @@ -0,0 +1,143 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.gltextures.SmartTexture; +import com.watabou.gltextures.TextureCache; +import com.watabou.noosa.Image; +import com.watabou.noosa.TextureFilm; +import com.watabou.noosa.tweeners.AlphaTweener; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.utils.SparseArray; + +public class BuffIndicator extends Component { + + public static final int NONE = -1; + + public static final int MIND_VISION = 0; + public static final int LEVITATION = 1; + public static final int FIRE = 2; + public static final int POISON = 3; + public static final int PARALYSIS = 4; + public static final int HUNGER = 5; + public static final int STARVATION = 6; + public static final int SLOW = 7; + public static final int OOZE = 8; + public static final int AMOK = 9; + public static final int TERROR = 10; + public static final int ROOTS = 11; + public static final int INVISIBLE = 12; + public static final int SHADOWS = 13; + public static final int WEAKNESS = 14; + public static final int FROST = 15; + public static final int BLINDNESS = 16; + public static final int COMBO = 17; + public static final int FURY = 18; + public static final int HEALING = 19; + public static final int ARMOR = 20; + public static final int HEART = 21; + public static final int LIGHT = 22; + public static final int CRIPPLE = 23; + public static final int BARKSKIN = 24; + public static final int IMMUNITY = 25; + public static final int BLEEDING = 26; + public static final int MARK = 27; + public static final int DEFERRED = 28; + + public static final int SIZE = 7; + + private static BuffIndicator heroInstance; + + private SmartTexture texture; + private TextureFilm film; + + private SparseArray icons = new SparseArray(); + + private Char ch; + + public BuffIndicator( Char ch ) { + super(); + + this.ch = ch; + if (ch == Dungeon.hero) { + heroInstance = this; + } + } + + @Override + public void destroy() { + super.destroy(); + + if (this == heroInstance) { + heroInstance = null; + } + } + + @Override + protected void createChildren() { + texture = TextureCache.get( Assets.BUFFS_SMALL ); + film = new TextureFilm( texture, SIZE, SIZE ); + } + + @Override + protected void layout() { + clear(); + + SparseArray newIcons = new SparseArray(); + + for (Buff buff : ch.buffs()) { + int icon = buff.icon(); + if (icon != NONE) { + Image img = new Image( texture ); + img.frame( film.get( icon ) ); + img.x = x + members.size() * (SIZE + 2); + img.y = y; + add( img ); + + newIcons.put( icon, img ); + } + } + + for (Integer key : icons.keyArray()) { + if (newIcons.get( key ) == null) { + Image icon = icons.get( key ); + icon.origin.set( SIZE / 2 ); + add( icon ); + add( new AlphaTweener( icon, 0, 0.6f ) { + @Override + protected void updateValues( float progress ) { + super.updateValues( progress ); + image.scale.set( 1 + 5 * progress ); + }; + } ); + } + } + + icons = newIcons; + } + + public static void refreshHero() { + if (heroInstance != null) { + heroInstance.layout(); + } + } +} diff --git a/src/com/watabou/pixeldungeon/ui/BusyIndicator.java b/src/com/watabou/pixeldungeon/ui/BusyIndicator.java new file mode 100644 index 0000000000..3486aa0f9e --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/BusyIndicator.java @@ -0,0 +1,38 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.Dungeon; + +public class BusyIndicator extends Image { + + public BusyIndicator() { + super(); + copy( Icons.BUSY.get() ); + + origin.set( width / 2, height / 2 ); + angularSpeed = 720; + } + + @Override + public void update() { + super.update(); + visible = Dungeon.hero.isAlive() && !Dungeon.hero.ready; + } +} diff --git a/src/com/watabou/pixeldungeon/ui/CheckBox.java b/src/com/watabou/pixeldungeon/ui/CheckBox.java new file mode 100644 index 0000000000..e736891f2e --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/CheckBox.java @@ -0,0 +1,61 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.pixeldungeon.scenes.PixelScene; + +public class CheckBox extends RedButton { + + private boolean checked = false; + + public CheckBox( String label ) { + super( label ); + + icon( Icons.get( Icons.UNCHECKED ) ); + } + + @Override + protected void layout() { + super.layout(); + + float margin = (height - text.baseLine()) / 2; + + text.x = PixelScene.align( PixelScene.uiCamera, x + margin ); + text.y = PixelScene.align( PixelScene.uiCamera, y + margin ); + + icon.x = PixelScene.align( PixelScene.uiCamera, x + width - margin - icon.width ); + icon.y = PixelScene.align( PixelScene.uiCamera, y + (height - icon.height()) / 2 ); + } + + public boolean checked() { + return checked; + } + + public void checked( boolean value ) { + if (checked != value) { + checked = value; + icon.copy( Icons.get( checked ? Icons.CHECKED : Icons.UNCHECKED ) ); + } + } + + @Override + protected void onClick() { + super.onClick(); + checked( !checked ); + } +} diff --git a/src/com/watabou/pixeldungeon/ui/Compass.java b/src/com/watabou/pixeldungeon/ui/Compass.java new file mode 100644 index 0000000000..8bba032b5a --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/Compass.java @@ -0,0 +1,64 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.Camera; +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.utils.PointF; + +public class Compass extends Image { + + private static final float RAD_2_G = 180f / 3.1415926f; + private static final float RADIUS = 12; + + private int cell; + private PointF cellCenter; + + private PointF lastScroll = new PointF(); + + public Compass( int cell ) { + + super(); + copy( Icons.COMPASS.get() ); + origin.set( width / 2, RADIUS ); + + this.cell = cell; + cellCenter = DungeonTilemap.tileCenterToWorld( cell ); + visible = false; + } + + @Override + public void update() { + super.update(); + + if (!visible) { + visible = Dungeon.level.visited[cell] || Dungeon.level.mapped[cell]; + } + + if (visible) { + PointF scroll = Camera.main.scroll; + if (!scroll.equals( lastScroll )) { + lastScroll.set( scroll ); + PointF center = Camera.main.center().offset( scroll ); + angle = (float)Math.atan2( cellCenter.x - center.x, center.y - cellCenter.y ) * RAD_2_G; + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/ui/DangerIndicator.java b/src/com/watabou/pixeldungeon/ui/DangerIndicator.java new file mode 100644 index 0000000000..3c90dfedc0 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/DangerIndicator.java @@ -0,0 +1,104 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Camera; +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.scenes.PixelScene; + +public class DangerIndicator extends Tag { + + public static final int COLOR = 0xFF4C4C; + + private BitmapText number; + private Image icon; + + private int enemyIndex = 0; + + private int lastNumber = -1; + + public DangerIndicator() { + super( 0xFF4C4C ); + + setSize( 24, 16 ); + + visible = false; + } + + @Override + protected void createChildren() { + super.createChildren(); + + number = new BitmapText( PixelScene.font1x ); + add( number ); + + icon = Icons.SKULL.get(); + add( icon ); + } + + @Override + protected void layout() { + super.layout(); + + icon.x = right() - 10; + icon.y = y + (height - icon.height) / 2; + + placeNumber(); + } + + private void placeNumber() { + number.x = right() - 11 - number.width(); + number.y = PixelScene.align( y + (height - number.baseLine()) / 2 ); + } + + @Override + public void update() { + + if (Dungeon.hero.isAlive()) { + int v = Dungeon.hero.visibleEnemies(); + if (v != lastNumber) { + lastNumber = v; + if (visible = (lastNumber > 0)) { + number.text( Integer.toString( lastNumber ) ); + number.measure(); + placeNumber(); + + flash(); + } + } + } else { + visible = false; + } + + super.update(); + } + + @Override + protected void onClick() { + + Mob target = Dungeon.hero.visibleEnemy( enemyIndex++ ); + + HealthIndicator.instance.target( target == HealthIndicator.instance.target() ? null : target ); + + Camera.main.target = null; + Camera.main.focusOn( target.sprite ); + } +} diff --git a/src/com/watabou/pixeldungeon/ui/GameLog.java b/src/com/watabou/pixeldungeon/ui/GameLog.java new file mode 100644 index 0000000000..188a84b146 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/GameLog.java @@ -0,0 +1,114 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import java.util.regex.Pattern; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; +import com.watabou.utils.Signal; + +public class GameLog extends Component implements Signal.Listener { + + private static final int MAX_MESSAGES = 3; + + private static final Pattern PUNCTUATION = Pattern.compile( ".*[.,;?! ]$" ); + + private BitmapTextMultiline lastEntry; + private int lastColor; + + public GameLog() { + super(); + GLog.update.add( this ); + + newLine(); + } + + public void newLine() { + lastEntry = null; + } + + @Override + public void onSignal( String text ) { + + int color = CharSprite.DEFAULT; + if (text.startsWith( GLog.POSITIVE )) { + text = text.substring( GLog.POSITIVE.length() ); + color = CharSprite.POSITIVE; + } else + if (text.startsWith( GLog.NEGATIVE )) { + text = text.substring( GLog.NEGATIVE.length() ); + color = CharSprite.NEGATIVE; + } else + if (text.startsWith( GLog.WARNING )) { + text = text.substring( GLog.WARNING.length() ); + color = CharSprite.WARNING; + } else + if (text.startsWith( GLog.HIGHLIGHT )) { + text = text.substring( GLog.HIGHLIGHT.length() ); + color = CharSprite.NEUTRAL; + } + + text = Utils.capitalize( text ) + + (PUNCTUATION.matcher( text ).matches() ? "" : "."); + + if (lastEntry != null && color == lastColor) { + + String lastMessage = lastEntry.text(); + lastEntry.text( lastMessage.length() == 0 ? text : lastMessage + " " + text ); + lastEntry.measure(); + + } else { + + lastEntry = PixelScene.createMultiline( text, 6 ); + lastEntry.maxWidth = (int)width; + lastEntry.measure(); + lastEntry.hardlight( color ); + lastColor = color; + add( lastEntry ); + + } + + if (length > MAX_MESSAGES) { + remove( members.get( 0 ) ); + } + + layout(); + } + + @Override + protected void layout() { + float pos = y; + for (int i=length-1; i >= 0; i--) { + BitmapTextMultiline entry = (BitmapTextMultiline)members.get( i ); + entry.x = x; + entry.y = pos - entry.height(); + pos -= entry.height(); + } + } + + @Override + public void destroy() { + GLog.update.remove( this ); + super.destroy(); + } +} diff --git a/src/com/watabou/pixeldungeon/ui/GoldIndicator.java b/src/com/watabou/pixeldungeon/ui/GoldIndicator.java new file mode 100644 index 0000000000..8586eb48b0 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/GoldIndicator.java @@ -0,0 +1,79 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Game; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.scenes.PixelScene; + +public class GoldIndicator extends Component { + + private static final float TIME = 2f; + + private int lastValue = 0; + + private BitmapText tf; + + private float time; + + @Override + protected void createChildren() { + tf = new BitmapText( PixelScene.font1x ); + tf.hardlight( 0xFFFF00 ); + add( tf ); + + visible = false; + } + + @Override + protected void layout() { + tf.x = x + (width - tf.width()) / 2; + tf.y = bottom() - tf.height(); + } + + @Override + public void update() { + super.update(); + + if (visible) { + + time -= Game.elapsed; + if (time > 0) { + tf.alpha( time > TIME / 2 ? 1f : time * 2 / TIME ); + } else { + visible = false; + } + + } + + if (Dungeon.gold != lastValue) { + + lastValue = Dungeon.gold; + + tf.text( Integer.toString( lastValue ) ); + tf.measure(); + + visible = true; + time = TIME; + + layout(); + } + } +} diff --git a/src/com/watabou/pixeldungeon/ui/HealthIndicator.java b/src/com/watabou/pixeldungeon/ui/HealthIndicator.java new file mode 100644 index 0000000000..6415569dce --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/HealthIndicator.java @@ -0,0 +1,82 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.gltextures.TextureCache; +import com.watabou.noosa.Image; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.sprites.CharSprite; + +public class HealthIndicator extends Component { + + private static final float HEIGHT = 2; + + public static HealthIndicator instance; + + private Char target; + + private Image bg; + private Image level; + + public HealthIndicator() { + super(); + + instance = this; + } + + @Override + protected void createChildren() { + bg = new Image( TextureCache.createSolid( 0xFFcc0000 ) ); + bg.scale.y = HEIGHT; + add( bg ); + + level = new Image( TextureCache.createSolid( 0xFF00cc00 ) ); + level.scale.y = HEIGHT; + add( level ); + } + + @Override + public void update() { + super.update(); + + if (target != null && target.isAlive() && target.sprite.visible) { + CharSprite sprite = target.sprite; + bg.scale.x = sprite.width; + level.scale.x = sprite.width * target.HP / target.HT; + bg.x = level.x = sprite.x; + bg.y = level.y = sprite.y - HEIGHT - 1; + + visible = true; + } else { + visible = false; + } + } + + public void target( Char ch ) { + if (ch != null && ch.isAlive()) { + target = ch; + } else { + target = null; + } + } + + public Char target() { + return target; + } +} diff --git a/src/com/watabou/pixeldungeon/ui/Icons.java b/src/com/watabou/pixeldungeon/ui/Icons.java new file mode 100644 index 0000000000..aedd8d4dbc --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/Icons.java @@ -0,0 +1,152 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.actors.hero.HeroClass; + +public enum Icons { + + SKULL, + BUSY, + COMPASS, + INFO, + PREFS, + WARNING, + TARGET, + MASTERY, + WATA, + WARRIOR, + MAGE, + ROGUE, + HUNTRESS, + CLOSE, + DEPTH, + SLEEP, + ALERT, + SUPPORT, + SUPPORTED, + BACKPACK, + SEED_POUCH, + SCROLL_HOLDER, + WAND_HOLSTER, + CHECKED, + UNCHECKED; + + public Image get() { + return get( this ); + } + + public static Image get( Icons type ) { + Image icon = new Image( Assets.ICONS ); + switch (type) { + case SKULL: + icon.frame( icon.texture.uvRect( 0, 0, 8, 8 ) ); + break; + case BUSY: + icon.frame( icon.texture.uvRect( 8, 0, 16, 8 ) ); + break; + case COMPASS: + icon.frame( icon.texture.uvRect( 0, 8, 7, 13 ) ); + break; + case INFO: + icon.frame( icon.texture.uvRect( 16, 0, 30, 14 ) ); + break; + case PREFS: + icon.frame( icon.texture.uvRect( 30, 0, 46, 16 ) ); + break; + case WARNING: + icon.frame( icon.texture.uvRect( 46, 0, 58, 12 ) ); + break; + case TARGET: + icon.frame( icon.texture.uvRect( 0, 13, 16, 29 ) ); + break; + case MASTERY: + icon.frame( icon.texture.uvRect( 16, 14, 30, 28 ) ); + break; + case WATA: + icon.frame( icon.texture.uvRect( 30, 16, 45, 26 ) ); + break; + case WARRIOR: + icon.frame( icon.texture.uvRect( 0, 29, 16, 45 ) ); + break; + case MAGE: + icon.frame( icon.texture.uvRect( 16, 29, 32, 45 ) ); + break; + case ROGUE: + icon.frame( icon.texture.uvRect( 32, 29, 48, 45 ) ); + break; + case HUNTRESS: + icon.frame( icon.texture.uvRect( 48, 29, 64, 45 ) ); + break; + case CLOSE: + icon.frame( icon.texture.uvRect( 0, 45, 13, 58 ) ); + break; + case DEPTH: + icon.frame( icon.texture.uvRect( 45, 12, 54, 20 ) ); + break; + case SLEEP: + icon.frame( icon.texture.uvRect( 13, 45, 22, 53 ) ); + break; + case ALERT: + icon.frame( icon.texture.uvRect( 22, 45, 30, 53 ) ); + break; + case SUPPORT: + icon.frame( icon.texture.uvRect( 30, 45, 46, 61 ) ); + break; + case SUPPORTED: + icon.frame( icon.texture.uvRect( 46, 45, 62, 61 ) ); + break; + case BACKPACK: + icon.frame( icon.texture.uvRect( 58, 0, 68, 10 ) ); + break; + case SCROLL_HOLDER: + icon.frame( icon.texture.uvRect( 68, 0, 78, 10 ) ); + break; + case SEED_POUCH: + icon.frame( icon.texture.uvRect( 78, 0, 88, 10 ) ); + break; + case WAND_HOLSTER: + icon.frame( icon.texture.uvRect( 88, 0, 98, 10 ) ); + break; + case CHECKED: + icon.frame( icon.texture.uvRect( 54, 12, 66, 24 ) ); + break; + case UNCHECKED: + icon.frame( icon.texture.uvRect( 66, 12, 78, 24 ) ); + break; + } + return icon; + } + + public static Image get( HeroClass cl ) { + switch (cl) { + case WARRIOR: + return get( WARRIOR ); + case MAGE: + return get( MAGE ); + case ROGUE: + return get( ROGUE ); + case HUNTRESS: + return get( HUNTRESS ); + default: + return null; + } + } +} diff --git a/src/com/watabou/pixeldungeon/ui/ItemSlot.java b/src/com/watabou/pixeldungeon/ui/ItemSlot.java new file mode 100644 index 0000000000..0b762707f5 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/ItemSlot.java @@ -0,0 +1,195 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.ui.Button; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.weapon.Weapon; +import com.watabou.pixeldungeon.items.weapon.melee.MeleeWeapon; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.utils.Utils; + +public class ItemSlot extends Button { + + public static final int DEGRADED = 0xFF4444; + public static final int UPGRADED = 0x44FF44; + public static final int WARNING = 0xFF8800; + + private static final float ENABLED = 1.0f; + private static final float DISABLED = 0.3f; + + protected ItemSprite icon; + protected BitmapText topLeft; + protected BitmapText topRight; + protected BitmapText bottomRight; + + private static final String TXT_STRENGTH = ":%d"; + private static final String TXT_TYPICAL_STR = "%d?"; + + private static final String TXT_LEVEL = "%+d"; + private static final String TXT_CURSED = ""; + + // Special items for containers + public static final Item CHEST = new Item() { + public int image() { return ItemSpriteSheet.CHEST; }; + }; + public static final Item LOCKED_CHEST = new Item() { + public int image() { return ItemSpriteSheet.LOCKED_CHEST; }; + }; + public static final Item TOMB = new Item() { + public int image() { return ItemSpriteSheet.TOMB; }; + }; + public static final Item SKELETON = new Item() { + public int image() { return ItemSpriteSheet.BONES; }; + }; + + public ItemSlot() { + super(); + } + + public ItemSlot( Item item ) { + this(); + item( item ); + } + + @Override + protected void createChildren() { + + super.createChildren(); + + icon = new ItemSprite(); + add( icon ); + + topLeft = new BitmapText( PixelScene.font1x ); + add( topLeft ); + + topRight = new BitmapText( PixelScene.font1x ); + add( topRight ); + + bottomRight = new BitmapText( PixelScene.font1x ); + add( bottomRight ); + } + + @Override + protected void layout() { + super.layout(); + + icon.x = x + (width - icon.width) / 2; + icon.y = y + (height - icon.height) / 2; + + if (topLeft != null) { + topLeft.x = x; + topLeft.y = y; + } + + if (topRight != null) { + topRight.x = x + (width - topRight.width()); + topRight.y = y; + } + + if (bottomRight != null) { + bottomRight.x = x + (width - bottomRight.width()); + bottomRight.y = y + (height - bottomRight.height()); + } + } + + public void item( Item item ) { + if (item == null) { + + active = false; + icon.visible = topLeft.visible = topRight.visible = bottomRight.visible = false; + + } else { + + active = true; + icon.visible = topLeft.visible = topRight.visible = bottomRight.visible = true; + + icon.view( item.image(), item.glowing() ); + + topLeft.text( item.status() ); + + boolean isArmor = item instanceof Armor; + boolean isWeapon = item instanceof Weapon; + if (isArmor || isWeapon) { + + if (item.levelKnown || (isWeapon && !(item instanceof MeleeWeapon))) { + + int str = isArmor ? ((Armor)item).STR : ((Weapon)item).STR; + topRight.text( Utils.format( TXT_STRENGTH, str ) ); + if (str > Dungeon.hero.STR()) { + topRight.hardlight( DEGRADED ); + } else { + topRight.resetColor(); + } + + } else { + + topRight.text( Utils.format( TXT_TYPICAL_STR, isArmor ? + ((Armor)item).typicalSTR() : + ((MeleeWeapon)item).typicalSTR() ) ); + topRight.hardlight( WARNING ); + + } + topRight.measure(); + + } else { + + topRight.text( null ); + + } + + int level = item.visiblyUpgraded(); + + if (level != 0 || (item.cursed && item.cursedKnown)) { + bottomRight.text( item.levelKnown ? Utils.format( TXT_LEVEL, level ) : TXT_CURSED ); + bottomRight.measure(); + bottomRight.hardlight( level > 0 ? UPGRADED : DEGRADED ); + } else { + bottomRight.text( null ); + } + + layout(); + } + } + + public void enable( boolean value ) { + + active = value; + + float alpha = value ? ENABLED : DISABLED; + icon.alpha( alpha ); + topLeft.alpha( alpha ); + topRight.alpha( alpha ); + bottomRight.alpha( alpha ); + } + + public void showParams( boolean value ) { + if (value) { + add( topRight ); + add( bottomRight ); + } else { + remove( topRight ); + remove( bottomRight ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/ui/LootIndicator.java b/src/com/watabou/pixeldungeon/ui/LootIndicator.java new file mode 100644 index 0000000000..dfaeee349d --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/LootIndicator.java @@ -0,0 +1,93 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; + +public class LootIndicator extends Tag { + + private ItemSlot slot; + + private Item lastItem = null; + private int lastQuantity = 0; + + public LootIndicator() { + super( 0x1F75CC ); + + setSize( 24, 22 ); + + visible = false; + } + + @Override + protected void createChildren() { + super.createChildren(); + + slot = new ItemSlot() { + protected void onClick() { + Dungeon.hero.handle( Dungeon.hero.pos ); + }; + }; + slot.showParams( false ); + add( slot ); + } + + @Override + protected void layout() { + super.layout(); + + slot.setRect( x + 2, y + 3, width - 2, height - 6 ); + } + + @Override + public void update() { + + if (Dungeon.hero.ready) { + Heap heap = Dungeon.level.heaps.get( Dungeon.hero.pos ); + if (heap != null) { + + Item item = + heap.type == Heap.Type.CHEST ? ItemSlot.CHEST : + heap.type == Heap.Type.LOCKED_CHEST ? ItemSlot.LOCKED_CHEST : + heap.type == Heap.Type.TOMB ? ItemSlot.TOMB : + heap.type == Heap.Type.SKELETON ? ItemSlot.SKELETON : + heap.peek(); + if (item != lastItem || item.quantity() != lastQuantity) { + lastItem = item; + lastQuantity = item.quantity(); + + slot.item( item ); + flash(); + } + visible = true; + + } else { + + lastItem = null; + visible = false; + + } + } + + slot.enable( visible && Dungeon.hero.ready ); + + super.update(); + } +} diff --git a/src/com/watabou/pixeldungeon/ui/PrefsButton.java b/src/com/watabou/pixeldungeon/ui/PrefsButton.java new file mode 100644 index 0000000000..f13fbe2697 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/PrefsButton.java @@ -0,0 +1,68 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.Image; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.ui.Button; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.windows.WndSettings; + +public class PrefsButton extends Button { + + private Image image; + + public PrefsButton() { + super(); + + width = image.width; + height = image.height; + } + + @Override + protected void createChildren() { + super.createChildren(); + + image = Icons.PREFS.get(); + add( image ); + } + + @Override + protected void layout() { + super.layout(); + + image.x = x; + image.y = y; + } + + @Override + protected void onTouchDown() { + image.brightness( 1.5f ); + Sample.INSTANCE.play( Assets.SND_CLICK ); + } + + @Override + protected void onTouchUp() { + image.resetColor(); + } + + @Override + protected void onClick() { + parent.add( new WndSettings( false ) ); + } +} diff --git a/src/com/watabou/pixeldungeon/ui/QuickSlot.java b/src/com/watabou/pixeldungeon/ui/QuickSlot.java new file mode 100644 index 0000000000..d7a053f194 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/QuickSlot.java @@ -0,0 +1,211 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.Image; +import com.watabou.noosa.ui.Button; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.Char; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.windows.WndBag; + +public class QuickSlot extends Button implements WndBag.Listener { + + private static final String TXT_SELECT_ITEM = "Select an item for the quickslot"; + + private static QuickSlot instance; + + private Item itemInSlot; + private ItemSlot slot; + + private Image crossB; + private Image crossM; + + private boolean targeting = false; + private Item lastItem = null; + private Char lastTarget= null; + + public QuickSlot() { + super(); + item( select() ); + + instance = this; + } + + @Override + public void destroy() { + super.destroy(); + + instance = null; + + lastItem = null; + lastTarget = null; + } + + @Override + protected void createChildren() { + super.createChildren(); + + slot = new ItemSlot() { + @Override + protected void onClick() { + if (targeting) { + GameScene.handleCell( lastTarget.pos ); + } else { + Item item = select(); + if (item == lastItem) { + useTargeting(); + } else { + lastItem = item; + } + item.execute( Dungeon.hero ); + } + } + @Override + protected boolean onLongClick() { + return QuickSlot.this.onLongClick(); + } + @Override + protected void onTouchDown() { + icon.lightness( 0.7f ); + } + @Override + protected void onTouchUp() { + icon.resetColor(); + } + }; + add( slot ); + + crossB = Icons.TARGET.get(); + crossB.visible = false; + add( crossB ); + + crossM = new Image(); + crossM.copy( crossB ); + } + + @Override + protected void layout() { + super.layout(); + + slot.fill( this ); + + crossB.x = PixelScene.align( x + (width - crossB.width) / 2 ); + crossB.y = PixelScene.align( y + (height - crossB.height) / 2 ); + } + + @Override + protected void onClick() { + GameScene.selectItem( this, WndBag.Mode.QUICKSLOT, TXT_SELECT_ITEM ); + } + + @Override + protected boolean onLongClick() { + GameScene.selectItem( this, WndBag.Mode.QUICKSLOT, TXT_SELECT_ITEM ); + return true; + } + + @SuppressWarnings("unchecked") + private static Item select() { + if (Dungeon.quickslot instanceof Item) { + + return (Item)Dungeon.quickslot; + + } else if (Dungeon.quickslot != null) { + + Item item = Dungeon.hero.belongings.getItem( (Class)Dungeon.quickslot ); + return item != null ? item : Item.virtual( (Class)Dungeon.quickslot ); + + } else { + + return null; + + } + } + + @Override + public void onSelect( Item item ) { + if (item != null) { + Dungeon.quickslot = item.stackable ? item.getClass() : item; + refresh(); + } + } + + public void item( Item item ) { + slot.item( item ); + itemInSlot = item; + enableSlot(); + } + + public void enable( boolean value ) { + active = value; + if (value) { + enableSlot(); + } else { + slot.enable( false ); + } + } + + private void enableSlot() { + slot.enable( + itemInSlot != null && + itemInSlot.quantity() > 0 && + (Dungeon.hero.belongings.backpack.contains( itemInSlot ) || itemInSlot.isEquipped( Dungeon.hero ))); + } + + private void useTargeting() { + + targeting = lastTarget != null && lastTarget.isAlive() && Dungeon.visible[lastTarget.pos]; + + if (targeting) { + if (Actor.all().contains( lastTarget )) { + lastTarget.sprite.parent.add( crossM ); + crossM.point( DungeonTilemap.tileToWorld( lastTarget.pos ) ); + crossB.visible = true; + } else { + lastTarget = null; + } + } + } + + public static void refresh() { + if (instance != null) { + instance.item( select() ); + } + } + + public static void target( Item item, Char target ) { + if (item == instance.lastItem && target != Dungeon.hero) { + instance.lastTarget = target; + + HealthIndicator.instance.target( target ); + } + } + + public static void cancel() { + if (instance != null && instance.targeting) { + instance.crossB.visible = false; + instance.crossM.remove(); + instance.targeting = false; + } + } +} diff --git a/src/com/watabou/pixeldungeon/ui/RedButton.java b/src/com/watabou/pixeldungeon/ui/RedButton.java new file mode 100644 index 0000000000..0305aa23c8 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/RedButton.java @@ -0,0 +1,111 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Image; +import com.watabou.noosa.NinePatch; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.ui.Button; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Chrome; +import com.watabou.pixeldungeon.scenes.PixelScene; + +public class RedButton extends Button { + + protected NinePatch bg; + protected BitmapText text; + protected Image icon; + + public RedButton( String label ) { + super(); + + text.text( label ); + text.measure(); + } + + @Override + protected void createChildren() { + super.createChildren(); + + bg = Chrome.get( Chrome.Type.BUTTON ); + add( bg ); + + text = PixelScene.createText( 9 ); + add( text ); + } + + @Override + protected void layout() { + + super.layout(); + + bg.x = x; + bg.y = y; + bg.size( width, height ); + + text.x = x + (int)(width - text.width()) / 2; + text.y = y + (int)(height - text.baseLine()) / 2; + + if (icon != null) { + icon.x = x + text.x - icon.width() - 2; + icon.y = y + (height - icon.height()) / 2; + } + }; + + @Override + protected void onTouchDown() { + bg.brightness( 1.2f ); + Sample.INSTANCE.play( Assets.SND_CLICK ); + }; + + @Override + protected void onTouchUp() { + bg.resetColor(); + }; + + public void enable( boolean value ) { + active = value; + text.alpha( value ? 1.0f : 0.3f ); + } + + public void text( String value ) { + text.text( value ); + text.measure(); + layout(); + } + + public void icon( Image icon ) { + if (this.icon != null) { + remove( this.icon ); + } + this.icon = icon; + if (this.icon != null) { + add( this.icon ); + layout(); + } + } + + public float reqWidth() { + return text.width() + 4; + } + + public float reqHeight() { + return text.baseLine() + 4; + } +} diff --git a/src/com/watabou/pixeldungeon/ui/ScrollPane.java b/src/com/watabou/pixeldungeon/ui/ScrollPane.java new file mode 100644 index 0000000000..5600e086b6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/ScrollPane.java @@ -0,0 +1,149 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.input.Touchscreen.Touch; +import com.watabou.noosa.Camera; +import com.watabou.noosa.TouchArea; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.utils.Point; +import com.watabou.utils.PointF; + +public class ScrollPane extends Component { + + protected TouchController controller; + protected Component content; + + protected float minX; + protected float minY; + protected float maxX; + protected float maxY; + + public ScrollPane( Component content ) { + super(); + + this.content = content; + addToBack( content ); + + width = content.width(); + height = content.height(); + + content.camera = new Camera( 0, 0, 1, 1, PixelScene.defaultZoom ); + Camera.add( content.camera ); + } + + @Override + public void destroy() { + super.destroy(); + Camera.remove( content.camera ); + } + + public void scrollTo( float x, float y ) { + content.camera.scroll.set( x, y ); + } + + @Override + protected void createChildren() { + controller = new TouchController(); + add( controller ); + } + + @Override + protected void layout() { + + content.setPos( 0, 0 ); + controller.x = x; + controller.y = y; + controller.width = width; + controller.height = height; + + Point p = camera().cameraToScreen( x, y ); + Camera cs = content.camera; + cs.x = p.x; + cs.y = p.y; + cs.resize( (int)width, (int)height ); + } + + public Component content() { + return content; + } + + public void onClick( float x, float y ) { + } + + public class TouchController extends TouchArea { + + private float dragThreshold; + + public TouchController() { + super( 0, 0, 0, 0 ); + dragThreshold = PixelScene.defaultZoom * 8; + } + + @Override + protected void onClick( Touch touch ) { + if (dragging) { + + dragging = false; + + } else { + + PointF p = content.camera.screenToCamera( (int)touch.current.x, (int)touch.current.y ); + ScrollPane.this.onClick( p.x, p.y ); + + } + } + + // true if dragging is in progress + private boolean dragging = false; + // last touch coords + private PointF lastPos = new PointF(); + + @Override + protected void onDrag( Touch t ) { + if (dragging) { + + Camera c = content.camera; + + c.scroll.offset( PointF.diff( lastPos, t.current ).invScale( c.zoom ) ); + if (c.scroll.x + width > content.width()) { + c.scroll.x = content.width() - width; + } + if (c.scroll.x < 0) { + c.scroll.x = 0; + } + if (c.scroll.y + height > content.height()) { + c.scroll.y = content.height() - height; + } + if (c.scroll.y < 0) { + c.scroll.y = 0; + } + + + lastPos.set( t.current ); + + } else if (PointF.distance( t.current, t.start ) > dragThreshold) { + + dragging = true; + lastPos.set( t.current ); + + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/ui/SimpleButton.java b/src/com/watabou/pixeldungeon/ui/SimpleButton.java new file mode 100644 index 0000000000..60ed12f8bc --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/SimpleButton.java @@ -0,0 +1,65 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.input.Touchscreen.Touch; +import com.watabou.noosa.Image; +import com.watabou.noosa.TouchArea; +import com.watabou.noosa.ui.Component; + +public class SimpleButton extends Component { + + private Image image; + + public SimpleButton( Image image ) { + super(); + + this.image.copy( image ); + width = image.width; + height = image.height; + } + + @Override + protected void createChildren() { + image = new Image(); + add( image ); + + add( new TouchArea( image ) { + @Override + protected void onTouchDown(Touch touch) { + image.brightness( 1.2f ); + }; + @Override + protected void onTouchUp(Touch touch) { + image.brightness( 1.0f ); + }; + @Override + protected void onClick( Touch touch ) { + SimpleButton.this.onClick(); + }; + } ); + } + + @Override + protected void layout() { + image.x = x; + image.y = y; + } + + protected void onClick() {}; +} diff --git a/src/com/watabou/pixeldungeon/ui/StatusPane.java b/src/com/watabou/pixeldungeon/ui/StatusPane.java new file mode 100644 index 0000000000..f3dd484e34 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/StatusPane.java @@ -0,0 +1,199 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.input.Touchscreen.Touch; +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Camera; +import com.watabou.noosa.Image; +import com.watabou.noosa.NinePatch; +import com.watabou.noosa.TouchArea; +import com.watabou.noosa.particles.Emitter; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.effects.Speck; +import com.watabou.pixeldungeon.effects.particles.BloodParticle; +import com.watabou.pixeldungeon.items.keys.IronKey; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.HeroSprite; +import com.watabou.pixeldungeon.windows.WndHero; + +public class StatusPane extends Component { + + private NinePatch shield; + private Image avatar; + private Emitter blood; + + private int lastTier = 0; + + private Image hp; + private Image exp; + + private int lastLvl = -1; + private int lastKeys = -1; + + private BitmapText level; + private BitmapText depth; + private BitmapText keys; + + private DangerIndicator danger; + private LootIndicator loot; + private BuffIndicator buffs; + private Compass compass; + + @Override + protected void createChildren() { + + shield = new NinePatch( Assets.STATUS, 80, 0, 30, 0 ); + add( shield ); + + add( new TouchArea( 0, 1, 30, 30 ) { + @Override + protected void onClick( Touch touch ) { + Image sprite = Dungeon.hero.sprite; + if (!sprite.isVisible()) { + Camera.main.focusOn( sprite ); + } + GameScene.show( new WndHero() ); + }; + } ); + + avatar = HeroSprite.avatar( Dungeon.hero.heroClass, lastTier ); + add( avatar ); + + blood = new Emitter(); + blood.pos( avatar ); + blood.pour( BloodParticle.FACTORY, 0.3f ); + blood.autoKill = false; + blood.on = false; + add( blood ); + + compass = new Compass( Dungeon.level.exit ); + add( compass ); + + hp = new Image( Assets.HP_BAR ); + add( hp ); + + exp = new Image( Assets.XP_BAR ); + add( exp ); + + level = new BitmapText( PixelScene.font1x ); + level.hardlight( 0xFFEBA4 ); + add( level ); + + depth = new BitmapText( Integer.toString( Dungeon.depth ), PixelScene.font1x ); + depth.hardlight( 0xCACFC2 ); + depth.measure(); + add( depth ); + + Dungeon.hero.belongings.countIronKeys(); + keys = new BitmapText( PixelScene.font1x ); + keys.hardlight( 0xCACFC2 ); + add( keys ); + + danger = new DangerIndicator(); + add( danger ); + + loot = new LootIndicator(); + add( loot ); + + buffs = new BuffIndicator( Dungeon.hero ); + add( buffs ); + } + + @Override + protected void layout() { + + height = 32; + + shield.size( width, shield.height ); + + avatar.x = PixelScene.align( camera(), shield.x + 15 - avatar.width / 2 ); + avatar.y = PixelScene.align( camera(), shield.y + 16 - avatar.height / 2 ); + + compass.x = avatar.x + avatar.width / 2 - compass.origin.x; + compass.y = avatar.y + avatar.height / 2 - compass.origin.y; + + hp.x = 30; + hp.y = 3; + + depth.x = width - 24 - depth.width(); + depth.y = 6; + + keys.y = 6; + + danger.setPos( width - danger.width(), 20 ); + + loot.setPos( width - loot.width(), danger.bottom() + 2 ); + + buffs.setPos( 32, 11 ); + } + + @Override + public void update() { + super.update(); + + float health = (float)Dungeon.hero.HP / Dungeon.hero.HT; + + if (health == 0) { + avatar.tint( 0x000000, 0.6f ); + blood.on = false; + } else if (health < 0.25f) { + avatar.tint( 0xcc0000, 0.4f ); + blood.on = true; + } else { + avatar.resetColor(); + blood.on = false; + } + + hp.scale.x = health; + exp.scale.x = (width / exp.width) * Dungeon.hero.exp / Dungeon.hero.maxExp(); + + if (Dungeon.hero.lvl != lastLvl) { + + if (lastLvl != -1) { + Emitter emitter = (Emitter)recycle( Emitter.class ); + emitter.revive(); + emitter.pos( 27, 27 ); + emitter.burst( Speck.factory( Speck.STAR ), 12 ); + } + + lastLvl = Dungeon.hero.lvl; + level.text( Integer.toString( lastLvl ) ); + level.measure(); + level.x = PixelScene.align( 27.0f - level.width() / 2 ); + level.y = PixelScene.align( 27.5f - level.baseLine() / 2 ); + } + + int k = IronKey.curDepthQunatity; + if (k != lastKeys) { + lastKeys = k; + keys.text( Integer.toString( lastKeys ) ); + keys.measure(); + keys.x = width - 8 - keys.width(); + } + + int tier = Dungeon.hero.tier(); + if (tier != lastTier) { + lastTier = tier; + avatar.copy( HeroSprite.avatar( Dungeon.hero.heroClass, tier ) ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/ui/Tag.java b/src/com/watabou/pixeldungeon/ui/Tag.java new file mode 100644 index 0000000000..e3d11ce8fc --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/Tag.java @@ -0,0 +1,80 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.Game; +import com.watabou.noosa.NinePatch; +import com.watabou.noosa.ui.Button; +import com.watabou.pixeldungeon.Chrome; + +public class Tag extends Button { + + private float r; + private float g; + private float b; + protected NinePatch bg; + + protected float lightness = 0; + + public Tag( int color ) { + super(); + + this.r = (color >> 16) / 255f; + this.g = ((color >> 8) & 0xFF) / 255f; + this.b = (color & 0xFF) / 255f; + } + + @Override + protected void createChildren() { + + super.createChildren(); + + bg = Chrome.get( Chrome.Type.TAG ); + add( bg ); + } + + @Override + protected void layout() { + + super.layout(); + + bg.x = x; + bg.y = y; + bg.size( width, height ); + } + + public void flash() { + lightness = 1f; + } + + @Override + public void update() { + super.update(); + + if (visible && lightness > 0.5) { + if ((lightness -= Game.elapsed) > 0.5) { + bg.ra = bg.ga = bg.ba = 2 * lightness - 1; + bg.rm = 2 * r * (1 - lightness); + bg.gm = 2 * g * (1 - lightness); + bg.bm = 2 * b * (1 - lightness); + } else { + bg.hardlight( r, g, b ); + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/ui/Toast.java b/src/com/watabou/pixeldungeon/ui/Toast.java new file mode 100644 index 0000000000..118b732cc8 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/Toast.java @@ -0,0 +1,84 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.NinePatch; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.Chrome; +import com.watabou.pixeldungeon.scenes.PixelScene; + +public class Toast extends Component { + + private static final float MARGIN_HOR = 2; + private static final float MARGIN_VER = 2; + + protected NinePatch bg; + protected SimpleButton close; + protected BitmapText text; + + public Toast( String text ) { + super(); + text( text ); + + width = this.text.width() + close.width() + bg.marginHor() + MARGIN_HOR * 3; + height = Math.max( this.text.height(), close.height() ) + bg.marginVer() + MARGIN_VER * 2; + } + + @Override + protected void createChildren() { + super.createChildren(); + + bg = Chrome.get( Chrome.Type.TOAST_TR ); + add( bg ); + + close = new SimpleButton( Icons.get( Icons.CLOSE ) ) { + protected void onClick() { + onClose(); + }; + }; + add( close ); + + text = PixelScene.createText( 8 ); + add( text ); + } + + @Override + protected void layout() { + super.layout(); + + bg.x = x; + bg.y = y; + bg.size( width, height ); + + close.setPos( + bg.x + bg.width() - bg.marginHor() / 2 - MARGIN_HOR - close.width(), + y + (height - close.height()) / 2 ); + + text.x = close.left() - MARGIN_HOR - text.width(); + text.y = y + (height - text.height()) / 2; + PixelScene.align( text ); + } + + public void text( String txt ) { + text.text( txt ); + text.measure(); + } + + protected void onClose() {}; +} diff --git a/src/com/watabou/pixeldungeon/ui/Toolbar.java b/src/com/watabou/pixeldungeon/ui/Toolbar.java new file mode 100644 index 0000000000..0f317cef7b --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/Toolbar.java @@ -0,0 +1,359 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import com.watabou.noosa.Game; +import com.watabou.noosa.Gizmo; +import com.watabou.noosa.Image; +import com.watabou.noosa.ui.Button; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.actors.Actor; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.plants.Plant; +import com.watabou.pixeldungeon.scenes.CellSelector; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.windows.WndCatalogus; +import com.watabou.pixeldungeon.windows.WndHero; +import com.watabou.pixeldungeon.windows.WndInfoCell; +import com.watabou.pixeldungeon.windows.WndInfoItem; +import com.watabou.pixeldungeon.windows.WndInfoMob; +import com.watabou.pixeldungeon.windows.WndInfoPlant; +import com.watabou.pixeldungeon.windows.WndBag; +import com.watabou.pixeldungeon.windows.WndMessage; +import com.watabou.pixeldungeon.windows.WndTradeItem; + +public class Toolbar extends Component { + + private Tool btnWait; + private Tool btnSearch; + private Tool btnInfo; + private Tool btnResume; + private Tool btnInventory; + private Tool btnQuick; + + private PickedUpItem pickedUp; + + private boolean lastEnabled = true; + + public Toolbar() { + super(); + + height = btnInventory.height(); + } + + @Override + protected void createChildren() { + + add( btnWait = new Tool( 0, 7, 20, 24 ) { + @Override + protected void onClick() { + Dungeon.hero.rest( false ); + }; + protected boolean onLongClick() { + Dungeon.hero.rest( true ); + return true; + }; + } ); + + add( btnSearch = new Tool( 20, 7, 20, 24 ) { + @Override + protected void onClick() { + Dungeon.hero.search( true ); + } + } ); + + add( btnInfo = new Tool( 40, 7, 21, 24 ) { + @Override + protected void onClick() { + GameScene.selectCell( informer ); + } + } ); + + add( btnResume = new Tool( 61, 7, 21, 24 ) { + @Override + protected void onClick() { + Dungeon.hero.resume(); + } + } ); + + add( btnInventory = new Tool( 82, 7, 23, 24 ) { + private GoldIndicator gold; + @Override + protected void onClick() { + GameScene.show( new WndBag( Dungeon.hero.belongings.backpack, null, WndBag.Mode.ALL, null ) ); + } + protected boolean onLongClick() { + GameScene.show( new WndCatalogus() ); + return true; + }; + @Override + protected void createChildren() { + super.createChildren(); + gold = new GoldIndicator(); + add( gold ); + }; + @Override + protected void layout() { + super.layout(); + gold.fill( this ); + }; + } ); + + add( btnQuick = new QuickslotTool( 105, 7, 22, 24 ) ); + + add( pickedUp = new PickedUpItem() ); + } + + @Override + protected void layout() { + btnWait.setPos( x, y ); + btnSearch.setPos( btnWait.right(), y ); + btnInfo.setPos( btnSearch.right(), y ); + btnResume.setPos( btnInfo.right(), y ); + btnQuick.setPos( width - btnQuick.width(), y ); + btnInventory.setPos( btnQuick.left() - btnInventory.width(), y ); + } + + @Override + public void update() { + super.update(); + + if (lastEnabled != Dungeon.hero.ready) { + lastEnabled = Dungeon.hero.ready; + + for (Gizmo tool : members) { + if (tool instanceof Tool) { + ((Tool)tool).enable( lastEnabled ); + } + } + } + + btnResume.visible = Dungeon.hero.lastAction != null; + + if (!Dungeon.hero.isAlive()) { + btnInventory.enable( true ); + } + } + + public void pickup( Item item ) { + pickedUp.reset( item, + btnInventory.centerX(), + btnInventory.centerY() ); + } + + private static CellSelector.Listener informer = new CellSelector.Listener() { + @Override + public void onSelect( Integer cell ) { + + if (cell == null) { + return; + } + + if (cell < 0 || cell > Level.LENGTH || (!Dungeon.level.visited[cell] && !Dungeon.level.mapped[cell])) { + GameScene.show( new WndMessage( "You don't know what is there." ) ) ; + return; + } + + if (!Dungeon.visible[cell]) { + GameScene.show( new WndInfoCell( cell ) ); + return; + } + + if (cell == Dungeon.hero.pos) { + GameScene.show( new WndHero() ); + return; + } + + Mob mob = (Mob)Actor.findChar( cell ); + if (mob != null) { + GameScene.show( new WndInfoMob( mob ) ); + return; + } + + Heap heap = Dungeon.level.heaps.get( cell ); + if (heap != null) { + if (heap.type == Heap.Type.FOR_SALE && heap.size() == 1 && heap.peek().price() > 0) { + GameScene.show( new WndTradeItem( heap, false ) ); + } else { + GameScene.show( new WndInfoItem( heap ) ); + } + return; + } + + Plant plant = Dungeon.level.plants.get( cell ); + if (plant != null) { + GameScene.show( new WndInfoPlant( plant ) ); + return; + } + + GameScene.show( new WndInfoCell( cell ) ); + } + @Override + public String prompt() { + return "Select a cell to examine"; + } + }; + + private static class Tool extends Button { + + private static final int BGCOLOR = 0x7B8073; + + private Image base; + + public Tool( int x, int y, int width, int height ) { + super(); + + base.frame( x, y, width, height ); + + this.width = width; + this.height = height; + } + + @Override + protected void createChildren() { + super.createChildren(); + + base = new Image( Assets.TOOLBAR ); + add( base ); + } + + @Override + protected void layout() { + super.layout(); + + base.x = x; + base.y = y; + } + + @Override + protected void onTouchDown() { + base.brightness( 1.4f ); + } + + @Override + protected void onTouchUp() { + if (active) { + base.resetColor(); + } else { + base.tint( BGCOLOR, 0.7f ); + } + } + + public void enable( boolean value ) { + if (value != active) { + if (value) { + base.resetColor(); + } else { + base.tint( BGCOLOR, 0.7f ); + } + active = value; + } + } + } + + private static class QuickslotTool extends Tool { + + private QuickSlot slot; + + public QuickslotTool( int x, int y, int width, int height ) { + super( x, y, width, height ); + } + + @Override + protected void createChildren() { + super.createChildren(); + + slot = new QuickSlot(); + add( slot ); + } + + @Override + protected void layout() { + super.layout(); + slot.setRect( x + 1, y + 2, width - 2, height - 2 ); + } + + @Override + public void enable( boolean value ) { + slot.enable( value ); + active = value; + } + } + + private static class PickedUpItem extends ItemSprite { + + private static final float DISTANCE = DungeonTilemap.SIZE; + private static final float DURATION = 0.2f; + + private float dstX; + private float dstY; + private float left; + + public PickedUpItem() { + super(); + + originToCenter(); + + active = + visible = + false; + } + + public void reset( Item item, float dstX, float dstY ) { + view( item.image(), item.glowing() ); + + active = + visible = + true; + + this.dstX = dstX - ItemSprite.SIZE / 2; + this.dstY = dstY - ItemSprite.SIZE / 2; + left = DURATION; + + x = this.dstX - DISTANCE; + y = this.dstY - DISTANCE; + alpha( 1 ); + } + + @Override + public void update() { + super.update(); + + if ((left -= Game.elapsed) <= 0) { + + visible = + active = + false; + + } else { + float p = left / DURATION; + scale.set( (float)Math.sqrt( p ) ); + float offset = DISTANCE * p; + x = dstX - offset; + y = dstY - offset; + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/ui/Window.java b/src/com/watabou/pixeldungeon/ui/Window.java new file mode 100644 index 0000000000..3a1b3c1779 --- /dev/null +++ b/src/com/watabou/pixeldungeon/ui/Window.java @@ -0,0 +1,199 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.ui; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.watabou.input.Keys; +import com.watabou.input.Keys.Key; +import com.watabou.input.Touchscreen.Touch; +import com.watabou.noosa.Camera; +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.NinePatch; +import com.watabou.noosa.TouchArea; +import com.watabou.pixeldungeon.Chrome; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.utils.Signal; + +public class Window extends Group implements Signal.Listener { + + protected int width; + protected int height; + + protected TouchArea blocker; + protected NinePatch chrome; + + public static final int TITLE_COLOR = 0xFFFF44; + + public Window() { + this( 0, 0, Chrome.get( Chrome.Type.WINDOW ) ); + } + + public Window( int width, int height ) { + this( width, height, Chrome.get( Chrome.Type.WINDOW ) ); + } + + public Window( int width, int height, NinePatch chrome ) { + super(); + + blocker = new TouchArea( 0, 0, PixelScene.uiCamera.width, PixelScene.uiCamera.height ) { + @Override + protected void onClick( Touch touch ) { + if (!Window.this.chrome.overlapsScreenPoint( + (int)touch.current.x, + (int)touch.current.y )) { + + onBackPressed(); + } + } + }; + blocker.camera = PixelScene.uiCamera; + add( blocker ); + + this.chrome = chrome; + + this.width = width; + this.height = height; + + chrome.x = -chrome.marginLeft(); + chrome.y = -chrome.marginTop(); + chrome.size( + width - chrome.x + chrome.marginRight(), + height - chrome.y + chrome.marginBottom() ); + add( chrome ); + + camera = new Camera( 0, 0, + (int)chrome.width, + (int)chrome.height, + PixelScene.defaultZoom ); + camera.x = (int)(Game.width - camera.width * camera.zoom) / 2; + camera.y = (int)(Game.height - camera.height * camera.zoom) / 2; + camera.scroll.set( chrome.x, chrome.y ); + Camera.add( camera ); + + Keys.event.add( this ); + } + + public void resize( int w, int h ) { + this.width = w; + this.height = h; + + chrome.size( + width + chrome.marginHor(), + height + chrome.marginVer() ); + + camera.resize( (int)chrome.width, (int)chrome.height ); + camera.x = (int)(Game.width - camera.screenWidth()) / 2; + camera.y = (int)(Game.height - camera.screenHeight()) / 2; + } + + public void hide() { + parent.erase( this ); + destroy(); + } + + @Override + public void destroy() { + super.destroy(); + + Camera.remove( camera ); + Keys.event.remove( this ); + } + + @Override + public void onSignal( Key key ) { + if (key.pressed) { + switch (key.code) { + case Keys.BACK: + onBackPressed(); + break; + case Keys.MENU: + onMenuPressed(); + break; + } + } + + Keys.event.cancel(); + } + + public void onBackPressed() { + hide(); + } + + public void onMenuPressed() { + } + + protected static class Highlighter { + + private static final Pattern HIGHLIGHTER = Pattern.compile( "_(.*?)_" ); + private static final Pattern STRIPPER = Pattern.compile( "[ \n]" ); + + public String text; + + public boolean[] mask; + + public Highlighter( String text ) { + + String stripped = STRIPPER.matcher( text ).replaceAll( "" ); + mask = new boolean[stripped.length()]; + + Matcher m = HIGHLIGHTER.matcher( stripped ); + + int pos = 0; + int lastMatch = 0; + + while (m.find()) { + pos += (m.start() - lastMatch); + int groupLen = m.group( 1 ).length(); + for (int i=pos; i < pos + groupLen; i++) { + mask[i] = true; + } + pos += groupLen; + lastMatch = m.end(); + } + + m.reset( text ); + StringBuffer sb = new StringBuffer(); + while (m.find()) { + m.appendReplacement( sb, m.group( 1 ) ); + } + m.appendTail( sb ); + + this.text = sb.toString(); + } + + public boolean[] inverted() { + boolean[] result = new boolean[mask.length]; + for (int i=0; i < result.length; i++) { + result[i] = !mask[i]; + } + return result; + } + + public boolean isHighlighted() { + for (int i=0; i < mask.length; i++) { + if (mask[i]) { + return true; + } + } + return false; + } + } +} diff --git a/src/com/watabou/pixeldungeon/utils/BArray.java b/src/com/watabou/pixeldungeon/utils/BArray.java new file mode 100644 index 0000000000..c109f09fd4 --- /dev/null +++ b/src/com/watabou/pixeldungeon/utils/BArray.java @@ -0,0 +1,140 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.utils; + +public class BArray { + + public static boolean[] and( boolean[] a, boolean[] b, boolean[] result ) { + + int length = a.length; + + if (result == null) { + result = new boolean[length]; + } + + for (int i=0; i < length; i++) { + result[i] = a[i] && b[i]; + } + + return result; + } + + public static boolean[] or( boolean[] a, boolean[] b, boolean[] result ) { + + int length = a.length; + + if (result == null) { + result = new boolean[length]; + } + + for (int i=0; i < length; i++) { + result[i] = a[i] || b[i]; + } + + return result; + } + + public static boolean[] not( boolean[] a, boolean[] result ) { + + int length = a.length; + + if (result == null) { + result = new boolean[length]; + } + + for (int i=0; i < length; i++) { + result[i] = !a[i]; + } + + return result; + } + + public static boolean[] is( int[] a, boolean[] result, int v1 ) { + + int length = a.length; + + if (result == null) { + result = new boolean[length]; + } + + for (int i=0; i < length; i++) { + result[i] = a[i] == v1; + } + + return result; + } + + public static boolean[] isOneOf( int[] a, boolean[] result, int... v ) { + + int length = a.length; + int nv = v.length; + + if (result == null) { + result = new boolean[length]; + } + + for (int i=0; i < length; i++) { + result[i] = false; + for (int j=0; j < nv; j++) { + if (a[i] == v[j]) { + result[i] = true; + break; + } + } + } + + return result; + } + + public static boolean[] isNot( int[] a, boolean[] result, int v1 ) { + + int length = a.length; + + if (result == null) { + result = new boolean[length]; + } + + for (int i=0; i < length; i++) { + result[i] = a[i] != v1; + } + + return result; + } + + public static boolean[] isNotOneOf( int[] a, boolean[] result, int... v ) { + + int length = a.length; + int nv = v.length; + + if (result == null) { + result = new boolean[length]; + } + + for (int i=0; i < length; i++) { + result[i] = true; + for (int j=0; j < nv; j++) { + if (a[i] == v[j]) { + result[i] = false; + break; + } + } + } + + return result; + } +} diff --git a/src/com/watabou/pixeldungeon/utils/GLog.java b/src/com/watabou/pixeldungeon/utils/GLog.java new file mode 100644 index 0000000000..40a0329666 --- /dev/null +++ b/src/com/watabou/pixeldungeon/utils/GLog.java @@ -0,0 +1,60 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.utils; + +import com.watabou.utils.Signal; + +import android.util.Log; + +public class GLog { + + public static final String TAG = "GAME"; + + public static final String POSITIVE = "++ "; + public static final String NEGATIVE = "-- "; + public static final String WARNING = "** "; + public static final String HIGHLIGHT = "@@ "; + + public static Signal update = new Signal(); + + public static void i( String text, Object... args ) { + + if (args.length > 0) { + text = Utils.format( text, args ); + } + + Log.i( TAG, text ); + update.dispatch( text ); + } + + public static void p( String text, Object... args ) { + i( POSITIVE + text, args ); + } + + public static void n( String text, Object... args ) { + i( NEGATIVE + text, args ); + } + + public static void w( String text, Object... args ) { + i( WARNING + text, args ); + } + + public static void h( String text, Object... args ) { + i( HIGHLIGHT + text, args ); + } +} diff --git a/src/com/watabou/pixeldungeon/utils/Utils.java b/src/com/watabou/pixeldungeon/utils/Utils.java new file mode 100644 index 0000000000..4cff2ab6ca --- /dev/null +++ b/src/com/watabou/pixeldungeon/utils/Utils.java @@ -0,0 +1,41 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.utils; + +import java.util.Locale; + +public class Utils { + + public static String capitalize( String str ) { + return Character.toUpperCase( str.charAt( 0 ) ) + str.substring( 1 ); + } + + public static String format( String format, Object...args ) { + return String.format( Locale.ENGLISH, format, args ); + } + + public static String VOWELS = "aoeiu"; + + public static String indefinite( String noun ) { + if (noun.length() == 0) { + return "a"; + } else { + return (VOWELS.indexOf( Character.toLowerCase( noun.charAt( 0 ) ) ) != -1 ? "an " : "a ") + noun; + } + } +} diff --git a/src/com/watabou/pixeldungeon/windows/IconTitle.java b/src/com/watabou/pixeldungeon/windows/IconTitle.java new file mode 100644 index 0000000000..92a648a997 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/IconTitle.java @@ -0,0 +1,89 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.Image; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.Window; + +public class IconTitle extends Component { + + private static final float FONT_SIZE = 9; + + private static final float GAP = 2; + + protected Image imIcon; + protected BitmapTextMultiline tfLabel; + + public IconTitle() { + super(); + } + + public IconTitle( Image icon, String label ) { + super(); + + icon( icon ); + label( label ); + } + + @Override + protected void createChildren() { + imIcon = new Image(); + add( imIcon ); + + tfLabel = PixelScene.createMultiline( FONT_SIZE ); + tfLabel.hardlight( Window.TITLE_COLOR ); + add( tfLabel ); + } + + @Override + protected void layout() { + imIcon.x = 0; + imIcon.y = 0; + + tfLabel.x = PixelScene.align( PixelScene.uiCamera, imIcon.x + imIcon.width() + GAP ); + tfLabel.maxWidth = (int)(width - tfLabel.x); + tfLabel.measure(); + tfLabel.y = PixelScene.align( PixelScene.uiCamera, + imIcon.height > tfLabel.height() ? + (imIcon.height() - tfLabel.baseLine()) / 2 : + imIcon.y ); + + height = Math.max( imIcon.y + imIcon.height(), tfLabel.y + tfLabel.height() ); + } + + public void icon( Image icon ) { + remove( imIcon ); + add( imIcon = icon ); + } + + public void label( String label ) { + tfLabel.text( label ); + } + + public void label( String label, int color ) { + tfLabel.text( label ); + tfLabel.hardlight( color ); + } + + public void color( int color ) { + tfLabel.hardlight( color ); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndBadge.java b/src/com/watabou/pixeldungeon/windows/WndBadge.java new file mode 100644 index 0000000000..b0cd1e0893 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndBadge.java @@ -0,0 +1,64 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.effects.BadgeBanner; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.Window; + +public class WndBadge extends Window { + + private static final int WIDTH = 120; + private static final int MARGIN = 4; + + public WndBadge( Badges.Badge badge ) { + + super(); + + Image icon = BadgeBanner.image( badge.image ); + icon.scale.set( 2 ); + add( icon ); + + BitmapTextMultiline info = PixelScene.createMultiline( badge.description, 8 ); + info.maxWidth = WIDTH - MARGIN * 2; + info.measure(); + + float w = Math.max( icon.width(), info.width() ) + MARGIN * 2; + + icon.x = (w - icon.width()) / 2; + icon.y = MARGIN; + + float pos = icon.y + icon.height() + MARGIN; + for (BitmapText line : info.new LineSplitter().split()) { + line.measure(); + line.x = PixelScene.align( (w - line.width()) / 2 ); + line.y = PixelScene.align( pos ); + add( line ); + + pos += line.height(); + } + + resize( (int)w, (int)(pos + MARGIN) ); + + BadgeBanner.highlight( icon, badge.image ); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndBag.java b/src/com/watabou/pixeldungeon/windows/WndBag.java new file mode 100644 index 0000000000..e74d346b28 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndBag.java @@ -0,0 +1,399 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import android.graphics.RectF; + +import com.watabou.gltextures.TextureCache; +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.ColorBlock; +import com.watabou.noosa.Image; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.Belongings; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Gold; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.armor.Armor; +import com.watabou.pixeldungeon.items.bags.Bag; +import com.watabou.pixeldungeon.items.bags.ScrollHolder; +import com.watabou.pixeldungeon.items.bags.SeedPouch; +import com.watabou.pixeldungeon.items.bags.WandHolster; +import com.watabou.pixeldungeon.items.wands.Wand; +import com.watabou.pixeldungeon.items.weapon.melee.MeleeWeapon; +import com.watabou.pixeldungeon.items.weapon.missiles.Boomerang; +import com.watabou.pixeldungeon.plants.Plant.Seed; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.ItemSpriteSheet; +import com.watabou.pixeldungeon.ui.Icons; +import com.watabou.pixeldungeon.ui.ItemSlot; +import com.watabou.pixeldungeon.ui.QuickSlot; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndBag extends WndTabbed { + + public static enum Mode { + ALL, + UNIDENTIFED, + UPGRADEABLE, + QUICKSLOT, + FOR_SALE, + WEAPON, + ARMOR, + WAND, + SEED + } + + protected static final int COLS = 4; + + protected static final int SLOT_SIZE = 28; + protected static final int SLOT_MARGIN = 1; + + protected static final int TAB_WIDTH = 30; + + protected static final int TITLE_HEIGHT = 12; + + @SuppressWarnings("unused") + protected static final int ROWS = + (Belongings.BACKPACK_SIZE + 4 + 1) / COLS + ((Belongings.BACKPACK_SIZE + 4 + 1) % COLS > 0 ? 1 : 0); + + private Listener listener; + private WndBag.Mode mode; + private String title; + + protected int count; + protected int col; + protected int row; + + private static Mode lastMode; + private static Bag lastBag; + + public WndBag( Bag bag, Listener listener, Mode mode, String title ) { + + super(); + + this.listener = listener; + this.mode = mode; + this.title = title; + + lastMode = mode; + lastBag = bag; + + BitmapText txtTitle = PixelScene.createText( title != null ? title : Utils.capitalize( bag.name() ), 9 ); + txtTitle.hardlight( TITLE_COLOR ); + txtTitle.measure(); + txtTitle.x = (int)(SLOT_SIZE * COLS + SLOT_MARGIN * (COLS - 1) - txtTitle.width()) / 2; + txtTitle.y = (int)(TITLE_HEIGHT - txtTitle.height()) / 2; + add( txtTitle ); + + placeItems( bag ); + + resize( + SLOT_SIZE * COLS + SLOT_MARGIN * (COLS - 1), + SLOT_SIZE * ROWS + SLOT_MARGIN * (ROWS - 1) + TITLE_HEIGHT ); + + Belongings stuff = Dungeon.hero.belongings; + Bag[] bags = { + stuff.backpack, + stuff.getItem( SeedPouch.class ), + stuff.getItem( ScrollHolder.class ), + stuff.getItem( WandHolster.class )}; + + for (Bag b : bags) { + if (b != null) { + BagTab tab = new BagTab( b ); + tab.setSize( TAB_WIDTH, tabHeight() ); + add( tab ); + + tab.select( b == bag ); + } + } + } + + public static WndBag lastBag( Listener listener, Mode mode, String title ) { + + if (mode == lastMode && lastBag != null && + Dungeon.hero.belongings.backpack.contains( lastBag )) { + + return new WndBag( lastBag, listener, mode, title ); + + } else { + + return new WndBag( Dungeon.hero.belongings.backpack, listener, mode, title ); + + } + } + + public static WndBag seedPouch( Listener listener, Mode mode, String title ) { + SeedPouch pouch = Dungeon.hero.belongings.getItem( SeedPouch.class ); + return pouch != null ? + new WndBag( pouch, listener, mode, title ) : + new WndBag( Dungeon.hero.belongings.backpack, listener, mode, title ); + } + + protected void placeItems( Bag container ) { + + // Equipped items + Belongings stuff = Dungeon.hero.belongings; + placeItem( stuff.weapon != null ? stuff.weapon : new Placeholder( ItemSpriteSheet.WEAPON ) ); + placeItem( stuff.armor != null ? stuff.armor : new Placeholder( ItemSpriteSheet.ARMOR ) ); + placeItem( stuff.ring1 != null ? stuff.ring1 : new Placeholder( ItemSpriteSheet.RING ) ); + placeItem( stuff.ring2 != null ? stuff.ring2 : new Placeholder( ItemSpriteSheet.RING ) ); + + // Unequipped items + for (Item item : container.items) { + placeItem( item ); + } + + // Empty slots + while (count-4 < container.size) { + placeItem( null ); + } + + // Gold + if (container == Dungeon.hero.belongings.backpack) { + row = ROWS - 1; + col = COLS - 1; + placeItem( new Gold( Dungeon.gold ) ); + } + } + + protected void placeItem( final Item item ) { + + int x = col * (SLOT_SIZE + SLOT_MARGIN); + int y = TITLE_HEIGHT + row * (SLOT_SIZE + SLOT_MARGIN); + + add( new ItemButton( item ).setPos( x, y ) ); + + if (++col >= COLS) { + col = 0; + row++; + } + + count++; + } + + @Override + public void onMenuPressed() { + if (listener == null) { + hide(); + } + } + + @Override + public void onBackPressed() { + if (listener != null) { + listener.onSelect( null ); + } + super.onBackPressed(); + } + + @Override + protected void onClick( Tab tab ) { + hide(); + GameScene.show( new WndBag( ((BagTab)tab).bag, listener, mode, title ) ); + } + + @Override + protected int tabHeight() { + return 20; + } + + private class BagTab extends Tab { + + private Image icon; + + private Bag bag; + + public BagTab( Bag bag ) { + super(); + + this.bag = bag; + + icon = icon(); + add( icon ); + } + + @Override + protected void select( boolean value ) { + super.select( value ); + icon.am = selected ? 1.0f : 0.6f; + } + + @Override + protected void layout() { + super.layout(); + + icon.copy( icon() ); + icon.x = x + (width - icon.width) / 2; + icon.y = y + (height - icon.height) / 2 - 2 - (selected ? 0 : 1); + if (!selected && icon.y < y + CUT) { + RectF frame = icon.frame(); + frame.top += (y + CUT - icon.y) / icon.texture.height; + icon.frame( frame ); + icon.y = y + CUT; + } + } + + private Image icon() { + if (bag instanceof SeedPouch) { + return Icons.get( Icons.SEED_POUCH ); + } else if (bag instanceof ScrollHolder) { + return Icons.get( Icons.SCROLL_HOLDER ); + } else if (bag instanceof WandHolster) { + return Icons.get( Icons.WAND_HOLSTER ); + } else { + return Icons.get( Icons.BACKPACK ); + } + } + } + + private static class Placeholder extends Item { + { + name = null; + } + + public Placeholder( int image ) { + this.image = image; + } + + @Override + public boolean isIdentified() { + return true; + } + + @Override + public boolean isEquipped( Hero hero ) { + return true; + } + } + + private class ItemButton extends ItemSlot { + + private static final int NORMAL = 0xFF4A4D44; + private static final int EQUIPPED = 0xFF63665B; + + private Item item; + private ColorBlock bg; + + public ItemButton( Item item ) { + + super( item ); + + this.item = item; + if (item instanceof Gold) { + bg.visible = false; + } + + width = height = SLOT_SIZE; + } + + @Override + protected void createChildren() { + bg = new ColorBlock( SLOT_SIZE, SLOT_SIZE, NORMAL ); + add( bg ); + + super.createChildren(); + } + + @Override + protected void layout() { + bg.x = x; + bg.y = y; + + super.layout(); + } + + @Override + public void item( Item item ) { + + super.item( item ); + if (item != null) { + + bg.texture( TextureCache.createSolid( item.isEquipped( Dungeon.hero ) ? EQUIPPED : NORMAL ) ); + if (item.cursed && item.cursedKnown) { + bg.ra = +0.2f; + bg.ga = -0.1f; + } else if (!item.isIdentified()) { + bg.ra = 0.1f; + bg.ba = 0.1f; + } + + if (item.name() == null) { + enable( false ); + } else { + enable( + mode == Mode.FOR_SALE && (item.price() > 0) && (!item.isEquipped( Dungeon.hero ) || !item.cursed) || + mode == Mode.UPGRADEABLE && item.isUpgradable() || + mode == Mode.UNIDENTIFED && !item.isIdentified() || + mode == Mode.QUICKSLOT && (item.defaultAction != null) || + mode == Mode.WEAPON && (item instanceof MeleeWeapon || item instanceof Boomerang) || + mode == Mode.ARMOR && (item instanceof Armor) || + mode == Mode.WAND && (item instanceof Wand) || + mode == Mode.SEED && (item instanceof Seed) || + mode == Mode.ALL + ); + } + } else { + bg.color( NORMAL ); + } + } + + @Override + protected void onTouchDown() { + bg.brightness( 1.5f ); + Sample.INSTANCE.play( Assets.SND_CLICK, 0.7f, 0.7f, 1.2f ); + }; + + protected void onTouchUp() { + bg.brightness( 1.0f ); + }; + + @Override + protected void onClick() { + if (listener != null) { + + hide(); + listener.onSelect( item ); + + } else { + + WndBag.this.add( new WndItem( WndBag.this, item ) ); + + } + } + + @Override + protected boolean onLongClick() { + if (listener == null && item.defaultAction != null) { + hide(); + Dungeon.quickslot = item instanceof Wand ? item : item.getClass(); + QuickSlot.refresh(); + return true; + } else { + return false; + } + } + } + + public interface Listener { + void onSelect( Item item ); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndBlacksmith.java b/src/com/watabou/pixeldungeon/windows/WndBlacksmith.java new file mode 100644 index 0000000000..49069ce407 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndBlacksmith.java @@ -0,0 +1,176 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.NinePatch; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Chrome; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.npcs.Blacksmith; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.ItemSlot; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndBlacksmith extends Window { + + private static final int BTN_SIZE = 36; + private static final float GAP = 2; + private static final float BTN_GAP = 10; + private static final int WIDTH = 116; + + private ItemButton btnPressed; + + private ItemButton btnItem1; + private ItemButton btnItem2; + private RedButton btnReforge; + + private static final String TXT_PROMPT = + "Ok, a deal is a deal, dat's what I can do for you: I can reforge " + + "2 items and turn them into one of a better quality."; + private static final String TXT_SELECT = + "Select an item to reforge"; + private static final String TXT_REFORGE = + "Reforge them"; + + public WndBlacksmith( Blacksmith troll, Hero hero ) { + + super(); + + IconTitle titlebar = new IconTitle(); + titlebar.icon( troll.sprite() ); + titlebar.label( Utils.capitalize( troll.name ) ); + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + BitmapTextMultiline message = PixelScene.createMultiline( TXT_PROMPT, 6 ); + message.maxWidth = WIDTH; + message.measure(); + message.y = titlebar.bottom() + GAP; + add( message ); + + btnItem1 = new ItemButton() { + @Override + protected void onClick() { + btnPressed = btnItem1; + GameScene.selectItem( itemSelector, WndBag.Mode.UPGRADEABLE, TXT_SELECT ); + } + }; + btnItem1.setRect( (WIDTH - BTN_GAP) / 2 - BTN_SIZE, message.y + message.height() + BTN_GAP, BTN_SIZE, BTN_SIZE ); + add( btnItem1 ); + + btnItem2 = new ItemButton() { + @Override + protected void onClick() { + btnPressed = btnItem2; + GameScene.selectItem( itemSelector, WndBag.Mode.UPGRADEABLE, TXT_SELECT ); + } + }; + btnItem2.setRect( btnItem1.right() + BTN_GAP, btnItem1.top(), BTN_SIZE, BTN_SIZE ); + add( btnItem2 ); + + btnReforge = new RedButton( TXT_REFORGE ) { + @Override + protected void onClick() { + Blacksmith.upgrade( btnItem1.item, btnItem2.item ); + hide(); + } + }; + btnReforge.enable( false ); + btnReforge.setRect( 0, btnItem1.bottom() + BTN_GAP, WIDTH, 20 ); + add( btnReforge ); + + + resize( WIDTH, (int)btnReforge.bottom() ); + } + + protected WndBag.Listener itemSelector = new WndBag.Listener() { + @Override + public void onSelect( Item item ) { + if (item != null) { + btnPressed.item( item ); + + if (btnItem1.item != null && btnItem2.item != null) { + String result = Blacksmith.verify( btnItem1.item, btnItem2.item ); + if (result != null) { + GameScene.show( new WndMessage( result ) ); + btnReforge.enable( false ); + } else { + btnReforge.enable( true ); + } + } + } + } + }; + + public static class ItemButton extends Component { + + protected NinePatch bg; + protected ItemSlot slot; + + public Item item = null; + + @Override + protected void createChildren() { + super.createChildren(); + + bg = Chrome.get( Chrome.Type.BUTTON ); + add( bg ); + + slot = new ItemSlot() { + @Override + protected void onTouchDown() { + bg.brightness( 1.2f ); + Sample.INSTANCE.play( Assets.SND_CLICK ); + }; + @Override + protected void onTouchUp() { + bg.resetColor(); + } + @Override + protected void onClick() { + ItemButton.this.onClick(); + } + }; + add( slot ); + } + + protected void onClick() {}; + + @Override + protected void layout() { + super.layout(); + + bg.x = x; + bg.y = y; + bg.size( width, height ); + + slot.setRect( x + 2, y + 2, width - 4, height - 4 ); + }; + + public void item( Item item ) { + slot.item( this.item = item ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndCatalogus.java b/src/com/watabou/pixeldungeon/windows/WndCatalogus.java new file mode 100644 index 0000000000..04209e9fb9 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndCatalogus.java @@ -0,0 +1,189 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import java.util.ArrayList; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.potions.Potion; +import com.watabou.pixeldungeon.items.scrolls.Scroll; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.ui.ScrollPane; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndCatalogus extends WndTabbed { + + private static final int WIDTH = 112; + private static final int HEIGHT = 160; + + private static final int ITEM_HEIGHT = 18; + + private static final int TAB_WIDTH = 50; + + private static final String TXT_POTIONS = "Potions"; + private static final String TXT_SCROLLS = "Scrolls"; + private static final String TXT_TITLE = "Catalogus"; + + private BitmapText txtTitle; + private ScrollPane list; + + private ArrayList items = new ArrayList(); + + private static boolean showPotions = true; + + public WndCatalogus() { + + super(); + resize( WIDTH, HEIGHT ); + + txtTitle = PixelScene.createText( TXT_TITLE, 9 ); + txtTitle.hardlight( Window.TITLE_COLOR ); + txtTitle.measure(); + add( txtTitle ); + + list = new ScrollPane( new Component() ) { + @Override + public void onClick( float x, float y ) { + int size = items.size(); + for (int i=0; i < size; i++) { + if (items.get( i ).onClick( x, y )) { + break; + } + } + } + }; + add( list ); + list.setRect( 0, txtTitle.height(), WIDTH, HEIGHT - txtTitle.height() ); + + boolean showPotions = WndCatalogus.showPotions; + Tab[] tabs = { + new LabeledTab( TXT_POTIONS ) { + protected void select( boolean value ) { + super.select( value ); + WndCatalogus.showPotions = value; + updateList(); + }; + }, + new LabeledTab( TXT_SCROLLS ) { + protected void select( boolean value ) { + super.select( value ); + WndCatalogus.showPotions = !value; + updateList(); + }; + } + }; + for (Tab tab : tabs) { + tab.setSize( TAB_WIDTH, tabHeight() ); + add( tab ); + } + + select( showPotions ? 0 : 1 ); + } + + private void updateList() { + + txtTitle.text( Utils.format( TXT_TITLE, showPotions ? TXT_POTIONS : TXT_SCROLLS ) ); + txtTitle.measure(); + txtTitle.x = PixelScene.align( PixelScene.uiCamera, (WIDTH - txtTitle.width()) / 2 ); + + items.clear(); + + Component content = list.content(); + content.clear(); + list.scrollTo( 0, 0 ); + + float pos = 0; + for (Class itemClass : showPotions ? Potion.getKnown() : Scroll.getKnown()) { + ListItem item = new ListItem( itemClass ); + item.setRect( 0, pos, WIDTH, ITEM_HEIGHT ); + content.add( item ); + items.add( item ); + + pos += item.height(); + } + + for (Class itemClass : showPotions ? Potion.getUnknown() : Scroll.getUnknown()) { + ListItem item = new ListItem( itemClass ); + item.setRect( 0, pos, WIDTH, ITEM_HEIGHT ); + content.add( item ); + items.add( item ); + + pos += item.height(); + } + + content.setSize( WIDTH, pos ); + } + + private static class ListItem extends Component { + + private Item item; + private boolean identified; + + private ItemSprite sprite; + private BitmapText label; + + public ListItem( Class cl ) { + super(); + + try { + item = cl.newInstance(); + if (identified = item.isIdentified()) { + sprite.view( item.image(), null ); + label.text( item.name() ); + } else { + sprite.view( 127, null ); + label.text( item.trueName() ); + label.hardlight( 0xCCCCCC ); + } + } catch (Exception e) { + // + } + } + + @Override + protected void createChildren() { + sprite = new ItemSprite(); + add( sprite ); + + label = PixelScene.createText( 8 ); + add( label ); + } + + @Override + protected void layout() { + sprite.y = PixelScene.align( y + (height - sprite.height) / 2 ); + + label.x = sprite.x + sprite.width; + label.y = PixelScene.align( y + (height - label.baseLine()) / 2 ); + } + + public boolean onClick( float x, float y ) { + if (identified && inside( x, y )) { + GameScene.show( new WndInfoItem( item ) ); + return true; + } else { + return false; + } + } + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndChooseWay.java b/src/com/watabou/pixeldungeon/windows/WndChooseWay.java new file mode 100644 index 0000000000..c6daf2c02a --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndChooseWay.java @@ -0,0 +1,102 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.pixeldungeon.actors.hero.HeroSubClass; +import com.watabou.pixeldungeon.items.TomeOfMastery; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndChooseWay extends Window { + + private static final String TXT_MESSAGE = "Which way will you follow?"; + private static final String TXT_CANCEL = "I'll decide later"; + + private static final int WIDTH = 120; + private static final int BTN_HEIGHT = 18; + private static final float GAP = 2; + + public WndChooseWay( final TomeOfMastery tome, final HeroSubClass way1, final HeroSubClass way2 ) { + + super(); + + IconTitle titlebar = new IconTitle(); + titlebar.icon( new ItemSprite( tome.image(), null ) ); + titlebar.label( tome.name() ); + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + Highlighter hl = new Highlighter( way1.desc() + "\n\n" + way2.desc() + "\n\n" + TXT_MESSAGE ); + + BitmapTextMultiline normal = PixelScene.createMultiline( hl.text, 6 ); + normal.maxWidth = WIDTH; + normal.measure(); + normal.x = titlebar.left(); + normal.y = titlebar.bottom() + GAP; + add( normal ); + + if (hl.isHighlighted()) { + normal.mask = hl.inverted(); + + BitmapTextMultiline highlighted = PixelScene.createMultiline( hl.text, 6 ); + highlighted.maxWidth = normal.maxWidth; + highlighted.measure(); + highlighted.x = normal.x; + highlighted.y = normal.y; + add( highlighted ); + + highlighted.mask = hl.mask; + highlighted.hardlight( TITLE_COLOR ); + } + + RedButton btnWay1 = new RedButton( Utils.capitalize( way1.title() ) ) { + @Override + protected void onClick() { + hide(); + tome.choose( way1 ); + } + }; + btnWay1.setRect( 0, normal.y + normal.height() + GAP, (WIDTH - GAP) / 2, BTN_HEIGHT ); + add( btnWay1 ); + + RedButton btnWay2 = new RedButton( Utils.capitalize( way2.title() ) ) { + @Override + protected void onClick() { + hide(); + tome.choose( way2 ); + } + }; + btnWay2.setRect( btnWay1.right() + GAP, btnWay1.top(), btnWay1.width(), BTN_HEIGHT ); + add( btnWay2 ); + + RedButton btnCancel = new RedButton( TXT_CANCEL ) { + @Override + protected void onClick() { + hide(); + } + }; + btnCancel.setRect( 0, btnWay2.bottom() + GAP, WIDTH, BTN_HEIGHT ); + add( btnCancel ); + + resize( WIDTH, (int)btnCancel.bottom() ); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndError.java b/src/com/watabou/pixeldungeon/windows/WndError.java new file mode 100644 index 0000000000..099f86e008 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndError.java @@ -0,0 +1,30 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.pixeldungeon.ui.Icons; + +public class WndError extends WndTitledMessage { + + private static final String TXT_TITLE = "ERROR"; + + public WndError( String message ) { + super( Icons.WARNING.get(), TXT_TITLE, message ); + } + +} diff --git a/src/com/watabou/pixeldungeon/windows/WndGame.java b/src/com/watabou/pixeldungeon/windows/WndGame.java new file mode 100644 index 0000000000..4fef81efb2 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndGame.java @@ -0,0 +1,120 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import java.io.IOException; + +import com.watabou.noosa.Game; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.scenes.InterlevelScene; +import com.watabou.pixeldungeon.scenes.RankingsScene; +import com.watabou.pixeldungeon.scenes.TitleScene; +import com.watabou.pixeldungeon.ui.Icons; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.ui.Window; + +public class WndGame extends Window { + + private static final String TXT_SETTINGS = "Settings"; + private static final String TXT_RANKINGS = "Rankings"; + private static final String TXT_START = "Start New Game"; + private static final String TXT_MENU = "Main Menu"; + private static final String TXT_EXIT = "Exit Pixel Dungeon"; + private static final String TXT_RETURN = "Return to Game"; + + private static final int WIDTH = 120; + private static final int BTN_HEIGHT = 20; + private static final int GAP = 2; + + private int pos; + + public WndGame() { + + super(); + + addButton( new RedButton( TXT_SETTINGS ) { + @Override + protected void onClick() { + hide(); + GameScene.show( new WndSettings( true ) ); + } + } ); + + // Restart + if (!Dungeon.hero.isAlive()) { + + RedButton btnStart; + addButton( btnStart = new RedButton( TXT_START ) { + @Override + protected void onClick() { + Dungeon.hero = null; + InterlevelScene.mode = InterlevelScene.Mode.DESCEND; + InterlevelScene.noStory = true; + Game.switchScene( InterlevelScene.class ); + } + } ); + btnStart.icon( Icons.get( Dungeon.hero.heroClass ) ); + + addButton( new RedButton( TXT_RANKINGS ) { + @Override + protected void onClick() { + InterlevelScene.mode = InterlevelScene.Mode.DESCEND; + Game.switchScene( RankingsScene.class ); + } + } ); + } + + // Main menu + addButton( new RedButton( TXT_MENU ) { + @Override + protected void onClick() { + try { + Dungeon.saveAll(); + } catch (IOException e) { + // + } + Game.switchScene( TitleScene.class ); + } + } ); + + // Exit + addButton( new RedButton( TXT_EXIT ) { + @Override + protected void onClick() { + Game.instance.finish(); + } + } ); + + // Cancel + addButton( new RedButton( TXT_RETURN ) { + @Override + protected void onClick() { + hide(); + } + } ); + + resize( WIDTH, pos ); + } + + private void addButton( RedButton btn ) { + add( btn ); + btn.setRect( 0, pos > 0 ? pos += GAP : 0, WIDTH, BTN_HEIGHT ); + pos += BTN_HEIGHT; + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndHero.java b/src/com/watabou/pixeldungeon/windows/WndHero.java new file mode 100644 index 0000000000..46cf4a18ff --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndHero.java @@ -0,0 +1,209 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import java.util.Locale; + +import com.watabou.gltextures.SmartTexture; +import com.watabou.gltextures.TextureCache; +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Group; +import com.watabou.noosa.Image; +import com.watabou.noosa.TextureFilm; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.buffs.Buff; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.scenes.GameScene; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndHero extends WndTabbed { + + private static final String TXT_STATS = "Stats"; + private static final String TXT_BUFFS = "Buffs"; + + private static final String TXT_EXP = "Experience"; + private static final String TXT_STR = "Strength"; + private static final String TXT_HEALTH = "Health"; + private static final String TXT_GOLD = "Gold Collected"; + private static final String TXT_DEPTH = "Maximum Depth"; + + private static final int WIDTH = 100; + private static final int TAB_WIDTH = 40; + + private StatsTab stats; + private BuffsTab buffs; + + private SmartTexture icons; + private TextureFilm film; + + public WndHero() { + + super(); + + icons = TextureCache.get( Assets.BUFFS_LARGE ); + film = new TextureFilm( icons, 16, 16 ); + + stats = new StatsTab(); + add( stats ); + + buffs = new BuffsTab(); + add( buffs ); + + add( new LabeledTab( TXT_STATS ) { + protected void select( boolean value ) { + super.select( value ); + stats.visible = stats.active = selected; + }; + } ); + add( new LabeledTab( TXT_BUFFS ) { + protected void select( boolean value ) { + super.select( value ); + buffs.visible = buffs.active = selected; + }; + } ); + for (Tab tab : tabs) { + tab.setSize( TAB_WIDTH, tabHeight() ); + } + + resize( WIDTH, (int)Math.max( stats.height(), buffs.height() ) ); + + select( 0 ); + } + + private class StatsTab extends Group { + + private static final String TXT_TITLE = "Level %d %s"; + private static final String TXT_CATALOGUS = "Catalogus"; + private static final String TXT_JOURNAL = "Journal"; + + private static final int GAP = 5; + + private float pos; + + public StatsTab() { + + Hero hero = Dungeon.hero; + + BitmapText title = PixelScene.createText( + Utils.format( TXT_TITLE, hero.lvl, hero.className() ).toUpperCase( Locale.ENGLISH ), 9 ); + title.hardlight( TITLE_COLOR ); + title.measure(); + add( title ); + + RedButton btnCatalogus = new RedButton( TXT_CATALOGUS ) { + @Override + protected void onClick() { + hide(); + GameScene.show( new WndCatalogus() ); + } + }; + btnCatalogus.setRect( 0, title.y + title.height(), btnCatalogus.reqWidth() + 2, btnCatalogus.reqHeight() + 2 ); + add( btnCatalogus ); + + RedButton btnJournal = new RedButton( TXT_JOURNAL ) { + @Override + protected void onClick() { + hide(); + GameScene.show( new WndJournal() ); + } + }; + btnJournal.setRect( + btnCatalogus.right() + 1, btnCatalogus.top(), + btnJournal.reqWidth() + 2, btnJournal.reqHeight() + 2 ); + add( btnJournal ); + + pos = btnCatalogus.bottom() + GAP; + + statSlot( TXT_STR, hero.STR() ); + statSlot( TXT_HEALTH, hero.HP + "/" + hero.HT ); + statSlot( TXT_EXP, hero.exp + "/" + hero.maxExp() ); + + pos += GAP; + + statSlot( TXT_GOLD, Statistics.goldCollected ); + statSlot( TXT_DEPTH, Statistics.deepestFloor ); + + pos += GAP; + } + + private void statSlot( String label, String value ) { + + BitmapText txt = PixelScene.createText( label, 8 ); + txt.y = pos; + add( txt ); + + txt = PixelScene.createText( value, 8 ); + txt.measure(); + txt.x = PixelScene.align( WIDTH * 0.65f ); + txt.y = pos; + add( txt ); + + pos += GAP + txt.baseLine(); + } + + private void statSlot( String label, int value ) { + statSlot( label, Integer.toString( value ) ); + } + + public float height() { + return pos; + } + } + + private class BuffsTab extends Group { + + private static final int GAP = 2; + + private float pos; + + public BuffsTab() { + for (Buff buff : Dungeon.hero.buffs()) { + buffSlot( buff ); + } + } + + private void buffSlot( Buff buff ) { + + int index = buff.icon(); + + if (index != BuffIndicator.NONE) { + + Image icon = new Image( icons ); + icon.frame( film.get( index ) ); + icon.y = pos; + add( icon ); + + BitmapText txt = PixelScene.createText( buff.toString(), 8 ); + txt.x = icon.width + GAP; + txt.y = pos + (int)(icon.height - txt.baseLine()) / 2; + add( txt ); + + pos += GAP + icon.height; + } + } + + public float height() { + return pos; + } + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndImp.java b/src/com/watabou/pixeldungeon/windows/WndImp.java new file mode 100644 index 0000000000..8f51447488 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndImp.java @@ -0,0 +1,90 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.npcs.Imp; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.quest.DwarfToken; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndImp extends Window { + + private static final String TXT_MESSAGE = + "Oh yes! You are my hero!\n" + + "Regarding your reward, I don't have cash with me right now, but I have something better for you. " + + "This is my family heirloom ring: my granddad took it off a dead paladin's finger."; + private static final String TXT_REWARD = "Take the ring"; + + private static final int WIDTH = 120; + private static final int BTN_HEIGHT = 18; + private static final float GAP = 2; + + public WndImp( final Imp imp, final DwarfToken tokens ) { + + super(); + + IconTitle titlebar = new IconTitle(); + titlebar.icon( new ItemSprite( tokens.image(), null ) ); + titlebar.label( Utils.capitalize( tokens.name() ) ); + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + BitmapTextMultiline message = PixelScene.createMultiline( TXT_MESSAGE, 6 ); + message.maxWidth = WIDTH; + message.measure(); + message.y = titlebar.bottom() + GAP; + add( message ); + + RedButton btnReward = new RedButton( TXT_REWARD ) { + @Override + protected void onClick() { + takeReward( imp, tokens, Imp.Quest.reward ); + } + }; + btnReward.setRect( 0, message.y + message.height() + GAP, WIDTH, BTN_HEIGHT ); + add( btnReward ); + + resize( WIDTH, (int)btnReward.bottom() ); + } + + private void takeReward( Imp imp, DwarfToken tokens, Item reward ) { + + hide(); + + tokens.detachAll( Dungeon.hero.belongings.backpack ); + + reward.identify(); + if (reward.doPickUp( Dungeon.hero )) { + GLog.i( Hero.TXT_YOU_NOW_HAVE, reward.name() ); + } else { + Dungeon.level.drop( reward, imp.pos ).sprite.drop(); + } + + imp.flee(); + + Imp.Quest.complete(); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndInfoCell.java b/src/com/watabou/pixeldungeon/windows/WndInfoCell.java new file mode 100644 index 0000000000..4220c0f8c2 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndInfoCell.java @@ -0,0 +1,84 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.Image; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.DungeonTilemap; +import com.watabou.pixeldungeon.actors.blobs.Blob; +import com.watabou.pixeldungeon.levels.Level; +import com.watabou.pixeldungeon.levels.Terrain; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.Window; + +public class WndInfoCell extends Window { + + private static final float GAP = 2; + + private static final int WIDTH = 120; + + private static final String TXT_NOTHING = "There is nothing here."; + + public WndInfoCell( int cell ) { + + super(); + + int tile = Dungeon.level.map[cell]; + if (Level.water[cell]) { + tile = Terrain.WATER; + } else if (Level.pit[cell]) { + tile = Terrain.CHASM; + } + + IconTitle titlebar = new IconTitle(); + if (tile == Terrain.WATER) { + Image water = new Image( Dungeon.level.waterTex() ); + water.frame( 0, 0, DungeonTilemap.SIZE, DungeonTilemap.SIZE ); + titlebar.icon( water ); + } else { + titlebar.icon( DungeonTilemap.tile( tile ) ); + } + titlebar.label( Dungeon.level.tileName( tile ) ); + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + BitmapTextMultiline info = PixelScene.createMultiline( 6 ); + add( info ); + + StringBuilder desc = new StringBuilder( Dungeon.level.tileDesc( tile ) ); + + final char newLine = '\n'; + for (Blob blob:Dungeon.level.blobs.values()) { + if (blob.cur[cell] > 0 && blob.tileDesc() != null) { + if (desc.length() > 0) { + desc.append( newLine ); + } + desc.append( blob.tileDesc() ); + } + } + + info.text( desc.length() > 0 ? desc.toString() : TXT_NOTHING ); + info.maxWidth = WIDTH; + info.measure(); + info.x = titlebar.left(); + info.y = titlebar.bottom() + GAP; + + resize( WIDTH, (int)(info.y + info.height()) ); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndInfoItem.java b/src/com/watabou/pixeldungeon/windows/WndInfoItem.java new file mode 100644 index 0000000000..8188d330cc --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndInfoItem.java @@ -0,0 +1,125 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Heap.Type; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.ui.ItemSlot; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndInfoItem extends Window { + + private static final String TXT_CHEST = "Chest"; + private static final String TXT_LOCKED_CHEST = "Locked chest"; + private static final String TXT_CRYSTAL_CHEST = "Crystal chest"; + private static final String TXT_TOMB = "Tomb"; + private static final String TXT_SKELETON = "Skeletal remains"; + private static final String TXT_WONT_KNOW = "You won't know what's inside until you open it!"; + private static final String TXT_NEED_KEY = TXT_WONT_KNOW + " But to open it you need a golden key."; + private static final String TXT_INSIDE = "You can see %s inside, but to open the chest you need a golden key."; + private static final String TXT_OWNER = + "This ancient tomb may contain something useful, " + + "but its owner will most certainly object to checking."; + private static final String TXT_REMAINS = + "This is all that's left from one of your predecessors. " + + "Maybe it's worth checking for any valuables."; + + private static final float GAP = 2; + + private static final int WIDTH = 120; + + public WndInfoItem( Heap heap ) { + + super(); + + if (heap.type == Heap.Type.HEAP || heap.type == Heap.Type.FOR_SALE) { + + Item item = heap.peek(); + + int color = TITLE_COLOR; + if (item.levelKnown && item.level > 0) { + color = ItemSlot.UPGRADED; + } else if (item.levelKnown && item.level < 0) { + color = ItemSlot.DEGRADED; + } + fillFields( item.image(), item.glowing(), color, item.toString(), item.info() ); + + } else { + + String title; + String info; + + if (heap.type == Type.CHEST) { + title = TXT_CHEST; + info = TXT_WONT_KNOW; + } else if (heap.type == Type.TOMB) { + title = TXT_TOMB; + info = TXT_OWNER; + } else if (heap.type == Type.SKELETON) { + title = TXT_SKELETON; + info = TXT_REMAINS; + } else if (heap.type == Type.CRYSTAL_CHEST) { + title = TXT_CRYSTAL_CHEST; + info = Utils.format( TXT_INSIDE, Utils.indefinite( heap.peek().name() ) ); + } else { + title = TXT_LOCKED_CHEST; + info = TXT_NEED_KEY; + } + + fillFields( heap.image(), heap.glowing(), TITLE_COLOR, title, info ); + + } + } + + public WndInfoItem( Item item ) { + + super(); + + int color = TITLE_COLOR; + if (item.levelKnown && item.level > 0) { + color = ItemSlot.UPGRADED; + } else if (item.levelKnown && item.level < 0) { + color = ItemSlot.DEGRADED; + } + + fillFields( item.image(), item.glowing(), color, item.toString(), item.info() ); + } + + private void fillFields( int image, ItemSprite.Glowing glowing, int titleColor, String title, String info ) { + + IconTitle titlebar = new IconTitle(); + titlebar.icon( new ItemSprite( image, glowing ) ); + titlebar.label( Utils.capitalize( title ), titleColor ); + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + BitmapTextMultiline txtInfo = PixelScene.createMultiline( info, 6 ); + txtInfo.maxWidth = WIDTH; + txtInfo.measure(); + txtInfo.x = titlebar.left(); + txtInfo.y = titlebar.bottom() + GAP; + add( txtInfo ); + + resize( WIDTH, (int)(txtInfo.y + txtInfo.height()) ); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndInfoMob.java b/src/com/watabou/pixeldungeon/windows/WndInfoMob.java new file mode 100644 index 0000000000..bb7743555d --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndInfoMob.java @@ -0,0 +1,130 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.ColorBlock; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.CharSprite; +import com.watabou.pixeldungeon.ui.BuffIndicator; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndInfoMob extends WndTitledMessage { + + private static final String TXT_SLEEPNIG = "\n\nThis %s is sleeping."; + private static final String TXT_HUNTING = "\n\nThis %s is hunting."; + private static final String TXT_WANDERING = "\n\nThis %s is wandering."; + private static final String TXT_FLEEING = "\n\nThis %s is fleeing."; + private static final String TXT_PASSIVE = "\n\nThe %s is passive."; + + public WndInfoMob( Mob mob ) { + + super( new MobTitle( mob ), desc( mob ) ); + + } + + private static String desc( Mob mob ) { + + StringBuilder builder = new StringBuilder( mob.description() ); + + switch (mob.state) { + case SLEEPING: + builder.append( String.format( TXT_SLEEPNIG, mob.name ) ); + break; + case HUNTING: + builder.append( String.format( TXT_HUNTING, mob.name ) ); + break; + case WANDERING: + builder.append( String.format( TXT_WANDERING, mob.name ) ); + break; + case FLEEING: + builder.append( String.format( TXT_FLEEING, mob.name ) ); + break; + case PASSIVE: + builder.append( String.format( TXT_PASSIVE, mob.name ) ); + break; + } + + return builder.toString(); + } + + private static class MobTitle extends Component { + + private static final int COLOR_BG = 0xFFCC0000; + private static final int COLOR_LVL = 0xFF00EE00; + + private static final int BAR_HEIGHT = 2; + private static final int GAP = 2; + + private CharSprite image; + private BitmapText name; + private ColorBlock hpBg; + private ColorBlock hpLvl; + private BuffIndicator buffs; + + private float hp; + + public MobTitle( Mob mob ) { + + hp = (float)mob.HP / mob.HT; + + name = PixelScene.createText( Utils.capitalize( mob.name ), 9 ); + name.hardlight( TITLE_COLOR ); + name.measure(); + add( name ); + + image = mob.sprite(); + add( image ); + + hpBg = new ColorBlock( 1, 1, COLOR_BG ); + add( hpBg ); + + hpLvl = new ColorBlock( 1, 1, COLOR_LVL ); + add( hpLvl ); + + buffs = new BuffIndicator( mob ); + add( buffs ); + } + + @Override + protected void layout() { + + image.x = 0; + image.y = Math.max( 0, name.height() + GAP + BAR_HEIGHT - image.height ); + + name.x = image.width + GAP; + name.y = image.height - BAR_HEIGHT - GAP - name.baseLine(); + + float w = width - image.width - GAP; + + hpBg.size( w, BAR_HEIGHT ); + hpLvl.size( w * hp, BAR_HEIGHT ); + + hpBg.x = hpLvl.x = image.width + GAP; + hpBg.y = hpLvl.y = image.height - BAR_HEIGHT; + + buffs.setPos( + name.x + name.width() + GAP, + name.y + name.baseLine() - BuffIndicator.SIZE ); + + height = hpBg.y + hpBg.height(); + } + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndInfoPlant.java b/src/com/watabou/pixeldungeon/windows/WndInfoPlant.java new file mode 100644 index 0000000000..f74982895a --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndInfoPlant.java @@ -0,0 +1,53 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.pixeldungeon.plants.Plant; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.PlantSprite; +import com.watabou.pixeldungeon.ui.Window; + +public class WndInfoPlant extends Window { + + private static final float GAP = 2; + + private static final int WIDTH = 120; + + public WndInfoPlant( Plant plant ) { + + super(); + + IconTitle titlebar = new IconTitle(); + titlebar.icon( new PlantSprite( plant.image ) ); + titlebar.label( plant.plantName ); + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + BitmapTextMultiline info = PixelScene.createMultiline( 6 ); + add( info ); + + info.text( plant.desc() ); + info.maxWidth = WIDTH; + info.measure(); + info.x = titlebar.left(); + info.y = titlebar.bottom() + GAP; + + resize( WIDTH, (int)(info.y + info.height()) ); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndItem.java b/src/com/watabou/pixeldungeon/windows/WndItem.java new file mode 100644 index 0000000000..66326a2723 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndItem.java @@ -0,0 +1,90 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.ui.ItemSlot; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndItem extends Window { + + private static final float BUTTON_WIDTH = 36; + private static final float BUTTON_HEIGHT = 16; + + private static final float GAP = 2; + + private static final int WIDTH = 120; + + public WndItem( final WndBag owner, final Item item ) { + + super(); + + IconTitle titlebar = new IconTitle(); + titlebar.icon( new ItemSprite( item.image(), item.glowing() ) ); + titlebar.label( Utils.capitalize( item.toString() ) ); + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + if (item.levelKnown && item.level > 0) { + titlebar.color( ItemSlot.UPGRADED ); + } else if (item.levelKnown && item.level < 0) { + titlebar.color( ItemSlot.DEGRADED ); + } + + BitmapTextMultiline info = PixelScene.createMultiline( item.info(), 6 ); + info.maxWidth = WIDTH; + info.measure(); + info.x = titlebar.left(); + info.y = titlebar.bottom() + GAP; + add( info ); + + float y = info.y + info.height() + GAP; + float x = 0; + + if (Dungeon.hero.isAlive() && owner != null) { + for (final String action:item.actions( Dungeon.hero )) { + + RedButton btn = new RedButton( action ) { + @Override + protected void onClick() { + item.execute( Dungeon.hero, action ); + hide(); + owner.hide(); + }; + }; + btn.setSize( Math.max( BUTTON_WIDTH, btn.reqWidth() ), BUTTON_HEIGHT ); + if (x + btn.width() > WIDTH) { + x = 0; + y += BUTTON_HEIGHT + GAP; + } + btn.setPos( x, y ); + add( btn ); + + x += btn.width() + GAP; + } + } + + resize( WIDTH, (int)(y + (x > 0 ? BUTTON_HEIGHT : 0)) ); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndJournal.java b/src/com/watabou/pixeldungeon/windows/WndJournal.java new file mode 100644 index 0000000000..1b84e8f894 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndJournal.java @@ -0,0 +1,123 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import java.util.Collections; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Image; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Journal; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.Icons; +import com.watabou.pixeldungeon.ui.ScrollPane; +import com.watabou.pixeldungeon.ui.Window; + +public class WndJournal extends Window { + + private static final int WIDTH = 112; + private static final int HEIGHT = 160; + + private static final int ITEM_HEIGHT = 18; + + private static final String TXT_TITLE = "Journal"; + + private BitmapText txtTitle; + private ScrollPane list; + + public WndJournal() { + + super(); + resize( WIDTH, HEIGHT ); + + txtTitle = PixelScene.createText( TXT_TITLE, 9 ); + txtTitle.hardlight( Window.TITLE_COLOR ); + txtTitle.measure(); + txtTitle.x = PixelScene.align( PixelScene.uiCamera, (WIDTH - txtTitle.width()) / 2 ); + add( txtTitle ); + + Component content = new Component(); + + Collections.sort( Journal.records ); + + float pos = 0; + for (Journal.Record rec : Journal.records) { + ListItem item = new ListItem( rec.feature, rec.depth ); + item.setRect( 0, pos, WIDTH, ITEM_HEIGHT ); + content.add( item ); + + pos += item.height(); + } + + content.setSize( WIDTH, pos ); + + list = new ScrollPane( content ); + add( list ); + + list.setRect( 0, txtTitle.height(), WIDTH, HEIGHT - txtTitle.height() ); + } + + private static class ListItem extends Component { + + private BitmapText feature; + private BitmapText depth; + + private Image icon; + + public ListItem( Journal.Feature f, int d ) { + super(); + + feature.text( f.desc ); + feature.measure(); + + depth.text( Integer.toString( d ) ); + depth.measure(); + + if (d == Dungeon.depth) { + feature.hardlight( TITLE_COLOR ); + depth.hardlight( TITLE_COLOR ); + } + } + + @Override + protected void createChildren() { + feature = PixelScene.createText( 9 ); + add( feature ); + + depth = new BitmapText( PixelScene.font1x ); + add( depth ); + + icon = Icons.get( Icons.DEPTH ); + add( icon ); + } + + @Override + protected void layout() { + + icon.x = width - icon.width; + + depth.x = icon.x - 1 - depth.width(); + depth.y = PixelScene.align( y + (height - depth.height()) / 2 ); + + icon.y = depth.y - 1; + + feature.y = PixelScene.align( depth.y + depth.baseLine() - feature.baseLine() ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndList.java b/src/com/watabou/pixeldungeon/windows/WndList.java new file mode 100644 index 0000000000..72b33749a9 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndList.java @@ -0,0 +1,72 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.Window; + +public class WndList extends Window { + + private static final int WIDTH = 120; + private static final int MARGIN = 4; + private static final int GAP = 4; + + private static final String DOT = "\u007F"; + + public WndList( String[] items ) { + + super(); + + float pos = MARGIN; + float dotWidth = 0; + float maxWidth = 0; + + for (int i=0; i < items.length; i++) { + + if (i > 0) { + pos += GAP; + } + + BitmapText dot = PixelScene.createText( DOT, 6 ); + dot.x = MARGIN; + dot.y = pos; + if (dotWidth == 0) { + dot.measure(); + dotWidth = dot.width(); + } + add( dot ); + + BitmapTextMultiline item = PixelScene.createMultiline( items[i], 6 ); + item.x = dot.x + dotWidth; + item.y = pos; + item.maxWidth = (int)(WIDTH - MARGIN * 2 - dotWidth); + item.measure(); + add( item ); + + pos += item.height(); + float w = item.width(); + if (w > maxWidth) { + maxWidth = w; + } + } + + resize( (int)(maxWidth + dotWidth + MARGIN * 2), (int)(pos + MARGIN) ); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndMessage.java b/src/com/watabou/pixeldungeon/windows/WndMessage.java new file mode 100644 index 0000000000..3d8833e3bf --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndMessage.java @@ -0,0 +1,43 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.Window; + +public class WndMessage extends Window { + + private static final int WIDTH = 120; + private static final int MARGIN = 4; + + public WndMessage( String text ) { + + super(); + + BitmapTextMultiline info = PixelScene.createMultiline( text, 6 ); + info.maxWidth = WIDTH - MARGIN * 2; + info.measure(); + info.x = info.y = MARGIN; + add( info ); + + resize( + (int)info.width() + MARGIN * 2, + (int)info.height() + MARGIN * 2 ); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndOptions.java b/src/com/watabou/pixeldungeon/windows/WndOptions.java new file mode 100644 index 0000000000..db236db1de --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndOptions.java @@ -0,0 +1,69 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.ui.Window; + +public class WndOptions extends Window { + + private static final int WIDTH = 120; + private static final int MARGIN = 2; + private static final int BUTTON_HEIGHT = 20; + + public WndOptions( String title, String message, String... options ) { + super(); + + BitmapTextMultiline tfTitle = PixelScene.createMultiline( title, 9 ); + tfTitle.hardlight( TITLE_COLOR ); + tfTitle.x = tfTitle.y = MARGIN; + tfTitle.maxWidth = WIDTH - MARGIN * 2; + tfTitle.measure(); + add( tfTitle ); + + BitmapTextMultiline tfMesage = PixelScene.createMultiline( message, 8 ); + tfMesage.maxWidth = WIDTH - MARGIN * 2; + tfMesage.measure(); + tfMesage.x = MARGIN; + tfMesage.y = tfTitle.y + tfTitle.height() + MARGIN; + add( tfMesage ); + + float pos = tfMesage.y + tfMesage.height() + MARGIN; + + for (int i=0; i < options.length; i++) { + final int index = i; + RedButton btn = new RedButton( options[i] ) { + @Override + protected void onClick() { + hide(); + onSelect( index ); + } + }; + btn.setRect( MARGIN, pos, WIDTH - MARGIN * 2, BUTTON_HEIGHT ); + add( btn ); + + pos += BUTTON_HEIGHT + MARGIN; + } + + resize( WIDTH, (int)pos ); + } + + protected void onSelect( int index ) {}; +} diff --git a/src/com/watabou/pixeldungeon/windows/WndQuest.java b/src/com/watabou/pixeldungeon/windows/WndQuest.java new file mode 100644 index 0000000000..d9c068c818 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndQuest.java @@ -0,0 +1,28 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.pixeldungeon.actors.mobs.Mob; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndQuest extends WndTitledMessage { + + public WndQuest( Mob.NPC questgiver, String text ) { + super( questgiver.sprite(), Utils.capitalize( questgiver.name ), text ); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndRanking.java b/src/com/watabou/pixeldungeon/windows/WndRanking.java new file mode 100644 index 0000000000..13cdcdc836 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndRanking.java @@ -0,0 +1,345 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import java.util.Locale; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.ColorBlock; +import com.watabou.noosa.Game; +import com.watabou.noosa.Group; +import com.watabou.noosa.Image; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.ui.Button; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Badges; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.hero.Belongings; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.HeroSprite; +import com.watabou.pixeldungeon.ui.BadgesList; +import com.watabou.pixeldungeon.ui.Icons; +import com.watabou.pixeldungeon.ui.ItemSlot; +import com.watabou.pixeldungeon.ui.ScrollPane; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndRanking extends WndTabbed { + + private static final String TXT_ERROR = "Unable to load additional information"; + + private static final String TXT_STATS = "Stats"; + private static final String TXT_ITEMS = "Items"; + private static final String TXT_BADGES = "Badges"; + + private static final int WIDTH = 112; + private static final int HEIGHT = 144; + + private static final int TAB_WIDTH = 40; + + private Thread thread; + private String error = null; + + private Image busy; + + public WndRanking( final String gameFile ) { + + super(); + resize( WIDTH, HEIGHT ); + + thread = new Thread() { + @Override + public void run() { + try { + Badges.loadGlobal(); + Dungeon.loadGame( gameFile ); + } catch (Exception e ) { + error = TXT_ERROR; + } + } + }; + thread.start(); + + busy = Icons.BUSY.get(); + busy.origin.set( busy.width / 2, busy.height / 2 ); + busy.angularSpeed = 720; + busy.x = (WIDTH - busy.width) / 2; + busy.y = (HEIGHT - busy.height) / 2; + add( busy ); + } + + @Override + public void update() { + super.update(); + + if (thread != null && !thread.isAlive()) { + thread = null; + if (error == null) { + remove( busy ); + createControls(); + } else { + hide(); + Game.scene().add( new WndError( TXT_ERROR ) ); + } + } + } + + private void createControls() { + + String[] labels = + {TXT_STATS, TXT_ITEMS, TXT_BADGES}; + Group[] pages = + {new StatsTab(), new ItemsTab(), new BadgesTab()}; + + for (int i=0; i < pages.length; i++) { + + add( pages[i] ); + + Tab tab = new RankingTab( labels[i], pages[i] ); + tab.setSize( TAB_WIDTH, tabHeight() ); + add( tab ); + } + + select( 0 ); + } + + private class RankingTab extends LabeledTab { + + private Group page; + + public RankingTab( String label, Group page ) { + super( label ); + this.page = page; + } + + @Override + protected void select( boolean value ) { + super.select( value ); + if (page != null) { + page.visible = page.active = selected; + } + } + } + + private class StatsTab extends Group { + + private static final int GAP = 4; + + private static final String TXT_TITLE = "Level %d %s"; + + private static final String TXT_HEALTH = "Health"; + private static final String TXT_STR = "Strength"; + + private static final String TXT_DURATION = "Game Duration"; + + private static final String TXT_DEPTH = "Maximum Depth"; + private static final String TXT_ENEMIES = "Mobs Killed"; + private static final String TXT_GOLD = "Gold Collected"; + + private static final String TXT_FOOD = "Food Eaten"; + private static final String TXT_ALCHEMY = "Potions Cooked"; + private static final String TXT_ANKHS = "Ankhs Used"; + + public StatsTab() { + super(); + + String heroClass = Dungeon.hero.className(); + + IconTitle title = new IconTitle(); + title.icon( HeroSprite.avatar( Dungeon.hero.heroClass, Dungeon.hero.tier() ) ); + title.label( Utils.format( TXT_TITLE, Dungeon.hero.lvl, heroClass ).toUpperCase( Locale.ENGLISH ) ); + title.setRect( 0, 0, WIDTH, 0 ); + add( title ); + + float pos = title.bottom() + GAP + GAP; + + pos = statSlot( this, TXT_STR, Integer.toString( Dungeon.hero.STR ), pos ); + pos = statSlot( this, TXT_HEALTH, Integer.toString( Dungeon.hero.HT ), pos ); + + pos += GAP; + + pos = statSlot( this, TXT_DURATION, Integer.toString( (int)Statistics.duration ), pos ); + + pos += GAP; + + pos = statSlot( this, TXT_DEPTH, Integer.toString( Statistics.deepestFloor ), pos ); + pos = statSlot( this, TXT_ENEMIES, Integer.toString( Statistics.enemiesSlain ), pos ); + pos = statSlot( this, TXT_GOLD, Integer.toString( Statistics.goldCollected ), pos ); + + pos += GAP; + + pos = statSlot( this, TXT_FOOD, Integer.toString( Statistics.foodEaten ), pos ); + pos = statSlot( this, TXT_ALCHEMY, Integer.toString( Statistics.potionsCooked ), pos ); + pos = statSlot( this, TXT_ANKHS, Integer.toString( Statistics.ankhsUsed ), pos ); + } + + private float statSlot( Group parent, String label, String value, float pos ) { + + BitmapText txt = PixelScene.createText( label, 7 ); + txt.y = pos; + parent.add( txt ); + + txt = PixelScene.createText( value, 7 ); + txt.measure(); + txt.x = PixelScene.align( WIDTH * 0.65f ); + txt.y = pos; + parent.add( txt ); + + return pos + GAP + txt.baseLine(); + } + } + + private class ItemsTab extends Group { + + private float pos; + + public ItemsTab() { + super(); + + Belongings stuff = Dungeon.hero.belongings; + if (stuff.weapon != null) { + addItem( stuff.weapon ); + } + if (stuff.armor != null) { + addItem( stuff.armor ); + } + if (stuff.ring1 != null) { + addItem( stuff.ring1 ); + } + if (stuff.ring2 != null) { + addItem( stuff.ring2 ); + } + + if (Dungeon.quickslot instanceof Item && + Dungeon.hero.belongings.backpack.contains( (Item)Dungeon.quickslot )) { + + addItem( (Item)Dungeon.quickslot ); + } else if (Dungeon.quickslot instanceof Class){ + @SuppressWarnings("unchecked") + Item item = Dungeon.hero.belongings.getItem( (Class)Dungeon.quickslot ); + if (item != null) { + addItem( item ); + } + } + } + + private void addItem( Item item ) { + ItemButton slot = new ItemButton( item ); + slot.setRect( 0, pos, width, ItemButton.HEIGHT ); + add( slot ); + + pos += slot.height() + 1; + } + } + + private class BadgesTab extends Group { + + public BadgesTab() { + super(); + + camera = WndRanking.this.camera; + + ScrollPane list = new BadgesList( false ); + add( list ); + + list.setSize( WIDTH, HEIGHT ); + } + } + + private class ItemButton extends Button { + + public static final int HEIGHT = 28; + + private Item item; + + private ItemSlot slot; + private ColorBlock bg; + private BitmapText name; + + public ItemButton( Item item ) { + + super(); + + this.item = item; + + slot.item( item ); + if (item.cursed && item.cursedKnown) { + bg.ra = +0.2f; + bg.ga = -0.1f; + } else if (!item.isIdentified()) { + bg.ra = 0.1f; + bg.ba = 0.1f; + } + } + + @Override + protected void createChildren() { + + bg = new ColorBlock( HEIGHT, HEIGHT, 0xFF4A4D44 ); + add( bg ); + + slot = new ItemSlot(); + add( slot ); + + name = PixelScene.createText( "?", 7 ); + add( name ); + + super.createChildren(); + } + + @Override + protected void layout() { + bg.x = x; + bg.y = y; + + slot.setRect( x, y, HEIGHT, HEIGHT ); + + name.x = slot.right() + 2; + name.y = y + (height - name.baseLine()) / 2; + + String str = Utils.capitalize( item.name() ); + name.text( str ); + name.measure(); + if (name.width() > width - name.x) { + do { + str = str.substring( 0, str.length() - 1 ); + name.text( str + "..." ); + name.measure(); + } while (name.width() > width - name.x); + } + + super.layout(); + } + + @Override + protected void onTouchDown() { + bg.brightness( 1.5f ); + Sample.INSTANCE.play( Assets.SND_CLICK, 0.7f, 0.7f, 1.2f ); + }; + + protected void onTouchUp() { + bg.brightness( 1.0f ); + }; + + @Override + protected void onClick() { + Game.scene().add( new WndItem( null, item ) ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndResurrect.java b/src/com/watabou/pixeldungeon/windows/WndResurrect.java new file mode 100644 index 0000000000..8a8ce7fe1f --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndResurrect.java @@ -0,0 +1,102 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.Game; +import com.watabou.pixeldungeon.Rankings; +import com.watabou.pixeldungeon.Statistics; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.items.Ankh; +import com.watabou.pixeldungeon.scenes.InterlevelScene; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.ui.Window; + +public class WndResurrect extends Window { + + private static final String TXT_MESSAGE = "You died, but you were given another chance to win this dungeon. Will you take it?"; + private static final String TXT_YES = "Yes, I will fight!"; + private static final String TXT_NO = "No, I give up"; + + private static final int WIDTH = 120; + private static final int BTN_HEIGHT = 18; + private static final float GAP = 2; + + public static WndResurrect instance; + public static Object causeOfDeath; + + public WndResurrect( final Ankh ankh, Object causeOfDeath ) { + + super(); + + instance = this; + WndResurrect.causeOfDeath = causeOfDeath; + + IconTitle titlebar = new IconTitle(); + titlebar.icon( new ItemSprite( ankh.image(), null ) ); + titlebar.label( ankh.name() ); + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + BitmapTextMultiline message = PixelScene.createMultiline( TXT_MESSAGE, 6 ); + message.maxWidth = WIDTH; + message.measure(); + message.y = titlebar.bottom() + GAP; + add( message ); + + RedButton btnYes = new RedButton( TXT_YES ) { + @Override + protected void onClick() { + hide(); + + Statistics.ankhsUsed++; + + InterlevelScene.mode = InterlevelScene.Mode.RESURRECT; + Game.switchScene( InterlevelScene.class ); + } + }; + btnYes.setRect( 0, message.y + message.height() + GAP, WIDTH, BTN_HEIGHT ); + add( btnYes ); + + RedButton btnNo = new RedButton( TXT_NO ) { + @Override + protected void onClick() { + hide(); + + Rankings.INSTANCE.submit( false ); + Hero.reallyDie( WndResurrect.causeOfDeath ); + } + }; + btnNo.setRect( 0, btnYes.bottom() + GAP, WIDTH, BTN_HEIGHT ); + add( btnNo ); + + resize( WIDTH, (int)btnNo.bottom() ); + } + + @Override + public void destroy() { + super.destroy(); + instance = null; + } + + @Override + public void onBackPressed() { + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndSadGhost.java b/src/com/watabou/pixeldungeon/windows/WndSadGhost.java new file mode 100644 index 0000000000..35287fede4 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndSadGhost.java @@ -0,0 +1,104 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.npcs.Ghost; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.quest.DriedRose; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndSadGhost extends Window { + + private static final String TXT_ROSE = + "Yes! Yes!!! This is it! Please give it to me! " + + "And you can take one of these items, maybe they " + + "will be useful to you in your journey..."; + private static final String TXT_RAT = + "Yes! The ugly creature is slain and I can finally rest... " + + "Please take one of these items, maybe they " + + "will be useful to you in your journey..."; + private static final String TXT_WEAPON = "Ghost's weapon"; + private static final String TXT_ARMOR = "Ghost's armor"; + + private static final int WIDTH = 120; + private static final int BTN_HEIGHT = 18; + private static final float GAP = 2; + + public WndSadGhost( final Ghost ghost, final Item item ) { + + super(); + + IconTitle titlebar = new IconTitle(); + titlebar.icon( new ItemSprite( item.image(), null ) ); + titlebar.label( Utils.capitalize( item.name() ) ); + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + BitmapTextMultiline message = PixelScene.createMultiline( item instanceof DriedRose ? TXT_ROSE : TXT_RAT, 6 ); + message.maxWidth = WIDTH; + message.measure(); + message.y = titlebar.bottom() + GAP; + add( message ); + + RedButton btnWeapon = new RedButton( TXT_WEAPON ) { + @Override + protected void onClick() { + selectReward( ghost, item, Ghost.Quest.weapon ); + } + }; + btnWeapon.setRect( 0, message.y + message.height() + GAP, WIDTH, BTN_HEIGHT ); + add( btnWeapon ); + + RedButton btnArmor = new RedButton( TXT_ARMOR ) { + @Override + protected void onClick() { + selectReward( ghost, item, Ghost.Quest.armor ); + } + }; + btnArmor.setRect( 0, btnWeapon.bottom() + GAP, WIDTH, BTN_HEIGHT ); + add( btnArmor ); + + resize( WIDTH, (int)btnArmor.bottom() ); + } + + private void selectReward( Ghost ghost, Item item, Item reward ) { + + hide(); + + item.detach( Dungeon.hero.belongings.backpack ); + + if (reward.doPickUp( Dungeon.hero )) { + GLog.i( Hero.TXT_YOU_NOW_HAVE, reward.name() ); + } else { + Dungeon.level.drop( reward, ghost.pos ).sprite.drop(); + } + + ghost.yell( "Farewell, adventurer!" ); + ghost.die( null ); + + Ghost.Quest.complete(); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndSettings.java b/src/com/watabou/pixeldungeon/windows/WndSettings.java new file mode 100644 index 0000000000..f1a3b0b24f --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndSettings.java @@ -0,0 +1,171 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.Camera; +import com.watabou.noosa.audio.Sample; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.PixelDungeon; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.CheckBox; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.ui.Window; + +public class WndSettings extends Window { + + private static final String TXT_ZOOM_IN = "+"; + private static final String TXT_ZOOM_OUT = "-"; + private static final String TXT_ZOOM_DEFAULT = "Default Zoom"; + + private static final String TXT_SCALE_UP = "Scale up UI"; + + private static final String TXT_MUSIC = "Music"; + + private static final String TXT_SOUND = "Sound FX"; + + private static final String TXT_BRIGHTNESS = "Brightness"; + + private static final String TXT_SWITCH_PORT = "Switch to portrait"; + private static final String TXT_SWITCH_LAND = "Switch to landscape"; + + private static final int WIDTH = 112; + private static final int BTN_HEIGHT = 20; + private static final int GAP = 2; + + private RedButton btnZoomOut; + private RedButton btnZoomIn; + + public WndSettings( boolean inGame ) { + super(); + + if (inGame) { + int w = BTN_HEIGHT; + + // Zoom out + btnZoomOut = new RedButton( TXT_ZOOM_OUT ) { + @Override + protected void onClick() { + zoom( Camera.main.zoom - 1 ); + } + }; + add( btnZoomOut.setRect( 0, 0, w, BTN_HEIGHT) ); + + // Zoom in + btnZoomIn = new RedButton( TXT_ZOOM_IN ) { + @Override + protected void onClick() { + zoom( Camera.main.zoom + 1 ); + } + }; + add( btnZoomIn.setRect( WIDTH - w, 0, w, BTN_HEIGHT) ); + + // Default zoom + add( new RedButton( TXT_ZOOM_DEFAULT ) { + @Override + protected void onClick() { + zoom( PixelScene.defaultZoom ); + } + }.setRect( btnZoomOut.right(), 0, WIDTH - btnZoomIn.width() - btnZoomOut.width(), BTN_HEIGHT ) ); + + } else { + + CheckBox btnScaleUp = new CheckBox( TXT_SCALE_UP ) { + @Override + protected void onClick() { + super.onClick(); + PixelDungeon.scaleUp( checked() ); + } + }; + btnScaleUp.setRect( 0, 0, WIDTH, BTN_HEIGHT ); + btnScaleUp.checked( PixelDungeon.scaleUp() ); + add( btnScaleUp ); + + } + + CheckBox btnMusic = new CheckBox( TXT_MUSIC ) { + @Override + protected void onClick() { + super.onClick(); + PixelDungeon.music( checked() ); + } + }; + btnMusic.setRect( 0, BTN_HEIGHT + GAP, WIDTH, BTN_HEIGHT ); + btnMusic.checked( PixelDungeon.music() ); + add( btnMusic ); + + CheckBox btnSound = new CheckBox( TXT_SOUND ) { + @Override + protected void onClick() { + super.onClick(); + PixelDungeon.soundFx( checked() ); + Sample.INSTANCE.play( Assets.SND_CLICK ); + } + }; + btnSound.setRect( 0, btnMusic.bottom() + GAP, WIDTH, BTN_HEIGHT ); + btnSound.checked( PixelDungeon.soundFx() ); + add( btnSound ); + + if (!inGame) { + + RedButton btnOrientation = new RedButton( orientationText() ) { + @Override + protected void onClick() { + PixelDungeon.landscape( !PixelDungeon.landscape() ); + } + }; + btnOrientation.setRect( 0, btnSound.bottom() + GAP, WIDTH, BTN_HEIGHT ); + add( btnOrientation ); + + resize( WIDTH, (int)btnOrientation.bottom() ); + + } else { + + CheckBox btnBrightness = new CheckBox( TXT_BRIGHTNESS ) { + @Override + protected void onClick() { + super.onClick(); + PixelDungeon.brightness( checked() ); + } + }; + btnBrightness.setRect( 0, btnSound.bottom() + GAP, WIDTH, BTN_HEIGHT ); + btnBrightness.checked( PixelDungeon.brightness() ); + add( btnBrightness ); + + resize( WIDTH, (int)btnBrightness.bottom() ); + + } + } + + private void zoom( float value ) { + + Camera.main.zoom( value ); + PixelDungeon.zoom( (int)(value - PixelScene.defaultZoom) ); + + updateEnabled(); + } + + private void updateEnabled() { + float zoom = Camera.main.zoom; + btnZoomIn.enable( zoom < PixelScene.maxZoom ); + btnZoomOut.enable( zoom > PixelScene.minZoom ); + } + + private String orientationText() { + return PixelDungeon.landscape() ? TXT_SWITCH_PORT : TXT_SWITCH_LAND; + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndStory.java b/src/com/watabou/pixeldungeon/windows/WndStory.java new file mode 100644 index 0000000000..526d8106eb --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndStory.java @@ -0,0 +1,133 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.input.Touchscreen.Touch; +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.Game; +import com.watabou.noosa.TouchArea; +import com.watabou.pixeldungeon.Chrome; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.utils.SparseArray; + +public class WndStory extends Window { + + private static final int WIDTH = 120; + private static final int MARGIN = 6; + + private static final float bgR = 0.77f; + private static final float bgG = 0.73f; + private static final float bgB = 0.62f; + + public static final int ID_SEWERS = 0; + public static final int ID_PRISON = 1; + public static final int ID_CAVES = 2; + public static final int ID_METROPOLIS = 3; + public static final int ID_HALLS = 4; + + private static final SparseArray CHAPTERS = new SparseArray(); + + static { + CHAPTERS.put( ID_SEWERS, + "The Dungeon lies right beneath the City, its upper levels actually constitute the City's sewer system. " + + "Being nominally a part of the City, these levels are not that dangerous. No one will call it a safe place, " + + "but at least you won't need to deal with evil magic here." ); + + CHAPTERS.put( ID_PRISON, + "Many years ago an underground prison was built here for the most dangerous criminals. At the time it seemed " + + "like a very clever idea, because this place indeed was very hard to escape. But soon dark miasma started to permeate " + + "from below, driving prisoners and guards insane. In the end the prison was abandoned, though some convicts " + + "were left locked up here." ); + + CHAPTERS.put( ID_CAVES, + "The caves, which stretch down under the abandoned prison, are sparcely populated. They lie too deep to be exploited " + + "by the City and they are too poor in minerals to interest the dwarves. In the past there was a trade outpost " + + "somewhere here on the route between these two states, but it has perished since the decline of Dwarven Metropolis. " + + "Only omnipresent gnolls and subterranean animals dwell here now." ); + + CHAPTERS.put( ID_METROPOLIS, + "Dwarven Metropolis was once the greatest of dwarven city-states. In its heyday the mechanized army of dwarves " + + "has successfully repelled the invasion of the old god and his demon army. But it is said, that the returning warriors " + + "have brought seeds of corruption with them, and that victory was the beginning of the end for the underground kingdom." ); + + CHAPTERS.put( ID_HALLS, + "In the past these levels were the outskirts of Metropolis. After the costly victory in the war with the old god " + + "dwarves were too weakened to clear them of remaining demons. Gradually demons have tightened their grip on this place " + + "and now it's called Demon Halls.\n\n" + + "Very few adventurers have ever descended this far..." ); + }; + + private BitmapTextMultiline tf; + + private float delay; + + public WndStory( String text ) { + super( 0, 0, Chrome.get( Chrome.Type.SCROLL ) ); + + tf = PixelScene.createMultiline( text, 7 ); + tf.maxWidth = WIDTH - MARGIN * 2; + tf.measure(); + tf.ra = bgR; + tf.ga = bgG; + tf.ba = bgB; + tf.rm = -bgR; + tf.gm = -bgG; + tf.bm = -bgB; + tf.x = MARGIN; + add( tf ); + + add( new TouchArea( chrome ) { + @Override + protected void onClick( Touch touch ) { + hide(); + } + } ); + + resize( (int)(tf.width() + MARGIN * 2), (int)Math.min( tf.height(), 180 ) ); + } + + @Override + public void update() { + super.update(); + + if (delay > 0 && (delay -= Game.elapsed) <= 0) { + chrome.visible = tf.visible = true; + } + } + + public static void showChapter( int id ) { + + if (Dungeon.chapters.contains( id )) { + return; + } + + String text = CHAPTERS.get( id ); + if (text != null) { + WndStory wnd = new WndStory( text ); + if ((wnd.delay = 0.6f) > 0) { + wnd.chrome.visible = wnd.tf.visible = false; + } + + Game.scene().add( wnd ); + + Dungeon.chapters.add( id ); + } + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndTabbed.java b/src/com/watabou/pixeldungeon/windows/WndTabbed.java new file mode 100644 index 0000000000..18282d95fd --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndTabbed.java @@ -0,0 +1,187 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import java.util.ArrayList; + +import com.watabou.noosa.BitmapText; +import com.watabou.noosa.Game; +import com.watabou.noosa.NinePatch; +import com.watabou.noosa.audio.Sample; +import com.watabou.noosa.ui.Button; +import com.watabou.pixeldungeon.Assets; +import com.watabou.pixeldungeon.Chrome; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.Window; + +public class WndTabbed extends Window { + + protected ArrayList tabs = new ArrayList(); + protected Tab selected; + + public WndTabbed() { + super( 0, 0, Chrome.get( Chrome.Type.TAB_SET ) ); + } + + protected Tab add( Tab tab ) { + + tab.setPos( tabs.size() == 0 ? + -chrome.marginLeft() + 1 : + tabs.get( tabs.size() - 1 ).right(), height ); + tab.select( false ); + super.add( tab ); + + tabs.add( tab ); + + return tab; + } + + public void select( int index ) { + select( tabs.get( index ) ); + } + + public void select( Tab tab ) { + if (tab != selected) { + for (Tab t : tabs) { + if (t == selected) { + t.select( false ); + } else if (t == tab) { + t.select( true ); + } + } + + selected = tab; + } + } + + @Override + public void resize( int w, int h ) { + // -> super.resize(...) + this.width = w; + this.height = h; + + chrome.size( + width + chrome.marginHor(), + height + chrome.marginVer() ); + + camera.resize( (int)chrome.width, (int)(chrome.marginTop() + height + tabHeight()) ); + camera.x = (int)(Game.width - camera.screenWidth()) / 2; + camera.y = (int)(Game.height - camera.screenHeight()) / 2; + // <- super.resize(...) + + for (Tab tab : tabs) { + remove( tab ); + } + + ArrayList tabs = new ArrayList( this.tabs ); + this.tabs.clear(); + + for (Tab tab : tabs) { + add( tab ); + } + } + + protected int tabHeight() { + return 25; + } + + protected void onClick( Tab tab ) { + select( tab ); + } + + protected class Tab extends Button { + + protected final int CUT = 5; + + protected boolean selected; + + protected NinePatch bg; + + @Override + protected void layout() { + super.layout(); + + if (bg != null) { + bg.x = x; + bg.y = y; + bg.size( width, height ); + } + } + + protected void select( boolean value ) { + + active = !(selected = value); + + if (bg != null) { + remove( bg ); + } + + bg = Chrome.get( selected ? + Chrome.Type.TAB_SELECTED : + Chrome.Type.TAB_UNSELECTED ); + addToBack( bg ); + + layout(); + } + + @Override + protected void onClick() { + Sample.INSTANCE.play( Assets.SND_CLICK, 0.7f, 0.7f, 1.2f ); + WndTabbed.this.onClick( this ); + } + } + + protected class LabeledTab extends Tab { + + private BitmapText btLabel; + + public LabeledTab( String label ) { + + super(); + + btLabel.text( label ); + btLabel.measure(); + } + + @Override + protected void createChildren() { + super.createChildren(); + + btLabel = PixelScene.createText( 9 ); + add( btLabel ); + } + + @Override + protected void layout() { + super.layout(); + + btLabel.x = PixelScene.align( x + (width - btLabel.width()) / 2 ); + btLabel.y = PixelScene.align( y + (height - btLabel.baseLine()) / 2 ) - 1; + if (!selected) { + btLabel.y -= 2; + } + } + + @Override + protected void select( boolean value ) { + super.select( value ); + btLabel.am = selected ? 1.0f : 0.6f; + } + } + +} diff --git a/src/com/watabou/pixeldungeon/windows/WndTitledMessage.java b/src/com/watabou/pixeldungeon/windows/WndTitledMessage.java new file mode 100644 index 0000000000..7e94cef8f0 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndTitledMessage.java @@ -0,0 +1,72 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.noosa.Image; +import com.watabou.noosa.ui.Component; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.ui.Window; + +public class WndTitledMessage extends Window { + + private static final int WIDTH = 120; + private static final int GAP = 2; + + private BitmapTextMultiline normal; + private BitmapTextMultiline highlighted; + + public WndTitledMessage( Image icon, String title, String message ) { + + this( new IconTitle( icon, title ), message ); + + } + + public WndTitledMessage( Component titlebar, String message ) { + + super(); + + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + Highlighter hl = new Highlighter( message ); + + normal = PixelScene.createMultiline( hl.text, 6 ); + normal.maxWidth = WIDTH; + normal.measure(); + normal.x = titlebar.left(); + normal.y = titlebar.bottom() + GAP; + add( normal ); + + if (hl.isHighlighted()) { + normal.mask = hl.inverted(); + + highlighted = PixelScene.createMultiline( hl.text, 6 ); + highlighted.maxWidth = normal.maxWidth; + highlighted.measure(); + highlighted.x = normal.x; + highlighted.y = normal.y; + add( highlighted ); + + highlighted.mask = hl.mask; + highlighted.hardlight( TITLE_COLOR ); + } + + resize( WIDTH, (int)(normal.y + normal.height()) ); + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndTradeItem.java b/src/com/watabou/pixeldungeon/windows/WndTradeItem.java new file mode 100644 index 0000000000..e4855975b6 --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndTradeItem.java @@ -0,0 +1,250 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.npcs.Shopkeeper; +import com.watabou.pixeldungeon.items.EquipableItem; +import com.watabou.pixeldungeon.items.Gold; +import com.watabou.pixeldungeon.items.Heap; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.rings.RingOfHaggler; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.ui.ItemSlot; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndTradeItem extends Window { + + private static final float GAP = 2; + private static final int WIDTH = 120; + private static final int BTN_HEIGHT = 18; + + private static final String TXT_SALE = "FOR SALE: %s - %dg"; + private static final String TXT_BUY = "Buy for %dg"; + private static final String TXT_SELL = "Sell for %dg"; + private static final String TXT_SELL_1 = "Sell 1 for %dg"; + private static final String TXT_SELL_ALL = "Sell all for %dg"; + private static final String TXT_CANCEL = "Never mind"; + + private static final String TXT_SOLD = "You've sold your %s for %dg"; + private static final String TXT_BOUGHT = "You've bought %s for %dg"; + + private WndBag owner; + + public WndTradeItem( final Item item, WndBag owner ) { + + super(); + + this.owner = owner; + + float pos = createDescription( item, false ); + + if (item.quantity() == 1) { + + RedButton btnSell = new RedButton( Utils.format( TXT_SELL, item.price() ) ) { + @Override + protected void onClick() { + sell( item ); + hide(); + } + }; + btnSell.setRect( 0, pos + GAP, WIDTH, BTN_HEIGHT ); + add( btnSell ); + + pos = btnSell.bottom(); + + } else { + + int priceAll= item.price(); + RedButton btnSell1 = new RedButton( Utils.format( TXT_SELL_1, priceAll / item.quantity() ) ) { + @Override + protected void onClick() { + sellOne( item ); + hide(); + } + }; + btnSell1.setRect( 0, pos + GAP, WIDTH, BTN_HEIGHT ); + add( btnSell1 ); + RedButton btnSellAll = new RedButton( Utils.format( TXT_SELL_ALL, priceAll ) ) { + @Override + protected void onClick() { + sell( item ); + hide(); + } + }; + btnSellAll.setRect( 0, btnSell1.bottom() + GAP, WIDTH, BTN_HEIGHT ); + add( btnSellAll ); + + pos = btnSellAll.bottom(); + + } + + RedButton btnCancel = new RedButton( TXT_CANCEL ) { + @Override + protected void onClick() { + hide(); + } + }; + btnCancel.setRect( 0, pos + GAP, WIDTH, BTN_HEIGHT ); + add( btnCancel ); + + resize( WIDTH, (int)btnCancel.bottom() ); + } + + public WndTradeItem( final Heap heap, boolean canBuy ) { + + super(); + + Item item = heap.peek(); + + float pos = createDescription( item, true ); + + int price = price( item ); + + if (canBuy) { + + RedButton btnBuy = new RedButton( Utils.format( TXT_BUY, price ) ) { + @Override + protected void onClick() { + hide(); + buy( heap ); + } + }; + btnBuy.setRect( 0, pos + GAP, WIDTH, BTN_HEIGHT ); + btnBuy.enable( price <= Dungeon.gold ); + add( btnBuy ); + + RedButton btnCancel = new RedButton( TXT_CANCEL ) { + @Override + protected void onClick() { + hide(); + } + }; + btnCancel.setRect( 0, btnBuy.bottom() + GAP, WIDTH, BTN_HEIGHT ); + add( btnCancel ); + + resize( WIDTH, (int)btnCancel.bottom() ); + + } else { + + resize( WIDTH, (int)pos ); + + } + } + + @Override + public void hide() { + + super.hide(); + + if (owner != null) { + owner.hide(); + Shopkeeper.sell(); + } + } + + private float createDescription( Item item, boolean forSale ) { + + // Title + IconTitle titlebar = new IconTitle(); + titlebar.icon( new ItemSprite( item.image(), item.glowing() ) ); + titlebar.label( forSale ? + Utils.format( TXT_SALE, item.toString(), price( item ) ) : + Utils.capitalize( item.toString() ) ); + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + // Upgraded / degraded + if (item.levelKnown && item.level > 0) { + titlebar.color( ItemSlot.UPGRADED ); + } else if (item.levelKnown && item.level < 0) { + titlebar.color( ItemSlot.DEGRADED ); + } + + // Description + BitmapTextMultiline info = PixelScene.createMultiline( item.info(), 6 ); + info.maxWidth = WIDTH; + info.measure(); + info.x = titlebar.left(); + info.y = titlebar.bottom() + GAP; + add( info ); + + return info.y + info.height(); + } + + private void sell( Item item ) { + + Hero hero = Dungeon.hero; + + if (item.isEquipped( hero ) && !((EquipableItem)item).doUnequip( hero, false )) { + return; + } + item.detachAll( hero.belongings.backpack ); + + int price = item.price(); + + new Gold( price ).doPickUp( hero ); + GLog.i( TXT_SOLD, item.name(), price ); + } + + private void sellOne( Item item ) { + + if (item.quantity() <= 1) { + sell( item ); + } else { + + Hero hero = Dungeon.hero; + + item = item.detach( hero.belongings.backpack ); + int price = item.price(); + + new Gold( price ).doPickUp( hero ); + GLog.i( TXT_SOLD, item.name(), price ); + } + } + + private int price( Item item ) { + // This formula is not completely correct... + int price = item.price() * 5 * (Dungeon.depth / 5 + 1); + if (Dungeon.hero.buff( RingOfHaggler.Haggling.class ) != null && price >= 2) { + price /= 2; + } + return price; + } + + private void buy( Heap heap ) { + + Hero hero = Dungeon.hero; + Item item = heap.pickUp(); + + int price = price( item ); + Dungeon.gold -= price; + + GLog.i( TXT_BOUGHT, item.name(), price ); + + if (!item.doPickUp( hero )) { + Dungeon.level.drop( item, heap.pos ).sprite.drop(); + } + } +} diff --git a/src/com/watabou/pixeldungeon/windows/WndWandmaker.java b/src/com/watabou/pixeldungeon/windows/WndWandmaker.java new file mode 100644 index 0000000000..50e808f67c --- /dev/null +++ b/src/com/watabou/pixeldungeon/windows/WndWandmaker.java @@ -0,0 +1,104 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2014 Oleg Dolya + * + * 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.watabou.pixeldungeon.windows; + +import com.watabou.noosa.BitmapTextMultiline; +import com.watabou.pixeldungeon.Dungeon; +import com.watabou.pixeldungeon.actors.hero.Hero; +import com.watabou.pixeldungeon.actors.mobs.npcs.Wandmaker; +import com.watabou.pixeldungeon.items.Item; +import com.watabou.pixeldungeon.items.wands.Wand; +import com.watabou.pixeldungeon.scenes.PixelScene; +import com.watabou.pixeldungeon.sprites.ItemSprite; +import com.watabou.pixeldungeon.ui.RedButton; +import com.watabou.pixeldungeon.ui.Window; +import com.watabou.pixeldungeon.utils.GLog; +import com.watabou.pixeldungeon.utils.Utils; + +public class WndWandmaker extends Window { + + private static final String TXT_MESSAGE = + "Oh, I see you have succeeded! I do hope it hasn't troubled you too much. " + + "As I promised, you can choose one of my high quality wands."; + private static final String TXT_BATTLE = "Battle wand"; + private static final String TXT_NON_BATTLE = "Non-battle wand"; + + private static final String TXT_FARAWELL = "Good luck in your quest, %s!"; + + private static final int WIDTH = 120; + private static final int BTN_HEIGHT = 18; + private static final float GAP = 2; + + public WndWandmaker( final Wandmaker wandmaker, final Item item ) { + + super(); + + IconTitle titlebar = new IconTitle(); + titlebar.icon( new ItemSprite( item.image(), null ) ); + titlebar.label( Utils.capitalize( item.name() ) ); + titlebar.setRect( 0, 0, WIDTH, 0 ); + add( titlebar ); + + BitmapTextMultiline message = PixelScene.createMultiline( TXT_MESSAGE, 6 ); + message.maxWidth = WIDTH; + message.measure(); + message.y = titlebar.bottom() + GAP; + add( message ); + + RedButton btnBattle = new RedButton( TXT_BATTLE ) { + @Override + protected void onClick() { + selectReward( wandmaker, item, Wandmaker.Quest.wand1 ); + } + }; + btnBattle.setRect( 0, message.y + message.height() + GAP, WIDTH, BTN_HEIGHT ); + add( btnBattle ); + + RedButton btnNonBattle = new RedButton( TXT_NON_BATTLE ) { + @Override + protected void onClick() { + selectReward( wandmaker, item, Wandmaker.Quest.wand2 ); + } + }; + btnNonBattle.setRect( 0, btnBattle.bottom() + GAP, WIDTH, BTN_HEIGHT ); + add( btnNonBattle ); + + resize( WIDTH, (int)btnNonBattle.bottom() ); + } + + private void selectReward( Wandmaker wandmaker, Item item, Wand reward ) { + + hide(); + + item.detach( Dungeon.hero.belongings.backpack ); + + reward.identify(); + if (reward.doPickUp( Dungeon.hero )) { + GLog.i( Hero.TXT_YOU_NOW_HAVE, reward.name() ); + } else { + Dungeon.level.drop( reward, wandmaker.pos ).sprite.drop(); + } + + wandmaker.yell( Utils.format( TXT_FARAWELL, Dungeon.hero.className() ) ); + wandmaker.destroy(); + + wandmaker.sprite.die(); + + Wandmaker.Quest.complete(); + } +}