v0.9.1: Tweaked T1 talents for the Rogue and Huntress

This commit is contained in:
Evan Debenham 2020-11-18 16:34:52 -05:00
parent d4709a1100
commit 3b0aaa7d29
10 changed files with 150 additions and 34 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -338,23 +338,25 @@ actors.hero.talent.energizing_meal.desc=_+1:_ Eating food grants the Mage _5 tur
actors.hero.talent.energizing_upgrade.title=energizing upgrade
actors.hero.talent.energizing_upgrade.desc=_+1:_ The Mage's staff recharges for _1 extra charge_ whenever the Mage upgrades it.\n\n_+2:_ The Mage's staff recharges for _2 extra charges_ whenever the Mage upgrades it.
actors.hero.talent.rationed_meal.title=rationed meal
actors.hero.talent.rationed_meal.desc=_+1:_ Eating food gives the Rogue _15% more satiety_.\n\n_+2:_ Eating food gives the Rogue _25% more satiety_.
actors.hero.talent.cached_rations.title=cached rations
actors.hero.talent.cached_rations.desc=_+1:_ The Rogue can find _3 small rations_ placed in chests while he explores the earlier stages of the dungeon.\n\n_+2:_ The Rogue can find _5 small rations_ placed in chests while he explores the earlier stages of the the dungeon.
actors.hero.talent.thiefs_intuition.title=thief's intuition
actors.hero.talent.thiefs_intuition.desc=_+1:_ The Rogue identifies rings _2x faster_, and identifies the type of a ring _when he equips it_.\n\n_+2:_ The Rogue identifies rings _when he equips them_, and identifies the type of a ring _when he picks it up_.
actors.hero.talent.sucker_punch.title=sucker punch
actors.hero.talent.sucker_punch.desc=_+1:_ The Rogue deals _1-2 bonus damage_ the first time he surprise attacks an enemy.\n\n_+2:_ The Rogue deals _2 bonus damage_ the first time he surprise attacks an enemy.
actors.hero.talent.mending_shadows.title=mending shadows
actors.hero.talent.mending_shadows.desc=_+1:_ The Rogue heals for 1 HP every _5 consecutive turns_ that he is hidden by his cloak.\n\n_+2:_ The Rogue heals for 1 HP every _3 consecutive turns_ that he is hidden by his cloak.
actors.hero.talent.protective_shadows.title=protective shadows
actors.hero.talent.protective_shadows.desc=_+1:_ The Rogue gains one shielding _every other turn_ his cloak is activated, _to a max of 3_.\n\n_+2:_ The Rogue gains one shielding _every turn_ his cloak is activated, _to a max of 5_.
actors.hero.talent.invigorating_meal.title=invigorating meal
actors.hero.talent.invigorating_meal.desc=_+1:_ Eating food takes 1 turn and grants the Huntress _1 turn of haste_.\n\n_+2:_ Eating food takes 1 turn and grants the Huntress _2 turns of haste_.
actors.hero.talent.natures_bounty.title=nature's bounty
actors.hero.talent.natures_bounty.desc=_+1:_ The Huntress can find _4 berries_ hidden in tall grass as she explores the earlier stages of the dungeon.\n\n_+2:_ The Huntress can find _6 berries_ hidden in tall grass as she explores the earlier stages of the dungeon.
actors.hero.talent.survivalists_intuition.title=survivalist's intuition
actors.hero.talent.survivalists_intuition.desc=_+1:_ The Huntress identifies all equipment _1.75x faster_.\n\n_+2:_ The Huntress identifies all equipment _2.5x faster_.
actors.hero.talent.followup_strike.title=followup strike
actors.hero.talent.followup_strike.desc=_+1:_ When the Huntress hits an enemy with her bow or a thrown weapon, her next melee attack against that enemy deals _2 bonus damage_.\n\n_+2:_ When the Huntress hits an enemy with her bow or a thrown weapon, her next melee attack against that enemy deals _3 bonus damage_
actors.hero.talent.natures_aid.title=nature's aid
actors.hero.talent.natures_aid.desc=_+1:_ The Huntress gains 2 armor of barkskin for _4 turns_ when a plant is trampled in her vision.\n\n_+2:_ The Huntress gains 2 armor of barkskin for _6 turns_ when a plant is trampled in her vision.
actors.hero.talent.invigorating_meal.title=invigorating meal
actors.hero.talent.invigorating_meal.desc=_+1:_ Eating food takes 1 turn and grants the Huntress _1 turn of haste_.\n\n_+2:_ Eating food takes 1 turn and grants the Huntress _2 turns of haste_.
actors.hero.hero.name=you
actors.hero.hero.leave=You can't leave yet, the rest of the dungeon awaits below!

View File

@ -482,6 +482,10 @@ items.bombs.woollybomb.name=woolly bomb
items.bombs.woollybomb.desc=This customized bomb will create a field of magical sheep after exploding. These sheep will block movement and persist for some time.
###food
items.food.berry.name=dungeon berry
items.food.berry.eat_msg=That berry was tasty!
items.food.berry.desc=This small berry was found by the huntress among the dungeon's vegetation. It can be eaten quickly, restores a small amount of satiety, and might contain a usable seed!
items.food.blandfruit.name=blandfruit
items.food.blandfruit.cooked=cooked blandfruit
items.food.blandfruit.sunfruit=sunfruit

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -25,8 +25,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.CounterBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Recharging;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.WandEmpower;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
@ -71,21 +71,21 @@ public enum Talent {
TEST_MAGE_T2_4(23),
TEST_MAGE_T2_5(24),
RATIONED_MEAL(32),
CACHED_RATIONS(32),
THIEFS_INTUITION(33),
SUCKER_PUNCH(34),
MENDING_SHADOWS(35),
PROTECTIVE_SHADOWS(35),
TEST_ROGUE_T2_1(36),
TEST_ROGUE_T2_2(37),
TEST_ROGUE_T2_3(38),
TEST_ROGUE_T2_4(39),
TEST_ROGUE_T2_5(40),
INVIGORATING_MEAL(48),
NATURES_BOUNTY(48),
SURVIVALISTS_INTUITION(49),
FOLLOWUP_STRIKE(50),
NATURES_AID(51),
TEST_HUNTRESS_T2_1(52),
INVIGORATING_MEAL(52),
TEST_HUNTRESS_T2_2(53),
TEST_HUNTRESS_T2_3(54),
TEST_HUNTRESS_T2_4(55),
@ -117,6 +117,11 @@ public enum Talent {
}
public static void onTalentUpgraded( Hero hero, Talent talent){
if (talent == NATURES_BOUNTY){
if ( hero.pointsInTalent(NATURES_BOUNTY) == 1) Buff.count(hero, NatureBerriesAvailable.class, 4);
else Buff.count(hero, NatureBerriesAvailable.class, 2);
}
if (talent == ARMSMASTERS_INTUITION && hero.pointsInTalent(ARMSMASTERS_INTUITION) == 2){
if (hero.belongings.weapon != null) hero.belongings.weapon.identify();
if (hero.belongings.armor != null) hero.belongings.armor.identify();
@ -136,6 +141,9 @@ public enum Talent {
}
}
public static class CachedRationsDropped extends CounterBuff{};
public static class NatureBerriesAvailable extends CounterBuff{};
public static void onFoodEaten( Hero hero, float foodVal ){
if (hero.hasTalent(HEARTY_MEAL)){
//3/5 HP healed, when hero is below 25% health
@ -158,11 +166,6 @@ public enum Talent {
Buff.affect( hero, Recharging.class, 2 + 3*(hero.pointsInTalent(ENERGIZING_MEAL)) );
ScrollOfRecharging.charge( hero );
}
if (hero.hasTalent(RATIONED_MEAL)){
//15%/25% bonus food value
float bonusSatiety = foodVal * (0.05f + (0.1f * hero.pointsInTalent(RATIONED_MEAL)));
Buff.affect(hero, Hunger.class).affectHunger(bonusSatiety, true);
}
if (hero.hasTalent(INVIGORATING_MEAL)){
//effectively 1/2 turns of haste
Buff.affect( hero, Haste.class, 0.67f+hero.pointsInTalent(INVIGORATING_MEAL));
@ -270,10 +273,10 @@ public enum Talent {
Collections.addAll(tierTalents, EMPOWERING_MEAL, SCHOLARS_INTUITION, TESTED_HYPOTHESIS, BACKUP_BARRIER);
break;
case ROGUE:
Collections.addAll(tierTalents, RATIONED_MEAL, THIEFS_INTUITION, SUCKER_PUNCH, MENDING_SHADOWS);
Collections.addAll(tierTalents, CACHED_RATIONS, THIEFS_INTUITION, SUCKER_PUNCH, PROTECTIVE_SHADOWS);
break;
case HUNTRESS:
Collections.addAll(tierTalents, INVIGORATING_MEAL, SURVIVALISTS_INTUITION, FOLLOWUP_STRIKE, NATURES_AID);
Collections.addAll(tierTalents, NATURES_BOUNTY, SURVIVALISTS_INTUITION, FOLLOWUP_STRIKE, NATURES_AID);
break;
}
for (Talent talent : tierTalents){
@ -293,7 +296,7 @@ public enum Talent {
Collections.addAll(tierTalents, TEST_ROGUE_T2_1, TEST_ROGUE_T2_2, TEST_ROGUE_T2_3, TEST_ROGUE_T2_4, TEST_ROGUE_T2_5);
break;
case HUNTRESS:
Collections.addAll(tierTalents, TEST_HUNTRESS_T2_1, TEST_HUNTRESS_T2_2, TEST_HUNTRESS_T2_3, TEST_HUNTRESS_T2_4, TEST_HUNTRESS_T2_5);
Collections.addAll(tierTalents, INVIGORATING_MEAL, TEST_HUNTRESS_T2_2, TEST_HUNTRESS_T2_3, TEST_HUNTRESS_T2_4, TEST_HUNTRESS_T2_5);
break;
}
for (Talent talent : tierTalents){

View File

@ -24,13 +24,13 @@ package com.shatteredpixel.shatteredpixeldungeon.items.artifacts;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Barrier;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Preparation;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroSubClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.rings.RingOfEnergy;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
@ -242,19 +242,21 @@ public class CloakOfShadows extends Artifact {
}
}
float healInc = 0;
float barrierInc = 0.5f;
@Override
public boolean act(){
turnsToCost--;
if (((Hero)target).hasTalent(Talent.MENDING_SHADOWS)){
healInc++;
// 5/3 turns to heal
if (healInc >= 7 - 2*((Hero) target).pointsInTalent(Talent.MENDING_SHADOWS)){
healInc = 0;
target.HP = Math.min(target.HT, target.HP+1);
target.sprite.emitter().burst( Speck.factory( Speck.HEALING ), 1 );
//barrier every 2/1 turns, to a max of 3/5
if (((Hero)target).hasTalent(Talent.PROTECTIVE_SHADOWS)){
Barrier barrier = Buff.affect(target, Barrier.class);
if (barrier.shielding() < 1 + 2*((Hero)target).pointsInTalent(Talent.PROTECTIVE_SHADOWS)) {
barrierInc += 0.5f * ((Hero) target).pointsInTalent(Talent.PROTECTIVE_SHADOWS);
}
if (barrierInc >= 1 ){
barrierInc = 0;
barrier.incShield(1);
}
}
@ -326,14 +328,14 @@ public class CloakOfShadows extends Artifact {
}
private static final String TURNSTOCOST = "turnsToCost";
private static final String HEAL_INC = "heal_inc";
private static final String BARRIER_INC = "barrier_inc";
@Override
public void storeInBundle(Bundle bundle) {
super.storeInBundle(bundle);
bundle.put( TURNSTOCOST , turnsToCost);
bundle.put( HEAL_INC, healInc);
bundle.put( BARRIER_INC, barrierInc);
}
@Override
@ -341,7 +343,7 @@ public class CloakOfShadows extends Artifact {
super.restoreFromBundle(bundle);
turnsToCost = bundle.getInt( TURNSTOCOST );
healInc = bundle.getFloat( HEAL_INC );
barrierInc = bundle.getFloat( BARRIER_INC );
}
}
}

View File

@ -0,0 +1,65 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2020 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.items.food;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.CounterBuff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
public class Berry extends Food {
{
image = ItemSpriteSheet.BERRY;
energy = Hunger.HUNGRY/4f; //75 food value
}
@Override
protected float eatingTime(){
if (Dungeon.hero.hasTalent(Talent.INVIGORATING_MEAL)){
return 0;
} else {
return 1;
}
}
@Override
protected void satisfy(Hero hero) {
super.satisfy(hero);
SeedCounter counter = Buff.count(hero, SeedCounter.class, 1);
if (counter.count() >= 2){
Dungeon.level.drop(Generator.random(Generator.Category.SEED), hero.pos).sprite.drop();
counter.detach();
}
}
@Override
public int value() {
return 5 * quantity;
}
public static class SeedCounter extends CounterBuff{};
}

View File

@ -25,6 +25,8 @@ import com.shatteredpixel.shatteredpixeldungeon.Bones;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GoldenMimic;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mimic;
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
@ -33,6 +35,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.Artifact;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.DriedRose;
import com.shatteredpixel.shatteredpixeldungeon.items.food.SmallRation;
import com.shatteredpixel.shatteredpixeldungeon.items.journal.GuidePage;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.GoldenKey;
import com.shatteredpixel.shatteredpixeldungeon.journal.Document;
@ -378,7 +381,7 @@ public abstract class RegularLevel extends Level {
}
}
//use a separate generator for this to prevent held items and meta progress from affecting levelgen
//use a separate generator for this to prevent held items, meta progress, and talents from affecting levelgen
Random.pushGenerator( Dungeon.seedCurDepth() );
Item item = Bones.get();
@ -411,6 +414,24 @@ public abstract class RegularLevel extends Level {
}
}
//cached rations try to drop in a special room on floors 2/4/6/8/9, to a max of 3/5
if (Dungeon.hero.hasTalent(Talent.CACHED_RATIONS)){
Talent.CachedRationsDropped dropped = Buff.affect(Dungeon.hero, Talent.CachedRationsDropped.class);
if (dropped.count() < 1 + 2*Dungeon.hero.pointsInTalent(Talent.CACHED_RATIONS)
&& Math.min(8, 1 + 2*dropped.count()) < Dungeon.depth){
int cell;
do {
cell = randomDropCell(SpecialRoom.class);
} while (room(cell) instanceof SecretRoom);
if (map[cell] == Terrain.HIGH_GRASS || map[cell] == Terrain.FURROWED_GRASS) {
map[cell] = Terrain.GRASS;
losBlocking[cell] = false;
}
drop( new SmallRation(), cell).type = Heap.Type.CHEST;
dropped.countUp(1);
}
}
//guide pages
Collection<String> allPages = Document.ADVENTURERS_GUIDE.pages();
ArrayList<String> missingPages = new ArrayList<>();
@ -474,10 +495,14 @@ public abstract class RegularLevel extends Level {
return null;
}
protected int randomDropCell(){
return randomDropCell(StandardRoom.class);
}
protected int randomDropCell() {
protected int randomDropCell( Class<?extends Room> roomType ) {
while (true) {
Room room = randomRoom( StandardRoom.class );
Room room = randomRoom( roomType );
if (room != null && room != roomEntrance) {
int pos = pointToCell(room.random());
if (passable[pos]

View File

@ -30,12 +30,14 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Invisibility;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Talent;
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.LeafParticle;
import com.shatteredpixel.shatteredpixeldungeon.items.Dewdrop;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.glyphs.Camouflage;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.SandalsOfNature;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Berry;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@ -82,6 +84,17 @@ public class HighGrass {
naturalismLevel = -1;
}
}
Talent.NatureBerriesAvailable berries = ch.buff(Talent.NatureBerriesAvailable.class);
if (berries != null && Random.Int(30) == 0){
if (berries.count() > 0){
berries.countDown(1);
level.drop(new Berry(), pos).sprite.drop();
}
if (berries.count() <= 0){
berries.detach();
}
}
}
if (naturalismLevel >= 0) {

View File

@ -626,6 +626,7 @@ public class ItemSpriteSheet {
public static final int MEAT_PIE = FOOD+9;
public static final int BLANDFRUIT = FOOD+10;
public static final int BLAND_CHUNKS= FOOD+11;
public static final int BERRY = FOOD+12;
static{
assignItemRect(MEAT, 15, 11);
assignItemRect(STEAK, 15, 11);
@ -639,6 +640,7 @@ public class ItemSpriteSheet {
assignItemRect(MEAT_PIE, 16, 12);
assignItemRect(BLANDFRUIT, 9, 12);
assignItemRect(BLAND_CHUNKS,14, 6);
assignItemRect(BERRY, 9, 11);
}
private static final int QUEST = xy(1, 29); //32 slots