]> www.infradead.org Git - users/mchehab/andors-trail.git/commitdiff
Initial implementation of monster classes. Will be used for skills, resistances and...
authoroskar.wiksten <oskar.wiksten@08aca716-68be-ccc6-4d58-36f5abd142ac>
Fri, 6 Jan 2012 22:48:16 +0000 (22:48 +0000)
committeroskar.wiksten <oskar.wiksten@08aca716-68be-ccc6-4d58-36f5abd142ac>
Fri, 6 Jan 2012 22:48:16 +0000 (22:48 +0000)
Added splatter images when the player kills monsters, that will stay on the map for 20 seconds after a monster has been killed. Splatter images are however currently disabled, since the splatter type should be determined from the monster class (which is not yet fully implemented).

git-svn-id: https://andors-trail.googlecode.com/svn/trunk@214 08aca716-68be-ccc6-4d58-36f5abd142ac

13 files changed:
AndorsTrail/res/drawable/ui_splatters1.png [new file with mode: 0644]
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/VisualEffectController.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/Monster.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/actor/MonsterType.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/PredefinedMap.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/TMXMapTranslator.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/ResourceLoader.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/MonsterTypeParser.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/MainView.java

diff --git a/AndorsTrail/res/drawable/ui_splatters1.png b/AndorsTrail/res/drawable/ui_splatters1.png
new file mode 100644 (file)
index 0000000..9ca7df3
Binary files /dev/null and b/AndorsTrail/res/drawable/ui_splatters1.png differ
index 4abf801c07ba079c2e4e919342c37dd0a57f2d67..1d25b4f669fe2c11980a1b0ef04493581b89a20a 100644 (file)
@@ -233,6 +233,7 @@ public final class CombatController implements VisualEffectCompletedCallback {
                killedMonster.createLoot(loot, player);
                
                model.currentMap.remove(killedMonster);
+               VisualEffectController.addSplatter(model.currentMap, killedMonster);
                
                player.ap.add(player.getSkillLevel(SkillCollection.SKILL_CLEAVE) * SkillCollection.PER_SKILLPOINT_INCREASE_CLEAVE_AP, false);
                player.health.add(player.getSkillLevel(SkillCollection.SKILL_EATER) * SkillCollection.PER_SKILLPOINT_INCREASE_EATER_HEALTH, false);
index 96172910b62b6659817e46bb8eec6a83efa68274..d82d1e4bb2b0ce5f541a2e3b287a72bea8b01e91 100644 (file)
@@ -73,5 +73,6 @@ public final class GameRoundController implements TimedMessageTask.Callback {
        private void onNewTick() {
                view.controller.moveAndSpawnMonsters();
                view.monsterMovementController.attackWithAgressiveMonsters();
+               VisualEffectController.updateSplatters(model.currentMap);
        }
 }
index bdafddb523efd7eed4561be6e1f57e2956527dc7..9dc1399c5494c7b7e2cd12066ef8d1598c62fecc 100644 (file)
@@ -85,6 +85,7 @@ public final class MovementController implements TimedMessageTask.Callback {
                else playerVisitsMap(world, newMap);
                
                refreshMonsterAggressiveness(newMap, model.player);
+               VisualEffectController.updateSplatters(newMap);
        }
     
        private static void playerVisitsMapFirstTime(final WorldContext world, PredefinedMap m) {
index 393c45929fc17672c74979a87e471cf8241c61a1..38a926d8c66a51cb2b18f779dcffac6f800bd450 100644 (file)
@@ -8,6 +8,10 @@ import android.os.Handler;
 import com.gpl.rpg.AndorsTrail.VisualEffectCollection;
 import com.gpl.rpg.AndorsTrail.VisualEffectCollection.VisualEffect;
 import com.gpl.rpg.AndorsTrail.context.WorldContext;
+import com.gpl.rpg.AndorsTrail.model.actor.Monster;
+import com.gpl.rpg.AndorsTrail.model.actor.MonsterType;
+import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
+import com.gpl.rpg.AndorsTrail.resource.tiles.TileManager;
 import com.gpl.rpg.AndorsTrail.util.Coord;
 import com.gpl.rpg.AndorsTrail.util.CoordRect;
 import com.gpl.rpg.AndorsTrail.util.Size;
@@ -99,4 +103,61 @@ public final class VisualEffectController {
        public boolean isRunningVisualEffect() {
                return effectCount > 0;
        }
+       
+
+       public static final class BloodSplatter {
+               public static final int TYPE_RED = 0;
+               public static final int TYPE_BROWN = 2;
+               public static final int TYPE_WHITE = 3;
+               public final long removeAfter;
+               public final long reduceIconAfter;
+               public final Coord position;
+               public int iconID;
+               public boolean updated = false;
+               public BloodSplatter(int iconID, Coord position) {
+                       this.iconID = iconID;
+                       this.position = position;
+                       long now = System.currentTimeMillis();
+                       removeAfter = now + 20000;
+                       reduceIconAfter = now + 10000;
+               }
+       }
+       
+       public static void updateSplatters(PredefinedMap map) {
+               long now = System.currentTimeMillis();
+               for (int i = map.splatters.size() - 1; i >= 0; --i) {
+                       BloodSplatter b = map.splatters.get(i);
+                       if (b.removeAfter <= now) map.splatters.remove(i);
+                       else if (!b.updated && b.reduceIconAfter <= now) {
+                               b.updated = true;
+                               b.iconID++;
+                       }
+               }
+       }
+       
+       public static void addSplatter(PredefinedMap map, Monster m) {
+               int iconID = getSplatterIconFromMonsterClass(m.monsterClass);
+               if (iconID > 0) map.splatters.add(new BloodSplatter(iconID, m.position));
+       }
+       
+       private static int getSplatterIconFromMonsterClass(int monsterClass) {
+               return -1;
+               /*
+               switch (monsterClass) {
+               case MonsterType.MONSTERCLASS_INSECT: 
+               case MonsterType.MONSTERCLASS_UNDEAD: 
+               case MonsterType.MONSTERCLASS_REPTILE: 
+                       return TileManager.iconID_splatter_brown_1a + Constants.rnd.nextInt(2) * 2;
+               case MonsterType.MONSTERCLASS_HUMANOID:
+               case MonsterType.MONSTERCLASS_ANIMAL:
+               case MonsterType.MONSTERCLASS_GIANT:
+                       return TileManager.iconID_splatter_red_1a + Constants.rnd.nextInt(2) * 2;
+               case MonsterType.MONSTERCLASS_DEMON:
+               case MonsterType.MONSTERCLASS_CONSTRUCT:
+                       return TileManager.iconID_splatter_white_1a;
+               default:
+                       return -1;
+               }
+               */
+       }
 }
index 7c95758e7a3e29d4fd62d1fe7518d02fa173788b..24d3cac7d29a8980b6f5e157345ec07c65dbc937 100644 (file)
@@ -25,6 +25,7 @@ public final class Monster extends Actor {
        public final int exp;
        public final DropList dropList;
        public final String faction;
+       public final int monsterClass;
        
        public Monster(MonsterType monsterType, Coord position) {
                super(monsterType, false);
@@ -36,6 +37,7 @@ public final class Monster extends Actor {
                this.exp = monsterType.exp;
                this.dropList = monsterType.dropList;
                this.faction = monsterType.faction;
+               this.monsterClass = monsterType.monsterClass;
        }
 
        public void createLoot(Loot container, Player player) {
@@ -75,6 +77,7 @@ public final class Monster extends Actor {
                this.dropList = monsterType.dropList;
                this.forceAggressive = src.readBoolean();
                this.faction = monsterType.faction;
+               this.monsterClass = monsterType.monsterClass;
        }
 
        private static Monster readFromParcel_pre_v0610(DataInputStream src, int fileversion, MonsterType monsterType) throws IOException {
index f340a31bcaefc3dddd8792066505fc564ce9d633..c28ee5b61a6fdc0bd4b2e968c496cc180dbdf9d9 100644 (file)
@@ -6,13 +6,23 @@ import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
 import com.gpl.rpg.AndorsTrail.util.Size;
 
 public final class MonsterType extends ActorTraits {
+       public static final int MONSTERCLASS_HUMANOID = 0;
+       public static final int MONSTERCLASS_INSECT = 1;
+       public static final int MONSTERCLASS_DEMON = 2;
+       public static final int MONSTERCLASS_CONSTRUCT = 3;
+       public static final int MONSTERCLASS_ANIMAL = 4;
+       public static final int MONSTERCLASS_GIANT = 5;
+       public static final int MONSTERCLASS_UNDEAD = 6;
+       public static final int MONSTERCLASS_REPTILE = 7;
+       
        public final String id;
        public final String spawnGroup;
        public final int exp;
        public final DropList dropList;
        public final String phraseID;
-       public boolean isRespawnable = true;
+       public final boolean isRespawnable;
        public final String faction;
+       public final int monsterClass;
 
        public MonsterType(
                        String id, 
@@ -28,7 +38,9 @@ public final class MonsterType extends ActorTraits {
                        int exp, 
                        DropList dropList, 
                        String phraseID,
-                       String faction) {
+                       boolean isRespawnable,
+                       String faction,
+                       int monsterClass) {
                super(iconID, tileSize, baseCombatTraits, moveCost, onHitEffects == null ? null : new ItemTraits_OnUse[] { onHitEffects });
                this.id = id;
                this.spawnGroup = spawnGroup;
@@ -40,5 +52,7 @@ public final class MonsterType extends ActorTraits {
                this.dropList = dropList;
                this.phraseID = phraseID;
                this.faction = faction;
+               this.isRespawnable = isRespawnable;
+               this.monsterClass = monsterClass;
        }
 }
index 599df6bc5655aa3ed526effebeffe1e6c9450bf2..ce5c68530dc97286a1b9903cc689e6f552119e39 100644 (file)
@@ -8,6 +8,7 @@ import java.util.ArrayList;
 import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
 import com.gpl.rpg.AndorsTrail.context.WorldContext;
 import com.gpl.rpg.AndorsTrail.controller.Constants;
+import com.gpl.rpg.AndorsTrail.controller.VisualEffectController.BloodSplatter;
 import com.gpl.rpg.AndorsTrail.model.actor.Monster;
 import com.gpl.rpg.AndorsTrail.model.actor.MonsterType;
 import com.gpl.rpg.AndorsTrail.model.item.ItemType;
@@ -30,6 +31,7 @@ public final class PredefinedMap {
        public long lastVisitTime = VISIT_RESET;
 
        public final boolean[][] isWalkable;
+       public final ArrayList<BloodSplatter> splatters = new ArrayList<BloodSplatter>();
        
        public PredefinedMap(int xmlResourceId, String name, Size size, boolean[][] isWalkable, MapObject[] eventObjects, MonsterSpawnArea[] spawnAreas, boolean hasFOW) {
                this.xmlResourceId = xmlResourceId;
@@ -206,6 +208,7 @@ public final class PredefinedMap {
                for(MonsterSpawnArea a : spawnAreas) {
                        a.reset();
                }
+               splatters.clear();
                visited = false;
                lastVisitTime = VISIT_RESET;
        }
@@ -225,6 +228,7 @@ public final class PredefinedMap {
                for(MonsterSpawnArea a : spawnAreas) {
                        if (!a.isUnique) a.reset();
                }
+               splatters.clear();
                lastVisitTime = VISIT_RESET;
        }
 
index bb192bbe2c342d3bc3f76ad360c223fbbefb2f66..b15ab0d83ecef77179dc7ad5f661a15d138ca9bc 100644 (file)
@@ -142,7 +142,6 @@ public final class TMXMapTranslator {
                                                String[] monsterTypeIDs = new String[types.size()];
                                                for (int i = 0; i < monsterTypeIDs.length; ++i) {
                                                        monsterTypeIDs[i] = types.get(i).id;
-                                                       if (isUnique) types.get(i).isRespawnable = false;
                                                }
                                                MonsterSpawnArea area = new MonsterSpawnArea(
                                                                position
index 0374f690a359b7a21b8deb02c8f451c11363517c..fae8bcf9b844884d1f451352ff99984844c2797c 100644 (file)
@@ -49,15 +49,19 @@ public final class ResourceLoader {
         
         // ========================================================================
         // Load various ui icons
-        /*tiles.iconID_CHAR_HERO = */loader.prepareTileID(R.drawable.char_hero, 0);
-        /*tiles.iconID_selection_red = */loader.prepareTileID(R.drawable.ui_selections, 0);
-        /*tiles.iconID_selection_yellow = */loader.prepareTileID(R.drawable.ui_selections, 1);
-        /*tiles.iconID_groundbag = */loader.prepareTileID(R.drawable.ui_icon_equipment, 0);
-       /*tiles.iconID_boxopened = */loader.prepareTileID(R.drawable.ui_quickslots, 1);
-        /*tiles.iconID_boxclosed = */loader.prepareTileID(R.drawable.ui_quickslots, 0);
-        /*tiles.iconID_selection_blue = */loader.prepareTileID(R.drawable.ui_selections, 2);
-        /*tiles.iconID_selection_purple = */loader.prepareTileID(R.drawable.ui_selections, 3);
-        /*tiles.iconID_selection_green = */loader.prepareTileID(R.drawable.ui_selections, 4);
+        /*TileManager.iconID_CHAR_HERO = */loader.prepareTileID(R.drawable.char_hero, 0);
+        /*TileManager.iconID_selection_red = */loader.prepareTileID(R.drawable.ui_selections, 0);
+        /*TileManager.iconID_selection_yellow = */loader.prepareTileID(R.drawable.ui_selections, 1);
+        /*TileManager.iconID_groundbag = */loader.prepareTileID(R.drawable.ui_icon_equipment, 0);
+       /*TileManager.iconID_boxopened = */loader.prepareTileID(R.drawable.ui_quickslots, 1);
+        /*TileManager.iconID_boxclosed = */loader.prepareTileID(R.drawable.ui_quickslots, 0);
+        /*TileManager.iconID_selection_blue = */loader.prepareTileID(R.drawable.ui_selections, 2);
+        /*TileManager.iconID_selection_purple = */loader.prepareTileID(R.drawable.ui_selections, 3);
+        /*TileManager.iconID_selection_green = */loader.prepareTileID(R.drawable.ui_selections, 4);
+        for(int i = 0; i < 5; ++i) {
+               loader.prepareTileID(R.drawable.ui_splatters1, i);
+            loader.prepareTileID(R.drawable.ui_splatters1, i+8);
+        }
         
         
         // ========================================================================
@@ -181,6 +185,7 @@ public final class ResourceLoader {
         loader.prepareTileset(R.drawable.ui_selections, "ui_selections", new Size(5, 1), defaultTileSize);
         loader.prepareTileset(R.drawable.ui_quickslots, "ui_quickslots", new Size(2, 1), defaultTileSize);
         loader.prepareTileset(R.drawable.ui_icon_equipment, "ui_icon_equipment", src_sz1x1, defaultTileSize);
+        loader.prepareTileset(R.drawable.ui_splatters1, "ui_splatters1", new Size(8, 2), defaultTileSize);
         
         loader.prepareTileset(R.drawable.actorconditions_1, "actorconditions_1", new Size(14, 8), defaultTileSize);
         loader.prepareTileset(R.drawable.actorconditions_2, "actorconditions_2", new Size(3, 1), defaultTileSize);
index e2fc2bcf81d766a67d102a5aa0e8d9a084c48443..9b69c898d5df2972a3b13a34400dc7ab2aa33e54 100644 (file)
@@ -33,6 +33,9 @@ public final class MonsterTypeParser extends ResourceParserFor<MonsterType> {
                final CombatTraits combatTraits = ResourceParserUtils.parseCombatTraits(parts, 8);
                final ItemTraits_OnUse hitEffect = itemTraitsParser.parseItemTraits_OnUse(parts, 18, true);
                final int exp = getExpectedMonsterExperience(combatTraits, hitEffect, maxHP, maxAP);
+               int monsterClass = MonsterType.MONSTERCLASS_HUMANOID;
+               if (parts[1].contains("insect")) monsterClass = MonsterType.MONSTERCLASS_INSECT; //TODO: Should be read from resource file.
+               
                return new Pair<String, MonsterType>(monsterTypeId, new MonsterType(
                        monsterTypeId
                        , parts[2]                                                                              // Name
@@ -47,7 +50,9 @@ public final class MonsterTypeParser extends ResourceParserFor<MonsterType> {
                        , exp                                                                                   // Exp
                        , droplists.getDropList(parts[16])                              // Droplist
                        , ResourceParserUtils.parseNullableString(parts[17]) // PhraseID
+                       , true                                                                                  // isRespawnable
                        , null                                                                                  // Faction
+                       , monsterClass                          // Class
                ));
        }
        
index 820df625c6cc9a44d589e16457598e301df4d518..f0a4331f02e5abc34ca18cf98e05306d193cbc6b 100644 (file)
@@ -41,6 +41,17 @@ public final class TileManager {
        public static final int iconID_selection_purple = 8;
        public static final int iconID_selection_green = 9;
 
+       public static final int iconID_splatter_red_1a = 10;
+       public static final int iconID_splatter_red_1b = 11;
+       public static final int iconID_splatter_red_2a = 12;
+       public static final int iconID_splatter_red_2b = 13;
+       public static final int iconID_splatter_brown_1a = 14;
+       public static final int iconID_splatter_brown_1b = 15;
+       public static final int iconID_splatter_brown_2a = 16;
+       public static final int iconID_splatter_brown_2b = 17;
+       public static final int iconID_splatter_white_1a = 18;
+       public static final int iconID_splatter_white_1b = 19;
+       
     private float density;
        public int tileSize;
 
@@ -49,7 +60,7 @@ public final class TileManager {
 
     
     public final TileCache tileCache = new TileCache();
-       public final TileCollection preloadedTiles = new TileCollection(74);
+       public final TileCollection preloadedTiles = new TileCollection(84);
        public TileCollection currentMapTiles;
        public TileCollection adjacentMapTiles;
        private final HashSet<Integer> preloadedTileIDs = new HashSet<Integer>();
index a7ca1c1237094c3578ad473ed85ae66659caca0f..26e8e911d239d230f6b3772e66c057ef1cedce4a 100644 (file)
@@ -5,6 +5,7 @@ import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
 import com.gpl.rpg.AndorsTrail.context.ViewContext;
 import com.gpl.rpg.AndorsTrail.context.WorldContext;
 import com.gpl.rpg.AndorsTrail.controller.InputController;
+import com.gpl.rpg.AndorsTrail.controller.VisualEffectController.BloodSplatter;
 import com.gpl.rpg.AndorsTrail.controller.VisualEffectController.VisualEffectAnimation;
 import com.gpl.rpg.AndorsTrail.model.ModelContainer;
 import com.gpl.rpg.AndorsTrail.model.actor.Monster;
@@ -270,6 +271,10 @@ public final class MainView extends SurfaceView implements SurfaceHolder.Callbac
        drawMapLayer(canvas, area, currentTileMap.layers[LayeredTileMap.LAYER_GROUND]);
         tryDrawMapLayer(canvas, area, currentTileMap, LayeredTileMap.LAYER_OBJECTS);
         
+        for (BloodSplatter splatter : currentMap.splatters) {
+               drawFromMapPosition(canvas, area, splatter.position, splatter.iconID);
+        }
+        
         for (Loot l : currentMap.groundBags) {
                if (l.isVisible) {
                        drawFromMapPosition(canvas, area, l.position, TileManager.iconID_groundbag);