v2.3.0: extremely early geomancer impl, no fight logic atm
This commit is contained in:
@@ -1209,7 +1209,8 @@ actors.mobs.gnoll.name=gnoll scout
|
||||
actors.mobs.gnoll.desc=Gnolls are hyena-like humanoids. They dwell in sewers and dungeons, venturing up to raid the surface from time to time. Gnoll scouts are regular members of their pack, they are not as strong as brutes and not as intelligent as shamans.
|
||||
|
||||
actors.mobs.gnollgeomancer.name=gnoll geomancer
|
||||
actors.mobs.gnollgeomancer.desc=TODO
|
||||
actors.mobs.gnollgeomancer.desc=TODO, fight info
|
||||
actors.mobs.gnollgeomancer.desc_sleeping=This impressively tall gnoll shaman is surrounded by a layer of rock, and looks almost like a statue. Looking closely you can see the rock magically move in time with the senior gnoll's breathing. It can't be harmed while encased in rock like this, and it appears to be enjoying a literal dirt nap.\n\nYou can probably break through the layers of rock with your pickaxe, but _be sure you're ready for a fight when you do so._ The geomancer must be the source of the various earth-moving magic around here, and the organizer of all the gnoll activity. _Defeating the gnolls scattered around here before fighting it might be a good idea._
|
||||
|
||||
actors.mobs.gnollguard.name=gnoll guard
|
||||
actors.mobs.gnollguard.desc=A large and tough looking gnoll wielding a spear and a shield, but no helmet. These guards are likely brutes in training, roped into helping protect the mine from encroaching wildlife.\n\nThe gnoll guard is strong enough to wield the spear in one hand, but can't use it very well. _It will need fairly open space to attack at a distance, and will do notably less damage to you if you get up close._
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 865 B After Width: | Height: | Size: 963 B |
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Pixel Dungeon
|
||||
* Copyright (C) 2012-2015 Oleg Dolya
|
||||
*
|
||||
* Shattered Pixel Dungeon
|
||||
* Copyright (C) 2014-2023 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.actors.mobs;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Blacksmith;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.GnollGeomancerSprite;
|
||||
|
||||
public class GnollGeomancer extends Mob {
|
||||
|
||||
{
|
||||
//TODO
|
||||
HP = HT = 300;
|
||||
spriteClass = GnollGeomancerSprite.class;
|
||||
|
||||
EXP = 20;
|
||||
|
||||
//acts after other mobs?
|
||||
actPriority = MOB_PRIO-1;
|
||||
|
||||
SLEEPING = new Sleeping();
|
||||
state = SLEEPING;
|
||||
|
||||
properties.add(Property.BOSS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
if (state == SLEEPING){
|
||||
return Messages.get(this, "desc_sleeping");
|
||||
} else {
|
||||
return super.description();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void die(Object cause) {
|
||||
super.die(cause);
|
||||
Blacksmith.Quest.beatBoss();
|
||||
}
|
||||
|
||||
private class Sleeping extends Mob.Sleeping {
|
||||
|
||||
@Override
|
||||
protected void awaken(boolean enemyInFOV) {
|
||||
//TODO . do nothing for now
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,7 @@
|
||||
package com.shatteredpixel.shatteredpixeldungeon.levels.rooms.quest;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.CrystalSpire;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.GnollGeomancer;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.npcs.Blacksmith;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||
@@ -32,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.rooms.standard.CaveRoom;
|
||||
import com.watabou.utils.GameMath;
|
||||
import com.watabou.utils.Point;
|
||||
import com.watabou.utils.Random;
|
||||
import com.watabou.utils.Rect;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@@ -113,12 +115,14 @@ public class MineGiantRoom extends CaveRoom {
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 8; i ++){
|
||||
Point r = random(5);
|
||||
if (level.map[level.pointToCell(r)] != Terrain.WALL) {
|
||||
Painter.set(level, r, Terrain.BARRICADE);
|
||||
}
|
||||
}
|
||||
Point center = center();
|
||||
Rect centerArea = new Rect(center.x-2, center.y-2, center.x+3, center.y+3);
|
||||
Painter.fillEllipse(level, centerArea, 0, Terrain.MINE_BOULDER);
|
||||
Painter.fill(level, centerArea, 2, Terrain.EMPTY_DECO);
|
||||
|
||||
GnollGeomancer g = new GnollGeomancer();
|
||||
g.pos = level.pointToCell(center);
|
||||
level.mobs.add(g);
|
||||
|
||||
} else if (Blacksmith.Quest.Type() == Blacksmith.Quest.FUNGI){
|
||||
Painter.fillEllipse(level, this, 3, Terrain.EMPTY);
|
||||
|
||||
@@ -127,7 +127,7 @@ public class MineLargeRoom extends CaveRoom {
|
||||
int sapperPos = level.pointToCell(random(5));
|
||||
GnollSapper s = new GnollSapper();
|
||||
s.pos = sapperPos;
|
||||
((GnollSapper)s).spawnPos = s.pos;
|
||||
s.spawnPos = s.pos;
|
||||
level.mobs.add(s);
|
||||
|
||||
int guardPos;
|
||||
|
||||
@@ -22,10 +22,13 @@
|
||||
package com.shatteredpixel.shatteredpixeldungeon.sprites;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.watabou.noosa.TextureFilm;
|
||||
|
||||
public class GnollGeomancerSprite extends MobSprite {
|
||||
|
||||
private Animation statue;
|
||||
|
||||
public GnollGeomancerSprite() {
|
||||
super();
|
||||
|
||||
@@ -34,21 +37,32 @@ public class GnollGeomancerSprite extends MobSprite {
|
||||
TextureFilm frames = new TextureFilm( texture, 12, 16 );
|
||||
|
||||
idle = new Animation( 2, true );
|
||||
idle.frames( frames, 0, 0, 0, 1, 0, 0, 1, 1 );
|
||||
idle.frames( frames, 1, 1, 1, 2, 1, 1, 2, 2 );
|
||||
|
||||
run = new Animation( 12, true );
|
||||
run.frames( frames, 4, 5, 6, 7 );
|
||||
run.frames( frames, 5, 6, 7, 8 );
|
||||
|
||||
attack = new Animation( 12, false );
|
||||
attack.frames( frames, 2, 3, 0 );
|
||||
attack.frames( frames, 3, 4, 1 );
|
||||
|
||||
zap = attack.clone();
|
||||
|
||||
die = new Animation( 12, false );
|
||||
die.frames( frames, 8, 9, 10 );
|
||||
die.frames( frames, 9, 10, 11 );
|
||||
|
||||
play( idle );
|
||||
statue = new Animation(1, true);
|
||||
statue.frames( frames, 0 );
|
||||
|
||||
play(idle);
|
||||
|
||||
scale.set(1.25f);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void idle() {
|
||||
super.idle();
|
||||
if (ch instanceof Mob && ((Mob) ch).state == ((Mob) ch).SLEEPING){
|
||||
play( statue );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user