v0.3.4: i18n begins! Only changes to actors\hero right now

This commit is contained in:
Evan Debenham 2015-12-27 05:51:50 -05:00 committed by Evan Debenham
parent 9eb8759fe1
commit 18bcdd42cb
6 changed files with 174 additions and 86 deletions
src/com/shatteredpixel/shatteredpixeldungeon

View File

@ -33,6 +33,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey;
import com.shatteredpixel.shatteredpixeldungeon.items.keys.Key; import com.shatteredpixel.shatteredpixeldungeon.items.keys.Key;
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse; import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse;
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand; import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.watabou.utils.Bundle; import com.watabou.utils.Bundle;
import com.watabou.utils.Random; import com.watabou.utils.Random;
@ -53,7 +54,7 @@ public class Belongings implements Iterable<Item> {
this.owner = owner; this.owner = owner;
backpack = new Bag() {{ backpack = new Bag() {{
name = "backpack"; name = Messages.get(Bag.class, "name");
size = BACKPACK_SIZE; size = BACKPACK_SIZE;
}}; }};
backpack.owner = owner; backpack.owner = owner;

View File

@ -94,6 +94,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.AlchemyPot; import com.shatteredpixel.shatteredpixeldungeon.levels.features.AlchemyPot;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm; import com.shatteredpixel.shatteredpixeldungeon.levels.features.Chasm;
import com.shatteredpixel.shatteredpixeldungeon.levels.features.Sign; import com.shatteredpixel.shatteredpixeldungeon.levels.features.Sign;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.plants.Earthroot; import com.shatteredpixel.shatteredpixeldungeon.plants.Earthroot;
import com.shatteredpixel.shatteredpixeldungeon.plants.Sungrass; import com.shatteredpixel.shatteredpixeldungeon.plants.Sungrass;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
@ -124,25 +125,10 @@ public class Hero extends Char {
actPriority = 0; //acts at priority 0, baseline for the rest of behaviour. actPriority = 0; //acts at priority 0, baseline for the rest of behaviour.
} }
private static final String TXT_LEAVE = "One does not simply leave Pixel Dungeon.";
public static final int MAX_LEVEL = 30; public static final int MAX_LEVEL = 30;
private static final String TXT_LEVEL_UP = "level up!";
private static final String TXT_NEW_LEVEL =
"Welcome to level %d! Now you are healthier and more focused. " +
"It's easier for you to hit enemies and dodge their attacks.";
private static final String TXT_LEVEL_CAP =
"You can't gain any more levels, but your experiences still give you a burst of energy!";
public static final String TXT_YOU_NOW_HAVE = "You now have %s"; //TODO: remove this static variable
public static final String TXT_YOU_NOW_HAVE = Messages.get(Hero.class, "you_now_have");
private static final String TXT_SOMETHING_ELSE = "There is something else here";
private static final String TXT_LOCKED_CHEST = "This chest is locked and you don't have matching key";
private static final String TXT_LOCKED_DOOR = "You don't have a matching key";
private static final String TXT_NOTICED_SMTH = "You noticed something";
private static final String TXT_WAIT = "...";
private static final String TXT_SEARCH = "search";
public static final int STARTING_STR = 10; public static final int STARTING_STR = 10;
@ -636,7 +622,7 @@ public class Hero extends Char {
} }
if (!heap.isEmpty()) { if (!heap.isEmpty()) {
GLog.i( TXT_SOMETHING_ELSE ); GLog.i( Messages.get(this, "something_else") );
} }
curAction = null; curAction = null;
} else { } else {
@ -673,7 +659,7 @@ public class Hero extends Char {
theKey = belongings.getKey( GoldenKey.class, Dungeon.depth ); theKey = belongings.getKey( GoldenKey.class, Dungeon.depth );
if (theKey == null) { if (theKey == null) {
GLog.w( TXT_LOCKED_CHEST ); GLog.w( Messages.get(this, "locked_chest") );
ready(); ready();
return false; return false;
} }
@ -735,7 +721,7 @@ public class Hero extends Char {
Sample.INSTANCE.play( Assets.SND_UNLOCK ); Sample.INSTANCE.play( Assets.SND_UNLOCK );
} else { } else {
GLog.w( TXT_LOCKED_DOOR ); GLog.w( Messages.get(this, "locked_door") );
ready(); ready();
} }
@ -785,7 +771,7 @@ public class Hero extends Char {
if (Dungeon.depth == 1) { if (Dungeon.depth == 1) {
if (belongings.getItem( Amulet.class ) == null) { if (belongings.getItem( Amulet.class ) == null) {
GameScene.show( new WndMessage( TXT_LEAVE ) ); GameScene.show( new WndMessage( Messages.get(this, "leave") ) );
ready(); ready();
} else { } else {
Dungeon.win( ResultDescriptions.WIN ); Dungeon.win( ResultDescriptions.WIN );
@ -852,7 +838,7 @@ public class Hero extends Char {
public void rest( boolean fullRest ) { public void rest( boolean fullRest ) {
spendAndNext( TIME_TO_REST ); spendAndNext( TIME_TO_REST );
if (!fullRest) { if (!fullRest) {
sprite.showStatus( CharSprite.DEFAULT, TXT_WAIT ); sprite.showStatus( CharSprite.DEFAULT, Messages.get(this, "wait") );
} }
resting = fullRest; resting = fullRest;
} }
@ -913,7 +899,7 @@ public class Hero extends Char {
if (this.buff(Drowsy.class) != null){ if (this.buff(Drowsy.class) != null){
Buff.detach(this, Drowsy.class); Buff.detach(this, Drowsy.class);
GLog.w("The pain helps you resist the urge to sleep."); GLog.w( Messages.get(this, "pain_resist") );
} }
CapeOfThorns.Thorns thorns = buff( CapeOfThorns.Thorns.class ); CapeOfThorns.Thorns thorns = buff( CapeOfThorns.Thorns.class );
@ -1122,7 +1108,7 @@ public class Hero extends Char {
Buff.prolong(this, Bless.class, 30f); Buff.prolong(this, Bless.class, 30f);
this.exp = 0; this.exp = 0;
GLog.p( "You cannot grow stronger, but your experiences do give you a surge of power!"); GLog.p( Messages.get(this, "level_cap"));
Sample.INSTANCE.play( Assets.SND_LEVELUP ); Sample.INSTANCE.play( Assets.SND_LEVELUP );
} }
@ -1133,8 +1119,8 @@ public class Hero extends Char {
if (levelUp) { if (levelUp) {
GLog.p( TXT_NEW_LEVEL, lvl ); GLog.p( Messages.get(this, "new_level"), lvl );
sprite.showStatus( CharSprite.POSITIVE, TXT_LEVEL_UP ); sprite.showStatus( CharSprite.POSITIVE, Messages.get(Hero.class, "level_up") );
Sample.INSTANCE.play( Assets.SND_LEVELUP ); Sample.INSTANCE.play( Assets.SND_LEVELUP );
Badges.validateLevelReached(); Badges.validateLevelReached();
@ -1164,6 +1150,7 @@ public class Hero extends Char {
super.add( buff ); super.add( buff );
//TODO: need to do something with these so they can be i18n-ified
if (sprite != null) { if (sprite != null) {
if (buff instanceof Burning) { if (buff instanceof Burning) {
GLog.w( "You catch fire!" ); GLog.w( "You catch fire!" );
@ -1475,10 +1462,10 @@ public class Hero extends Char {
if (intentional) { if (intentional) {
sprite.showStatus( CharSprite.DEFAULT, TXT_SEARCH ); sprite.showStatus( CharSprite.DEFAULT, Messages.get(this, "search") );
sprite.operate( pos ); sprite.operate( pos );
if (foresight != null && foresight.isCursed()){ if (foresight != null && foresight.isCursed()){
GLog.n("You can't concentrate, searching takes a while."); GLog.n(Messages.get(this, "search_distracted"));
spendAndNext(TIME_TO_SEARCH * 3); spendAndNext(TIME_TO_SEARCH * 3);
} else { } else {
spendAndNext(TIME_TO_SEARCH); spendAndNext(TIME_TO_SEARCH);
@ -1487,7 +1474,7 @@ public class Hero extends Char {
} }
if (smthFound) { if (smthFound) {
GLog.w( TXT_NOTICED_SMTH ); GLog.w( Messages.get(this, "noticed_smth") );
Sample.INSTANCE.play( Assets.SND_SECRET ); Sample.INSTANCE.play( Assets.SND_SECRET );
interrupt(); interrupt();
} }

View File

@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Badges;
import com.shatteredpixel.shatteredpixeldungeon.Challenges; import com.shatteredpixel.shatteredpixeldungeon.Challenges;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor; import com.shatteredpixel.shatteredpixeldungeon.items.armor.ClothArmor;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CloakOfShadows; import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.CloakOfShadows;
import com.shatteredpixel.shatteredpixeldungeon.items.food.Food; import com.shatteredpixel.shatteredpixeldungeon.items.food.Food;
@ -42,45 +43,49 @@ import com.watabou.utils.Bundle;
public enum HeroClass { public enum HeroClass {
WARRIOR( "warrior" ), MAGE( "mage" ), ROGUE( "rogue" ), HUNTRESS( "huntress" ); WARRIOR( "warrior" ),
MAGE( "mage" ),
ROGUE( "rogue" ),
HUNTRESS( "huntress" );
private String title; private String title;
private HeroClass( String title ) { HeroClass( String title ) {
this.title = title; this.title = title;
} }
//TODO: need to make all these Messages references non-static
public static final String[] WAR_PERKS = { public static final String[] WAR_PERKS = {
"The Warrior starts with 11 points of Strength.", Messages.get(HeroClass.class, "warrior_perk1"),
"The Warrior starts with a unique short sword. This sword can be later \"reforged\" to upgrade another melee weapon.", Messages.get(HeroClass.class, "warrior_perk2"),
"The Warrior is less proficient with missile weapons.", Messages.get(HeroClass.class, "warrior_perk3"),
"Any piece of food restores some health when eaten.", Messages.get(HeroClass.class, "warrior_perk4"),
"Potions of Strength are identified from the beginning.", Messages.get(HeroClass.class, "warrior_perk5"),
}; };
public static final String[] MAG_PERKS = { public static final String[] MAG_PERKS = {
"The Mage starts with a unique Staff, which can be imbued with the properties of a wand.", Messages.get(HeroClass.class, "mage_perk1"),
"The Mage's staff can be used as a melee weapon or a more powerful wand.", Messages.get(HeroClass.class, "mage_perk2"),
"The Mage partially identifies wands after using them.", Messages.get(HeroClass.class, "mage_perk3"),
"When eaten, any piece of food restores 1 charge for all wands in the inventory.", Messages.get(HeroClass.class, "mage_perk4"),
"Scrolls of Upgrade are identified from the beginning." Messages.get(HeroClass.class, "mage_perk5"),
}; };
public static final String[] ROG_PERKS = { public static final String[] ROG_PERKS = {
"The Rogue starts with a unique Cloak of Shadows.", Messages.get(HeroClass.class, "rogue_perk1"),
"The Rogue identifies a type of a ring on equipping it.", Messages.get(HeroClass.class, "rogue_perk2"),
"The Rogue is proficient with light armor, dodging better with excess strength.", Messages.get(HeroClass.class, "rogue_perk3"),
"The Rogue is more proficient in detecting hidden doors and traps.", Messages.get(HeroClass.class, "rogue_perk4"),
"The Rogue can go without food longer.", Messages.get(HeroClass.class, "rogue_perk5"),
"Scrolls of Magic Mapping are identified from the beginning." Messages.get(HeroClass.class, "rogue_perk6"),
}; };
public static final String[] HUN_PERKS = { public static final String[] HUN_PERKS = {
"The Huntress starts with a unique upgradeable boomerang.", Messages.get(HeroClass.class, "huntress_perk1"),
"The Huntress is proficient with missile weapons, getting bonus damage from excess strength.", Messages.get(HeroClass.class, "huntress_perk2"),
"The Huntress is able to recover a single used missile weapon from each enemy.", Messages.get(HeroClass.class, "huntress_perk3"),
"The Huntress senses neighbouring monsters even if they are hidden behind obstacles.", Messages.get(HeroClass.class, "huntress_perk4"),
"Potions of Mind Vision are identified from the beginning." Messages.get(HeroClass.class, "huntress_perk5"),
}; };
public void initHero( Hero hero ) { public void initHero( Hero hero ) {
@ -183,7 +188,7 @@ public enum HeroClass {
} }
public String title() { public String title() {
return title; return Messages.get(HeroClass.class, title);
} }
public String spritesheet() { public String spritesheet() {

View File

@ -20,53 +20,37 @@
*/ */
package com.shatteredpixel.shatteredpixeldungeon.actors.hero; package com.shatteredpixel.shatteredpixeldungeon.actors.hero;
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
import com.watabou.utils.Bundle; import com.watabou.utils.Bundle;
public enum HeroSubClass { public enum HeroSubClass {
NONE( "none", null ), NONE( null ),
GLADIATOR( "gladiator", GLADIATOR( "gladiator" ),
"A successful attack with a melee weapon allows the _Gladiator_ to start a combo, " + BERSERKER( "berserker" ),
"in which every next successful hit inflicts more damage." ),
BERSERKER( "berserker",
"When severely wounded, the _Berserker_ enters a state of wild fury " +
"significantly increasing his damage output." ),
WARLOCK( "warlock", WARLOCK( "warlock" ),
"When using wands on an enemy, the _Warlock_ has a chance to mark their soul. " + BATTLEMAGE( "battlemage" ),
"Marked enemies will heal him and restore his hunger whenever they take physical damage."),
BATTLEMAGE( "battlemage",
"When fighting with his staff, the _Battlemage_ conjures bonus effects depending on the wand " +
"his staff is imbued with. His staff will also gain charge through combat." ),
ASSASSIN( "assassin", ASSASSIN( "assassin" ),
"When performing a surprise attack, the _Assassin_ inflicts additional damage to his target." ), FREERUNNER( "freerunner" ),
FREERUNNER( "freerunner",
"The _Freerunner_ moves faster when he unencumbered and not starving, " +
"if he is invisible, this speed boost is increased." ),
SNIPER( "sniper", SNIPER( "sniper" ),
"The _Sniper_ is able to detect weak points in an enemy's armor, " + WARDEN( "warden" );
"effectively ignoring it when using a missile weapon." ),
WARDEN( "warden",
"Having a strong connection with forces of nature allows the _Warden_ to gain additional health from dew, " +
"armor from trampling grass, and seeds and dew from plants." );
private String title; private String title;
private String desc;
private HeroSubClass( String title, String desc ) { HeroSubClass( String title ) {
this.title = title; this.title = title;
this.desc = desc;
} }
public String title() { public String title() {
return title; return Messages.get(this, title);
} }
public String desc() { public String desc() {
return desc; return Messages.get(this, title+"_desc");
} }
private static final String SUBCLASS = "subClass"; private static final String SUBCLASS = "subClass";

View File

@ -0,0 +1,50 @@
/*
* Pixel Dungeon
* Copyright (C) 2012-2015 Oleg Dolya
*
* Shattered Pixel Dungeon
* Copyright (C) 2014-2015 Evan Debenham
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.shatteredpixel.shatteredpixeldungeon.messages;
import java.util.ResourceBundle;
public class Messages {
private static ResourceBundle strings =
ResourceBundle.getBundle("com.shatteredpixel.shatteredpixeldungeon.messages.messages");
public static String get(String key){
return get(null, key);
}
//stuffing static variables with results from this means the app needs to restart for locale changes to take effect.
//so be careful with where you're calling this, never assign its result to a static value (including enum variables)
public static String get(Object o, String k){
return get(o.getClass(), k);
}
public static String get(Class c, String k){
String key;
if (c != null){
key = c.getName().replace("com.shatteredpixel.shatteredpixeldungeon.", "");
key += "." + k;
} else
key = k;
return strings.getString(key.toLowerCase());
}
}

View File

@ -0,0 +1,61 @@
actors.hero.hero.leave=One does not simply leave Pixel Dungeon.
actors.hero.hero.level_up=level up!
actors.hero.hero.new_level=Welcome to level %d! Now you are healthier and more focused. It's easier for you to hit enemies and dodge their attacks.
actors.hero.hero.level_cap=You cannot grow stronger, but your experiences do give you a surge of power!
actors.hero.hero.you_now_have=You now have %s
actors.hero.hero.something_else=There is something else here
actors.hero.hero.locked_chest=This chest is locked and you don't have matching key
actors.hero.hero.locked_door=You don't have a matching key
actors.hero.hero.noticed_smth=You noticed something
actors.hero.hero.wait=...
actors.hero.hero.search=search
actors.hero.hero.search_distracted=You can't concentrate, searching takes a while
actors.hero.hero.pain_resist=The pain helps you resist the urge to sleep
actors.hero.heroclass.warrior=warrior
actors.hero.heroclass.warrior_perk1=The Warrior starts with 11 points of Strength.
actors.hero.heroclass.warrior_perk2=The Warrior starts with a unique short sword. This sword can later be "reforged" to upgrade another melee weapon.
actors.hero.heroclass.warrior_perk3=The Warrior is less proficient with missile weapons.
actors.hero.heroclass.warrior_perk4=Any piece of food restores some health when eaten.
actors.hero.heroclass.warrior_perk5=Potions of Strength are identified from the beginning.
actors.hero.heroclass.mage=mage
actors.hero.heroclass.mage_perk1=The Mage starts with a unique Staff, which can be imbued with the properties of a wand.
actors.hero.heroclass.mage_perk2=The Mage's staff can be used as a melee weapon or a more powerful wand.
actors.hero.heroclass.mage_perk3=The Mage partially identifies wands after using them.
actors.hero.heroclass.mage_perk4=When eaten, any piece of food restores 1 charge for all wands in the inventory.
actors.hero.heroclass.mage_perk5=Scrolls of Upgrade are identified from the beginning.
actors.hero.heroclass.rogue=rogue
actors.hero.heroclass.rogue_perk1=The Rogue starts with a unique Cloak of Shadows.
actors.hero.heroclass.rogue_perk2=The Rogue identifies a type of a ring on equipping it.
actors.hero.heroclass.rogue_perk3=The Rogue is proficient with light armor, dodging better with excess strength.
actors.hero.heroclass.rogue_perk4=The Rogue is more proficient in detecting hidden doors and traps.
actors.hero.heroclass.rogue_perk5=The Rogue can go without food longer.
actors.hero.heroclass.rogue_perk6=Scrolls of Magic Mapping are identified from the beginning.
actors.hero.heroclass.huntress=huntress
actors.hero.heroclass.huntress_perk1=The Huntress starts with a unique upgradeable boomerang.
actors.hero.heroclass.huntress_perk2=The Huntress is proficient with missile weapons, getting bonus damage from excess strength.
actors.hero.heroclass.huntress_perk3=The Huntress is able to recover a single used missile weapon from each enemy.
actors.hero.heroclass.huntress_perk4=The Huntress senses neighbouring monsters even if they are hidden behind obstacles.
actors.hero.heroclass.huntress_perk5=Potions of Mind Vision are identified from the beginning.
actors.hero.herosubclass.gladiator=gladiator
actors.hero.herosubclass.gladiator_desc=A successful attack with a melee weapon allows the _Gladiator_ to start a combo, in which every next successful hit inflicts more damage.
actors.hero.herosubclass.berserker=berserker
actors.hero.herosubclass.berserker_desc=When severely wounded, the _Berserker_ enters a state of wild fury significantly increasing his damage output.
actors.hero.herosubclass.warlock=warlock
actors.hero.herosubclass.warlock_desc=When using wands on an enemy, the _Warlock_ has a chance to mark their soul. Marked enemies will heal him and restore his hunger whenever they take physical damage.
actors.hero.herosubclass.battlemage=battlemage
actors.hero.herosubclass.battlemage_desc=When fighting with his staff, the _Battlemage_ conjures bonus effects depending on the wand his staff is imbued with. His staff will also gain charge through combat.
actors.hero.herosubclass.assassin=assassin
actors.hero.herosubclass.assassin_desc=When performing a surprise attack, the _Assassin_ inflicts additional damage to his target.
actors.hero.herosubclass.freerunner=freerunner
actors.hero.herosubclass.freerunner_desc=The _Freerunner_ moves faster when he unencumbered and not starving, if he is invisible, this speed boost is increased.
actors.hero.herosubclass.sniper=sniper
actors.hero.herosubclass.sniper_desc=The _Sniper_ is able to detect weak points in an enemy's armor, effectively ignoring it when using a missile weapon.
actors.hero.herosubclass.warden=warden
actors.hero.herosubclass.warden_desc=Having a strong connection with forces of nature allows the _Warden_ to gain additional health from dew, armor from trampling grass, and seeds and dew from plants.
items.bags.bag.name=backpack