v0.7.3: added 2 additional thrown weapons
This commit is contained in:
parent
1434e36725
commit
ea3f4bb99e
|
@ -296,9 +296,6 @@ public class Hero extends Char {
|
||||||
return belongings.armor == null ? 0 : belongings.armor.tier;
|
return belongings.armor == null ? 0 : belongings.armor.tier;
|
||||||
}
|
}
|
||||||
|
|
||||||
//this variable is only needed because of the boomerang, remove if/when it is no longer equippable
|
|
||||||
boolean rangedAttack = false;
|
|
||||||
|
|
||||||
public boolean shoot( Char enemy, MissileWeapon wep ) {
|
public boolean shoot( Char enemy, MissileWeapon wep ) {
|
||||||
|
|
||||||
//temporarily set the hero's weapon to the missile weapon being used
|
//temporarily set the hero's weapon to the missile weapon being used
|
||||||
|
|
|
@ -138,8 +138,10 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Sword;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WarHammer;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WarHammer;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Whip;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Whip;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.HeavyBoomerang;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Bolas;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Bolas;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.FishingSpear;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.FishingSpear;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ForceCube;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Javelin;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Javelin;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Kunai;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Kunai;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
|
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
|
||||||
|
@ -398,15 +400,17 @@ public class Generator {
|
||||||
|
|
||||||
MIS_T4.classes = new Class<?>[]{
|
MIS_T4.classes = new Class<?>[]{
|
||||||
Javelin.class,
|
Javelin.class,
|
||||||
Tomahawk.class
|
Tomahawk.class,
|
||||||
|
HeavyBoomerang.class
|
||||||
};
|
};
|
||||||
MIS_T4.probs = new float[]{ 4, 3 };
|
MIS_T4.probs = new float[]{ 6, 5, 4 };
|
||||||
|
|
||||||
MIS_T5.classes = new Class<?>[]{
|
MIS_T5.classes = new Class<?>[]{
|
||||||
Trident.class,
|
Trident.class,
|
||||||
ThrowingHammer.class
|
ThrowingHammer.class,
|
||||||
|
ForceCube.class
|
||||||
};
|
};
|
||||||
MIS_T5.probs = new float[]{ 4, 3 };
|
MIS_T5.probs = new float[]{ 6, 5, 4 };
|
||||||
|
|
||||||
FOOD.classes = new Class<?>[]{
|
FOOD.classes = new Class<?>[]{
|
||||||
Food.class,
|
Food.class,
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Pixel Dungeon
|
||||||
|
* Copyright (C) 2012-2015 Oleg Dolya
|
||||||
|
*
|
||||||
|
* Shattered Pixel Dungeon
|
||||||
|
* Copyright (C) 2014-2019 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.weapon.missiles;
|
||||||
|
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlastWave;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||||
|
import com.watabou.noosa.audio.Sample;
|
||||||
|
import com.watabou.utils.PathFinder;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class ForceCube extends MissileWeapon {
|
||||||
|
|
||||||
|
{
|
||||||
|
image = ItemSpriteSheet.FORCE_CUBE;
|
||||||
|
|
||||||
|
tier = 5;
|
||||||
|
baseUses = 5;
|
||||||
|
|
||||||
|
sticky = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onThrow(int cell) {
|
||||||
|
Dungeon.level.press(cell, null, true);
|
||||||
|
|
||||||
|
ArrayList<Char> targets = new ArrayList<>();
|
||||||
|
if (Actor.findChar(cell) != null) targets.add(Actor.findChar(cell));
|
||||||
|
|
||||||
|
for (int i : PathFinder.NEIGHBOURS8){
|
||||||
|
Dungeon.level.press(cell + i, null, true);
|
||||||
|
if (Actor.findChar(cell + i) != null) targets.add(Actor.findChar(cell + i));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Char target : targets){
|
||||||
|
curUser.shoot(target, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
rangedHit( null, cell );
|
||||||
|
|
||||||
|
WandOfBlastWave.BlastWave.blast(cell);
|
||||||
|
Sample.INSTANCE.play( Assets.SND_BLAST );
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,143 @@
|
||||||
|
/*
|
||||||
|
* Pixel Dungeon
|
||||||
|
* Copyright (C) 2012-2015 Oleg Dolya
|
||||||
|
*
|
||||||
|
* Shattered Pixel Dungeon
|
||||||
|
* Copyright (C) 2014-2019 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.weapon.missiles;
|
||||||
|
|
||||||
|
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.sprites.ItemSpriteSheet;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.sprites.MissileSprite;
|
||||||
|
import com.watabou.utils.Bundle;
|
||||||
|
import com.watabou.utils.Callback;
|
||||||
|
|
||||||
|
public class HeavyBoomerang extends MissileWeapon {
|
||||||
|
|
||||||
|
{
|
||||||
|
image = ItemSpriteSheet.BOOMERANG;
|
||||||
|
|
||||||
|
tier = 4;
|
||||||
|
sticky = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int max(int lvl) {
|
||||||
|
return 4 * tier + //16 base, down from 20
|
||||||
|
(tier) * lvl; //scaling unchanged
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void rangedHit(Char enemy, int cell) {
|
||||||
|
decrementDurability();
|
||||||
|
if (durability > 0){
|
||||||
|
//TODO vfx
|
||||||
|
Buff.append(Dungeon.hero, CircleBack.class).setup(this, cell, Dungeon.hero.pos, Dungeon.depth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void rangedMiss(int cell) {
|
||||||
|
//TODO vfx
|
||||||
|
parent = null;
|
||||||
|
Buff.append(Dungeon.hero, CircleBack.class).setup(this, cell, Dungeon.hero.pos, Dungeon.depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class CircleBack extends Buff {
|
||||||
|
|
||||||
|
private MissileWeapon boomerang;
|
||||||
|
private int thrownPos;
|
||||||
|
private int returnPos;
|
||||||
|
private int returnDepth;
|
||||||
|
|
||||||
|
private int left;
|
||||||
|
|
||||||
|
public void setup( MissileWeapon boomerang, int thrownPos, int returnPos, int returnDepth){
|
||||||
|
this.boomerang = boomerang;
|
||||||
|
this.thrownPos = thrownPos;
|
||||||
|
this.returnPos = returnPos;
|
||||||
|
this.returnDepth = returnDepth;
|
||||||
|
left = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean act() {
|
||||||
|
if (returnDepth == Dungeon.depth){
|
||||||
|
left--;
|
||||||
|
if (left <= 0){
|
||||||
|
final Char returnTarget = Actor.findChar(returnPos);
|
||||||
|
((MissileSprite) Dungeon.hero.sprite.parent.recycle(MissileSprite.class)).
|
||||||
|
reset( thrownPos,
|
||||||
|
returnPos,
|
||||||
|
boomerang,
|
||||||
|
new Callback() {
|
||||||
|
@Override
|
||||||
|
public void call() {
|
||||||
|
if (returnTarget == Dungeon.hero){
|
||||||
|
boomerang.doPickUp(Dungeon.hero);
|
||||||
|
//grabbing the boomerang takes no time
|
||||||
|
Dungeon.hero.spend( -TIME_TO_PICK_UP );
|
||||||
|
|
||||||
|
} else if (returnTarget != null){
|
||||||
|
if (curUser.shoot( returnTarget, boomerang )) {
|
||||||
|
boomerang.decrementDurability();
|
||||||
|
}
|
||||||
|
if (boomerang.durability > 0) {
|
||||||
|
Dungeon.level.drop(boomerang, returnPos).sprite.drop();
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Dungeon.level.drop(boomerang, returnPos).sprite.drop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
detach();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
spend( TICK );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String BOOMERANG = "boomerang";
|
||||||
|
private static final String THROWN_POS = "thrown_pos";
|
||||||
|
private static final String RETURN_POS = "return_pos";
|
||||||
|
private static final String RETURN_DEPTH = "return_depth";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void storeInBundle(Bundle bundle) {
|
||||||
|
super.storeInBundle(bundle);
|
||||||
|
bundle.put(BOOMERANG, boomerang);
|
||||||
|
bundle.put(THROWN_POS, thrownPos);
|
||||||
|
bundle.put(RETURN_POS, returnPos);
|
||||||
|
bundle.put(RETURN_DEPTH, returnDepth);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void restoreFromBundle(Bundle bundle) {
|
||||||
|
super.restoreFromBundle(bundle);
|
||||||
|
boomerang = (MissileWeapon) bundle.get(BOOMERANG);
|
||||||
|
thrownPos = bundle.getInt(THROWN_POS);
|
||||||
|
returnPos = bundle.getInt(RETURN_POS);
|
||||||
|
returnDepth = bundle.getInt(RETURN_DEPTH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -198,37 +198,17 @@ abstract public class MissileWeapon extends Weapon {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void rangedHit( Char enemy, int cell ){
|
protected void rangedHit( Char enemy, int cell ){
|
||||||
//if this weapon was thrown from a source stack, degrade that stack.
|
decrementDurability();
|
||||||
//unless a weapon is about to break, then break the one being thrown
|
|
||||||
if (parent != null){
|
|
||||||
if (parent.durability <= parent.durabilityPerUse()){
|
|
||||||
durability = 0;
|
|
||||||
parent.durability = MAX_DURABILITY;
|
|
||||||
} else {
|
|
||||||
parent.durability -= parent.durabilityPerUse();
|
|
||||||
if (parent.durability > 0 && parent.durability <= parent.durabilityPerUse()){
|
|
||||||
if (level() <= 0)GLog.w(Messages.get(this, "about_to_break"));
|
|
||||||
else GLog.n(Messages.get(this, "about_to_break"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
parent = null;
|
|
||||||
} else {
|
|
||||||
durability -= durabilityPerUse();
|
|
||||||
if (durability > 0 && durability <= durabilityPerUse()){
|
|
||||||
if (level() <= 0)GLog.w(Messages.get(this, "about_to_break"));
|
|
||||||
else GLog.n(Messages.get(this, "about_to_break"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (durability > 0){
|
if (durability > 0){
|
||||||
//attempt to stick the missile weapon to the enemy, just drop it if we can't.
|
//attempt to stick the missile weapon to the enemy, just drop it if we can't.
|
||||||
if (enemy.isAlive() && sticky) {
|
if (enemy != null && enemy.isAlive() && sticky) {
|
||||||
PinCushion p = Buff.affect(enemy, PinCushion.class);
|
PinCushion p = Buff.affect(enemy, PinCushion.class);
|
||||||
if (p.target == enemy){
|
if (p.target == enemy){
|
||||||
p.stick(this);
|
p.stick(this);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Dungeon.level.drop( this, enemy.pos ).sprite.drop();
|
Dungeon.level.drop( this, cell ).sprite.drop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,6 +232,30 @@ abstract public class MissileWeapon extends Weapon {
|
||||||
return (MAX_DURABILITY/usages) + 0.001f;
|
return (MAX_DURABILITY/usages) + 0.001f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void decrementDurability(){
|
||||||
|
//if this weapon was thrown from a source stack, degrade that stack.
|
||||||
|
//unless a weapon is about to break, then break the one being thrown
|
||||||
|
if (parent != null){
|
||||||
|
if (parent.durability <= parent.durabilityPerUse()){
|
||||||
|
durability = 0;
|
||||||
|
parent.durability = MAX_DURABILITY;
|
||||||
|
} else {
|
||||||
|
parent.durability -= parent.durabilityPerUse();
|
||||||
|
if (parent.durability > 0 && parent.durability <= parent.durabilityPerUse()){
|
||||||
|
if (level() <= 0)GLog.w(Messages.get(this, "about_to_break"));
|
||||||
|
else GLog.n(Messages.get(this, "about_to_break"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parent = null;
|
||||||
|
} else {
|
||||||
|
durability -= durabilityPerUse();
|
||||||
|
if (durability > 0 && durability <= durabilityPerUse()){
|
||||||
|
if (level() <= 0)GLog.w(Messages.get(this, "about_to_break"));
|
||||||
|
else GLog.n(Messages.get(this, "about_to_break"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int damageRoll(Char owner) {
|
public int damageRoll(Char owner) {
|
||||||
int damage = augment.damageFactor(super.damageRoll( owner ));
|
int damage = augment.damageFactor(super.damageRoll( owner ));
|
||||||
|
|
|
@ -1406,6 +1406,12 @@ items.weapon.missiles.boomerang.durability=Due to its solid construction, this b
|
||||||
items.weapon.missiles.fishingspear.name=fishing spear
|
items.weapon.missiles.fishingspear.name=fishing spear
|
||||||
items.weapon.missiles.fishingspear.desc=Tiny throwing spears designed for fishing. They work well as an improvised weapon too.
|
items.weapon.missiles.fishingspear.desc=Tiny throwing spears designed for fishing. They work well as an improvised weapon too.
|
||||||
|
|
||||||
|
items.weapon.missiles.forcecube.name=force cube
|
||||||
|
items.weapon.missiles.forcecube.desc=This oddly-shaped weapon is small enough to hold in your hand, but is incredibly heavy. When thrown, it will spread the force of its impact over a small area, damaging everything in the blast.
|
||||||
|
|
||||||
|
items.weapon.missiles.heavyboomerang.name=heavy boomerang
|
||||||
|
items.weapon.missiles.heavyboomerang.desc=This large boomerang is difficult to wield effectively, but will deal considerable damage. After a few turns, it will fly back to the location it was thrown from.
|
||||||
|
|
||||||
items.weapon.missiles.javelin.name=javelin
|
items.weapon.missiles.javelin.name=javelin
|
||||||
items.weapon.missiles.javelin.desc=These larger throwing spears are weighted to keep the spike at their tip foremost as they sail through the air.
|
items.weapon.missiles.javelin.desc=These larger throwing spears are weighted to keep the spike at their tip foremost as they sail through the air.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user