mirror of
https://github.com/OMGeeky/andors-trail.git
synced 2026-02-23 15:38:29 +01:00
Merge branch 'master' into stoutford_tests
This commit is contained in:
@@ -65,4 +65,29 @@
|
||||
android:layout_marginLeft="10sp"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:text="@string/iteminfo_effect_works_when_hit_by_attacker"
|
||||
android:id="@+id/itemeffect_onhitreceived_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
<com.gpl.rpg.AndorsTrail.view.ItemEffectsView_OnHitReceived
|
||||
android:id="@+id/itemeffect_onhitreceived"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="10sp"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:text="@string/iteminfo_effect_works_when_killed_by_attacker"
|
||||
android:id="@+id/itemeffect_ondeath_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
<com.gpl.rpg.AndorsTrail.view.ItemEffectsView_OnDeath
|
||||
android:id="@+id/itemeffect_ondeath"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="10sp"
|
||||
/>
|
||||
</merge>
|
||||
|
||||
31
AndorsTrail/res/layout/itemeffectview_ondeath.xml
Normal file
31
AndorsTrail/res/layout/itemeffectview_ondeath.xml
Normal file
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
>
|
||||
|
||||
|
||||
<TextView
|
||||
android:text="@string/iteminfo_effect_works_on_attacker"
|
||||
android:id="@+id/itemeffect_ondeath_target_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/itemeffect_ondeath_ontarget_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
>
|
||||
</LinearLayout>
|
||||
|
||||
<com.gpl.rpg.AndorsTrail.view.ActorConditionEffectList
|
||||
android:id="@+id/itemeffect_ondeath_conditions_source"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="10sp"
|
||||
/>
|
||||
|
||||
</merge>
|
||||
53
AndorsTrail/res/layout/itemeffectview_onhitreceived.xml
Normal file
53
AndorsTrail/res/layout/itemeffectview_onhitreceived.xml
Normal file
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
>
|
||||
|
||||
|
||||
<TextView
|
||||
android:text="@string/iteminfo_effect_works_on_source"
|
||||
android:id="@+id/itemeffect_onhitreceived_source_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/itemeffect_onhitreceived_onsource_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
>
|
||||
</LinearLayout>
|
||||
|
||||
<com.gpl.rpg.AndorsTrail.view.ActorConditionEffectList
|
||||
android:id="@+id/itemeffect_onhitreceived_conditions_source"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="10sp"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:text="@string/iteminfo_effect_works_on_attacker"
|
||||
android:id="@+id/itemeffect_onhitreceived_target_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/itemeffect_onhitreceived_ontarget_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
>
|
||||
</LinearLayout>
|
||||
|
||||
<com.gpl.rpg.AndorsTrail.view.ActorConditionEffectList
|
||||
android:id="@+id/itemeffect_onhitreceived_conditions_target"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="10sp"
|
||||
/>
|
||||
|
||||
</merge>
|
||||
@@ -99,7 +99,14 @@
|
||||
},
|
||||
{
|
||||
"id": "debuglist2",
|
||||
"items": []
|
||||
"items": [{
|
||||
"itemID": "gold",
|
||||
"quantity": {
|
||||
"min": 3,
|
||||
"max": 3
|
||||
},
|
||||
"chance": 100
|
||||
}]
|
||||
},
|
||||
{
|
||||
"id": "startitems",
|
||||
|
||||
@@ -170,6 +170,40 @@
|
||||
"min": 1,
|
||||
"max": 1
|
||||
}
|
||||
},
|
||||
"hitReceivedEffect" : {
|
||||
"increaseCurrentHP": {
|
||||
"min": 1,
|
||||
"max": 1
|
||||
},
|
||||
"increaseCurrentAP": {
|
||||
"min": 1,
|
||||
"max": 1
|
||||
},
|
||||
"increaseAttackerCurrentHP": {
|
||||
"min": 1,
|
||||
"max": 1
|
||||
},
|
||||
"increaseAttackerCurrentAP": {
|
||||
"min": 1,
|
||||
"max": 1
|
||||
},
|
||||
"conditionsSource":[
|
||||
{
|
||||
"condition":"chaotic_grip",
|
||||
"magnitude": 1,
|
||||
"duration": 5,
|
||||
"chance":"50"
|
||||
}
|
||||
],
|
||||
"conditionsTarget":[
|
||||
{
|
||||
"condition":"chaotic_grip",
|
||||
"magnitude": 1,
|
||||
"duration": 5,
|
||||
"chance":"80"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
@@ -68,6 +68,14 @@
|
||||
<string name="combat_not_enough_ap">Not enough AP left this round.</string>
|
||||
<string name="combat_hero_dies">You fall unconscious, but fortunately wake up alive, dazed and fatigued. You lost %1$d experience.</string>
|
||||
<string name="combat_miss_animation_message">MISS</string>
|
||||
<string name="combat_taunt_monster">You taunt %1$s!</string>
|
||||
<string name="combat_condition_player_apply">You are affected by %1$s.</string>
|
||||
<string name="combat_condition_player_clear">You are cleared of %1$s.</string>
|
||||
<string name="combat_condition_player_immune">You are now immunized against %1$s.</string>
|
||||
<string name="combat_condition_monster_apply">%1$s is affected by %2$s.</string>
|
||||
<string name="combat_condition_monster_clear">%1$s is cleared of %2$s.</string>
|
||||
<string name="combat_condition_monster_immune">%1$s is now immunized against %2$s.</string>
|
||||
|
||||
|
||||
<string name="inventory_info">Info</string>
|
||||
<string name="inventory_equip">Equip</string>
|
||||
@@ -304,11 +312,14 @@
|
||||
|
||||
<string name="iteminfo_effect_works_on_source">On source</string>
|
||||
<string name="iteminfo_effect_works_on_target">On target</string>
|
||||
<string name="iteminfo_effect_works_on_attacker">On attacker</string>
|
||||
<string name="iteminfo_effect_works_when_hitting_target">When hitting target</string>
|
||||
<string name="iteminfo_effect_works_when_killing_target">On every kill</string>
|
||||
<string name="iteminfo_effect_works_when_used">When used</string>
|
||||
<string name="iteminfo_effect_works_when_equipped">When equipped</string>
|
||||
|
||||
<string name="iteminfo_effect_works_when_hit_by_attacker">When hit by attacker</string>
|
||||
<string name="iteminfo_effect_works_when_killed_by_attacker">When killed by attacker</string>
|
||||
|
||||
<string name="iteminfo_effect_decrease_current_hp">Drains %1$s HP</string>
|
||||
<string name="iteminfo_effect_increase_current_hp">Restores %1$s HP</string>
|
||||
<string name="iteminfo_effect_decrease_current_ap">Drains %1$s AP</string>
|
||||
|
||||
@@ -14,7 +14,7 @@ import java.util.Locale;
|
||||
|
||||
public final class AndorsTrailApplication extends Application {
|
||||
|
||||
public static final boolean DEVELOPMENT_DEBUGRESOURCES = false;
|
||||
public static final boolean DEVELOPMENT_DEBUGRESOURCES = true;
|
||||
public static final boolean DEVELOPMENT_FORCE_STARTNEWGAME = false;
|
||||
public static final boolean DEVELOPMENT_FORCE_CONTINUEGAME = false;
|
||||
public static final boolean DEVELOPMENT_DEBUGBUTTONS = true;
|
||||
|
||||
@@ -89,6 +89,13 @@ public final class DebugInterface {
|
||||
showToast(mainActivity, "DEBUG: hp set to max", Toast.LENGTH_SHORT);
|
||||
}
|
||||
})
|
||||
,new DebugButton("skill", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
world.model.player.availableSkillIncreases += 10;
|
||||
showToast(mainActivity, "DEBUG: 10 skill points", Toast.LENGTH_SHORT);
|
||||
}
|
||||
})
|
||||
/*
|
||||
,new DebugButton("cg", new OnClickListener() {
|
||||
@Override
|
||||
|
||||
@@ -62,6 +62,8 @@ public final class ItemInfoActivity extends Activity {
|
||||
itemType.effects_use == null ? null : Collections.singletonList(itemType.effects_use),
|
||||
itemType.effects_hit == null ? null : Collections.singletonList(itemType.effects_hit),
|
||||
itemType.effects_kill == null ? null : Collections.singletonList(itemType.effects_kill),
|
||||
itemType.effects_hitReceived == null ? null : Collections.singletonList(itemType.effects_hitReceived),
|
||||
null,
|
||||
itemType.isWeapon()
|
||||
);
|
||||
|
||||
|
||||
@@ -29,6 +29,8 @@ import com.gpl.rpg.AndorsTrail.controller.listeners.CombatActionListener;
|
||||
import com.gpl.rpg.AndorsTrail.controller.listeners.CombatTurnListener;
|
||||
import com.gpl.rpg.AndorsTrail.controller.listeners.PlayerMovementListener;
|
||||
import com.gpl.rpg.AndorsTrail.controller.listeners.WorldEventListener;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorCondition;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Player;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry;
|
||||
@@ -191,6 +193,8 @@ public final class MainActivity
|
||||
controllers.movementController.playerMovementListeners.remove(this);
|
||||
controllers.combatController.combatActionListeners.remove(this);
|
||||
controllers.combatController.combatTurnListeners.remove(this);
|
||||
controllers.actorStatsController.combatActionListeners.remove(this);
|
||||
controllers.skillController.combatActionListeners.remove(this);
|
||||
controllers.mapController.worldEventListeners.remove(this);
|
||||
}
|
||||
|
||||
@@ -198,6 +202,8 @@ public final class MainActivity
|
||||
controllers.mapController.worldEventListeners.add(this);
|
||||
controllers.combatController.combatTurnListeners.add(this);
|
||||
controllers.combatController.combatActionListeners.add(this);
|
||||
controllers.actorStatsController.combatActionListeners.add(this);
|
||||
controllers.skillController.combatActionListeners.add(this);
|
||||
controllers.movementController.playerMovementListeners.add(this);
|
||||
statusview.subscribe();
|
||||
quickitemview.subscribe();
|
||||
@@ -493,5 +499,68 @@ public final class MainActivity
|
||||
public void onPlayerDoesNotHaveEnoughAP() {
|
||||
message(getString(R.string.combat_not_enough_ap));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerTauntsMonster(Monster attacker) {
|
||||
message(getString(R.string.combat_taunt_monster, attacker.getName()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerReceviesActorCondition(ActorConditionEffect effect) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (effect.isImmunity()) {
|
||||
sb.append(effect.conditionType.name);
|
||||
} else if (effect.isRemovalEffect()) {
|
||||
sb.append(effect.conditionType.name);
|
||||
} else {
|
||||
sb.append(effect.conditionType.name);
|
||||
if (effect.magnitude > 1) {
|
||||
sb.append(" x");
|
||||
sb.append(effect.magnitude);
|
||||
}
|
||||
}
|
||||
if (ActorCondition.isTemporaryEffect(effect.duration)) {
|
||||
sb.append(' ');
|
||||
sb.append(getString(R.string.iteminfo_effect_duration, effect.duration));
|
||||
}
|
||||
String msg = sb.toString();
|
||||
|
||||
if (effect.isImmunity()) {
|
||||
message(getString(R.string.combat_condition_player_immune, msg));
|
||||
} else if (effect.isRemovalEffect()) {
|
||||
message(getString(R.string.combat_condition_player_clear, msg));
|
||||
} else {
|
||||
message(getString(R.string.combat_condition_player_apply, msg));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMonsterReceivesActorCondition(ActorConditionEffect effect, Monster target) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (effect.isImmunity()) {
|
||||
sb.append(effect.conditionType.name);
|
||||
} else if (effect.isRemovalEffect()) {
|
||||
sb.append(effect.conditionType.name);
|
||||
} else {
|
||||
sb.append(effect.conditionType.name);
|
||||
if (effect.magnitude > 1) {
|
||||
sb.append(" x");
|
||||
sb.append(effect.magnitude);
|
||||
}
|
||||
}
|
||||
if (ActorCondition.isTemporaryEffect(effect.duration)) {
|
||||
sb.append(' ');
|
||||
sb.append(getString(R.string.iteminfo_effect_duration, effect.duration));
|
||||
}
|
||||
String msg = sb.toString();
|
||||
|
||||
if (effect.isImmunity()) {
|
||||
message(getString(R.string.combat_condition_monster_immune, target.getName(), msg));
|
||||
} else if (effect.isRemovalEffect()) {
|
||||
message(getString(R.string.combat_condition_monster_clear, target.getName(), msg));
|
||||
} else {
|
||||
message(getString(R.string.combat_condition_monster_apply, target.getName(), msg));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -87,6 +87,8 @@ public final class MonsterInfoActivity extends Activity {
|
||||
null,
|
||||
monster.getOnHitEffectsAsList(),
|
||||
null,
|
||||
monster.getOnHitReceivedEffectsAsList(),
|
||||
monster.getOnDeathEffects(),
|
||||
false);
|
||||
hp.update(monster.getMaxHP(), monster.getCurrentHP());
|
||||
monsterinfo_max_ap.setText(Integer.toString(monster.getMaxAP()));
|
||||
|
||||
@@ -12,12 +12,14 @@ import android.widget.Button;
|
||||
import android.widget.TableLayout;
|
||||
import android.widget.TableRow;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
|
||||
import com.gpl.rpg.AndorsTrail.Dialogs;
|
||||
import com.gpl.rpg.AndorsTrail.R;
|
||||
import com.gpl.rpg.AndorsTrail.context.WorldContext;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Player;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.Inventory;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
|
||||
import com.gpl.rpg.AndorsTrail.view.ItemEffectsView;
|
||||
@@ -155,15 +157,17 @@ public final class HeroinfoActivity_Stats extends Fragment {
|
||||
|
||||
ArrayList<ItemTraits_OnUse> effects_hit = new ArrayList<ItemTraits_OnUse>();
|
||||
ArrayList<ItemTraits_OnUse> effects_kill = new ArrayList<ItemTraits_OnUse>();
|
||||
ArrayList<ItemTraits_OnHitReceived> effects_hitReceived = new ArrayList<ItemTraits_OnHitReceived>();
|
||||
for (Inventory.WearSlot slot : Inventory.WearSlot.values()) {
|
||||
ItemType type = player.inventory.getItemTypeInWearSlot(slot);
|
||||
if (type == null) continue;
|
||||
if (type.effects_hit != null) effects_hit.add(type.effects_hit);
|
||||
if (type.effects_kill != null) effects_kill.add(type.effects_kill);
|
||||
if (type.effects_hitReceived != null) effects_hitReceived.add(type.effects_hitReceived);
|
||||
}
|
||||
if (effects_hit.isEmpty()) effects_hit = null;
|
||||
if (effects_kill.isEmpty()) effects_kill = null;
|
||||
actorinfo_onhiteffects.update(null, null, effects_hit, effects_kill, false);
|
||||
actorinfo_onhiteffects.update(null, null, effects_hit, effects_kill, effects_hitReceived, null, false);
|
||||
|
||||
|
||||
updateStatsTableRow(world.model.statistics.getNumberOfCompletedQuests(world), R.id.heroinfo_gamestats_quests, R.id.heroinfo_gamestats_quests_row);
|
||||
|
||||
@@ -7,6 +7,7 @@ import com.gpl.rpg.AndorsTrail.context.ControllerContext;
|
||||
import com.gpl.rpg.AndorsTrail.context.WorldContext;
|
||||
import com.gpl.rpg.AndorsTrail.controller.listeners.ActorConditionListeners;
|
||||
import com.gpl.rpg.AndorsTrail.controller.listeners.ActorStatsListeners;
|
||||
import com.gpl.rpg.AndorsTrail.controller.listeners.CombatActionListeners;
|
||||
import com.gpl.rpg.AndorsTrail.controller.listeners.PlayerStatsListeners;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorCondition;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
|
||||
@@ -19,6 +20,7 @@ import com.gpl.rpg.AndorsTrail.model.actor.Monster;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Player;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.Inventory;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnEquip;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
|
||||
import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea;
|
||||
@@ -31,6 +33,7 @@ public final class ActorStatsController {
|
||||
public final ActorConditionListeners actorConditionListeners = new ActorConditionListeners();
|
||||
public final ActorStatsListeners actorStatsListeners = new ActorStatsListeners();
|
||||
public final PlayerStatsListeners playerStatsListeners = new PlayerStatsListeners();
|
||||
public final CombatActionListeners combatActionListeners = new CombatActionListeners();
|
||||
|
||||
public ActorStatsController(ControllerContext controllers, WorldContext world) {
|
||||
this.controllers = controllers;
|
||||
@@ -458,12 +461,22 @@ public final class ActorStatsController {
|
||||
controllers.effectController.startEnqueuedEffect(source.position);
|
||||
}
|
||||
}
|
||||
|
||||
public void applyHitReceivedEffect(Actor source, Actor target, ItemTraits_OnHitReceived effect) {
|
||||
applyUseEffect(source, target, effect);
|
||||
if (effect.changedStats_target != null) {
|
||||
applyStatsModifierEffect(target, effect.changedStats, 1);
|
||||
controllers.effectController.startEnqueuedEffect(target.position);
|
||||
}
|
||||
}
|
||||
|
||||
private void rollForConditionEffect(Actor actor, ActorConditionEffect conditionEffect) {
|
||||
int chanceRollBias = 0;
|
||||
if (actor.isPlayer) chanceRollBias = SkillController.getActorConditionEffectChanceRollBias(conditionEffect, (Player) actor);
|
||||
|
||||
if (!Constants.rollResult(conditionEffect.chance, chanceRollBias)) return;
|
||||
if (actor.isPlayer) combatActionListeners.onPlayerReceviesActorCondition(conditionEffect);
|
||||
else combatActionListeners.onMonsterReceivesActorCondition(conditionEffect, (Monster)actor);
|
||||
applyActorCondition(actor, conditionEffect);
|
||||
}
|
||||
|
||||
@@ -510,6 +523,13 @@ public final class ActorStatsController {
|
||||
applyUseEffect(player, null, type.effects_kill);
|
||||
}
|
||||
}
|
||||
|
||||
public void applyOnDeathEffectsToPlayer(Player player, Actor monster) {
|
||||
ItemTraits_OnUse onDeathEffect = monster.getOnDeathEffects();
|
||||
if (onDeathEffect == null) return;
|
||||
|
||||
applyUseEffect(player, null, onDeathEffect);
|
||||
}
|
||||
|
||||
public void applySkillEffectsForNewRound(Player player, PredefinedMap currentMap) {
|
||||
int level = player.getSkillLevel(SkillCollection.SkillID.regeneration);
|
||||
|
||||
@@ -18,6 +18,7 @@ import com.gpl.rpg.AndorsTrail.model.actor.Actor;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.MonsterType;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Player;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.Loot;
|
||||
import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea;
|
||||
@@ -208,6 +209,7 @@ public final class CombatController implements VisualEffectCompletedCallback {
|
||||
totalExpThisFight += loot.exp;
|
||||
loot.exp = 0;
|
||||
controllers.actorStatsController.applyKillEffectsToPlayer(player);
|
||||
controllers.actorStatsController.applyOnDeathEffectsToPlayer(player, killedMonster);
|
||||
|
||||
if (!loot.hasItemsOrGold()) {
|
||||
world.model.currentMap.removeGroundLoot(loot);
|
||||
@@ -554,10 +556,16 @@ public final class CombatController implements VisualEffectCompletedCallback {
|
||||
|
||||
private void applyAttackHitStatusEffects(Actor attacker, Actor target) {
|
||||
ItemTraits_OnUse[] onHitEffects = attacker.getOnHitEffects();
|
||||
if (onHitEffects == null) return;
|
||||
|
||||
for (ItemTraits_OnUse e : onHitEffects) {
|
||||
controllers.actorStatsController.applyUseEffect(attacker, target, e);
|
||||
ItemTraits_OnHitReceived[] onHitReceivedEffects = target.getOnHitReceivedEffects();
|
||||
if (onHitEffects != null) {
|
||||
for (ItemTraits_OnUse e : onHitEffects) {
|
||||
controllers.actorStatsController.applyUseEffect(attacker, target, e);
|
||||
}
|
||||
}
|
||||
if (onHitReceivedEffects != null) {
|
||||
for (ItemTraits_OnHitReceived e : onHitReceivedEffects) {
|
||||
controllers.actorStatsController.applyHitReceivedEffect(target, attacker, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -175,24 +175,37 @@ public final class ItemController {
|
||||
}
|
||||
|
||||
public static void recalculateHitEffectsFromWornItems(Player player) {
|
||||
ArrayList<ItemTraits_OnUse> effects = null;
|
||||
ArrayList<ItemTraits_OnUse> effects_onHit = null;
|
||||
ArrayList<ItemTraits_OnHitReceived> effects_onHitReceived = null;
|
||||
for (Inventory.WearSlot slot : Inventory.WearSlot.values()) {
|
||||
ItemType type = player.inventory.getItemTypeInWearSlot(slot);
|
||||
if (type == null) continue;
|
||||
ItemTraits_OnUse e = type.effects_hit;
|
||||
if (e == null) continue;
|
||||
ItemTraits_OnUse eh = type.effects_hit;
|
||||
ItemTraits_OnHitReceived ehr = type.effects_hitReceived;
|
||||
if (eh == null && ehr == null) continue;
|
||||
|
||||
if (effects == null) effects = new ArrayList<ItemTraits_OnUse>();
|
||||
effects.add(e);
|
||||
if (effects_onHit == null) effects_onHit = new ArrayList<ItemTraits_OnUse>();
|
||||
if (eh != null) effects_onHit.add(eh);
|
||||
|
||||
if (effects_onHitReceived == null) effects_onHitReceived = new ArrayList<ItemTraits_OnHitReceived>();
|
||||
if (ehr != null) effects_onHitReceived.add(ehr);
|
||||
}
|
||||
|
||||
if (effects != null) {
|
||||
ItemTraits_OnUse[] effects_ = new ItemTraits_OnUse[effects.size()];
|
||||
effects_ = effects.toArray(effects_);
|
||||
if (effects_onHit != null) {
|
||||
ItemTraits_OnUse[] effects_ = new ItemTraits_OnUse[effects_onHit.size()];
|
||||
effects_ = effects_onHit.toArray(effects_);
|
||||
player.onHitEffects = effects_;
|
||||
} else {
|
||||
player.onHitEffects = null;
|
||||
}
|
||||
|
||||
if (effects_onHitReceived != null) {
|
||||
ItemTraits_OnHitReceived[] effects_ = new ItemTraits_OnHitReceived[effects_onHitReceived.size()];
|
||||
effects_ = effects_onHitReceived.toArray(effects_);
|
||||
player.onHitReceivedEffects = effects_;
|
||||
} else {
|
||||
player.onHitReceivedEffects = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void consumeNonItemLoot(Loot loot) {
|
||||
|
||||
@@ -188,6 +188,13 @@ public final class MapController {
|
||||
if (!satisfiesCondition(replacement)) continue;
|
||||
else ConversationController.requirementFulfilled(world, replacement.requirement);
|
||||
tileMap.applyReplacement(replacement);
|
||||
for (ReplaceableMapSection impactedReplacement : tileMap.replacements) {
|
||||
if (impactedReplacement.isApplied && impactedReplacement.replacementArea.intersects(replacement.replacementArea)) {
|
||||
//The applied replacement has overwritten changes made by a previously applied replacement.
|
||||
//This previous replacement must now be considered as unapplied to let it be reapplied later eventually.
|
||||
impactedReplacement.isApplied = false;
|
||||
}
|
||||
}
|
||||
hasUpdated = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.gpl.rpg.AndorsTrail.controller;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.context.ControllerContext;
|
||||
import com.gpl.rpg.AndorsTrail.context.WorldContext;
|
||||
import com.gpl.rpg.AndorsTrail.controller.listeners.CombatActionListeners;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionType;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection;
|
||||
@@ -20,6 +21,8 @@ import com.gpl.rpg.AndorsTrail.util.ConstRange;
|
||||
public final class SkillController {
|
||||
private final ControllerContext controllers;
|
||||
private final WorldContext world;
|
||||
public final CombatActionListeners combatActionListeners = new CombatActionListeners();
|
||||
|
||||
|
||||
public SkillController(ControllerContext controllers, WorldContext world) {
|
||||
this.controllers = controllers;
|
||||
@@ -184,6 +187,7 @@ public final class SkillController {
|
||||
public void applySkillEffectsFromMonsterAttack(AttackResult result, Monster monster) {
|
||||
if (!result.isHit) {
|
||||
if (rollForSkillChance(world.model.player, SkillID.taunt, SkillCollection.PER_SKILLPOINT_INCREASE_TAUNT_CHANCE)) {
|
||||
combatActionListeners.onPlayerTauntsMonster(monster);
|
||||
controllers.actorStatsController.changeActorAP(monster, -SkillCollection.TAUNT_AP_LOSS, false, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.gpl.rpg.AndorsTrail.controller.listeners;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.controller.AttackResult;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
|
||||
|
||||
public interface CombatActionListener {
|
||||
@@ -13,4 +14,8 @@ public interface CombatActionListener {
|
||||
void onPlayerStartedFleeing();
|
||||
void onPlayerFailedFleeing();
|
||||
void onPlayerDoesNotHaveEnoughAP();
|
||||
void onPlayerTauntsMonster(Monster attacker);
|
||||
void onPlayerReceviesActorCondition(ActorConditionEffect conditionEffect);
|
||||
void onMonsterReceivesActorCondition(ActorConditionEffect conditionEffect, Monster target);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.gpl.rpg.AndorsTrail.controller.listeners;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.controller.AttackResult;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
|
||||
import com.gpl.rpg.AndorsTrail.util.ListOfListeners;
|
||||
|
||||
@@ -41,6 +42,18 @@ public final class CombatActionListeners extends ListOfListeners<CombatActionLis
|
||||
private final Function<CombatActionListener> onPlayerDoesNotHaveEnoughAP = new Function<CombatActionListener>() {
|
||||
@Override public void call(CombatActionListener listener) { listener.onPlayerDoesNotHaveEnoughAP(); }
|
||||
};
|
||||
|
||||
private final Function1<CombatActionListener, Monster> onPlayerTauntsMonster = new Function1<CombatActionListener, Monster>() {
|
||||
@Override public void call(CombatActionListener listener, Monster attacker) { listener.onPlayerTauntsMonster(attacker); }
|
||||
};
|
||||
|
||||
private final Function1<CombatActionListener, ActorConditionEffect> onPlayerReceviesActorCondition = new Function1<CombatActionListener, ActorConditionEffect>() {
|
||||
@Override public void call(CombatActionListener listener, ActorConditionEffect effect) { listener.onPlayerReceviesActorCondition(effect); }
|
||||
};
|
||||
|
||||
private final Function2<CombatActionListener, ActorConditionEffect, Monster> onMonsterReceivesActorCondition = new Function2<CombatActionListener, ActorConditionEffect, Monster>() {
|
||||
@Override public void call(CombatActionListener listener, ActorConditionEffect effect, Monster target) { listener.onMonsterReceivesActorCondition(effect, target); }
|
||||
};
|
||||
|
||||
@Override
|
||||
public void onPlayerAttackMissed(Monster target, AttackResult attackResult) {
|
||||
@@ -86,4 +99,20 @@ public final class CombatActionListeners extends ListOfListeners<CombatActionLis
|
||||
public void onPlayerDoesNotHaveEnoughAP() {
|
||||
callAllListeners(this.onPlayerDoesNotHaveEnoughAP);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerTauntsMonster(Monster attacker) {
|
||||
callAllListeners(this.onPlayerTauntsMonster, attacker);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerReceviesActorCondition(ActorConditionEffect effect) {
|
||||
callAllListeners(this.onPlayerReceviesActorCondition, effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMonsterReceivesActorCondition(ActorConditionEffect effect, Monster target) {
|
||||
callAllListeners(this.onMonsterReceivesActorCondition, effect, target);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorCondition;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
|
||||
import com.gpl.rpg.AndorsTrail.util.Coord;
|
||||
import com.gpl.rpg.AndorsTrail.util.CoordRect;
|
||||
@@ -34,6 +35,8 @@ public class Actor {
|
||||
public int blockChance;
|
||||
public int damageResistance;
|
||||
public ItemTraits_OnUse[] onHitEffects;
|
||||
public ItemTraits_OnHitReceived[] onHitReceivedEffects;
|
||||
public ItemTraits_OnUse onDeathEffects;
|
||||
public boolean hasVFXRunning = false;
|
||||
public long vfxStartTime = 0;
|
||||
public int vfxDuration = 0;
|
||||
@@ -66,7 +69,10 @@ public class Actor {
|
||||
public int getDamageResistance() { return damageResistance; }
|
||||
public ItemTraits_OnUse[] getOnHitEffects() { return onHitEffects; }
|
||||
public List<ItemTraits_OnUse> getOnHitEffectsAsList() { return onHitEffects == null ? null : Arrays.asList(onHitEffects); }
|
||||
|
||||
public ItemTraits_OnHitReceived[] getOnHitReceivedEffects() { return onHitReceivedEffects; }
|
||||
public List<ItemTraits_OnHitReceived> getOnHitReceivedEffectsAsList() { return onHitReceivedEffects == null ? null : Arrays.asList(onHitReceivedEffects); }
|
||||
public ItemTraits_OnUse getOnDeathEffects() { return onDeathEffects; }
|
||||
|
||||
public boolean hasCriticalSkillEffect() { return getCriticalSkill() != 0; }
|
||||
public boolean hasCriticalMultiplierEffect() { float m = getCriticalMultiplier(); return m != 0 && m != 1; }
|
||||
public boolean hasCriticalAttacks() { return hasCriticalSkillEffect() && hasCriticalMultiplierEffect(); }
|
||||
|
||||
@@ -50,6 +50,8 @@ public final class Monster extends Actor {
|
||||
this.blockChance = monsterType.blockChance;
|
||||
this.damageResistance = monsterType.damageResistance;
|
||||
this.onHitEffects = monsterType.onHitEffects;
|
||||
this.onHitReceivedEffects = monsterType.onHitReceivedEffects;
|
||||
this.onDeathEffects = monsterType.onDeathEffects;
|
||||
}
|
||||
|
||||
public DropList getDropList() { return monsterType.dropList; }
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.gpl.rpg.AndorsTrail.model.actor;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.model.item.DropList;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
|
||||
import com.gpl.rpg.AndorsTrail.util.ConstRange;
|
||||
import com.gpl.rpg.AndorsTrail.util.Size;
|
||||
@@ -47,6 +48,8 @@ public final class MonsterType {
|
||||
public final int blockChance;
|
||||
public final int damageResistance;
|
||||
public final ItemTraits_OnUse[] onHitEffects;
|
||||
public final ItemTraits_OnHitReceived[] onHitReceivedEffects;
|
||||
public final ItemTraits_OnUse onDeathEffects;
|
||||
|
||||
public MonsterType(
|
||||
String id
|
||||
@@ -72,6 +75,8 @@ public final class MonsterType {
|
||||
, int blockChance
|
||||
, int damageResistance
|
||||
, ItemTraits_OnUse[] onHitEffects
|
||||
, ItemTraits_OnHitReceived[] onHitReceivedEffects
|
||||
, ItemTraits_OnUse onDeathEffects
|
||||
) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
@@ -96,6 +101,8 @@ public final class MonsterType {
|
||||
this.blockChance = blockChance;
|
||||
this.damageResistance = damageResistance;
|
||||
this.onHitEffects = onHitEffects;
|
||||
this.onHitReceivedEffects = onHitReceivedEffects;
|
||||
this.onDeathEffects = onDeathEffects;
|
||||
}
|
||||
|
||||
public static enum AggressionType {
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.gpl.rpg.AndorsTrail.model.item;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.traits.StatsModifierTraits;
|
||||
|
||||
public class ItemTraits_OnHitReceived extends ItemTraits_OnUse {
|
||||
|
||||
public final StatsModifierTraits changedStats_target;
|
||||
|
||||
public ItemTraits_OnHitReceived(
|
||||
StatsModifierTraits changedStats
|
||||
, StatsModifierTraits changedStats_target
|
||||
, ActorConditionEffect[] addedConditions_source
|
||||
, ActorConditionEffect[] addedConditions_target
|
||||
) {
|
||||
super(changedStats_target, addedConditions_source, addedConditions_target);
|
||||
this.changedStats_target = changedStats_target;
|
||||
}
|
||||
|
||||
public int calculateHitReceivedCost() {
|
||||
int costStats = changedStats == null ? 0 : changedStats.calculateHitCost();
|
||||
costStats += changedStats_target == null ? 0 : -changedStats_target.calculateHitCost();
|
||||
return costStats;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,7 +3,7 @@ package com.gpl.rpg.AndorsTrail.model.item;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.traits.StatsModifierTraits;
|
||||
|
||||
public final class ItemTraits_OnUse {
|
||||
public class ItemTraits_OnUse {
|
||||
public final StatsModifierTraits changedStats;
|
||||
public final ActorConditionEffect[] addedConditions_source;
|
||||
public final ActorConditionEffect[] addedConditions_target;
|
||||
|
||||
@@ -34,6 +34,7 @@ public final class ItemType {
|
||||
public final ItemTraits_OnUse effects_use;
|
||||
public final ItemTraits_OnUse effects_hit;
|
||||
public final ItemTraits_OnUse effects_kill;
|
||||
public final ItemTraits_OnHitReceived effects_hitReceived;
|
||||
|
||||
public ItemType(
|
||||
String id
|
||||
@@ -48,6 +49,7 @@ public final class ItemType {
|
||||
, ItemTraits_OnUse effects_use
|
||||
, ItemTraits_OnUse effects_hit
|
||||
, ItemTraits_OnUse effects_kill
|
||||
, ItemTraits_OnHitReceived effects_hitReceived
|
||||
) {
|
||||
this.id = id;
|
||||
this.iconID = iconID;
|
||||
@@ -62,6 +64,7 @@ public final class ItemType {
|
||||
this.effects_use = effects_use;
|
||||
this.effects_hit = effects_hit;
|
||||
this.effects_kill = effects_kill;
|
||||
this.effects_hitReceived = effects_hitReceived;
|
||||
this.hasPersonalizedName = name.contains(Constants.PLACEHOLDER_PLAYERNAME);
|
||||
}
|
||||
|
||||
|
||||
@@ -288,7 +288,8 @@ public final class TMXMapTranslator {
|
||||
else if (prop.name.equalsIgnoreCase(LAYERNAME_ABOVE)) layerNames.aboveLayersName = prop.value;
|
||||
else if (prop.name.equalsIgnoreCase(LAYERNAME_WALKABLE)) layerNames.walkableLayersName = prop.value;
|
||||
else if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
|
||||
L.log("OPTIMIZE: Map " + map.name + " contains replace area with unknown property \"" + prop.name + "\".");
|
||||
if (!requirementPropertiesNames.contains(prop.name))
|
||||
L.log("OPTIMIZE: Map " + map.name + " contains replace area with unknown property \"" + prop.name + "\".");
|
||||
}
|
||||
}
|
||||
MapSection replacementSection = transformMapSection(map, tileCache, position, layersPerLayerName, usedTileIDs, layerNames);
|
||||
|
||||
@@ -235,7 +235,7 @@ public final class ResourceLoader {
|
||||
loader.prepareTileset(R.drawable.ui_quickslots, "ui_quickslots", sz2x1, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.ui_icon_equipment, "ui_icon_equipment", sz1x1, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.ui_splatters1, "ui_splatters1", new Size(8, 2), sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.ui_icon_skill, "ui_icon_skill", sz1x1, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.ui_icon_immunity, "ui_icon_immunity", sz1x1, sz1x1, mTileSize);
|
||||
|
||||
loader.prepareTileset(R.drawable.actorconditions_1, "actorconditions_1", new Size(14, 8), sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.actorconditions_2, "actorconditions_2", sz3x1, sz1x1, mTileSize);
|
||||
|
||||
@@ -7,11 +7,13 @@ import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionTypeCollection;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.traits.StatsModifierTraits;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnEquip;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
|
||||
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonArrayParserFor;
|
||||
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames;
|
||||
import com.gpl.rpg.AndorsTrail.util.ConstRange;
|
||||
import com.gpl.rpg.AndorsTrail.util.L;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
@@ -73,6 +75,44 @@ public final class ItemTraitsParser {
|
||||
}
|
||||
}
|
||||
|
||||
public ItemTraits_OnHitReceived parseItemTraits_OnHitReceived(JSONObject o) throws JSONException {
|
||||
if (o == null) return null;
|
||||
|
||||
ConstRange boostCurrentHP = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.ItemTraits_OnHitReceived.increaseCurrentHP));
|
||||
ConstRange boostCurrentAP = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.ItemTraits_OnHitReceived.increaseCurrentAP));
|
||||
ConstRange boostAttackerCurrentHP = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.ItemTraits_OnHitReceived.increaseAttackerCurrentHP));
|
||||
ConstRange boostAttackerCurrentAP = ResourceParserUtils.parseConstRange(o.optJSONObject(JsonFieldNames.ItemTraits_OnHitReceived.increaseAttackerCurrentAP));
|
||||
ActorConditionEffect[] addedConditions_source = actorConditionEffectParser_withDuration.parseArray(o.optJSONArray(JsonFieldNames.ItemTraits_OnHitReceived.conditionsSource));
|
||||
ActorConditionEffect[] addedConditions_target = actorConditionEffectParser_withDuration.parseArray(o.optJSONArray(JsonFieldNames.ItemTraits_OnHitReceived.conditionsTarget));
|
||||
if ( boostCurrentHP == null
|
||||
&& boostCurrentAP == null
|
||||
&& boostAttackerCurrentAP == null
|
||||
&& boostCurrentAP == null
|
||||
&& addedConditions_source == null
|
||||
&& addedConditions_target == null
|
||||
) {
|
||||
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
|
||||
L.log("OPTIMIZE: Tried to parseItemTraits_OnHitReceived , where hasEffect=" + o.toString() + ", but all data was empty.");
|
||||
}
|
||||
return null;
|
||||
} else {
|
||||
return new ItemTraits_OnHitReceived(
|
||||
new StatsModifierTraits(
|
||||
null
|
||||
,boostCurrentHP
|
||||
,boostCurrentAP
|
||||
)
|
||||
, new StatsModifierTraits(
|
||||
null
|
||||
,boostAttackerCurrentHP
|
||||
,boostAttackerCurrentAP
|
||||
)
|
||||
,addedConditions_source
|
||||
,addedConditions_target
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public ItemTraits_OnEquip parseItemTraits_OnEquip(JSONObject o) throws JSONException {
|
||||
if (o == null) return null;
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.gpl.rpg.AndorsTrail.resource.parsers;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionTypeCollection;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemCategoryCollection;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnEquip;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
|
||||
import com.gpl.rpg.AndorsTrail.resource.DynamicTileLoader;
|
||||
@@ -10,6 +11,7 @@ import com.gpl.rpg.AndorsTrail.resource.TranslationLoader;
|
||||
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonCollectionParserFor;
|
||||
import com.gpl.rpg.AndorsTrail.resource.parsers.json.JsonFieldNames;
|
||||
import com.gpl.rpg.AndorsTrail.util.Pair;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
@@ -40,7 +42,8 @@ public final class ItemTypeParser extends JsonCollectionParserFor<ItemType> {
|
||||
final ItemTraits_OnUse useEffect = itemTraitsParser.parseItemTraits_OnUse(o.optJSONObject(JsonFieldNames.ItemType.useEffect));
|
||||
final ItemTraits_OnUse hitEffect = itemTraitsParser.parseItemTraits_OnUse(o.optJSONObject(JsonFieldNames.ItemType.hitEffect));
|
||||
final ItemTraits_OnUse killEffect = itemTraitsParser.parseItemTraits_OnUse(o.optJSONObject(JsonFieldNames.ItemType.killEffect));
|
||||
|
||||
final ItemTraits_OnHitReceived hitReceivedEffect = itemTraitsParser.parseItemTraits_OnHitReceived(o.optJSONObject(JsonFieldNames.ItemType.hitReceivedEffect));
|
||||
|
||||
final int baseMarketCost = o.optInt(JsonFieldNames.ItemType.baseMarketCost);
|
||||
final boolean hasManualPrice = o.optInt(JsonFieldNames.ItemType.hasManualPrice, 0) > 0;
|
||||
final ItemType itemType = new ItemType(
|
||||
@@ -56,6 +59,7 @@ public final class ItemTypeParser extends JsonCollectionParserFor<ItemType> {
|
||||
, useEffect
|
||||
, hitEffect
|
||||
, killEffect
|
||||
, hitReceivedEffect
|
||||
);
|
||||
return new Pair<String, ItemType>(id, itemType);
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import com.gpl.rpg.AndorsTrail.controller.Constants;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionTypeCollection;
|
||||
import com.gpl.rpg.AndorsTrail.model.actor.MonsterType;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.DropListCollection;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
|
||||
import com.gpl.rpg.AndorsTrail.resource.DynamicTileLoader;
|
||||
import com.gpl.rpg.AndorsTrail.resource.TranslationLoader;
|
||||
@@ -49,6 +50,8 @@ public final class MonsterTypeParser extends JsonCollectionParserFor<MonsterType
|
||||
int blockChance = o.optInt(JsonFieldNames.Monster.blockChance, 0);
|
||||
int damageResistance = o.optInt(JsonFieldNames.Monster.damageResistance, 0);
|
||||
final ItemTraits_OnUse hitEffect = itemTraitsParser.parseItemTraits_OnUse(o.optJSONObject(JsonFieldNames.Monster.hitEffect));
|
||||
final ItemTraits_OnHitReceived hitReceivedEffect = itemTraitsParser.parseItemTraits_OnHitReceived(o.optJSONObject(JsonFieldNames.Monster.hitReceivedEffect));
|
||||
final ItemTraits_OnUse deathEffect = itemTraitsParser.parseItemTraits_OnUse(o.optJSONObject(JsonFieldNames.Monster.deathEffect));
|
||||
|
||||
final int exp = getExpectedMonsterExperience(attackCost, attackChance, damagePotential, criticalSkill, criticalMultiplier, blockChance, damageResistance, hitEffect, maxHP, maxAP);
|
||||
|
||||
@@ -76,6 +79,8 @@ public final class MonsterTypeParser extends JsonCollectionParserFor<MonsterType
|
||||
, blockChance
|
||||
, damageResistance
|
||||
, hitEffect == null ? null : new ItemTraits_OnUse[] { hitEffect }
|
||||
, hitReceivedEffect == null ? null : new ItemTraits_OnHitReceived[] { hitReceivedEffect }
|
||||
, deathEffect
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
@@ -122,6 +122,8 @@ public final class JsonFieldNames {
|
||||
public static final String droplistID = "droplistID";
|
||||
public static final String phraseID = "phraseID";
|
||||
public static final String hitEffect = "hitEffect";
|
||||
public static final String hitReceivedEffect = "hitReceivedEffect";
|
||||
public static final String deathEffect = "deathEffect";
|
||||
}
|
||||
|
||||
public static final class ItemTraits_OnUse {
|
||||
@@ -130,6 +132,15 @@ public final class JsonFieldNames {
|
||||
public static final String conditionsSource = "conditionsSource";
|
||||
public static final String conditionsTarget = "conditionsTarget";
|
||||
}
|
||||
|
||||
public static final class ItemTraits_OnHitReceived {
|
||||
public static final String increaseCurrentHP = "increaseCurrentHP";
|
||||
public static final String increaseCurrentAP = "increaseCurrentAP";
|
||||
public static final String increaseAttackerCurrentHP = "increaseAttackerCurrentHP";
|
||||
public static final String increaseAttackerCurrentAP = "increaseAttackerCurrentAP";
|
||||
public static final String conditionsSource = "conditionsSource";
|
||||
public static final String conditionsTarget = "conditionsTarget";
|
||||
}
|
||||
|
||||
public static final class ActorConditionEffect {
|
||||
public static final String condition = "condition";
|
||||
@@ -155,6 +166,7 @@ public final class JsonFieldNames {
|
||||
public static final String useEffect = "useEffect";
|
||||
public static final String hitEffect = "hitEffect";
|
||||
public static final String killEffect = "killEffect";
|
||||
public static final String hitReceivedEffect = "hitReceivedEffect";
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -5,8 +5,10 @@ import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.R;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnEquip;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
|
||||
|
||||
import java.util.Arrays;
|
||||
@@ -19,9 +21,13 @@ public final class ItemEffectsView extends LinearLayout {
|
||||
private final ItemEffectsView_OnUse itemeffect_onuse;
|
||||
private final ItemEffectsView_OnUse itemeffect_onhit;
|
||||
private final ItemEffectsView_OnUse itemeffect_onkill;
|
||||
private final ItemEffectsView_OnHitReceived itemeffect_onhitreceived;
|
||||
private final ItemEffectsView_OnDeath itemeffect_ondeath;
|
||||
private final TextView itemeffect_onuse_title;
|
||||
private final TextView itemeffect_onhit_title;
|
||||
private final TextView itemeffect_onkill_title;
|
||||
private final TextView itemeffect_onhitreceived_title;
|
||||
private final TextView itemeffect_ondeath_title;
|
||||
|
||||
public ItemEffectsView(Context context, AttributeSet attr) {
|
||||
super(context, attr);
|
||||
@@ -36,9 +42,13 @@ public final class ItemEffectsView extends LinearLayout {
|
||||
itemeffect_onuse = (ItemEffectsView_OnUse) findViewById(R.id.itemeffect_onuse);
|
||||
itemeffect_onhit = (ItemEffectsView_OnUse) findViewById(R.id.itemeffect_onhit);
|
||||
itemeffect_onkill = (ItemEffectsView_OnUse) findViewById(R.id.itemeffect_onkill);
|
||||
itemeffect_onhitreceived = (ItemEffectsView_OnHitReceived) findViewById(R.id.itemeffect_onhitreceived);
|
||||
itemeffect_ondeath = (ItemEffectsView_OnDeath) findViewById(R.id.itemeffect_ondeath);
|
||||
itemeffect_onuse_title = (TextView) findViewById(R.id.itemeffect_onuse_title);
|
||||
itemeffect_onhit_title = (TextView) findViewById(R.id.itemeffect_onhit_title);
|
||||
itemeffect_onkill_title = (TextView) findViewById(R.id.itemeffect_onkill_title);
|
||||
itemeffect_onhitreceived_title = (TextView) findViewById(R.id.itemeffect_onhitreceived_title);
|
||||
itemeffect_ondeath_title = (TextView) findViewById(R.id.itemeffect_ondeath_title);
|
||||
}
|
||||
|
||||
public void update(
|
||||
@@ -46,6 +56,8 @@ public final class ItemEffectsView extends LinearLayout {
|
||||
Collection<ItemTraits_OnUse> effects_use,
|
||||
Collection<ItemTraits_OnUse> effects_hit,
|
||||
Collection<ItemTraits_OnUse> effects_kill,
|
||||
Collection<ItemTraits_OnHitReceived> effects_hitreceived,
|
||||
ItemTraits_OnUse effects_death,
|
||||
boolean isWeapon
|
||||
) {
|
||||
|
||||
@@ -85,5 +97,19 @@ public final class ItemEffectsView extends LinearLayout {
|
||||
} else {
|
||||
itemeffect_onkill_title.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
itemeffect_onhitreceived.update(effects_hitreceived);
|
||||
if (effects_hitreceived != null) {
|
||||
itemeffect_onhitreceived_title.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
itemeffect_onhitreceived_title.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
itemeffect_ondeath.update(effects_death);
|
||||
if (effects_death != null) {
|
||||
itemeffect_ondeath_title.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
itemeffect_ondeath_title.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
package com.gpl.rpg.AndorsTrail.view;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.R;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.traits.StatsModifierTraits;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
|
||||
|
||||
public final class ItemEffectsView_OnDeath extends LinearLayout {
|
||||
private final LinearLayout itemeffect_ondeath_ontarget_list;
|
||||
private final ActorConditionEffectList itemeffect_ondeath_conditions_source;
|
||||
private final TextView itemeffect_ondeath_target_title;
|
||||
|
||||
public ItemEffectsView_OnDeath(Context context, AttributeSet attr) {
|
||||
super(context, attr);
|
||||
setFocusable(false);
|
||||
setOrientation(LinearLayout.VERTICAL);
|
||||
inflate(context, R.layout.itemeffectview_ondeath, this);
|
||||
|
||||
itemeffect_ondeath_ontarget_list = (LinearLayout) findViewById(R.id.itemeffect_ondeath_ontarget_list);
|
||||
itemeffect_ondeath_target_title = (TextView) findViewById(R.id.itemeffect_ondeath_target_title);
|
||||
itemeffect_ondeath_conditions_source = (ActorConditionEffectList) findViewById(R.id.itemeffect_ondeath_conditions_source);
|
||||
}
|
||||
|
||||
public void update(ItemTraits_OnUse effects) {
|
||||
ArrayList<ActorConditionEffect> sourceEffects = new ArrayList<ActorConditionEffect>();
|
||||
|
||||
itemeffect_ondeath_ontarget_list.removeAllViews();
|
||||
|
||||
boolean sourceHasStatsModifiers = false;
|
||||
if (effects != null) {
|
||||
final Context context = getContext();
|
||||
final Resources res = getResources();
|
||||
if (effects.addedConditions_source != null) sourceEffects.addAll(Arrays.asList(effects.addedConditions_source));
|
||||
|
||||
if (effects.changedStats != null) {
|
||||
describeStatsModifierTraits(effects.changedStats, context, res, itemeffect_ondeath_ontarget_list);
|
||||
if (effects.changedStats.currentAPBoost != null || effects.changedStats.currentHPBoost != null) sourceHasStatsModifiers = true;
|
||||
}
|
||||
}
|
||||
itemeffect_ondeath_conditions_source.update(sourceEffects);
|
||||
if (sourceEffects.isEmpty() && !sourceHasStatsModifiers) {
|
||||
itemeffect_ondeath_target_title.setVisibility(View.GONE);
|
||||
} else {
|
||||
itemeffect_ondeath_target_title.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
public static void describeStatsModifierTraits(StatsModifierTraits traits, Context context, Resources res, LinearLayout listView) {
|
||||
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
||||
|
||||
if (traits.currentAPBoost != null) {
|
||||
final int label = traits.currentAPBoost.max > 0 ? R.string.iteminfo_effect_increase_current_ap : R.string.iteminfo_effect_decrease_current_ap;
|
||||
final TextView tv = new TextView(context);
|
||||
tv.setText(res.getString(label, traits.currentAPBoost.toMinMaxAbsString()));
|
||||
listView.addView(tv, layoutParams);
|
||||
}
|
||||
if (traits.currentHPBoost != null) {
|
||||
final int label = traits.currentHPBoost.max > 0 ? R.string.iteminfo_effect_increase_current_hp : R.string.iteminfo_effect_decrease_current_hp;
|
||||
final TextView tv = new TextView(context);
|
||||
tv.setText(res.getString(label, traits.currentHPBoost.toMinMaxAbsString()));
|
||||
listView.addView(tv, layoutParams);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
package com.gpl.rpg.AndorsTrail.view;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.R;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
|
||||
import com.gpl.rpg.AndorsTrail.model.ability.traits.StatsModifierTraits;
|
||||
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
public final class ItemEffectsView_OnHitReceived extends LinearLayout {
|
||||
private final LinearLayout itemeffect_onhitreceived_onsource_list;
|
||||
private final LinearLayout itemeffect_onhitreceived_ontarget_list;
|
||||
private final ActorConditionEffectList itemeffect_onhitreceived_conditions_source;
|
||||
private final ActorConditionEffectList itemeffect_onhitreceived_conditions_target;
|
||||
private final TextView itemeffect_onhitreceived_source_title;
|
||||
private final TextView itemeffect_onhitreceived_target_title;
|
||||
|
||||
public ItemEffectsView_OnHitReceived(Context context, AttributeSet attr) {
|
||||
super(context, attr);
|
||||
setFocusable(false);
|
||||
setOrientation(LinearLayout.VERTICAL);
|
||||
inflate(context, R.layout.itemeffectview_onhitreceived, this);
|
||||
|
||||
itemeffect_onhitreceived_onsource_list = (LinearLayout) findViewById(R.id.itemeffect_onhitreceived_onsource_list);
|
||||
itemeffect_onhitreceived_ontarget_list = (LinearLayout) findViewById(R.id.itemeffect_onhitreceived_ontarget_list);
|
||||
itemeffect_onhitreceived_source_title = (TextView) findViewById(R.id.itemeffect_onhitreceived_source_title);
|
||||
itemeffect_onhitreceived_target_title = (TextView) findViewById(R.id.itemeffect_onhitreceived_target_title);
|
||||
itemeffect_onhitreceived_conditions_source = (ActorConditionEffectList) findViewById(R.id.itemeffect_onhitreceived_conditions_source);
|
||||
itemeffect_onhitreceived_conditions_target = (ActorConditionEffectList) findViewById(R.id.itemeffect_onhitreceived_conditions_target);
|
||||
}
|
||||
|
||||
public void update(Collection<ItemTraits_OnHitReceived> effects) {
|
||||
ArrayList<ActorConditionEffect> sourceEffects = new ArrayList<ActorConditionEffect>();
|
||||
ArrayList<ActorConditionEffect> targetEffects = new ArrayList<ActorConditionEffect>();
|
||||
|
||||
itemeffect_onhitreceived_onsource_list.removeAllViews();
|
||||
itemeffect_onhitreceived_ontarget_list.removeAllViews();
|
||||
|
||||
boolean sourceHasStatsModifiers = false;
|
||||
boolean targetHasStatsModifiers = false;
|
||||
if (effects != null) {
|
||||
final Context context = getContext();
|
||||
final Resources res = getResources();
|
||||
for (ItemTraits_OnHitReceived t : effects) {
|
||||
if (t.addedConditions_source != null) sourceEffects.addAll(Arrays.asList(t.addedConditions_source));
|
||||
if (t.addedConditions_target != null) targetEffects.addAll(Arrays.asList(t.addedConditions_target));
|
||||
|
||||
if (t.changedStats != null) {
|
||||
describeStatsModifierTraits(t.changedStats, context, res, itemeffect_onhitreceived_onsource_list);
|
||||
if (t.changedStats.currentAPBoost != null || t.changedStats.currentHPBoost != null) sourceHasStatsModifiers = true;
|
||||
}
|
||||
if (t.changedStats_target != null) {
|
||||
describeStatsModifierTraits(t.changedStats_target, context, res, itemeffect_onhitreceived_ontarget_list);
|
||||
if (t.changedStats_target.currentAPBoost != null || t.changedStats_target.currentHPBoost != null) targetHasStatsModifiers = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
itemeffect_onhitreceived_conditions_source.update(sourceEffects);
|
||||
itemeffect_onhitreceived_conditions_target.update(targetEffects);
|
||||
if (sourceEffects.isEmpty() && !sourceHasStatsModifiers) {
|
||||
itemeffect_onhitreceived_source_title.setVisibility(View.GONE);
|
||||
} else {
|
||||
itemeffect_onhitreceived_source_title.setVisibility(View.VISIBLE);
|
||||
}
|
||||
if (targetEffects.isEmpty() && !targetHasStatsModifiers) {
|
||||
itemeffect_onhitreceived_target_title.setVisibility(View.GONE);
|
||||
} else {
|
||||
itemeffect_onhitreceived_target_title.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
public static void describeStatsModifierTraits(StatsModifierTraits traits, Context context, Resources res, LinearLayout listView) {
|
||||
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
||||
|
||||
if (traits.currentAPBoost != null) {
|
||||
final int label = traits.currentAPBoost.max > 0 ? R.string.iteminfo_effect_increase_current_ap : R.string.iteminfo_effect_decrease_current_ap;
|
||||
final TextView tv = new TextView(context);
|
||||
tv.setText(res.getString(label, traits.currentAPBoost.toMinMaxAbsString()));
|
||||
listView.addView(tv, layoutParams);
|
||||
}
|
||||
if (traits.currentHPBoost != null) {
|
||||
final int label = traits.currentHPBoost.max > 0 ? R.string.iteminfo_effect_increase_current_hp : R.string.iteminfo_effect_decrease_current_hp;
|
||||
final TextView tv = new TextView(context);
|
||||
tv.setText(res.getString(label, traits.currentHPBoost.toMinMaxAbsString()));
|
||||
listView.addView(tv, layoutParams);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user