v0.6.3: implement drops for new ranged weapons

This commit is contained in:
Evan Debenham 2018-01-04 21:33:52 -05:00
parent 9816333fd7
commit 232e8a986f
13 changed files with 139 additions and 52 deletions

View File

@ -150,8 +150,10 @@ public class Mimic extends Mob {
//generate an extra reward for killing the mimic
switch(Random.Int(5)){
case 0: case 1:
case 0:
m.items.add(new Gold().random()); break;
case 1:
m.items.add(Generator.randomMissile()); break;
case 2:
m.items.add(Generator.randomArmor().identify()); break;
case 3:

View File

@ -89,8 +89,8 @@ public class Skeleton extends Mob {
protected Item createLoot() {
Item loot;
do {
loot = Generator.random(Generator.Category.WEAPON);
//50% chance of re-rolling tier 4 or 5 items
loot = Random.Int(4) == 0 ? Generator.randomMissile() : Generator.randomWeapon();
//50% chance of re-rolling tier 4 or 5 melee weapons
} while (loot instanceof MeleeWeapon && ((MeleeWeapon) loot).tier >= 4 && Random.Int(2) == 0);
loot.level(0);
return loot;

View File

@ -30,7 +30,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon.Enchantment;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Vampiric;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon;
import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.sprites.StatueSprite;
@ -52,8 +51,8 @@ public class Statue extends Mob {
super();
do {
weapon = (Weapon)Generator.random( Generator.Category.WEAPON );
} while (!(weapon instanceof MeleeWeapon) || weapon.cursed);
weapon = Generator.randomWeapon();
} while (weapon.cursed);
weapon.enchant( Enchantment.random() );

View File

@ -97,7 +97,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfPrismaticLight
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfRegrowth;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfTransfusion;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfVenom;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.Weapon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.AssassinsBlade;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.BattleAxe;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Dagger;
@ -112,6 +111,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Knuckles;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Longsword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Mace;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MagesStaff;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Quarterstaff;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.RoundShield;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.RunicBlade;
@ -123,6 +123,18 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Sword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WarHammer;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Whip;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WornShortsword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Bolas;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.CurareDart;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Dart;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.FishingSpear;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.IncendiaryDart;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Javelin;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Shuriken;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingHammer;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingKnife;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Tomahawk;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Trident;
import com.shatteredpixel.shatteredpixeldungeon.plants.BlandfruitBush;
import com.shatteredpixel.shatteredpixeldungeon.plants.Blindweed;
import com.shatteredpixel.shatteredpixeldungeon.plants.Dreamfoil;
@ -147,21 +159,34 @@ import java.util.LinkedHashMap;
public class Generator {
public enum Category {
WEAPON ( 6, Weapon.class ),
WEP_T1 ( 0, Weapon.class),
WEP_T2 ( 0, Weapon.class),
WEP_T3 ( 0, Weapon.class),
WEP_T4 ( 0, Weapon.class),
WEP_T5 ( 0, Weapon.class),
WEAPON ( 6, MeleeWeapon.class),
WEP_T1 ( 0, MeleeWeapon.class),
WEP_T2 ( 0, MeleeWeapon.class),
WEP_T3 ( 0, MeleeWeapon.class),
WEP_T4 ( 0, MeleeWeapon.class),
WEP_T5 ( 0, MeleeWeapon.class),
ARMOR ( 4, Armor.class ),
MISSILE ( 5, MissileWeapon.class ),
MIS_T1 ( 0, MissileWeapon.class ),
MIS_T2 ( 0, MissileWeapon.class ),
MIS_T3 ( 0, MissileWeapon.class ),
MIS_T4 ( 0, MissileWeapon.class ),
MIS_T5 ( 0, MissileWeapon.class ),
POTION ( 20, Potion.class ),
SCROLL ( 20, Scroll.class ),
WAND ( 3, Wand.class ),
RING ( 1, Ring.class ),
ARTIFACT( 1, Artifact.class),
SEED ( 0, Plant.Seed.class ),
FOOD ( 0, Food.class ),
GOLD ( 25, Gold.class );
GOLD ( 20, Gold.class );
public Class<?>[] classes;
public float[] probs;
@ -296,6 +321,41 @@ public class Generator {
PlateArmor.class };
ARMOR.probs = new float[]{ 0, 0, 0, 0, 0 };
//see Generator.randomMissile
MISSILE.classes = new Class<?>[]{};
MISSILE.probs = new float[]{};
MIS_T1.classes = new Class<?>[]{
Dart.class,
ThrowingKnife.class
};
MIS_T1.probs = new float[]{ 1, 1 };
MIS_T2.classes = new Class<?>[]{
Shuriken.class,
IncendiaryDart.class,
CurareDart.class
};
MIS_T2.probs = new float[]{ 5, 2, 2 };
MIS_T3.classes = new Class<?>[]{
FishingSpear.class,
Bolas.class
};
MIS_T3.probs = new float[]{ 4, 3 };
MIS_T4.classes = new Class<?>[]{
Javelin.class,
Tomahawk.class
};
MIS_T4.probs = new float[]{ 4, 3 };
MIS_T5.classes = new Class<?>[]{
Trident.class,
ThrowingHammer.class
};
MIS_T5.probs = new float[]{ 4, 3 };
FOOD.classes = new Class<?>[]{
Food.class,
Pasty.class,
@ -384,6 +444,8 @@ public class Generator {
return randomArmor();
case WEAPON:
return randomWeapon();
case MISSILE:
return randomMissile();
case ARTIFACT:
Item item = randomArtifact();
//if we're out of artifacts, return a ring instead.
@ -439,17 +501,44 @@ public class Generator {
Category.WEP_T5
};
public static Weapon randomWeapon(){
public static MeleeWeapon randomWeapon(){
return randomWeapon(Dungeon.depth / 5);
}
public static Weapon randomWeapon(int floorSet) {
public static MeleeWeapon randomWeapon(int floorSet) {
floorSet = (int)GameMath.gate(0, floorSet, floorSetTierProbs.length-1);
try {
Category c = wepTiers[Random.chances(floorSetTierProbs[floorSet])];
Weapon w = (Weapon)c.classes[Random.chances(c.probs)].newInstance();
MeleeWeapon w = (MeleeWeapon)c.classes[Random.chances(c.probs)].newInstance();
w.random();
return w;
} catch (Exception e) {
ShatteredPixelDungeon.reportException(e);
return null;
}
}
public static final Category[] misTiers = new Category[]{
Category.MIS_T1,
Category.MIS_T2,
Category.MIS_T3,
Category.MIS_T4,
Category.MIS_T5
};
public static MissileWeapon randomMissile(){
return randomMissile(Dungeon.depth / 5);
}
public static MissileWeapon randomMissile(int floorSet) {
floorSet = (int)GameMath.gate(0, floorSet, floorSetTierProbs.length-1);
try {
Category c = misTiers[Random.chances(floorSetTierProbs[floorSet])];
MissileWeapon w = (MissileWeapon)c.classes[Random.chances(c.probs)].newInstance();
w.random();
return w;
} catch (Exception e) {

View File

@ -52,7 +52,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.TimekeepersHourglass;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRecharging;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.CursingTrap;
import com.shatteredpixel.shatteredpixeldungeon.levels.traps.ShockingTrap;
@ -389,7 +388,7 @@ public class CursedWand {
do {
reward = Generator.random(Random.oneOf(Generator.Category.WEAPON, Generator.Category.ARMOR,
Generator.Category.RING, Generator.Category.WAND));
} while (reward.level() < 2 && !(reward instanceof MissileWeapon));
} while (reward.level() < 1);
Sample.INSTANCE.play(Assets.SND_MIMIC, 1, 1, 0.5f);
mimic.items.clear();
mimic.items.add(reward);
@ -442,7 +441,7 @@ public class CursedWand {
do {
result = Generator.random(Random.oneOf(Generator.Category.WEAPON, Generator.Category.ARMOR,
Generator.Category.RING, Generator.Category.ARTIFACT));
} while (result.level() < 0 && !(result instanceof MissileWeapon));
} while (result.cursed);
if (result.isUpgradable()) result.upgrade();
result.cursed = result.cursedKnown = true;
GLog.w( Messages.get(CursedWand.class, "transmogrify") );

View File

@ -55,6 +55,6 @@ public abstract class TippedDart extends Dart {
@Override
public int price() {
return quantity * 8;
return quantity * 6;
}
}

View File

@ -22,8 +22,6 @@
package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.secret;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
@ -46,12 +44,7 @@ public class SecretArtilleryRoom extends SecretRoom {
} while ( level.map[itemPos] != Terrain.EMPTY_SP
|| level.heaps.get(itemPos) != null);
Item item;
do{
item = Generator.randomWeapon();
} while (!(item instanceof MissileWeapon));
level.drop(item, itemPos);
level.drop(Generator.randomMissile(), itemPos);
}
entrance().set(Door.Type.HIDDEN);

View File

@ -25,7 +25,6 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Maze;
@ -102,7 +101,7 @@ public class SecretMazeRoom extends SecretRoom {
} else {
prize = Generator.randomArmor((Dungeon.depth / 5) + 1);
}
} while (prize.cursed || prize instanceof MissileWeapon);
} while (prize.cursed);
//33% chance for an extra update.
if (Random.Int(3) == 0){

View File

@ -54,7 +54,7 @@ public class ArmoryRoom extends SpecialRoom {
Painter.set( level, statue, Terrain.STATUE );
}
int n = Random.IntRange( 1, 2 );
int n = Random.IntRange( 2, 3 );
for (int i=0; i < n; i++) {
int pos;
do {
@ -68,11 +68,15 @@ public class ArmoryRoom extends SpecialRoom {
}
private static Item prize( Level level ) {
return Random.Int( 6 ) == 0 ?
new Bomb().random() :
Generator.random( Random.oneOf(
Generator.Category.ARMOR,
Generator.Category.WEAPON
) );
switch (Random.Int( 5 )){
case 0:
return new Bomb().random();
case 1:
return Generator.randomWeapon();
case 2:
return Generator.randomArmor();
default:
return Generator.randomMissile();
}
}
}

View File

@ -27,7 +27,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfInvisibility;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
@ -105,7 +104,7 @@ public class PoolRoom extends SpecialRoom {
} while (prize.cursed);
//33% chance for an extra update.
if (!(prize instanceof MissileWeapon) && Random.Int(3) == 0){
if (Random.Int(3) == 0){
prize.upgrade();
}

View File

@ -61,11 +61,14 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Mace;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Shortsword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.Sword;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.WarHammer;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.CurareDart;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Bolas;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.FishingSpear;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.IncendiaryDart;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Javelin;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Shuriken;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.ThrowingHammer;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Tomahawk;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.Trident;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
@ -165,32 +168,32 @@ public class ShopRoom extends SpecialRoom {
case 6:
itemsToSpawn.add( (Random.Int( 2 ) == 0 ? new Shortsword().identify() : new HandAxe()).identify() );
itemsToSpawn.add( Random.Int( 2 ) == 0 ?
new IncendiaryDart().quantity(Random.NormalIntRange(2, 4)) :
new CurareDart().quantity(Random.NormalIntRange(1, 3)));
new Shuriken().random() :
new IncendiaryDart().random());
itemsToSpawn.add( new LeatherArmor().identify() );
break;
case 11:
itemsToSpawn.add( (Random.Int( 2 ) == 0 ? new Sword().identify() : new Mace()).identify() );
itemsToSpawn.add( Random.Int( 2 ) == 0 ?
new CurareDart().quantity(Random.NormalIntRange(2, 5)) :
new Shuriken().quantity(Random.NormalIntRange(3, 6)));
new FishingSpear().random() :
new Bolas().random());
itemsToSpawn.add( new MailArmor().identify() );
break;
case 16:
itemsToSpawn.add( (Random.Int( 2 ) == 0 ? new Longsword().identify() : new BattleAxe()).identify() );
itemsToSpawn.add( Random.Int( 2 ) == 0 ?
new Shuriken().quantity(Random.NormalIntRange(4, 7)) :
new Javelin().quantity(Random.NormalIntRange(3, 6)));
new Javelin().random() :
new Tomahawk().random());
itemsToSpawn.add( new ScaleArmor().identify() );
break;
case 21:
itemsToSpawn.add( Random.Int( 2 ) == 0 ? new Greatsword().identify() : new WarHammer().identify() );
itemsToSpawn.add( Random.Int(2) == 0 ?
new Javelin().quantity(Random.NormalIntRange(4, 7)) :
new Tomahawk().quantity(Random.NormalIntRange(4, 7)));
new Trident().random() :
new ThrowingHammer().random());
itemsToSpawn.add( new PlateArmor().identify() );
itemsToSpawn.add( new Torch() );
itemsToSpawn.add( new Torch() );

View File

@ -27,7 +27,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.potions.PotionOfLevitation;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.painters.Painter;
@ -136,7 +135,7 @@ public class TrapsRoom extends SpecialRoom {
} while (prize.cursed);
//33% chance for an extra update.
if (!(prize instanceof MissileWeapon) && Random.Int(3) == 0){
if (Random.Int(3) == 0){
prize.upgrade();
}

View File

@ -56,7 +56,8 @@ public class BlacksmithRoom extends StandardRoom {
level.drop(
Generator.random( Random.oneOf(
Generator.Category.ARMOR,
Generator.Category.WEAPON
Generator.Category.WEAPON,
Generator.Category.MISSILE
) ), pos );
}