From dc278fb5daf5f0b75c53757a66def56d8da35d78 Mon Sep 17 00:00:00 2001 From: Oskar Wiksten Date: Wed, 7 Aug 2013 15:42:11 +0200 Subject: [PATCH 1/5] First attempt at scripted map areas --- .../src/com/gpl/rpg/AndorsTrail/Dialogs.java | 8 ++ .../activity/ConversationActivity.java | 30 ++++---- .../AndorsTrail/activity/MainActivity.java | 15 +++- .../controller/ConversationController.java | 75 +++++++++---------- .../controller/ConversationStatemachine.java | 11 +++ .../AndorsTrail/controller/MapController.java | 26 +++++++ .../controller/MovementController.java | 1 + .../listeners/WorldEventListener.java | 1 + .../listeners/WorldEventListeners.java | 9 +++ .../rpg/AndorsTrail/model/map/MapObject.java | 35 ++++++--- .../model/map/TMXMapTranslator.java | 29 ++++++- 11 files changed, 170 insertions(+), 70 deletions(-) create mode 100644 AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationStatemachine.java diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java index 345760ef2..9598dc618 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/Dialogs.java @@ -58,10 +58,18 @@ public final class Dialogs { showConversation(currentActivity, context, phraseID, null); } + public static void showMapScriptMessage(final MainActivity currentActivity, final ControllerContext context, String phraseID) { + showConversation(currentActivity, context, phraseID, null, false); + } + public static void showConversation(final MainActivity currentActivity, final ControllerContext context, final String phraseID, final Monster npc) { + showConversation(currentActivity, context, phraseID, npc, true); + } + private static void showConversation(final MainActivity currentActivity, final ControllerContext context, final String phraseID, final Monster npc, boolean giveRewardsForFirstPhrase) { context.gameRoundController.pause(); Intent intent = new Intent(currentActivity, ConversationActivity.class); intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/conversation/" + phraseID)); + intent.putExtra("giveRewardsForFirstPhrase", giveRewardsForFirstPhrase); addMonsterIdentifiers(intent, npc); currentActivity.startActivityForResult(intent, MainActivity.INTENTREQUEST_CONVERSATION); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java index 905f327ef..8571d7a28 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/ConversationActivity.java @@ -36,10 +36,11 @@ import com.gpl.rpg.AndorsTrail.resource.tiles.TileManager; import java.util.ArrayList; -public final class ConversationActivity extends Activity implements OnKeyListener +public final class ConversationActivity + extends Activity + implements OnKeyListener , ConversationController.ConversationStatemachine.ConversationStateListener { - public static final int ACTIVITYRESULT_ATTACK = Activity.RESULT_FIRST_USER + 1; - public static final int ACTIVITYRESULT_REMOVE = Activity.RESULT_FIRST_USER + 2; + private static final int playerNameColor = Color.argb(255, 0xbb, 0x22, 0x22); private static final int NPCNameColor = Color.argb(255, 0xbb, 0xbb, 0x22); private static final int playerPhraseColor = 0; @@ -64,7 +65,7 @@ public final class ConversationActivity extends Activity implements OnKeyListene if (!app.isInitialized()) { finish(); return; } this.world = app.getWorld(); this.player = world.model.player; - this.conversationState = new ConversationController.ConversationStatemachine(world, app.getControllerContext(), getResources(), this); + this.conversationState = new ConversationController.ConversationStatemachine(world, app.getControllerContext(), this); requestWindowFeature(Window.FEATURE_NO_TITLE); @@ -106,17 +107,22 @@ public final class ConversationActivity extends Activity implements OnKeyListene statementList.setFocusable(false); statementList.setFocusableInTouchMode(false); + String phraseID; + boolean giveRewardsForFirstPhrase; + boolean displayLastMessage = true; if (savedInstanceState != null) { conversationState.setCurrentNPC(Dialogs.getMonsterFromBundle(savedInstanceState, world)); ArrayList savedConversationHistory = savedInstanceState.getParcelableArrayList("conversationHistory"); if (savedConversationHistory != null) conversationHistory.addAll(savedConversationHistory); - final String phraseID = savedInstanceState.getString("phraseID"); - conversationState.proceedToRestoredState(phraseID); + phraseID = savedInstanceState.getString("phraseID"); + giveRewardsForFirstPhrase = false; + displayLastMessage = false; } else { conversationState.setCurrentNPC(Dialogs.getMonsterFromIntent(getIntent(), world)); - final String phraseID = getIntent().getData().getLastPathSegment(); - conversationState.proceedToPhrase(phraseID); + phraseID = getIntent().getData().getLastPathSegment(); + giveRewardsForFirstPhrase = getIntent().getBooleanExtra("giveRewardsForFirstPhrase", true); } + conversationState.proceedToPhrase(getResources(), phraseID, giveRewardsForFirstPhrase, displayLastMessage); } @Override @@ -205,12 +211,12 @@ public final class ConversationActivity extends Activity implements OnKeyListene replyGroup.removeAllViews(); nextButton.setEnabled(false); if (conversationState.hasOnlyOneNextReply()) { - conversationState.playerSelectedNextStep(); + conversationState.playerSelectedNextStep(getResources()); } else { if (rb == null) return; Reply r = (Reply) rb.getTag(); addConversationStatement(player, rb.getText().toString(), playerPhraseColor); - conversationState.playerSelectedReply(r); + conversationState.playerSelectedReply(getResources(), r); } } @@ -340,7 +346,7 @@ public final class ConversationActivity extends Activity implements OnKeyListene } @Override - public void onTextPhraseReached(String message, Actor actor) { + public void onTextPhraseReached(String message, Actor actor, String phraseID) { addConversationStatement(actor, message, NPCPhraseColor); } @@ -395,13 +401,11 @@ public final class ConversationActivity extends Activity implements OnKeyListene @Override public void onConversationEndedWithCombat(Monster npc) { - ConversationActivity.this.setResult(ACTIVITYRESULT_ATTACK); ConversationActivity.this.finish(); } @Override public void onConversationEndedWithRemoval(Monster npc) { - ConversationActivity.this.setResult(ACTIVITYRESULT_REMOVE); ConversationActivity.this.finish(); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java index 3502d2810..f053a9d06 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java @@ -17,7 +17,6 @@ import com.gpl.rpg.AndorsTrail.context.ControllerContext; import com.gpl.rpg.AndorsTrail.context.WorldContext; import com.gpl.rpg.AndorsTrail.controller.AttackResult; import com.gpl.rpg.AndorsTrail.controller.CombatController; -import com.gpl.rpg.AndorsTrail.controller.MovementController; import com.gpl.rpg.AndorsTrail.controller.listeners.CombatActionListener; import com.gpl.rpg.AndorsTrail.controller.listeners.CombatTurnListener; import com.gpl.rpg.AndorsTrail.controller.listeners.PlayerMovementListener; @@ -36,7 +35,13 @@ import com.gpl.rpg.AndorsTrail.view.QuickButton.QuickButtonContextMenuInfo; import java.lang.ref.WeakReference; import java.util.Collection; -public final class MainActivity extends Activity implements PlayerMovementListener, CombatActionListener, CombatTurnListener, WorldEventListener { +public final class MainActivity + extends Activity + implements + PlayerMovementListener + , CombatActionListener + , CombatTurnListener + , WorldEventListener { public static final int INTENTREQUEST_MONSTERENCOUNTER = 2; public static final int INTENTREQUEST_CONVERSATION = 4; @@ -115,7 +120,6 @@ public final class MainActivity extends Activity implements PlayerMovementListen } break; case INTENTREQUEST_CONVERSATION: - MovementController.refreshMonsterAggressiveness(world.model.currentMap, world.model.player); controllers.mapController.applyCurrentMapReplacements(getResources(), true); break; case INTENTREQUEST_SAVEGAME: @@ -340,6 +344,11 @@ public final class MainActivity extends Activity implements PlayerMovementListen Dialogs.showConversation(this, controllers, phraseID, m); } + @Override + public void onScriptAreaStartedConversation(String phraseID) { + Dialogs.showMapScriptMessage(this, controllers, phraseID); + } + @Override public void onPlayerSteppedOnMonster(Monster m) { Dialogs.showMonsterEncounter(this, controllers, m); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java index 6112ee9ab..3987b1df2 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java @@ -63,7 +63,7 @@ public final class ConversationController { addQuestProgressReward(player, reward.rewardID, reward.value, result); break; case alignmentChange: - player.addAlignment(reward.rewardID, reward.value); + addAlignmentReward(player, reward.rewardID, reward.value); break; } } @@ -76,16 +76,20 @@ public final class ConversationController { return result; } + private void addAlignmentReward(Player player, String faction, int delta) { + player.addAlignment(faction, delta); + MovementController.refreshMonsterAggressiveness(world.model.currentMap, world.model.player); + } + private void addQuestProgressReward(Player player, String questID, int questProgress, PhraseRewards result) { QuestProgress progress = new QuestProgress(questID, questProgress); boolean added = player.addQuestProgress(progress); if (!added) return; // Only apply exp reward if the quest stage was reached just now (and not re-reached) QuestLogEntry stage = world.quests.getQuestLogEntry(progress); - if (stage != null) { - result.loot.exp += stage.rewardExperience; - result.questProgress.add(progress); - } + if (stage == null) return; + result.loot.exp += stage.rewardExperience; + result.questProgress.add(progress); } private void addDropListReward(Player player, String droplistID, PhraseRewards result) { @@ -169,17 +173,15 @@ public final class ConversationController { private final WorldContext world; private final ControllerContext controllers; private final Player player; - private final Resources res; private String phraseID; private Phrase currentPhrase; private Monster npc; public ConversationStateListener listener; - public ConversationStatemachine(WorldContext world, ControllerContext controllers, Resources res, ConversationStateListener listener) { + public ConversationStatemachine(WorldContext world, ControllerContext controllers, ConversationStateListener listener) { this.world = world; this.player = world.model.player; this.controllers = controllers; - this.res = res; this.listener = listener; } @@ -187,17 +189,17 @@ public final class ConversationController { public Monster getCurrentNPC() { return npc; } public String getCurrentPhraseID() { return phraseID; } - public void playerSelectedReply(Reply r) { + public void playerSelectedReply(final Resources res, Reply r) { applyReplyEffect(player, r); - proceedToPhrase(r.nextPhrase); + proceedToPhrase(res, r.nextPhrase, true, true); } - public void playerSelectedNextStep() { - playerSelectedReply(currentPhrase.replies[0]); + public void playerSelectedNextStep(final Resources res) { + playerSelectedReply(res, currentPhrase.replies[0]); } public interface ConversationStateListener { - void onTextPhraseReached(String message, Actor actor); + void onTextPhraseReached(String message, Actor actor, String phraseID); void onConversationEnded(); void onConversationEndedWithShop(Monster npc); void onConversationEndedWithCombat(Monster npc); @@ -207,7 +209,7 @@ public final class ConversationController { void onConversationHasReply(Reply r, String message); } - private void setCurrentPhrase(String phraseID) { + private void setCurrentPhrase(final Resources res, String phraseID) { this.phraseID = phraseID; this.currentPhrase = world.conversationLoader.loadPhrase(phraseID, conversationCollection, res); if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) { @@ -218,7 +220,7 @@ public final class ConversationController { } } - public void proceedToPhrase(String phraseID) { + public void proceedToPhrase(final Resources res, String phraseID, boolean giveRewards, boolean displayPhraseMessage) { if (phraseID.equalsIgnoreCase(ConversationCollection.PHRASE_CLOSE)) { listener.onConversationEnded(); return; @@ -233,26 +235,36 @@ public final class ConversationController { return; } - setCurrentPhrase(phraseID); + setCurrentPhrase(res, phraseID); - ConversationController.PhraseRewards phraseRewards = controllers.conversationController.applyPhraseRewards(player, currentPhrase); - if (phraseRewards != null) { - listener.onPlayerReceivedRewards(phraseRewards); + if (giveRewards) { + ConversationController.PhraseRewards phraseRewards = controllers.conversationController.applyPhraseRewards(player, currentPhrase); + if (phraseRewards != null) { + listener.onPlayerReceivedRewards(phraseRewards); + } } if (currentPhrase.message == null) { for (Reply r : currentPhrase.replies) { if (!canSelectReply(world, r)) continue; applyReplyEffect(player, r); - proceedToPhrase(r.nextPhrase); + proceedToPhrase(res, r.nextPhrase, giveRewards, displayPhraseMessage); return; } + } else if (displayPhraseMessage) { + String message = getDisplayMessage(currentPhrase, player); + listener.onTextPhraseReached(message, npc, phraseID); } - String message = getDisplayMessage(currentPhrase, player); - listener.onTextPhraseReached(message, npc); + if (hasOnlyOneNextReply()) { + listener.onConversationCanProceedWithNext(); + return; + } - requestReplies(); + for (Reply r : currentPhrase.replies) { + if (!canSelectReply(world, r)) continue; + listener.onConversationHasReply(r, getDisplayMessage(r, player)); + } } private void endConversationWithRemovingNPC() { @@ -267,23 +279,6 @@ public final class ConversationController { listener.onConversationEndedWithCombat(npc); } - private void requestReplies() { - if (hasOnlyOneNextReply()) { - listener.onConversationCanProceedWithNext(); - return; - } - - for (Reply r : currentPhrase.replies) { - if (!canSelectReply(world, r)) continue; - listener.onConversationHasReply(r, getDisplayMessage(r, player)); - } - } - - public void proceedToRestoredState(String phraseID) { - setCurrentPhrase(phraseID); - requestReplies(); - } - public boolean hasOnlyOneNextReply() { if (currentPhrase.replies == null) return false; if (currentPhrase.replies.length != 1) return false; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationStatemachine.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationStatemachine.java new file mode 100644 index 000000000..ef31dbaf2 --- /dev/null +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationStatemachine.java @@ -0,0 +1,11 @@ +package com.gpl.rpg.AndorsTrail.controller; + +/** + * Created with IntelliJ IDEA. + * User: oskar + * Date: 8/7/13 + * Time: 3:26 PM + * To change this template use File | Settings | File Templates. + */ +public class ConversationStatemachine { +} diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java index 1ec02f0dc..48b121864 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java @@ -5,7 +5,9 @@ import com.gpl.rpg.AndorsTrail.context.ControllerContext; import com.gpl.rpg.AndorsTrail.context.WorldContext; import com.gpl.rpg.AndorsTrail.controller.listeners.MapLayoutListeners; import com.gpl.rpg.AndorsTrail.controller.listeners.WorldEventListeners; +import com.gpl.rpg.AndorsTrail.conversation.Phrase; import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection; +import com.gpl.rpg.AndorsTrail.model.actor.Actor; import com.gpl.rpg.AndorsTrail.model.actor.Monster; import com.gpl.rpg.AndorsTrail.model.actor.Player; import com.gpl.rpg.AndorsTrail.model.map.LayeredTileMap; @@ -20,6 +22,7 @@ public final class MapController { private final WorldContext world; public final WorldEventListeners worldEventListeners = new WorldEventListeners(); public final MapLayoutListeners mapLayoutListeners = new MapLayoutListeners(); + private ConversationController.ConversationStatemachine mapScriptExecutor; public MapController(ControllerContext controllers, WorldContext world) { this.controllers = controllers; @@ -41,9 +44,15 @@ public final class MapController { case rest: steppedOnRestArea(o); break; + case script: + runScriptArea(o); } } + private void runScriptArea(MapObject o) { + mapScriptExecutor.proceedToPhrase(controllers.getResources(), o.id, true, true); + } + private void steppedOnRestArea(MapObject area) { if (controllers.preferences.confirmRest) { worldEventListeners.onPlayerSteppedOnRestArea(area); @@ -139,4 +148,21 @@ public final class MapController { public boolean satisfiesCondition(ReplaceableMapSection replacement) { return world.model.player.hasExactQuestProgress(replacement.requireQuestStage); } + + private final ConversationController.ConversationStatemachine.ConversationStateListener conversationStateListener = new ConversationController.ConversationStatemachine.ConversationStateListener() { + @Override + public void onTextPhraseReached(String message, Actor actor, String phraseID) { + worldEventListeners.onScriptAreaStartedConversation(phraseID); + } + @Override public void onPlayerReceivedRewards(ConversationController.PhraseRewards phraseRewards) { } + @Override public void onConversationEnded() { } + @Override public void onConversationEndedWithShop(Monster npc) { } + @Override public void onConversationEndedWithCombat(Monster npc) { } + @Override public void onConversationEndedWithRemoval(Monster npc) { } + @Override public void onConversationCanProceedWithNext() { } + @Override public void onConversationHasReply(Phrase.Reply r, String message) { } + }; + public void prepareScriptsOnCurrentMap() { + mapScriptExecutor = new ConversationController.ConversationStatemachine(world, controllers, conversationStateListener); + } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java index 8894a98ae..2c3b4a8bc 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java @@ -96,6 +96,7 @@ public final class MovementController implements TimedMessageTask.Callback { } } controllers.mapController.applyCurrentMapReplacements(res, false); + controllers.mapController.prepareScriptsOnCurrentMap(); newMap.visited = true; newMap.updateLastVisitTime(); moveBlockedActors(newMap, model.currentTileMap); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/WorldEventListener.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/WorldEventListener.java index f91c6db98..30f63ba0a 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/WorldEventListener.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/WorldEventListener.java @@ -8,6 +8,7 @@ import java.util.Collection; public interface WorldEventListener { void onPlayerStartedConversation(Monster m, String phraseID); + void onScriptAreaStartedConversation(String phraseID); void onPlayerSteppedOnMonster(Monster m); void onPlayerSteppedOnMapSignArea(MapObject area); void onPlayerSteppedOnKeyArea(MapObject area); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/WorldEventListeners.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/WorldEventListeners.java index c2cd95da6..b6d4ee0e3 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/WorldEventListeners.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/listeners/WorldEventListeners.java @@ -13,6 +13,10 @@ public final class WorldEventListeners extends ListOfListeners onScriptAreaStartedConversation = new Function1() { + @Override public void call(WorldEventListener listener, String phraseID) { listener.onScriptAreaStartedConversation(phraseID); } + }; + private final Function1 onPlayerSteppedOnMonster = new Function1() { @Override public void call(WorldEventListener listener, Monster m) { listener.onPlayerSteppedOnMonster(m); } }; @@ -58,6 +62,11 @@ public final class WorldEventListeners extends ListOfListeners types = monsterTypes.getMonsterTypesFromSpawnGroup(object.name); int maxQuantity = 1; @@ -129,15 +129,36 @@ public final class TMXMapTranslator { } } - mapObjects.add(MapObject.createNewKeyArea(position, phraseID, requireQuestStage)); + mapObjects.add(MapObject.createKeyArea(position, phraseID, requireQuestStage)); } else if (object.type.equals("rest")) { - mapObjects.add(MapObject.createNewRest(position, object.name)); + mapObjects.add(MapObject.createRestArea(position, object.name)); } else if (object.type.equals("container")) { DropList dropList = dropLists.getDropList(object.name); if (dropList == null) continue; - mapObjects.add(MapObject.createNewContainerArea(position, dropList)); + mapObjects.add(MapObject.createContainerArea(position, dropList)); } else if (object.type.equals("replace")) { // Do nothing. Will be handled when reading map layers instead. + } else if (object.type.equalsIgnoreCase("script")) { + String phraseID = object.name; + MapObject.MapObjectEvaluationType evaluateWhen = MapObject.MapObjectEvaluationType.whenEntering; + for (TMXProperty p : object.properties) { + if (p.name.equalsIgnoreCase("when")) { + if (p.value.equalsIgnoreCase("enter")) { + evaluateWhen = MapObject.MapObjectEvaluationType.whenEntering; + } else if (p.value.equalsIgnoreCase("step")) { + evaluateWhen = MapObject.MapObjectEvaluationType.onEveryStep; + } else if (p.value.equalsIgnoreCase("turn")) { + evaluateWhen = MapObject.MapObjectEvaluationType.afterEveryTurn; + } else if (p.value.equalsIgnoreCase("always")) { + evaluateWhen = MapObject.MapObjectEvaluationType.continuously; + } else if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) { + L.log("OPTIMIZE: Map " + m.name + ", script " + object.name + "@" + topLeft.toString() + " has unrecognized value for \"when\" property: \"" + p.value + "\"."); + } + } else if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) { + L.log("OPTIMIZE: Map " + m.name + ", script " + object.name + "@" + topLeft.toString() + " has unrecognized property \"" + p.name + "\"."); + } + } + mapObjects.add(MapObject.createScriptArea(position, phraseID, evaluateWhen)); } else if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) { L.log("OPTIMIZE: Map " + m.name + ", has unrecognized object type \"" + object.type + "\" for name \"" + object.name + "\"."); } From 02bfeb5625263ca575146369245fd4d5abfd4584 Mon Sep 17 00:00:00 2001 From: Oskar Wiksten Date: Wed, 7 Aug 2013 17:00:38 +0200 Subject: [PATCH 2/5] Enable map scripts to run on every round or tick --- .../controller/CombatController.java | 2 +- .../controller/ConversationController.java | 11 ++++++ .../controller/GameRoundController.java | 3 ++ .../AndorsTrail/controller/MapController.java | 39 ++++++++++++++++++- .../controller/MovementController.java | 13 ++----- .../rpg/AndorsTrail/model/map/MapObject.java | 2 +- .../model/map/TMXMapTranslator.java | 4 +- 7 files changed, 59 insertions(+), 15 deletions(-) diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java index 1aea5b9f0..40e3f9dac 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/CombatController.java @@ -263,7 +263,7 @@ public final class CombatController implements VisualEffectCompletedCallback { } world.model.player.nextPosition.set(dest); - controllers.movementController.moveToNextIfPossible(false); + controllers.movementController.moveToNextIfPossible(); playerActionCompleted(); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java index 3987b1df2..d5d8438a7 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java @@ -14,6 +14,7 @@ import com.gpl.rpg.AndorsTrail.model.item.Loot; import com.gpl.rpg.AndorsTrail.model.quest.QuestLogEntry; import com.gpl.rpg.AndorsTrail.model.quest.QuestProgress; import com.gpl.rpg.AndorsTrail.util.ConstRange; +import com.gpl.rpg.AndorsTrail.util.L; import java.util.ArrayList; @@ -268,11 +269,21 @@ public final class ConversationController { } private void endConversationWithRemovingNPC() { + if (npc == null) { + if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) L.log("Tried to remove NPC from conversation without having a valid npc target!"); + listener.onConversationEnded(); + return; + } controllers.monsterSpawnController.remove(world.model.currentMap, npc); listener.onConversationEndedWithRemoval(npc); } private void endConversationWithCombat() { + if (npc == null) { + if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) L.log("Tried to enter combat from conversation without having a valid npc target!"); + listener.onConversationEnded(); + return; + } npc.forceAggressive(); controllers.combatController.setCombatSelection(npc); controllers.combatController.enterCombat(CombatController.BeginTurnAs.player); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java index d43cc65a4..bfdf4a7d2 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java @@ -3,6 +3,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.GameRoundListeners; +import com.gpl.rpg.AndorsTrail.model.map.MapObject; import com.gpl.rpg.AndorsTrail.util.TimedMessageTask; public final class GameRoundController implements TimedMessageTask.Callback { @@ -81,6 +82,7 @@ public final class GameRoundController implements TimedMessageTask.Callback { public void onNewPlayerRound() { controllers.actorStatsController.applyConditionsToPlayer(world.model.player, false); controllers.actorStatsController.applySkillEffectsForNewRound(world.model.player, world.model.currentMap); + controllers.mapController.handleMapEvents(world.model.currentMap, world.model.player.position, MapObject.MapObjectEvaluationType.afterEveryRound); } public void onNewMonsterRound() { controllers.actorStatsController.applyConditionsToMonsters(world.model.currentMap, false); @@ -91,6 +93,7 @@ public final class GameRoundController implements TimedMessageTask.Callback { controllers.monsterSpawnController.maybeSpawn(world.model.currentMap, world.model.currentTileMap); controllers.monsterMovementController.attackWithAgressiveMonsters(); controllers.effectController.updateSplatters(world.model.currentMap); + controllers.mapController.handleMapEvents(world.model.currentMap, world.model.player.position, MapObject.MapObjectEvaluationType.continuously); gameRoundListeners.onNewTick(); } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java index 48b121864..9c99bd067 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java @@ -29,7 +29,31 @@ public final class MapController { this.world = world; } - public void handleMapEvent(MapObject o, Coord position) { + public void handleMapEventsAfterMovement(PredefinedMap currentMap, Coord newPosition, Coord lastPosition) { + // We don't allow event objects to overlap, so there can only be one object returned here. + MapObject mapObject = currentMap.getEventObjectAt(newPosition); + if (mapObject == null) return; + + switch (mapObject.evaluateWhen) { + case afterEveryRound: + return; + case whenEntering: + // Do not trigger event if the player already was on the same MapObject before. + if (mapObject.position.contains(lastPosition)) return; + break; + } + handleMapEvent(mapObject, newPosition); + } + + public void handleMapEvents(PredefinedMap currentMap, Coord position, MapObject.MapObjectEvaluationType evaluationType) { + MapObject mapObject = currentMap.getEventObjectAt(position); + if (mapObject == null) return; + if (mapObject.evaluateWhen != evaluationType) return; + handleMapEvent(mapObject, position); + } + + private void handleMapEvent(MapObject o, Coord position) { + if (!shouldHandleMapEvent(o)) return; switch (o.type) { case sign: if (o.id == null || o.id.length() <= 0) return; @@ -46,11 +70,22 @@ public final class MapController { break; case script: runScriptArea(o); + break; } } + private boolean shouldHandleMapEvent(MapObject mapObject) { + if (world.model.uiSelections.isInCombat) { + // Only "script" events may run while in combat. + if (mapObject.type != MapObject.MapObjectType.script) return false; + } + return true; + } + private void runScriptArea(MapObject o) { - mapScriptExecutor.proceedToPhrase(controllers.getResources(), o.id, true, true); + Resources res = controllers.getResources(); + mapScriptExecutor.proceedToPhrase(res, o.id, true, true); + controllers.mapController.applyCurrentMapReplacements(res, true); } private void steppedOnRestArea(MapObject area) { diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java index 2c3b4a8bc..c8946ed77 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java @@ -121,7 +121,7 @@ public final class MovementController implements TimedMessageTask.Callback { return; } - moveToNextIfPossible(true); + moveToNextIfPossible(); } private boolean findWalkablePosition(int dx, int dy) { @@ -207,7 +207,7 @@ public final class MovementController implements TimedMessageTask.Callback { else return -v; } - public void moveToNextIfPossible(boolean handleEvents) { + public void moveToNextIfPossible() { final Player player = world.model.player; final PredefinedMap currentMap = world.model.currentMap; final Coord newPosition = player.nextPosition; @@ -225,14 +225,9 @@ public final class MovementController implements TimedMessageTask.Callback { controllers.combatController.setCombatSelection(null, null); playerMovementListeners.onPlayerMoved(newPosition, player.lastPosition); - if (handleEvents) { - MapObject o = currentMap.getEventObjectAt(newPosition); - if (o != null) { - if (!o.position.contains(player.lastPosition)) { // Do not trigger event if the player already was on the same MapObject before. - controllers.mapController.handleMapEvent(o, newPosition); - } - } + controllers.mapController.handleMapEventsAfterMovement(currentMap, newPosition, player.lastPosition); + if (!world.model.uiSelections.isInCombat) { Loot loot = currentMap.getBagAt(newPosition); if (loot != null) controllers.itemController.playerSteppedOnLootBag(loot); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/MapObject.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/MapObject.java index 6bfde347e..e3c71a5c5 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/MapObject.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/MapObject.java @@ -17,7 +17,7 @@ public final class MapObject { public static enum MapObjectEvaluationType { whenEntering ,onEveryStep - ,afterEveryTurn + ,afterEveryRound ,continuously } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/TMXMapTranslator.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/TMXMapTranslator.java index e390f7577..7cbfce35a 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/TMXMapTranslator.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/TMXMapTranslator.java @@ -147,8 +147,8 @@ public final class TMXMapTranslator { evaluateWhen = MapObject.MapObjectEvaluationType.whenEntering; } else if (p.value.equalsIgnoreCase("step")) { evaluateWhen = MapObject.MapObjectEvaluationType.onEveryStep; - } else if (p.value.equalsIgnoreCase("turn")) { - evaluateWhen = MapObject.MapObjectEvaluationType.afterEveryTurn; + } else if (p.value.equalsIgnoreCase("round")) { + evaluateWhen = MapObject.MapObjectEvaluationType.afterEveryRound; } else if (p.value.equalsIgnoreCase("always")) { evaluateWhen = MapObject.MapObjectEvaluationType.continuously; } else if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) { From d6583a4e3381454b0e28678289fad859052a064f Mon Sep 17 00:00:00 2001 From: Oskar Wiksten Date: Sat, 24 Aug 2013 14:06:53 +0200 Subject: [PATCH 3/5] Add reward type "giveItem", for quest rewards that do not need full droplists. --- .../AndorsTrail/controller/ConversationController.java | 7 +++++++ .../gpl/rpg/AndorsTrail/controller/MapController.java | 4 ++-- .../gpl/rpg/AndorsTrail/model/conversation/Reward.java | 1 + .../src/com/gpl/rpg/AndorsTrail/model/item/DropList.java | 8 +------- .../gpl/rpg/AndorsTrail/model/item/ItemContainer.java | 2 ++ .../src/com/gpl/rpg/AndorsTrail/model/item/Loot.java | 9 ++++++++- 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java index d5d8438a7..c1950c56b 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java @@ -66,6 +66,9 @@ public final class ConversationController { case alignmentChange: addAlignmentReward(player, reward.rewardID, reward.value); break; + case giveItem: + addItemReward(reward.rewardID, reward.value, result); + break; } } @@ -97,6 +100,10 @@ public final class ConversationController { world.dropLists.getDropList(droplistID).createRandomLoot(result.loot, player); } + private void addItemReward(String itemTypeID, int quantity, PhraseRewards result) { + result.loot.add(world.itemTypes.getItemType(itemTypeID), quantity); + } + private void addSkillReward(Player player, SkillCollection.SkillID skillID, PhraseRewards result) { SkillInfo skill = world.skills.getSkill(skillID); boolean addedSkill = controllers.skillController.levelUpSkillByQuest(player, skill); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java index 9c99bd067..c8f6b37dc 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java @@ -5,11 +5,11 @@ import com.gpl.rpg.AndorsTrail.context.ControllerContext; import com.gpl.rpg.AndorsTrail.context.WorldContext; import com.gpl.rpg.AndorsTrail.controller.listeners.MapLayoutListeners; import com.gpl.rpg.AndorsTrail.controller.listeners.WorldEventListeners; -import com.gpl.rpg.AndorsTrail.conversation.Phrase; import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection; import com.gpl.rpg.AndorsTrail.model.actor.Actor; import com.gpl.rpg.AndorsTrail.model.actor.Monster; import com.gpl.rpg.AndorsTrail.model.actor.Player; +import com.gpl.rpg.AndorsTrail.model.conversation.Reply; import com.gpl.rpg.AndorsTrail.model.map.LayeredTileMap; import com.gpl.rpg.AndorsTrail.model.map.MapObject; import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap; @@ -195,7 +195,7 @@ public final class MapController { @Override public void onConversationEndedWithCombat(Monster npc) { } @Override public void onConversationEndedWithRemoval(Monster npc) { } @Override public void onConversationCanProceedWithNext() { } - @Override public void onConversationHasReply(Phrase.Reply r, String message) { } + @Override public void onConversationHasReply(Reply r, String message) { } }; public void prepareScriptsOnCurrentMap() { mapScriptExecutor = new ConversationController.ConversationStatemachine(world, controllers, conversationStateListener); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/conversation/Reward.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/conversation/Reward.java index 0f29c1e04..a8d851b55 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/conversation/Reward.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/conversation/Reward.java @@ -7,6 +7,7 @@ public final class Reward { ,skillIncrease ,actorCondition ,alignmentChange + ,giveItem } public final RewardType rewardType; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/DropList.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/DropList.java index a1671f768..cf0de6c4f 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/DropList.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/DropList.java @@ -20,13 +20,7 @@ public final class DropList { final int quantityRollBias = SkillController.getDropQuantityRollBias(item, player); int quantity = Constants.rollValue(item.quantity, quantityRollBias); - if (quantity != 0) { - if (ItemTypeCollection.isGoldItemType(item.itemType.id)) { - loot.gold += quantity; - } else { - loot.items.addItem(item.itemType, quantity); - } - } + loot.add(item.itemType, quantity); } } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemContainer.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemContainer.java index 5067c07b8..a23852a90 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemContainer.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/ItemContainer.java @@ -42,6 +42,8 @@ public class ItemContainer { } public void addItem(ItemType itemType, int quantity) { + if (quantity == 0) return; + ItemEntry e = findItem(itemType.id); if (e != null) { e.quantity += quantity; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/Loot.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/Loot.java index 057bdf86e..5f8f1cb87 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/Loot.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/item/Loot.java @@ -33,6 +33,14 @@ public final class Loot { this.items.add(l.items); } + public void add(ItemType itemType, int quantity) { + if (ItemTypeCollection.isGoldItemType(itemType.id)) { + gold += quantity; + } else { + items.addItem(itemType, quantity); + } + } + public boolean hasItemsOrExp() { return exp != 0 || hasItemsOrGold(); } @@ -61,7 +69,6 @@ public final class Loot { return false; } - public void clear() { exp = 0; gold = 0; From 0212dd6bbc8af0094e559c967de0b8fc28de03be Mon Sep 17 00:00:00 2001 From: Oskar Wiksten Date: Sat, 24 Aug 2013 14:08:05 +0200 Subject: [PATCH 4/5] Add world timers and world time (counted in number of rounds) * Increase world time each round. * Add script reward "createTimer" * Add script requirement "timerElapsed" --- .../controller/ConversationController.java | 5 +++ .../controller/GameRoundController.java | 1 + .../AndorsTrail/controller/MapController.java | 1 + .../gpl/rpg/AndorsTrail/model/WorldData.java | 41 +++++++++++++++++++ .../model/conversation/Requirement.java | 1 + .../model/conversation/Reward.java | 1 + 6 files changed, 50 insertions(+) diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java index c1950c56b..18b9ed79c 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ConversationController.java @@ -69,6 +69,9 @@ public final class ConversationController { case giveItem: addItemReward(reward.rewardID, reward.value, result); break; + case createTimer: + world.model.worldData.createTimer(reward.rewardID); + break; } } @@ -165,6 +168,8 @@ public final class ConversationController { return player.getSkillLevel(SkillCollection.SkillID.valueOf(requirement.requireID)) >= requirement.value; case killedMonster: return world.model.statistics.getNumberOfKillsForMonsterType(requirement.requireID) >= requirement.value; + case timerElapsed: + return world.model.worldData.hasTimerElapsed(requirement.requireID, requirement.value); default: return true; } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java index bfdf4a7d2..50682a739 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/GameRoundController.java @@ -80,6 +80,7 @@ public final class GameRoundController implements TimedMessageTask.Callback { gameRoundListeners.onNewRound(); } public void onNewPlayerRound() { + world.model.worldData.tickWorldTime(); controllers.actorStatsController.applyConditionsToPlayer(world.model.player, false); controllers.actorStatsController.applySkillEffectsForNewRound(world.model.player, world.model.currentMap); controllers.mapController.handleMapEvents(world.model.currentMap, world.model.player.position, MapObject.MapObjectEvaluationType.afterEveryRound); diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java index c8f6b37dc..c9c3f3cda 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MapController.java @@ -133,6 +133,7 @@ public final class MapController { m.resetTemporaryData(); } controllers.monsterSpawnController.spawnAll(world.model.currentMap, world.model.currentTileMap); + world.model.worldData.tickWorldTime(20); controllers.gameRoundController.resetRoundTimers(); } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/WorldData.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/WorldData.java index 4c18c9c88..f70be0811 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/WorldData.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/WorldData.java @@ -3,16 +3,57 @@ package com.gpl.rpg.AndorsTrail.model; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; public final class WorldData { + private long worldTime = 0; // Measured in number of game rounds + private final HashMap timers = new HashMap(); public WorldData() {} + public void tickWorldTime() { + ++worldTime; + } + public void tickWorldTime(int ticks) { + worldTime += ticks; + } + public long getWorldTime() { + return worldTime; + } + + public void createTimer(String name) { + timers.put(name, worldTime); + } + + public void removeTimer(String name) { + timers.remove(name); + } + + public boolean hasTimerElapsed(String name, long duration) { + Long v = timers.get(name); + if (v == null) return false; + return v + duration <= worldTime; + } + // ====== PARCELABLE =================================================================== public WorldData(DataInputStream src, int fileversion) throws IOException { + worldTime = src.readLong(); + final int numTimers = src.readInt(); + for(int i = 0; i < numTimers; ++i) { + final String timerName = src.readUTF(); + final long value = src.readLong(); + this.timers.put(timerName, value); + } } public void writeToParcel(DataOutputStream dest, int flags) throws IOException { + dest.writeLong(worldTime); + dest.writeInt(timers.size()); + for(Map.Entry e : timers.entrySet()) { + dest.writeUTF(e.getKey()); + dest.writeLong(e.getValue()); + } } } diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/conversation/Requirement.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/conversation/Requirement.java index 492161500..975a7aad8 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/conversation/Requirement.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/conversation/Requirement.java @@ -8,6 +8,7 @@ public final class Requirement { ,wear // Player must be wearing item(s). Items will NOT be removed when selecting reply. ,skillLevel // Player needs to have a specific skill equal to or above a certain level ,killedMonster + ,timerElapsed } public final RequirementType requireType; diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/conversation/Reward.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/conversation/Reward.java index a8d851b55..2b9ab452c 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/conversation/Reward.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/conversation/Reward.java @@ -8,6 +8,7 @@ public final class Reward { ,actorCondition ,alignmentChange ,giveItem + ,createTimer } public final RewardType rewardType; From b41fffee4464649eabcd0f2a36c696be75d5730b Mon Sep 17 00:00:00 2001 From: Oskar Wiksten Date: Tue, 27 Aug 2013 23:04:16 +0200 Subject: [PATCH 5/5] Content editor: Add support for giveItem,createTimer and timerElapsed in convs --- AndorsTrailEdit/partials/edit_dialogue.html | 29 +++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/AndorsTrailEdit/partials/edit_dialogue.html b/AndorsTrailEdit/partials/edit_dialogue.html index 770776baa..999ba3532 100644 --- a/AndorsTrailEdit/partials/edit_dialogue.html +++ b/AndorsTrailEdit/partials/edit_dialogue.html @@ -35,6 +35,8 @@ + +
@@ -79,6 +81,22 @@
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
@@ -173,6 +191,7 @@ +
@@ -231,6 +250,16 @@
+
+
+ + +
+
+ + +
+