Compare commits

...

30 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
OMGeeky
f6d3cd59c0 Reduce the Item use cost penalty like the move and attack cost penalties with the heavy armor skill 2024-08-15 20:18:57 +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
d4a8ab316e added rope 2024-07-07 23:19:07 +02:00
Nut.andor
570d9da321 Pull Request #69: remove duplicates 2024-06-22 15:19:50 +02:00
Nut.andor
bf13ac460d Debug buttons 2024-06-19 23:33:35 +02:00
Nut.andor
c4eb2b2d3a Debug buttons 2024-06-19 23:24:32 +02:00
20 changed files with 165 additions and 140 deletions

View File

@@ -24,7 +24,7 @@ public final class AndorsTrailApplication extends Application {
public static final boolean DEVELOPMENT_DEBUGRESOURCES = false;
public static final boolean DEVELOPMENT_FORCE_STARTNEWGAME = false;
public static final boolean DEVELOPMENT_FORCE_CONTINUEGAME = false;
public static final boolean DEVELOPMENT_DEBUGBUTTONS = false;
public static final boolean DEVELOPMENT_DEBUGBUTTONS = true;
public static final boolean DEVELOPMENT_FASTSPEED = false;
public static final boolean DEVELOPMENT_VALIDATEDATA = true;
public static final boolean DEVELOPMENT_DEBUGMESSAGES = true;

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

@@ -196,7 +196,7 @@ public final class SkillInfoActivity extends AndorsTrailBaseActivity {
case armorProficiencyShield: return res.getString(R.string.skill_longdescription_armor_prof_shield, SkillCollection.PER_SKILLPOINT_INCREASE_SHIELD_PROF_DR);
case armorProficiencyUnarmored: return res.getString(R.string.skill_longdescription_armor_prof_unarmored, SkillCollection.PER_SKILLPOINT_INCREASE_UNARMORED_BC);
case armorProficiencyLight: return res.getString(R.string.skill_longdescription_armor_prof_light, SkillCollection.PER_SKILLPOINT_INCREASE_LIGHT_ARMOR_BC_PERCENT);
case armorProficiencyHeavy: return res.getString(R.string.skill_longdescription_armor_prof_heavy, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_BC_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_MOVECOST_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_ATKCOST_PERCENT);
case armorProficiencyHeavy: return res.getString(R.string.skill_longdescription_armor_prof_heavy, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_BC_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_MOVECOST_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_ATKCOST_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_USECOST_PERCENT);
case fightstyleDualWield: return res.getString(R.string.skill_longdescription_fightstyle_dualwield, SkillCollection.DUALWIELD_EFFICIENCY_LEVEL0, SkillCollection.DUALWIELD_EFFICIENCY_LEVEL1, SkillCollection.DUALWIELD_LEVEL1_OFFHAND_AP_COST_PERCENT, SkillCollection.DUALWIELD_EFFICIENCY_LEVEL2);
case fightstyle2hand: return res.getString(R.string.skill_longdescription_fightstyle_2hand, SkillCollection.PER_SKILLPOINT_INCREASE_FIGHTSTYLE_2HAND_DMG_PERCENT);
case fightstyleWeaponShield: return res.getString(R.string.skill_longdescription_fightstyle_weapon_shield, SkillCollection.PER_SKILLPOINT_INCREASE_FIGHTSTYLE_WEAPON_AC_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_FIGHTSTYLE_SHIELD_BC_PERCENT);

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

@@ -253,6 +253,7 @@ public final class SkillController {
addPercentBlockChance(player, itemType, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_BC_PERCENT * skillLevelHeavyArmor, 0);
playerTraits.moveCost -= getPercentage(itemType.effects_equip.stats.increaseMoveCost, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_MOVECOST_PERCENT * skillLevelHeavyArmor, 0);
playerTraits.attackCost -= getPercentage(itemType.effects_equip.stats.increaseAttackCost, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_ATKCOST_PERCENT * skillLevelHeavyArmor, 0);
playerTraits.useItemCost -= getPercentage(itemType.effects_equip.stats.increaseUseItemCost, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_USECOST_PERCENT * skillLevelHeavyArmor, 0);
}
}
}

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

@@ -112,6 +112,7 @@ public final class SkillCollection {
public static final int PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_BC_PERCENT = 20;
public static final int PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_MOVECOST_PERCENT = 25;
public static final int PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_ATKCOST_PERCENT = 25;
public static final int PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_USECOST_PERCENT = 25;
public static final int PER_SKILLPOINT_INCREASE_FIGHTSTYLE_2HAND_DMG_PERCENT = 30;
public static final int PER_SKILLPOINT_INCREASE_SPECIALIZATION_2HAND_DMG_PERCENT = 50;
public static final int PER_SKILLPOINT_INCREASE_SPECIALIZATION_2HAND_AC_PERCENT = 20;

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: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

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

@@ -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/>

View File

@@ -684,7 +684,7 @@
<string name="skill_longdescription_armor_prof_shield">Increase damage resistance by %1$d per skill level while having a shield or parrying weapon equipped.</string>
<string name="skill_longdescription_armor_prof_unarmored">While fighting without having any piece of armor equipped, gain %1$d block chance per skill level. Items made of cloth are not considered as being armor.</string>
<string name="skill_longdescription_armor_prof_light">For every skill level, increases the block chance of every piece of light armor being worn by %1$d %% of their original block chances. Light armors include leather, light metal and hide armors.</string>
<string name="skill_longdescription_armor_prof_heavy">For every skill level, increases the block chance of every piece of heavy armor being worn by %1$d %% of their original block chances. Pieces of heavy armor have their movement penalties reduced by %2$d %% per skill level, and their attack speed penalties reduced by %3$d %% per skill level. Heavy armors include metal armors, chain mail and plate mail.</string>
<string name="skill_longdescription_armor_prof_heavy">For every skill level, increases the block chance of every piece of heavy armor being worn by %1$d %% of their original block chances. Pieces of heavy armor have their movement penalties reduced by %2$d %% per skill level, their attack speed penalties reduced by %3$d %% per skill level, and their item use cost penalties reduced by %4$d %% per skill level. Heavy armors include metal armors, chain mail and plate mail.</string>
<string name="skill_longdescription_fightstyle_dualwield">"Gives benefits when fighting with two weapons at the same time, one in the main hand and one in the off-hand.
Without this skill, only %1$d %% of a weapon\'s qualities may be used when equipped in the off-hand. This includes attack chance, critical skill, damage potential and block chance. Without this skill, attack cost (AP cost) of making an attack is the sum of the attack cost of the main weapon and that of the weapon used in the off-hand. The lower of both damage modifiers will be used.