diff --git a/build.ant.properties b/build.ant.properties index 560f723e42..78bc56d438 100644 --- a/build.ant.properties +++ b/build.ant.properties @@ -73,7 +73,7 @@ version_server = http://arianne.sourceforge.net/stendhal.version # current version of stendhal version.old = 0.87 -version = 0.87.5 +version = 0.88 # javac options javac.deprecation = true diff --git a/data/conf/zones/semos.xml b/data/conf/zones/semos.xml index c5a40fa05f..ba42af864b 100644 --- a/data/conf/zones/semos.xml +++ b/data/conf/zones/semos.xml @@ -2554,6 +2554,75 @@ Mature sheep wanted: please speak to Sato class-name="games.stendhal.server.entity.mapstuff.useable.CoalSource" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2640,20 +2729,54 @@ Mature sheep wanted: please speak to Sato class-name="games.stendhal.server.entity.mapstuff.useable.CoalSource" /> - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/sprites/outfit/detail_1.png b/data/sprites/outfit/detail_1.png index 10d1c14ec3..cdd66d3ba8 100644 Binary files a/data/sprites/outfit/detail_1.png and b/data/sprites/outfit/detail_1.png differ diff --git a/doc/CHANGES.txt b/doc/CHANGES.txt index 806c82f271..fa810f2d56 100644 --- a/doc/CHANGES.txt +++ b/doc/CHANGES.txt @@ -2,32 +2,33 @@ Changelog --------- 0.88 + +*features* - right click on a player to start trading with them using a GUI -- don't reset to townhall on minor releases -- new music in orril castle -- can have a detail layer over outfits -- new game for Semos Mine Town Revival Weeks: 9 switches -- new NPC Andy in Ados near the church -- new NPC Haunchy Meatoch on Ados market -- new NPC Florence Boullabaisse on Ados market -- new NPC Fritz on Ados market -- new NPC Barbarus in Semos Mine -- new NPC Ortiv Milquetoast in Kirdneh River House -- new fish soup maker on Ados market (Florence Boullabaisse) -- added new quest on Ados market to Haunchy Meatoch -- added new quest in the Kirdneh River House to Ortiv Milquetoast -- added more quest histories -- rest of the Wt replaced with swing - corpse and chest windows raise themselves if one with an already open window is inspected - buddies are sorted first by online status, then by name +- don't reset to townhall on minor releases - deathmatch assistant announces completion and player can directly claim victory + +*world* +- new NPC Andy in Ados near the church +- new NPC Haunchy Meatoch on Ados market with a new quest +- new NPC Florence Boullabaisse on Ados market who will make a tasty Fish Soup for you +- new NPC Fritz on Ados market +- new NPC Barbarus in Semos Mine +- new NPC Ortiv Milquetoast in Kirdneh River House with a new quest +- new fish soup maker on Ados market (Florence Boullabaisse) +- new music in Orril Castle - new items fish soup, garlic, grilled steak, coal, pick, red lionfish - coal sources for extracting coal - added garlic to Sues sales list +- new game for Semos Mine Town Revival Weeks: 9 switches *website* - animated/large NPCs like tomi and vulcanus now have an image + + 0.87.1 - fixed an issue causing the client to be unresponsive for some windows users diff --git a/libs/marauroa.jar b/libs/marauroa.jar index f62ef751c7..c88d2d1b98 100644 Binary files a/libs/marauroa.jar and b/libs/marauroa.jar differ diff --git a/runserver.bat b/runserver.bat index 50ed39d09a..2334b3d39b 100644 --- a/runserver.bat +++ b/runserver.bat @@ -1,3 +1,3 @@ -set STENDHAL_VERSION=0.87.5 +set STENDHAL_VERSION=0.88 set LOCALCLASSPATH=.;data\script;data\conf;stendhal-server-%STENDHAL_VERSION%.jar;marauroa.jar;mysql-connector.jar;log4j.jar;commons-lang.jar;h2.jar java -Xmx400m -cp "%LOCALCLASSPATH%" marauroa.server.marauroad -c server.ini -l diff --git a/runserver.sh b/runserver.sh index 5b440e85bb..1782fd3901 100644 --- a/runserver.sh +++ b/runserver.sh @@ -1,5 +1,5 @@ #!/bin/sh -STENDHAL_VERSION="0.87.5" +STENDHAL_VERSION="0.88" LOCALCLASSPATH=.:data/script/:data/conf/:stendhal-server-$STENDHAL_VERSION.jar:marauroa.jar:mysql-connector.jar:log4j.jar:commons-lang.jar:h2.jar diff --git a/src/games/stendhal/client/gui/j2DClient.java b/src/games/stendhal/client/gui/j2DClient.java index 84426764bb..31b5051247 100644 --- a/src/games/stendhal/client/gui/j2DClient.java +++ b/src/games/stendhal/client/gui/j2DClient.java @@ -290,7 +290,7 @@ public class j2DClient implements UserInterface { // Display a hint if this is a debug client if (Debug.PRE_RELEASE_VERSION != null) { - addEventLine(new HeaderLessEventLine("This is a pre release test client client: " + Debug.VERSION + " - " + Debug.PRE_RELEASE_VERSION, NotificationType.CLIENT)); + addEventLine(new HeaderLessEventLine("This is a pre release test client: " + Debug.VERSION + " - " + Debug.PRE_RELEASE_VERSION, NotificationType.CLIENT)); } // set some default window positions diff --git a/src/games/stendhal/client/update/Version.java b/src/games/stendhal/client/update/Version.java index 9c2b17506d..a868f73a70 100644 --- a/src/games/stendhal/client/update/Version.java +++ b/src/games/stendhal/client/update/Version.java @@ -10,7 +10,7 @@ package games.stendhal.client.update; public class Version { /** Version Number. */ - private static final String VERSION = "0.87.5"; + private static final String VERSION = "0.88"; /** * Extract the specified number of parts from a version-string. diff --git a/src/games/stendhal/common/Debug.java b/src/games/stendhal/common/Debug.java index 0cf63fba36..ba900bc466 100644 --- a/src/games/stendhal/common/Debug.java +++ b/src/games/stendhal/common/Debug.java @@ -26,7 +26,7 @@ public class Debug { /** version. */ // Note: This line is updated by build.xml using a regexp so be sure to adjust it in case you modify this line. - public static final String VERSION = "0.87.5"; + public static final String VERSION = "0.88"; public static final String PRE_RELEASE_VERSION = null; diff --git a/src/games/stendhal/common/Grammar.java b/src/games/stendhal/common/Grammar.java index 896ea238b5..49afed654f 100644 --- a/src/games/stendhal/common/Grammar.java +++ b/src/games/stendhal/common/Grammar.java @@ -269,7 +269,7 @@ public class Grammar { if (result.equals("meat") || result.equals("ham") || result.equals("cheese") || result.equals("wood") || result.equals("paper") || result.equals("iron") - || result.equals("chicken")) { + || result.equals("chicken") || result.equals("coal")) { result = addPrefixIfNotAlreadyThere(lowString, "piece of ", "pieces of "); } else if (result.endsWith(" ore")) { diff --git a/src/games/stendhal/server/core/engine/GenerateINI.java b/src/games/stendhal/server/core/engine/GenerateINI.java index 93f3c08605..007a2b463b 100644 --- a/src/games/stendhal/server/core/engine/GenerateINI.java +++ b/src/games/stendhal/server/core/engine/GenerateINI.java @@ -246,7 +246,7 @@ public class GenerateINI { out.println(); out.println("server_typeGame=" + gameName); out.println("server_name=" + gameName + " Marauroa server"); - out.println("server_version=0.87.5"); + out.println("server_version=0.88"); out.println("server_contact=https://sourceforge.net/tracker/?atid=514826&group_id=66537&func=browse"); out.println(); out.println("# Extensions configured on the server. Enable at will."); diff --git a/src/games/stendhal/server/core/engine/db/StendhalBuddyDAO.java b/src/games/stendhal/server/core/engine/db/StendhalBuddyDAO.java index 540f7829f9..1f0e9865f2 100644 --- a/src/games/stendhal/server/core/engine/db/StendhalBuddyDAO.java +++ b/src/games/stendhal/server/core/engine/db/StendhalBuddyDAO.java @@ -50,12 +50,13 @@ public class StendhalBuddyDAO { /** * saves the buddy list for the specified charname * + * @param transaction DBTransaction * @param charname name of char * @param buddies buddy list * @throws SQLException * @throws SQLException in case of an database error */ - private void saveBuddyList(DBTransaction transaction, String charname, Set buddies) throws SQLException { + public void saveBuddyList(DBTransaction transaction, String charname, Set buddies) throws SQLException { Set oldList = loadBuddyList(transaction, charname); Set newList = buddies; newList.add(charname); diff --git a/src/games/stendhal/server/core/engine/db/StendhalCharacterDAO.java b/src/games/stendhal/server/core/engine/db/StendhalCharacterDAO.java index dc5fadb842..fedc43f51b 100644 --- a/src/games/stendhal/server/core/engine/db/StendhalCharacterDAO.java +++ b/src/games/stendhal/server/core/engine/db/StendhalCharacterDAO.java @@ -41,7 +41,7 @@ public class StendhalCharacterDAO extends CharacterDAO { if (player instanceof Player) { final Player instance = (Player) player; DAORegister.get().get(StendhalWebsiteDAO.class).insertIntoCharStats(transaction, instance); - DAORegister.get().get(StendhalBuddyDAO.class).saveBuddyList(character, instance.getBuddies()); + DAORegister.get().get(StendhalBuddyDAO.class).saveBuddyList(transaction, character, instance.getBuddies()); } } catch (final SQLException sqle) { logger.warn("error storing character", sqle); diff --git a/src/games/stendhal/server/core/rp/StendhalQuestSystem.java b/src/games/stendhal/server/core/rp/StendhalQuestSystem.java index a6ed5b5664..967f911083 100644 --- a/src/games/stendhal/server/core/rp/StendhalQuestSystem.java +++ b/src/games/stendhal/server/core/rp/StendhalQuestSystem.java @@ -75,7 +75,6 @@ import games.stendhal.server.maps.quests.MeetMonogenes; import games.stendhal.server.maps.quests.MeetSanta; import games.stendhal.server.maps.quests.MeetZynn; import games.stendhal.server.maps.quests.MithrilCloak; -import games.stendhal.server.maps.quests.MixtureForOrtiv; import games.stendhal.server.maps.quests.NewsFromHackim; import games.stendhal.server.maps.quests.ObsidianKnife; import games.stendhal.server.maps.quests.PaperChase; @@ -202,7 +201,7 @@ public class StendhalQuestSystem { loadQuest(new MeetSanta()); loadQuest(new MeetZynn()); loadQuest(new MithrilCloak()); - loadQuest(new MixtureForOrtiv()); +// loadQuest(new MixtureForOrtiv()); loadQuest(new NewsFromHackim()); loadQuest(new ObsidianKnife()); loadQuest(new PizzaDelivery()); diff --git a/src/games/stendhal/server/entity/item/Dice.java b/src/games/stendhal/server/entity/item/Dice.java index bbabb1864a..292079ea9d 100644 --- a/src/games/stendhal/server/entity/item/Dice.java +++ b/src/games/stendhal/server/entity/item/Dice.java @@ -104,10 +104,13 @@ public class Dice extends Item { /** * Throw the dice. */ - private void randomize() { + void randomize() { topFaces = new int[NUMBER_OF_DICE]; for (int i = 0; i < NUMBER_OF_DICE; i++) { - final int topFace = Rand.roll1D6(); + int topFace = Rand.roll1D6(); + if (topFace == 6) { + topFace = Rand.roll1D6(); + } topFaces[i] = topFace; } } diff --git a/src/games/stendhal/server/entity/mapstuff/useable/CoalSource.java b/src/games/stendhal/server/entity/mapstuff/useable/CoalSource.java index 369e7bb334..394ee47623 100644 --- a/src/games/stendhal/server/entity/mapstuff/useable/CoalSource.java +++ b/src/games/stendhal/server/entity/mapstuff/useable/CoalSource.java @@ -155,8 +155,8 @@ public class CoalSource extends PlayerActivityEntity { private void handleRespawn() { if (getState() == 0) { final int time = Rand.randExponential(6000); - int turn = Math.max(time, 200); - TurnNotifier.get().notifyInSeconds(turn, new Refiller()); + int turn = Math.max(time, 6000); + TurnNotifier.get().notifyInTurns(turn, new Refiller()); } } diff --git a/src/games/stendhal/server/maps/ados/city/ManWithHatNPC.java b/src/games/stendhal/server/maps/ados/city/ManWithHatNPC.java index d981ceb23a..198ecfe3df 100644 --- a/src/games/stendhal/server/maps/ados/city/ManWithHatNPC.java +++ b/src/games/stendhal/server/maps/ados/city/ManWithHatNPC.java @@ -57,12 +57,12 @@ public class ManWithHatNPC implements ZoneConfigurator { @Override protected void createDialog() { - addGreeting("Sniff!"); - addHelp("When I lived together with my beloved wife, we used to travell a lot. We loved the beach on Athor Island! *Sigh* These memories are making me even more sad...Please, leave me alone now..."); - addQuest("I am too old and too sad to think about jobs for others...*sniff-sniff*"); - addJob("*Cry* I had to stop working after my wife died..."); - addOffer("Nothing, I lost my darling!"); - addGoodbye("Buuaaahaaaahaa!"); + addGreeting("Hello."); + addHelp("When I lived together with my beloved wife, we used to travel a lot. We loved the beach on Athor Island! But these memories make me sad now."); + addQuest("I am too old to think about jobs for others..."); + addJob("I stopped working after my wife died."); + addOffer("I have nothing to offer you."); + addGoodbye("Goodbye, thank you for talking with me."); } }; diff --git a/src/games/stendhal/server/maps/ados/market/BBQGrillmasterNPC.java b/src/games/stendhal/server/maps/ados/market/BBQGrillmasterNPC.java index 340316119a..d94db9e13a 100644 --- a/src/games/stendhal/server/maps/ados/market/BBQGrillmasterNPC.java +++ b/src/games/stendhal/server/maps/ados/market/BBQGrillmasterNPC.java @@ -60,9 +60,9 @@ public class BBQGrillmasterNPC implements ZoneConfigurator { @Override protected void createDialog() { - addGreeting("Hey! Isn't it a nice day for having a BBQ?"); - addHelp("Unfortunetly the steaks aren't ready yet... If you are hungry and can't wait, you could check some offers in the near out like the Blacksheep offers near the fisherhuts in Ados or you can take a ferry to Athor for getting some nice snacks..."); - addJob("I am a grillmaster as you can prolly see. I love the smell of fresh grilled meat!"); + addGreeting("Hey! Nice day for a BBQ!"); + addHelp("Unfortunately the steaks aren't ready yet... If you are hungry and can't wait, you could check some offers in the near out like the Blacksheep offers near the fisherhuts in Ados or you can take a ferry to Athor for getting some nice snacks..."); + addJob("I am a grillmaster as you can probably see. I love the smell of fresh grilled meat!"); addOffer("I hope that my steaks will be ready soon. Please be a bit patient or have some other snacks first."); addGoodbye("A nice day to you! Always keep your fire burning!"); diff --git a/src/games/stendhal/server/maps/ados/market/FishSoupMakerNPC.java b/src/games/stendhal/server/maps/ados/market/FishSoupMakerNPC.java index 5d983ea2fb..9f9d379785 100644 --- a/src/games/stendhal/server/maps/ados/market/FishSoupMakerNPC.java +++ b/src/games/stendhal/server/maps/ados/market/FishSoupMakerNPC.java @@ -56,7 +56,7 @@ public class FishSoupMakerNPC implements ZoneConfigurator { @Override protected void createDialog() { //addGreeting(); - addHelp("I can cook a really tasty fish soup for you but if you are not into fish, I can suggest a good friend of mine to you, Old Mother Helena in Fado. She makes the best vegetable soups in whole Faiumoni!"); + addHelp("I can cook a really tasty fish soup for you but if you are not into fish, I can suggest a good friend of mine to you, Old Mother Helena in Fado. She makes the best vegetable soup in the whole of Faiumoni!"); addQuest("I don't have any quests for you, but I can offer you some fresh made fish soup for your travels."); addJob("I am a trained cook but specialized into soups. My most favourite soup is a fish soup but I also like normal ones..."); diff --git a/src/games/stendhal/server/maps/ados/market/OldFishermanNPC.java b/src/games/stendhal/server/maps/ados/market/OldFishermanNPC.java index d2fa3da7d1..206a428421 100644 --- a/src/games/stendhal/server/maps/ados/market/OldFishermanNPC.java +++ b/src/games/stendhal/server/maps/ados/market/OldFishermanNPC.java @@ -63,11 +63,14 @@ public class OldFishermanNPC implements ZoneConfigurator { @Override protected void createDialog() { addGreeting("Ahoy!"); - addHelp("Harr my friend, my whole life long I was sitting in a boat, trying to catch some fish... The feeling you have when fishies hang on your rod is awesome! Did you ever try to catch some by yourself? You can ask my friend Santiago for help, he lives in a fisherhut somewhere in the city!"); - + addHelp("Harr my friend, my #whole #life long I was sitting in a boat, trying to catch some fish..."); + addReply("whole life","The feeling you have when fish hang on your rod is awesome! Did you ever try to catch some by #yourself?"); + addReply("yourself", "You can ask my friend Santiago for help, he lives in a hut somewhere in the city!"); addQuest("Ahoy Matey! I don't have any tasks for you but others do!"); - addJob("I am a fisherman. For many, many years I went fishing every day. There have been dangerous storms I had to get over and some reeeeeally big fish which almost drown my ship, but of course I always was able to catch them! Hehe! I hope that I will be able to deliver some fish to the market one time..."); - addOffer("My fishing places on the sea are catched by some ugly storm I can't drive out at the moment. Sorry matey, I can't offer you anything at the moment..."); + addJob("I am a fisherman. For many, many years I went fishing every day. There have been dangerous storms I had to get through and some reeeeeally big fish which almost drown my ship, but of course I always was able to #catch them!"); + addReply("catch","Hehe! I hope that I will be able to deliver some fish to the market one time..."); + addOffer("My fishing places on the sea are caught in some ugly #storm so I can't venture out at the moment."); + addReply("storm", "The huge storm nearly destroyed my boat! Sorry matey, I can't offer you anything at the moment..."); addGoodbye("See you, matey! And be careful there on this slippy ground!"); } diff --git a/src/games/stendhal/server/maps/kirdneh/river/RetiredTeacherNPC.java b/src/games/stendhal/server/maps/kirdneh/river/RetiredTeacherNPC.java index 37a64091bf..c100b52283 100644 --- a/src/games/stendhal/server/maps/kirdneh/river/RetiredTeacherNPC.java +++ b/src/games/stendhal/server/maps/kirdneh/river/RetiredTeacherNPC.java @@ -74,17 +74,17 @@ public class RetiredTeacherNPC implements ZoneConfigurator { @Override protected void createDialog() { - addGreeting("Ohh a stranger found my hidden house, welcome!"); + addGreeting("Ohh, a stranger found my hidden house, welcome!"); addHelp("Never ever get into trouble with assassins when they are stronger than you! They will come to get you otherwise! And some of them are waiting downstairs under my basement!"); - addJob("I was a teacher for alchemy once but some of my students turned into ugly bandits and assassins... I don't know what happens in Faiumoni at the moment as though as I just stay in my save house the whole day long..."); - addOffer("Sorry, but I can't offer you anything... I have some mayor problems in my basement at the moment..."); + addJob("I was a teacher for alchemy once but some of my students turned into ugly bandits and assassins... I don't know what happens in Faiumoni at the moment, though, as I just stay in my safe house the whole day long..."); + addOffer("Sorry, but I can't offer you anything... I have some major problems in my basement at the moment..."); addQuest("I want to prepare a mixture for keeping the assassins and bandits in my cellar. I could need some ingredients for that soon..."); - addGoodbye("Take care of you and please be fast with visiting me again, I'm scared alone!"); + addGoodbye("Take care of yourself and please return soon to visit me again, I'm scared alone!"); } }; - npc.setDescription("You see Ortiv Milquetoast. Although he has some kind of teacher aura around him, he seems to be quite scared and nervous."); + npc.setDescription("You see Ortiv Milquetoast. Though he has some kind of teacher aura around him, he seems to be quite scared and nervous."); npc.setEntityClass("retiredteachernpc"); npc.setPosition(15, 28); npc.setDirection(Direction.RIGHT); diff --git a/src/games/stendhal/server/maps/quests/CoalForHaunchy.java b/src/games/stendhal/server/maps/quests/CoalForHaunchy.java index 2618bc0b0a..d79a0e786f 100644 --- a/src/games/stendhal/server/maps/quests/CoalForHaunchy.java +++ b/src/games/stendhal/server/maps/quests/CoalForHaunchy.java @@ -78,6 +78,8 @@ public class CoalForHaunchy extends AbstractQuest { private void offerQuestStep() { final SpeakerNPC npc = npcs.get("Haunchy Meatoch"); + + // player says quest when he has not ever done the quest before (rejected or just new) npc.add(ConversationStates.ATTENDING, ConversationPhrases.QUEST_MESSAGES, new QuestNotStartedCondition(QUEST_SLOT), @@ -93,7 +95,7 @@ public class CoalForHaunchy extends AbstractQuest { "Coal isn't easy to find. You normally can find it somewhere in the ground but perhaps you are lucky and find some in the old Semos Mine tunnels...", null); - + // player has completed the quest (doesn't happen here) npc.add(ConversationStates.ATTENDING, ConversationPhrases.QUEST_MESSAGES, new QuestCompletedCondition(QUEST_SLOT), @@ -101,19 +103,21 @@ public class CoalForHaunchy extends AbstractQuest { "I can go on with grilling my tasty steaks now! Thank you!", null); + // player asks about quest which he has done already and he is allowed to repeat it npc.add(ConversationStates.ATTENDING, ConversationPhrases.QUEST_MESSAGES, new AndCondition(new TimePassedCondition(QUEST_SLOT, 1, REQUIRED_MINUTES), new QuestStateStartsWithCondition(QUEST_SLOT, "waiting;")), ConversationStates.QUEST_OFFERED, "The last coal you brought me is mostly gone again. Will you bring me some more?", null); - + + // player asks about quest which he has done already but it is not time to repeat it npc.add(ConversationStates.ATTENDING, ConversationPhrases.QUEST_MESSAGES, new AndCondition(new NotCondition(new TimePassedCondition(QUEST_SLOT, 1, REQUIRED_MINUTES)), new QuestStateStartsWithCondition(QUEST_SLOT, "waiting;")), ConversationStates.ATTENDING, null, - new SayTimeRemainingAction(QUEST_SLOT, 1, REQUIRED_MINUTES, "The coal amount behind my counter is still high enough. I will not need more for at least ")); + new SayTimeRemainingAction(QUEST_SLOT, 1, REQUIRED_MINUTES, "The coal amount behind my counter is still high enough. I will not need more for ")); // Player agrees to get the coal npc.add(ConversationStates.QUEST_OFFERED, @@ -142,9 +146,10 @@ public class CoalForHaunchy extends AbstractQuest { triggers.add("stone coal"); triggers.addAll(ConversationPhrases.QUEST_MESSAGES); + // player asks about quest or says coal when they are supposed to bring some coal and they have it npc.add( ConversationStates.ATTENDING, triggers, - new AndCondition(new QuestInStateCondition(QUEST_SLOT, "start"), new PlayerHasItemWithHimCondition("coal",10)), + new AndCondition(new QuestInStateCondition(QUEST_SLOT, "start"), new PlayerHasItemWithHimCondition("coal",25)), ConversationStates.ATTENDING, null, new MultipleActions( @@ -164,17 +169,18 @@ public class CoalForHaunchy extends AbstractQuest { } })); - + // player asks about quest or says coal when they are supposed to bring some coal and they don't have it npc.add( ConversationStates.ATTENDING, triggers, - new AndCondition(new QuestInStateCondition(QUEST_SLOT, "start"), new NotCondition(new PlayerHasItemWithHimCondition("coal",10))), + new AndCondition(new QuestInStateCondition(QUEST_SLOT, "start"), new NotCondition(new PlayerHasItemWithHimCondition("coal",25))), ConversationStates.ATTENDING, "You don't have the coal amount which I need yet. Go and pick some more pieces up, please.", null); - + npc.add( - ConversationStates.ATTENDING, triggers, - new QuestNotInStateCondition(QUEST_SLOT, "start"), + ConversationStates.ATTENDING, + Arrays.asList("coal","stone coal"), + new QuestNotInStateCondition(QUEST_SLOT,"start"), ConversationStates.ATTENDING, "Sometime you could do me a #favour ...", null); @@ -204,10 +210,10 @@ public class CoalForHaunchy extends AbstractQuest { res.add("He asked me to fetch him some pieces of coal but I don't have time to collect some."); } if (player.isQuestInState(QUEST_SLOT, "start") || isCompleted(player)) { - res.add("The BBQ grill-heat is low and I promised Haunchy to help him out with 10 pieces of coal."); + res.add("The BBQ grill-heat is low and I promised Haunchy to help him out with 25 pieces of coal."); } - if (("start".equals(questState) && player.isEquipped("coal",10)) || isCompleted(player)) { - res.add("I found 10 pieces of coal for the Haunchy and think he will be happy."); + if (("start".equals(questState) && player.isEquipped("coal",25)) || isCompleted(player)) { + res.add("I found 25 pieces of coal for the Haunchy and think he will be happy."); } if (isCompleted(player)) { if (isRepeatable(player)) { diff --git a/src/games/stendhal/server/maps/quests/FishSoup.java b/src/games/stendhal/server/maps/quests/FishSoup.java index c93d280d48..6516cc658d 100644 --- a/src/games/stendhal/server/maps/quests/FishSoup.java +++ b/src/games/stendhal/server/maps/quests/FishSoup.java @@ -129,7 +129,7 @@ public class FishSoup extends AbstractQuest { ConversationPhrases.GREETING_MESSAGES, new QuestNotStartedCondition(QUEST_SLOT), ConversationStates.INFORMATION_1, - "Hello and welcome on Ados market! Are you intersted in something #tasty?", + "Hello and welcome on Ados market! I have something really tasty and know what would #revive you.", null); // player returns after finishing the quest (it is repeatable) after the @@ -152,9 +152,9 @@ public class FishSoup extends AbstractQuest { new SayTimeRemainingAction(QUEST_SLOT, 1, REQUIRED_MINUTES , "Oh I am sorry, I have to wash my cooking pots first before making more soup for you. Please come back in") ); - // player responds to word 'tasty' + // player responds to word 'revive' npc.add(ConversationStates.INFORMATION_1, - "tasty", + "revive", new QuestNotStartedCondition(QUEST_SLOT), ConversationStates.QUEST_OFFERED, null, diff --git a/src/games/stendhal/server/maps/quests/piedpiper/AwaitingPhase.java b/src/games/stendhal/server/maps/quests/piedpiper/AwaitingPhase.java index d6745bc76e..f055e200de 100644 --- a/src/games/stendhal/server/maps/quests/piedpiper/AwaitingPhase.java +++ b/src/games/stendhal/server/maps/quests/piedpiper/AwaitingPhase.java @@ -126,29 +126,29 @@ public class AwaitingPhase extends TPPQuest { private void fillConversations() { //piper - conversations.add("Hi Mayor. For what you called me here?"); + conversations.add("Good day, Mayor Chalmers. What did you call me here for?"); //mayor - conversations.add("Hello, very glad to see our respectable hero here. Who didnt hear about you, there is almost..."); + conversations.add("Hello, very glad to see our respectable hero here. Who hasn't heard about you, there is almost..."); //piper - conversations.add("Talk about your business to me, my time costs a much of moneys."); + conversations.add("Please talk about your business to me, my time is precious."); //mayor - conversations.add("... ok, what I talked about? Ah yes, our city have a little problem with #rats."); + conversations.add("... ok, what was I saying? Ah yes, our city has a little problem with #rats."); //piper conversations.add("Again?"); //mayor - conversations.add("Yes, these animals are of course too stupid to remember a lesson they have a few time ago."); + conversations.add("Yes, these animals are too stupid to remember a lesson they learnt only recently."); //piper - conversations.add("No problem, if you are ready to pay."); + conversations.add("I can help, if you are ready to pay."); //mayor - conversations.add("City have no other way to eliminate this source of infections. I will pay to you."); + conversations.add("Ados City has no other way to eliminate this nuisance. We will pay you."); //piper conversations.add("Do you know my usual price?"); //mayor conversations.add("Yes, I have it written somewhere in my papers."); //piper - conversations.add("Good. I will return for my reward soon, prepare it."); + conversations.add("Good. I will return for my reward soon, please prepare it."); //mayor - conversations.add("Dont worry, how can I break your trustworth to me and my city?"); + conversations.add("Don't worry, how can I break your trust in me and my city?"); } /** @@ -167,8 +167,8 @@ public class AwaitingPhase extends TPPQuest { private void setupDialog() { if(mayor.isTalking()) { mayor.say("Sorry, "+mayor.getAttending().getName()+ - " but i see that our city's saver here. I have to speak with him quickly."+ - " Please speak with me again after finish of our talking."); + " but I see that our city's savoiur is here. I have to speak with him quickly."+ + " Please speak with me again after we finish talking."); mayor.setCurrentState(ConversationStates.IDLE); }; mayor.setCurrentState(ConversationStates.ATTENDING); @@ -205,7 +205,7 @@ public class AwaitingPhase extends TPPQuest { return; }; TurnNotifier.get().dontNotify(this); - TurnNotifier.get().notifyInSeconds(4, this); + TurnNotifier.get().notifyInSeconds(8, this); } } @@ -253,8 +253,8 @@ public class AwaitingPhase extends TPPQuest { public String getSwitchingToNextPhaseMessage() { final String text = "Mayor Chalmers shouts: Thankfully, all the #rats are gone now, " + - "the Pied Piper hypnotized them and led them away to dungeons. "+ - "Those of you, who helped Ados City with the rats problem, "+ + "the Pied Piper hypnotized them and led them away to the dungeons. "+ + "Those of you who helped Ados City with the rats problem "+ "can get your #reward now."; return text; } diff --git a/src/games/stendhal/server/maps/quests/piedpiper/InvasionPhase.java b/src/games/stendhal/server/maps/quests/piedpiper/InvasionPhase.java index b25f001959..906493ff49 100644 --- a/src/games/stendhal/server/maps/quests/piedpiper/InvasionPhase.java +++ b/src/games/stendhal/server/maps/quests/piedpiper/InvasionPhase.java @@ -165,7 +165,7 @@ public class InvasionPhase extends TPPQuest { */ public String getSwitchingToNextPhaseMessage() { final String text = - "Mayor Chalmers shouts: Suddenly, #rats have captured city, "+ + "Mayor Chalmers shouts: Suddenly, #rats have captured the city, "+ //"Mayor Chalmers shouts: The #rats left as suddenly as they arrived. "+ //"Perhaps they have returned to the sewers. "+ "I now need to call the Pied Piper, a rat exterminator. "+ @@ -202,7 +202,7 @@ public class InvasionPhase extends TPPQuest { */ protected String ratsProblem() { final String text = "Mayor Chalmers shouts: Ados City is being invaded by #rats!"+ - " Anyone who will help to clean up city, will be rewarded!"; + " Anyone who will help to clean up the city, will be rewarded!"; return(text); } diff --git a/stendhal.jnlp b/stendhal.jnlp index 24bdb6867a..1ebdf08ac0 100644 --- a/stendhal.jnlp +++ b/stendhal.jnlp @@ -22,7 +22,7 @@ Some of these people are NPC, they will give you tasks to accomplish and hints t - + diff --git a/tiled/Level 0/ados/city_n2.tmx b/tiled/Level 0/ados/city_n2.tmx index 4529333274..3df5806601 100644 --- a/tiled/Level 0/ados/city_n2.tmx +++ b/tiled/Level 0/ados/city_n2.tmx @@ -1,6 +1,5 @@ - - - + + @@ -141,27 +140,27 @@ - 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