Virtual D-pad (thanks to Samuel)

Movement even when holding the same spot (thanks to Samuel)
Movement aggressiveness, not enabled yet (thanks to Samuel)
Restructured resourceloader to use external file as list of what resources to load
Renamed resource files to indicate what files can be translated
Updated German translation (thanks to Samuel)
Updated French translation (thanks to Misty Soul)

git-svn-id: https://andors-trail.googlecode.com/svn/trunk@120 08aca716-68be-ccc6-4d58-36f5abd142ac
This commit is contained in:
oskar.wiksten
2011-07-08 12:31:21 +00:00
parent 50477db962
commit 83f0834c93
47 changed files with 1503 additions and 1093 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@@ -64,4 +64,11 @@
android:gravity="right"
/>
<com.gpl.rpg.AndorsTrail.view.VirtualDpadView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/main_virtual_dpad"
android:visibility="gone"
/>
</RelativeLayout>

View File

@@ -20,8 +20,8 @@
<string name="dialog_loading_message">Lade Ressourcen...</string>
<string name="dialog_loading_failed_title">Laden fehlgeschlagen</string>
<string name="dialog_loading_failed_message">Der Spielstand konnte nicht geladen werden.\n\n:(\n\nDie Datei könnte beschädigt oder unvollständig sein.</string>
<string name="dialog_loading_failed_incorrectversion">Der Spielstand konnte nicht geladen werden. Die Datei wurde mit einer neueren Programmversion erstellt.</string>
<string name="dialog_loading_failed_message">Der Spielstand konnte nicht aus der Datei geladen werden.\n\n:(\n\nDie Datei könnte beschädigt oder unvollständig sein.</string>
<string name="dialog_loading_failed_incorrectversion">Der Spielstand konnte nicht aus der Datei geladen werden. Die Datei wurde mit einer neueren Programmversion erstellt.</string>
<string name="dialog_close">Schließen</string>
@@ -36,7 +36,7 @@
<string name="dialog_monsterencounter_message">Angreifen?\nSchwierigkeit: %1$s</string>
<string name="dialog_monsterencounter_info">Info</string>
<string name="status_hp">LP:</string>
<string name="status_hp">HP:</string>
<string name="status_mp">MP:</string>
<string name="status_ap">AP:</string>
<string name="status_exp">Erf.:</string>
@@ -65,15 +65,15 @@
<string name="combat_begin_flee">Du kannst nun aus dem Kampf flüchten indem du in die gewünschten Fluchtrichtung klickst.</string>
<string name="combat_flee_failed">Die Flucht ist misslungen!</string>
<string name="combat_status_ap">AP: %1$d</string>
<string name="combat_monsterhealth">LP:</string>
<string name="combat_monsterhealth">HP:</string>
<string name="combat_monsteraction">%1$s greift an.</string>
<!-- <string name="combat_cannotexitcombat">Du kannst den Kampf nicht verlassen, weil noch Gegner in der Nähe sind.Du musst dich zunächst auf ein Feld bewegen, wo dich die Gegner nicht mehr erreichen können.</string> -->
<!-- <string name="combat_cannotexitcombat">Du kannst den Kampf nicht verlassen, weil noch Gegner in der Nähe sind. Du musst dich zunächst auf ein Feld bewegen, wo dich die Gegner nicht mehr erreichen können.</string> -->
<string name="combat_result_monstermiss">%1$s verfehlt!</string>
<string name="combat_result_monsterhit">%1$s trifft dich und nimmt dir %2$d LP!</string>
<string name="combat_result_monsterhitcritical">%1$s muss einen kritischen Treffer einstecken (%2$d LP)!</string>
<string name="combat_result_monsterhit">%1$s trifft dich und nimmt dir %2$d HP!</string>
<string name="combat_result_monsterhitcritical">%1$s muss einen kritischen Treffer einstecken (%2$d HP)!</string>
<string name="combat_result_heromiss">Dein Angriff schlug fehl.</string>
<string name="combat_result_herohit">Du triffst %1$s (%2$d LP)!</string>
<string name="combat_result_herohitcritical">Dein kritischer Treffer kostet %1$s %2$d LP!</string>
<string name="combat_result_herohit">Du triffst %1$s (%2$d HP)!</string>
<string name="combat_result_herohitcritical">Dein kritischer Treffer kostet %1$s %2$d HP!</string>
<string name="combat_result_herokillsmonster">%1$s ist besiegt!</string>
<string name="combat_not_enough_ap">Es sind nicht mehr genug AP in dieser Runde übrig.</string>
<string name="combat_hero_dies">Du wirst bewusstlos, wachst aber glücklicherweise lebendig wieder auf. Du verlierst %1$d Erfahrungspunkte.</string>
@@ -83,9 +83,9 @@
<string name="inventory_unequip">Ablegen</string>
<string name="inventory_use">Benutzen</string>
<string name="inventory_drop">Fallen lassen</string>
<string name="inventory_item_used">%1$s benutzt.</string>
<string name="inventory_item_dropped">%1$s weggeworfen.</string>
<string name="inventory_item_equipped">%1$s angelegt.</string>
<string name="inventory_item_used">Du hast %1$s benutzt.</string>
<string name="inventory_item_dropped">Du hast %1$s fallen gelassen.</string>
<string name="inventory_item_equipped">Du hast %1$s angelegt.</string>
<string name="dialog_loot_pickall">Alles einsammeln</string>
<string name="dialog_loot_foundgold">Du findest %1$d Gold. </string>
@@ -173,7 +173,7 @@
<string name="levelup_title">Aufsteigen</string>
<string name="levelup_description">Du hast Level %1$d erreicht!</string>
<string name="levelup_buttontext">Aufsteigen</string>
<string name="levelup_add_health">Lebenspunkte erhöhen (+%1$d LP)</string>
<string name="levelup_add_health">Lebenspunkte erhöhen (+%1$d HP)</string>
<string name="levelup_add_health_description">Fügt den maximalen Lebenspunkten %1$d Punkte hinzu.</string>
<string name="levelup_add_attackchance">Angriffschance erhöhen (+%1$d %%)</string>
<string name="levelup_add_attackchance_description">Fügt %1$d%% zur Basis-Angriffschance hinzu.</string>
@@ -276,7 +276,7 @@
<string name="preferences_movementmethod">Methode für die Fortbewegung und Behandlung von Hindernissen.</string>
<string-array name="preferences_movementmethods">
<item>Direkt (original)</item>
<item>Gerichtet</item>
<item>Hindernisse umgehen</item>
</string-array>
<string-array name="preferences_movementmethod_values">
<item>0</item>
@@ -299,13 +299,13 @@
<string name="iteminfo_effect_works_when_used">bei Anwendung</string>
<string name="iteminfo_effect_works_when_equipped">solange angelegt</string>
<string name="iteminfo_effect_decrease_current_hp">entzieht %1$s LP</string>
<string name="iteminfo_effect_increase_current_hp">gibt %1$s LP zurück</string>
<string name="iteminfo_effect_decrease_current_hp">entzieht %1$s HP</string>
<string name="iteminfo_effect_increase_current_hp">gibt %1$s HP zurück</string>
<string name="iteminfo_effect_decrease_current_ap">entzieht %1$s AP</string>
<string name="iteminfo_effect_increase_current_ap">gibt %1$s AP zurück</string>
<string name="iteminfo_effect_increase_max_hp">erhöht max. LP +%1$d</string>
<string name="iteminfo_effect_decrease_max_hp">verringert max. LP um %1$d</string>
<string name="iteminfo_effect_increase_max_hp">erhöht max. HP +%1$d</string>
<string name="iteminfo_effect_decrease_max_hp">verringert max. HP um %1$d</string>
<string name="iteminfo_effect_increase_max_ap">erhöht max. AP +%1$d</string>
<string name="iteminfo_effect_decrease_max_ap">verringert max. AP um %1$d</string>
<string name="iteminfo_effect_increase_movecost">Bewegungsstrafe +%1$d AP</string>

View File

@@ -10,14 +10,14 @@
{mikhail_default|Puis-je faire quelque chose d\'autre pour t\'aider ?|||{{As-tu d\'autres tâches à me confier ?|mikhail_tasks||||}{Pourrais-tu m\'en dire plus au sujet d\'Andor ?|mikhail_andor1||||}}|};
{mikhail_tasks|Ah oui, tu pourrais m\'aider à faire deux-trois choses. Le pain et les rats. Par quoi veux-tu commencer ?|||{{Que veux-tu dire au sujet du pain ?|mikhail_bread_select||||}{Que veux-tu dire au sujet des rats ?|mikhail_rats_select||||}{Qu\'importe, parlons d\'autre chose.|mikhail_default||||}}|};
{mikhail_andor1|Comme je te le disais, Andor est sorti hier et n\'est pas revenu depuis lors. Je commence à m\'inquiéter à son sujet. S\'il te plait, part à sa recherche, il a dit qu\'il n\'en aurait pas pour très longtemps.|||{{N|mikhail_andor2||||}}|};
{mikhail_andor2|Peut-être est-il allé dans la caverne qui sert de résrve et est resté coincé. Il peut aussi être allé s\'entrainer encore avec son épée en bois dans la maison de Leta. S\'il te plait, pars à sa recherche au village.|||{{N|mikhail_default||||}}|};
{mikhail_andor2|Peut-être est-il allé dans la caverne qui sert de réserve et est resté coincé. Il peut aussi être allé s\'entrainer encore avec son épée en bois dans la maison de Leta. S\'il te plait, pars à sa recherche au village.|||{{N|mikhail_default||||}}|};
{mikhail_bread_select||||{{|mikhail_bread_complete2|mikhail_bread:100|||}{|mikhail_bread_continue|mikhail_bread:10|||}{|mikhail_bread_start||||}}|};
{mikhail_bread_start|Ah, j\'ai failli oublier. si tu as le temps, pourrait tu aller chez Mara à la halle du village pour m\'acheter un peu de pain.|mikhail_bread:10||{{N|mikhail_default||||}}|};
{mikhail_bread_start|Ah, j\'ai failli oublier. Si tu as le temps, pourrais-tu aller chez Mara à la halle du village pour m\'acheter un peu de pain.|mikhail_bread:10||{{N|mikhail_default||||}}|};
{mikhail_bread_continue|M\'as tu trouvé du pain chez Mara à la halle du village ?|||{{Oui, le voilà.|mikhail_bread_complete||bread|1|}{Non, pas encore.|mikhail_default||||}}|};
{mikhail_bread_complete|Merci beaucoup, je vais pouvoir prendre mon petit déeuner. Voici quelques pièces pour ton aide.|mikhail_bread:100|gold20|{{N|mikhail_default||||}}|};
{mikhail_bread_complete|Merci beaucoup, je vais pouvoir prendre mon petit déjeuner. Voici quelques pièces pour ton aide.|mikhail_bread:100|gold20|{{N|mikhail_default||||}}|};
{mikhail_bread_complete2|Merci de m\'avoir rapporté le pain tout à l\'heure.|||{{De rien.|mikhail_default||||}}|};
{mikhail_rats_select||||{{|mikhail_rats_complete2|mikhail_rats:100|||}{|mikhail_rats_continue|mikhail_rats:10|||}{|mikhail_rats_start||||}}|};
{mikhail_rats_start|J\'au vu quelques rats dans le jardin tout à l\'heure. Pourrais-tu nous débarasse de tous ceux que tu trouves ?|mikhail_rats:10||{{Je me suis déjà occupé des rats.|mikhail_rats_complete||tail_trainingrat|2|}{D\'accord, je vais aller voir au jardin.|mikhail_rats_start2||||}}|};
{mikhail_rats_start|J\'ai vu quelques rats dans le jardin tout à l\'heure. Pourrais-tu nous débarasser de tous ceux que tu trouves ?|mikhail_rats:10||{{Je me suis déjà occupé des rats.|mikhail_rats_complete||tail_trainingrat|2|}{D\'accord, je vais aller voir au jardin.|mikhail_rats_start2||||}}|};
{mikhail_rats_start2|Si les rats te blessent, reviens ici et repose toi dans le lit. Tu pourras ainsi recouvrer toutes tes forces.|||{{N|mikhail_rats_start3||||}}|};
{mikhail_rats_start3|Au fait n\'oublie pas de faire l\'inventaire de ton équipement. Tu as probablement toujours le vieil anneau que je t\'avais donné. N\'oublie pas de le porter.|||{{Très bien, je comprends. Je peux me reposer ici si je suis blessé, et je dois vérifier mon inventaire pour tous les objets utiles que je peux avoir.|mikhail_default||||}}|};
{mikhail_rats_continue|As-tu tué les deux rats du jardin ?|||{{Oui, je m\'en suis occupé.|mikhail_rats_complete||tail_trainingrat|2|}{Non, pas encore.|mikhail_default||||}}|};
@@ -30,8 +30,8 @@
{leta1|Hé, c\'est ma maison, sors de là !|||{{Mais j\'étais juste ...|leta2||||}{Que se passe-t-il avec votre mari Oromir ?|leta_oromir_select||||}}|};
{leta2|File, gamin, sors de ma maison !|||{{Que se passe-t-il avec votre mari Oromir ?|leta_oromir_select||||}}|};
{leta_oromir_select||||{{|leta_oromir_complete2|leta:100|||}{|leta_oromir1||||}}|};
{leta_oromir1|Tu as appri quelques chose au sujet de mon mari ? Il devait m\'aider à la ferme aujourd\'hui, mais comme d\'habitude il n\'est pas là.\nPffff.|||{{Je ne sais pas.|leta_oromir2||||}{Oui, je l\'ai trouvé. Il se cache dans le bosquet à l\'Est.|leta_oromir_complete|leta:20|||}}|};
{leta_oromir2|si tu le vois, dis-lui de rappliquer vite et de m\'aider à m\'occuper de la maison.\nEt maintenant, file !|leta:10|||};
{leta_oromir1|Tu as appris quelque chose au sujet de mon mari ? Il devait m\'aider à la ferme aujourd\'hui, mais comme d\'habitude il n\'est pas là.\nPffff.|||{{Je ne sais pas.|leta_oromir2||||}{Oui, je l\'ai trouvé. Il se cache dans le bosquet à l\'Est.|leta_oromir_complete|leta:20|||}}|};
{leta_oromir2|Si tu le vois, dis-lui de rappliquer vite et de m\'aider à m\'occuper de la maison.\nEt maintenant, file !|leta:10|||};
{leta_oromir_complete|Il se cache ? Ce n\'est pas étonnant. Je vais aller le chercher et lui montrer qui est le chef ici.\nMerci du renseignement.|leta:100|||};
{leta_oromir_complete2|Merci de m\'avoir indiqué où se cachait Oromir tout à l\'heure. Je vais aller le chercher dans une minute.||||};
{oromir1|Oh, tu m\as fait peur.\nBonjour.|||{{Hello|oromir2||||}}|};
@@ -40,18 +40,18 @@
<string name="conversationlist_crossglen">
[id|message|progressQuest|rewardDropListID|replies[text|nextPhraseID|requires_Progress|requires_itemID|requires_Quantity|]|];
{audir1|Bienvenue dans mon échope !\n\nVeuillez prendre la peine de regarder tous mes articles.|||{{Montrez-moi vos articles s\'il-vous-plait.|S||||}}|};
{audir1|Bienvenue dans mon échope !\n\nVeuillez prendre la peine de regarder tous mes articles.|||{{Montrez-moi vos articles s\'il vous plait.|S||||}}|};
{arambold1|Nom d\'un chien, pourrais-je jamais dormir avec des ivrognes qui chantent ainsi ?\n\nQuelqu\'un devrait s\'en occuper.|||{{Puis-je me reposer ici ?|arambold2||||}{Avez-vous quelque chose à marchander ?|S||||}}|};
{arambold2|Bien sûr gamin,tu peux te reposer ici.\n\nPrends le lit que tu veux.|||{{Merci, au revoir|X||||}}|};
{drunk1|Et glou, et glou, et glou, buvons encore !\nBois, bois, bois jusqu\'à ce que tu roule par terre.\n\nHé gamin, tu veux te joindre à nous ?|||{{Non, merci.|X||||}{Peut-être un autre jour.|X||||}}|};
{mara_default|Ne t\'occupe pas de ces ivrognes, ils sont toujours là à causer du désordre.\n\ntu veux manger quelque chose ?|||{{As-tu quelque chose à marchander ?|S||||}}|};
{drunk1|Et glou, et glou, et glou, buvons encore !\nBois, bois, bois jusqu\'à ce que tu roules par terre.\n\nHé gamin, tu veux te joindre à nous ?|||{{Non, merci.|X||||}{Peut-être un autre jour.|X||||}}|};
{mara_default|Ne t\'occupe pas de ces ivrognes, ils sont toujours là à causer du désordre.\n\nTu veux manger quelque chose ?|||{{As-tu quelque chose à marchander ?|S||||}}|};
{mara1||||{{|mara_thanks|odair:100|||}{|mara_default||||}}|};
{mara_thanks|J\'ai appris que tu avais aidé Odair à débarasser la vielle réserve. Merci beaucoup, nous allons pouvoir nous en servir à nouveau.|||{{C\'était avec plaisir.|mara_default||||}}|};
{farm1|Laisse-moi tranquille, j\'ai du boulot.|||{{As-tu vu mon frère Andor ?|farm_andor||||}}|};
{farm2|Quoi ?Tu ne vois pas que je suis occupé ? Vas embêter quelqu\'un d\'autre?|||{{As-tu vu mon frère Andor ?|farm_andor||||}}|};
{farm2|Quoi ? Tu ne vois pas que je suis occupé ? Vas embêter quelqu\'un d\'autre !|||{{As-tu vu mon frère Andor ?|farm_andor||||}}|};
{farm_andor|Andor ? Non, je ne l\'ai pas vu récemment||||};
{snakemaster|Bien, bien, qui voilà donc ? Un visiteur, comme c\'est gentil. Je suis impressionné que tu sois parvenu ici à travers tous mes adorateurs.\n\nPrépare-toi à mourir, pitoyable créature.|||{{Bien, j\'attendais un beau combat !|F||||}{Voyons qui de nous deux périra.|F||||}{Pitié, ne me faites pas de mal !|F||||}}|};
{haunt|Oh mortel, délivre-moi de ce monde maudit !|||{{Oh, Je vais vous libérer de e pas.|F||||}{Vous voulez dire en vous tuant ?|F||||}}|};
{haunt|Oh mortel, délivre-moi de ce monde maudit !|||{{Oh, Je vais vous libérer de ce pas.|F||||}{Vous voulez dire en vous tuant ?|F||||}}|};
</string>
<string name="conversationlist_crossglen_tharal">
@@ -60,12 +60,12 @@
{tharal_bonemeal_select||||{{|tharal_bonemeal4|bonemeal:30|||}{|tharal_bonemeal1||||}}|};
{tharal_bonemeal1|La potion d\'os ? Nous ne devons pas parler de cela. Le seigneur Geomyr a publié un décret. Ce n\'est plus autorisé.|||{{S\'il vous plait ?|tharal_bonemeal2_1||||}}|};
{tharal_bonemeal2_1|Non, nous ne devrions vraiment pas en parler.|||{{Oh, allez ...|tharal_bonemeal2||||}}|};
{tharal_bonemeal2|Bon, puisque tu insistes. Rapporte moi cinq ailes d\'insectes que je pourrais utiliser pour concocter mes potions, et peut-être t\'en dirais-je plus.|bonemeal:20||{{Voici les ailes d\'insectes.|tharal_bonemeal3||insectwing|5|}{Très bien, je vous les rapporterais.|X||||}}|};
{tharal_bonemeal2|Bon, puisque tu insistes. Rapporte moi cinq ailes d\'insectes que je pourrais utiliser pour concocter mes potions, et peut-être t\'en dirais-je plus.|bonemeal:20||{{Voici les ailes d\'insectes.|tharal_bonemeal3||insectwing|5|}{Très bien, je vous les rapporterai.|X||||}}|};
{tharal_bonemeal3|Merci mon petit. Je savais que je pouvais compter sur toi|bonemeal:30||{{N|tharal_bonemeal4||||}}|};
{tharal_bonemeal4|Alors la potion d\'os. Préparée avec les bons ingrédients, cela peut être l\'un des soins les plus efficaces à notre disposition.|||{{N|tharal_bonemeal5||||}}|};
{tharal_bonemeal5|Nous en faisions grand usage auparavant. Mais maintenant, ce bâtard de seigneur Geomyr en a interdit toute utilisation.|||{{N|tharal_bonemeal6||||}}|};
{tharal_bonemeal6|Comment vais-je pouvoir soigner les gens maintenant ? En utilisant les potions classiques ? Bah, elles sont tellement inefficaces.|||{{N|tharal_bonemeal7||||}}|};
{tharal_bonemeal7|Je connais quelqu\'un qui a toujours de la potion d\'os disponible si tu cela t\'intéresse. Va parler à Thoronir, un confrère prêtre à Fallhaven. Donnes-lui le mot de passe « Lueur de l\'Ombre ».|||{{Merci, au revoir.|X||||}}|};
{tharal_bonemeal7|Je connais quelqu\'un qui a toujours de la potion d\'os disponible si tu cela t\'intéresse. Va parler à Thoronir, un confrère prêtre à Fallhaven. Donne-lui le mot de passe « Lueur de l\'Ombre ».|||{{Merci, au revoir.|X||||}}|};
</string>
<string name="conversationlist_crossglen_gruil">
@@ -91,10 +91,10 @@
{leonid_crossglen3|Tu as pu remarquer quelques troubles il y a de cela quelques semaines. Certains villageois ce sont battus à propos d\'un nouveau décret du seigneur Geomyr.|||{{N|leonid_crossglen4||||}}|};
{leonid_crossglen4|Le seigneur Geomyr a promulgé l\'interdiction de la potion d\'os comme médicament. Certains villageois voulaient que nous nous opposions aux règles du seigneur Geomyr et que nous continuions à l\'utiliser|bonemeal:10||{{N|leonid_crossglen4_1||||}}|};
{leonid_crossglen4_1|Tharal, notre prêtre, était particulièrement en colère et suggérait que nous fassions quelque chose au sujet du seigner Geomyr.|||{{N|leonid_crossglen5||||}}|};
{leonid_crossglen5|D\'autre villageois pensaient que nous devions obéir au décret du seigneur Geomyr.\n\nPersonnellement, je ne me suis pas encore décidé.|||{{N|leonid_crossglen6||||}}|};
{leonid_crossglen6|D\'un côté, le seigneru Geomyr aide le village en lui apportant sa protection. *il pointe les soldats dans la halle*|||{{N|leonid_crossglen7||||}}|};
{leonid_crossglen7|Mais d\'un autre côté, les impôts et les nouvelles règles sur ce qui est interdit font vraiment du tort à .|||{{N|leonid_crossglen8||||}}|};
{leonid_crossglen8|quelqu\'un devrait aller au chêteau de Geomyr et plaider la cause de Crossglen auprès du régent.|crossglen:1||{{N|leonid_crossglen9||||}}|};
{leonid_crossglen5|D\'autres villageois pensaient que nous devions obéir au décret du seigneur Geomyr.\n\nPersonnellement, je ne me suis pas encore décidé.|||{{N|leonid_crossglen6||||}}|};
{leonid_crossglen6|D\'un côté, le seigneur Geomyr aide le village en lui apportant sa protection. *il pointe les soldats dans la halle*|||{{N|leonid_crossglen7||||}}|};
{leonid_crossglen7|Mais d\'un autre côté, les impôts et les nouvelles règles sur ce qui est interdit font vraiment du tort à Crossglen.|||{{N|leonid_crossglen8||||}}|};
{leonid_crossglen8|Quelqu\'un devrait aller au château de Geomyr et plaider la cause de Crossglen auprès du régent.|crossglen:1||{{N|leonid_crossglen9||||}}|};
{leonid_crossglen9|Pour le moment, nous avons banni toute utilisation de la potion d\'os comme substance de soin.|||{{Merci pour ces informations. Je voulais vous demander autre chose.|leonid_continue||||}{Merci pour ces informations. Au revoir.|leonid_bye||||}}|};
{leonid_bye|Que l\'Ombre soit avec toi.|||{{Que l\'Ombre soit avec vous.|X||||}}|};
</string>
@@ -103,13 +103,13 @@
[id|message|progressQuest|rewardDropListID|replies[text|nextPhraseID|requires_Progress|requires_itemID|requires_Quantity|]|];
{odair1|Ah, c\'est toi. Tu es bien comme ton frère. Toujours à faire des histoires.|||{{N|odair_select||||}}|};
{odair_select||||{{|odair_complete2|odair:100|||}{|odair_continue|odair:10|||}{|odair2||||}}|};
{odair2|Hmm, il y a peut-être quelque chose que tu pourrais faire pour moi. Penses-tu pouvoir m\'aider à accomplir une petite tâche ?|||{{Dis-m\'en plus au sujet de cette tâche.|odair3||||}{bien sûr, à condition que cela me rapporte quelque chose.|odair3||||}}|};
{odair2|Hmm, il y a peut-être quelque chose que tu pourrais faire pour moi. Penses-tu pouvoir m\'aider à accomplir une petite tâche ?|||{{Dis-m\'en plus au sujet de cette tâche.|odair3||||}{Bien sûr, à condition que cela me rapporte quelque chose.|odair3||||}}|};
{odair3|Je suis allé récemment dans cette caverne *il pointe vers l\'Ouest*, pour vérifier nos réserves. Apparemment, la caverne est infestée de rats.|||{{N|odair4||||}}|};
{odair4|J\'ai vu en particulier un rat qui était plus gros que les autres. Penses-tu être capable de les éliminer ?|||{{Bien sûr, je t\'aiderais pour que Crossglen puisse à nouveau utiliser la caverne comme réserve.|odair5||||}{Bien sûr, je vais t\'aider. Mais c\'est uniquement parce que je peux y gagner quelque chose.|odair5||||}{Non, désolé|odair_cowards||||}}|};
{odair5|Je voudrais que tu ailles dans cette caverne et que tu tues le gros rat, cela pourrait peut-être stopper l\'infestation de la caverne et nous pourrions l\'utiliser à nouveau comme réserve.|odair:10||{{Ok|X||||}{À bien y réfléchir, je ne pense pas pouvoir t\'aider.|odair_cowards||||}}|};
{odair_cowards|Je ne pensais pas que tu le ferais. toi et ton frère avez toujours été des trouillards.|||{{Bye|X||||}}|};
{odair_cowards|Je ne pensais pas que tu le ferais. Toi et ton frère avez toujours été des trouillards.|||{{Bye|X||||}}|};
{odair_continue|As-tu tué le gros rat de la caverne à l\'Ouest ?|||{{Oui, j\'ai tué le gros rat.|odair_complete||tail_caverat|1|}{Qu\'est ce que j\'étais supposé faire exactement ?|odair5||||}{Non, pas encore.|odair_cowards||||}}|};
{odair_complete|Merci beaucoup de ton aide gamin ! Peut-être que toi et ton frère n\'êtes pas si trouillards que je le pensais finalement. Tiens, prends ces pièces pour ton aide.|odair:100|gold20|{{Thanks|X||||}}|};
{odair_complete|Merci beaucoup de ton aide gamin ! Peut-être que toi et ton frère n\'êtes pas si trouillards que je le pensais finalement. Tiens, prends ces pièces pour ton aide.|odair:100|gold20|{{Merci|X||||}}|};
{odair_complete2|Merci beaucoup pour ton aide tout à l\'heure. Nous allons désormais pouvoir utiliser à nouveau notre vieille caverne comme réserve.|||{{Bye|X||||}}|};
</string>
@@ -119,20 +119,20 @@
{jan_default|Bonjour petit. Laisse moi à mes lamentations.|||{{Que ce passe-t-il ?|jan_default2||||}{Désirez-vous en parler ?|jan_default2||||}{Entendu, au revoir.|X||||}}|};
{jan_default2|Oh, c\'est tellement triste. Je ne veux vraiment pas en parler.|||{{Si, faites-le s\'il-vous-plait.|jan_default3||||}{D\'accord, au revoir.|X||||}}|};
{jan_default3|Très bien, je pense que je peux t\'en parler. Tu me paraît être un brave petit.|||{{N|jan_default4||||}}|};
{jan_default4|Mon ami Gandir, son ami Irogotu et moi même sommes venu ici creuser cette fosse. Nous avions entendu dire qu\'il y avait un trésor caché la dessous.|||{{N|jan_default5||||}}|};
{jan_default4|Mon ami Gandir, son ami Irogotu et moi même sommes venu ici creuser cette fosse. Nous avions entendu dire qu\'il y avait un trésor caché là-dessous.|||{{N|jan_default5||||}}|};
{jan_default5|Nous avons creusé et avons finalement débouché sur un dédale sous-terrain. C\'est à ce moment que nous les avons trouvés. Les créatures et les bestioles.|||{{N|jan_default6||||}}|};
{jan_default6|Ah ces créatures. Satané bâtards. Ils m\'ont quasiment tué.\n\nGandir et moi avons dit à Irogotu que nous devions arrêter de creuser et partir pendant que nous le pouvions encore.|||{{N|jan_default7||||}}|};
{jan_default7|Mais Irogotu voulait continuer plus profondément dans ces oubliettes. Lui et Gandir se sont disputés et ont commencés à se battre.|||{{N|jan_default8||||}}|};
{jan_default8|C\'est à ce moment là que c\'est arrivé.\n\n*snif*\n\nOh qu\'avons nous fait ?|||{{Continuez s\'il-vous plait|jan_default9||||}}|};
{jan_default8|C\'est à ce moment là que c\'est arrivé.\n\n*snif*\n\nOh, qu\'avons nous fait ?|||{{Continuez s\'il vous plait|jan_default9||||}}|};
{jan_default9|Irogotu a tué Gandir de ses mains nues. On pouvait voir la fureur dans ses yeux. Il semblait presque y prendre plaisir.|||{{N|jan_default10||||}}|};
{jan_default10|Je me suis enfui et n\'ai pas osé redescendre à cause des créatures et à cause d\'Irogotu lui-même.|||{{N|jan_default11||||}}|};
{jan_default11|Ah ce satané Irogotu. Si seulement je pouvais l\'atteindre. Je lui montrerais de quel bois je me chauffe.|||{{Penses-tu que tu pourrais m\'aider ?|jan_default11_1||||}}|};
{jan_default11_1|Penses-tu que tu pourrais m\'aider ?|||{{Bien sûr, s\'il y a un trésor sur lequel je pourrais mettre la main.|jan_default12||||}{bien sûr. Irogotu doit payer pour ce qu\'il a fait.|jan_default12||||}{Non, merci, je préfère ne pas me mêler à cela. Cela paraît dangereux.|X||||}}|};
{jan_default11_1|Penses-tu que tu pourrais m\'aider ?|||{{Bien sûr, s\'il y a un trésor sur lequel je puisse mettre la main.|jan_default12||||}{Bien sûr. Irogotu doit payer pour ce qu\'il a fait.|jan_default12||||}{Non, merci, je préfère ne pas me mêler à cela. Cela paraît dangereux.|X||||}}|};
{jan_default12|Vraiment ? Tu penses que tu peux m\'aider ? Hmm, oui, tu pourrais peut-être y arriver. Méfies-toi de ces bestioles cependant, ce sont vraiment des bâtards coriaces.|jan:10||{{N|jan_default13||||}}|};
{jan_default13|Si tu veux vraiment m\'aider, descend chercher Irogotu dans ce dédale et ramène-moi l\'anneau de Gandir.|||{{Entendu.|jan_default14||||}{Background|jan_background||||}{Au revoir.|X||||}}|};
{jan_default13|Si tu veux vraiment m\'aider, descends chercher Irogotu dans ce dédale et ramène-moi l\'anneau de Gandir.|||{{Entendu.|jan_default14||||}{Background|jan_background||||}{Au revoir.|X||||}}|};
{jan_default14|Reviens me voir lorsque tu auras terminé. Ramène-moi l\'anneau de Gandir qu\'a Irogotu dans ce dédale.|||{{Ok, bye|X||||}}|};
{jan_return|Re-bonjour petit. As-tu trouvé Irogotu dans ce dédale ?|||{{Non, pas encore.|jan_default14||||}{Pouvez-vous me raconter une nouvelle fois votre histoire ?|jan_background||||}{Oui, j\'ai tué Irogotu.|jan_complete||ring_gandir|1|}}|};
{jan_background|N\'as tu pas écouté la première fois que je te l\'ai racontée ? Dois-je vraiment te la répéter une nouvelle fois ?|||{{Oui, s\'il-vous-plait, racontez moi à nouveau ce qui s\'est passé.|jan_default3||||}{Je n\'ai pas vraiment écouté la première fois que vous me l\'avez racontée. C\'est quoi cette histoire de trésor ?|jan_default4||||}{Non, c\'est bon, je m\'en souviens maintenant.|jan_default14||||}}|};
{jan_background|N\'as tu pas écouté la première fois que je te l\'ai racontée ? Dois-je vraiment te la répéter une nouvelle fois ?|||{{Oui, s\'il vous plait, racontez moi à nouveau ce qui s\'est passé.|jan_default3||||}{Je n\'ai pas vraiment écouté la première fois que vous me l\'avez racontée. C\'est quoi cette histoire de trésor ?|jan_default4||||}{Non, c\'est bon, je m\'en souviens maintenant.|jan_default14||||}}|};
{jan_complete2|Merci de t\'être occupé d\'Irogotu plus tôt ! Je suis à jamais ton débiteur.|||{{Au revoir.|X||||}}|};
{jan_complete|Attends, quoi ? Tu es vraiment descendu et tu reviens vivant ? Comment as-tu réussi à faire cela ? Mince, je suis quasiment mort dans ces grottes.\n\nOh merci de tout cœur de m\'avoir rapporté l\'anneau de Gandir ! Maintenant, j\'ai un souvenir de lui.|jan:100||{{Je suis heureux d\'avoir pu vous aider. Au revoir.|X||||}{Que l\'Ombre soit avec vous. au revoir.|X||||}{Qu\'importe. Je ne l\'ai fait que pour le butin.|X||||}}|};

View File

@@ -20,7 +20,7 @@
<string name="dialog_loading_message">Chargement des ressources...</string>
<string name="dialog_loading_failed_title">Échec au chargement</string>
<string name="dialog_loading_failed_message">La Piste d\'Andor a été incapable de charger le fichier du jeu sauvegardé.\n\n:(\n\nLe fichier est peut-être endommagé ou incomplet.</string>
<string name="dialog_loading_failed_message">La Piste d\'Andor a été incapable de charger le fichier du jeu sauvegardé.\n\n :(\n\nLe fichier est peut-être endommagé ou incomplet.</string>
<string name="dialog_loading_failed_incorrectversion">La Piste d\'Andor n\'a pas été capable de charger la sauvegarde. Cette sauvegarde de jeu a été créée avec une version plus récente que celle qui est en cours d\'exécution.</string>
<string name="dialog_close">Fermer</string>
@@ -33,13 +33,13 @@
<string name="dialog_paused_resume">Reprendre</string>
<string name="dialog_monsterencounter_title">Rencontre</string>
<string name="dialog_monsterencounter_message">Voulez-vous attaquer ?\nDifficulté: %1$s</string>
<string name="dialog_monsterencounter_message">Voulez-vous attaquer ?\nDifficulté : %1$s</string>
<string name="dialog_monsterencounter_info">Info</string>
<string name="status_hp">HP:</string>
<string name="status_mp">MP:</string>
<string name="status_ap">AP:</string>
<string name="status_exp">Niv.:</string>
<string name="status_hp">HP :</string>
<string name="status_mp">MP :</string>
<string name="status_ap">AP :</string>
<string name="status_exp">Niv. :</string>
<string name="heroinfo_char">Vue d\'ensemble</string>
<string name="heroinfo_inv">Inventaire</string>
@@ -51,8 +51,8 @@
<string name="heroinfo_totalexperience">Expérience totale</string>
<string name="heroinfo_wornequipment">Équipement porté</string>
<string name="heroinfo_inventory">Inventaire</string>
<string name="heroinfo_gold">Or: %1$d</string>
<string name="heroinfo_actionpoints">Point d\'Action (AP):</string>
<string name="heroinfo_gold">Or : %1$d</string>
<string name="heroinfo_actionpoints">Point d\'Action (AP) :</string>
<string name="heroinfo_quests">Quêtes</string>
<string name="combat_attack">Attaque (%1$d AP)</string>
@@ -64,8 +64,8 @@
<string name="combat_flee">Fuir</string>
<string name="combat_begin_flee">Vous pouvez maintenant fuir le combat en cliquant dans la direction vers laquelle vous souhaitez vous déplacer.</string>
<string name="combat_flee_failed">Vous n\'avez pas pu fuir !</string>
<string name="combat_status_ap">AP: %1$d</string>
<string name="combat_monsterhealth">HP:</string>
<string name="combat_status_ap">AP : %1$d</string>
<string name="combat_monsterhealth">HP :</string>
<string name="combat_monsteraction">%1$s est attaqué.</string>
<!-- <string name="combat_cannotexitcombat">You cannot exit combat since there are adjacent monsters. You first have to move by longclicking a place with no adjacent monster, before you may end the combat.</string> -->
<string name="combat_result_monstermiss">%1$s manqué !</string>
@@ -103,45 +103,45 @@
<string name="monster_difficulty_veryhard">Très difficile</string>
<string name="monster_difficulty_impossible">Impossible</string>
<string name="actorinfo_class">Classe:</string>
<string name="actorinfo_difficulty">Difficulté:</string>
<string name="actorinfo_health">Santé:</string>
<string name="actorinfo_attacksperturn">Attaques/tour:</string>
<string name="actorinfo_movesperturn">Mouvement/tour:</string>
<string name="actorinfo_attack">Attaque:</string>
<string name="actorinfo_criticalhit">Frappe critique:</string>
<string name="actorinfo_defense">Défense:</string>
<string name="actorinfo_movecost">Coût de déplacement (AP):</string>
<string name="actorinfo_class">Classe :</string>
<string name="actorinfo_difficulty">Difficulté :</string>
<string name="actorinfo_health">Santé :</string>
<string name="actorinfo_attacksperturn">Attaques/tour :</string>
<string name="actorinfo_movesperturn">Mouvement/tour :</string>
<string name="actorinfo_attack">Attaque :</string>
<string name="actorinfo_criticalhit">Frappe critique :</string>
<string name="actorinfo_defense">Défense :</string>
<string name="actorinfo_movecost">Coût de déplacement (AP) :</string>
<string name="actorinfo_basetraits">Statistiques de combat non équipé (base)</string>
<string name="actorinfo_currenttraits">Statistiques de combat équipé (current)</string>
<string name="traitsinfo_attack_cost">Coût d\'attaque (AP):</string>
<string name="traitsinfo_attack_chance">Chance d\'attaque:</string>
<string name="traitsinfo_attack_damage">Dommage d\'attaque:</string>
<string name="traitsinfo_criticalhit_chance">Chance de coup critique:</string>
<string name="traitsinfo_criticalhit_multiplier">Multiple critique:</string>
<string name="traitsinfo_defense_chance">Chance de blocage:</string>
<string name="traitsinfo_defense_damageresist">Résistance au dommage:</string>
<string name="traitsinfo_attack_cost">Coût d\'attaque (AP) :</string>
<string name="traitsinfo_attack_chance">Chance d\'attaque :</string>
<string name="traitsinfo_attack_damage">Dommage d\'attaque :</string>
<string name="traitsinfo_criticalhit_chance">Chance de coup critique :</string>
<string name="traitsinfo_criticalhit_multiplier">Multiple critique :</string>
<string name="traitsinfo_defense_chance">Chance de blocage :</string>
<string name="traitsinfo_defense_damageresist">Résistance au dommage :</string>
<!-- <string name="key_required">Une clé spécifique est requise pour passer.</string> -->
<string name="iteminfo_category">Catégorie: </string>
<string name="iteminfo_action_use">Utilisé</string>
<string name="iteminfo_action_equip">Équipé</string>
<string name="iteminfo_action_unequip">Non-équipé</string>
<string name="iteminfo_action_use_ap">Utilisé (%1$d AP)</string>
<string name="iteminfo_action_equip_ap">Équipé (%1$d AP)</string>
<string name="iteminfo_action_unequip_ap">Non-équipé (%1$d AP)</string>
<string name="iteminfo_category">Catégorie : </string>
<string name="iteminfo_action_use">Utiliser</string>
<string name="iteminfo_action_equip">Équiper</string>
<string name="iteminfo_action_unequip">Déséquiper</string>
<string name="iteminfo_action_use_ap">Utiliser (%1$d AP)</string>
<string name="iteminfo_action_equip_ap">Équiper (%1$d AP)</string>
<string name="iteminfo_action_unequip_ap">Déséquiper (%1$d AP)</string>
<string name="itemcategory_money">Monnaie</string>
<string name="itemcategory_weapon">Arme</string>
<string name="itemcategory_shield">Bouclier</string>
<string name="itemcategory_wearable_head">Portable (tête)</string>
<string name="itemcategory_wearable_body">Portable (corps)</string>
<string name="itemcategory_wearable_hand">Portable (mains)</string>
<string name="itemcategory_wearable_feet">Portable (pieds)</string>
<string name="itemcategory_wearable_neck">Portable (cou)</string>
<string name="itemcategory_wearable_ring">Portable (anneau)</string>
<string name="itemcategory_wearable_head">Vêtement (tête)</string>
<string name="itemcategory_wearable_body">Vêtement (corps)</string>
<string name="itemcategory_wearable_hand">Vêtement (mains)</string>
<string name="itemcategory_wearable_feet">Chaussure (pieds)</string>
<string name="itemcategory_wearable_neck">Bijou (cou)</string>
<string name="itemcategory_wearable_ring">Bijou (anneau)</string>
<string name="itemcategory_potion">Potion</string>
<string name="itemcategory_other">Autre</string>
@@ -166,7 +166,7 @@
<string name="shop_infoitem">Info</string>
<string name="shop_buyitem">Acheter (%1$d or)</string>
<string name="shop_sellitem">Vendre (%1$d or)</string>
<string name="shop_yourgold">Votre or: %1$d</string>
<string name="shop_yourgold">Votre or : %1$d</string>
<string name="shop_item_bought">%1$s bought.</string>
<string name="shop_item_sold">%1$s vendu.</string>
@@ -230,7 +230,7 @@
<item>Inclure les quêtes accomplies</item>
<item>N\'afficher que les quêtes accomplies</item>
</string-array>
<string name="questlog_queststatus">État: %1$s</string>
<string name="questlog_queststatus">État : %1$s</string>
<string name="questlog_queststatus_inprogress">En-cours</string>
<string name="questlog_queststatus_completed">Accomplie</string>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Do not translate this. -->
<string name="about_authors">
Programming by Oskar Wiksten&lt;br /&gt;
&lt;a href="http://telles0808.deviantart.com/art/RPG-Maker-VX-RTP-Tileset-159218223"&gt;Map tilesets graphics by telles0808&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://ails.deviantart.com/art/420-Pixel-Art-Icons-for-RPG-129892453"&gt;Item tilesets graphics by Ails&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://redknight91.deviantart.com/art/Arena-Game-Sprites-154661559"&gt;Hero graphics by RedKnight91&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://nacred.deviantart.com/art/Sprite-Sheet-171751308"&gt;Additional monster graphics by nacred&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://andors.techby2guys.com/"&gt;Game forums provided by Scott Devaney&lt;/a&gt;&lt;br /&gt;
Additional maps done by Michael Schmid&lt;br /&gt;
Additional programming by Samuel Plentz&lt;br /&gt;
Additional programming by Uwe Jugel&lt;br /&gt;
Additional programming by Olivier Samyn&lt;br /&gt;
Additional graphics by Karvis&lt;br /&gt;
Russian translation by Dreamer...&lt;br /&gt;
Italian translation by k6blue and liogiu&lt;br /&gt;
French translation by LeSanglier and Misty Soul&lt;br /&gt;
German translation by Bomber and Samuel Plentz&lt;br /&gt;
English proofreading by taws34&lt;br /&gt;
Forum moderated by Tim Davis&lt;br /&gt;
Forum moderated by Josh Kloos&lt;br /&gt;
Forum moderated by Travis Miller&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://rltiles.sourceforge.net"&gt;Monster tileset graphics by rltiles.sourceforge.net&lt;/a&gt;&lt;br /&gt;
Part of (or All) the graphic tiles used in this program is the public domain roguelike tileset "RLTiles".
Some of the tiles have been modified by Oskar Wiksten.
You can find the original tileset at &lt;a href="http://rltiles.sf.net"&gt;http://rltiles.sf.net&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Some of the graphic data in this software are free game resources distributed by REFMAP (&lt;a href="http://www.tekepon.net/fsm"&gt;http://www.tekepon.net/fsm&lt;/a&gt;).
You must not use the graphic data which is in this software, for the purpose except playing this game. When you want to get these resources, go to the website above.&lt;br /&gt;
</string>
</resources>

View File

@@ -0,0 +1,315 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="loadresource_actorconditions">
<item>@string/actorconditions_v069</item>
<item>@string/actorconditions_v069_bwm</item>
</array>
<array name="loadresource_items">
<item>@string/itemlist_money</item>
<item>@string/itemlist_weapons</item>
<item>@string/itemlist_armour</item>
<item>@string/itemlist_rings</item>
<item>@string/itemlist_necklaces</item>
<item>@string/itemlist_junk</item>
<item>@string/itemlist_food</item>
<item>@string/itemlist_potions</item>
<item>@string/itemlist_animal</item>
<item>@string/itemlist_quest</item>
<item>@string/itemlist_v068</item>
<item>@string/itemlist_v069</item>
<item>@string/itemlist_v069_questitems</item>
<item>@string/itemlist_v069_2</item>
</array>
<array name="loadresource_droplists">
<item>@string/droplists_crossglen</item>
<item>@string/droplists_crossglen_outside</item>
<item>@string/droplists_fallhaven</item>
<item>@string/droplists_wilderness</item>
<item>@string/droplists_v068</item>
<item>@string/droplists_v069_npcs</item>
<item>@string/droplists_v069_monsters</item>
</array>
<array name="loadresource_quests">
<item>@string/questlist</item>
<item>@string/questlist_nondisplayed</item>
<item>@string/questlist_v068</item>
<item>@string/questlist_v069</item>
</array>
<array name="loadresource_conversationlists">
<item>@string/conversationlist_mikhail</item>
<item>@string/conversationlist_crossglen</item>
<item>@string/conversationlist_crossglen_gruil</item>
<item>@string/conversationlist_crossglen_leonid</item>
<item>@string/conversationlist_crossglen_tharal</item>
<item>@string/conversationlist_crossglen_leta</item>
<item>@string/conversationlist_crossglen_odair</item>
<item>@string/conversationlist_jan</item>
<item>@string/conversationlist_fallhaven</item>
<item>@string/conversationlist_fallhaven_arcir</item>
<item>@string/conversationlist_fallhaven_bucus</item>
<item>@string/conversationlist_fallhaven_church</item>
<item>@string/conversationlist_fallhaven_athamyr</item>
<item>@string/conversationlist_fallhaven_drunk</item>
<item>@string/conversationlist_fallhaven_nocmar</item>
<item>@string/conversationlist_fallhaven_oldman</item>
<item>@string/conversationlist_fallhaven_tavern</item>
<item>@string/conversationlist_fallhaven_larcal</item>
<item>@string/conversationlist_fallhaven_unnmir</item>
<item>@string/conversationlist_fallhaven_gaela</item>
<item>@string/conversationlist_fallhaven_vacor</item>
<item>@string/conversationlist_fallhaven_unzel</item>
<item>@string/conversationlist_wilderness</item>
<item>@string/conversationlist_flagstone</item>
<item>@string/conversationlist_fallhaven_south</item>
<item>@string/conversationlist_signs_pre067</item>
<item>@string/conversationlist_thievesguild_1</item>
<item>@string/conversationlist_farrik</item>
<item>@string/conversationlist_fallhaven_warden</item>
<item>@string/conversationlist_umar</item>
<item>@string/conversationlist_kaori</item>
<item>@string/conversationlist_vilegard_villagers</item>
<item>@string/conversationlist_vilegard_erttu</item>
<item>@string/conversationlist_vilegard_tavern</item>
<item>@string/conversationlist_jolnor</item>
<item>@string/conversationlist_alynndir</item>
<item>@string/conversationlist_shops</item>
<item>@string/conversationlist_ogam</item>
<item>@string/conversationlist_foamingflask</item>
<item>@string/conversationlist_ambelie</item>
<item>@string/conversationlist_foamingflask_guards</item>
<item>@string/conversationlist_foamingflask_outsideguard</item>
<item>@string/conversationlist_wrye</item>
<item>@string/conversationlist_oluag</item>
<item>@string/conversationlist_signs_v068</item>
<item>@string/conversationlist_maelveon</item>
<item>@string/conversationlist_bwm_agent_1</item>
<item>@string/conversationlist_bwm_agent_2</item>
<item>@string/conversationlist_bwm_agent_3</item>
<item>@string/conversationlist_bwm_agent_4</item>
<item>@string/conversationlist_bwm_agent_5</item>
<item>@string/conversationlist_bwm_agent_6</item>
<item>@string/conversationlist_prim_arghest</item>
<item>@string/conversationlist_prim_outside</item>
<item>@string/conversationlist_prim_inn</item>
<item>@string/conversationlist_prim_tavern</item>
<item>@string/conversationlist_prim_guthbered</item>
<item>@string/conversationlist_blackwater_signs</item>
<item>@string/conversationlist_blackwater_harlenn</item>
<item>@string/conversationlist_blackwater_upper</item>
<item>@string/conversationlist_blackwater_lower</item>
<item>@string/conversationlist_blackwater_herec</item>
<item>@string/conversationlist_prim_bjorgur</item>
<item>@string/conversationlist_prim_fulus</item>
<item>@string/conversationlist_prim_merchants</item>
<item>@string/conversationlist_blackwater_throdna</item>
<item>@string/conversationlist_blackwater_kazaul</item>
</array>
<array name="loadresource_monsters">
<item>@string/monsterlist_crossglen_animals</item>
<item>@string/monsterlist_crossglen_npcs</item>
<item>@string/monsterlist_fallhaven_animals</item>
<item>@string/monsterlist_fallhaven_npcs</item>
<item>@string/monsterlist_wilderness</item>
<item>@string/monsterlist_v068_npcs</item>
<item>@string/monsterlist_v069_monsters</item>
<item>@string/monsterlist_v069_npcs</item>
</array>
<array name="loadresource_maps">
<item>@xml/home</item>
<item>@xml/crossglen</item>
<item>@xml/crossglen_farmhouse</item>
<item>@xml/crossglen_farmhouse_basement</item>
<item>@xml/crossglen_hall</item>
<item>@xml/crossglen_smith</item>
<item>@xml/crossglen_cave</item>
<item>@xml/wild1</item>
<item>@xml/wild2</item>
<item>@xml/wild3</item>
<item>@xml/jan_pitcave1</item>
<item>@xml/jan_pitcave2</item>
<item>@xml/jan_pitcave3</item>
<item>@xml/fallhaven_nw</item>
<item>@xml/snakecave1</item>
<item>@xml/snakecave2</item>
<item>@xml/snakecave3</item>
<item>@xml/wild4</item>
<item>@xml/hauntedhouse1</item>
<item>@xml/hauntedhouse2</item>
<item>@xml/fallhaven_ne</item>
<item>@xml/fallhaven_church</item>
<item>@xml/fallhaven_barn</item>
<item>@xml/fallhaven_potions</item>
<item>@xml/fallhaven_gravedigger</item>
<item>@xml/fallhaven_clothes</item>
<item>@xml/fallhaven_arcir</item>
<item>@xml/fallhaven_arcir_basement</item>
<item>@xml/fallhaven_athamyr</item>
<item>@xml/fallhaven_rigmor</item>
<item>@xml/fallhaven_tavern</item>
<item>@xml/fallhaven_prison</item>
<item>@xml/fallhaven_derelict</item>
<item>@xml/fallhaven_nocmar</item>
<item>@xml/catacombs1</item>
<item>@xml/catacombs2</item>
<item>@xml/catacombs3</item>
<item>@xml/catacombs4</item>
<item>@xml/hauntedhouse3</item>
<item>@xml/hauntedhouse4</item>
<item>@xml/fallhaven_sw</item>
<item>@xml/wild5</item>
<item>@xml/wild6</item>
<item>@xml/wild6_house</item>
<item>@xml/wild7</item>
<item>@xml/wild8</item>
<item>@xml/wild9</item>
<item>@xml/wild10</item>
<item>@xml/flagstone0</item>
<item>@xml/flagstone_inner</item>
<item>@xml/flagstone_upper</item>
<item>@xml/flagstone1</item>
<item>@xml/flagstone2</item>
<item>@xml/flagstone3</item>
<item>@xml/flagstone4</item>
<item>@xml/wild11</item>
<item>@xml/wild12</item>
<item>@xml/wild11_clearing</item>
<item>@xml/clearing_level1</item>
<item>@xml/clearing_level2</item>
<item>@xml/fallhaven_se</item>
<item>@xml/fallhaven_lumberjack</item>
<item>@xml/fallhaven_alaun</item>
<item>@xml/fallhaven_storage</item>
<item>@xml/fallhaven_farmer</item>
<item>@xml/wild13</item>
<item>@xml/wild14</item>
<item>@xml/wild14_cave</item>
<item>@xml/wild14_clearing</item>
<item>@xml/wild15</item>
<item>@xml/wild15_house</item>
<item>@xml/road1</item>
<item>@xml/foaming_flask</item>
<item>@xml/fallhaven_derelict2</item>
<item>@xml/vilegard_n</item>
<item>@xml/vilegard_s</item>
<item>@xml/vilegard_sw</item>
<item>@xml/vilegard_ogam</item>
<item>@xml/vilegard_chapel</item>
<item>@xml/vilegard_tavern</item>
<item>@xml/vilegard_armorer</item>
<item>@xml/vilegard_smith</item>
<item>@xml/vilegard_wrye</item>
<item>@xml/vilegard_kaori</item>
<item>@xml/vilegard_erttu</item>
<item>@xml/road2</item>
<item>@xml/road3</item>
<item>@xml/road4</item>
<item>@xml/road4_gargoylecave</item>
<item>@xml/road5</item>
<item>@xml/road5_house</item>
<item>@xml/gargoylecave1</item>
<item>@xml/gargoylecave2</item>
<item>@xml/gargoylecave3</item>
<item>@xml/gargoylecave4</item>
<item>@xml/blackwater_mountain0</item>
<item>@xml/blackwater_mountain1</item>
<item>@xml/blackwater_mountain2</item>
<item>@xml/blackwater_mountain3</item>
<item>@xml/blackwater_mountain4</item>
<item>@xml/blackwater_mountain5</item>
<item>@xml/blackwater_mountain6</item>
<item>@xml/blackwater_mountain7</item>
<item>@xml/blackwater_mountain8</item>
<item>@xml/blackwater_mountain9</item>
<item>@xml/blackwater_mountain10</item>
<item>@xml/blackwater_mountain11</item>
<item>@xml/blackwater_mountain12</item>
<item>@xml/blackwater_mountain13</item>
<item>@xml/blackwater_mountain14</item>
<item>@xml/blackwater_mountain15</item>
<item>@xml/blackwater_mountain16</item>
<item>@xml/blackwater_mountain17</item>
<item>@xml/blackwater_mountain18</item>
<item>@xml/blackwater_mountain19</item>
<item>@xml/blackwater_mountain20</item>
<item>@xml/blackwater_mountain21</item>
<item>@xml/blackwater_mountain22</item>
<item>@xml/blackwater_mountain23</item>
<item>@xml/blackwater_mountain24</item>
<item>@xml/blackwater_mountain25</item>
<item>@xml/blackwater_mountain26</item>
<item>@xml/blackwater_mountain27</item>
<item>@xml/blackwater_mountain28</item>
<item>@xml/blackwater_mountain29</item>
<item>@xml/blackwater_mountain30</item>
<item>@xml/blackwater_mountain31</item>
<item>@xml/blackwater_mountain32</item>
<item>@xml/blackwater_mountain33</item>
<item>@xml/blackwater_mountain34</item>
<item>@xml/blackwater_mountain35</item>
<item>@xml/blackwater_mountain36</item>
<item>@xml/blackwater_mountain37</item>
<item>@xml/blackwater_mountain38</item>
<item>@xml/blackwater_mountain39</item>
<item>@xml/blackwater_mountain40</item>
<item>@xml/blackwater_mountain41</item>
<item>@xml/blackwater_mountain42</item>
<item>@xml/blackwater_mountain43</item>
<item>@xml/blackwater_mountain44</item>
<item>@xml/blackwater_mountain45</item>
<item>@xml/blackwater_mountain46</item>
<item>@xml/blackwater_mountain47</item>
<item>@xml/blackwater_mountain48</item>
<item>@xml/blackwater_mountain49</item>
<item>@xml/blackwater_mountain50</item>
<item>@xml/blackwater_mountain51</item>
<item>@xml/blackwater_mountain52</item>
<item>@xml/wild0</item>
<item>@xml/crossroads</item>
<item>@xml/fields0</item>
<item>@xml/fields1</item>
<item>@xml/fields2</item>
<item>@xml/fields3</item>
<item>@xml/fields4</item>
<item>@xml/fields5</item>
<item>@xml/fields6</item>
<item>@xml/fields7</item>
<item>@xml/fields8</item>
<item>@xml/fields9</item>
<item>@xml/fields10</item>
<item>@xml/fields11</item>
<item>@xml/fields12</item>
<item>@xml/houseatcrossroads0</item>
<item>@xml/houseatcrossroads1</item>
<item>@xml/houseatcrossroads2</item>
<item>@xml/houseatcrossroads3</item>
<item>@xml/houseatcrossroads4</item>
<item>@xml/houseatcrossroads5</item>
<item>@xml/loneford1</item>
<item>@xml/loneford2</item>
<item>@xml/loneford3</item>
<item>@xml/loneford4</item>
<item>@xml/loneford5</item>
<item>@xml/loneford6</item>
<item>@xml/loneford7</item>
<item>@xml/loneford8</item>
<item>@xml/loneford9</item>
<item>@xml/loneford10</item>
<item>@xml/roadbeforecrossroads</item>
<item>@xml/roadtocarntower0</item>
<item>@xml/roadtocarntower1</item>
<item>@xml/roadtocarntower2</item>
<item>@xml/woodcave0</item>
<item>@xml/woodcave1</item>
<item>@xml/wild16</item>
<item>@xml/wild17</item>
<item>@xml/gapfiller1</item>
<item>@xml/gapfiller3</item>
<item>@xml/gapfiller4</item>
</array>
</resources>

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="loadresource_items_debug">
<item>@string/itemlist_money</item>
<item>@string/itemlist_weapons</item>
<item>@string/itemlist_armour</item>
<item>@string/itemlist_debug</item>
</array>
<array name="loadresource_droplists_debug">
<item>@string/droplists_debug</item>
</array>
<array name="loadresource_quests_debug">
<item>@string/questlist_debug</item>
</array>
<array name="loadresource_conversationlists_debug">
<item>@string/conversationlist_debug</item>
</array>
<array name="loadresource_monsters_debug">
<item>@string/monsterlist_debug</item>
</array>
<array name="loadresource_maps_debug">
<item>@xml/debugmap</item>
</array>
</resources>

View File

@@ -200,37 +200,6 @@
&lt;br /&gt;
We really should add some info here about how to play the game :)&lt;br /&gt;
</string>
<!-- Do not translate this. -->
<string name="about_contents2">
Programming by Oskar Wiksten&lt;br /&gt;
&lt;a href="http://telles0808.deviantart.com/art/RPG-Maker-VX-RTP-Tileset-159218223"&gt;Map tilesets graphics by telles0808&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://ails.deviantart.com/art/420-Pixel-Art-Icons-for-RPG-129892453"&gt;Item tilesets graphics by Ails&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://redknight91.deviantart.com/art/Arena-Game-Sprites-154661559"&gt;Hero graphics by RedKnight91&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://nacred.deviantart.com/art/Sprite-Sheet-171751308"&gt;Additional monster graphics by nacred&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://andors.techby2guys.com/"&gt;Game forums provided by Scott Devaney&lt;/a&gt;&lt;br /&gt;
Additional maps done by Michael Schmid&lt;br /&gt;
Additional programming by Samuel Plentz&lt;br /&gt;
Additional programming by Uwe Jugel&lt;br /&gt;
Additional programming by Olivier Samyn&lt;br /&gt;
Additional graphics by Karvis&lt;br /&gt;
Russian translation by Dreamer...&lt;br /&gt;
Italian translation by k6blue and liogiu&lt;br /&gt;
French translation by LeSanglier and Misty Soul&lt;br /&gt;
German translation by Bomber and Samuel Plentz&lt;br /&gt;
English proofreading by taws34&lt;br /&gt;
Forum moderated by Tim Davis&lt;br /&gt;
Forum moderated by Josh Kloos&lt;br /&gt;
Forum moderated by Travis Miller&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://rltiles.sourceforge.net"&gt;Monster tileset graphics by rltiles.sourceforge.net&lt;/a&gt;&lt;br /&gt;
Part of (or All) the graphic tiles used in this program is the public domain roguelike tileset "RLTiles".
Some of the tiles have been modified by Oskar Wiksten.
You can find the original tileset at &lt;a href="http://rltiles.sf.net"&gt;http://rltiles.sf.net&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Some of the graphic data in this software are free game resources distributed by REFMAP (&lt;a href="http://www.tekepon.net/fsm"&gt;http://www.tekepon.net/fsm&lt;/a&gt;).
You must not use the graphic data which is in this software, for the purpose except playing this game. When you want to get these resources, go to the website above.&lt;br /&gt;
</string>
<!--
This is the GNU GPL v2 text, originally from
@@ -314,7 +283,7 @@
<string name="preferences_movementmethod">Type of movement method and handling of obstacles.</string>
<string-array name="preferences_movementmethods">
<item>Straight (original)</item>
<item>Directional</item>
<item>Avoiding obstacles</item>
</string-array>
<string-array name="preferences_movementmethod_values">
<item>0</item>
@@ -368,4 +337,33 @@
<string name="inventory_assign_slot3">Slot 3</string>
<string name="inventory_unassign">Un-assign quick slot</string>
<!-- =========================================== -->
<!-- Added in v0.6.10 -->
<string name="preferences_movement_dpad_position_title">Virtual d-pad</string>
<string name="preferences_movement_dpad_position">Enables a virtual on-screen directional pad to guide movement</string>
<string-array name="preferences_movement_dpad_positions">
<item>Disabled</item>
<item>Lower right corner</item>
<item>Lower left corner</item>
<item>Center bottom</item>
<item>Center left</item>
<item>Center right</item>
<item>Upper left corner</item>
<item>Upper right corner</item>
<item>Center top</item>
</string-array>
<string-array name="preferences_movement_dpad_positions_values">
<item>0</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
<item>7</item>
<item>8</item>
</string-array>
</resources>

View File

@@ -54,5 +54,12 @@
android:defaultValue="0"
android:entries="@array/preferences_movementmethods"
android:entryValues="@array/preferences_movementmethod_values" />
<ListPreference
android:title="@string/preferences_movement_dpad_position_title"
android:summary="@string/preferences_movement_dpad_position"
android:key="dpadposition"
android:defaultValue="0"
android:entries="@array/preferences_movement_dpad_positions"
android:entryValues="@array/preferences_movement_dpad_positions_values" />
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -16,9 +16,9 @@ public final class AndorsTrailApplication extends Application {
public static final boolean DEVELOPMENT_DEBUGRESOURCES = false;
public static final boolean DEVELOPMENT_FORCE_STARTNEWGAME = false;
public static final boolean DEVELOPMENT_FORCE_CONTINUEGAME = false;
public static final boolean DEVELOPMENT_DEBUGBUTTONS = false;
public static final boolean DEVELOPMENT_VALIDATEDATA = false;
public static final boolean DEVELOPMENT_DEBUGMESSAGES = false;
public static final boolean DEVELOPMENT_DEBUGBUTTONS = true;
public static final boolean DEVELOPMENT_VALIDATEDATA = true;
public static final boolean DEVELOPMENT_DEBUGMESSAGES = true;
public static final int CURRENT_VERSION = 20;
public static final String CURRENT_VERSION_DISPLAY = "0.6.10dev";

View File

@@ -5,18 +5,33 @@ import android.content.SharedPreferences;
import android.preference.PreferenceManager;
public class AndorsTrailPreferences {
public boolean confirmRest = true;
public boolean confirmAttack = true;
public int displayLoot = DISPLAYLOOT_DIALOG;
public static final int DISPLAYLOOT_DIALOG = 0;
public static final int DISPLAYLOOT_TOAST = 1;
public static final int DISPLAYLOOT_NONE = 2;
public static final int MOVEMENTMETHOD_STRAIGHT = 0;
public static final int MOVEMENTMETHOD_DIRECTIONAL = 1;
public static final int MOVEMENTAGGRESSIVENESS_NORMAL = 0;
public static final int MOVEMENTAGGRESSIVENESS_AGGRESSIVE = 1;
public static final int MOVEMENTAGGRESSIVENESS_DEFENSIVE = 2;
public static final int DPAD_POSITION_DISABLED = 0;
public static final int DPAD_POSITION_LOWER_RIGHT = 1;
public static final int DPAD_POSITION_LOWER_LEFT = 2;
public static final int DPAD_POSITION_LOWER_CENTER = 3;
public static final int DPAD_POSITION_CENTER_LEFT = 4;
public static final int DPAD_POSITION_CENTER_RIGHT = 5;
public static final int DPAD_POSITION_UPPER_LEFT = 6;
public static final int DPAD_POSITION_UPPER_RIGHT = 7;
public static final int DPAD_POSITION_UPPER_CENTER = 8;
public boolean confirmRest = true;
public boolean confirmAttack = true;
public int displayLoot = DISPLAYLOOT_DIALOG;
public boolean fullscreen = true;
public int attackspeed_milliseconds = 1000;
public int movementMethod = MOVEMENTMETHOD_STRAIGHT;
public static final int MOVEMENTMETHOD_STRAIGHT = 0;
public static final int MOVEMENTMETHOD_DIRECTIONAL = 1;
public int movementAggressiveness = MOVEMENTAGGRESSIVENESS_NORMAL;
public float scalingFactor = 1.0f;
public int dpadPosition;
public static void read(final Context androidContext, AndorsTrailPreferences dest) {
try {
@@ -28,6 +43,10 @@ public class AndorsTrailPreferences {
dest.attackspeed_milliseconds = Integer.parseInt(prefs.getString("attackspeed", "1000"));
dest.movementMethod = Integer.parseInt(prefs.getString("movementmethod", Integer.toString(MOVEMENTMETHOD_STRAIGHT)));
dest.scalingFactor = Float.parseFloat(prefs.getString("scaling_factor", "1.0f"));
dest.dpadPosition = Integer.parseInt(prefs.getString("dpadposition", Integer.toString(DPAD_POSITION_DISABLED)));
// This might be implemented as a skill in the future.
//dest.movementAggressiveness = Integer.parseInt(prefs.getString("movementaggressiveness", Integer.toString(MOVEMENTAGGRESSIVENESS_NORMAL)));
} catch (Exception e) {
dest.confirmRest = true;
dest.confirmAttack = true;
@@ -35,7 +54,9 @@ public class AndorsTrailPreferences {
dest.fullscreen = true;
dest.attackspeed_milliseconds = 1000;
dest.movementMethod = MOVEMENTMETHOD_STRAIGHT;
dest.movementAggressiveness = MOVEMENTAGGRESSIVENESS_NORMAL;
dest.scalingFactor = 1.0f;
dest.dpadPosition = DPAD_POSITION_DISABLED;
}
}

View File

@@ -42,7 +42,7 @@ public final class AboutActivity extends Activity {
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
tv.setText(Html.fromHtml(res.getString(R.string.about_contents2)));
tv.setText(Html.fromHtml(res.getString(R.string.about_authors)));
}
});

View File

@@ -17,6 +17,7 @@ import com.gpl.rpg.AndorsTrail.util.Coord;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.view.CombatView;
import com.gpl.rpg.AndorsTrail.view.MainView;
import com.gpl.rpg.AndorsTrail.view.VirtualDpadView;
import com.gpl.rpg.AndorsTrail.view.QuickButton.QuickButtonContextMenuInfo;
import com.gpl.rpg.AndorsTrail.view.QuickitemView;
import com.gpl.rpg.AndorsTrail.view.StatusView;
@@ -57,6 +58,7 @@ public final class MainActivity extends Activity {
public CombatView combatview;
public QuickitemView quickitemview;
public LinearLayout activeConditions;
public VirtualDpadView dpad;
private static final int NUM_MESSAGES = 3;
private final String[] messages = new String[NUM_MESSAGES];
@@ -82,6 +84,7 @@ public final class MainActivity extends Activity {
combatview = (CombatView) findViewById(R.id.main_combatview);
quickitemview = (QuickitemView) findViewById(R.id.main_quickitemview);
activeConditions = (LinearLayout) findViewById(R.id.statusview_activeconditions);
dpad = (VirtualDpadView) findViewById(R.id.main_virtual_dpad);
statusText = (TextView) findViewById(R.id.statusview_statustext);
statusText.setOnClickListener(new OnClickListener() {
@@ -175,10 +178,12 @@ public final class MainActivity extends Activity {
})
});
}
quickitemview.setVisibility(View.GONE);
quickitemview.registerForContextMenu(this);
quickitemview.refreshQuickitems();
dpad.updateVisibility(app.preferences);
}
@Override
@@ -216,6 +221,7 @@ public final class MainActivity extends Activity {
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
AndorsTrailPreferences.read(this, app.preferences);
world.tileStore.updatePreferences(app.preferences);
dpad.updateVisibility(app.preferences);
break;
case INTENTREQUEST_SAVEGAME:
if (resultCode != Activity.RESULT_OK) break;
@@ -229,7 +235,7 @@ public final class MainActivity extends Activity {
}
}
private boolean save(int slot) {
private boolean save(int slot) {
final Player player = world.model.player;
return Savegames.saveWorld(world, this, slot, getString(R.string.savegame_currenthero_displayinfo, player.level, player.totalExperience, player.inventory.gold));
}
@@ -274,6 +280,7 @@ public final class MainActivity extends Activity {
super.onPause();
L.log("onPause");
view.gameRoundController.pause();
view.movementController.stopMovement();
save(Savegames.SLOT_QUICKSAVE);

View File

@@ -59,7 +59,10 @@ public class WorldContext {
// Selftest method. Not part of the game logic.
public void verifyData() {
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
//Ensure that all phrases that require an item have some droplist that contains them
assert(itemTypes.getItemTypeByTag("gold") != null);
assert(itemTypes.getItemTypeByTag("gold").id == ItemTypeCollection.ITEMTYPE_GOLD);
//Ensure that all phrases that require an item have some droplist that contains them
conversations.verifyData(dropLists);
//Ensure that all phrases are requested at least once, either by NPCs, mapobjects or by other phrases.

View File

@@ -7,6 +7,7 @@ import android.os.Handler;
import android.os.Message;
import android.view.View;
import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
import com.gpl.rpg.AndorsTrail.Dialogs;
import com.gpl.rpg.AndorsTrail.VisualEffectCollection;
import com.gpl.rpg.AndorsTrail.R;
@@ -69,7 +70,7 @@ public final class CombatController {
killedMonsterBags.clear();
}
totalExpThisFight = 0;
context.gameRoundController.queueAnotherTick();
context.gameRoundController.resume();
}
private void lootCurrentMonsterBags() {
@@ -155,7 +156,8 @@ public final class CombatController {
}
private void executeFlee(int dx, int dy) {
if (!context.movementController.findWalkablePosition(dx, dy)) return;
// avoid monster fields when fleeing
if (!context.movementController.findWalkablePosition(dx, dy, AndorsTrailPreferences.MOVEMENTAGGRESSIVENESS_DEFENSIVE)) return;
Monster m = model.currentMap.getMonsterAt(model.player.nextPosition);
if (m != null) return;
executeCombatMove(world.model.player.nextPosition);

View File

@@ -1,53 +1,28 @@
package com.gpl.rpg.AndorsTrail.controller;
import android.os.Handler;
import android.os.Message;
import com.gpl.rpg.AndorsTrail.context.ViewContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.ModelContainer;
import com.gpl.rpg.AndorsTrail.util.TimedMessageTask;
public final class GameRoundController {
public final class GameRoundController implements TimedMessageTask.Callback {
private final ViewContext view;
private final WorldContext world;
private final ModelContainer model;
private boolean hasQueuedTick = false;
//private final int id;
private final TimedMessageTask roundTimer;
public GameRoundController(ViewContext context) {
this.view = context;
this.world = context;
this.model = world.model;
//this.id = ModelContainer.rnd.nextInt();
this.roundTimer = new TimedMessageTask(this, Constants.TICK_DELAY, true);
}
private final RefreshHandler mTickHandler = new RefreshHandler();
private class RefreshHandler extends Handler {
@Override
public void handleMessage(Message msg) {
if (!hasQueuedTick) return;
hasQueuedTick = false;
GameRoundController.this.tick();
}
public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
};
public void queueAnotherTick() {
if (hasQueuedTick) return;
hasQueuedTick = true;
mTickHandler.sleep(Constants.TICK_DELAY);
}
private int ticksUntilNextRound = Constants.TICKS_PER_ROUND;
private int ticksUntilNextFullRound = Constants.TICKS_PER_FULLROUND;
private void tick() {
public void onTick(TimedMessageTask task) {
//L.log(id + " : Controller::tick()");
if (!model.uiSelections.isMainActivityVisible) return;
if (model.uiSelections.isInCombat) return;
@@ -66,18 +41,18 @@ public final class GameRoundController {
ticksUntilNextFullRound = Constants.TICKS_PER_FULLROUND;
}
queueAnotherTick();
roundTimer.queueAnotherTick();
}
public void resume() {
//L.log(id + " : Controller::resume()");
view.mainActivity.updateStatus();
model.uiSelections.isMainActivityVisible = true;
queueAnotherTick();
roundTimer.start();
}
public void pause() {
//L.log(id + " : Controller::pause()");
hasQueuedTick = false;
roundTimer.stop();
model.uiSelections.isMainActivityVisible = false;
}

View File

@@ -15,16 +15,19 @@ import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea;
import com.gpl.rpg.AndorsTrail.model.map.TMXMapReader;
import com.gpl.rpg.AndorsTrail.util.Coord;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.TimedMessageTask;
public final class MovementController {
public final class MovementController implements TimedMessageTask.Callback {
private final ViewContext view;
private final WorldContext world;
private final ModelContainer model;
private final TimedMessageTask movementHandler;
public MovementController(ViewContext context) {
this.view = context;
this.world = context;
this.model = world.model;
this.movementHandler = new TimedMessageTask(this, Constants.MINIMUM_INPUT_INTERVAL, false);
}
public void placePlayerAt(int objectType, String mapName, String placeName, int offset_x, int offset_y) {
@@ -73,7 +76,7 @@ public final class MovementController {
return !model.uiSelections.isInCombat;
}
public void movePlayer(int dx, int dy) {
private void movePlayer(int dx, int dy) {
if (dx == 0 && dy == 0) return;
if (!mayMovePlayer()) return;
@@ -89,54 +92,75 @@ public final class MovementController {
}
public boolean findWalkablePosition(int dx, int dy) {
if (view.preferences.movementMethod == AndorsTrailPreferences.MOVEMENTMETHOD_DIRECTIONAL) {
return findWalkablePosition_directional(dx, dy);
} else {
return findWalkablePosition_straight(dx, dy);
// try to move with movementAggresiveness, if that fails fall back to MOVEMENTAGGRESSIVENESS_NORMAL
if (findWalkablePosition(dx, dy, view.preferences.movementAggressiveness)) return true;
if (view.preferences.movementAggressiveness == AndorsTrailPreferences.MOVEMENTAGGRESSIVENESS_NORMAL) return false;
return findWalkablePosition(dx, dy, AndorsTrailPreferences.MOVEMENTAGGRESSIVENESS_NORMAL);
}
public boolean findWalkablePosition(int dx, int dy, int aggressiveness) {
if (view.preferences.movementMethod == AndorsTrailPreferences.MOVEMENTMETHOD_STRAIGHT) {
return findWalkablePosition_straight(dx, dy, aggressiveness);
} else {
return findWalkablePosition_directional(dx, dy, aggressiveness);
}
}
public boolean findWalkablePosition_straight(int dx, int dy) {
if (tryWalkablePosition(sgn(dx), sgn(dy))) return true;
if (dx == 0 || dy == 0) return false;
if (abs(dx) == abs(dy) && tryWalkablePosition(sgn(dx), 0)) return true;
if (abs(dx) > abs(dy)) return tryWalkablePosition(sgn(dx), 0);
return tryWalkablePosition(0, sgn(dy));
public boolean findWalkablePosition_straight(int dx, int dy, int aggressiveness) {
if (tryWalkablePosition(sgn(dx), sgn(dy), aggressiveness)) return true; // try moving into the direction player is pointing at
if (dx == 0 || dy == 0) return false; // if moving purely east, west, north or south failed - do nothing
if (abs(dx) == abs(dy) && tryWalkablePosition(sgn(dx), 0, aggressiveness)) return true; // try moving horizontally or vertically otherwise (prefer the direction where he is pointing more)
if (abs(dx) > abs(dy)) return tryWalkablePosition(sgn(dx), 0, aggressiveness);
return tryWalkablePosition(0, sgn(dy), aggressiveness);
}
public boolean findWalkablePosition_directional(int dx, int dy) {
if (tryWalkablePosition(sgn(dx), sgn(dy))) return true; // try moving into the direction player is pointing at
public boolean findWalkablePosition_directional(int dx, int dy, int aggressiveness) {
if (tryWalkablePosition(sgn(dx), sgn(dy), aggressiveness)) return true; // try moving into the direction player is pointing at
if (dx == 0) { // player wants to move north or south but there is an obstacle
if (tryWalkablePosition( 1, sgn(dy))) return true; // try moving north-east (or south-east)
if (tryWalkablePosition(-1, sgn(dy))) return true; // try moving north-west (or south-west)
if (tryWalkablePosition( 1, sgn(dy), aggressiveness)) return true; // try moving north-east (or south-east)
if (tryWalkablePosition(-1, sgn(dy), aggressiveness)) return true; // try moving north-west (or south-west)
return false;
}
if (dy == 0) { // player wants to move east or west but there is an obstacle
if (tryWalkablePosition(sgn(dx), 1)) return true; // try moving north-east (or north-west)
if (tryWalkablePosition(sgn(dx),-1)) return true; // try moving south-east (or south-west)
if (tryWalkablePosition(sgn(dx), 1, aggressiveness)) return true; // try moving north-east (or north-west)
if (tryWalkablePosition(sgn(dx),-1, aggressiveness)) return true; // try moving south-east (or south-west)
return false;
}
if (abs(dx) >= abs(dy)) { // player wants to move more horizontally
if (tryWalkablePosition(sgn(dx), 0)) return true; // try moving horizontally
if (tryWalkablePosition(0, sgn(dy))) return true; // try moving vertically
if (tryWalkablePosition(sgn(dx), 0, aggressiveness)) return true; // try moving horizontally
if (tryWalkablePosition(0, sgn(dy), aggressiveness)) return true; // try moving vertically
return false;
} else { // player wants to move more vertically
if (tryWalkablePosition(0, sgn(dy))) return true; // try moving vertically
if (tryWalkablePosition(sgn(dx), 0)) return true; // try moving horizontally
if (tryWalkablePosition(0, sgn(dy), aggressiveness)) return true; // try moving vertically
if (tryWalkablePosition(sgn(dx), 0, aggressiveness)) return true; // try moving horizontally
return false;
}
}
private boolean tryWalkablePosition(int dx, int dy) {
private boolean tryWalkablePosition(int dx, int dy, int aggressiveness) {
final Player player = model.player;
player.nextPosition.set(
player.position.x + dx
,player.position.y + dy
);
if (model.currentMap.isWalkable(player.nextPosition)) return true;
return false;
if (!model.currentMap.isWalkable(player.nextPosition)) return false;
// allow player to enter every field when he is NORMAL
// prevent player from entering "non-monster-fields" when he is AGGRESSIVE
// prevent player from entering "monster-fields" when he is DEFENSIVE
if (aggressiveness == AndorsTrailPreferences.MOVEMENTAGGRESSIVENESS_NORMAL) return true;
Monster m = model.currentMap.getMonsterAt(player.nextPosition);
if (m != null && !m.isAgressive()) return true; // avoid MOVEMENTAGGRESSIVENESS settings for NPCs
if (aggressiveness == AndorsTrailPreferences.MOVEMENTAGGRESSIVENESS_AGGRESSIVE && m == null) return false;
else if (aggressiveness == AndorsTrailPreferences.MOVEMENTAGGRESSIVENESS_DEFENSIVE && m != null) return false;
return true;
}
private static int sgn(final int v) {
@@ -216,4 +240,27 @@ public final class MovementController {
public static void loadCurrentTileMap(Resources res, WorldContext world) {
world.model.currentTileMap = TMXMapReader.readLayeredTileMap(res, world.tileStore, world.model.currentMap);
}
private int movementDx;
private int movementDy;
public void startMovement(int dx, int dy) {
if (model.uiSelections.isInCombat) return;
movementDx = dx;
movementDy = dy;
movementHandler.start();
}
public void stopMovement() {
movementHandler.stop();
}
public void onTick(TimedMessageTask task) {
if (!model.uiSelections.isMainActivityVisible) return;
if (model.uiSelections.isInCombat) return;
movePlayer(movementDx, movementDy);
movementHandler.queueAnotherTick();
}
}

View File

@@ -53,7 +53,7 @@ public final class DynamicTileLoader {
TilesetBitmap b = getTilesetBitmap(tilesetImageResourceID);
if (b == null) {
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
L.log("WARNING: Cannot load tileset " + tilesetImageResourceID);
L.log("WARNING: Cannot load tileset " + tilesetImageResourceID + " for localId " + localId);
}
return currentTileStoreIndex-1;
}

View File

@@ -3,20 +3,133 @@ package com.gpl.rpg.AndorsTrail.resource;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.item.ItemTypeCollection;
import com.gpl.rpg.AndorsTrail.model.map.TMXMapReader;
import com.gpl.rpg.AndorsTrail.util.Size;
import android.content.res.Resources;
import android.content.res.TypedArray;
public final class ResourceLoader {
private static final int actorConditionsResourceId = R.array.loadresource_actorconditions;
private static final int itemsResourceId = AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES ? R.array.loadresource_items_debug : R.array.loadresource_items;
private static final int droplistsResourceId = AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES ? R.array.loadresource_droplists_debug : R.array.loadresource_droplists;
private static final int questsResourceId = AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES ? R.array.loadresource_quests_debug : R.array.loadresource_quests;
private static final int conversationsListsResourceId = AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES ? R.array.loadresource_conversationlists_debug : R.array.loadresource_conversationlists;
private static final int monstersResourceId = AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES ? R.array.loadresource_monsters_debug : R.array.loadresource_monsters;
private static final int mapsResourceId = AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES ? R.array.loadresource_maps_debug : R.array.loadresource_maps;
public static void loadResources(WorldContext world, Resources r) {
final TileStore tiles = world.tileStore;
final int mTileSize = tiles.tileSize;
final Size dst_sz1x1 = new Size(mTileSize, mTileSize);
DynamicTileLoader loader = new DynamicTileLoader(tiles, r);
prepareTilesets(loader, mTileSize);
// ========================================================================
// Load various ui icons
/*tiles.iconID_CHAR_HERO = */loader.prepareTileID(R.drawable.char_hero, 0);
/*tiles.iconID_attackselect = */loader.prepareTileID(R.drawable.map_tiles_1_2, 6+16*5);
/*tiles.iconID_moveselect = */loader.prepareTileID(R.drawable.map_tiles_1_2, 7+16*5);
/*tiles.iconID_groundbag = */loader.prepareTileID(R.drawable.map_tiles_2_7, 13+16*0);
/*tiles.iconID_boxopened = */loader.prepareTileID(R.drawable.items_tiles, 8+14*29);
/*tiles.iconID_boxclosed = */loader.prepareTileID(R.drawable.items_tiles, 7+14*29);
// ========================================================================
// Load condition types
final TypedArray conditionsToLoad = r.obtainTypedArray(actorConditionsResourceId);
for (int i = 0; i < conditionsToLoad.length(); ++i) {
world.actorConditionsTypes.initialize(loader, conditionsToLoad.getString(i));
}
// ========================================================================
// Load items
final TypedArray itemsToLoad = r.obtainTypedArray(itemsResourceId);
for (int i = 0; i < itemsToLoad.length(); ++i) {
world.itemTypes.initialize(loader, world.actorConditionsTypes, itemsToLoad.getString(i));
}
// ========================================================================
// Load droplists
final TypedArray droplistsToLoad = r.obtainTypedArray(droplistsResourceId);
for (int i = 0; i < droplistsToLoad.length(); ++i) {
world.dropLists.initialize(world.itemTypes, droplistsToLoad.getString(i));
}
// ========================================================================
// Load quests
final TypedArray questsToLoad = r.obtainTypedArray(questsResourceId);
for (int i = 0; i < questsToLoad.length(); ++i) {
world.quests.initialize(questsToLoad.getString(i));
}
// ========================================================================
// Load conversations
final TypedArray conversationsListsToLoad = r.obtainTypedArray(conversationsListsResourceId);
for (int i = 0; i < conversationsListsToLoad.length(); ++i) {
world.conversations.initialize(world.itemTypes, world.dropLists, conversationsListsToLoad.getString(i));
}
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
world.conversations.verifyData();
}
// ========================================================================
// Load monsters
final TypedArray monstersToLoad = r.obtainTypedArray(monstersResourceId);
for (int i = 0; i < monstersToLoad.length(); ++i) {
world.monsterTypes.initialize(world.dropLists, world.actorConditionsTypes, loader, monstersToLoad.getString(i));
}
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
world.monsterTypes.verifyData(world);
}
// ========================================================================
// Load maps
TMXMapReader mapReader = new TMXMapReader();
final TypedArray mapsToLoad = r.obtainTypedArray(mapsResourceId);
for (int i = 0; i < mapsToLoad.length(); ++i) {
final int mapResourceId = mapsToLoad.getResourceId(i, -1);
final String mapName = r.getResourceEntryName(mapResourceId);
mapReader.read(r, mapResourceId, mapName);
}
world.maps.predefinedMaps.addAll(mapReader.transformMaps(loader, world.monsterTypes, world.dropLists));
mapReader = null;
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
world.maps.verifyData(world);
}
// ========================================================================
// Load effects
world.visualEffectTypes.initialize(loader);
// ========================================================================
// Load graphics resources (icons and tiles)
loader.flush();
loader = null;
// ========================================================================
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
world.verifyData();
}
}
private static void prepareTilesets(DynamicTileLoader loader, int mTileSize) {
final Size dst_sz1x1 = new Size(mTileSize, mTileSize);
final Size dst_sz2x2 = new Size(mTileSize*2, mTileSize*2);
//final Size dst_sz2x3 = new Size(mTileSize*2, mTileSize*3);
//final Size dst_sz4x3 = new Size(mTileSize*4, mTileSize*3);
@@ -27,163 +140,10 @@ public final class ResourceLoader {
final Size src_mapTileSize = new Size(16, 8);
final Size src_mapTileSize7 = new Size(16, 7);
DynamicTileLoader loader = new DynamicTileLoader(tiles, r);
// ========================================================================
// Load various ui icons
loader.prepareTileset(R.drawable.char_hero, "char_hero", src_sz1x1, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_2, "map_tiles_1_2", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_7, "map_tiles_2_7", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.items_tiles, "items_tiles", new Size(14, 30), defaultTileSize);
/*tiles.iconID_CHAR_HERO = */loader.prepareTileID(R.drawable.char_hero, 0);
/*tiles.iconID_attackselect = */loader.prepareTileID(R.drawable.map_tiles_1_2, 6+16*5);
/*tiles.iconID_moveselect = */loader.prepareTileID(R.drawable.map_tiles_1_2, 7+16*5);
/*tiles.iconID_groundbag = */loader.prepareTileID(R.drawable.map_tiles_2_7, 13+16*0);
/*tiles.iconID_boxopened = */loader.prepareTileID(R.drawable.items_tiles, 8+14*29);
/*tiles.iconID_boxclosed = */loader.prepareTileID(R.drawable.items_tiles, 7+14*29);
loader.flush();
// ========================================================================
// Load condition types
loader.prepareTileset(R.drawable.items_tiles, "items_tiles", new Size(14, 30), defaultTileSize);
world.actorConditionsTypes.initialize(loader, r.getString(R.string.actorconditions_v069));
world.actorConditionsTypes.initialize(loader, r.getString(R.string.actorconditions_v069_bwm));
loader.flush();
// ========================================================================
// Load item icons
loader.prepareTileset(R.drawable.items_tiles, "items_tiles", new Size(14, 30), defaultTileSize);
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_money));
assert(world.itemTypes.getItemTypeByTag("gold") != null);
assert(world.itemTypes.getItemTypeByTag("gold").id == ItemTypeCollection.ITEMTYPE_GOLD);
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_weapons));
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_armour));
if (AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES) {
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_debug));
} else {
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_rings));
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_necklaces));
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_junk));
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_food));
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_potions));
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_animal));
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_quest));
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_v068));
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_v069));
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_v069_questitems));
world.itemTypes.initialize(loader, world.actorConditionsTypes, r.getString(R.string.itemlist_v069_2));
}
loader.flush();
// ========================================================================
// Load Droplists
if (AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES) {
world.dropLists.initialize(world.itemTypes, r.getString(R.string.droplists_debug));
} else {
world.dropLists.initialize(world.itemTypes, r.getString(R.string.droplists_crossglen));
world.dropLists.initialize(world.itemTypes, r.getString(R.string.droplists_crossglen_outside));
world.dropLists.initialize(world.itemTypes, r.getString(R.string.droplists_fallhaven));
world.dropLists.initialize(world.itemTypes, r.getString(R.string.droplists_wilderness));
world.dropLists.initialize(world.itemTypes, r.getString(R.string.droplists_v068));
world.dropLists.initialize(world.itemTypes, r.getString(R.string.droplists_v069_npcs));
world.dropLists.initialize(world.itemTypes, r.getString(R.string.droplists_v069_monsters));
}
// ========================================================================
// Load Quests
if (AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES) {
world.quests.initialize(r.getString(R.string.questlist_debug));
} else {
world.quests.initialize(r.getString(R.string.questlist));
world.quests.initialize(r.getString(R.string.questlist_nondisplayed));
world.quests.initialize(r.getString(R.string.questlist_v068));
world.quests.initialize(r.getString(R.string.questlist_v069));
}
// ========================================================================
// Load Conversation
if (AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES) {
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_debug));
} else {
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_mikhail));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_crossglen));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_crossglen_gruil));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_crossglen_leonid));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_crossglen_tharal));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_crossglen_leta));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_crossglen_odair));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_jan));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_arcir));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_bucus));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_church));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_athamyr));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_drunk));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_nocmar));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_oldman));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_tavern));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_larcal));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_unnmir));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_gaela));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_vacor));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_unzel));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_wilderness));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_flagstone));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_south));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_signs_pre067));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_thievesguild_1));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_farrik));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_fallhaven_warden));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_umar));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_kaori));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_vilegard_villagers));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_vilegard_erttu));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_vilegard_tavern));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_jolnor));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_alynndir));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_shops));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_ogam));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_foamingflask));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_ambelie));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_foamingflask_guards));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_foamingflask_outsideguard));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_wrye));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_oluag));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_signs_v068));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_maelveon));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_bwm_agent_1));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_bwm_agent_2));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_bwm_agent_3));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_bwm_agent_4));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_bwm_agent_5));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_bwm_agent_6));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_prim_arghest));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_prim_outside));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_prim_inn));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_prim_tavern));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_prim_guthbered));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_blackwater_signs));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_blackwater_harlenn));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_blackwater_upper));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_blackwater_lower));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_blackwater_herec));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_prim_bjorgur));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_prim_fulus));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_prim_merchants));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_blackwater_throdna));
world.conversations.initialize(world.itemTypes, world.dropLists, r.getString(R.string.conversationlist_blackwater_kazaul));
}
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
world.conversations.verifyData();
}
// ========================================================================
// Load monster icons
//loader.prepareTileset(R.drawable.monsters_armor1, "monsters_armor1", src_sz1x1, defaultTileSize);
loader.prepareTileset(R.drawable.monsters_demon1, "monsters_demon1", src_sz1x1, dst_sz2x2);
loader.prepareTileset(R.drawable.monsters_dogs, "monsters_dogs", src_sz7x1, defaultTileSize);
@@ -215,267 +175,26 @@ public final class ResourceLoader {
loader.prepareTileset(R.drawable.monsters_rltiles1, "monsters_rltiles1", new Size(20, 8), defaultTileSize);
loader.prepareTileset(R.drawable.monsters_rltiles2, "monsters_rltiles2", new Size(20, 9), defaultTileSize);
loader.prepareTileset(R.drawable.karvis_npc, "karvis_npc", new Size(9, 1), defaultTileSize);
if (AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES) {
world.monsterTypes.initialize(world.dropLists, world.actorConditionsTypes, loader, r.getString(R.string.monsterlist_debug));
} else {
world.monsterTypes.initialize(world.dropLists, world.actorConditionsTypes, loader, r.getString(R.string.monsterlist_crossglen_animals));
world.monsterTypes.initialize(world.dropLists, world.actorConditionsTypes, loader, r.getString(R.string.monsterlist_crossglen_npcs));
world.monsterTypes.initialize(world.dropLists, world.actorConditionsTypes, loader, r.getString(R.string.monsterlist_fallhaven_animals));
world.monsterTypes.initialize(world.dropLists, world.actorConditionsTypes, loader, r.getString(R.string.monsterlist_fallhaven_npcs));
world.monsterTypes.initialize(world.dropLists, world.actorConditionsTypes, loader, r.getString(R.string.monsterlist_wilderness));
world.monsterTypes.initialize(world.dropLists, world.actorConditionsTypes, loader, r.getString(R.string.monsterlist_v068_npcs));
world.monsterTypes.initialize(world.dropLists, world.actorConditionsTypes, loader, r.getString(R.string.monsterlist_v069_monsters));
world.monsterTypes.initialize(world.dropLists, world.actorConditionsTypes, loader, r.getString(R.string.monsterlist_v069_npcs));
}
loader.flush();
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
world.monsterTypes.verifyData(world);
}
// ========================================================================
// Load map icons
loader.prepareTileset(R.drawable.map_tiles_1_1, "map_tiles_1_1.png", src_mapTileSize, defaultTileSize);
if (!AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES) {
loader.prepareTileset(R.drawable.map_tiles_1_2, "map_tiles_1_2.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_3, "map_tiles_1_3.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_4, "map_tiles_1_4.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_5, "map_tiles_1_5.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_6, "map_tiles_1_6.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_7, "map_tiles_1_7.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_8, "map_tiles_1_8.png", src_mapTileSize7, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_1, "map_tiles_2_1.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_2, "map_tiles_2_2.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_3, "map_tiles_2_3.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_4, "map_tiles_2_4.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_5, "map_tiles_2_5.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_6, "map_tiles_2_6.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_7, "map_tiles_2_7.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_8, "map_tiles_2_8.png", src_mapTileSize7, defaultTileSize);
}
TMXMapReader mapReader = new TMXMapReader();
if (AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES) {
mapReader.read(r, R.xml.debugmap, "debugmap");
} else {
mapReader.read(r, R.xml.home, "home");
mapReader.read(r, R.xml.crossglen, "crossglen");
mapReader.read(r, R.xml.crossglen_farmhouse, "crossglen_farmhouse");
mapReader.read(r, R.xml.crossglen_farmhouse_basement, "crossglen_farmhouse_basement");
mapReader.read(r, R.xml.crossglen_hall, "crossglen_hall");
mapReader.read(r, R.xml.crossglen_smith, "crossglen_smith");
mapReader.read(r, R.xml.crossglen_cave, "crossglen_cave");
mapReader.read(r, R.xml.wild1, "wild1");
mapReader.read(r, R.xml.wild2, "wild2");
mapReader.read(r, R.xml.wild3, "wild3");
mapReader.read(r, R.xml.jan_pitcave1, "jan_pitcave1");
mapReader.read(r, R.xml.jan_pitcave2, "jan_pitcave2");
mapReader.read(r, R.xml.jan_pitcave3, "jan_pitcave3");
mapReader.read(r, R.xml.fallhaven_nw, "fallhaven_nw");
mapReader.read(r, R.xml.snakecave1, "snakecave1");
mapReader.read(r, R.xml.snakecave2, "snakecave2");
mapReader.read(r, R.xml.snakecave3, "snakecave3");
mapReader.read(r, R.xml.wild4, "wild4");
mapReader.read(r, R.xml.hauntedhouse1, "hauntedhouse1");
mapReader.read(r, R.xml.hauntedhouse2, "hauntedhouse2");
mapReader.read(r, R.xml.fallhaven_ne, "fallhaven_ne");
mapReader.read(r, R.xml.fallhaven_church, "fallhaven_church");
mapReader.read(r, R.xml.fallhaven_barn, "fallhaven_barn");
mapReader.read(r, R.xml.fallhaven_potions, "fallhaven_potions");
mapReader.read(r, R.xml.fallhaven_gravedigger, "fallhaven_gravedigger");
mapReader.read(r, R.xml.fallhaven_clothes, "fallhaven_clothes");
mapReader.read(r, R.xml.fallhaven_arcir, "fallhaven_arcir");
mapReader.read(r, R.xml.fallhaven_arcir_basement, "fallhaven_arcir_basement");
mapReader.read(r, R.xml.fallhaven_athamyr, "fallhaven_athamyr");
mapReader.read(r, R.xml.fallhaven_rigmor, "fallhaven_rigmor");
mapReader.read(r, R.xml.fallhaven_tavern, "fallhaven_tavern");
mapReader.read(r, R.xml.fallhaven_prison, "fallhaven_prison");
mapReader.read(r, R.xml.fallhaven_derelict, "fallhaven_derelict");
mapReader.read(r, R.xml.fallhaven_nocmar, "fallhaven_nocmar");
mapReader.read(r, R.xml.catacombs1, "catacombs1");
mapReader.read(r, R.xml.catacombs2, "catacombs2");
mapReader.read(r, R.xml.catacombs3, "catacombs3");
mapReader.read(r, R.xml.catacombs4, "catacombs4");
mapReader.read(r, R.xml.hauntedhouse3, "hauntedhouse3");
mapReader.read(r, R.xml.hauntedhouse4, "hauntedhouse4");
mapReader.read(r, R.xml.fallhaven_sw, "fallhaven_sw");
mapReader.read(r, R.xml.wild5, "wild5");
mapReader.read(r, R.xml.wild6, "wild6");
mapReader.read(r, R.xml.wild6_house, "wild6_house");
mapReader.read(r, R.xml.wild7, "wild7");
mapReader.read(r, R.xml.wild8, "wild8");
mapReader.read(r, R.xml.wild9, "wild9");
mapReader.read(r, R.xml.wild10, "wild10");
mapReader.read(r, R.xml.flagstone0, "flagstone0");
mapReader.read(r, R.xml.flagstone_inner, "flagstone_inner");
mapReader.read(r, R.xml.flagstone_upper, "flagstone_upper");
mapReader.read(r, R.xml.flagstone1, "flagstone1");
mapReader.read(r, R.xml.flagstone2, "flagstone2");
mapReader.read(r, R.xml.flagstone3, "flagstone3");
mapReader.read(r, R.xml.flagstone4, "flagstone4");
mapReader.read(r, R.xml.wild11, "wild11");
mapReader.read(r, R.xml.wild12, "wild12");
mapReader.read(r, R.xml.wild11_clearing, "wild11_clearing");
mapReader.read(r, R.xml.clearing_level1, "clearing_level1");
mapReader.read(r, R.xml.clearing_level2, "clearing_level2");
mapReader.read(r, R.xml.fallhaven_se, "fallhaven_se");
mapReader.read(r, R.xml.fallhaven_lumberjack, "fallhaven_lumberjack");
mapReader.read(r, R.xml.fallhaven_alaun, "fallhaven_alaun");
mapReader.read(r, R.xml.fallhaven_storage, "fallhaven_storage");
mapReader.read(r, R.xml.fallhaven_farmer, "fallhaven_farmer");
mapReader.read(r, R.xml.wild13, "wild13");
mapReader.read(r, R.xml.wild14, "wild14");
mapReader.read(r, R.xml.wild14_cave, "wild14_cave");
mapReader.read(r, R.xml.wild14_clearing, "wild14_clearing");
mapReader.read(r, R.xml.wild15, "wild15");
mapReader.read(r, R.xml.wild15_house, "wild15_house");
mapReader.read(r, R.xml.road1, "road1");
mapReader.read(r, R.xml.foaming_flask, "foaming_flask");
mapReader.read(r, R.xml.fallhaven_derelict2, "fallhaven_derelict2");
mapReader.read(r, R.xml.vilegard_n, "vilegard_n");
mapReader.read(r, R.xml.vilegard_s, "vilegard_s");
mapReader.read(r, R.xml.vilegard_sw, "vilegard_sw");
mapReader.read(r, R.xml.vilegard_ogam, "vilegard_ogam");
mapReader.read(r, R.xml.vilegard_chapel, "vilegard_chapel");
mapReader.read(r, R.xml.vilegard_tavern, "vilegard_tavern");
mapReader.read(r, R.xml.vilegard_armorer, "vilegard_armorer");
mapReader.read(r, R.xml.vilegard_smith, "vilegard_smith");
mapReader.read(r, R.xml.vilegard_wrye, "vilegard_wrye");
mapReader.read(r, R.xml.vilegard_kaori, "vilegard_kaori");
mapReader.read(r, R.xml.vilegard_erttu, "vilegard_erttu");
mapReader.read(r, R.xml.road2, "road2");
mapReader.read(r, R.xml.road3, "road3");
mapReader.read(r, R.xml.road4, "road4");
mapReader.read(r, R.xml.road4_gargoylecave, "road4_gargoylecave");
mapReader.read(r, R.xml.road5, "road5");
mapReader.read(r, R.xml.road5_house, "road5_house");
mapReader.read(r, R.xml.gargoylecave1, "gargoylecave1");
mapReader.read(r, R.xml.gargoylecave2, "gargoylecave2");
mapReader.read(r, R.xml.gargoylecave3, "gargoylecave3");
mapReader.read(r, R.xml.gargoylecave4, "gargoylecave4");
mapReader.read(r, R.xml.blackwater_mountain0, "blackwater_mountain0");
mapReader.read(r, R.xml.blackwater_mountain1, "blackwater_mountain1");
mapReader.read(r, R.xml.blackwater_mountain2, "blackwater_mountain2");
mapReader.read(r, R.xml.blackwater_mountain3, "blackwater_mountain3");
mapReader.read(r, R.xml.blackwater_mountain4, "blackwater_mountain4");
mapReader.read(r, R.xml.blackwater_mountain5, "blackwater_mountain5");
mapReader.read(r, R.xml.blackwater_mountain6, "blackwater_mountain6");
mapReader.read(r, R.xml.blackwater_mountain7, "blackwater_mountain7");
mapReader.read(r, R.xml.blackwater_mountain8, "blackwater_mountain8");
mapReader.read(r, R.xml.blackwater_mountain9, "blackwater_mountain9");
mapReader.read(r, R.xml.blackwater_mountain10, "blackwater_mountain10");
mapReader.read(r, R.xml.blackwater_mountain11, "blackwater_mountain11");
mapReader.read(r, R.xml.blackwater_mountain12, "blackwater_mountain12");
mapReader.read(r, R.xml.blackwater_mountain13, "blackwater_mountain13");
mapReader.read(r, R.xml.blackwater_mountain14, "blackwater_mountain14");
mapReader.read(r, R.xml.blackwater_mountain15, "blackwater_mountain15");
mapReader.read(r, R.xml.blackwater_mountain16, "blackwater_mountain16");
mapReader.read(r, R.xml.blackwater_mountain17, "blackwater_mountain17");
mapReader.read(r, R.xml.blackwater_mountain18, "blackwater_mountain18");
mapReader.read(r, R.xml.blackwater_mountain19, "blackwater_mountain19");
mapReader.read(r, R.xml.blackwater_mountain20, "blackwater_mountain20");
mapReader.read(r, R.xml.blackwater_mountain21, "blackwater_mountain21");
mapReader.read(r, R.xml.blackwater_mountain22, "blackwater_mountain22");
mapReader.read(r, R.xml.blackwater_mountain23, "blackwater_mountain23");
mapReader.read(r, R.xml.blackwater_mountain24, "blackwater_mountain24");
mapReader.read(r, R.xml.blackwater_mountain25, "blackwater_mountain25");
mapReader.read(r, R.xml.blackwater_mountain26, "blackwater_mountain26");
mapReader.read(r, R.xml.blackwater_mountain27, "blackwater_mountain27");
mapReader.read(r, R.xml.blackwater_mountain28, "blackwater_mountain28");
mapReader.read(r, R.xml.blackwater_mountain29, "blackwater_mountain29");
mapReader.read(r, R.xml.blackwater_mountain30, "blackwater_mountain30");
mapReader.read(r, R.xml.blackwater_mountain31, "blackwater_mountain31");
mapReader.read(r, R.xml.blackwater_mountain32, "blackwater_mountain32");
mapReader.read(r, R.xml.blackwater_mountain33, "blackwater_mountain33");
mapReader.read(r, R.xml.blackwater_mountain34, "blackwater_mountain34");
mapReader.read(r, R.xml.blackwater_mountain35, "blackwater_mountain35");
mapReader.read(r, R.xml.blackwater_mountain36, "blackwater_mountain36");
mapReader.read(r, R.xml.blackwater_mountain37, "blackwater_mountain37");
mapReader.read(r, R.xml.blackwater_mountain38, "blackwater_mountain38");
mapReader.read(r, R.xml.blackwater_mountain39, "blackwater_mountain39");
mapReader.read(r, R.xml.blackwater_mountain40, "blackwater_mountain40");
mapReader.read(r, R.xml.blackwater_mountain41, "blackwater_mountain41");
mapReader.read(r, R.xml.blackwater_mountain42, "blackwater_mountain42");
mapReader.read(r, R.xml.blackwater_mountain43, "blackwater_mountain43");
mapReader.read(r, R.xml.blackwater_mountain44, "blackwater_mountain44");
mapReader.read(r, R.xml.blackwater_mountain45, "blackwater_mountain45");
mapReader.read(r, R.xml.blackwater_mountain46, "blackwater_mountain46");
mapReader.read(r, R.xml.blackwater_mountain47, "blackwater_mountain47");
mapReader.read(r, R.xml.blackwater_mountain48, "blackwater_mountain48");
mapReader.read(r, R.xml.blackwater_mountain49, "blackwater_mountain49");
mapReader.read(r, R.xml.blackwater_mountain50, "blackwater_mountain50");
mapReader.read(r, R.xml.blackwater_mountain51, "blackwater_mountain51");
mapReader.read(r, R.xml.blackwater_mountain52, "blackwater_mountain52");
mapReader.read(r, R.xml.wild0, "wild0");
mapReader.read(r, R.xml.crossroads, "crossroads");
mapReader.read(r, R.xml.fields0, "fields0");
mapReader.read(r, R.xml.fields1, "fields1");
mapReader.read(r, R.xml.fields2, "fields2");
mapReader.read(r, R.xml.fields3, "fields3");
mapReader.read(r, R.xml.fields4, "fields4");
mapReader.read(r, R.xml.fields5, "fields5");
mapReader.read(r, R.xml.fields6, "fields6");
mapReader.read(r, R.xml.fields7, "fields7");
mapReader.read(r, R.xml.fields8, "fields8");
mapReader.read(r, R.xml.fields9, "fields9");
mapReader.read(r, R.xml.fields10, "fields10");
mapReader.read(r, R.xml.fields11, "fields11");
mapReader.read(r, R.xml.fields12, "fields12");
mapReader.read(r, R.xml.houseatcrossroads0, "houseatcrossroads0");
mapReader.read(r, R.xml.houseatcrossroads1, "houseatcrossroads1");
mapReader.read(r, R.xml.houseatcrossroads2, "houseatcrossroads2");
mapReader.read(r, R.xml.houseatcrossroads3, "houseatcrossroads3");
mapReader.read(r, R.xml.houseatcrossroads4, "houseatcrossroads4");
mapReader.read(r, R.xml.houseatcrossroads5, "houseatcrossroads5");
mapReader.read(r, R.xml.loneford1, "loneford1");
mapReader.read(r, R.xml.loneford2, "loneford2");
mapReader.read(r, R.xml.loneford3, "loneford3");
mapReader.read(r, R.xml.loneford4, "loneford4");
mapReader.read(r, R.xml.loneford5, "loneford5");
mapReader.read(r, R.xml.loneford6, "loneford6");
mapReader.read(r, R.xml.loneford7, "loneford7");
mapReader.read(r, R.xml.loneford8, "loneford8");
mapReader.read(r, R.xml.loneford9, "loneford9");
mapReader.read(r, R.xml.loneford10, "loneford10");
mapReader.read(r, R.xml.roadbeforecrossroads, "roadbeforecrossroads");
mapReader.read(r, R.xml.roadtocarntower0, "roadtocarntower0");
mapReader.read(r, R.xml.roadtocarntower1, "roadtocarntower1");
mapReader.read(r, R.xml.roadtocarntower2, "roadtocarntower2");
mapReader.read(r, R.xml.woodcave0, "woodcave0");
mapReader.read(r, R.xml.woodcave1, "woodcave1");
mapReader.read(r, R.xml.wild16, "wild16");
mapReader.read(r, R.xml.wild17, "wild17");
mapReader.read(r, R.xml.gapfiller1, "gapfiller1");
mapReader.read(r, R.xml.gapfiller3, "gapfiller3");
mapReader.read(r, R.xml.gapfiller4, "gapfiller4");
}
world.maps.predefinedMaps.addAll(mapReader.transformMaps(loader, world.monsterTypes, world.dropLists));
mapReader = null;
loader.flush();
loader.prepareTileset(R.drawable.map_tiles_1_2, "map_tiles_1_2.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_3, "map_tiles_1_3.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_4, "map_tiles_1_4.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_5, "map_tiles_1_5.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_6, "map_tiles_1_6.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_7, "map_tiles_1_7.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_1_8, "map_tiles_1_8.png", src_mapTileSize7, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_1, "map_tiles_2_1.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_2, "map_tiles_2_2.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_3, "map_tiles_2_3.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_4, "map_tiles_2_4.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_5, "map_tiles_2_5.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_6, "map_tiles_2_6.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_7, "map_tiles_2_7.png", src_mapTileSize, defaultTileSize);
loader.prepareTileset(R.drawable.map_tiles_2_8, "map_tiles_2_8.png", src_mapTileSize7, defaultTileSize);
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
world.maps.verifyData(world);
}
// ========================================================================
// Load effects
loader.prepareTileset(R.drawable.effect_blood3, "effect_blood3", new Size(8, 2), dst_sz1x1);
loader.prepareTileset(R.drawable.effect_heal2, "effect_heal2", new Size(8, 2), dst_sz1x1);
loader.prepareTileset(R.drawable.effect_poison1, "effect_poison1", new Size(8, 2), dst_sz1x1);
world.visualEffectTypes.initialize(loader);
loader.flush();
loader = null;
// ========================================================================
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) {
world.verifyData();
}
}
loader.prepareTileset(R.drawable.effect_blood3, "effect_blood3", new Size(8, 2), defaultTileSize);
loader.prepareTileset(R.drawable.effect_heal2, "effect_heal2", new Size(8, 2), defaultTileSize);
loader.prepareTileset(R.drawable.effect_poison1, "effect_poison1", new Size(8, 2), defaultTileSize);
}
}

View File

@@ -0,0 +1,66 @@
package com.gpl.rpg.AndorsTrail.util;
import android.os.Handler;
import android.os.Message;
public final class TimedMessageTask extends Handler {
private final long interval;
private final boolean requireIntervalBeforeFirstTick;
private final Callback callback;
private long nextTickTime;
private boolean hasQueuedTick = false;
public TimedMessageTask(Callback callback, long interval, boolean requireIntervalBeforeFirstTick) {
this.interval = interval;
this.requireIntervalBeforeFirstTick = requireIntervalBeforeFirstTick;
this.callback = callback;
this.nextTickTime = System.currentTimeMillis() + interval;
}
@Override
public void handleMessage(Message msg) {
if (!hasQueuedTick) return;
hasQueuedTick = false;
tick();
}
private void tick() {
nextTickTime = System.currentTimeMillis() + interval;
callback.onTick(this);
}
private void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
private boolean hasElapsedIntervalTime() {
return System.currentTimeMillis() >= nextTickTime;
}
public void queueAnotherTick() {
if (hasQueuedTick) return;
hasQueuedTick = true;
sleep(interval);
}
private boolean shouldCauseTickOnStart() {
if (requireIntervalBeforeFirstTick) return false;
if (hasQueuedTick) return false;
if (!hasElapsedIntervalTime()) return false;
return true;
}
public void start() {
if (shouldCauseTickOnStart()) tick();
queueAnotherTick();
}
public void stop() {
hasQueuedTick = false;
}
public interface Callback {
public void onTick(TimedMessageTask task);
}
}

View File

@@ -99,13 +99,17 @@ public final class MainView extends SurfaceView implements SurfaceHolder.Callbac
} else {
return super.onKeyDown(keyCode, msg);
}
//TODO: add more keys
return true;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent msg) {
if (!model.uiSelections.isMainActivityVisible) return true;
view.movementController.stopMovement();
return true;
}
private void keyboardAction(int dx, int dy) {
if (!allowInputInterval()) return;
lastTouchPosition_dx = dx;
lastTouchPosition_dy = dy;
onClick();
@@ -151,10 +155,12 @@ public final class MainView extends SurfaceView implements SurfaceHolder.Callbac
}
private void onClick() {
if (!allowInputInterval()) return;
if (model.uiSelections.isInCombat) {
view.combatController.executeMoveAttack(lastTouchPosition_dx, lastTouchPosition_dy);
} else {
view.movementController.movePlayer(lastTouchPosition_dx, lastTouchPosition_dy);
view.movementController.startMovement(lastTouchPosition_dx, lastTouchPosition_dy);
view.movementController.stopMovement();
}
}
@@ -185,18 +191,21 @@ public final class MainView extends SurfaceView implements SurfaceHolder.Callbac
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
if (!allowInputInterval()) return true;
lastTouchPosition_tileCoords.set(
(int) Math.floor(((int)event.getX() - screenOffset.x) / scaledTileSize) + mapTopLeft.x
,(int) Math.floor(((int)event.getY() - screenOffset.y) / scaledTileSize) + mapTopLeft.y);
lastTouchPosition_dx = lastTouchPosition_tileCoords.x - model.player.position.x;
lastTouchPosition_dy = lastTouchPosition_tileCoords.y - model.player.position.y;
if (!model.uiSelections.isInCombat) {
view.movementController.movePlayer(lastTouchPosition_dx, lastTouchPosition_dy);
return true;
}
if (model.uiSelections.isInCombat) break;
view.movementController.startMovement(lastTouchPosition_dx, lastTouchPosition_dy);
return true;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE:
view.movementController.stopMovement();
break;
}
return super.onTouchEvent(event);
}

View File

@@ -0,0 +1,147 @@
package com.gpl.rpg.AndorsTrail.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.context.ViewContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
public final class VirtualDpadView extends ImageView implements OnClickListener {
private final WorldContext world;
private final ViewContext view;
private int one_third_width;
private int two_thirds_width;
private int full_width;
private int one_third_height;
private int two_thirds_height;
private int full_height;
private boolean isMinimized = false;
private int lastTouchPosition_dx;
private int lastTouchPosition_dy;
public VirtualDpadView(final Context context, AttributeSet attr) {
super(context, attr);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivityContext(context);
this.world = app.world;
this.view = app.currentView.get();
setImageResource(R.drawable.ui_dpad);
setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
setFocusable(false);
setOnClickListener(this);
setAdjustViewBounds(true);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (!isMinimized) {
one_third_width = w / 3;
two_thirds_width = w * 2 / 3;
full_width = w;
one_third_height = h / 3;
two_thirds_height = h * 2 / 3;
full_height = h;
}
super.onSizeChanged(w, h, oldw, oldh);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isMinimized) return super.onTouchEvent(event);
if (!world.model.uiSelections.isMainActivityVisible) return true;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
if (world.model.uiSelections.isInCombat) break;
final int x = (int)event.getX();
lastTouchPosition_dx = 0;
if (x < one_third_width) lastTouchPosition_dx = -1;
else if (x >= two_thirds_width) lastTouchPosition_dx = 1;
final int y = (int)event.getY();
lastTouchPosition_dy = 0;
if (y < one_third_height) lastTouchPosition_dy = -1;
else if (y >= two_thirds_height) lastTouchPosition_dy = 1;
if (lastTouchPosition_dx == 0 && lastTouchPosition_dy == 0) break;
this.view.movementController.startMovement(lastTouchPosition_dx, lastTouchPosition_dy);
return true;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE:
this.view.movementController.stopMovement();
break;
}
return super.onTouchEvent(event);
}
public void updateVisibility(AndorsTrailPreferences preferences) {
int dpadPosition = preferences.dpadPosition;
if (dpadPosition == AndorsTrailPreferences.DPAD_POSITION_DISABLED) {
setVisibility(View.GONE);
return;
}
setVisibility(View.VISIBLE);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
if (dpadPosition == AndorsTrailPreferences.DPAD_POSITION_LOWER_RIGHT) {
params.addRule(RelativeLayout.ALIGN_RIGHT, R.id.main_mainview);
params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.main_mainview);
} else if (dpadPosition == AndorsTrailPreferences.DPAD_POSITION_LOWER_LEFT) {
params.addRule(RelativeLayout.ALIGN_LEFT, R.id.main_mainview);
params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.main_mainview);
} else if (dpadPosition == AndorsTrailPreferences.DPAD_POSITION_LOWER_CENTER) {
params.addRule(RelativeLayout.CENTER_HORIZONTAL);
params.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.main_mainview);
} else if (dpadPosition == AndorsTrailPreferences.DPAD_POSITION_UPPER_RIGHT) {
params.addRule(RelativeLayout.ALIGN_RIGHT, R.id.main_mainview);
params.addRule(RelativeLayout.ALIGN_TOP, R.id.main_mainview);
} else if (dpadPosition == AndorsTrailPreferences.DPAD_POSITION_UPPER_LEFT) {
params.addRule(RelativeLayout.ALIGN_LEFT, R.id.main_mainview);
params.addRule(RelativeLayout.ALIGN_TOP, R.id.main_mainview);
} else if (dpadPosition == AndorsTrailPreferences.DPAD_POSITION_UPPER_CENTER) {
params.addRule(RelativeLayout.CENTER_HORIZONTAL);
params.addRule(RelativeLayout.ALIGN_TOP, R.id.main_mainview);
} else if (dpadPosition == AndorsTrailPreferences.DPAD_POSITION_CENTER_LEFT) {
params.addRule(RelativeLayout.ALIGN_LEFT, R.id.main_mainview);
params.addRule(RelativeLayout.CENTER_VERTICAL);
} else if (dpadPosition == AndorsTrailPreferences.DPAD_POSITION_CENTER_RIGHT) {
params.addRule(RelativeLayout.ALIGN_RIGHT, R.id.main_mainview);
params.addRule(RelativeLayout.CENTER_VERTICAL);
}
setLayoutParams(params);
}
@Override
public void onClick(View arg0) {
if (isMinimized) {
isMinimized = false;
setMaxWidth(full_width);
setMaxHeight(full_height);
} else {
if (lastTouchPosition_dx != 0 || lastTouchPosition_dy != 0) return;
isMinimized = true;
setMaxWidth(one_third_width);
setMaxHeight(one_third_height);
}
this.requestLayout();
}
}