Compare commits

..

27 Commits

Author SHA1 Message Date
OMGeeky
b1c2a4ef8c remove unused stuff 2024-09-07 15:36:00 +02:00
OMGeeky
af3109b9d9 Fix visual Bugs & slowdowns 2024-09-07 15:06:04 +02:00
Ian
bac004ae33 Visual Glitch Fix
-Fix the issue where the application is not able to handle multiple effects simultanously
2024-09-07 18:23:07 +08:00
Nut.andor
e5acb89f1b authors 2024-08-30 22:56:00 +02:00
Nut.andor
950310906e new map_brightport.png 2024-08-28 20:56:14 +02:00
Nut.andor
4f2733324f Merge branch 'pulls/1829009049/74' into AT_Source_Next_Release 2024-08-25 23:10:48 +02:00
Nut.andor
7379277b1d Pass time debug button 2024-08-25 23:05:59 +02:00
Nut.andor
6387b87ced Add tick-increase Debug-Button (for testing timers) 2024-08-25 23:04:31 +02:00
Nut.andor
f01c5ff237 Only add the loot once 2024-08-25 23:00:27 +02:00
Nut.andor
5843be57c0 Pull Request #74: Add tick-increase Debug-Button (for testing timers) 2024-08-25 14:04:07 +02:00
OMGeeky
4a62613375 Add tick-increase Debug-Button (for testing timers) 2024-08-25 14:00:39 +02:00
Nut.andor
bec17c65e4 Pull Request #73: Only add the loot once 2024-08-25 13:31:29 +02:00
OMGeeky
315e34185a Only add the loot once to the killedMonsterBags
without this, the loot might be added multiple times to the UI when showing what has been dropped, allowing the player to get more items than they should be allowed to
2024-08-25 13:23:25 +02:00
Nut.andor
585852ecb1 items_misc_2 2024-08-23 00:32:40 +02:00
Nut.andor
d87e584601 Teleport WX 2024-08-17 19:04:30 +02:00
Nut.andor
bfeab1abfa Merge branch 'pulls/1829009049/72' into AT_Source_Next_Release 2024-08-17 12:15:45 +02:00
Nut.andor
7c30577374 Reduce the Item use cost penalty like the move and attack cost penalt… 2024-08-17 12:13:19 +02:00
Nut.andor
e164e50f93 Pull Request #72: Reduce the Item use cost penalty like the move and attack cost penalt… 2024-08-15 20:20:38 +02:00
Nut.andor
84fa8e5547 debug buttons 2024-07-21 18:53:50 +02:00
Nut.andor
c9b4da0823 better error message 2024-07-20 01:23:08 +02:00
Nut.andor
4c55c5c2a7 better error message 2024-07-20 00:37:42 +02:00
Nut.andor
ced33a4cda fixes that can't be done by ATCS 2024-07-19 23:48:39 +02:00
Nut.andor
50606e8424 Merge branch 'pulls/1829009049/69' into AT_Source_Next_Release 2024-07-19 23:47:24 +02:00
Nut.andor
845ea0926e debug buttons 2024-07-19 00:13:12 +02:00
Nut.andor
d60c6b3aa8 remove duplicates 2024-07-14 22:46:34 +02:00
Nut.andor
570d9da321 Pull Request #69: remove duplicates 2024-06-22 15:19:50 +02:00
OMGeeky
99f4ab5e6b remove duplicates 2024-06-22 15:13:30 +02:00
18 changed files with 160 additions and 279 deletions

View File

@@ -152,6 +152,12 @@ public final class DebugInterface {
public void onClick(View arg0) {
showToast(mainActivity, "DEBUG: map=" + world.model.currentMaps.map.name , Toast.LENGTH_SHORT);
}
})
,new DebugButton("tim", new OnClickListener() {
@Override
public void onClick(View arg0) {
world.model.worldData.tickWorldTime(10);
}
})
}));
@@ -313,6 +319,13 @@ public final class DebugInterface {
}
})
,new DebugButton("wx", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "wexlow_village", "north", 0, 0);
}
})
,new DebugButton("fey", new OnClickListener() {
@Override
public void onClick(View arg0) {
@@ -345,14 +358,14 @@ public final class DebugInterface {
,new DebugButton("#1", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "waterway11_east", "west", 0, 0);
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "swamp3", "north", 0, 0);
}
})
,new DebugButton("#2", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "laerothtomb1", "north", 0, 0);
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "beekeeper1", "south", 0, 0);
}
})
@@ -360,7 +373,7 @@ public final class DebugInterface {
,new DebugButton("#3", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "mountainlake8", "north", 0, 0);
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "guynmart", "west2", 0, 0);
}
})

View File

@@ -250,7 +250,8 @@ public final class CombatController implements VisualEffectCompletedCallback {
if (!loot.hasItemsOrGold()) {
world.model.currentMaps.map.removeGroundLoot(loot);
} else if (world.model.uiSelections.isInCombat) {
killedMonsterBags.add(loot);
if(!killedMonsterBags.contains(loot))
killedMonsterBags.add(loot);
}
combatActionListeners.onPlayerKilledMonster(killedMonster);

View File

@@ -21,14 +21,23 @@ import com.gpl.rpg.AndorsTrail.util.Coord;
import com.gpl.rpg.AndorsTrail.util.CoordRect;
import com.gpl.rpg.AndorsTrail.util.Size;
import java.util.ArrayList;
import java.util.List;
public final class VisualEffectController {
private static final long EFFECT_UPDATE_INTERVAL = 25;
private int effectCount = 0;
private final ControllerContext controllers;
private final WorldContext world;
private final VisualEffectCollection effectTypes;
private final Handler animationHandler = new Handler();
private final List<VisualEffectAnimation> activeAnimations = new ArrayList<>();
public final VisualEffectFrameListeners visualEffectFrameListeners = new VisualEffectFrameListeners();
private long getEffectUpdateInterval() {
return EFFECT_UPDATE_INTERVAL * controllers.preferences.attackspeed_milliseconds / AndorsTrailPreferences.ATTACKSPEED_DEFAULT_MILLISECONDS;
}
public VisualEffectController(ControllerContext controllers, WorldContext world) {
this.controllers = controllers;
@@ -38,10 +47,42 @@ public final class VisualEffectController {
public void startEffect(Coord position, VisualEffectCollection.VisualEffectID effectID, String displayValue, VisualEffectCompletedCallback callback, int callbackValue) {
++effectCount;
(new VisualEffectAnimation(effectTypes.getVisualEffect(effectID), position, displayValue, callback, callbackValue))
.start();
VisualEffectAnimation animation = new VisualEffectAnimation(effectTypes.getVisualEffect(effectID), position, displayValue, callback, callbackValue);
animation.start();
}
private void startAnimation(VisualEffectAnimation animation) {
activeAnimations.add(animation);
animation.update();
if (activeAnimations.size() == 1) {
animationHandler.postDelayed(animationRunnable, 0);
}
}
private final Runnable animationRunnable = new Runnable() {
@Override
public void run() {
if(!activeAnimations.isEmpty()) {
long updateInterval = getEffectUpdateInterval();
animationHandler.postDelayed(this, updateInterval);
for (int i = 0; i < activeAnimations.size(); i++) {
VisualEffectAnimation animation = activeAnimations.get(i);
animation.durationPassed += updateInterval;
animation.updateFrame();
animation.update();
if (animation.currentFrame >= animation.effect.lastFrame) {
animation.onCompleted();
activeAnimations.remove(i);
effectCount--;
i--;
}
}
visualEffectFrameListeners.onNewAnimationFrames(activeAnimations);
}
}
};
private VisualEffectCollection.VisualEffectID enqueuedEffectID = null;
private int enqueuedEffectValue = 0;
public void enqueueEffect(VisualEffectCollection.VisualEffectID effectID, int displayValue) {
@@ -65,10 +106,9 @@ public final class VisualEffectController {
.start();
}
public final class SpriteMoveAnimation extends Handler implements Runnable {
// private static final int millisecondsPerFrame=25;
public final class SpriteMoveAnimation implements Runnable {
private final Handler handler = new Handler();
private final VisualEffectCompletedCallback callback;
private final int callbackValue;
@@ -82,11 +122,6 @@ public final class VisualEffectController {
@Override
public void run() {
onCompleted();
// update();
// if (System.currentTimeMillis() - actor.vfxStartTime >= duration) {
// } else {
// postDelayed(this, millisecondsPerFrame);
// }
}
public SpriteMoveAnimation(Coord origin, Coord destination, int duration, Actor actor, PredefinedMap map, VisualEffectCompletedCallback callback, int callbackValue) {
@@ -99,11 +134,6 @@ public final class VisualEffectController {
this.destination = destination;
}
// private void update() {
//
// visualEffectFrameListeners.onNewSpriteMoveFrame(this);
// }
private void onCompleted() {
--effectCount;
@@ -111,7 +141,6 @@ public final class VisualEffectController {
if (callback != null) callback.onVisualEffectCompleted(callbackValue);
visualEffectFrameListeners.onSpriteMoveCompleted(this);
}
public void start() {
actor.hasVFXRunning = true;
@@ -120,12 +149,9 @@ public final class VisualEffectController {
visualEffectFrameListeners.onSpriteMoveStarted(this);
if (duration == 0 || !controllers.preferences.enableUiAnimations) onCompleted();
else {
postDelayed(this, duration);
handler.postDelayed(this, duration);
}
}
}
public static final Paint textPaint = new Paint();
@@ -134,41 +160,42 @@ public final class VisualEffectController {
textPaint.setAlpha(255);
textPaint.setTextAlign(Align.CENTER);
}
public final class VisualEffectAnimation extends Handler implements Runnable {
@Override
public void run() {
if (currentFrame >= effect.lastFrame) {
onCompleted();
} else {
postDelayed(this, effect.millisecondPerFrame * controllers.preferences.attackspeed_milliseconds / AndorsTrailPreferences.ATTACKSPEED_DEFAULT_MILLISECONDS);
update();
public final class VisualEffectAnimation {
public int tileID;
public int textYOffset;
public long durationPassed = 0;
private void updateFrame() {
long frameDuration = (long) effect.millisecondPerFrame * controllers.preferences.attackspeed_milliseconds / AndorsTrailPreferences.ATTACKSPEED_DEFAULT_MILLISECONDS;
while (durationPassed > frameDuration) {
currentFrame++;
durationPassed -= frameDuration;
}
}
private void update() {
++currentFrame;
int frame = currentFrame;
int tileID = effect.frameIconIDs[frame];
int textYOffset = -2 * (frame);
if (frame >= beginFadeAtFrame && displayText != null) {
textPaint.setAlpha(255 * (effect.lastFrame - frame) / (effect.lastFrame - beginFadeAtFrame));
if (currentFrame >= effect.lastFrame) {
return;
}
tileID = effect.frameIconIDs[currentFrame];
textYOffset = -2 * (currentFrame);
if (currentFrame >= beginFadeAtFrame && displayText != null) {
textPaint.setAlpha(255 * (effect.lastFrame - currentFrame) / (effect.lastFrame - beginFadeAtFrame));
}
area.topLeft.y = position.y - 1;
visualEffectFrameListeners.onNewAnimationFrame(this, tileID, textYOffset);
}
private void onCompleted() {
--effectCount;
visualEffectFrameListeners.onAnimationCompleted(this);
if (callback != null) callback.onVisualEffectCompleted(callbackValue);
}
public void start() {
if (!controllers.preferences.enableUiAnimations) onCompleted();
else postDelayed(this, 0);
else startAnimation(this);
}
private int currentFrame = 0;
@@ -197,7 +224,7 @@ public final class VisualEffectController {
this.area = new CoordRect(new Coord(position.x - (widthNeededInTiles / 2), position.y - 1), new Size(widthNeededInTiles, 2));
this.beginFadeAtFrame = effect.lastFrame / 2;
}
public Paint getTextPaint(){
return textPaint;
}

View File

@@ -4,8 +4,10 @@ import com.gpl.rpg.AndorsTrail.controller.VisualEffectController.SpriteMoveAnima
import com.gpl.rpg.AndorsTrail.controller.VisualEffectController.VisualEffectAnimation;
import com.gpl.rpg.AndorsTrail.util.CoordRect;
import java.util.List;
public interface VisualEffectFrameListener {
void onNewAnimationFrame(VisualEffectAnimation animation, int tileID, int textYOffset);
void onNewAnimationFrames(List<VisualEffectAnimation> effects);
void onAnimationCompleted(VisualEffectAnimation animation);
void onSpriteMoveStarted(SpriteMoveAnimation animation);
void onNewSpriteMoveFrame(SpriteMoveAnimation animation);

View File

@@ -5,10 +5,12 @@ import com.gpl.rpg.AndorsTrail.controller.VisualEffectController.VisualEffectAni
import com.gpl.rpg.AndorsTrail.util.CoordRect;
import com.gpl.rpg.AndorsTrail.util.ListOfListeners;
import java.util.List;
public final class VisualEffectFrameListeners extends ListOfListeners<VisualEffectFrameListener> implements VisualEffectFrameListener {
private final Function3<VisualEffectFrameListener, VisualEffectAnimation, Integer, Integer> onNewAnimationFrame = new Function3<VisualEffectFrameListener, VisualEffectAnimation, Integer, Integer>() {
@Override public void call(VisualEffectFrameListener listener, VisualEffectAnimation animation, Integer tileID, Integer textYOffset) { listener.onNewAnimationFrame(animation, tileID, textYOffset); }
private final Function1<VisualEffectFrameListener, List<VisualEffectAnimation>> onNewAnimationFrames = new Function1<VisualEffectFrameListener, List<VisualEffectAnimation>>() {
@Override public void call(VisualEffectFrameListener listener, List<VisualEffectAnimation> effects) { listener.onNewAnimationFrames(effects); }
};
private final Function1<VisualEffectFrameListener, VisualEffectAnimation> onAnimationCompleted = new Function1<VisualEffectFrameListener, VisualEffectAnimation>() {
@@ -30,10 +32,10 @@ public final class VisualEffectFrameListeners extends ListOfListeners<VisualEffe
private final Function1<VisualEffectFrameListener, CoordRect> onAsyncAreaUpdate = new Function1<VisualEffectFrameListener, CoordRect>() {
@Override public void call(VisualEffectFrameListener listener, CoordRect area) { listener.onAsyncAreaUpdate(area); }
};
@Override
public void onNewAnimationFrame(VisualEffectAnimation animation, int tileID, int textYOffset) {
callAllListeners(this.onNewAnimationFrame, animation, tileID, textYOffset);
public void onNewAnimationFrames(List<VisualEffectAnimation> effects) {
callAllListeners(this.onNewAnimationFrames, effects);
}
@Override

View File

@@ -387,6 +387,7 @@ public final class ResourceLoader {
loader.prepareTileset(R.drawable.map_border_1, "map_border_1", mapTileSize, sz1x1, mTileSize);
loader.prepareTileset(R.drawable.map_bridge_1, "map_bridge_1", mapTileSize, sz1x1, mTileSize);
loader.prepareTileset(R.drawable.map_bridge_2, "map_bridge_2", mapTileSize, sz1x1, mTileSize);
loader.prepareTileset(R.drawable.map_brightport, "map_brightport", new Size(7, 5), sz1x1, mTileSize);
loader.prepareTileset(R.drawable.map_broken_1, "map_broken_1", mapTileSize, sz1x1, mTileSize);
loader.prepareTileset(R.drawable.map_cavewall_1, "map_cavewall_1", new Size(18, 6), sz1x1, mTileSize);
loader.prepareTileset(R.drawable.map_cavewall_2, "map_cavewall_2", new Size(18, 6), sz1x1, mTileSize);

View File

@@ -8,6 +8,7 @@ import org.xmlpull.v1.XmlPullParserException;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.model.map.MapCollection;
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment;
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment.NamedWorldMapArea;
@@ -24,11 +25,13 @@ public final class WorldMapParser {
}
private static void read(XmlResourceParser xrp, final MapCollection maps, final TranslationLoader translationLoader) {
String s = "";
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) L.log("WorldMapParser:");
try {
int eventType;
while ((eventType = xrp.next()) != XmlResourceParser.END_DOCUMENT) {
if (eventType == XmlResourceParser.START_TAG) {
String s = xrp.getName();
s = xrp.getName();
if (s.equals("segment")) {
WorldMapSegment segment = parseSegment(xrp, maps, translationLoader);
maps.worldMapSegments.put(segment.name, segment);
@@ -37,7 +40,7 @@ public final class WorldMapParser {
}
xrp.close();
} catch (Exception e) {
L.log("Error reading worldmap: " + e.toString());
L.log("Error reading worldmap: " + s + " " + e.toString());
}
}
@@ -46,11 +49,13 @@ public final class WorldMapParser {
final WorldMapSegment segment = new WorldMapSegment(segmentName);
final ArrayList<Pair<String, String>> mapsInNamedAreas = new ArrayList<Pair<String,String>>();
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) L.log("segment: " + segmentName);
XmlResourceParserUtils.readCurrentTagUntilEnd(xrp, new XmlResourceParserUtils.TagHandler() {
@Override
public void handleTag(XmlResourceParser xrp, String tagName) throws XmlPullParserException, IOException {
if (tagName.equals("map")) {
String mapName = xrp.getAttributeValue(null, "id");
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) L.log(" map: " + mapName);
if (maps.findPredefinedMap(mapName) == null) return;
Coord mapPosition = new Coord(
xrp.getAttributeIntValue(null, "x", -1),
@@ -65,6 +70,7 @@ public final class WorldMapParser {
String id = xrp.getAttributeValue(null, "id");
String name = translationLoader.translateWorldmapLocation(xrp.getAttributeValue(null, "name"));
String type = xrp.getAttributeValue(null, "type");
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) L.log(" namedarea: id=" + id + " name=" + name + " type=" + type);
segment.namedAreas.put(id, new NamedWorldMapArea(id, name, type));
}
}

View File

@@ -30,6 +30,18 @@ public final class CoordRect {
return true;
}
public static CoordRect union(CoordRect r1, CoordRect r2) {
int left = Math.min(r1.topLeft.x, r2.topLeft.x);
int top = Math.min(r1.topLeft.y, r2.topLeft.y);
int right = Math.max(r1.topLeft.x + r1.size.width, r2.topLeft.x + r2.size.width);
int bottom = Math.max(r1.topLeft.y + r1.size.height, r2.topLeft.y + r2.size.height);
int width = right - left;
int height = bottom - top;
return new CoordRect(new Coord(left, top), new Size(width, height));
}
/*
public static boolean contains(final int x, final int y, final Size size, final Coord p) {
if (p.x < x) return false;

View File

@@ -1,6 +1,7 @@
package com.gpl.rpg.AndorsTrail.view;
import java.lang.ref.WeakReference;
import java.util.List;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
@@ -158,8 +159,8 @@ public final class MainView extends SurfaceView
// this.surfaceSize = new Size(w, h);
this.surfaceSize = new Size((int) (getWidth() / scale), (int) (getHeight() / scale));
this.screenSizeTileCount = new Size(
(int) Math.floor(getWidth() / scaledTileSize)
,(int) Math.floor(getHeight() / scaledTileSize)
getWidth() / scaledTileSize
,getHeight() / scaledTileSize
);
if (sh.getSurfaceFrame().right != surfaceSize.width || sh.getSurfaceFrame().bottom != surfaceSize.height) {
@@ -226,28 +227,28 @@ public final class MainView extends SurfaceView
if (scrolling && why != RedrawAllDebugReason.MapScrolling) return;
if (!scrolling && movingSprites > 0 && why != RedrawAllDebugReason.SpriteMoved) return;
}
redrawArea_(mapViewArea, null, 0, 0);
redrawArea_(mapViewArea, null);
}
private void redrawTile(final Coord p, RedrawTileDebugReason why) {
if (scrolling) return;
p1x1.topLeft.set(p);
redrawArea_(p1x1, null, 0, 0);
redrawArea_(p1x1, null);
}
private void redrawArea(final CoordRect area, RedrawAreaDebugReason why) {
if (scrolling) return;
redrawArea_(area, null, 0, 0);
redrawArea_(area, null);
}
private void redrawArea_(CoordRect area, final VisualEffectAnimation effect, int tileID, int textYOffset) {
private void redrawArea_(CoordRect area, final List<VisualEffectAnimation> effects) {
if (!hasSurface) return;
if (!currentMap.intersects(area)) return;
if (!mapViewArea.intersects(area)) return;
if (shouldRedrawEverything()) {
area = mapViewArea;
}
calculateRedrawRect(area);
redrawRect.intersect(redrawClip);
Canvas c = null;
@@ -263,7 +264,7 @@ public final class MainView extends SurfaceView
if (area == mapViewArea) {
area = adaptAreaToScrolling(area);
}
synchronized (holder) { synchronized (tiles) {
int xScroll = 0;
int yScroll = 0;
@@ -275,32 +276,25 @@ public final class MainView extends SurfaceView
}
c.clipRect(redrawClip);
c.translate(screenOffset.x + xScroll, screenOffset.y + yScroll);
// c.scale(scale, scale);
doDrawRect(c, area);
if (effect != null) {
drawFromMapPosition(c, area, effect.position, tileID);
if (effect.displayText != null) {
drawEffectText(c, area, effect, textYOffset, effect.getTextPaint());
}
}
// c.drawRect(new Rect(
// (area.topLeft.x - mapViewArea.topLeft.x) * tileSize,
// (area.topLeft.y - mapViewArea.topLeft.y) * tileSize,
// (area.topLeft.x - mapViewArea.topLeft.x + area.size.width) * tileSize - 1,
// (area.topLeft.y - mapViewArea.topLeft.y + area.size.height) * tileSize - 1),
// redrawHighlight);
// if (touchedTile != null) c.drawRect(new Rect(
// (touchedTile.x - mapViewArea.topLeft.x) * tileSize,
// (touchedTile.y - mapViewArea.topLeft.y) * tileSize,
// (touchedTile.x - mapViewArea.topLeft.x + 1) * tileSize - 1,
// (touchedTile.y - mapViewArea.topLeft.y + 1) * tileSize - 1),
// touchHighlight);
renderEffects(c, effects);
} }
} finally {
if (c != null) holder.unlockCanvasAndPost(c);
}
}
private void renderEffects(Canvas canvas ,List<VisualEffectAnimation> effects) {
if(effects == null) return;
for (VisualEffectAnimation effect : effects) {
int tileID = effect.tileID;
int textYOffset = effect.textYOffset;
drawFromMapPosition(canvas, effect.area, effect.position, tileID);
if (effect.displayText != null) {
drawEffectText(canvas, effect.area, effect, textYOffset, effect.getTextPaint());
}
}
}
private boolean isRedrawRectWholeScreen(Rect redrawRect) {
// if (redrawRect.width() < mapViewArea.size.width * scaledTileSize) return false;
@@ -317,11 +311,21 @@ public final class MainView extends SurfaceView
return true;
}
private final Rect redrawRect = new Rect();
private void redrawAreaWithEffect(final VisualEffectAnimation effect, int tileID, int textYOffset) {
CoordRect area = effect.area;
// if (shouldRedrawEverythingForVisualEffect()) area = mapViewArea;
redrawArea_(area, effect, tileID, textYOffset);
private void redrawAreaWithEffect(List<VisualEffectAnimation> effects) {
CoordRect area = null;
for (int i = 0; i < effects.size(); i++) {
VisualEffectAnimation effect = effects.get(i);
if (area == null) {
area = effect.area;
} else {
area = CoordRect.union(area, effect.area);
}
}
if (area != null) {
redrawArea_(area, effects);
}
}
private void clearCanvas() {
if (!hasSurface) return;
Canvas c = null;
@@ -794,8 +798,8 @@ public final class MainView extends SurfaceView
}
@Override
public void onNewAnimationFrame(VisualEffectAnimation animation, int tileID, int textYOffset) {
redrawAreaWithEffect(animation, tileID, textYOffset);
public void onNewAnimationFrames(List<VisualEffectAnimation> effects) {
redrawAreaWithEffect(effects);
}
@Override

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -3468,106 +3468,6 @@
}
]
},
{
"id":"captive_girl_selector",
"replies":[
{
"text":"N",
"nextPhraseID":"captive_girl_10",
"requires":[
{
"requireType":"questProgress",
"requireID":"wicked_witch",
"value":90,
"negate":true
},
{
"requireType":"questProgress",
"requireID":"wicked_witch",
"value":95,
"negate":true
},
{
"requireType":"questProgress",
"requireID":"wicked_witch",
"value":96,
"negate":true
}
]
},
{
"text":"N",
"nextPhraseID":"captive_girl_50",
"requires":[
{
"requireType":"questLatestProgress",
"requireID":"wicked_witch",
"value":90
}
]
},
{
"text":"N",
"nextPhraseID":"captive_girl_75",
"requires":[
{
"requireType":"questProgress",
"requireID":"wicked_witch",
"value":95
}
]
},
{
"text":"N",
"nextPhraseID":"captive_girl_31"
}
]
},
{
"id":"captive_girl_65",
"message":"Ah, YES. I remember her saying that an \"undead\" friend of her's east of here taught her how to make them.",
"replies":[
{
"text":"OK. Stay here. I will be back with more of them.",
"nextPhraseID":"X"
}
],
"rewards":[
{
"rewardType":"questProgress",
"rewardID":"wicked_witch",
"value":90
}
]
},
{
"id":"wicked_witch_reveal_girl_selector",
"replies":[
{
"text":"N",
"nextPhraseID":"wicked_witch_reveal_girl_spawn",
"requires":[
{
"requireType":"timerElapsed",
"requireID":"wicked_witch_despawn_timer",
"value":72
},
{
"requireType":"questProgress",
"requireID":"wicked_witch",
"value":96,
"negate":true
},
{
"requireType":"questProgress",
"requireID":"wicked_witch",
"value":95,
"negate":true
}
]
}
]
},
{
"id":"fix_stn_skeletons_10",
"message":"What a beautiful view from here.",

View File

@@ -11819,7 +11819,8 @@
"message":"No, unfortunately not. Maybe try my colleague in Fallhaven?",
"replies":[
{
"text":"Sigh - well, thanks."
"text":"Sigh - well, thanks.",
"nextPhraseID":"X"
}
]
}

View File

@@ -925,31 +925,5 @@
}
}
]
},
{
"id":"ratdom_618_loot1",
"items":[
{
"itemID":"gold",
"chance":"100",
"quantity":{
"min":200,
"max":400
}
}
]
},
{
"id":"ratdom_618_loot2",
"items":[
{
"itemID":"ratdom_parchment",
"chance":"100",
"quantity":{
"min":1,
"max":1
}
}
]
}
]

View File

@@ -749,27 +749,6 @@
}
]
},
{
"id":"gapfillerhole_drop",
"items":[
{
"itemID":"gold",
"chance":"100",
"quantity":{
"min":10,
"max":100
}
},
{
"itemID":"gem1",
"chance":"100",
"quantity":{
"min":1,
"max":2
}
}
]
},
{
"id":"lava_queen_dl",
"items":[

View File

@@ -34,32 +34,6 @@
}
}
},
{
"id": "shadow_slayer",
"iconID": "items_weapons:60",
"name": "Shadow of the slayer",
"category": "lsword",
"displaytype": "extraordinary",
"hasManualPrice": 1,
"baseMarketCost": 0,
"equipEffect": {
"increaseMaxAP": 2,
"increaseAttackCost": 7,
"increaseAttackChance": 25,
"increaseCriticalSkill": 10,
"setCriticalMultiplier": 2,
"increaseAttackDamage": {
"min": 5,
"max": 9
}
},
"killEffect": {
"increaseCurrentHP": {
"min": 1,
"max": 1
}
}
},
{
"id":"choatic_potion",
"iconID":"items_consumables:62",

View File

@@ -7,14 +7,6 @@
"hasManualPrice": 1,
"baseMarketCost": 6
},
{
"id": "bat_wing",
"iconID": "items_misc:46",
"name": "Bat wing",
"category": "animal",
"hasManualPrice": 1,
"baseMarketCost": 2
},
{
"id": "feather",
"iconID": "items_misc:16",
@@ -39,14 +31,6 @@
"hasManualPrice": 1,
"baseMarketCost": 1
},
{
"id": "gem6",
"iconID": "items_misc:4",
"name": "Shimmering gem",
"category": "gem",
"hasManualPrice": 1,
"baseMarketCost": 26
},
{
"id": "gem8",
"iconID": "actorconditions_1:50",

View File

@@ -59,6 +59,7 @@
• Draze<br/>
• Antison<br/>
• Raphi<br/>
• Dimitri Vellemans (Odin)<br/>
<br/>
<b>Translations</b><br/>
• Russian translation by Dreamer..., e.solodookhin, shell.andor, konstmih, istasman, Aleksey Kabanov, Alexander Zubok, Paul Sulemenkov, dromoz, avatar232 and Mingun<br/>