v3.0.0: implemented barebones cleric with basically no functionality

This commit is contained in:
Evan Debenham
2024-10-11 14:31:49 -04:00
parent f5531fd655
commit 53acf6cfc6
11 changed files with 79 additions and 2 deletions

View File

@@ -577,6 +577,11 @@ actors.hero.heroclass.duelist_desc_short=The Duelist is a weapons master who can
actors.hero.heroclass.duelist_desc=The Duelist starts with a _unique rapier_ with a special ability that recharges over time.\n\nEvery weapon in the game has a _different special ability_ that the Duelist can use.\n\nThe Duelist also starts with _two throwing spikes_, cloth armor, a waterskin, and a velvet pouch.\n\nThe Duelist automatically identifies:\n_-_ Scrolls of Identify\n_-_ Potions of Strength\n_-_ Scrolls of Mirror Image
actors.hero.heroclass.duelist_unlock=To unlock the Duelist _equip a tier 2 or higher weapon with no strength penalty._
actors.hero.heroclass.cleric=cleric
actors.hero.heroclass.cleric_desc_short=The Cleric is a divine spellcaster who uses their unique _holy tome_ to channel divine magic. They can learn and upgrade spells_ via talents.
actors.hero.heroclass.cleric_desc=The Cleric starts with a _unique holy tome_, which they can use to cast various spells.\n\nMost of the Cleric's talents are focused around learning or upgrading spells.\n\nThe Cleric also starts with _a cudgel_, cloth armor, a waterskin, and a velvet pouch.\n\nThe Cleric automatically identifies:\n_-_ Scrolls of Identify\n_-_ Potions of Purity\n_-_ Scrolls of Remove Curse
actors.hero.heroclass.cleric_unlock=TODO
actors.hero.herosubclass.berserker=berserker
actors.hero.herosubclass.berserker_short_desc=The _Berserker_ builds rage as he takes damage. Rage increases his damage and can be activated at 100% for bonus shielding.
actors.hero.herosubclass.berserker_desc=The Berserker gains rage as he takes physical damage, including damage that gets blocked by his armor! Rage steadily fades away over time, but fades more slowly if he is at low HP.\n\nThe Berserker deals up to +50% damage at 100% rage. At 100% rage he can also go berserk, gaining 2-6x his seal's maximum shielding depending on his missing health and keeping his rage at 100% as long as he has shielding left. However, the Berserker needs time to recover after he goes berserk.
@@ -1095,6 +1100,7 @@ actors.mobs.npcs.wandmaker.intro_rogue=Oh Goodness, you startled me! I haven't m
actors.mobs.npcs.wandmaker.intro_mage=Oh, hello %s! I heard there was some ruckus regarding you and the wizards institute? Oh never mind, I never liked those stick-in-the-muds anyway. If you're willing, I may have a task for you.
actors.mobs.npcs.wandmaker.intro_huntress=Oh, hello miss! A friendly face is a pleasant surprise down here isn't it? In fact, I swear I've seen your face before, but I can't put my finger on it... Oh never mind, if you're here for adventure, I may have a task for you.
actors.mobs.npcs.wandmaker.intro_duelist=Oh, hello miss! What a pleasant surprise to meet a hero in such a depressing place! If you're up to helping an old man out, I may have a task for you.
actors.mobs.npcs.wandmaker.intro_cleric=Oh, hello your highness! What a pleasant surprise to meet you in such a depressing place! I hate to impose, but I may have a task for you.
actors.mobs.npcs.wandmaker.intro_1=\n\nI came here to find a rare ingredient for a wand, but I've gotten myself lost, and my magical shield is weakening. I'll need to leave soon, but can't bear to go without getting what I came for.
actors.mobs.npcs.wandmaker.intro_dust=I'm looking for some _corpse dust._ It's a special kind of cursed bone meal that usually shows up in places like this. There should be a barricaded room around here somewhere, I'm sure some dust will turn up there. Do be careful though, the curse the dust carries is quite potent, _get back to me as fast as you can_ and I'll cleanse it for you.
actors.mobs.npcs.wandmaker.intro_ember=I'm looking for some _fresh embers_ from a newborn fire elemental. Elementals usually pop up when a summoning ritual isn't controlled, so just find some candles and a ritual site and I'm sure you can get one to pop up. You'll want to _avoid boxing yourself in_ while fighting it though, or you could _keep some sort of freezing item handy._ Newborn Elementals are pretty powerful and chaotic, but they can't stand the cold.

View File

@@ -67,6 +67,7 @@ public class Badges {
MASTERY_ROGUE,
MASTERY_HUNTRESS,
MASTERY_DUELIST,
MASTERY_CLERIC,
FOUND_RATMOGRIFY,
//bronze
@@ -125,6 +126,7 @@ public class Badges {
BOSS_SLAIN_1_ROGUE,
BOSS_SLAIN_1_HUNTRESS,
BOSS_SLAIN_1_DUELIST,
BOSS_SLAIN_1_CLERIC,
BOSS_SLAIN_1_ALL_CLASSES ( 54, BadgeType.GLOBAL ),
RESEARCHER_2 ( 55, BadgeType.JOURNAL ),
GAMES_PLAYED_2 ( 56, BadgeType.GLOBAL ),
@@ -176,6 +178,7 @@ public class Badges {
VICTORY_ROGUE,
VICTORY_HUNTRESS,
VICTORY_DUELIST,
VICTORY_CLERIC,
VICTORY_ALL_CLASSES ( 101, BadgeType.GLOBAL ),
DEATH_FROM_ALL ( 102, BadgeType.GLOBAL ),
BOSS_SLAIN_3_GLADIATOR,
@@ -786,6 +789,7 @@ public class Badges {
firstBossClassBadges.put(HeroClass.ROGUE, Badge.BOSS_SLAIN_1_ROGUE);
firstBossClassBadges.put(HeroClass.HUNTRESS, Badge.BOSS_SLAIN_1_HUNTRESS);
firstBossClassBadges.put(HeroClass.DUELIST, Badge.BOSS_SLAIN_1_DUELIST);
firstBossClassBadges.put(HeroClass.CLERIC, Badge.BOSS_SLAIN_1_CLERIC);
}
private static LinkedHashMap<HeroClass, Badge> victoryClassBadges = new LinkedHashMap<>();
@@ -795,6 +799,7 @@ public class Badges {
victoryClassBadges.put(HeroClass.ROGUE, Badge.VICTORY_ROGUE);
victoryClassBadges.put(HeroClass.HUNTRESS, Badge.VICTORY_HUNTRESS);
victoryClassBadges.put(HeroClass.DUELIST, Badge.VICTORY_DUELIST);
victoryClassBadges.put(HeroClass.CLERIC, Badge.VICTORY_CLERIC);
}
private static LinkedHashMap<HeroSubClass, Badge> thirdBossSubclassBadges = new LinkedHashMap<>();
@@ -928,6 +933,9 @@ public class Badges {
case DUELIST:
badge = Badge.MASTERY_DUELIST;
break;
case CLERIC:
badge = Badge.MASTERY_CLERIC;
break;
}
unlock(badge);

View File

@@ -54,12 +54,14 @@ import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfHealing;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLiquidFlame;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMindVision;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfPurity;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfLullaby;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMirrorImage;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRage;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.SpiritBow;
@@ -81,7 +83,8 @@ public enum HeroClass {
MAGE( HeroSubClass.BATTLEMAGE, HeroSubClass.WARLOCK ),
ROGUE( HeroSubClass.ASSASSIN, HeroSubClass.FREERUNNER ),
HUNTRESS( HeroSubClass.SNIPER, HeroSubClass.WARDEN ),
DUELIST( HeroSubClass.CHAMPION, HeroSubClass.MONK );
DUELIST( HeroSubClass.CHAMPION, HeroSubClass.MONK ),
CLERIC( HeroSubClass.GLADIATOR, HeroSubClass.WARDEN ); //TODO cleric subclasses
private HeroSubClass[] subClasses;
@@ -128,6 +131,10 @@ public enum HeroClass {
case DUELIST:
initDuelist( hero );
break;
case CLERIC:
initCleric( hero );
break;
}
if (SPDSettings.quickslotWaterskin()) {
@@ -153,6 +160,8 @@ public enum HeroClass {
return Badges.Badge.MASTERY_HUNTRESS;
case DUELIST:
return Badges.Badge.MASTERY_DUELIST;
case CLERIC:
return Badges.Badge.MASTERY_CLERIC;
}
return null;
}
@@ -230,6 +239,18 @@ public enum HeroClass {
new ScrollOfMirrorImage().identify();
}
private static void initCleric( Hero hero ) {
//TODO Cudgel
(hero.belongings.weapon = new Dagger()).identify();
hero.belongings.weapon.activate(hero);
//TODO Spellbook
new PotionOfPurity().identify();
new ScrollOfRemoveCurse().identify();
}
public String title() {
return Messages.get(HeroClass.class, name());
}
@@ -258,6 +279,8 @@ public enum HeroClass {
return new ArmorAbility[]{new SpectralBlades(), new NaturesPower(), new SpiritHawk()};
case DUELIST:
return new ArmorAbility[]{new Challenge(), new ElementalStrike(), new Feint()};
case CLERIC: //TODO CLERIC armor abilities
return new ArmorAbility[]{new HeroicLeap(), new Shockwave(), new Endure()};
}
}
@@ -273,6 +296,8 @@ public enum HeroClass {
return Assets.Sprites.HUNTRESS;
case DUELIST:
return Assets.Sprites.DUELIST;
case CLERIC: //TODO CLERIC cleric sprites
return Assets.Sprites.HUNTRESS;
}
}
@@ -288,6 +313,8 @@ public enum HeroClass {
return Assets.Splashes.HUNTRESS;
case DUELIST:
return Assets.Splashes.DUELIST;
case CLERIC: //TODO CLERIC cleric splash
return Assets.Splashes.HUNTRESS;
}
}
@@ -306,6 +333,8 @@ public enum HeroClass {
return Badges.isUnlocked(Badges.Badge.UNLOCK_HUNTRESS);
case DUELIST:
return Badges.isUnlocked(Badges.Badge.UNLOCK_DUELIST);
case CLERIC:
return true; //TODO CLERIC cleric unlock badge
}
}

View File

@@ -414,6 +414,8 @@ public enum Talent {
return 122;
case DUELIST:
return 154;
case CLERIC:
return 26; //TODO CLERIC talent sprite here
}
} else {
return icon;
@@ -851,6 +853,9 @@ public enum Talent {
case DUELIST:
Collections.addAll(tierTalents, STRENGTHENING_MEAL, ADVENTURERS_INTUITION, PATIENT_STRIKE, AGGRESSIVE_BARRIER);
break;
case CLERIC: //TODO CLERIC T1
Collections.addAll(tierTalents, HEARTY_MEAL, VETERANS_INTUITION, PROVOKED_ANGER, IRON_WILL);
break;
}
for (Talent talent : tierTalents){
if (replacements.containsKey(talent)){
@@ -877,6 +882,9 @@ public enum Talent {
case DUELIST:
Collections.addAll(tierTalents, FOCUSED_MEAL, LIQUID_AGILITY, WEAPON_RECHARGING, LETHAL_HASTE, SWIFT_EQUIP);
break;
case CLERIC: //TODO CLERIC T2
Collections.addAll(tierTalents, IRON_STOMACH, LIQUID_WILLPOWER, RUNIC_TRANSFERENCE, LETHAL_MOMENTUM, IMPROVISED_PROJECTILES);
break;
}
for (Talent talent : tierTalents){
if (replacements.containsKey(talent)){
@@ -903,6 +911,9 @@ public enum Talent {
case DUELIST:
Collections.addAll(tierTalents, PRECISE_ASSAULT, DEADLY_FOLLOWUP);
break;
case CLERIC: //TODO CLERIC T3
Collections.addAll(tierTalents, HOLD_FAST, STRONGMAN);
break;
}
for (Talent talent : tierTalents){
if (replacements.containsKey(talent)){

View File

@@ -100,7 +100,7 @@ public class Blacksmith extends NPC {
case ROGUE: msg1 += Messages.get(Blacksmith.this, "intro_quest_rogue"); break;
case HUNTRESS: msg1 += Messages.get(Blacksmith.this, "intro_quest_huntress"); break;
case DUELIST: msg1 += Messages.get(Blacksmith.this, "intro_quest_duelist"); break;
//case CLERIC: msg1 += Messages.get(Blacksmith.this, "intro_quest_cleric"); break;
case CLERIC: msg1 += Messages.get(Blacksmith.this, "intro_quest_cleric"); break;
}
msg1 += "\n\n" + Messages.get(Blacksmith.this, "intro_quest_start");

View File

@@ -172,6 +172,9 @@ public class Wandmaker extends NPC {
case DUELIST:
msg1 += Messages.get(this, "intro_duelist");
break;
case CLERIC:
msg1 += Messages.get(this, "intro_cleric");
break;
}
msg1 += Messages.get(this, "intro_1");

View File

@@ -114,6 +114,9 @@ abstract public class ClassArmor extends Armor {
case DUELIST:
classArmor = new DuelistArmor();
break;
case CLERIC: //TODO CLERIC class armor
classArmor = new WarriorArmor();
break;
}
classArmor.level(armor.trueLevel());

View File

@@ -90,6 +90,8 @@ public abstract class RemainsItem extends Item {
return new BowFragment();
case DUELIST:
return new BrokenHilt();
case CLERIC: //TODO CLERIC remains item
return new SealShard();
}
}

View File

@@ -175,6 +175,10 @@ public class HeroSelectScene extends PixelScene {
add(infoButton);
for (HeroClass cl : HeroClass.values()){
//TODO CLERIC skip this when not in debug for now
if (cl == HeroClass.CLERIC && !DeviceCompat.isDebug()){
continue;
}
HeroBtn button = new HeroBtn(cl);
add(button);
heroBtns.add(button);

View File

@@ -460,6 +460,8 @@ public enum Icons {
return new ItemSprite(ItemSpriteSheet.SPIRIT_BOW);
case DUELIST:
return new ItemSprite(ItemSpriteSheet.RAPIER);
case CLERIC: //TODO CLERIC class sprite
return new ItemSprite(ItemSpriteSheet.MASTERY);
default:
return null;
}

View File

@@ -73,6 +73,9 @@ public class WndHeroInfo extends WndTabbed {
case DUELIST:
tabIcon = new ItemSprite(ItemSpriteSheet.RAPIER, null);
break;
case CLERIC: //TODO CLERIC
tabIcon = new ItemSprite(ItemSpriteSheet.MASTERY, null);
break;
}
int finalHeight = MIN_HEIGHT;
@@ -198,6 +201,12 @@ public class WndHeroInfo extends WndTabbed {
new ItemSprite(ItemSpriteSheet.THROWING_SPIKE),
new ItemSprite(ItemSpriteSheet.SCROLL_ISAZ)};
break;
case CLERIC: //TODO CLERIC
icons = new Image[]{ new ItemSprite(ItemSpriteSheet.MASTERY),
Icons.TALENT.get(),
new ItemSprite(ItemSpriteSheet.MACE),
new ItemSprite(ItemSpriteSheet.SCROLL_ISAZ)};
break;
}
for (Image im : icons) {
add(im);