v2.2.0: improved code for levelgen statues and mimic vs. non-levelgen

This commit is contained in:
Evan Debenham
2023-10-12 13:10:42 -04:00
parent ebd6c9e5be
commit a86e20c793
9 changed files with 34 additions and 35 deletions
@@ -170,7 +170,7 @@ public class CrystalMimic extends Mimic {
} }
@Override @Override
protected void generatePrize() { protected void generatePrize( boolean useDecks ) {
//Crystal mimic already contains a prize item. Just guarantee it isn't cursed. //Crystal mimic already contains a prize item. Just guarantee it isn't cursed.
for (Item i : items){ for (Item i : items){
i.cursed = false; i.cursed = false;
@@ -82,8 +82,8 @@ public class GoldenMimic extends Mimic {
} }
@Override @Override
protected void generatePrize() { protected void generatePrize( boolean useDecks ) {
super.generatePrize(); super.generatePrize( useDecks );
//all existing prize items are guaranteed uncursed, and have a 50% chance to be +1 if they were +0 //all existing prize items are guaranteed uncursed, and have a 50% chance to be +1 if they were +0
for (Item i : items){ for (Item i : items){
if (i instanceof EquipableItem || i instanceof Wand){ if (i instanceof EquipableItem || i instanceof Wand){
@@ -46,7 +46,6 @@ import com.watabou.utils.Random;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List;
public class Mimic extends Mob { public class Mimic extends Mob {
@@ -274,20 +273,19 @@ public class Mimic extends Mob {
return true; return true;
} }
public static Mimic spawnAt( int pos, Item item ){ public static Mimic spawnAt( int pos, Item... items){
return spawnAt( pos, Arrays.asList(item), Mimic.class); return spawnAt(pos, Mimic.class, items);
} }
public static Mimic spawnAt( int pos, Item item, Class mimicType ){ public static Mimic spawnAt( int pos, Class mimicType, Item... items){
return spawnAt( pos, Arrays.asList(item), mimicType); return spawnAt(pos, mimicType, true, items);
} }
public static Mimic spawnAt( int pos, List<Item> items ) { public static Mimic spawnAt( int pos, boolean useDecks, Item... items){
return spawnAt( pos, items, Mimic.class); return spawnAt(pos, Mimic.class, useDecks, items);
} }
public static Mimic spawnAt( int pos, List<Item> items, Class mimicType ) { public static Mimic spawnAt( int pos, Class mimicType, boolean useDecks, Item... items){
Mimic m; Mimic m;
if (mimicType == GoldenMimic.class){ if (mimicType == GoldenMimic.class){
m = new GoldenMimic(); m = new GoldenMimic();
@@ -297,17 +295,17 @@ public class Mimic extends Mob {
m = new Mimic(); m = new Mimic();
} }
m.items = new ArrayList<>( items ); m.items = new ArrayList<>( Arrays.asList(items) );
m.setLevel( Dungeon.depth ); m.setLevel( Dungeon.depth );
m.pos = pos; m.pos = pos;
//generate an extra reward for killing the mimic //generate an extra reward for killing the mimic
m.generatePrize(); m.generatePrize(useDecks);
return m; return m;
} }
protected void generatePrize(){ protected void generatePrize( boolean useDecks ){
Item reward = null; Item reward = null;
do { do {
switch (Random.Int(5)) { switch (Random.Int(5)) {
@@ -315,16 +313,16 @@ public class Mimic extends Mob {
reward = new Gold().random(); reward = new Gold().random();
break; break;
case 1: case 1:
reward = Generator.randomMissile(true); reward = Generator.randomMissile(!useDecks);
break; break;
case 2: case 2:
reward = Generator.randomArmor(); reward = Generator.randomArmor();
break; break;
case 3: case 3:
reward = Generator.randomWeapon(true); reward = Generator.randomWeapon(!useDecks);
break; break;
case 4: case 4:
reward = Generator.randomUsingDefaults(Generator.Category.RING); reward = useDecks ? Generator.random(Generator.Category.RING) : Generator.randomUsingDefaults(Generator.Category.RING);
break; break;
} }
} while (reward == null || Challenges.isItemBlocked(reward)); } while (reward == null || Challenges.isItemBlocked(reward));
@@ -22,7 +22,6 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.mobs; package com.shatteredpixel.shatteredpixeldungeon.actors.mobs;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff; import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
import com.shatteredpixel.shatteredpixeldungeon.items.Generator; import com.shatteredpixel.shatteredpixeldungeon.items.Generator;
@@ -32,7 +31,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon; import com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee.MeleeWeapon;
import com.shatteredpixel.shatteredpixeldungeon.journal.Notes; import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.scenes.InterlevelScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.StatueSprite; import com.shatteredpixel.shatteredpixeldungeon.sprites.StatueSprite;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog; import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Bundle; import com.watabou.utils.Bundle;
@@ -60,13 +58,13 @@ public class Statue extends Mob {
defenseSkill = 4 + Dungeon.depth; defenseSkill = 4 + Dungeon.depth;
} }
public void createWeapon(){ public void createWeapon( boolean useDecks ){
//this is a bit of a hack. I'm strongly considering redesigning this system code-wise though if (useDecks) {
if (ShatteredPixelDungeon.scene() instanceof InterlevelScene) {
weapon = (MeleeWeapon) Generator.random(Generator.Category.WEAPON); weapon = (MeleeWeapon) Generator.random(Generator.Category.WEAPON);
} else { } else {
weapon = (MeleeWeapon) Generator.randomUsingDefaults(Generator.Category.WEAPON); weapon = (MeleeWeapon) Generator.randomUsingDefaults(Generator.Category.WEAPON);
} }
levelGenStatue = useDecks;
weapon.cursed = false; weapon.cursed = false;
weapon.enchant( Enchantment.random() ); weapon.enchant( Enchantment.random() );
} }
@@ -191,13 +189,17 @@ public class Statue extends Mob {
} }
public static Statue random(){ public static Statue random(){
Statue statue = null; return random( true );
}
public static Statue random( boolean useDecks ){
Statue statue;
if (Random.Int(10) == 0){ if (Random.Int(10) == 0){
statue = new ArmoredStatue(); statue = new ArmoredStatue();
} else { } else {
statue = new Statue(); statue = new Statue();
} }
statue.createWeapon(); statue.createWeapon(useDecks);
return statue; return statue;
} }
@@ -357,7 +357,7 @@ public class CursedWand {
} }
} }
Mimic mimic = Mimic.spawnAt(spawnCell, new ArrayList<Item>(), GoldenMimic.class); Mimic mimic = Mimic.spawnAt(spawnCell, GoldenMimic.class, false);
mimic.stopHiding(); mimic.stopHiding();
mimic.alignment = Char.Alignment.ENEMY; mimic.alignment = Char.Alignment.ENEMY;
Item reward; Item reward;
@@ -386,7 +386,7 @@ public abstract class RegularLevel extends Level {
(toDrop.isUpgradable() && Random.Int(4 - toDrop.level()) == 0)){ (toDrop.isUpgradable() && Random.Int(4 - toDrop.level()) == 0)){
if (Dungeon.depth > 1 && Random.Int(10) == 0 && findMob(cell) == null){ if (Dungeon.depth > 1 && Random.Int(10) == 0 && findMob(cell) == null){
mobs.add(Mimic.spawnAt(cell, toDrop, GoldenMimic.class)); mobs.add(Mimic.spawnAt(cell, GoldenMimic.class, toDrop));
} else { } else {
Heap dropped = drop(toDrop, cell); Heap dropped = drop(toDrop, cell);
if (heaps.get(cell) == dropped) { if (heaps.get(cell) == dropped) {
@@ -71,7 +71,7 @@ public class CrystalVaultRoom extends SpecialRoom {
level.drop( i1, i1Pos ).type = Heap.Type.CRYSTAL_CHEST; level.drop( i1, i1Pos ).type = Heap.Type.CRYSTAL_CHEST;
if (Random.Int(10) == 0){ if (Random.Int(10) == 0){
level.mobs.add(Mimic.spawnAt(i2Pos, i2, CrystalMimic.class)); level.mobs.add(Mimic.spawnAt(i2Pos, CrystalMimic.class, i2));
} else { } else {
level.drop(i2, i2Pos).type = Heap.Type.CRYSTAL_CHEST; level.drop(i2, i2Pos).type = Heap.Type.CRYSTAL_CHEST;
} }
@@ -114,7 +114,7 @@ public class DistortionTrap extends Trap{
mob = Reflection.newInstance(Bestiary.getMobRotation(floor).get(0)); mob = Reflection.newInstance(Bestiary.getMobRotation(floor).get(0));
break; break;
case 2: case 2:
switch (Random.Int(4)){ switch (2){
case 0: default: case 0: default:
Wraith.spawnAt(point, true); Wraith.spawnAt(point, true);
continue; //wraiths spawn themselves, no need to do more continue; //wraiths spawn themselves, no need to do more
@@ -123,13 +123,12 @@ public class DistortionTrap extends Trap{
mob = Piranha.random(); mob = Piranha.random();
break; break;
case 2: case 2:
mob = Mimic.spawnAt(point, new ArrayList<>()); mob = Mimic.spawnAt(point, false);
((Mimic)mob).stopHiding(); ((Mimic)mob).stopHiding();
mob.alignment = Char.Alignment.ENEMY; mob.alignment = Char.Alignment.ENEMY;
break; break;
case 3: case 3:
mob = Statue.random(); mob = Statue.random(false);
((Statue) mob).levelGenStatue = false;
break; break;
} }
break; break;
@@ -58,7 +58,7 @@ public class GuardianTrap extends Trap {
for (int i = 0; i < (scalingDepth() - 5)/5; i++){ for (int i = 0; i < (scalingDepth() - 5)/5; i++){
Guardian guardian = new Guardian(); Guardian guardian = new Guardian();
guardian.createWeapon(); guardian.createWeapon(false);
guardian.state = guardian.WANDERING; guardian.state = guardian.WANDERING;
guardian.pos = Dungeon.level.randomRespawnCell( guardian ); guardian.pos = Dungeon.level.randomRespawnCell( guardian );
if (guardian.pos != -1) { if (guardian.pos != -1) {
@@ -81,7 +81,7 @@ public class GuardianTrap extends Trap {
} }
@Override @Override
public void createWeapon() { public void createWeapon( boolean useDecks ) {
weapon = (MeleeWeapon) Generator.randomUsingDefaults(Generator.Category.WEAPON); weapon = (MeleeWeapon) Generator.randomUsingDefaults(Generator.Category.WEAPON);
weapon.cursed = false; weapon.cursed = false;
weapon.enchant(null); weapon.enchant(null);