v0.3.0: added mage's staff and rebalanced wand of magic magic, still needs some polish/tuning
This commit is contained in:
parent
773481ceb4
commit
8f80762d91
|
@ -28,11 +28,11 @@ import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CloakOfShadows;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
|
import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMindVision;
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfMindVision;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength;
|
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfStrength;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfIdentify;
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping;
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMapping;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile;
|
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfMagicMissile;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Knuckles;
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.ShortSword;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.ShortSword;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Dart;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Dart;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Boomerang;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Boomerang;
|
||||||
|
@ -57,11 +57,11 @@ public enum HeroClass {
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final String[] MAG_PERKS = {
|
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 start with a unique Staff, which can be imbued with the properties of a wand.",
|
||||||
"Mages recharge their wands faster.",
|
"The Mage's staff can be used as a melee weapon or a wand, and charges faster than a wand.",
|
||||||
"When eaten, any piece of food restores 1 charge for all wands in the inventory.",
|
"When eaten, any piece of food restores 1 charge for all wands in the inventory.",
|
||||||
"Mages can use wands as a melee weapon.",
|
"Mages can use wands as a melee weapon.",
|
||||||
"Scrolls of Identify are identified from the beginning."
|
"Scrolls of Upgrade are identified from the beginning."
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final String[] ROG_PERKS = {
|
public static final String[] ROG_PERKS = {
|
||||||
|
@ -149,14 +149,13 @@ public enum HeroClass {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void initMage( Hero hero ) {
|
private static void initMage( Hero hero ) {
|
||||||
(hero.belongings.weapon = new Knuckles()).identify();
|
MagesStaff staff = new MagesStaff(new WandOfMagicMissile());
|
||||||
|
(hero.belongings.weapon = staff).identify();
|
||||||
|
hero.belongings.weapon.activate(hero);
|
||||||
|
|
||||||
WandOfMagicMissile wand = new WandOfMagicMissile();
|
Dungeon.quickslot.setSlot(0, staff);
|
||||||
wand.identify().collect();
|
|
||||||
|
|
||||||
Dungeon.quickslot.setSlot(0, wand);
|
new ScrollOfUpgrade().setKnown();
|
||||||
|
|
||||||
new ScrollOfIdentify().setKnown();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void initRogue( Hero hero ) {
|
private static void initRogue( Hero hero ) {
|
||||||
|
|
|
@ -37,6 +37,7 @@ import com.watabou.utils.Random;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
//TODO: final balancing choices
|
||||||
public class WandOfMagicMissile extends Wand {
|
public class WandOfMagicMissile extends Wand {
|
||||||
|
|
||||||
public static final String AC_DISENCHANT = "DISENCHANT";
|
public static final String AC_DISENCHANT = "DISENCHANT";
|
||||||
|
@ -73,8 +74,8 @@ public class WandOfMagicMissile extends Wand {
|
||||||
if (ch != null) {
|
if (ch != null) {
|
||||||
|
|
||||||
int level = level();
|
int level = level();
|
||||||
|
|
||||||
ch.damage( Random.Int( 1, 6 + level * 2 ), this );
|
ch.damage( Random.NormalIntRange( 3+level, 6+level*2 ), this );
|
||||||
|
|
||||||
ch.sprite.burst( 0xFF99CCFF, level / 2 + 2 );
|
ch.sprite.burst( 0xFF99CCFF, level / 2 + 2 );
|
||||||
|
|
||||||
|
@ -109,7 +110,7 @@ public class WandOfMagicMissile extends Wand {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int initialCharges() {
|
protected int initialCharges() {
|
||||||
return 3;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,219 @@
|
||||||
|
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
|
||||||
|
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfUpgrade;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag;
|
||||||
|
import com.watabou.noosa.audio.Sample;
|
||||||
|
import com.watabou.utils.Bundle;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by debenhame on 13/03/2015.
|
||||||
|
*/
|
||||||
|
//TODO: lots of refinements to make here still.
|
||||||
|
public class MagesStaff extends MeleeWeapon {
|
||||||
|
|
||||||
|
private Wand wand;
|
||||||
|
|
||||||
|
public static final String AC_IMBUE = "IMBUE";
|
||||||
|
public static final String AC_ZAP = "ZAP";
|
||||||
|
|
||||||
|
private static final String TXT_SELECT_WAND = "Select a wand to consume";
|
||||||
|
|
||||||
|
//TODO: decide on balancing
|
||||||
|
private static final float STAFF_SCALE_FACTOR = 0.70f;
|
||||||
|
|
||||||
|
{
|
||||||
|
name = "Mage's Staff";
|
||||||
|
image = ItemSpriteSheet.WAND_MAGIC_MISSILE;
|
||||||
|
|
||||||
|
defaultAction = AC_ZAP;
|
||||||
|
|
||||||
|
bones = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MagesStaff() {
|
||||||
|
|
||||||
|
//tier 1 weapon with really poor base stats.
|
||||||
|
super(1, 1f, 1f);
|
||||||
|
MIN = 1;
|
||||||
|
MAX = 4;
|
||||||
|
|
||||||
|
wand = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MagesStaff(Wand wand){
|
||||||
|
this();
|
||||||
|
wand.identify();
|
||||||
|
wand.cursed = false;
|
||||||
|
this.wand = wand;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<String> actions(Hero hero) {
|
||||||
|
ArrayList<String> actions = super.actions( hero );
|
||||||
|
actions.add(AC_IMBUE);
|
||||||
|
if (wand!= null && wand.curCharges > 0) {
|
||||||
|
actions.add( AC_ZAP );
|
||||||
|
}
|
||||||
|
return actions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void activate( Hero hero ) {
|
||||||
|
if(wand != null) wand.charge( hero, STAFF_SCALE_FACTOR );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(Hero hero, String action) {
|
||||||
|
if (action.equals(AC_IMBUE)) {
|
||||||
|
|
||||||
|
curUser = hero;
|
||||||
|
GameScene.selectItem(itemSelector, WndBag.Mode.WAND, TXT_SELECT_WAND);
|
||||||
|
|
||||||
|
} else if (action.equals(AC_ZAP)){
|
||||||
|
if (wand == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
wand.execute(hero, AC_ZAP);
|
||||||
|
} else
|
||||||
|
super.execute(hero, action);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean collect( Bag container ) {
|
||||||
|
if (super.collect( container )) {
|
||||||
|
if (container.owner != null && wand != null) {
|
||||||
|
wand.charge(container.owner, STAFF_SCALE_FACTOR);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDetach( ) {
|
||||||
|
if (wand != null) wand.stopCharging();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Item imbueWand(Wand wand, Char owner){
|
||||||
|
|
||||||
|
this.wand = null;
|
||||||
|
|
||||||
|
GLog.w("TODO");
|
||||||
|
enchant( null );
|
||||||
|
|
||||||
|
//syncs the level of the two items.
|
||||||
|
//TODO: decide on balancing for this
|
||||||
|
int targetLevel = Math.round((this.level*2 + wand.level)/3f);
|
||||||
|
|
||||||
|
int staffLevelDiff = targetLevel - this.level;
|
||||||
|
if (staffLevelDiff > 0)
|
||||||
|
this.upgrade(staffLevelDiff);
|
||||||
|
else if (staffLevelDiff < 0)
|
||||||
|
this.degrade(Math.abs(staffLevelDiff));
|
||||||
|
|
||||||
|
int wandLevelDiff = targetLevel - wand.level;
|
||||||
|
if (wandLevelDiff > 0)
|
||||||
|
wand.upgrade(wandLevelDiff);
|
||||||
|
else if (wandLevelDiff < 0)
|
||||||
|
wand.degrade(Math.abs(wandLevelDiff));
|
||||||
|
|
||||||
|
GLog.p("TODO");
|
||||||
|
|
||||||
|
this.wand = wand;
|
||||||
|
wand.identify();
|
||||||
|
wand.cursed = false;
|
||||||
|
wand.charge(owner);
|
||||||
|
|
||||||
|
updateQuickslot();
|
||||||
|
|
||||||
|
return this;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Item upgrade() {
|
||||||
|
if (wand != null) wand.upgrade();
|
||||||
|
return super.upgrade();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Item degrade() {
|
||||||
|
if (wand != null) wand.degrade();
|
||||||
|
return super.degrade();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String status() {
|
||||||
|
if (wand == null) return super.status();
|
||||||
|
else return wand.status();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String name(){
|
||||||
|
if (wand == null)
|
||||||
|
return super.name();
|
||||||
|
else {
|
||||||
|
String name = wand.name().replace("Wand", "Staff");
|
||||||
|
return enchantment == null ? name : enchantment.name( name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String info() {
|
||||||
|
return super.info();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String WAND = "wand";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void storeInBundle(Bundle bundle) {
|
||||||
|
super.storeInBundle(bundle);
|
||||||
|
bundle.put(WAND, wand);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void restoreFromBundle(Bundle bundle) {
|
||||||
|
super.restoreFromBundle(bundle);
|
||||||
|
//TODO: error check here?
|
||||||
|
wand = (Wand) bundle.get(WAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
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( "TODO" );
|
||||||
|
|
||||||
|
Dungeon.quickslot.clearItem(item);
|
||||||
|
|
||||||
|
item.detach( curUser.belongings.backpack );
|
||||||
|
|
||||||
|
imbueWand((Wand) item, curUser);
|
||||||
|
|
||||||
|
curUser.spendAndNext( 2f );
|
||||||
|
|
||||||
|
updateQuickslot();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
|
@ -17,8 +17,7 @@
|
||||||
*/
|
*/
|
||||||
package com.shatteredpixel.shatteredpixeldungeon.ui;
|
package com.shatteredpixel.shatteredpixeldungeon.ui;
|
||||||
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
|
import com.shatteredpixel.shatteredpixeldungeon.items.EquipableItem;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Boomerang;
|
|
||||||
import com.watabou.noosa.Image;
|
import com.watabou.noosa.Image;
|
||||||
import com.watabou.noosa.ui.Button;
|
import com.watabou.noosa.ui.Button;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
@ -77,7 +76,7 @@ public class QuickSlotButton extends Button implements WndBag.Listener {
|
||||||
GameScene.handleCell( lastTarget.pos );
|
GameScene.handleCell( lastTarget.pos );
|
||||||
} else {
|
} else {
|
||||||
Item item = select(slotNum);
|
Item item = select(slotNum);
|
||||||
if (item.stackable || item instanceof Wand || item instanceof Boomerang)
|
if (item instanceof EquipableItem)
|
||||||
useTargeting();
|
useTargeting();
|
||||||
item.execute( Dungeon.hero );
|
item.execute( Dungeon.hero );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user