Pull upstream changes
This commit is contained in:
@@ -66,11 +66,12 @@ public class AndroidLauncher extends AndroidApplication {
|
||||
GdxNativesLoader.load();
|
||||
FreeType.initFreeType();
|
||||
} catch (Exception e){
|
||||
GdxNativesLoader.disableNativesLoading = true;
|
||||
AndroidMissingNativesHandler.error = e;
|
||||
Intent intent = new Intent(this, AndroidMissingNativesHandler.class);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
return;
|
||||
//let initialization continue for a moment so that we can set up things libGDX expects to be set up
|
||||
}
|
||||
|
||||
//there are some things we only need to set up on first launch
|
||||
|
||||
@@ -65,7 +65,7 @@ public class AndroidMissingNativesHandler extends Activity {
|
||||
}
|
||||
|
||||
TextView text = new TextView(this);
|
||||
String message = "ShatteredPD failed to access some of its internal code and cannot start!\n\n" +
|
||||
String message = "Shattered Pixel Dungeon failed to access some of its internal code and cannot start!\n\n" +
|
||||
"Try downloading the game from an official source if you haven't already. You can also screenshot this debug info and send it to the developer (Evan@ShatteredPixel.com):";
|
||||
|
||||
message += "\n\nPackage: " + getPackageName();
|
||||
@@ -88,7 +88,7 @@ public class AndroidMissingNativesHandler extends Activity {
|
||||
text.setTextColor(0xFFFFFFFF);
|
||||
text.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/pixel_font.ttf"));
|
||||
text.setGravity(Gravity.CENTER_VERTICAL);
|
||||
text.setPadding(10, 10, 10, 10);
|
||||
text.setPadding(20, 20, 20, 20);
|
||||
setContentView(text);
|
||||
|
||||
}
|
||||
|
||||
@@ -117,17 +117,29 @@ public class AndroidPlatformSupport extends PlatformSupport {
|
||||
|
||||
if (cutout != null) {
|
||||
boolean largeCutout = false;
|
||||
boolean cutoutsPresent = false;
|
||||
|
||||
int screenSize = Game.width * Game.height;
|
||||
for (Rect r : cutout.getBoundingRects()){
|
||||
for (Rect r : cutout.getBoundingRects()) {
|
||||
//use abs as some cutouts can apparently be returned inverted
|
||||
int cutoutSize = Math.abs(r.height() * r.width());
|
||||
//display cutouts are considered large if they take up more than 0.667% of the screen
|
||||
//in reality we want less than about 0.5%, but some cutouts over-report their size
|
||||
//Pixel devices especially =S
|
||||
if (cutoutSize*150 >= screenSize){
|
||||
largeCutout = true;
|
||||
//display cutouts are considered large if they take up more than 0.75%
|
||||
// of the screen/ in reality we want less than about 0.5%,
|
||||
// but some cutouts over-report their size, Pixel devices especially =S
|
||||
if (cutoutSize > 0){
|
||||
cutoutsPresent = true;
|
||||
if (cutoutSize * 133.33f >= screenSize) {
|
||||
largeCutout = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!cutoutsPresent){
|
||||
//if we get no cutouts reported, assume the device is lying to us
|
||||
// and there actually is a cutout, which we must assume is large =S
|
||||
largeCutout = true;
|
||||
}
|
||||
|
||||
if (largeCutout || level == INSET_ALL) {
|
||||
insets.left = Math.max(insets.left, cutout.getSafeInsetLeft());
|
||||
insets.top = Math.max(insets.top, cutout.getSafeInsetTop());
|
||||
|
||||
@@ -14,8 +14,8 @@ allprojects {
|
||||
appName = 'Shattered Pixel Dungeon'
|
||||
appPackageName = 'com.shatteredpixel.shatteredpixeldungeon'
|
||||
|
||||
appVersionCode = 875
|
||||
appVersionName = '3.2.4'
|
||||
appVersionCode = 877
|
||||
appVersionName = '3.2.5'
|
||||
|
||||
appJavaCompatibility = JavaVersion.VERSION_11
|
||||
|
||||
@@ -38,4 +38,4 @@ allprojects {
|
||||
maven { url 'https://central.sonatype.com/repository/maven-snapshots/' }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 123 B After Width: | Height: | Size: 127 B |
Binary file not shown.
|
Before Width: | Height: | Size: 402 B After Width: | Height: | Size: 871 B |
@@ -138,7 +138,7 @@ actors.buffs.burning.heromsg=You catch fire!
|
||||
actors.buffs.burning.burnsup=%s burns up!
|
||||
actors.buffs.burning.ondeath=You burned to death...
|
||||
actors.buffs.burning.rankings_desc=Burned to Ash
|
||||
actors.buffs.burning.desc=Few things are more distressing than being engulfed in flames.\n\nFire will deal damage every turn until it is put out by water or it expires. Fire can be extinquished by stepping into water, or from the splash of a shattering potion.\n\nAdditionally, the fire may ignite flammable terrain or items that it comes into contact with.\n\nTurns of burning remaining: %s.
|
||||
actors.buffs.burning.desc=Few things are more distressing than being engulfed in flames.\n\nFire will deal damage every turn until it is put out by water or it expires. Fire can be extinguished by stepping into water, or from the splash of a shattering potion.\n\nAdditionally, the fire may ignite flammable terrain or items that it comes into contact with.\n\nTurns of burning remaining: %s.
|
||||
|
||||
actors.buffs.championenemy.warn=You sense a deadly presence.
|
||||
actors.buffs.championenemy$blazing.name=blazing champion
|
||||
@@ -486,7 +486,7 @@ actors.hero.abilities.mage.warpbeacon.short_desc=The Mage places a _Warping Beac
|
||||
actors.hero.abilities.mage.warpbeacon.desc=The Mage places a beacon, which can then be warped to at will. Placing the beacon takes 1 turn, but warping to it is instantaneous.\n\nThe Mage cannot warp between floors by default, or use the beacon to reach inaccessible places such as locked rooms. The Mage can teleport into enemies, which will push them aside.
|
||||
|
||||
actors.hero.abilities.rogue.smokebomb.name=smoke bomb
|
||||
actors.hero.abilities.rogue.smokebomb.fov=You can only jump to an empty location in your field of view
|
||||
actors.hero.abilities.rogue.smokebomb.fov=You can only jump to an empty location in your field of view.
|
||||
actors.hero.abilities.rogue.smokebomb.prompt=Choose a location to jump to
|
||||
actors.hero.abilities.rogue.smokebomb$ninjalog.name=wooden decoy
|
||||
actors.hero.abilities.rogue.smokebomb$ninjalog.desc=Somehow, enemies are easily convinced that this wooden decoy is the real Rogue!
|
||||
|
||||
@@ -668,7 +668,7 @@ actors.hero.spells.guidinglight.short_desc=Způsobí magické zranění na dálk
|
||||
actors.hero.spells.guidinglight.desc=Klerik sešle výboj magické energie, který zasáhne cíl, způsobí mu 2-8 poškození a osvětlí jej. Příští fyzický útok proti osvětlenému protivníkovi jej s jistotou zasáhne.
|
||||
actors.hero.spells.guidinglight.desc_priest=_Toto kouzlo je mocnější, když ho sesílá Kněz._ První seslání tohoto kouzla každých 50 tahů ho nestojí nabití, a způsobené osvětlení může být spotřebováno i hůlkami, útoky spojenců nebo artefakty, které přímo zacílí nepřátele. Tím způsobí bonusové poškození rovné úrovni Kněze +5.
|
||||
actors.hero.spells.guidinglight$guidinglightpriestcooldown.name=Naváděcí světlo
|
||||
actors.hero.spells.guidinglight$guidinglightpriestcooldown.desc=The Priest will be able to cast Guiding Light for free again after 50 turns elapse.\n\nTurns remaining: %s.
|
||||
actors.hero.spells.guidinglight$guidinglightpriestcooldown.desc=Kněz může znovu seslat Naváděcí světlo zadarmo po uplynutí 50 tahů.\n\nZbývá tahů: %s.
|
||||
actors.hero.spells.guidinglight$illuminated.name=Osvětlení
|
||||
actors.hero.spells.guidinglight$illuminated.desc=Tato postava je osvětlena zásahem naváděcího světla. Ačkoliv zář není dost jasná, aby osvětlila okolní terén, tento efekt pomůže Klerikovi zasadit ránu mnohem snáz.
|
||||
actors.hero.spells.guidinglight$illuminated.desc_priest=Kněz navíc může osvětlení spotřebovat pomocí záře, hůlek, artefaktů nebo útoků svých spojenců. Využití osvětlení tímto způsobem způsobí bonusové poškození ve výši úrovni Kněze +5.
|
||||
|
||||
@@ -922,7 +922,7 @@ actors.hero.talent.improvised_projectiles.title=Proyectil improvisado
|
||||
actors.hero.talent.improvised_projectiles.desc=_+1:_ El Guerrero puede cegar a un enemigo por _2 turnos_ lanzándole cualquier ítem que no sea un arma arrojadiza. Tiene un tiempo de recarga de 50 turnos.\n\n_+2:_ El guerrero puede cegar a un enemigo por _3 turnos_ lanzándoles cualquier ítem que no sea un arma arrojadiza. Tiene un tiempo de recarga de 50 turnos.
|
||||
|
||||
actors.hero.talent.hold_fast.title=firmeza
|
||||
actors.hero.talent.hold_fast.desc=_+1:_ Cuando el Guerrero espera, gana _1-2 de armadura_ y reduce en _50%_ la pérdida de los beneficios de combo y escudo hasta que se mueva.\n\n_+2:_ Cuando el Guerrero espera, gana _2-4 de armadura_ y reduce en _75%_ la pérdida de los beneficios de combo y escudo hasta que se mueva.\n\n_+3:_ Cuando el Guerrero espera, gana _3-6 de armadura_ y reduce en _100%_ la pérdida de los beneficios de combo y escudo hasta que se mueva.
|
||||
actors.hero.talent.hold_fast.desc=_+1:_ Cuando el Guerrero espera, gana _1-2 de armadura_ y reduce en _50%_ la pérdida de combo y blindaje hasta que se mueva.\n\n_+2:_ Cuando el Guerrero espera, gana _2-4 de armadura_ y reduce en _75%_ la pérdida de combo y blindaje hasta que se mueva.\n\n_+3:_ Cuando el Guerrero espera, gana _3-6 de armadura_ y reduce en _100%_ la pérdida de combo y blindaje hasta que se mueva.
|
||||
actors.hero.talent.strongman.title=forzudo
|
||||
actors.hero.talent.strongman.desc=_+1:_ La fuerza del Guerrero _aumenta un 8%_, redondeado hacia abajo.\n\n_+2:_ La fuerza del Guerrero _aumenta un 13%_, redondeado hacia abajo.\n\n_+3:_ La fuerza del Guerrero _aumenta un 18%_, redondeado hacia abajo.
|
||||
|
||||
|
||||
@@ -497,7 +497,7 @@ actors.hero.abilities.rogue.deathmark.name=znak śmierci
|
||||
actors.hero.abilities.rogue.deathmark.ally_target=Możesz oznaczać tylko wrogów.
|
||||
actors.hero.abilities.rogue.deathmark.short_desc=Łotrzyk umieszcza _znak śmierci_ na wybranym wrogu. Naznaczeni przeciwnicy otrzymują bonusowe obrażenia, ale nie mogą umrzeć, dopóki znak nie zniknie.
|
||||
actors.hero.abilities.rogue.deathmark.desc=Łotrzyk umieszcza znak na wybranym wrogu, przez co ten otrzymuje dodatkowo 25% obrażeń. Znak jest nakładany natychmiastowo i znika po 5 turach.\n\nNaznaczeni przeciwnicy otrzymują bonusowe obrażenia, ale nie mogą umrzeć, dopóki znak nie zniknie. Jeśli wróg ma 0 PŻ, a znak przestanie działać, natychmiast zginie
|
||||
actors.hero.abilities.rogue.deathmark$deathmarktracker.name=naznaczony znakiem śmierci
|
||||
actors.hero.abilities.rogue.deathmark$deathmarktracker.name=naznaczenie znakiem śmierci
|
||||
actors.hero.abilities.rogue.deathmark$deathmarktracker.desc=Ten wróg został naznaczony, powodując że otrzyma 25%%dodatkowych obrażeń, ale także nie będzie mógł umrzeć, dopóki znak nie zniknie.\n\nPozostałe tury: %s.
|
||||
actors.hero.abilities.rogue.shadowclone.name=klon cienia
|
||||
actors.hero.abilities.rogue.shadowclone.short_desc=Łotrzyk przywołuje _klon cienia_, który może mu pomóc w walce.
|
||||
@@ -668,7 +668,7 @@ actors.hero.spells.guidinglight.short_desc=Zadaje obrażenia magiczne i gwarantu
|
||||
actors.hero.spells.guidinglight.desc=Kleryk wystrzeliwuje pocisk magicznej energii, który przy trafieniu w cel zadaje 2-8 obrażeń i go rozświetla. Następny atak fizyczny bronią, do której użycia masz wystarczającą siłę, przeciwko rozświetlonemu przeciwnikowi gwarantuje trafienie.
|
||||
actors.hero.spells.guidinglight.desc_priest=_To zaklęcie jest potężniejsze, gdy jest rzucane przez Kapłana._ Raz na 50 tur rzucenie zaklęcia nie kosztuje ładunków księgi, a efekt rozświetlenia będzie aktywowany przez blask, różdżki, inne postacie i artefakty, które bezpośrednio wpływają na przeciwników. Aktywowanie rozświetlenia w ten sposób zadaje dodatkowe magiczne obrażenia równe poziomowi Kapłana + 5.
|
||||
actors.hero.spells.guidinglight$guidinglightpriestcooldown.name=Światło Przewodnie
|
||||
actors.hero.spells.guidinglight$guidinglightpriestcooldown.desc=Kapłan będzie mógł za darmo rzucić zaklęcie Światła Przewodniego, ponownie po upływie 50 tur.\n\nPozostałe tury: %s.
|
||||
actors.hero.spells.guidinglight$guidinglightpriestcooldown.desc=Kapłan będzie mógł za darmo rzucić zaklęcie Światła Przewodniego ponownie po upływie 50 tur.\n\nPozostałe tury: %s.
|
||||
actors.hero.spells.guidinglight$illuminated.name=Rozświetlenie
|
||||
actors.hero.spells.guidinglight$illuminated.desc=Ta postać świeci w wyniku uderzenia przez zaklęcie światła przewodniego. Blask nie jest wystarczająco silny, aby rozjaśnić okolicę, natomiast ułatwi on Klerykowi trafienie tej postaci.
|
||||
actors.hero.spells.guidinglight$illuminated.desc_priest=Kapłan może dodatkowo aktywować rozświetlenie za pomocą blasku, różdżki, sojusznika lub efektami niektórych artefaktów. Aktywowanie rozświetlenia w ten sposób zada dodatkowe obrażenia magiczne równe poziomowi kapłana + 5.
|
||||
@@ -741,7 +741,7 @@ actors.hero.spells.radiance.desc=Kapłan wybucha świętym światłem, ogłuszaj
|
||||
|
||||
actors.hero.spells.recallinscription.name=replikacja runy
|
||||
actors.hero.spells.recallinscription.short_desc=Powtarza ostatnio używany kamień runiczny lub zwój.
|
||||
actors.hero.spells.recallinscription.desc=Kleryk używa świętej magii, aby ponownie rzucić efekt magicznej runy znalezionej na kamieniu runicznym lub zwoju, których użył w ostatnich %s turach.\n\nReplikacja Runy nie może być użyte do replikacji zwojów ulepszenia. Koszt ładowania tego zaklęcia różni się w zależności od tego, który przedmiot został ostatnio użyty: 2 za kamień runiczny, 3 za zwój, 4 za egzotyczny zwój. Koszt ładowania jest również podwajany podczas replikacji zwoju transmutacji lub przedmiotów alchemicznych, które muszą zostać wykonane za pomocą transmutacji lub ulepszenia.
|
||||
actors.hero.spells.recallinscription.desc=Kleryk używa świętej magii, aby ponownie rzucić efekt magicznej runy ze zwoju lub kamienia runicznego, których użył w ostatnich %s turach.\n\nReplikacja Runy nie może być użyta do replikacji zwojów ulepszenia. Koszt ładunków księgi dla tego zaklęcia jest zależny od ostatnio użytego przedmiotu i wynosi 2 dla kamienia runicznego, 3 dla zwoju i 4 dla egzotycznego zwoju. Koszt jest dwukrotnie wyższy przy replikacji zwoju transmutacji lub przedmiotów tworzonych za pomocą zwoju transmutacji lub ulepszenia.
|
||||
actors.hero.spells.recallinscription$useditemtracker.name=niedawne użycie runy
|
||||
actors.hero.spells.recallinscription$useditemtracker.desc=Kleryk niedawno użył przedmiotu, który działa z zaklęciem Replikacji runy. Kleryk może rzucić zaklęcie, aby powtórzyć efekt przedmiotu.\n\nUżyty przedmiot: %1$s.\n\nPozostałe tury efektu: %2$s.
|
||||
|
||||
@@ -893,7 +893,7 @@ actors.hero.talent$preciseassaulttracker.desc=Następny atak wręcz Fechmistrzyn
|
||||
actors.hero.talent$deadlyfollowuptracker.name=śmiertelna kontynuacja
|
||||
actors.hero.talent$deadlyfollowuptracker.desc=Fechmistrzyni niedawno zaatakowała przeciwnika bronią miotaną, dzięki czemu jej ataki wręcz przeciwko niemu będą zadawały dodatkowe obrażenia.\n\nPozostałe tury efektu: %s.
|
||||
actors.hero.talent$combinedlethalityabilitytracker.executed=zamordowany
|
||||
actors.hero.talent$satiatedspellstracker.name=Zaklęcie Tarczy
|
||||
actors.hero.talent$satiatedspellstracker.name=zaklęcie tarczy
|
||||
actors.hero.talent$satiatedspellstracker.desc=Następne zaklęcie rzucone przez Kleryka zapewni mu odrobinę osłony.
|
||||
actors.hero.talent$searinglightcooldown.name=Palące Światło
|
||||
actors.hero.talent$searinglightcooldown.desc=Niedawno użyłeś tego talentu i musisz poczekać, zanim użyjesz go ponownie.\n\nPozostałe tury: %s.
|
||||
@@ -1091,7 +1091,7 @@ actors.hero.talent.perfect_copy.desc=_+1:_ Cień zyskuje _10%_ maksymalnego zdro
|
||||
actors.hero.talent.natures_bounty.title=dar natury
|
||||
actors.hero.talent.natures_bounty.desc=_+1:_ Łowczyni może znaleźć _4 jagody_ ukryte w wysokiej trawie, gdy bada kilka następnych pięter lochu.\n\n_+2:_ Łowczyni może znaleźć _6 jagód_ ukrytych w wysokiej trawie, gdy bada kilka następnych pięter lochu.\n\nJagody je się stosunkowo szybko, jednak ciężko się nimi najeść, ale mogą zawierać one użyteczne nasiono.
|
||||
actors.hero.talent.survivalists_intuition.title=intuicja survivalistów
|
||||
actors.hero.talent.survivalists_intuition.desc=_+1:_ Łowczyni identyfikuje bronie miotane _3x szybciej_.\n\n_+2:_ Łowczyni identyfikuje bronie miotane _gdy nimi trafi we wroga_.
|
||||
actors.hero.talent.survivalists_intuition.desc=_+1:_ Łowczyni identyfikuje bronie miotane _3x szybciej_.\n\n_+2:_ Łowczyni identyfikuje bronie miotane, _gdy trafi nimi we wroga_.
|
||||
actors.hero.talent.followup_strike.title=uderzenie następujące
|
||||
actors.hero.talent.followup_strike.desc=_+1:_ Kiedy Łowczyni trafi przeciwnika swoim łukiem bądź za pomocą broni miotanej, jej kolejny atak wręcz przeciwko temu przeciwnikowi zada _2 dodatkowe obrażenia_.\n\n_+2:_ Kiedy Łowczyni trafi przeciwnika swoim łukiem bądź za pomocą broni miotanej, jej kolejny atak wręcz przeciwko temu przeciwnikowi zada _3 dodatkowe obrażenia_.
|
||||
actors.hero.talent.natures_aid.title=wsparcie natury
|
||||
@@ -1117,7 +1117,7 @@ actors.hero.talent.seer_shot.meta_desc=_Jeśli ten talent jest uzyskany przez in
|
||||
actors.hero.talent.farsight.title=Dalekowzroczność
|
||||
actors.hero.talent.farsight.desc=_+1:_ Pole widzenia Strzelczyni jest _powiększone o 25%_.\n\n_+2:_ Pole widzenia Strzelczyni jest _powiększone o 50%_.\n\n_+3:_ Pole widzenia Strzelczyni jest _powiększone o 75%_.
|
||||
actors.hero.talent.shared_enchantment.title=współdzielone zaklęcie
|
||||
actors.hero.talent.shared_enchantment.desc=_+1:_ Bronie miotane posiadają _33% szans_ na użycie zaklęcia znajdującego się na łuku Strzelczyni.\n\n_+2:_ Bronie miotane posiadają _67% szans_ na użycie zaklęcia znajdującego się na łuku Strzelczyni.\n\n_+3:_ Bronie miotane posiadają _100% szans_ na użycie zaklęcia znajdującego się na łuku Strzelczyni.\n\nZaklęcie łuku może się aktywować razem z zaklęciem broni miotanej (jeżeli jakieś ma).
|
||||
actors.hero.talent.shared_enchantment.desc=_+1:_ Bronie miotane mają _33% szans_ na użycie zaklęcia znajdującego się na łuku Strzelczyni.\n\n_+2:_ Bronie miotane mają _67% szans_ na użycie zaklęcia znajdującego się na łuku Strzelczyni.\n\n_+3:_ Bronie miotane mają _100% szans_ na użycie zaklęcia znajdującego się na łuku Strzelczyni.\n\nZaklęcie łuku może się aktywować razem z tym nałożonym na broń miotaną.
|
||||
actors.hero.talent.shared_upgrades.title=współdzielone ulepszenie
|
||||
actors.hero.talent.shared_upgrades.desc=_+1:_ Gdy Strzelczyni atakuje ulepszoną bronią miotaną, każdy jej poziom przedłuża czas działania naznaczenia o 1 turę i zwiększa obrażenia jej specjalnego ataku o 16%, na maksymalnie _2 tury i +33% obrażeń na poziomie +2_.\n\n_+2:_ Gdy Strzelczyni atakuje ulepszoną bronią miotaną, każdy jej poziom przedłuża czas działania naznaczenia o 1 turę i zwiększa obrażenia jej specjalnego ataku o 16%, na maksymalnie _4 tury i +67% obrażeń na poziomie +4_.\n\n_+3:_ Gdy Strzelczyni atakuje ulepszoną bronią miotaną, każdy jej poziom przedłuża czas działania naznaczenia o 1 turę i zwiększa obrażenia jej specjalnego ataku o 16%, na maksymalnie _6 tur i +100% obrażeń na poziomie +6_.
|
||||
|
||||
@@ -1247,7 +1247,7 @@ actors.hero.talent.bless.desc=_+1:_ Kleryk może rzucić _błogosławieństwo_,
|
||||
actors.hero.talent.bless.meta_desc=_Jeśli ten talent jest uzyskany przez innego bohatera_, zwiększy on celność i unik bohatera oraz sojuszników o 3% przy +1 i 5% przy +2.
|
||||
|
||||
actors.hero.talent.cleanse.title=Oczyszczenie
|
||||
actors.hero.talent.cleanse.desc=_+1:_ Kleryk może rzucić _Oczyszczenie_, kosztujące 2 ładunki, które jest czarem, _usuwającym negatywne efekty_ nałożone na Kleryka i pobliskich sojuszników oraz dając im też _10 osłony_.\n\n_+2:_ Kleryk może rzucić _Oczyszczenie_, kosztujące 2 ładunki, które jest czarem, _dającym 3 tury odporności na negatywne efekty_ Klerykowi i pobliskim sojusznikom oraz dając im też _20 osłony_.\n\n_+3:_ Kleryk może rzucić _Oczyszczenie_, kosztujące 2 ładunki, które jest czarem, _dającym 5 tur odporności na negatywne efekty_ Klerykowi i pobliskim sojusznikom oraz dając im też _30 osłony_.
|
||||
actors.hero.talent.cleanse.desc=_+1:_ Kleryk może rzucić _oczyszczenie_, czar kosztujący 2 ładunki, który _usuwa negatywne efekty_ nałożone na Kleryka i pobliskich sojuszników oraz daje im _10 osłony_.\n\n_+2:_ Kleryk może rzucić _oczyszczenie_, czar kosztujący 2 ładunki, który daje Klerykowi i pobliskim sojusznikom _3 tury odporności na negatywne efekty_ oraz _20 osłony_.\n\n_+3:_ Kleryk może rzucić _oczyszczenie_, czar kosztujący 2 ładunki, który daje Klerykowi i pobliskim sojusznikom _5 tur odporności na negatywne efekty_ oraz _30 osłony_.
|
||||
actors.hero.talent.cleanse.meta_desc=_Jeśli ten talent jest uzyskany przez innego bohatera_, zapewnia on 10/20/30% szansy przy +1/+2/+3 na oczyszczenie bohatera z negatywnych efektów po użyciu różdżki lub artefaktu.
|
||||
actors.hero.talent.light_reading.title=Rzut Okiem
|
||||
actors.hero.talent.light_reading.desc=_+1:_ Kleryk może używać świętej księgi, gdy nie jest założona, ale wtedy ładuje się ona z _25% prędkości_.\n\n_+2:_ Kleryk może używać świętej księgi, gdy nie jest założona, ale wtedy ładuje się ona z _50% prędkości_.\n\n_+3:_ Kleryk może używać świętej księgi, gdy nie jest założona, ale wtedy ładuje się ona z _75% prędkości_.
|
||||
@@ -1270,7 +1270,7 @@ actors.hero.talent.wall_of_light.desc=_+1:_ Paladyn może rzucić _Ścianę Świ
|
||||
actors.hero.talent.divine_intervention.title=boska interwencja
|
||||
actors.hero.talent.divine_intervention.desc=_+1:_ Będąc w Niebiańskiej Postaci, Kleryk może rzucić _Boską Interwencję_, która zapewnia Klerykowi i wszystkim sojusznikom do _150 punktów tarczy_ oraz wydłuża Niebiańską Postać o _3 tury_.\n\n_+2:_ Będąc w Niebiańskiej Postaci, Kleryk może rzucić _Boską Interwencję_, która zapewnia Klerykowi i wszystkim sojusznikom do _200 punktów tarczy_ oraz wydłuża Niebiańską Postać o _4 tury_.\n\n_+3:_ Będąc w Niebiańskiej Postaci, Kleryk może rzucić _Boską Interwencję_, która zapewnia Klerykowi i wszystkim sojusznikom do _250 punktów tarczy_ oraz wydłuża Niebiańską Postać o _5 tur_.\n\n_+4:_ Będąc w Niebiańskiej Postaci, Kleryk może rzucić _Boską Interwencję_, która zapewnia Klerykowi i wszystkim sojusznikom do _300 punktów tarczy_ oraz wydłuża Niebiańską Postać o _6 tur_.\n\nBoska Interwencja kosztuje aż 5 ładunków księgi i może być rzucona tylko raz w danej Niebiańskiej Postaci.
|
||||
actors.hero.talent.judgement.title=osąd
|
||||
actors.hero.talent.judgement.desc=_+1:_ Będąc w niebiańskiej formie, Kleryk może rzucić _osąd_, który zadaje _10-20 obrażeń_ wszystkim widocznym wrogom.\n\n_+2:_ Będąc w niebiańskiej formie, Kleryk może rzucić _osąd_, który zadaje _15-30 obrażeń_ wszystkim widocznym wrogom.\n\n_+3:_ Będąc w niebiańskiej formie, Kleryk może rzucić _osąd_, który zadaje _20-40 obrażeń_ wszystkim widocznym wrogom.\n\n_+4:_ Będąc w niebiańskiej formie, Kleryk może rzucić _osąd_, który zadaje _25-50 obrażeń_ wszystkim widocznym wrogom.\n\nOsąd kosztuje 3 ładunki tomu. Zadaje on +33% obrażeń za każde zaklęcie rzucone przez Kleryka od momentu wejścia w formę lub od ostatniego rzucenia osądu.
|
||||
actors.hero.talent.judgement.desc=_+1:_ Będąc w niebiańskiej formie, Kleryk może rzucić _osąd_, który zadaje _10-20 obrażeń_ wszystkim widocznym wrogom.\n\n_+2:_ Będąc w niebiańskiej formie, Kleryk może rzucić _osąd_, który zadaje _15-30 obrażeń_ wszystkim widocznym wrogom.\n\n_+3:_ Będąc w niebiańskiej formie, Kleryk może rzucić _osąd_, który zadaje _20-40 obrażeń_ wszystkim widocznym wrogom.\n\n_+4:_ Będąc w niebiańskiej formie, Kleryk może rzucić _osąd_, który zadaje _25-50 obrażeń_ wszystkim widocznym wrogom.\n\nOsąd kosztuje 3 ładunki księgi. Zadaje on +33% obrażeń za każde zaklęcie rzucone przez Kleryka od momentu wejścia w formę lub od ostatniego rzucenia osądu.
|
||||
actors.hero.talent.flash.title=błysk
|
||||
actors.hero.talent.flash.desc=_+1:_ Będąc w niebiańskiej formie, Kleryk może rzucić _błysk_, aby teleportować się na odległość do _3 pól_.\n\n_+2:_ Będąc w niebiańskiej formie, Kleryk może rzucić _błysk_, aby teleportować się na odległość do _4 pól_.\n\n_+3:_ Będąc w niebiańskiej formie, Kleryk może rzucić _błysk_, aby teleportować się na odległość do _5 pól_.\n\n_+4:_ Będąc w niebiańskiej formie, Kleryk może rzucić _błysk_, aby teleportować się na odległość do _6 pól_.\n\nBłysk kosztuje początkowo 2 ładunki tomu i 1 dodatkowy ładunek za każde użycie w tej samej niebiańskiej formie.
|
||||
|
||||
|
||||
@@ -68,19 +68,19 @@ actors.blobs.web.desc=Một mạng nhện dày bao phủ mọi thứ nơi đây.
|
||||
|
||||
###buffs
|
||||
actors.buffs.adrenaline.name=adrenaline
|
||||
actors.buffs.adrenaline.desc=Một sự dâng trào sức mạnh vật lí, adrenaline giúp tăng cả tốc đ tấn công và di chuyển.\n\nAdrenaline khiến mục tiêu chạy với tốc độ gấp 2 lần và tấn công với tốc độ gấp 1.5 lần.\n\nSố lượt còn lại: %s.
|
||||
actors.buffs.adrenaline.desc=Một sự dâng trào sức mạnh vật lí, adrenaline tăng cường cả tốc độ tấn công và di chuyển.\n\nAdrenaline khiến mục tiêu chạy với tốc độ gấp 2 lần và tấn công với tốc độ gấp 1.5 lần.\n\nLượt còn lại: %s.
|
||||
|
||||
actors.buffs.adrenalinesurge.name=cường hóa sức mạnh
|
||||
actors.buffs.adrenalinesurge.desc=Một sự dâng trào sức mạnh to lớn, nhưng đáng tiếc là không vĩnh viễn. \n\nCường hóa sức mạnh: +%d.\nSố lượt còn lại cho đến khi cường hóa yếu đi: %s.
|
||||
actors.buffs.adrenalinesurge.desc=Một sự dâng trào sức mạnh to lớn, nhưng đáng tiếc là không vĩnh viễn. \n\nCường hóa sức mạnh: +%d.\nLượt còn lại cho đến khi cường hóa yếu đi: %s.
|
||||
|
||||
actors.buffs.amok.name=điên cuồng
|
||||
actors.buffs.amok.desc=Điên cuồng sẽ khiến mục tiêu vừa trở nên cực kì giận dữ vừa lú lẫn \n\nKhi một sinh vật trở nên điên cuồng, nó sẽ tấn công mọi thứ gần nó, không phân biệt bạn hay thù. \n\nSố lượt điên cuồng còn lại: %s.
|
||||
actors.buffs.amok.desc=Điên cuồng sẽ khiến mục tiêu trở nên vừa cực kì giận dữ vừa lú lẫn \n\nKhi một sinh vật trở nên điên cuồng, nó sẽ tấn công mọi thứ gần nó, không phân biệt bạn hay thù. \n\nLượt điên cuồng còn lại: %s.
|
||||
|
||||
actors.buffs.arcanearmor.name=áo giáp ma thuật
|
||||
actors.buffs.arcanearmor.desc=Một lớp khiên mỏng bao quanh bạn, kháng một phần sát thương từ các đòn tấn công phép. \n\nGiáp phép của bạn hiện được tăng cường từ: 0-%d. \nLượt còn lại đến khi giáp phép bị yếu đi: %s.
|
||||
|
||||
actors.buffs.artifactrecharge.name=hồi năng cổ vật
|
||||
actors.buffs.artifactrecharge.desc=Dòng năng lượng đang rạo rực trong bạn, các cổ vật mà bạn đang trang bị giờ đây sẽ được tăng tỉ lệ hồi phục lại năng lượng\n\nTuy mỗi cổ vật có tỉ lệ hồi khác nhau một chút, song năng lượng của chúng đều sẽ hồi phục lại nhanh hơn bình thường đáng kể.\n\nSố lượt còn lại: %s.
|
||||
actors.buffs.artifactrecharge.desc=Năng lượng đang chảy trong bạn, tăng tốc độ hồi năng lượng của các cổ vật được bạn trang bị. \n\nTuy mỗi cổ vật sẽ bị ảnh hưởng khác nhau một chút, chúng sẽ đề hồi năng lượng nhanh hơn nhiều so với bình thường.\n\nLượt còn lại: %s.
|
||||
|
||||
actors.buffs.ascensionchallenge.name=lời nguyền của tấm bùa
|
||||
actors.buffs.ascensionchallenge.desc=Bằng cách nào đó mà tên Yog-Dzewa vẫn có thể duy trì quyền lực của mình với thế giới này thông qua lá bùa, và hắn ta đang cố gắng ngăn bạn đi tiếp!\n\nNhờ sức mạnh của hắn mà giờ đây hầm ngục trở nên nguy hiểm hơn bao giờ hết, tăng số lượng của kẻ địch và khiến chúng trở nên mạnh mẽ hơn! Thứ sức mạnh này sẽ càng trở nên mạnh hơn nếu bạn lơ là, tuy nhiên, bạn có thể làm suy yếu nó bằng cách đánh bại những kẻ địch chịu ảnh hưởng từ sức mạnh của hắn.
|
||||
@@ -125,11 +125,11 @@ actors.buffs.bleeding.rankings_desc=Chảy máu đến chết
|
||||
actors.buffs.bleeding.desc=Vết thương đó đang chảy ra một lượng máu đáng lo ngại\n\nChảy máu gây sát thương theo lượt. Sát thương do chảy máu sẽ giảm một lượng ngẫu nhiên mỗi lượt, và chỉ dừng khi vết thương đóng lại.\n\nSát thương do chảy máu hiện tại: %d.
|
||||
|
||||
actors.buffs.bless.name=được ban phước
|
||||
actors.buffs.bless.desc=Một sự tập trung tuyệt vời, nghe nói rằng đó là sự ban phước của các vị thần.\n\nBan phước sẽ tăng độ chuẩn xác và khả năng né tránh thêm 25%%, khiến kẻ được nhận ban phước có thể chiến đấu hiệu quả hơn.\n\nSố lượt được ban phước còn lại: %s.
|
||||
actors.buffs.bless.desc=Một nguồn tập trung to lớn, một số người nói rằng đó là sự ban phước của các vị thần.\n\nBan phước sẽ tăng độ chuẩn xác và khả năng né tránh thêm 25%%, khiến người được ban phước chiến đấu hiệu quả hơn nhiều.\n\nLượt ban phước còn lại: %s.
|
||||
|
||||
actors.buffs.blindness.name=mù
|
||||
actors.buffs.blindness.heromsg=Bạn đã bị mù!
|
||||
actors.buffs.blindness.desc=Sự mù loà biến thế giới xung quanh thành một màn sương tăm tối.\n\nKhi bị mù, tầm nhìn của một nhân vật bị giảm còn một ô, khiến các đòn tấn công từ xa trở nên vô dụng và rất dễ mất dấu các kẻ thù ở xa. Ngoài ra, một người hùng bị mù không thể đọc các cuộn giấy hay sách.\n\nSố lượt bị mù còn lại: %s.
|
||||
actors.buffs.blindness.desc=Sự mù loà biến thế giới xung quanh thành một màn sương tăm tối.\n\nKhi bị mù, tầm nhìn của một nhân vật bị giảm còn một ô, khiến các đòn tấn công từ xa trở nên vô dụng và rất dễ mất dấu các kẻ thù ở xa. Ngoài ra, một người hùng bị mù không thể đọc các cuộn giấy hay sách.\n\nLượt bị mù còn lại: %s.
|
||||
|
||||
actors.buffs.buff.heromsg=
|
||||
|
||||
@@ -138,7 +138,7 @@ actors.buffs.burning.heromsg=Bạn đang bị cháy!
|
||||
actors.buffs.burning.burnsup=%s đã bốc cháy!
|
||||
actors.buffs.burning.ondeath=Bạn đã bị cháy cho đến chết...
|
||||
actors.buffs.burning.rankings_desc=Cháy thành tro
|
||||
actors.buffs.burning.desc=Trên đời này chỉ có một vài thứ là khó chịu hơn cảm giác bị nhấn chìm trong lửa.\n\nLửa sẽ gây sát thương mỗi lượt cho đến khi nó bị dập tắt hoặc tự tắt. Bạn có thể dập lửa bằng cách bước vào nước, hoặc đập một lọ thuốc.\n\nThêm nữa, các vật phẩm và địa hình dễ bắt lửa sẽ bị cháy khi tiếp xúc với lửa.\n\nSố lượt bị cháy còn lại: %s.
|
||||
actors.buffs.burning.desc=Trên đời này không có nhiều thứ khó chịu hơn là bị nhấn chìm trong lửa.\n\nLửa sẽ gây sát thương mỗi lượt cho đến khi nó bị dập tắt hoặc tự tắt. Lửa có thể được dập bằng cách bước vào nước, hoặc từ nước bắn ra từ một lọ thuốc vỡ.\n\nThêm nữa, địa hình hoặc vật phẩm dễ cháy có thể bị đốt cháy khi tiếp xúc với lửa.\n\nLượt cháy còn lại: %s.
|
||||
|
||||
actors.buffs.championenemy.warn=Bạn cảm thấy một sự hiện diện đầy sát khí.
|
||||
actors.buffs.championenemy$blazing.name=nhà vô địch rực lửa
|
||||
@@ -157,11 +157,11 @@ actors.buffs.championenemy$growing.desc=Nhà vô địch phát triển được
|
||||
actors.buffs.charm.name=mê hoặc
|
||||
actors.buffs.charm.heromsg=Bạn đã bị mê hoặc!
|
||||
actors.buffs.charm.cant_attack=Bạn đã bị mê hoặc bởi kẻ địch đó và không thể tấn công chúng.
|
||||
actors.buffs.charm.desc=Mê hoặc là phép thuật thao túng có thể khiến kẻ thù tạm thời quý mến nhau.\n\nNhân vật bị ảnh hưởng bởi mê hoặc không thể tấn công trực tiếp kẻ thù đã mê hoặc mình. Tuy nhiên, việc tấn công các mục tiêu khác vẫn là có thể. Đau đớn sẽ làm giảm thời gian của mê hoặc. \n\nSố lượt bị mê hoặc còn lại: %s.
|
||||
actors.buffs.charm.desc=Mê hoặc là phép thuật thao túng có thể khiến kẻ thù tạm thời quý mến nhau.\n\nNhân vật bị ảnh hưởng bởi mê hoặc không thể tấn công trực tiếp kẻ thù đã mê hoặc mình. Tuy nhiên, việc tấn công các mục tiêu khác vẫn là có thể. Cú sốc của cơn đau sẽ làm giảm thời lượng của mê hoặc. \n\nLượt mê hoặc còn lại: %s.
|
||||
|
||||
actors.buffs.chill.name=lạnh cóng
|
||||
actors.buffs.chill.freezes=%s bị đóng băng!
|
||||
actors.buffs.chill.desc=Không đến mức đóng băng, nhưng vẫn quá lạnh.\n\nTất cả hành động của mục tiêu bị Lạnh cóng sẽ trở nên chậm chạp hơn, phụ thuộc vào số lượt còn lại của hiệu ứng. Trường hợp tệ nhất, nó tương đương với bị làm chậm.\n\nSố lượt lạnh cóng còn lại: %1$s.\nTốc độ bị giảm đi: %2$s%%.
|
||||
actors.buffs.chill.desc=Không đến mức đóng băng, nhưng vẫn quá lạnh.\n\nMục tiêu bị lạnh cóng thực hiện mọi hành động chậm chạp hơn, phụ thuộc vào số lượt còn lại của hiệu ứng. Ở mức tệ nhất, nó tương đương với bị làm chậm.\n\nLượt lạnh cóng còn lại: %1$s.\nTốc độ bị giảm đi: %2$s%%.
|
||||
|
||||
actors.buffs.combo.name=combo
|
||||
actors.buffs.combo.action_name=đòn tấn công liên hoàn
|
||||
@@ -190,7 +190,7 @@ actors.buffs.corruption.desc=Sự tha hóa thâm nhập vào linh hồn của si
|
||||
|
||||
actors.buffs.cripple.name=què
|
||||
actors.buffs.cripple.heromsg=Bạn đã bị què!
|
||||
actors.buffs.cripple.desc=Bạn khá chắc rằng chân mình không được sinh ra để bị bẻ cong như thế.\n\nQuè quặt sẽ giảm một nửa tốc độ di chuyển, khiến việc đi một ô thường mất hai lượt thay vì một.\n\nSố lượt bị què còn lại: %s.
|
||||
actors.buffs.cripple.desc=Bạn khá chắc rằng chân mình không được sinh ra để bị bẻ cong như thế.\n\nBị què sẽ giảm một nửa tốc độ di chuyển, khiến việc đi một ô thường mất hai lượt thay vì một.\n\nLượt què còn lại: %s.
|
||||
|
||||
actors.buffs.daze.name=choáng váng
|
||||
actors.buffs.daze.heromsg=Bạn bị choáng váng!
|
||||
@@ -223,7 +223,7 @@ actors.buffs.foresight.desc=Bằng cách nào đó mà bạn có thể thấy đ
|
||||
|
||||
actors.buffs.frost.name=đóng băng
|
||||
actors.buffs.frost.freezes=%s bị đóng băng!
|
||||
actors.buffs.frost.desc=Không nên nhầm lẫn với trạng thái đông đặc, trạng thái đóng băng này chỉ bao bọc mục tiêu lại bằng một lớp băng dày.\n\nĐóng băng hoạt động tương tự như Tê liệt, mục tiêu sẽ không thể cử động được. Không như Tê liệt, kẻ địch sẽ ngay lập tức được rã băng nếu chúng nhận sát thương, vì lớp băng sẽ bị vỡ ra.\n\nSố lượt đóng băng còn lại: %s.
|
||||
actors.buffs.frost.desc=Không nên nhầm lẫn với hoá thành băng, trạng thái đóng băng nhẹ nhàng hơn này chỉ bao bọc mục tiêu lại trong băng.\n\nĐóng băng hoạt động tương tự như tê liệt, mục tiêu sẽ không thể hành động được. Không như tê liệt, kẻ địch sẽ ngay lập tức được rã băng nếu chúng nhận sát thương, vì lớp băng sẽ vỡ ra.\n\nLượt đóng băng còn lại: %s.
|
||||
|
||||
actors.buffs.frostimbue.name=hòa nhập với băng
|
||||
actors.buffs.frostimbue.desc=Bạn đã được hoà nhập với sức mạnh của băng!\n\nMọi đòn tấn công vật lí sẽ từ từ cộng dồn hiệu ứng lạnh lên kẻ địch. Thêm vào đó, bạn sẽ miễn nhiễm hoàn toàn với cái lạnh\n\nLượt hoà nhập với băng còn lại: %s.
|
||||
@@ -241,16 +241,16 @@ actors.buffs.gravitychaostracker.desc_positive=Nhưng có vẻ bạn và các đ
|
||||
actors.buffs.gravitychaostracker.desc_duration=Không rõ hiệu ứng này sẽ kéo dài bao lâu, nhưng nó không thể kéo dài mãi mãi được.
|
||||
|
||||
actors.buffs.greaterhaste.name=siêu nhanh nhẹn
|
||||
actors.buffs.greaterhaste.desc=Một sự tăng cường tốc độ khổng lồ, cứ như thể tất cả những thứ khác đang đứng yên trong một thời gian ngắn.\n\nKhi đang mang hiệu ứng siêu nhanh nhẹn, các hành động di chuyển không hề tốn thời gian, nhưng các hành động khác vẫn được thực hiện ở tốc độ thông thường. Mỗi bước di chuyển sẽ tiêu tốn một lượt siêu nhanh nhẹn.\n\nSố lượt siêu nhanh nhẹn còn lại: %d.
|
||||
actors.buffs.greaterhaste.desc=Một sự tăng cường tốc độ khổng lồ, cứ như thể tất cả những thứ khác đang đứng yên trong một thời gian ngắn.\n\nKhi đang mang hiệu ứng siêu nhanh nhẹn, các hành động di chuyển không hề tốn thời gian, nhưng các hành động khác vẫn được thực hiện ở tốc độ thông thường. Mỗi bước di chuyển sẽ tiêu tốn một lượt siêu nhanh nhẹn.\n\nLượt siêu nhanh nhẹn còn lại: %d.
|
||||
|
||||
actors.buffs.haste.name=nhanh nhẹn
|
||||
actors.buffs.haste.desc=Năng lượng chảy cuồn cuộn trong cơ bắp, làm bạn chạy với vận tốc phi thường!\n\nKhi chịu tác dụng của nhanh nhẹn bạn sẽ chạy với 3x tốc độ, nhưng mọi hành động khác vẫn ở tốc độ thường.\n\nLượt nhanh nhẹn còn lại: %s.
|
||||
|
||||
actors.buffs.healing.name=hồi phục
|
||||
actors.buffs.healing.desc=Một liều hồi phục thần kì làm cho liền da lành thịt.\n\nMỗi lượt máu sẽ hồi đều đặn cho đến khi hồi máu kết thúc. Lượng máu hồi có thể phai dần theo thời gian.\n\nHồi máu tiếp: %d.\n\nHồi máu còn lại: %d.
|
||||
actors.buffs.healing.desc=Một phương thuốc thần kì đang khiến các vết thương đóng và da thịt liền lại.\n\nMỗi lượt, sinh lực sẽ hồi từ từ cho đến khi hiệu ứng hồi phục kết thúc. Lượng hồi phục có thể giảm dần theo thời gian.\n\nHồi phục kế tiếp: %d.\n\nHồi phục còn lại: %d.
|
||||
|
||||
actors.buffs.herodisguise.name=cải trang
|
||||
actors.buffs.herodisguise.desc=Phép thuật ảo ảnh đã thay đổi ngoại hình của bạn! Hiệu ứng này không có tác dụng nào khác, nhưng dù vậy vẫn có cảm giác rất lạ.\n\nSố lượt cải trang còn lại: %s.
|
||||
actors.buffs.herodisguise.desc=Phép thuật ảo ảnh đã thay đổi ngoại hình của bạn! Hiệu ứng này hoàn toàn chỉ là về hình ảnh, nhưng dù vậy vẫn có cảm giác rất lạ.\n\nLượt cải trang còn lại: %s.
|
||||
|
||||
actors.buffs.hex.name=trúng phép
|
||||
actors.buffs.hex.heromsg=Bạn đã bị trúng phép!
|
||||
@@ -271,13 +271,13 @@ actors.buffs.hunger.desc_intro_starving=Bạn đói đến mức bắt đầu c
|
||||
actors.buffs.hunger.desc=\n\nCơn đói sẽ càng lúc càng tăng lên khi bạn ở lâu trong hầm ngục, và cuối cùng bạn sẽ bắt đầu chết đói. Khi đó, bạn sẽ dần mất sinh lực thay vì hồi phục nó.\n\nChia khẩu phần ăn là rất quan trọng! Nếu bạn còn nhiều sinh lực, chịu đói một chút sẽ không phải là ý tồi nếu như sẽ có thêm thức ăn sau. Ăn theo khẩu phần hiệu quả có thể giúp tiết kiệm thức ăn lâu hơn!
|
||||
|
||||
actors.buffs.invisibility.name=tàng hình
|
||||
actors.buffs.invisibility.desc=Bạn hoàn toàn ẩn mình vào địa hình xung quanh, khiến bạn không thể bị nhìn thấy.\n\nKhi bạn đang tàng hình kẻ địch không thể tấn công hoặc đuổi theo bạn. Các đòn tấn công vật lí và hiệu ứng phép thuật (như các cuộn giấy và đũa phép) sẽ ngay lập tức hủy Tàng hình.\n\nSố lượt tàng hình còn lại: %s.
|
||||
actors.buffs.invisibility.desc=Bạn hoàn toàn ẩn mình vào địa hình xung quanh, khiến bạn không thể bị nhìn thấy.\n\nKhi bạn đang tàng hình kẻ địch không thể tấn công hoặc đuổi theo bạn. Các đòn tấn công vật lí và hiệu ứng phép thuật (như các cuộn giấy và đũa phép) sẽ ngay lập tức hủy tàng hình.\n\nLượt tàng hình còn lại: %s.
|
||||
|
||||
actors.buffs.invulnerability.name=miễn nhiễm sát thương
|
||||
actors.buffs.invulnerability.desc=Nhân vật này đang được bao bọc bởi một sức mạnh bảo vệ mạnh mẽ, trao cho họ một khoảng thời gian miễn nhiễm sát thương ngắn!\n\nSố lượt còn lại: %s.
|
||||
actors.buffs.invulnerability.desc=Nhân vật này đang được bao bọc bởi một sức mạnh bảo vệ mạnh mẽ, trao cho họ một khoảng thời gian miễn nhiễm sát thương ngắn!\n\nLượt còn lại: %s.
|
||||
|
||||
actors.buffs.levitation.name=lơ lửng
|
||||
actors.buffs.levitation.desc=Một lực phép thuật đang nhấc bổng bạn lên khỏi mặt đất, khiến bạn cảm thấy nhẹ bẫng.\n\nCác nhân vật đang bay sẽ di chuyện lặng lẽ và không chịu mọi hiệu ứng từ mặt đất. Bẫy sẽ không bị kích hoạt, nước sẽ không dập được lửa, cây cỏ sẽ không bị dẫm lên, rễ cây sẽ không với tới bạn, và bạn sẽ bay qua các hố sâu. Nhưng hãy cẩn thận, bởi tất cả những thứ đó sẽ có hiệu lực trở lại ngay khi hiệu ứng bay kết thúc!\n\nSố lượt bay còn lại: %s.
|
||||
actors.buffs.levitation.desc=Một lực phép thuật đang nhấc bổng bạn lên khỏi mặt đất, khiến bạn cảm thấy nhẹ bẫng.\n\nCác nhân vật đang bay sẽ di chuyện lặng lẽ và không chịu mọi hiệu ứng từ mặt đất. Bẫy sẽ không bị kích hoạt, nước sẽ không dập được lửa, cây cỏ sẽ không bị dẫm lên, rễ sẽ không bám vào bạn, và bạn sẽ bay qua các hố sâu. Nhưng hãy cẩn thận, bởi tất cả những thứ đó sẽ có hiệu lực trở lại ngay khi hiệu ứng bay kết thúc!\n\nLượt bay còn lại: %s.
|
||||
|
||||
actors.buffs.lifelink.name=liên kết sự sống
|
||||
actors.buffs.lifelink.ondeath=Sát thương liên kết sự sống đã giết bạn...
|
||||
@@ -305,7 +305,7 @@ actors.buffs.magicimmune.name=miễn nhiễm phép thuật
|
||||
actors.buffs.magicimmune.desc=Mọi hiệu ứng phép thuật giờ không thể tác động lên bạn, bạn hoàn toàn không thể bị ảnh hưởng bởi chúng.\n\nKhi miễn nhiễm phép thuật, tất cả hiệu ứng phép thuật có lợi và có hại sẽ không tác động đến bạn, bao gồm các lời nguyền, phù phép, đũa phép, cuộn giấy, nhẫn, cổ vật,... Các kĩ năng của áo giáp người hùng đủ mạnh để hoạt động bất kể hiệu ứng này. \n\nLượt miễn nhiễm phép thuật còn lại: %s.
|
||||
|
||||
actors.buffs.mindvision.name=tâm nhãn
|
||||
actors.buffs.mindvision.desc=Bằng cách nào đó bạn có thể nhìn thấy mọi sinh vật trên tầng này qua tâm trí của bạn. Nó là một cảm giác kì lạ.\n\nBạn sẽ còn nhìn thấy được mọi nhân vật trong tầng này miễn là bạn còn tâm nhãn. Việc nhìn thấy sinh vật qua tâm nhãn cũng được xem như là nó đang bị theo dõi hoặc được đứng gần nó để phục vụ cho mục đích của nhiều hiệu ứng phép thuật.\n\nSố lượt tâm nhãn còn lại: %s.
|
||||
actors.buffs.mindvision.desc=Bằng cách nào đó bạn có thể nhìn thấy mọi sinh vật trên tầng này qua tâm trí của bạn. Nó là một cảm giác kì lạ.\n\nBạn sẽ còn nhìn thấy được mọi nhân vật trong tầng này miễn là bạn còn tâm nhãn. Việc nhìn thấy sinh vật qua tâm nhãn cũng được xem như là nó đang bị theo dõi hoặc được đứng gần nó để phục vụ cho mục đích của nhiều hiệu ứng phép thuật.\n\nLượt tâm nhãn còn lại: %s.
|
||||
|
||||
actors.buffs.momentum.momentum=tích lũy động năng
|
||||
actors.buffs.momentum.running=đang chạy
|
||||
@@ -342,7 +342,7 @@ actors.buffs.ooze.name=chất nhầy ăn da
|
||||
actors.buffs.ooze.heromsg=Chất nhầy ăn mòn da thịt của bạn. Hãy rửa trôi nó đi!
|
||||
actors.buffs.ooze.ondeath=Bạn đã bị tan chảy...
|
||||
actors.buffs.ooze.rankings_desc=Đã bị hoà tan
|
||||
actors.buffs.ooze.desc=Thứ axit dính này bám vào da thịt, ăn mòn và làm tan chảy nó một cách chậm rãi.\n\nChất nhầy sẽ gây sát thương cố định theo thời gian, nhưng có thể được rửa sạch ngay lập tức trong nước.\n\nSố lượt bị dính axit còn lại: %s.
|
||||
actors.buffs.ooze.desc=Thứ axit dính này bám vào da thịt, ăn mòn và làm tan chảy nó một cách chậm rãi.\n\nChất nhầy sẽ gây sát thương cố định theo thời gian, nhưng có thể được rửa sạch ngay lập tức trong nước.\n\nLượt chất nhầy còn lại: %s.
|
||||
|
||||
actors.buffs.paralysis.name=tê liệt
|
||||
actors.buffs.paralysis.heromsg=Bạn bị tê liệt!
|
||||
@@ -1445,7 +1445,7 @@ actors.mobs.npcs.wandmaker.desc=Quý ông già nhưng mạnh khỏe này mang m
|
||||
|
||||
###mobs
|
||||
actors.mobs.acidic.name=bọ cạp có tính axit
|
||||
actors.mobs.acidic.desc=Sinh vật quỷ quái giống nhện này cố tránh cận chiến, ưa bắn ra các răng cưa gai từ tầm xa. Có những giọt nước độc đang rỉ ra từ nó.
|
||||
actors.mobs.acidic.desc=Những sinh vật ác quỷ giống nhện này tránh chiến đấu tầm gần, chúng thích bắn các gai có răng cưa gây què từ khoảng cách xa hơn. Con này có vẻ đang chảy ra chất nhầy ăn mòn.
|
||||
|
||||
actors.mobs.albino.name=chuột bạch tạng
|
||||
actors.mobs.albino.desc=Đây là một giống chuột có túi hiếm, với bộ lông trắng tinh và hàm răng lởm chởm.
|
||||
@@ -1577,7 +1577,7 @@ actors.mobs.eye.deathgaze_kill=Ánh nhìn chết đã giết bạn
|
||||
actors.mobs.eye.desc=Mắt quỷ là những quả cầu năng lượng quỷ được nén bay lơ lửng. Mặc dù chúng có khả năng cận chiến nhưng sức mạnh thực sự của chúng đến từ phép thuật của chúng.\n\nSau khi tích năng lượng trong một thời gian ngắn, Mắt quỷ sẽ giải phóng một chùm năng lượng hủy diệt được gọi là _ánh nhìn chết._ Bất cứ thứ gì trong tầm ngắm của Mắt quỷ sẽ chịu sát thương to lớn, những nhà thám hiểm khôn ngoan sẽ chạy tìm chỗ trốn.
|
||||
|
||||
actors.mobs.fetidrat.name=chuột thối
|
||||
actors.mobs.fetidrat.desc=Có điều gì đó sai sai với con chuột này. Bộ lông bóng nhờn màu đen, da thối rữa khác hẳn lũ chuột bình thường bạn từng thấy. Đôi mắt tái nhợt càng làm nó đáng sợ.\n\nNó mang theo một làn khí thối quanh người, cực kì nguy hiểm ở gần.\n\nChất nhờn độc đang chảy ra từ miệng nó, ăn mòn cả nền sàn nhưng có vẻ bị phân giải trong nước.
|
||||
actors.mobs.fetidrat.desc=Rõ ràng có điều gì đó không ổn với con chuột này. Bộ lông đen dính mỡ và lớp da thối rữa của nó khác hẳn những con chuột khoẻ mạnh bạn đã thấy trước đây. Đôi mắt xanh nhạt của nó khiến nó trông đặc biệt nguy hiểm.\n\nNó mang một làn khí hôi thối kinh khủng theo mình, mạnh đến áp đảo ở gần.\n\nChất nhầy đen chảy ra từ miệng của con chuột, ăn mòn sàn ngục nhưng có vẻ tan ra trong nước.
|
||||
actors.mobs.fetidrat.discover_hint=Bạn có thể tìm thấy kẻ địch này trong một nhiệm vụ nhất định.
|
||||
|
||||
actors.mobs.fungalcore.name=lõi nấm
|
||||
@@ -1711,7 +1711,7 @@ actors.mobs.rotlasher.desc=Dây roi thối là một phần trong cấu trúc r
|
||||
actors.mobs.rotlasher.discover_hint=Bạn có thể tìm thấy kẻ địch này trong một nhiệm vụ nhất định.
|
||||
|
||||
actors.mobs.scorpio.name=bọ cạp
|
||||
actors.mobs.scorpio.desc=Những sinh vật quỷ khổng lồ giống loài nhện này tránh cận chiến, chúng thích bắn những chiếc gai có răng cưa gây què từ khoảng cách xa.
|
||||
actors.mobs.scorpio.desc=Những sinh vật ác quỷ giống nhện này tránh chiến đấu tầm gần, chúng thích bắn các gai có răng cưa gây què từ khoảng cách xa hơn.
|
||||
|
||||
actors.mobs.senior.name=tu sĩ già
|
||||
actors.mobs.senior.desc=Những tu sĩ này là những kẻ cuồng tín, những người đã cống hiến hết mình để bảo vệ nhà vua của họ bằng sức mạnh thể lực của họ. Sự tận tâm của họ lớn đến mức họ đã hoàn toàn giao nộp tâm trí của họ cho vị vua của họ, và giờ đây lang thang trong thành phố lùn như những thây ma vô hồn\n\nTu sĩ này đã thành thạo kỹ thuật cận chiến, và có khả năng tích lũy sự tập trung khi di chuyển nhanh hơn nhiều so với những tu sĩ thông thường. Khi chúng trở nên tập trung, tu sĩ sẽ phản lại đòn tấn công vật lí kế tiếp được nhắm vào chúng, ngay cả khi nó đáng lẽ sẽ chắc chắn trúng. Các tu sĩ tích lũy sự tập trung nhanh hơn khi đang di chuyển và chậm hơn khi chiến đấu trực tiếp.
|
||||
|
||||
@@ -122,14 +122,14 @@ actors.buffs.bleeding.name=流血
|
||||
actors.buffs.bleeding.ondeath=你因失血過多而死……
|
||||
actors.buffs.bleeding.heromsg=你正在流血!
|
||||
actors.buffs.bleeding.rankings_desc=流血至死
|
||||
actors.buffs.bleeding.desc=這傷口正湧出大量血液,令人十分不安。 \n\n流血時每回合都會造成傷害。這種傷害值每回合都會隨機減少,直到出血停止為止。 \n\n目前流血傷害:%d。
|
||||
actors.buffs.bleeding.desc=這傷口正湧出大量血液,令人十分不安。 \n\n流血時每回合都會造成傷害。這種傷害值每回合都可能隨機減少,直到出血停止為止。 \n\n目前流血傷害:%d。
|
||||
|
||||
actors.buffs.bless.name=祝福
|
||||
actors.buffs.bless.desc=你的集中力正在噴薄而出,有人說這是神賜的禮物。\n\n祝福狀態能夠提高自己25%%的命中率與閃避率,使被祝福者在戰鬥中勢如破竹。\n\n祝福效果剩餘:%s回合
|
||||
|
||||
actors.buffs.blindness.name=失明
|
||||
actors.buffs.blindness.heromsg=你失明了!
|
||||
actors.buffs.blindness.desc=失明使週遭陷入一片黑暗。 \n\n失明的單位的可視範圍被限制在一格以內、使遠程攻擊變得毫無作用、同時也很容易跟丟敵人。此外,英雄失明時無法閱讀書本或是卷軸。 \n失明效果剩餘:%s回合
|
||||
actors.buffs.blindness.desc=失明使週遭陷入一片黑暗。 \n\n失明的單位的可視範圍被限制在一格以內、使遠程攻擊變得毫無作用、同時也很容易跟丟敵人。此外,英雄失明時無法閱讀書本或是卷軸。 \n\n失明效果剩餘:%s回合
|
||||
|
||||
actors.buffs.buff.heromsg=
|
||||
|
||||
@@ -186,7 +186,7 @@ actors.buffs.combo$combomove.fury.desc=攻擊一名敵人數次,攻擊次數
|
||||
actors.buffs.combo$combomove.fury.empower_desc=_前躍最多%d格以靠近敵人_並攻擊其數次,攻擊次數等同於連擊數。每次攻擊造成60%%傷害,並可以觸發武器附魔效果。使用後重置連擊數。
|
||||
|
||||
actors.buffs.corruption.name=腐化
|
||||
actors.buffs.corruption.desc=腐化魔法能滲透至生物的本質,扭曲其原本的意志。\n\n被腐化的生物會攻擊友方,忽略原有的敵人。腐化魔法也會傷害生物,讓他們緩慢走向死亡。\n\n腐化是永久性的,唯有死亡才能獲得解脫。
|
||||
actors.buffs.corruption.desc=腐化魔法能滲透至生物的本質,扭曲其原本的意志。\n\n被腐化的生物會攻擊友方,忽略原有的敵人。腐化魔法也會傷害生物,讓他們緩慢走向死亡。\n\n遭腐化後就無法脫身,唯有死亡才能獲得解脫。
|
||||
|
||||
actors.buffs.cripple.name=殘廢
|
||||
actors.buffs.cripple.heromsg=你殘廢了!
|
||||
@@ -201,7 +201,7 @@ actors.buffs.degrade.heromsg=你的裝備被暫時弱化了!
|
||||
actors.buffs.degrade.desc=強大的黑暗魔法正在吞噬升級卷軸注入你裝備的魔力!\n\n降級狀態下的裝備會被視作比起原有等級更低的狀態。_超過3級以後的每一級都會受到更嚴重的削弱_。物品的描述也會根據降級的影響而改變。\n\n不過,降級不會影響裝備的力量需求,法杖充能,投擲武器耐久,以及神器。\n\n降級效果剩餘:%s回合。使用一張升級卷軸或祛邪卷軸可以立即驅散這種黑暗魔法。
|
||||
|
||||
actors.buffs.doom.name=定命
|
||||
actors.buffs.doom.desc=當整個世界都看起來想置你於死地時,繼續鬥爭還有什麼意義呢?\n\n被定命的單位受到的任何傷害都會提升67% 。\n\n定命是永久性的,唯有死亡才能獲得解脫。
|
||||
actors.buffs.doom.desc=當整個世界都看起來想置你於死地時,繼續鬥爭還有什麼意義呢?\n\n被定命的單位受到的任何傷害都會提升67% 。\n\n遭定命後就無法脫身,唯有死亡才能獲得解脫。
|
||||
|
||||
actors.buffs.dread.name=魂飛魄散
|
||||
actors.buffs.dread.desc=目標已被嚇至魂飛魄散,正在極度的恐慌下嘗試逃出這座地下城!\n\n魂飛魄散的生物將快速逃離它們的敵人,並且會在離開敵人可視範圍後立即消失在整座地下城中。逃離的敵人不會掉落道具,只會給予玩家減半的經驗值獎勵。傷害所造成的痛楚將促使其鎮定下來。\n\n魂飛魄散效果剩餘時長:%d 回合。
|
||||
@@ -1292,7 +1292,7 @@ actors.hero.talent.stasis.desc=習得法術_星界投射_,可耗2點充能暫
|
||||
#universal
|
||||
actors.hero.talent.heroic_energy.title=英氣威能
|
||||
actors.hero.talent.heroic_energy.rat_title=鼠氣威能
|
||||
actors.hero.talent.heroic_energy.desc=_+1:_英雄護甲的充能消耗量_減少至原先的12%_。\n\n_+2:_英雄護甲的充能消耗量_減少至原先的23%_。\n\n_+3:_英雄護甲的充能消耗量_減少至原先的32%_。\n\n_+4:_英雄護甲的充能消耗量_減少至原先的40%_。
|
||||
actors.hero.talent.heroic_energy.desc=_+1:_英雄護甲的充能消耗量_減少12%_。\n\n_+2:_英雄護甲的充能消耗量_減少23%_。\n\n_+3:_英雄護甲的充能消耗量_減少32%_。\n\n_+4:_英雄護甲的充能消耗量_減少40%_。
|
||||
|
||||
actors.hero.talent.ratsistance.title=鼠族抗性
|
||||
actors.hero.talent.ratsistance.desc=_+1:_鼠化敵人傷害為原先的_90%_。\n\n_+2:_鼠化敵人傷害為原先的_81%_。\n\n_+3:_鼠化敵人傷害為原先的_73%_。\n\n_+4:_鼠化敵人傷害為原先的_65%_。
|
||||
@@ -1350,11 +1350,11 @@ actors.mobs.npcs.ghost.find_me=謝謝你……來找我吧……
|
||||
actors.mobs.npcs.ghost.desc=這個幽靈幾乎不能被看見。它看起來像是由一片無形的昏暗光斑和一張悲痛的面孔所組成的。
|
||||
|
||||
actors.mobs.npcs.imp.name=野心勃勃的小惡魔
|
||||
actors.mobs.npcs.imp.intro=你是一名冒險家嗎? 我最愛冒險家了! 在需要殺掉什麼的時候他們總是最可靠了,我說的沒錯吧? 報酬?當然有啦 ;)
|
||||
actors.mobs.npcs.imp.intro=你是一名冒險家嗎? 我最愛冒險家了! 在需要殺掉什麼的時候他們總是最可靠了,我說的沒錯吧? 報酬?當然有啦 ; )
|
||||
actors.mobs.npcs.imp.golems_1=總之,我需要你殺一些_魔像_。 你看,我要在這裡開始搞點小本生意,但這些愚蠢的傀儡只會毀掉我的生意! 跟這些發著光的大個子花崗岩根本沒法交流,真是該死! 所以殺死……我想想,_4個魔像_,然後獎勵就是你的了。
|
||||
actors.mobs.npcs.imp.monks_1=總之,我需要你殺一些_武僧_。 你看,我要在這裡開始搞點小本生意,但這些瘋子不買任何東西還會嚇跑顧客。 所以殺死……我想想,_5位武僧_,然後獎勵就是你的了。
|
||||
actors.mobs.npcs.imp.golems_2=喔,你還活著!我就知道你的頭比它們更硬;) 只要別忘了撿走它們的徽記就好。
|
||||
actors.mobs.npcs.imp.monks_2=喔,你還活著!我就知道你的功夫比他們更強;) 只要別忘了撿走他們的徽記就好。
|
||||
actors.mobs.npcs.imp.golems_2=喔,你還活著!我就知道你的頭比它們更硬; ) 只要別忘了撿走它們的徽記就好。
|
||||
actors.mobs.npcs.imp.monks_2=喔,你還活著!我就知道你的功夫比他們更強; ) 只要別忘了撿走他們的徽記就好。
|
||||
actors.mobs.npcs.imp.cya=我們會再見面的,%s!
|
||||
actors.mobs.npcs.imp.hey=喂喂喂,%s!
|
||||
actors.mobs.npcs.imp.desc=小惡魔是一種低等惡魔。它們既沒有強大的力量也沒有魔法天賦,但他們相當聰明而且善於交際。許多小惡魔都喜歡生活在沒有其他惡魔存在的地方。
|
||||
@@ -1378,7 +1378,7 @@ actors.mobs.npcs.prismaticimage.discover_hint=此盟友為閱讀某種卷軸後
|
||||
|
||||
actors.mobs.npcs.ratking.name=鼠王
|
||||
actors.mobs.npcs.ratking.not_sleeping=我可不是在睡覺!
|
||||
actors.mobs.npcs.ratking.what_is_it=那傢伙是甚麼鬼?我可沒時間管這些破事。我的王國可不會自己運轉下去!
|
||||
actors.mobs.npcs.ratking.what_is_it=現在又怎麼了?我可沒時間管這些破事。我的王國可不會自己運轉下去!
|
||||
actors.mobs.npcs.ratking.confused=這……我這是在哪? 我的王國需要我!
|
||||
actors.mobs.npcs.ratking.crown_clothes=把衣服穿上!我可不會批准你與我會面!
|
||||
actors.mobs.npcs.ratking.crown_desc=哇喔!那王冠是給我的嗎?那看起來比我的閃亮多了,那我就好心好意的收下了!\n\n我正在想我能給你點獎賞……一種使你如同英雄的強大能力如何?
|
||||
@@ -1398,7 +1398,7 @@ actors.mobs.npcs.sheep.name=綿羊
|
||||
actors.mobs.npcs.sheep.baa!=咩!
|
||||
actors.mobs.npcs.sheep.baa?=咩?
|
||||
actors.mobs.npcs.sheep.baa.=咩。
|
||||
actors.mobs.npcs.sheep.baa...=咩……
|
||||
actors.mobs.npcs.sheep.baa...=咩…
|
||||
actors.mobs.npcs.sheep.def_verb=格擋
|
||||
actors.mobs.npcs.sheep.desc=這是一隻魔法綿羊。為什麼叫牠魔法綿羊?因為你殺不死牠。牠只會站在那裡直到牠消失,牠會做的事情只有邊反芻邊對你翻白眼。
|
||||
actors.mobs.npcs.sheep.discover_hint=此角色可被某種物品與陷阱召喚。
|
||||
@@ -1419,7 +1419,7 @@ actors.mobs.npcs.shopkeeper.talk_prison_duelist=哦,這不是正在旅行的
|
||||
actors.mobs.npcs.shopkeeper.talk_prison_cleric=唉呦,是殿下啊,現在又升遷成聖下啦?嘻嘻,這裡有個更好的問題:你工作不好好做來這做啥?你應該知道你的死對那些信徒可是重大打擊吧。不如這樣吧:我相信你在上層絕對有撿到錢,你把那些對你沒用的穢物給我,我給你些能讓你活著出去的東西,意下如何?
|
||||
actors.mobs.npcs.shopkeeper.talk_caves=花錢,是為了走更長遠的路。\n\n喔,還有,如果你在底下見到我那巨魔老友,替我向他問好。順便催那塊石頭把上禮拜槌子的錢給我結清!
|
||||
actors.mobs.npcs.shopkeeper.talk_city=我的商品可以保證你在這裡的安全。\n\n但拜託不要在這裡閒晃。我不知道花了多久才讓這邊的"居民"不靠近我,我可不想要你帶來更多麻煩!
|
||||
actors.mobs.npcs.shopkeeper.talk_halls=哈嘍!我為了獵魔人準備了特別的優惠!\n\n對了,下去時可要小心點!底下的惡魔可不管你有多勇敢。如果你死了就沒辦法回來花更多錢啦! ;)\n那些惡魔和我像嗎? 嘿嘿,當然不是。我只是一個小家伙,不會打架,還保住了我的意識。底下的惡魔都非常強,還被奴化了,是被……呃,總之下去時小心點。
|
||||
actors.mobs.npcs.shopkeeper.talk_halls=哈嘍!我為了獵魔人準備了特別的優惠!\n\n對了,下去時可要小心點!底下的惡魔可不管你有多勇敢。如果你死了就沒辦法回來花更多錢啦! ; )\n那些惡魔和我像嗎? 嘿嘿,當然不是。我只是一個小家伙,不會打架,還保住了我的意識。底下的惡魔都非常強,還被奴化了,是被……呃,總之下去時小心點。
|
||||
actors.mobs.npcs.shopkeeper.talk_ascent=無論你想要拿護符做什麼,我可不想與你有所瓜葛。要買東西就快點,我們都該走人了!
|
||||
actors.mobs.npcs.shopkeeper.desc=這位矮胖的傢伙看起來更適合在某些大城市裡做買賣而不是這種地下城。這些商品的價格解釋了為什麼他會喜歡在這地方做生意。
|
||||
|
||||
|
||||
@@ -1119,7 +1119,7 @@ actors.hero.talent.farsight.desc=_+1:_狙击手的视野范围_扩大25%_。\n
|
||||
actors.hero.talent.shared_enchantment.title=联动附魔
|
||||
actors.hero.talent.shared_enchantment.desc=_+1:_投掷武器_有33%概率_附带狙击手灵能弓上的附魔。\n\n_+2:_投掷武器_有67%概率_附带狙击手灵能弓上的附魔。\n\n_+3:_投掷武器_有100%概率_附带狙击手灵能弓上的附魔。\n\n无论投掷武器附有哪种附魔,均能正常触发灵能弓的附魔。
|
||||
actors.hero.talent.shared_upgrades.title=联动升级
|
||||
actors.hero.talent.shared_upgrades.desc=当狙击手以一件已升级的投掷武器攻击时,其每级升级都会延长1回合狙击标记持续时间并增加16%特殊攻击伤害。\n\n_+1:_狙击手的投掷武器最多提供_2级_加成,可最多延长_2回合_狙击标记持续时间并增加_33%_特殊攻击伤害。\n\n_+2:_狙击手的投掷武器最多提供_4级_加成,可最多延长_4回合_狙击标记持续时间并增加_67%_特殊攻击伤害。\n\n_+3:_狙击手的投掷武器最多提供_6级_加成,可最多延长_6回合_狙击标记持续时间并增加_100%_特殊攻击伤害。
|
||||
actors.hero.talent.shared_upgrades.desc=当狙击手以一件已升级的投掷武器攻击时,其每级升级都会延长1回合狙击标记持续时间并增加16%特殊攻击伤害。\n\n_+1:_狙击手的投掷武器被限制为最多提供_2级_加成,以延长_2回合_狙击标记持续时间并增加_33%_特殊攻击伤害。\n\n_+2:_狙击手的投掷武器被限制为最多提供_4级_加成,以延长_4回合_狙击标记持续时间并增加_67%_特殊攻击伤害。\n\n_+3:_狙击手的投掷武器被限制为最多提供_6级_加成,以延长_6回合_狙击标记持续时间并增加_100%_特殊攻击伤害。
|
||||
|
||||
actors.hero.talent.durable_tips.title=持久药液
|
||||
actors.hero.talent.durable_tips.desc=_+1:_守望者的涂药飞镖拥有_2倍耐久_。\n\n_+2:_守望者的涂药飞镖拥有_3倍耐久_。\n\n_+3:_守望者的涂药飞镖拥有_4倍耐久_。
|
||||
|
||||
@@ -392,7 +392,7 @@ items.artifacts.masterthievesarmband.no_charge=Your armband does not have enough
|
||||
items.artifacts.masterthievesarmband.cursed=You can't use a cursed armband.
|
||||
items.artifacts.masterthievesarmband.full=Your armband is fully charged!
|
||||
items.artifacts.masterthievesarmband.prompt=Choose an enemy to target
|
||||
items.artifacts.masterthievesarmband.no_target=You must target an enemy that is adjacent to you
|
||||
items.artifacts.masterthievesarmband.no_target=You must target an enemy that is adjacent to you.
|
||||
items.artifacts.masterthievesarmband.steal_shopkeeper=You can't steal from shopkeepers directly.
|
||||
items.artifacts.masterthievesarmband.no_steal=That enemy has nothing to steal.
|
||||
items.artifacts.masterthievesarmband.stole_item=You stole an item: %s.
|
||||
|
||||
@@ -2201,11 +2201,11 @@ items.weapon.missiles.shuriken$shurikeninstanttracker.name=Cooldown shurikenu
|
||||
items.weapon.missiles.shuriken$shurikeninstanttracker.desc=Nedávno jsi hodil shuriken okamžitě, a musíš počkat, než to bueš moct provést znovu. Shurikeny můžeš stále používat, ale s normální rychlostí útoku.\n\nZbývá tahů: %s.
|
||||
|
||||
items.weapon.missiles.throwingclub.name=Vrhací palice
|
||||
items.weapon.missiles.throwingclub.stats_desc=
|
||||
items.weapon.missiles.throwingclub.stats_desc=Tato zbraň se nezabodává do nepřátel a může být inhned sebrána.
|
||||
items.weapon.missiles.throwingclub.desc=Poměrně jednoduchá a pevná vrhací zbraň, v podstatě velký kámen připevněný k tyči.
|
||||
|
||||
items.weapon.missiles.throwinghammer.name=Vrhací kladivo
|
||||
items.weapon.missiles.throwinghammer.stats_desc=
|
||||
items.weapon.missiles.throwinghammer.stats_desc=Tato zbraň se nezabodává do nepřátel a může být inhned sebrána.
|
||||
items.weapon.missiles.throwinghammer.desc=Tyto robustní kladiva jsou navržena pro házení po nepřátelích. Jejich hladká celokovová konstrukce jim propůjčuje značnou výdrž.
|
||||
|
||||
items.weapon.missiles.throwingknife.name=Vrhací nůž
|
||||
@@ -2236,7 +2236,7 @@ items.weapon.spiritbow.name=Přízračný luk
|
||||
items.weapon.spiritbow.ac_shoot=STŘELIT
|
||||
items.weapon.spiritbow.prompt=Vyber cíl
|
||||
items.weapon.spiritbow.stats=Luk nemůže být přímo vylepšován, ale místo toho se stává postupně silnější s tvou úrovní. Šípy vystřelené z luku způsobí na tvé současné úrovni _%1$d-%2$d poškození_ a samotný luk vyžaduje _%3$d bodů síly_ pro řádné využití.
|
||||
items.weapon.spiritbow.desc=Luk vytvořený z prastarého magického dřeva. Struna luku a jeho ornamenty září bledě modrým světlem. Když je struna napnuta, vykouzlí luk magický šíp, který může být vypálen po nepříteli.
|
||||
items.weapon.spiritbow.desc=Luk vytvořený z prastarého magického dřeva. Tětiva luku a jeho ornamenty září bledě modrým světlem. Když je tětiva napnuta, vykouzlí luk magický šíp, který může být vypálen po nepříteli.
|
||||
items.weapon.spiritbow.discover_hint=S tímto předmětem začíná jeden z hrdinů.
|
||||
|
||||
items.weapon.weapon.identify=Nyní dostatečně znáš svou zbraň.
|
||||
|
||||
@@ -2180,7 +2180,7 @@ items.weapon.missiles.missileweapon.stats_known=Este conjunto de armas arrojadiz
|
||||
items.weapon.missiles.missileweapon.stats_unknown=Tipicamente este conjunto de armas arrojadizas de _tier-%1$d_ causaría _%2$d-%3$d de daño_ y requiere _%4$d de fuerza_ para ser usado adecuadamente.
|
||||
items.weapon.missiles.missileweapon.stats_desc=
|
||||
items.weapon.missiles.missileweapon.probably_too_heavy=Probablemente esta arma sea demasiado pesada para ti.
|
||||
items.weapon.missiles.missileweapon.distance=Las armas de alcance son más precisas a distancia y menos certeras cuerpo a cuerpo.
|
||||
items.weapon.missiles.missileweapon.distance=Las armas arrojadizas son más precisas a distancia y menos certeras cuerpo a cuerpo.
|
||||
items.weapon.missiles.missileweapon.durability=Las armas arrojadizas se desgastarán y se romperán a medida que se usen.
|
||||
items.weapon.missiles.missileweapon.uses_left=Este conjunto de armas arrojadizas tiene _%d/%d_ usos restantes antes de que una se rompa.
|
||||
items.weapon.missiles.missileweapon.unlimited_uses=Este conjunto es de tan alta calidad que durará efectivamente para siempre.
|
||||
|
||||
@@ -2201,11 +2201,11 @@ items.weapon.missiles.shuriken$shurikeninstanttracker.name=cooldown shuriken
|
||||
items.weapon.missiles.shuriken$shurikeninstanttracker.desc=Kamu baru saja melempar shuriken secara instan, dan harus menunggu sebelum melakukannya lagi. Shuriken masih bisa dilempar, tetapi dengan kecepatan senjata normal.\n\nGiliran Tersisa: %s.
|
||||
|
||||
items.weapon.missiles.throwingclub.name=palu lempar kecil
|
||||
items.weapon.missiles.throwingclub.stats_desc=
|
||||
items.weapon.missiles.throwingclub.stats_desc=Senjata ini tidak menempel pada musuh dan bisa diambil secara instan.
|
||||
items.weapon.missiles.throwingclub.desc=Senjata lempar yang cukup sederhana tetapi tahan lama, pada dasarnya berupa batu besar yang diikatkan pada tongkat.
|
||||
|
||||
items.weapon.missiles.throwinghammer.name=palu lempar
|
||||
items.weapon.missiles.throwinghammer.stats_desc=
|
||||
items.weapon.missiles.throwinghammer.stats_desc=Senjata ini tidak menempel pada musuh dan bisa diambil secara instan.
|
||||
items.weapon.missiles.throwinghammer.desc=Palu-palu berat ini dirancang untuk dilempar ke arah musuh. Konstruksi logamnya yang halus membuatnya cukup tahan lama.
|
||||
|
||||
items.weapon.missiles.throwingknife.name=pisau lempar
|
||||
|
||||
@@ -2201,11 +2201,11 @@ items.weapon.missiles.shuriken$shurikeninstanttracker.name=재사용 대기 시
|
||||
items.weapon.missiles.shuriken$shurikeninstanttracker.desc=당신은 최근에 수리검을 턴 소모 없이 던졌으며, 다시 그렇게 하기 위해서는 기다려야만 합니다. 수리검은 여전히 던질 수 있지만, 일반적인 공격 속도를 가질 것입니다.\n\n남은 턴: %s.
|
||||
|
||||
items.weapon.missiles.throwingclub.name=투척용 몽둥이
|
||||
items.weapon.missiles.throwingclub.stats_desc=
|
||||
items.weapon.missiles.throwingclub.stats_desc=이 무기는 적에게 고정되지 않아 적중 후 빠르게 다시 주워 사용할 수 있습니다.
|
||||
items.weapon.missiles.throwingclub.desc=매우 단순하지만 내구성이 뛰어난 투척 무기로, 기본적으로 막대기에 큰 돌을 고정한 형태입니다.
|
||||
|
||||
items.weapon.missiles.throwinghammer.name=투척용 망치
|
||||
items.weapon.missiles.throwinghammer.stats_desc=
|
||||
items.weapon.missiles.throwinghammer.stats_desc=이 무기는 적에게 고정되지 않아 적중 후 빠르게 다시 주워 사용할 수 있습니다.
|
||||
items.weapon.missiles.throwinghammer.desc=이 묵직한 망치는 적에게 던지기 위해 만들어졌습니다. 튼튼하고 매끈한 무쇠로 만들어져 내구성이 높습니다.
|
||||
|
||||
items.weapon.missiles.throwingknife.name=투척용 칼
|
||||
|
||||
@@ -2184,7 +2184,7 @@ items.weapon.missiles.missileweapon.distance=Werpwapens zijn nauwkeuriger op afs
|
||||
items.weapon.missiles.missileweapon.durability=Werpwapens slijten en breken als ze worden gebruikt.
|
||||
items.weapon.missiles.missileweapon.uses_left=Deze set van werpwapens kan nog _%d/%d_ keer worden gebruikt voordat er één breekt.
|
||||
items.weapon.missiles.missileweapon.unlimited_uses=De kwaliteit van deze set is zo hoog dat hij vrijwel eeuwig meegaat.
|
||||
items.weapon.missiles.missileweapon.unknown_uses=Normaal gesproken kun je deze set werpwapens _%d_ gebruiken voordat er één kapotgaat.
|
||||
items.weapon.missiles.missileweapon.unknown_uses=Normaal gesproken kun je deze set werpwapens _%d_ keer gebruiken voordat er één kapotgaat.
|
||||
items.weapon.missiles.missileweapon.curse_discover=Dit werwapen is vervloekt!
|
||||
items.weapon.missiles.missileweapon.about_to_break=Je werpwapen staat op het punt te breken.
|
||||
items.weapon.missiles.missileweapon.has_broken=Eén van je werpwapens is kapot.
|
||||
|
||||
@@ -1462,7 +1462,7 @@ items.trinkets.shardofoblivion.identify_not_yet=Ten przedmiot nie jest jeszcze g
|
||||
items.trinkets.shardofoblivion.identify=Zidentyfikowano przedmiot!
|
||||
items.trinkets.shardofoblivion$wandusetracker.name=Użycie Niezidentyfikowanej Różdżki
|
||||
items.trinkets.shardofoblivion$wandusetracker.desc=Niedawno została użyta niezidentyfikowana różdżka, która na potrzeby złota głupców tymczasowo liczy się jako niezidentyfikowany element ekwipunku.\n\nPozostałe tury efektu: %s.
|
||||
items.trinkets.shardofoblivion$thrownusetracker.name=Użycie Niezidentyfikowanej Broni Miotanej
|
||||
items.trinkets.shardofoblivion$thrownusetracker.name=użycie niezidentyfikowanej broni miotanej
|
||||
items.trinkets.shardofoblivion$thrownusetracker.desc=Niedawno została użyta niezidentyfikowana broń miotana, która na potrzeby złota głupców tymczasowo liczy się jako niezidentyfikowany element ekwipunku.\n\nPozostałe tury efektu: %s.
|
||||
|
||||
items.trinkets.thirteenleafclover.name=trzynastolistna koniczyna
|
||||
@@ -2166,7 +2166,7 @@ items.weapon.missiles.forcecube.stats_desc=Ta broń po rzuceniu rozkłada impakt
|
||||
items.weapon.missiles.forcecube.desc=Te magiczne kostki o osobliwym kształcie są wystarczająco małe, aby dało się je trzymać w dłoni, ale mimo tego są bardzo ciężkie.
|
||||
|
||||
items.weapon.missiles.heavyboomerang.name=ciężki bumerang
|
||||
items.weapon.missiles.heavyboomerang.stats_desc=Ta broń wraca do miejsca, z którego została rzucona po kilku turach.
|
||||
items.weapon.missiles.heavyboomerang.stats_desc=Po kilku turach, ta broń wraca w miejsce, z którego została rzucona.
|
||||
items.weapon.missiles.heavyboomerang.desc=Ten wielki bumerang wymaga wprawy, ale zadaje znaczne obrażenia.
|
||||
|
||||
items.weapon.missiles.javelin.name=oszczep
|
||||
@@ -2195,29 +2195,29 @@ items.weapon.missiles.missileweapon.break_upgraded_warn_no=Nie
|
||||
items.weapon.missiles.missileweapon$placeholder.name=broń miotana
|
||||
|
||||
items.weapon.missiles.shuriken.name=shuriken
|
||||
items.weapon.missiles.shuriken.stats_desc=Shurikeny można rzucać natychmiast co 20 tur.
|
||||
items.weapon.missiles.shuriken.stats_desc=Shurikeny można rzucać natychmiastowo raz na 20 tur.
|
||||
items.weapon.missiles.shuriken.desc=Te gwiaździste kawałki metalu z ostrymi jak brzytwa krawędziami są lekkie i proste do użycia w trakcie ruchu.
|
||||
items.weapon.missiles.shuriken$shurikeninstanttracker.name=Odnowienie Shurikena
|
||||
items.weapon.missiles.shuriken$shurikeninstanttracker.desc=Niedawno został rzucony shuriken bez wykorzystania tury, musisz poczekać zanim możesz zrobić to ponownie. Dalej można rzucać shurikenami z normalną prędkością ataku.\n\nPozostało tur: %s.
|
||||
items.weapon.missiles.shuriken$shurikeninstanttracker.name=odnowienie shurikena
|
||||
items.weapon.missiles.shuriken$shurikeninstanttracker.desc=Niedawno wykonany rzut shurikenem był natychmiastowy, musisz poczekać, zanim zrobisz to ponownie. Shurikenami wciąż można rzucać z normalną prędkością ataku.\n\nPozostałe tury: %s.
|
||||
|
||||
items.weapon.missiles.throwingclub.name=maczuga do rzucania
|
||||
items.weapon.missiles.throwingclub.stats_desc=Ta broń nie pozostaje przy przeciwnikach i można ją od razu podnieść.
|
||||
items.weapon.missiles.throwingclub.stats_desc=Ta broń nie wbija się w przeciwników i można ją natychmiastowo podnieść.
|
||||
items.weapon.missiles.throwingclub.desc=Całkiem prosta broń miotana; w zasadzie jest to wielki kamień przywiązany do patyka.
|
||||
|
||||
items.weapon.missiles.throwinghammer.name=młot do rzucania
|
||||
items.weapon.missiles.throwinghammer.stats_desc=Ta broń nie pozostaje przy przeciwnikach i można ją od razu podnieść.
|
||||
items.weapon.missiles.throwinghammer.desc=Te ciężkie młoty zostały zaprojektowane do rzucania we wrogów. Ich konstrukcja z metalu powoduje że są wytrzymałe.
|
||||
items.weapon.missiles.throwinghammer.stats_desc=Ta broń nie wbija się w przeciwników i można ją natychmiastowo podnieść.
|
||||
items.weapon.missiles.throwinghammer.desc=Te ciężkie młoty zostały zaprojektowane do rzucania we wrogów. Są odlane w całości z metalu, co czyni je wytrzymałymi.
|
||||
|
||||
items.weapon.missiles.throwingknife.name=nóż do rzucania
|
||||
items.weapon.missiles.throwingknife.stats_desc=Ta broń jest mocniejsza wobec nieświadomych niczego wrogów.
|
||||
items.weapon.missiles.throwingknife.desc=Te lekkie noże są wyważone tak, aby, lecąc po łuku, trafiały prosto w cel.
|
||||
items.weapon.missiles.throwingknife.desc=Te lekkie noże są wyważone tak, aby leciały po łuku, trafiając prosto w cel.
|
||||
items.weapon.missiles.throwingknife.discover_hint=Z tym przedmiotem zaczyna jeden z bohaterów.
|
||||
|
||||
items.weapon.missiles.throwingspear.name=włócznia do rzucania
|
||||
items.weapon.missiles.throwingspear.desc=Te lekkie włócznie mają cienką konstrukcję, która została zaprojektowane z myślą o rzucaniu, nie o walce wręcz.
|
||||
items.weapon.missiles.throwingspear.desc=Te lekkie włócznie mają cienką konstrukcję, zaprojektowaną z myślą o rzucaniu, nie o walce wręcz.
|
||||
|
||||
items.weapon.missiles.throwingspike.name=kolec do rzucania
|
||||
items.weapon.missiles.throwingspike.desc=Te naostrzone kawałki metalu są przeznaczone do rażenia nimi odległych przeciwników.
|
||||
items.weapon.missiles.throwingspike.desc=Te wytrzymałe, spiczaste kawałki metalu służą do rzucania nimi w oddalonych przeciwników.
|
||||
items.weapon.missiles.throwingspike.discover_hint=Z tym przedmiotem zaczyna jeden z bohaterów.
|
||||
|
||||
items.weapon.missiles.throwingstone.name=kamień do rzucania
|
||||
@@ -2225,7 +2225,7 @@ items.weapon.missiles.throwingstone.desc=Te kamienie są piaskowane, aby można
|
||||
items.weapon.missiles.throwingstone.discover_hint=Z tym przedmiotem zaczyna jeden z bohaterów.
|
||||
|
||||
items.weapon.missiles.tomahawk.name=tomahawk
|
||||
items.weapon.missiles.tomahawk.stats_desc=Ta broń wykrwawi przeciwnika o połowę zadanych mu obrażeń.
|
||||
items.weapon.missiles.tomahawk.stats_desc=Ta broń powoduje krwawienie u przeciwnika w wysokości połowy zadanych mu obrażeń.
|
||||
items.weapon.missiles.tomahawk.desc=Te siekiery do rzucania posiadają ząbkowane ostrza, rozrywające skórę po wbiciu się w przeciwnika.
|
||||
|
||||
items.weapon.missiles.trident.name=trójząb
|
||||
@@ -2305,7 +2305,7 @@ items.dewdrop.name=kropla rosy
|
||||
items.dewdrop.already_full=Jesteś już w pełni sił.
|
||||
items.dewdrop.desc=Kryształowo czysta kropla rosy.\n\nDzięki magii tego miejsca czysta woda ma pewne właściwości lecznicze.
|
||||
|
||||
items.equipableitem.curse_detected=Wyczuwasz że przedmiot jest przeklęty tuż przed jego założeniem!
|
||||
items.equipableitem.curse_detected=Tuż przed założeniem przedmiotu wyczuwasz, że jest on przeklęty!
|
||||
items.equipableitem.unequip_cursed=Nie możesz zdjąć przeklętego przedmiotu!
|
||||
items.equipableitem.ac_equip=ZAŁÓŻ
|
||||
items.equipableitem.ac_unequip=ZDEJMIJ
|
||||
|
||||
@@ -1034,11 +1034,11 @@ items.rings.ringofforce$brawlersstance.name=thế đứng chiến binh
|
||||
items.rings.ringofforce$brawlersstance.desc=Khi đang ở trong thế đứng này, các đòn tấn công thông thường của Kiếm sĩ sẽ sử dụng một chiếc nhẫn lực đánh đã được trang bị kể cả khi cô ấy có trang bị một vũ khí. Những đòn tấn công này được tăng sát thương và sẽ vẫn sử dụng cường hóa và phù phép của món vũ khí.\n\nTuy vậy, duy trì thế đứng này cần sự tập trung, làm giảm tốc độ hồi năng vũ khí đi 50%.\n\nThế đứng này có thể được bật hoặc tắt bằng cách sử dụng một chiếc nhẫn lực đánh, nhưng sự giảm tốc độ hồi năng sẽ còn tồn tại trong một thời gian ngắn nếu thế đứng được kích hoạt và hủy nhanh chóng.
|
||||
|
||||
items.rings.ringoffuror.name=nhẫn căm giận
|
||||
items.rings.ringoffuror.stats=Khi được đeo, chiếc nhẫn này sẽ tăng tốc độ các đòn tấn công của bạn thêm _%s%%._
|
||||
items.rings.ringoffuror.stats=Khi được đeo, chiếc nhẫn này sẽ tăng tốc độ của các đòn tấn công của bạn thêm _%s%%._
|
||||
items.rings.ringoffuror.typical_stats=Khi được đeo, chiếc nhẫn này thông thường sẽ tăng tốc độ các đòn tấn công của bạn thêm _%s%%._
|
||||
items.rings.ringoffuror.combined_stats=Những chiếc nhẫn được trang bị của bạn đang kết hợp sức mạnh của chúng, tăng tốc độ của các đòn tấn công của bạn thêm tổng cộng _%s%%_.
|
||||
items.rings.ringoffuror.upgrade_stat_name_1=Tăng tốc độ tấn công
|
||||
items.rings.ringoffuror.desc=Chiếc nhẫn tạo ra một cơn giận dữ bên trong người mặc, cho phép họ tấn công nhanh hơn. Một chiếc nhẫn bị nguyền sẽ thay vào đó làm chậm tốc độ tấn công của người đeo.
|
||||
items.rings.ringoffuror.desc=Chiếc nhẫn tạo ra một cơn giận dữ bên trong người đeo, cho phép họ tấn công nhanh hơn. Một chiếc nhẫn bị nguyền sẽ thay vào đó làm chậm tốc độ tấn công của người đeo.
|
||||
|
||||
items.rings.ringofhaste.name=nhẫn nhanh nhẹn
|
||||
items.rings.ringofhaste.stats=Khi được đeo, chiếc nhẫn này sẽ tăng tốc độ di chuyển của bạn thêm _%s%%._
|
||||
@@ -1890,7 +1890,7 @@ items.weapon.melee.greataxe.stats_desc=Vũ khí này nặng không tưởng.
|
||||
items.weapon.melee.greataxe.ability_name=báo thù
|
||||
items.weapon.melee.greataxe.typical_ability_desc=Kiếm sĩ có thể thực hiện một đòn _trả thù_ với một cây rìu lớn nếu sinh lực của cô dưới mức 50%%. Đòn tấn công hủy diệt này thường gây _%1$d-%2$d sát thương,_ chắc chắn sẽ trúng, và diễn ra tức thì nếu nó giết một kẻ địch.
|
||||
items.weapon.melee.greataxe.ability_desc=Kiếm sĩ có thể thực hiện một đòn _trả thù_ với một cây rìu lớn nếu sinh lực của cô dưới mức 50%%. Đòn tấn công hủy diệt này gây _%1$d-%2$d sát thương,_ chắc chắn sẽ trúng, và diễn ra tức thì nếu nó giết một kẻ địch.
|
||||
items.weapon.melee.greataxe.desc=Phải được vác lên vai, chiếc rìu khổng lồ này nặng thế nào thì mạnh thế ấy.
|
||||
items.weapon.melee.greataxe.desc=Phải được vác lên vai, chiếc rìu khổng lồ này có sức mạnh ngang với sức nặng của nó.
|
||||
|
||||
items.weapon.melee.greatshield.name=khiên lớn
|
||||
items.weapon.melee.greatshield.typical_stats_desc=Vũ khí này thông thường sẽ đỡ 0-%d sát thương. Mức độ đỡ đòn tỉ lệ thuận với số lượng nâng cấp.
|
||||
@@ -2112,7 +2112,7 @@ items.weapon.missiles.darts.dart.desc=Những trục gỗ nhọn đơn giản n
|
||||
items.weapon.missiles.darts.dart.unlimited_uses=Nhờ cấu tạo đơn giản của chúng, phi tiêu có thể coi là sẽ dùng được vĩnh viễn.
|
||||
|
||||
items.weapon.missiles.darts.displacingdart.name=phi tiêu dịch chuyển
|
||||
items.weapon.missiles.darts.displacingdart.desc=Những chiếc phi tiêu này được tẩm bằng một hợp chất dựa trên lá dịch chuyển và sẽ dịch chuyển mục tiêu của chúng đi một khoảng cách ngắn.
|
||||
items.weapon.missiles.darts.displacingdart.desc=Những chiếc phi tiêu này được tẩm bằng một hợp chất dựa trên lá biến mất và sẽ dịch chuyển mục tiêu của chúng đi một khoảng cách ngắn.
|
||||
|
||||
items.weapon.missiles.darts.healingdart.name=phi tiêu hồi phục
|
||||
items.weapon.missiles.darts.healingdart.desc=Những chiếc phi tiêu này được tẩm một hợp chất dựa trên cỏ mặt trời giúp hồi phục mục tiêu của chúng. Bản thân phi tiêu vẫn có hại với kẻ địch, nhưng sẽ không làm hại đồng minh.
|
||||
|
||||
@@ -74,8 +74,8 @@ items.armor.glyphs.viscosity.desc=這種刻印可以儲存對穿戴者造成的
|
||||
###armor
|
||||
items.armor.armor.ac_detach=拆卸
|
||||
items.armor.armor.detach_seal=你將紋章從護甲上摘了下來。
|
||||
items.armor.armor.equip_cursed=這件護甲生疼地勒住了你。
|
||||
items.armor.armor.identify=你對你的護甲已經足夠熟悉並且可以因此將其完全鑑定。
|
||||
items.armor.armor.equip_cursed=這件護甲緊緊地勒住了你,令你疼痛。
|
||||
items.armor.armor.identify=你對身上的護甲了解充分,已完全鑑定其屬性。
|
||||
items.armor.armor.hardening_gone=你護甲上的硬化效果被損耗掉了!
|
||||
items.armor.armor.incompatible=不同種類的魔法互相衝突,消除了護甲上的刻印!
|
||||
items.armor.armor.curr_absorb=這件_%1$d階_護甲能抵擋_%2$d~%3$d點傷害_並且需要_%4$d點力量_來正常使用。
|
||||
@@ -200,7 +200,7 @@ items.artifacts.cloakofshadows.ac_stealth=潛行
|
||||
items.artifacts.cloakofshadows.cooldown=你的斗篷還需要%d回合來重新激活。
|
||||
items.artifacts.cloakofshadows.cursed=詛咒封鎖了斗篷的魔力。
|
||||
items.artifacts.cloakofshadows.no_charge=你的斗篷充能不足無法使用。
|
||||
items.artifacts.cloakofshadows.desc=這是盜賊多年前從皇家軍械庫竊取的一件無價的魔法斗篷。披上時,能夠使你在短時間內完全隱身。\n\n斗篷越用越強大,能使盜賊更頻繁的隱身,持續時間也更長。
|
||||
items.artifacts.cloakofshadows.desc=這件無價的魔法斗篷原屬皇家軍械庫,是盜賊多年前親手偷來的贓物。披上時,能夠使盜賊在短時間內完全隱身。\n\n斗篷越用越強大,能使盜賊更頻繁的隱身,持續時間也更長。
|
||||
items.artifacts.cloakofshadows.discover_hint=此物品是某位英雄的初始裝備。
|
||||
items.artifacts.cloakofshadows$cloakstealth.no_charge=你的斗篷耗盡了能量。
|
||||
items.artifacts.cloakofshadows$cloakstealth.levelup=你的斗篷變得更強大了!
|
||||
@@ -368,7 +368,7 @@ items.artifacts.hornofplenty.reject=你的號角並不接受未經烹煮的無
|
||||
items.artifacts.hornofplenty.maxlevel=你的號角吞噬了食物,並充滿了豐饒之力!
|
||||
items.artifacts.hornofplenty.levelup=號角吞噬了你提供的食物,變得更加強大了。
|
||||
items.artifacts.hornofplenty.feed=號角吞噬了你提供的食物。
|
||||
items.artifacts.hornofplenty.desc=這個號角不能被用來吹奏,不過裝備時它似乎會隨經驗獲取逐漸填充食物。你可以從裡面拿一小份吃掉,或者直接吃到飽。
|
||||
items.artifacts.hornofplenty.desc=這隻號角吹不出聲音,裝備在身上時,卻似乎能隨經驗值增長,於腔內生成食物。你可以從裡面拿一小份吃掉,或者直接吃到飽。
|
||||
items.artifacts.hornofplenty.desc_hint=也許可以通過給予它食物的能量來增加號角的力量。
|
||||
items.artifacts.hornofplenty.desc_cursed=被詛咒的號角把自己綁在了你的身邊,它似乎在渴望得到食物而不是製造食物。
|
||||
|
||||
@@ -729,7 +729,7 @@ items.potions.potionofexperience.name=經驗藥劑
|
||||
items.potions.potionofexperience.desc=多場戰鬥積累而來的經驗被濃縮為液態,這種藥劑能夠瞬間提升你的等級。
|
||||
|
||||
items.potions.potionoffrost.name=冰霜藥劑
|
||||
items.potions.potionoffrost.desc=一旦暴露在空氣里,這種化學藥劑會揮發成為一片寒氣。
|
||||
items.potions.potionoffrost.desc=一旦暴露在空氣裡,這種化學藥劑會揮發成為一片寒氣。
|
||||
|
||||
items.potions.potionofhaste.name=極速藥劑
|
||||
items.potions.potionofhaste.energetic=你感到精力充沛!
|
||||
@@ -805,7 +805,7 @@ items.potions.elixirs.elixirofaquaticrejuvenation$aquahealing.name=水靈治療
|
||||
items.potions.elixirs.elixirofaquaticrejuvenation$aquahealing.desc=你暫時獲得了如同黏咕一樣的恢復能力。 \n\n當站在水面上時,你每回合都能夠回復少量生命值。 生命值全滿或離開水面時會暫停該效果。\n\n水靈恢復持續時長:%d。
|
||||
|
||||
items.potions.elixirs.elixirofdragonsblood.name=龍血秘藥
|
||||
items.potions.elixirs.elixirofdragonsblood.desc=飲用後,這種秘藥會使飲用者的血管里充斥著烈焰的力量。 這種效果能讓引用者對火焰完全免疫,並且還能通過物理攻擊點燃敵人。
|
||||
items.potions.elixirs.elixirofdragonsblood.desc=飲用後,這種秘藥會使飲用者的血管裡充斥著烈焰的力量。 這種效果能讓引用者對火焰完全免疫,並且還能通過物理攻擊點燃敵人。
|
||||
|
||||
items.potions.elixirs.elixiroffeatherfall.name=羽落秘藥
|
||||
items.potions.elixirs.elixiroffeatherfall.light=你覺得自己身輕如燕!
|
||||
@@ -886,7 +886,7 @@ items.potions.exotic.potionofshroudingfog.name=暗夜迷霧合劑
|
||||
items.potions.exotic.potionofshroudingfog.desc=瓶中的合劑遇到空氣就會快速釋放出能完全阻擋敵人可視範圍的濃濃煙霧。
|
||||
|
||||
items.potions.exotic.potionofsnapfreeze.name=極速冰凍合劑
|
||||
items.potions.exotic.potionofsnapfreeze.desc=一旦暴露在空氣里,這種化學混合物會瞬間凍結並束縛住範圍內一切物件。
|
||||
items.potions.exotic.potionofsnapfreeze.desc=一旦暴露在空氣裡,這種化學混合物會瞬間凍結並束縛住範圍內一切物件。
|
||||
|
||||
items.potions.exotic.potionofstamina.name=精力回復合劑
|
||||
items.potions.exotic.potionofstamina.desc=喝這種奇怪的甜液體將給你帶來巨大的能量提升,讓你以更快的速度運行很長一段時間。
|
||||
@@ -916,7 +916,7 @@ items.quest.dwarftoken.desc=很多矮人和他們的造物都攜帶著這種小
|
||||
items.quest.dwarftoken.discover_hint=此物品會在某任務中出現。
|
||||
|
||||
items.quest.embers.name=元素餘燼
|
||||
items.quest.embers.desc=只能從新生火元素身上採集到的特殊餘燼.。它們散發著溫暖的能量。
|
||||
items.quest.embers.desc=只能從新生火元素身上採集到的特殊餘燼。它們散發著溫暖的能量。
|
||||
items.quest.embers.discover_hint=此物品會在某任務中出現。
|
||||
|
||||
items.quest.gooblob.name=蝕黑黏液
|
||||
@@ -979,7 +979,7 @@ items.rings.ring.agate=瑪瑙戒指
|
||||
items.rings.ring.equip_cursed=這枚戒指緊緊箍住了你的手指!
|
||||
items.rings.ring.unknown_desc=這枚金屬環鑲嵌著一顆在黑暗中閃爍光芒的大塊寶石。誰知道戴上後會有什麼效果?
|
||||
items.rings.ring.known=這是個%s。
|
||||
items.rings.ring.identify=你對手中的戒指已經足夠熟悉並將其完全鑑定。
|
||||
items.rings.ring.identify=你對手中的戒指了解充分,已完全鑑定其屬性。
|
||||
items.rings.ring.cursed_worn=由於這枚戒指被詛咒,你無力將其取下。
|
||||
items.rings.ring.curse_known=你能感覺到這枚戒指裡潛伏著一股充滿惡意的魔力。
|
||||
items.rings.ring.not_cursed=這枚戒指沒有被詛咒。
|
||||
@@ -1234,7 +1234,7 @@ items.scrolls.exotic.scrollofpassage.name=歸返秘卷
|
||||
items.scrolls.exotic.scrollofpassage.desc=卷軸上的法術會閱讀者回到所在區域的第一層入口。很適合用以快速抵達商店。
|
||||
|
||||
items.scrolls.exotic.scrollofprismaticimage.name=幻衛秘卷
|
||||
items.scrolls.exotic.scrollofprismaticimage.desc=這種秘卷上的咒文會創造閱讀者的一個幻影。 這個像使用者的弱化版克隆體的幻影有著相同的防禦,但生命值和造成的傷害更低。\n\n幻影將吸引敵人的火力從而保護閱讀者。\n\n當幻影存在時閱讀這張秘卷將會為其恢復所有生命。
|
||||
items.scrolls.exotic.scrollofprismaticimage.desc=這種秘卷上的咒文會創造閱讀者的一個幻影。 這個像使用者的弱化版複製體的幻影有著相同的防禦,但生命值和造成的傷害更低。\n\n幻影將吸引敵人的火力從而保護閱讀者。\n\n當幻影存在時閱讀這張秘卷將會為其恢復所有生命。
|
||||
|
||||
items.scrolls.exotic.scrollofpsionicblast.name=靈能震爆秘卷
|
||||
items.scrolls.exotic.scrollofpsionicblast.ondeath=靈能震爆撕碎了你的意識……
|
||||
@@ -1265,7 +1265,7 @@ items.spells.beaconofreturning.desc=這種複雜的晶住給予了使用者無
|
||||
|
||||
items.spells.curseinfusion.name=強力詛咒菱晶
|
||||
items.spells.curseinfusion.inv_title=詛咒一件物品
|
||||
items.spells.curseinfusion.desc=這種菱晶會為裝備賦予和在DM-300內找到的邪惡能量一樣的魔法。對任一裝備使用時,該物品將會被詛咒,且將失去其原本的附加魔法特性。\n\n對武器、護甲及法杖使用時,它們會在被詛咒的同時獲得升級。升級效果不會多次疊加,且會在詛咒被解除時消失。\n\n也可以對已詛咒的武器或護甲使用來變更上面的詛咒效果。
|
||||
items.spells.curseinfusion.desc=這種菱晶會為裝備賦予和在DM-300內找到的邪惡能量一樣的魔法。對任一裝備使用時,該物品將會被詛咒,且將失去其原本的附加魔法特性。\n\n對武器、護甲及法杖使用時,它們會在被詛咒的同時獲得升級,但升級效果不會多次疊加。詛咒帶來的負面效果解除時,此種升級效果也隨之消散。\n\n也可以對已詛咒的武器或護甲使用來變更上面的詛咒效果。
|
||||
|
||||
items.spells.spell.ac_cast=施放
|
||||
items.spells.spell.no_magic=你無法在魔法免疫的情況下使用法術結晶。
|
||||
@@ -1431,7 +1431,7 @@ items.trinkets.mossyclump.typical_stats_desc=通常此飾品會使非特殊樓
|
||||
items.trinkets.mossyclump.stats_desc=以目前的等級,此飾品會使非特殊樓層有_%d%%_的機率變成繁茂或者含水樓層。\n\n此飾品升級時所需的能量較多。
|
||||
|
||||
items.trinkets.parchmentscrap.name=咒術殘頁
|
||||
items.trinkets.parchmentscrap.desc=這張小羊皮紙似乎是一張卷軸的一部份。它還保留了一部份的魔力,且似乎正在影響這座地下城中找到的武器及護甲。
|
||||
items.trinkets.parchmentscrap.desc=這張小羊皮紙似乎是某張卷軸的一部份。它還保留了一部份的魔力,且似乎正在影響這座地下城中找到的武器及護甲。
|
||||
items.trinkets.parchmentscrap.typical_stats_desc=通常此飾品會使附魔及刻印的出現率提高_%d倍_,且增加_%s倍_詛咒的出現率。魔杖、戒指及神器不會受到影響。\n\n此飾品升級時所需的能量較多。
|
||||
items.trinkets.parchmentscrap.stats_desc=以目前的等級,此飾品會使附魔及刻印的出現率提高_%d倍_,且增加_%s倍_詛咒的出現率。魔杖、戒指及神器不會受到影響。\n\n此飾品升級時所需的能量較多。
|
||||
|
||||
@@ -1451,9 +1451,9 @@ items.trinkets.saltcube.typical_stats_desc=在非頭目戰的情況下,通常
|
||||
items.trinkets.saltcube.stats_desc=在非頭目戰的情況下,以目前的等級,此飾品會使你的飢餓消耗延緩_%1$s%%_,但也使自然回血的頻率降低_%2$s%%_。
|
||||
|
||||
items.trinkets.shardofoblivion.name=遺忘碎片
|
||||
items.trinkets.shardofoblivion.desc=在煉金釜的作用下,這塊小小的詛咒鐵片變成了……呃……虛空?光線在它的周圍被扭曲,在沒被外力作用下會懸停在原處。碎片似乎神奇地從你的無知中汲取力量,所以還是最好別對此想太多。
|
||||
items.trinkets.shardofoblivion.typical_stats_desc=通常此飾品會根據你正在裝備或近期使用的每一件未鑑定裝備以增加敵人掉落它們的所有物的機率提升20%%,最多計算_%d件_。這個飾品也會阻止你以任何方式鑑定裝備,使你只能透過碎片來得知符合鑑定條件裝備的屬性。
|
||||
items.trinkets.shardofoblivion.stats_desc=以目前的等級,此飾品會根據你正在裝備或近期使用的每一件未鑑定裝備以增加敵人掉落它們的所有物的機率提升20%%,最多計算_%d件_。這個飾品也會阻止你以任何方式鑑定裝備,使你只能透過碎片來得知符合鑑定條件裝備的屬性。
|
||||
items.trinkets.shardofoblivion.desc=在煉金釜的作用下,這塊小小的詛咒鐵片變成了……呃……虛空?光線在它的周圍會被扭曲,在沒被外力作用下會懸停在原處。碎片似乎神奇地從你的無知中汲取力量,所以還是最好別對此想太多。
|
||||
items.trinkets.shardofoblivion.typical_stats_desc=通常此飾品會根據你正在裝備或近期使用的每一件未完全鑑定裝備以增加敵人掉落它們的所有物的機率提升20%%,最多計算_%d件_。這個飾品也會阻止你以任何方式鑑定裝備,使你只能透過碎片來得知符合鑑定條件裝備的屬性。
|
||||
items.trinkets.shardofoblivion.stats_desc=以目前的等級,此飾品會根據你正在裝備或近期使用的每一件未完全鑑定裝備以增加敵人掉落它們的所有物的機率提升20%%,最多計算_%d件_。這個飾品也會阻止你以任何方式鑑定裝備,使你只能透過碎片來得知符合鑑定條件裝備的屬性。
|
||||
items.trinkets.shardofoblivion.ac_identify=鑑定
|
||||
items.trinkets.shardofoblivion.identify_prompt=鑑定一件物品
|
||||
items.trinkets.shardofoblivion.identify_ready=已符合鑒定條件的物品:%s。請使用遺忘碎片以將此裝備變為已鑑定狀態。
|
||||
@@ -1519,7 +1519,7 @@ items.wands.wand.ac_zap=釋放
|
||||
items.wands.wand.fizzles=你的法杖滋滋作響;一定是沒能量了。
|
||||
items.wands.wand.no_magic=你的法杖滋滋作響;你不能在魔法免疫時使用法杖。
|
||||
items.wands.wand.self_target=你不能瞄準你自己!
|
||||
items.wands.wand.identify=你對你的法杖已經足夠熟悉並將其完全鑒定。
|
||||
items.wands.wand.identify=你對你的法杖了解充分,已完全鑑定其屬性。
|
||||
items.wands.wand.resin_one=這根法杖已透過奧術樹脂升級了_1級_。
|
||||
items.wands.wand.resin_many=這根法杖已透過奧術樹脂升級了_%d級_。
|
||||
items.wands.wand.cursed=這根法杖受到了詛咒,導致它的魔法混亂而隨機。
|
||||
@@ -2239,7 +2239,7 @@ items.weapon.spiritbow.stats=這把弓不能直接升級,但是會隨著你等
|
||||
items.weapon.spiritbow.desc=一把由遠古靈木製成的弓,弓弦和弓身的刻紋散發著蒼藍色的幽光。 拉開弓弦時,一發魔法箭矢會生成在弓身一側向目標飛去。
|
||||
items.weapon.spiritbow.discover_hint=此物品是某位英雄的初始裝備。
|
||||
|
||||
items.weapon.weapon.identify=你對手中的武器已經足夠熟悉並將其完全鑑定。
|
||||
items.weapon.weapon.identify=你對手上的武器了解充分,已完全鑑定其屬性。
|
||||
items.weapon.weapon.too_heavy=因為你的力量不足,該武器會降低你的攻速和準度,並讓你無法偷襲。
|
||||
items.weapon.weapon.excess_str=你的額外力量讓你在使用這件武器時能夠造成_0~%d點額外傷害_。
|
||||
items.weapon.weapon.hardening_gone=你武器上的硬化效果被損耗掉了!
|
||||
|
||||
@@ -43,7 +43,7 @@ journal.document.adventurers_guide.surprise_attacks.body=Ani ti nejobratnější
|
||||
journal.document.adventurers_guide.identifying.title=Identifikace předmětů
|
||||
journal.document.adventurers_guide.identifying.body=Barvy lektvarů a symboly na svitcích jsou jiné v každém podzemí. Neidentifikované vybavení může být vylepšené nebo okouzlené, pokud máš štěstí, ale může být také prokleté!\n\nSvitky identifikace, vylepšení a odstranění prokletí jsou velmi užitečné, pokud chceš snížit riziko používání neidentifikovaného vybavení.\n\n(Seznam všech identifikovaných předmětů můžeeš najít v záložce předmětů ve své příručce)
|
||||
journal.document.adventurers_guide.food.title=Řešení hladu
|
||||
journal.document.adventurers_guide.food.body=Efektivní dávkování jídla je jednen z nejlepších způsobů, jak zlepšit své šance na přežití. Zkus brát zdraví a hlad jako zdroje, které je nutné spravovat, ne udržovat vždy plné.\n\nPokud neumíráš hlady, budeš si pomalu regenerovat zdraví. Pokud se najíš na plném zdraví, přijde tato regenerace nazmar.\n\nPokud budeš své jídlo rozvrhovat podle toho, jak jsi na tom se zdravím, měly by ti zásoby vydržet mnohem déle.
|
||||
journal.document.adventurers_guide.food.body=Efektivní dávkování jídla je jeden z nejlepších způsobů, jak zlepšit své šance na přežití. Zkus brát zdraví a hlad jako zdroje, které je nutné spravovat, ne udržovat vždy plné.\n\nPokud neumíráš hlady, budeš si pomalu regenerovat zdraví. Pokud se najíš na plném zdraví, přijde tato regenerace nazmar.\n\nPokud budeš své jídlo rozvrhovat podle toho, jak jsi na tom se zdravím, měly by ti zásoby vydržet mnohem déle.
|
||||
journal.document.adventurers_guide.alchemy.title=Alchymie a Doplňky
|
||||
journal.document.adventurers_guide.alchemy.body=Pokud neshledáš některý jednorázový předmět užitečným, můžeš jej použít jako surovinu v alchymickém kotlíku! Předměty lze použít v několika konkrétních receptech, nebo je lze rozložit na všestrannou alchymickou energii. Rozložení lektvarů nebo svitků na energii je navíc také identifikuje!\n\nDoplňky jsou jedinou součástí vybavení, kterou lze vyrobit prostřednictvím alchymie. Mohou poskytnout řadu různých užitečných efektů a lze je vyrobit z hrstky alchymické energie a magického katalyzátoru. Doplňky lze vylepšit dodáním více alchymické energie, čímž se jejich účinek zesílí.\n\n(První alchymický kotlík lze najít v 3. nebo 4. patře kobky. Poblíž kotlíků můžeš také najít stránky alchymické příručky.)
|
||||
journal.document.adventurers_guide.dieing.title=Zvládání porážky
|
||||
@@ -65,7 +65,7 @@ journal.document.adventurers_guide.magic.body=Magické útoky probíjejí zbroj
|
||||
|
||||
journal.document.alchemy_guide.title=Příručka alchymie
|
||||
journal.document.alchemy_guide.potions.title=Úvod a Lektvary
|
||||
journal.document.alchemy_guide.potions.body=Vítejte u Praktických Aplikací Alchymie! Tato kniha obsahuje recepty a návody, jak vyrábět předměty v alchymickém kotlíku.\n\nZačneme tím nejikoničtějším receptem alchymie: Lektvary!\n\nVlož do kotlíku tři semínka pro uvaření lektvaru. Každé semínko má svůj odpovídající lektvar, a uvařený lektvar může být ovlivněn některým z vložených semínek. Použití více semínek stejného druhu tuto šanci zvyšuje.
|
||||
journal.document.alchemy_guide.potions.body=Vítejte u Praktických Aplikací Alchymie! Tato kniha obsahuje recepty a návody, jak vyrábět předměty v alchymickém kotlíku.\n\nZačneme tím nejikoničtějším receptem alchymie: Lektvary!\n\nVlož do kotlíku tři semínka pro uvaření lektvaru. Každé semínko má svůj odpovídající lektvar a uvařený lektvar může být ovlivněn některým z vložených semínek. Použití více semínek stejného druhu tuto šanci zvyšuje.
|
||||
journal.document.alchemy_guide.stones.title=Tvorba runových kamenů
|
||||
journal.document.alchemy_guide.stones.body=Vhození svitku do alchymického kotlíku rozloží jeho magii do dvou kamenů v kotli. Tím vzniknou runové kameny a svitek se identifikuje!
|
||||
journal.document.alchemy_guide.energy_food.title=Energie a jídlo
|
||||
@@ -77,7 +77,7 @@ journal.document.alchemy_guide.exotic_scrolls.body=Vzácné svitky lze připrzav
|
||||
journal.document.alchemy_guide.bombs.title=Vylepšené bomby
|
||||
journal.document.alchemy_guide.bombs.body=Obyčejná černá prachová bomba může být smíchána s konkrétním předmětem pro vytvoření vylepšené bomby.
|
||||
journal.document.alchemy_guide.weapons.title=Posilování zbraní
|
||||
journal.document.alchemy_guide.weapons.body=Některé lehčí nebo kouzelné zbraně mohou být v alchymii užitečné!\n\nKaždou vrhací zbraň lze rozložit na takové množství tekutého kovu, které by opravilo jinou zbraň stejného stupně a úrovně. Rozložení sady vrhacích zbraní zničí celou sadu, dokonce i když není celá přítomná.\n\nHůlka může být rozčarována na toolik kouzelné pryskyřice, aby bylo možné s ní vylepšit dvě hůlky stejné úrovně, ovšem do maximální úrovně +3.
|
||||
journal.document.alchemy_guide.weapons.body=Některé lehčí nebo kouzelné zbraně mohou být v alchymii užitečné!\n\nKaždou vrhací zbraň lze rozložit na takové množství tekutého kovu, které by opravilo jinou zbraň stejného stupně a úrovně. Rozložení sady vrhacích zbraní zničí celou sadu, dokonce i když není celá přítomná.\n\nHůlka může být rozčarována na tolik kouzelné pryskyřice, aby bylo možné s ní vylepšit dvě hůlky stejné úrovně, ovšem do maximální úrovně +3.
|
||||
journal.document.alchemy_guide.brews_elixirs.title=Směsi a elixíry
|
||||
journal.document.alchemy_guide.brews_elixirs.body=Směsi a elixíry jsou pokročilé lektvary, které poskytují variantu různých efektů a lze je obvykle použít jen jednou.
|
||||
journal.document.alchemy_guide.spells.title=Kouzla
|
||||
@@ -125,7 +125,7 @@ journal.document.prison_warden.mines.body=53. zima, 363\n\nDnes dorazila skupina
|
||||
journal.document.prison_warden.rotberry.title=Rostlina hnilůvka
|
||||
journal.document.prison_warden.rotberry.body=23. podzim, 363\n\nDnes jsem dostala milý dárek od Felixe. Je to malý červený keřík, prý se mu říká 'Hnilůvka'.\n\nZmiňovala jsem se mu, jak je to tu ponuré, a vypadá to, že mě poslouchal. Zmiňoval, že tahle rostlina ve skutečnosti nesnáší světlo a vodu, takže prý stačí zhruba jednou měsíčně zastřihávat listy. To stříhání ale asi bude důležité, zmiňoval to ve svém dopise hned několikrát.\n\nSamozřejmě, že Felix nikdy nic nedělá zadarmo. Tvrdil, že semínka téhle věci jsou úžasné k výrobě hůlek, takže mu jich pár dlužím, až vyrostou.\n- Smithová
|
||||
journal.document.prison_warden.no_support.title=Bez podpory
|
||||
journal.document.prison_warden.no_support.body=11. jaro, 364\n\nCo si sakra město myslí? Po urgentní žádosti o pomoc jsem nedostala nic, ani prázdný dopis s omluvou jako obvykle, když mi zamítnou žádost.\n\nMezitím to tu s chovanci vypadá stále hůř, a i někteří ze strážných začali dělat potíže. To budou prostě čekat, než se zto zhorší natolik, že tady budeme mít vzpouru!?\n\nAlespoň Thomas je zatím spolehlivý jako vždy. Jeho pomoc s organizací je neuvěřitelná, a jeho nápad uvést do provozu staré DM-100 je sice politováníhodný, ale nezbytný. Věřím, že tuhle situaci nakonec zvládneme, jen potřebuju nějakou podporu, zatraceně!\n- Smithová
|
||||
journal.document.prison_warden.no_support.body=11. jaro, 364\n\nCo si sakra město myslí? Po urgentní žádosti o pomoc jsem nedostala nic, ani prázdný dopis s omluvou jako obvykle, když mi zamítnou žádost.\n\nMezitím to tu s chovanci vypadá stále hůř, a i někteří ze strážných začali dělat potíže. To budou prostě čekat, než se to zhorší natolik, že tady budeme mít vzpouru!?\n\nAlespoň Thomas je zatím spolehlivý jako vždy. Jeho pomoc s organizací je neuvěřitelná, a jeho nápad uvést do provozu staré DM-100 je sice politováníhodný, ale nezbytný. Věřím, že tuhle situaci nakonec zvládneme, jen potřebuju nějakou podporu, zatraceně!\n- Smithová
|
||||
journal.document.prison_warden.letter.title=Dopis Thomasovi
|
||||
journal.document.prison_warden.letter.body=Thomasi,\n\njsi můj dobrý přítel, takže ti udělám laskavost.\n\nAž dnes začneš svoji směnu, zamkni a zabezpeč Tenguovu celu, klíč schovej do nějakého výklenku a uteč. Nezáleží, jestli budou ostatní vězni bez dozoru, brzy se odtud stejně nikdo nedostane. Ten magor ale musí zůstat pod zámkem, kdyby utekl, nikdo neví, co by mohl udělat.\n\nNikomu to neříkej a nechoď mě prosím hledat. Kapitán opouští loď poslední.\n-Kiana
|
||||
|
||||
@@ -142,31 +142,31 @@ journal.document.caves_explorer.city.body=21. léto, 308\n\nDneškem jsou to pr
|
||||
journal.document.caves_explorer.alive.title=Je to živé!
|
||||
journal.document.caves_explorer.alive.body=23. léto, 308\n\nJeden z trpasličích strojů se nějakým způsobem dal do pohybu! Jen jsme procházeli kolem, když se zničehonic nabil a málem rozdrtil dva členy skupiny svými velkými ocelovými pěstmi. Naštěstí jsem s sebou měl svou hůlku ničivých paprsků, stačilo pár dobře mířených ran a z té mašiny byla hromada šrotu.\n\nTo, co mě tíží, je fakt, že jsme neudělali nic, čím bychom ten stroj mohli vyprovokovat. Pochybuji, že by trpaslíci navrhli stroje takto agresivní, bylo to spíš, jako by nás ten stroj sám snažil přepadnout!\n\nAlespoň jsem svým společníkům mohl být projednou užitečný.\n- Archibald
|
||||
journal.document.caves_explorer.report.title=Konečné hlášení
|
||||
journal.document.caves_explorer.report.body=28. léto, 308\n\nDnes dokončíme balení věcí a připravíme se k odchodu. Je to právě včas, několik členů expedice začalo mít děsivé noční můry po incidentu s agresivním strojem. Je to pravděpodobně únavou, ovšem jejich noční můry se zdají být podezřele podobné.\n\nSouhrně se dá prohlásit, že vrchní patra dolu jsou relativně bezpečná. Pokud bude někdy objeven způsob využití temného zlata, mohla by jeho těžba být výnosná. Velké otevřené prostory jsou vhodné pro městské konstrukční plány. Nižší patra dolu jsou nebezpečná a doporučuji se jim vyhnout.\n\nVšechno shrnu ve svém konečném hlášení během pár následujících dní.\n- Archibald
|
||||
journal.document.caves_explorer.report.body=28. léto, 308\n\nDnes dokončíme balení věcí a připravíme se k odchodu. Je to právě včas. Několik členů expedice začalo mít děsivé noční můry po incidentu s agresivním strojem. Je to pravděpodobně únavou, ovšem jejich noční můry se zdají být podezřele podobné.\n\nSouhrně se dá prohlásit, že vrchní patra dolu jsou relativně bezpečná. Pokud bude někdy objeven způsob využití temného zlata, mohla by jeho těžba být výnosná. Velké otevřené prostory jsou vhodné pro městské konstrukční plány. Nižší patra dolu jsou nebezpečná a doporučuji se jim vyhnout.\n\nVšechno shrnu ve svém konečném hlášení během pár následujících dní.\n- Archibald
|
||||
|
||||
journal.document.city_warlock.title=Čarodějův deník
|
||||
journal.document.city_warlock.discover_hint=Tento text můžeš najít ve specifické oblasti, ale až po nalezení všech předchozích textů v této sadě.
|
||||
journal.document.city_warlock.old_king.title=Král je mrtev
|
||||
journal.document.city_warlock.old_king.body=Píše se 5. den 2. měsíce 33. roku věku magie. Pokud tento záznak čte někdo zvenku, je nejspíš něco kolem zimy 264. Mé jméno je Thymor Zahir a podle všech informací jsem poslední žijící člen trpasličího dvora.\n\nNáš král zemřel a nahradil ho jeden z mých kolegů, který zešílel svou mocí. Zbylí dvořané se mu podrobili, čímž ti hlupáci ztratili svou svobodnou vůli. Já jediný jsem to předvídal a utekl jsem, než byl rituál dokončen.\n\nVnitřní kruh sice padl, ale síla Nového Krále se stále nedostala ke každému. Musím vybudovat odpor jak rychle to jen půjde. Odmítám nechat naši přeslavnou civilizaci padnout do spárů toho šíleného megalomaniaka!
|
||||
journal.document.city_warlock.old_king.body=Píše se 5. den 2. měsíce 33. roku věku magie. Pokud tento záznak čte někdo zvenku, je nejspíš něco kolem zimy 264. Mé jméno je Thymor Zahir a podle všech informací jsem poslední žijící člen trpasličího dvora.\n\nNáš Král zemřel a nahradil ho jeden z mých kolegů, který zešílel svou mocí. Zbylí dvořané se mu podrobili, čímž ti hlupáci ztratili svou svobodnou vůli. Já jediný jsem to předvídal a utekl jsem, než byl rituál dokončen.\n\nVnitřní kruh sice padl, ale síla Nového Krále se stále nedostala ke každému. Musím vybudovat odpor jak rychle to jen půjde. Odmítám nechat naši přeslavnou civilizaci padnout do spárů toho šíleného megalomaniaka!
|
||||
journal.document.city_warlock.resistance.title=Odpor
|
||||
journal.document.city_warlock.resistance.body=Novinky se šíří rychle. Uplynule jen pár dní a už se mi podařilo vybudovat malu armádu trpaslíků věrných Starému Králi. Málo z nich má zkušenosti s magií, ale téměř celý řád bojových mnichů je na naší straně. Naše síly by měly být víc než vyrovnané jednomu šílenci a jeho dvoru plnému otroků.\n\nNový král se mezití schoval do vnitřních komnat našeho města. Nemám pochybnosti o tom, že už vynaložil většinu své moci a doufá, že se bude moct zotavit, než narazí na další odpor.\n\nBěhem pár hodin zaútočíme. S trochou štěstí dokážeme sestavit prozatímní koncil a navrátit našemu městu jeho stabilitu než skončí noc.
|
||||
journal.document.city_warlock.resistance.body=Novinky se šíří rychle. Uplynulo jen pár dní a už se mi podařilo vybudovat malou armádu trpaslíků věrných Starému Králi. Málo z nich má zkušenosti s magií, ale téměř celý řád bojových mnichů je na naší straně. Naše síly by měly být víc než vyrovnané jednomu šílenci a jeho dvoru plnému otroků.\n\nNový Král se mezitím schoval do vnitřních komnat našeho města. Nemám pochybnosti o tom, že už vynaložil většinu své moci a doufá, že se bude moct zotavit, než narazí na další odpor.\n\nBěhem pár hodin zaútočíme. S trochou štěstí dokážeme sestavit prozatímní koncil a navrátit našemu městu jeho stabilitu než skončí noc.
|
||||
journal.document.city_warlock.failure.title=Selhání
|
||||
journal.document.city_warlock.failure.body=Zdá se, že to já jsem hlupák. Myslel jsem, že bude Nový Král potřebovat, aby se mu dvořané rozhodli zavázat z vlastní vůle, ale teď již vidím, že si dokáže podrobit i ty, kteří mu vzdorují.\n\nSlepě jsem navedl naše největší síly přímo před jeho brány, jen aby z nich mohl osobně udělat své otroky. Nyní vlny jeho nekrotické síly proplouvají naším městem a většinu ostatních okamžitě mění v jeho služebníky.\n\nNěkolik málo, kterým zbyla svobodná vůle, prchá z města. Já jsem se rozhodl zůstat a hledat nějakou skulinku. Se svou magickou mocí bych měl dokázat zůstat skrytý a v bezpečí na nějakou dobu.
|
||||
journal.document.city_warlock.more_powerful.title=Mocnější
|
||||
journal.document.city_warlock.more_powerful.body=Držet pojetí o čase je těžší a těžší, ale od mého posledního zápisu uplynul zhruba týden. Naše civilizace padla. Brány jsou zavřeny, všechny funkce naší společnosti pohasly a prázdné schránky trpaslíků bloudí našimi síněmi.\n\nBěhem toho všeho získal nový král nějakým způsobem ještě větší moc. Síla jeho vůle každým dnem roste, ale také se mění. Neumím to popsat, ale připadá mi to, jako kdyby to už vůbec nebyl trpaslík.\n\nZačínám přijímat, že nejlepší, v co mohu doufat, je zdokumentovat tyto události. Zůstanu tu, jak dlouho to jen půjde, a až má vůle začne slábnout, vzdám se.
|
||||
journal.document.city_warlock.more_powerful.body=Držet pojetí o čase je těžší a těžší, ale od mého posledního zápisu uplynul zhruba týden. Naše civilizace padla. Brány jsou zavřeny, všechny funkce naší společnosti pohasly a prázdné schránky trpaslíků bloudí našimi síněmi.\n\nBěhem toho všeho získal Nový Král nějakým způsobem ještě větší moc. Síla jeho vůle každým dnem roste, ale také se mění. Neumím to popsat, ale připadá mi to, jako kdyby to už vůbec nebyl trpaslík.\n\nZačínám přijímat, že nejlepší, v co mohu doufat, je zdokumentovat tyto události. Zůstanu tu, jak dlouho to jen půjde, a až má vůle začne slábnout, vzdám se.
|
||||
journal.document.city_warlock.new_power.title=Nová síla
|
||||
journal.document.city_warlock.new_power.body=Co se tu děje? Síla, kterou vyzařuje nový král je opravdu jiná, než zpočátku, ale je tu ještě něco jiného. Tato nová moc zřejmě vyzařuje z vnitřních síní našeho města.\n\nJeště záhadnější je to, že aktivita ve svrchních patrech metropole se také zklidnila. Netuším, co se tam dole děje, ale zdá se, že tomu nový král věnuje veškerou svou pozornost.\n\nNávrat do vnitřních síní bude nebezpečný, ale musím zjistit, co tuhle změnu vyvolalo. Možná, že Nový Král přeci jenom má slabinu?
|
||||
journal.document.city_warlock.new_power.body=Co se tu děje? Síla, kterou vyzařuje nový král je opravdu jiná, než zpočátku, ale je tu ještě něco jiného. Tato nová moc zřejmě vyzařuje z vnitřních síní našeho města.\n\nJeště záhadnější je to, že aktivita ve svrchních patrech metropole se také zklidnila. Netuším, co se tam dole děje, ale zdá se, že tomu Nový Král věnuje veškerou svou pozornost.\n\nNávrat do vnitřních síní bude nebezpečný, ale musím zjistit, co tuhle změnu vyvolalo. Možná, že Nový Král přeci jenom má slabinu?
|
||||
journal.document.city_warlock.seen_it.title=Viděl jsem to
|
||||
journal.document.city_warlock.seen_it.body=Viděl jsem, co je tam dole, ale nedokážu to popsat. Moje ruce se neovladatelně třesou, když se snažím své myšlenky vyjádřit písmem.\n\nProč se tohle děje? Způsobil to nový král? Nedává to smysl. Možná to přilákalo jeho svévolné používání magické moci? Doufal jsem, že zachráním naši civilizaci, ale teď je zřejmé, že v sázce je osud celého světa.\n\nNajednou je král menší zlo. Nemám na vybranou, v zájmu vyššího dobra se vzdám. Prosím, veď mě, můj králi, použij mě jako nástroj k zastavení Yog-Dzewy!
|
||||
journal.document.city_warlock.seen_it.body=Viděl jsem, co je tam dole, ale nedokážu to popsat. Moje ruce se neovladatelně třesou, když se snažím své myšlenky vyjádřit písmem.\n\nProč se tohle děje? Způsobil to Nový Král? Nedává to smysl. Možná to přilákalo jeho svévolné používání magické moci? Doufal jsem, že zachráním naši civilizaci, ale teď je zřejmé, že v sázce je osud celého světa.\n\nNajednou je král menší zlo. Nemám na vybranou, v zájmu vyššího dobra se vzdám. Prosím, veď mě, můj králi, použij mě jako nástroj k zastavení Yog-Dzewy!
|
||||
|
||||
journal.document.halls_king.title=??? deník
|
||||
journal.document.halls_king.discover_hint=Tento text můžeš najít ve specifické oblasti, ale až po nalezení všech předchozích textů v této sadě.
|
||||
journal.document.halls_king.rejection.title=Odmítnutí
|
||||
journal.document.halls_king.rejection.body=IMBECILOVÉ!\n\nPo 33 let naše království vzkvétalo díky magické technologii. Naučili jsme se vyvoválat duchy elementů a poodrobit je své vůli, ale najednou jsou další experimenty "moc nebezpečné".\n\nVím přesně, co se děje. Zamítnutí mých teorií nemá nic společného se zásluhami, ale s tím, kdo je předloží. Všichni se mi vysmívají za zády.\n\nAle toho už bylo dost! Je mi jedno, co si říkají, já prozkoumám nejtajnější kouty našeho vesmíru sám, a nechám si své nálezy jen pro sebe!\n- R.
|
||||
journal.document.halls_king.rejection.body=IMBECILOVÉ!\n\nPo 33 let naše království vzkvétalo díky magické technologii. Naučili jsme se vyvoválat duchy elementů a podrobit je své vůli, ale najednou jsou další experimenty "moc nebezpečné".\n\nVím přesně, co se děje. Zamítnutí mých teorií nemá nic společného se zásluhami, ale s tím, kdo je předloží. Všichni se mi vysmívají za zády.\n\nAle toho už bylo dost! Je mi jedno, co si říkají, já prozkoumám nejtajnější kouty našeho vesmíru sám, a nechám si své nálezy jen pro sebe!\n- R.
|
||||
journal.document.halls_king.amulet.title=Amulet
|
||||
journal.document.halls_king.amulet.body=DOKÁZAL JSEM TO!\n\nNetušil jsem, co přesně najdu, ale to, co jsem nalezl, předčilo má nejdivočejší očekávání. Taková moc, jentak si ležící a čekající, až ji vezmu, je teď jenom moje!\n\nS tímhle mi nikdo z těch hlupáků nebude stát v cestě. Třesu se při pomyšlení, kolika způsoby je teď můžu všechny ponížit. Ale proč zůstávat jen u toho, mám dost síly, abych je všechny zničil, kdykoliv si umanu! To je možná trochu moc, ale nesmím se rozhodovat dlouho, jinak mě začnou podezírat.\n\nMyslím, že té obrovské moci budu říkat Amulet Yendoru!\n- R.
|
||||
journal.document.halls_king.ritual.title=Rituál
|
||||
journal.document.halls_king.ritual.body=Thymor mě dnes veřejně oslovil a dožadoval se vysvětlení mého nového zdroje moci. Odbyl jsem ho nejlépe, jak jsem mohl, ale zase na sobě cítím palčivé pohledy zbylých členů koncilu.\n\nDoufal jsem, že si budu moct déle užívat toho ticha před bouří, ale na tom už nesejde. Rozhodl jsem se, co chci udělat. Prohlásím, že jsem svou moc získal skrze nový rituál, a nabídnu jeho provedení s jinými čaroději a s králem. Jakmile rituál skončí, králem budu já!\n\nThymor bude samozřejmě zase protestovat, ale s nabídkou takové moci pochybuji, že ho někdo bude poslouchat!\n\nVŠICHNI SE MI POKLONÍ!\n- Budoucí Král Trpaslíků
|
||||
journal.document.halls_king.ritual.body=Thymor mě dnes veřejně oslovil a dožadoval se vysvětlení mého nového zdroje moci. Odbyl jsem ho nejlépe, jak jsem mohl, ale zase na sobě cítím palčivé pohledy zbylých členů koncilu.\n\nDoufal jsem, že si budu moct déle užívat toho ticha před bouří, ale na tom už nesejde. Rozhodl jsem se, co chci udělat. Prohlásím, že jsem svou moc získal skrze nový rituál, a nabídnu jeho provedení s jinými čaroději a s Králem. Jakmile rituál skončí, králem budu já!\n\nThymor bude samozřejmě zase protestovat, ale s nabídkou takové moci pochybuji, že ho někdo bude poslouchat!\n\nVŠICHNI SE MI POKLONÍ!\n- Budoucí Král Trpaslíků
|
||||
journal.document.halls_king.new_king.title=Nový Král
|
||||
journal.document.halls_king.new_king.body=JÁ JSEM KRÁL, AHAHAHAHAAA!\n\nProstě mě nechali to udělat! Skoro bez přesvědčování všichni souhlasili, abych s nimi "sdílel" svou moc skrze velký rituál. Během chvíle se změnili ze sboru překřikujících se hlupáků a můj nový dvůr tichých sluhů.\n\nJak jsem čekal, ten zbabělec Thymor utekl při první známce nebezpečí. Už teď cítím, jak se snaží zbudovat odpor. Myslím, že mu dovolím v tom pokračovat, aby mi mohl všechny svoje konsirátory dovést přímo před dveře!\n\nOčividně ke mně království také nemá zrovna respekt, myslím, že to budu také muset napravit.\n- Král Trpaslíků
|
||||
journal.document.halls_king.thing.title=Ta Věc
|
||||
|
||||
@@ -39,7 +39,7 @@ journal.document.adventurers_guide.intro.body=Saluton kara aventuristo, vi nun l
|
||||
journal.document.adventurers_guide.examining.title=Ekzameni
|
||||
journal.document.adventurers_guide.examining.body=Estas grave akiri informojn pri viaj kontraŭuloj kaj pri ĉirkaŭaĵo, anstataŭ senpripense kuri antaŭen! Ellaboru kutimon ekzameni ĉion novan.\n\n(Vi povas ekzameni objektojn uzante la butonon de lupeo kaj sekve elekti tion, pri kio vi volas akiri informojn. Vi ankaŭ povas sciiĝi pri nuntempaj efikoj per elekti iliajn bildsimbolojn.)
|
||||
journal.document.adventurers_guide.surprise_attacks.title=Surprizaj atakoj
|
||||
journal.document.adventurers_guide.surprise_attacks.body=Surprizaj atakoj ĉiam trafas, tio iĝas ilin efikaj kontraŭ evitpovaj malamikoj – kiel serpentoj kaj fifantomoj.\n\nKiam malamiko postkuras vin, vi povas surprizi lin tuj post trairi pordon; aŭ tuj post alia situacio en kiu malamiko perdas vin de sia vidatingo.
|
||||
journal.document.adventurers_guide.surprise_attacks.body=Surprizaj atakoj ĉiam trafas, tio iĝas ilin efikaj kontraŭ evitpovaj malamikoj – kiel serpentoj kaj fifantomoj.\n\nKiam malamiko postkuras vin, vi povas surprizi lin tuj post trairi pordon aŭ tuj post alia situacio en kiu malamiko perdas vin de sia vidatingo.
|
||||
journal.document.adventurers_guide.identifying.title=Identigi aĵojn
|
||||
journal.document.adventurers_guide.identifying.body=Koloroj de eliksiroj kaj simboloj sur skribrulaĵoj estas malsamaj por ĉiu labirinto (nova ludo). Neidentigita armaĵo feliĉe povas esti plibonigita aŭ ensorĉita, tamen ĝi ankaŭ povas esti malbenita!\n\nSkribrulaĵoj de identigo, plibonigo kaj senmalbenigo estas tre utilaj por minimumigi la riskon pro uzi neidentigitaj armaĵoj.\n\n(Vi povas trovi la liston de ĉiuj identigitaj objektoj en la katalogo de objektoj en via taglibro.)
|
||||
journal.document.adventurers_guide.food.title=Zorgi malsaton
|
||||
|
||||
@@ -45,13 +45,13 @@ journal.document.adventurers_guide.identifying.body=Kolory mikstur oraz symbole
|
||||
journal.document.adventurers_guide.food.title=Postępowanie z głodem
|
||||
journal.document.adventurers_guide.food.body=Odpowiedzialne racjonowanie żywności to jedna z najważniejszych rzeczy, które możesz zrobić, aby zwiększyć swoje szanse na przetrwanie. Nie musisz jeść od razu, gdy zgłodniejesz!\n\nKiedy nie jesteś wygłodzony, powoli regenerujesz zdrowie. Tak więc, jedząc przy pełnym zdrowiu, ta regeneracja zostanie zmarnowana!\n\nJeśli zdecydujesz, kiedy jesz, w zależności od stanu twojego zdrowia, żywność wystarczy ci na dużo dłużej.
|
||||
journal.document.adventurers_guide.alchemy.title=Alchemia i Relikty
|
||||
journal.document.adventurers_guide.alchemy.body=Jeśli uważasz jakiś przedmiot jednorazowego użytku za zbędny, możesz go użyć jako składnika w tyglu alchemicznym lub przekształcić w uniwersalną energię alchemiczną. Przekształcanie zwojów i mikstur w energię, również je identyfikuje!\n\nRelikty są jedyną częścią ekwipunku, która powstaje i jest ulepszana dzięki alchemii. Można je stworzyć z niewielkiej ilości energii alchemicznej i magicznego katalizatora. \n\n(Pierwszy tygiel alchemiczny znajdziesz na 3. lub 4. piętrze lochu. W pobliżu tych tygli znajdziesz strony z książki od alchemii.)
|
||||
journal.document.adventurers_guide.alchemy.body=Jeśli uważasz jakiś przedmiot jednorazowego użytku za zbędny, możesz go użyć jako składnika w tyglu alchemicznym lub przekształcić w uniwersalną energię alchemiczną. Przekształcanie zwojów i mikstur w energię pozwala je zidentyfikować!\n\nRelikty są jedyną częścią ekwipunku, która jest tworzona i ulepszana z pomocą alchemii. Można je stworzyć z niewielkiej ilości energii alchemicznej i magicznego katalizatora. \n\n(Pierwszy tygiel alchemiczny znajdziesz na 3. lub 4. piętrze lochu. W pobliżu tych tygli znajdziesz strony z książki od alchemii.)
|
||||
journal.document.adventurers_guide.dieing.title=Radzenie Sobie z Porażką
|
||||
journal.document.adventurers_guide.dieing.body=Eksploracja podziemi to bardzo niebezpieczny zawód i większość poszukiwaczy przygód kończy tragicznie.\n\nOdrobina szczęścia pomaga, ale najlepsi poszukiwacze przygód korzystają z każdej sztuczki, aby zwiększyć swoje szanse.\n\n(Nie zniechęcaj się, jeśli często giniesz, ta gra jest trudna! Skoncentruj się na nauce gry i stopniowym doskonaleniu, a nie wygrywaniu od razu.)
|
||||
journal.document.adventurers_guide.searching.title=Przeszukiwanie
|
||||
journal.document.adventurers_guide.searching.body=Podziemia przepełnione są tajnymi przejściami i pułapkami, które na pierwszy rzut oka wydają się niewidoczne. Możesz poświęcić trochę czasu na dokładniejsze poszukiwania, jeśli masz podejrzenie że w pobliżu znajdują się ukryte drzwi lub pułapki.\n\n(Możesz przeszukać wszystkie pola wokół ciebie, używając dwukrotnie przycisku z lupą. Być może w pobliżu miejsca, gdzie znalazłeś tę stronę, są jakieś ukryte drzwi!)
|
||||
journal.document.adventurers_guide.searching.body=Podziemia są pełne tajnych przejść i pułapek które są niewidoczne na pierwszy rzut oka. Możesz poświęcić trochę czasu na dokładniejsze poszukiwania, jeśli masz podejrzenie, że w pobliżu znajdują się ukryte drzwi lub pułapki.\n\n(Możesz przeszukać wszystkie pola wokół siebie, używając dwukrotnie przycisku z lupą. Być może w pobliżu miejsca, gdzie znaleziono tę stronę, są jakieś ukryte drzwi!)
|
||||
journal.document.adventurers_guide.strength.title=Siła
|
||||
journal.document.adventurers_guide.strength.body=W lochu nie ma czasu na trening z odnalezioną bronią czy pancerzem, więc aby ich efektywnie używać, potrzebny ci będzie zastrzyk czystej energii.\n\nMikstury siły oraz zwoje ulepszenia są najlepszym remedium na spełnienie wymogów wyposażenia wyższego kręgu.\n\nWażna rzeczą jest dążenie do używania przedmiotów wyższych kręgów, acz nie należy kompletnie ignorować wyposażenia które jest zdatne do użytku w tym, konkretnym momencie.
|
||||
journal.document.adventurers_guide.strength.body=W lochu nie ma czasu na trening z odnalezioną bronią czy pancerzem, więc aby ich efektywnie używać, potrzebny jest zastrzyk czystej siły.\n\nMikstury siły oraz zwoje ulepszenia są najlepszym remedium na spełnienie wymogów wyposażenia wyższego kręgu.\n\nWażną rzeczą jest dążenie do używania przedmiotów wyższych kręgów, lecz lepiej nie ignorować całkowicie wyposażenia, które możesz wykorzystać już teraz.
|
||||
journal.document.adventurers_guide.upgrades.title=Ulepszenia
|
||||
journal.document.adventurers_guide.upgrades.body=Im głębiej zapuszczasz się w loch, tym bardziej istotne jest używanie magicznie zaklętego wyposażenia wysokiego kręgu, które wymaga siły, aby móc je skutecznie używać.\n\nRóżdżki, pierścienie i artefakty nie wymagają siły, ale posiadają ograniczoną liczbę użyć, bądź są mało przydatne w bezpośrednim starciu.\n\nPodejmowanie właściwych decyzji w kwestii ulepszeń jest nad wyraz istotne dla przetrwania początkowych części lochu oraz odpowiedniego przygotowania na trudy głębszych poziomów.
|
||||
journal.document.adventurers_guide.looting.title=Skutecznie łupienie
|
||||
@@ -59,7 +59,7 @@ journal.document.adventurers_guide.looting.body=Pomieszczenia za zamkniętymi dr
|
||||
journal.document.adventurers_guide.levelling.title=Zdobywanie doświadczenia
|
||||
journal.document.adventurers_guide.levelling.body=Zdobywanie poziomów doświadczenia zwiększa twoje statystyki i nagradza cię punktami talentów, które mogą mieć duże znaczenie w walce. Najlepiej zdobywać co najmniej jeden poziom na każde piętro lochu.i\n\nPrzebiegnięcie przez loch i uniknięcie walki lub eksploracji może być kuszące, ale taka taktyka pozbawi cię cennych zasobów i doświadczenia.\n\n(Możesz zobaczyć informacje o swoim bohaterze, w tym o jego doświadczeniu, na panelu statystyk w rogu interfejsu. Wybierz portret swojego bohatera, aby zobaczyć jeszcze więcej informacji.)
|
||||
journal.document.adventurers_guide.positioning.title=Ustawianie się
|
||||
journal.document.adventurers_guide.positioning.body=Strategia jest równie ważna, jak wyposażenie. Niekorzystne sytuacje, takie jak bycie otoczonym, zazwyczaj mogą być uniknięte poprzez zajmowanie odpowiednich pozycji. \n\nDla przykładu, większość lochów ma wąskie korytarze, zmuszające przeciwników do walki w pojedynkę. Te korytarze często posiadają też drzwi, przydatne przy atakach z zaskoczenia! \n\nIstnieje wiele mniejszych sposobów na wykorzystanie elementów otoczenia, takich jak trawa, woda, przepaści czy pułapki, na swoją korzyść.
|
||||
journal.document.adventurers_guide.positioning.body=Strategia jest równie ważna co wyposażenie. Możesz uniknąć wiele niekorzystnych sytuacji, takich jak zostanie otoczonym, poprzez zajmowanie odpowiednich pozycji.\n\nDla przykładu, większość lochów ma wąskie korytarze, zmuszające przeciwników do walki w pojedynkę. Korytarze często mają też drzwi przydatne przy atakach z zaskoczenia!\n\nInne elementy otoczenia takie jak trawa, woda, przepaść czy pułapki też możesz wykorzystywać w pewnym stopniu na twoją korzyść.
|
||||
journal.document.adventurers_guide.magic.title=Ataki magiczne
|
||||
journal.document.adventurers_guide.magic.body=Ataki magiczne przenikają przez zbroję i są trudne do uniknięcia. Oznacza to, że obrażenia różdżek są niemal niezawodne, ale czyni to władających magią przeciwników bardzo niebezpiecznymi!\n\nAtaki magiczne zawsze mają jakąś wadę. Różdżki mają ograniczoną liczbę ładunków, a magiczni przeciwnicy zazwyczaj nie będą mogli używać swojej magii w zwarciu.\n\nPodczas starcia z wrogami, którzy używają magii, ważne jest nauczenie się, jak uniemożliwić im używanie jej przeciwko tobie.
|
||||
|
||||
@@ -69,7 +69,7 @@ journal.document.alchemy_guide.potions.body=Witaj w "Praktycznych zastosowaniach
|
||||
journal.document.alchemy_guide.stones.title=Tworzenie kamieni runicznych
|
||||
journal.document.alchemy_guide.stones.body=Wrzucenie zwoju do tygla alchemicznego sprawi, że dwa kamienie wchłoną jego magię. W ten sposób można zidentyfikować zwój i otrzymać kamienie runiczne!
|
||||
journal.document.alchemy_guide.energy_food.title=Energia i jedzenie
|
||||
journal.document.alchemy_guide.energy_food.body=Wiele receptur wymaga skrystalizowanej energii alchemicznej, wytwarzanej poprzez rozkładanie przedmiotów jednorazowego użytku w tyglu alchemicznym. Przekształcanie zwojów i mikstur w energię, również je identyfikuje..\n\nCzęść receptur wymagających energii to czysta magia, aczkolwiek tym bliżej jest do tradycjonalnej kuchni.
|
||||
journal.document.alchemy_guide.energy_food.body=Wiele receptur wymaga skrystalizowanej energii alchemicznej, wytwarzanej poprzez rozkładanie przedmiotów jednorazowego użytku w tyglu alchemicznym. Przekształcanie zwojów i mikstur w energię pozwala je zidentyfikować.\n\nCzęść receptur wymagających energii to czysta magia, aczkolwiek tym bliżej jest do tradycjonalnej kuchni.
|
||||
journal.document.alchemy_guide.exotic_potions.title=Egzotyczne eliksiry
|
||||
journal.document.alchemy_guide.exotic_potions.body=Połącz mikstury z energią, aby tworzyć egzotyczne eliksiry. Są one potężniejsze od zwykłych, choć czasami mają nieco inne działanie.
|
||||
journal.document.alchemy_guide.exotic_scrolls.title=Egzotyczne zwoje
|
||||
|
||||
@@ -56,7 +56,7 @@ levels.traps.cursingtrap.desc=Cái bẫy này chứa cùng thứ phép thuật h
|
||||
|
||||
levels.traps.disarmingtrap.name=bẫy tước vũ khí
|
||||
levels.traps.disarmingtrap.disarm=Vũ khí của bạn bị dịch chuyển đi!
|
||||
levels.traps.disarmingtrap.desc=Cái bẫy này chứa phép thuật dịch chuyển tức thời rất cụ thể, nó sẽ đưa vũ khí của nạn nhân của nó đến một số vị trí khác.
|
||||
levels.traps.disarmingtrap.desc=Cái bẫy này chứa phép thuật dịch chuyển rất cụ thể, nó sẽ dịch chuyển vũ khí của nạn nhân của nó đến một vị trí nào đó khác.
|
||||
|
||||
levels.traps.disintegrationtrap.name=bẫy tan rã
|
||||
levels.traps.disintegrationtrap.one=Cái bẫy phân rã %s của bạn!
|
||||
@@ -143,8 +143,8 @@ levels.traps.trap.rankings_desc=Bị giết bởi: %s
|
||||
levels.traps.corrosiontrap.name=bẫy khí ăn mòn
|
||||
levels.traps.corrosiontrap.desc=Kích hoạt cái bẫy này sẽ làm một đám mây khí có tính axit chết người thoát ra trong khu vực xung quanh.
|
||||
|
||||
levels.traps.warpingtrap.name=bẫy bẻ cong
|
||||
levels.traps.warpingtrap.desc=Cái bẫy này tương tự như một cái bẫy dịch chuyển tức thời, nhưng cũng sẽ khiến người hùng mất đi hiểu biết của họ về bố cục của tầng!
|
||||
levels.traps.warpingtrap.name=bẫy di dời
|
||||
levels.traps.warpingtrap.desc=Cái bẫy này giống như một cái bẫy dịch chuyển, nhưng cũng sẽ khiến người hùng mất đi hiểu biết của mình về bố cục của tầng!
|
||||
|
||||
levels.traps.weakeningtrap.name=bẫy suy yếu
|
||||
levels.traps.weakeningtrap.desc=Phép thuật hắc ám trong cái bẫy này hút năng lượng ra khỏi bất cứ thứ gì tiếp xúc với nó. Tuy nhiên, những kẻ địch mạnh mẽ có thể sẽ kháng lại hiệu ứng.
|
||||
@@ -202,7 +202,7 @@ levels.hallslevel.region_deco_name=Đống đá vụn
|
||||
levels.hallslevel.region_deco_desc=Một mảng đá lớn, có vẻ như đã rơi ra từ trên trần hoặc một bức tường gần đó.
|
||||
|
||||
|
||||
levels.level.hidden_trap=Một cái %s kích hoạt!
|
||||
levels.level.hidden_trap=Một chiếc %s ẩn kích hoạt!
|
||||
levels.level.chasm_name=Hố sâu
|
||||
levels.level.floor_name=Sàn
|
||||
levels.level.grass_name=Cỏ
|
||||
|
||||
@@ -45,7 +45,7 @@ levels.traps.burningtrap.name=烈焰陷阱
|
||||
levels.traps.burningtrap.desc=踩進這個陷阱會點燃某種化學混合物,導致周圍小塊區域起火。
|
||||
|
||||
levels.traps.chillingtrap.name=寒氣陷阱
|
||||
levels.traps.chillingtrap.desc=被觸發時,這個陷阱裡的化學藥劑會迅速凍結周圍的空氣。
|
||||
levels.traps.chillingtrap.desc=觸發時,這個陷阱裡的化學藥劑會迅速凍結周圍的空氣。
|
||||
|
||||
levels.traps.confusiontrap.name=致眩氣體陷阱
|
||||
levels.traps.confusiontrap.desc=觸發這個陷阱後,排氣孔將噴出一片混亂氣體。
|
||||
@@ -71,7 +71,7 @@ levels.traps.explosivetrap.name=爆炸陷阱
|
||||
levels.traps.explosivetrap.desc=這個陷阱包含一些粉狀炸藥和一個觸發機制。觸發它會導致一定範圍的爆炸。
|
||||
|
||||
levels.traps.flashingtrap.name=閃光陷阱
|
||||
levels.traps.flashingtrap.desc=被觸發時,這個陷阱將點燃儲存在裡面的強效閃光粉,使受害者暫時失明、殘廢、並受到傷害。\n\n由於閃光粉的存量極大,陷阱被觸發再多次,也不會失效。
|
||||
levels.traps.flashingtrap.desc=觸發時,這個陷阱將點燃儲存在裡面的強效閃光粉,使受害者暫時失明、殘廢、並受到傷害。\n\n由於閃光粉的存量極大,陷阱被觸發再多次,也不會失效。
|
||||
|
||||
levels.traps.flocktrap.name=羊群陷阱
|
||||
levels.traps.flocktrap.desc=也許是個來自一些業餘法師的玩笑,觸發這個陷阱就會召喚一群魔法綿羊。
|
||||
@@ -83,7 +83,7 @@ levels.traps.gatewaytrap.name=通道陷阱
|
||||
levels.traps.gatewaytrap.desc=這種特殊的傳送陷阱可以被反覆觸發並且總是通向同樣的目的地。
|
||||
|
||||
levels.traps.geysertrap.name=噴泉陷阱
|
||||
levels.traps.geysertrap.desc=當被觸發時,大量的水會從中噴湧而出,傷害火屬性單位,沖退周圍的所有單位,熄滅火焰,並將周圍的地形轉化為水。
|
||||
levels.traps.geysertrap.desc=觸發時,大量的水會從中噴湧而出,傷害火屬性單位,沖退周圍的所有單位,熄滅火焰,並將周圍的地形轉化為水。
|
||||
|
||||
levels.traps.gnollrockfalltrap.name=豺狼落石陷阱
|
||||
levels.traps.gnollrockfalltrap.desc=這種落石陷阱是一種魔法產物。觸發時它會導致岩石鬆動並立即從上方掉落在其周圍 5x5 的區域內。由於礦坑裡的石頭比上面的軟,所以造成的傷害會比普通的落石陷阱低,但也使得護甲不能很好的吸收傷害。由於這礦坑的某些地方有被支柱支撐,落石也不會掉到它附近。\n\n_這陷阱跟上面的一樣不長眼,對這裡的生物它都傷得了。_
|
||||
|
||||
@@ -177,8 +177,8 @@ levels.caveslevel.exit_desc=通向下一层的梯子。
|
||||
levels.caveslevel.high_grass_desc=高耸的蘑菇群遮挡了你的视线。
|
||||
levels.caveslevel.wall_deco_desc=岩壁上能隐约看见金属矿脉的纹路,难道是黄金?
|
||||
levels.caveslevel.bookshelf_desc=到底会有谁需要在洞窟里摆上这么个书架?
|
||||
levels.caveslevel.region_deco_name=金属结构
|
||||
levels.caveslevel.region_deco_desc=一个大型全金属结构,可能是在矮人过去在此处采矿时建造的。你认为你在其上层看到了早已废弃的矿车轨道。
|
||||
levels.caveslevel.region_deco_name=金属架构
|
||||
levels.caveslevel.region_deco_desc=一个大型全金属架构,可能是在矮人过去在采矿时建造的。其上层应当有废弃了许久的矿车轨道。
|
||||
|
||||
levels.citylevel.water_name=异色水潭
|
||||
levels.citylevel.high_grass_name=茂盛花朵
|
||||
|
||||
@@ -205,7 +205,7 @@ badges$badge.unlock_cleric.desc=Malŝlosi Klerikon per plene forigi malbenon de
|
||||
badges$badge.enemy_hazards.title=Sekureca danĝeraĵo
|
||||
badges$badge.enemy_hazards.desc=Mortigi 10 malamikojn dum unu ludo kun helpo de ĉirkaŭaĵaj danĝeraĵoj (kaptiloj, kreskaĵoj kaj abismoj)
|
||||
badges$badge.many_buffs.title=Plurkolore
|
||||
badges$badge.many_buffs.desc=Havi almenaŭ 10 bildsimbolojn de efikoj aktivaj samtempe
|
||||
badges$badge.many_buffs.desc=Havi almenaŭ 10 bildsimbolojn de efikoj aktivajn samtempe
|
||||
badges$badge.pacifist_ascent.title=Pacifista supreniro
|
||||
badges$badge.pacifist_ascent.desc=Preni la Amuleton de Jendor’ al la supraĵo sen redukti ĝian malbenon
|
||||
badges$badge.taking_the_mick.title=Primoki la antikvan dion
|
||||
|
||||
@@ -132,7 +132,7 @@ badges$badge.no_monsters_slain.title=Người yêu hòa bình
|
||||
badges$badge.no_monsters_slain.desc=Vượt qua một tầng mà không tiêu diệt kẻ thù nào
|
||||
badges$badge.grim_weapon.title=Thần chết
|
||||
badges$badge.grim_weapon.desc=Đánh bại kẻ thù với một vũ khí có phù phép tử thần
|
||||
badges$badge.piranhas.title=Người câu cá bất tiện
|
||||
badges$badge.piranhas.title=Người câu cá lạ thường
|
||||
badges$badge.piranhas.desc=Tiêu diệt 6 con piranha trong một lượt chơi
|
||||
badges$badge.boss_challenge_1.title=Chiến thắng hoàn chỉnh
|
||||
badges$badge.boss_challenge_1.desc=Đánh bại trùm của khu cống ngầm mà không cho nó sử dụng cú đánh sạc hoặc hồi máu trong nước.
|
||||
|
||||
@@ -204,11 +204,11 @@ badges$badge.unlock_cleric.title=解锁牧师!
|
||||
badges$badge.unlock_cleric.desc=完全净化任何一件被诅咒装备的诅咒以解锁牧师
|
||||
badges$badge.enemy_hazards.title=安全隐患
|
||||
badges$badge.enemy_hazards.desc=在一局游戏中通过特殊地形(陷阱、植物或深渊)击败10个敌人
|
||||
badges$badge.many_buffs.title=狂乱的鸡尾酒
|
||||
badges$badge.many_buffs.title=五彩缤纷
|
||||
badges$badge.many_buffs.desc=同时拥有至少10种增益/减益
|
||||
badges$badge.pacifist_ascent.title=光荣凯旋
|
||||
badges$badge.pacifist_ascent.title=和平凯旋
|
||||
badges$badge.pacifist_ascent.desc=将其诅咒未曾减弱的Yendor护符带出地牢
|
||||
badges$badge.taking_the_mick.title=弄巧成拙
|
||||
badges$badge.taking_the_mick.title=虎口弄嘲
|
||||
badges$badge.taking_the_mick.desc=以一把至少20级的镐子对最终boss打出致命一击
|
||||
|
||||
challenges.no_food=缩餐节食
|
||||
|
||||
@@ -21,10 +21,10 @@ plants.earthroot$seed.name=Hạt cây rễ đất
|
||||
plants.earthroot$armor.name=áo giáp thảo mộc
|
||||
plants.earthroot$armor.desc=Một loại giáp tự nhiên, bất động làm từ vỏ cây và dây.\n\nBộ giáp thiên nhiên này sẽ chặn %d sát thương từ bất cứ đòn vật lí nào, cho đến khi nó hết độ bền và vỡ vụn.\n\nBởi bộ giáp bất động, di chuyển sẽ khiến nó vỡ ra và bị mất.\n\nGiáp còn lại: %d.
|
||||
|
||||
plants.fadeleaf.name=Lá dịch chuyển
|
||||
plants.fadeleaf.name=lá biến mất
|
||||
plants.fadeleaf.desc=Chạm vào một cây lá biến mất sẽ dịch chuyển bất kì sinh vật nào tới một nơi ngẫu nhiên trên tầng hiện tại.
|
||||
plants.fadeleaf.warden_desc=Hiệu ứng dịch chuyển của lá mạnh hơn đối với _Hộ vệ_, dịch chuyển cô trở lại điểm kết thúc của tầng hầm ngục trước.
|
||||
plants.fadeleaf$seed.name=hạt cây lá dịch chuyển
|
||||
plants.fadeleaf.warden_desc=Hiệu ứng dịch chuyển của lá biến mất mạnh hơn đối với _Hộ vệ_, dịch chuyển cô trở lại điểm kết thúc của tầng ngục trước.
|
||||
plants.fadeleaf$seed.name=hạt cây lá biến mất
|
||||
|
||||
plants.firebloom.name=hoa lửa
|
||||
plants.firebloom.desc=Khi bất cứ thứ gì chạm vào nó, nó sẽ bốc cháy với đám lửa dữ dội.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
plants.blandfruitbush.name=无味果
|
||||
plants.blandfruitbush.desc=腐莓的远亲,来自无味果树丛的梨状产物,尝起来犹如一团泥巴。果实粗糙且松软,但并没有毒性。也许可以煮食。
|
||||
plants.blandfruitbush.discover_hint=你可在地牢中随机发现该植物。
|
||||
plants.blandfruitbush.discover_hint=这种植物有几率在地牢中生成。
|
||||
plants.blandfruitbush$seed.name=无味果之种
|
||||
|
||||
plants.blindweed.name=致盲草
|
||||
@@ -37,7 +37,7 @@ plants.icecap.warden_desc=_守望者_能将有害的冰冻转化为短时的寒
|
||||
plants.icecap$seed.name=冰冠花之种
|
||||
|
||||
plants.plant.warden_desc=守望者踩踏这株植物不会获得额外效果。
|
||||
plants.plant.discover_hint=你可通过在地牢中随机发现或使用其种子种植该植物。
|
||||
plants.plant.discover_hint=这种植物和它的种子有几率在地牢中生成。
|
||||
plants.plant$seed.seed_of=%s之种
|
||||
plants.plant$seed.ac_plant=种植
|
||||
plants.plant$seed.info=把这粒种子丢到你想长出一株植物的地方。\n\n%s
|
||||
@@ -46,9 +46,9 @@ plants.plant$seed$placeholder.name=种子
|
||||
plants.rotberry.name=腐莓
|
||||
plants.rotberry.desc=未成熟的腐莓丛结出的莓果尝起来更像是甜蜜的死亡。经过成年累月的生长,这株腐莓丛终会成熟为另一棵腐莓核心。被踩踏后,这株未成熟的腐莓会释放少量毒气。
|
||||
plants.rotberry.warden_desc=遭到践踏时腐莓丛通常只会喷出一小股毒气,但_守望者_却能联结其中的魔力,在短时间内提升力量!
|
||||
plants.rotberry.discover_hint=你可在某个任务中使用其种子种植该植物。
|
||||
plants.rotberry.discover_hint=这种植物的种子将在某个特殊任务中出现。
|
||||
plants.rotberry$seed.name=腐莓之种
|
||||
plants.rotberry$seed.discover_hint=你可在某个任务中发现该物品。
|
||||
plants.rotberry$seed.discover_hint=这件物品将在某个特殊任务中出现。
|
||||
|
||||
plants.sorrowmoss.name=断肠苔
|
||||
plants.sorrowmoss.desc=断肠苔(实为花卉而非苔藓)是一种花瓣利如刀片,表面覆有致命毒液的植物。
|
||||
|
||||
@@ -231,7 +231,7 @@ windows.wndranking$statstab.challenges=Defioj
|
||||
windows.wndranking$statstab.score=Poentaro
|
||||
windows.wndranking$statstab.str=Povo
|
||||
windows.wndranking$statstab.duration=Luda daŭro
|
||||
windows.wndranking$statstab.depth=Maksimuma keletaĝo
|
||||
windows.wndranking$statstab.depth=Maks. keletaĝo
|
||||
windows.wndranking$statstab.ascent=Postvenka supreniro
|
||||
windows.wndranking$statstab.seed=Labirint-ĝermo
|
||||
windows.wndranking$statstab.custom_seed=_Propra ĝermo_
|
||||
|
||||
@@ -289,8 +289,8 @@ windows.wndsettings$displaytab.saver=Energiebespaarder
|
||||
windows.wndsettings$displaytab.saver_desc=In de energiebesparingsstand wordt het spel op een kleiner formaat getekend en opgeschaald zodat deze op je scherm past.\n\nHierdoor wordt de vormgeving minder scherp en wordt de menuweergave iets groter, maar worden ook de prestaties en de batterijduur verbeterd.\n\nJe moet het spel waarschijnlijk herstarten om deze verandering te laten werken.
|
||||
windows.wndsettings$displaytab.okay=Oké
|
||||
windows.wndsettings$displaytab.cancel=Annuleren
|
||||
windows.wndsettings$displaytab.portrait=Overschakelen naar portret
|
||||
windows.wndsettings$displaytab.landscape=Overschakelen naar landschap
|
||||
windows.wndsettings$displaytab.portrait=Portretmodus
|
||||
windows.wndsettings$displaytab.landscape=Landschapsmodus
|
||||
windows.wndsettings$displaytab.brightness=Helderheid
|
||||
windows.wndsettings$displaytab.dark=Donker
|
||||
windows.wndsettings$displaytab.bright=Helder
|
||||
|
||||
@@ -371,7 +371,7 @@ windows.wndupgrade.enchant=Ulepszenie tego przedmiotu ma %d%% szans na zniszczen
|
||||
windows.wndupgrade.glyph=Ulepszenie tego przedmiotu ma %d%% szans na zniszczenie glifu!
|
||||
windows.wndupgrade.harden=Ulepszenie tego przedmiotu ma %d%% szans na zniszczenie zahartowania!
|
||||
windows.wndupgrade.resin=Ta różdżka została ulepszona magiczną żywicą, zwykłe ulepszenia zastąpią ulepszenia z żywicy!
|
||||
windows.wndupgrade.thrown_dust=Bronie z tego zestawu, których nie masz w ekwipunku zamienią się w drobny mak.
|
||||
windows.wndupgrade.thrown_dust=Bronie z tego zestawu, których nie masz w ekwipunku, rozpadną się w drobny mak.
|
||||
windows.wndupgrade.damage=Obrażenia
|
||||
windows.wndupgrade.blocking=Blokowane Obrażenia
|
||||
windows.wndupgrade.weight=Waga
|
||||
|
||||
@@ -38,10 +38,11 @@ public class PinCushion extends Buff {
|
||||
private ArrayList<MissileWeapon> items = new ArrayList<>();
|
||||
|
||||
public void stick(MissileWeapon projectile){
|
||||
for (Item item : items){
|
||||
if (item.isSimilar(projectile)){
|
||||
item.merge(projectile);
|
||||
if (TippedDart.lostDarts > 0){
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
if (projectile.isSimilar(items.get(i))) {
|
||||
projectile.merge(items.get(i));
|
||||
items.set(i, projectile);
|
||||
if (TippedDart.lostDarts > 0) {
|
||||
Dart d = new Dart();
|
||||
d.quantity(TippedDart.lostDarts);
|
||||
TippedDart.lostDarts = 0;
|
||||
|
||||
@@ -607,7 +607,7 @@ public class Hero extends Char {
|
||||
Combo.ParryTracker parry = buff(Combo.ParryTracker.class);
|
||||
if (parry != null){
|
||||
parry.parried = true;
|
||||
if (buff(Combo.class).getComboCount() < 9 || pointsInTalent(Talent.ENHANCED_COMBO) < 2){
|
||||
if (buff(Combo.class) == null || buff(Combo.class).getComboCount() < 9 || pointsInTalent(Talent.ENHANCED_COMBO) < 2){
|
||||
parry.detach();
|
||||
}
|
||||
return Messages.get(Monk.class, "parried");
|
||||
|
||||
@@ -773,7 +773,7 @@ public enum Talent {
|
||||
// 10/15%
|
||||
if (Random.Int(20) < 1 + hero.pointsInTalent(RECALL_INSCRIPTION)){
|
||||
Reflection.newInstance(cls).collect();
|
||||
GLog.p("refunded!");
|
||||
GLog.p(Messages.get(Talent.class, RECALL_INSCRIPTION.name() + ".refunded"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -792,7 +792,7 @@ public enum Talent {
|
||||
// 10/15%
|
||||
if (Random.Int(20) < 1 + hero.pointsInTalent(RECALL_INSCRIPTION)){
|
||||
Reflection.newInstance(cls).collect();
|
||||
GLog.p("refunded!");
|
||||
GLog.p(Messages.get(Talent.class, RECALL_INSCRIPTION.name() + ".refunded"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,7 +74,9 @@ public class Radiance extends ClericSpell {
|
||||
Buff.affect(mob, GuidingLight.Illuminated.class);
|
||||
Buff.affect(mob, GuidingLight.WasIlluminatedTracker.class);
|
||||
}
|
||||
Buff.affect(mob, Paralysis.class, 3f);
|
||||
if (mob.isActive()) {
|
||||
Buff.affect(mob, Paralysis.class, 3f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.AllyBuff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfAggression;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.BeeSprite;
|
||||
import com.watabou.utils.Bundle;
|
||||
@@ -151,7 +152,24 @@ public class Bee extends Mob {
|
||||
return (Char) Actor.findById(potHolder);
|
||||
|
||||
//if the pot is on the ground
|
||||
}else {
|
||||
} else {
|
||||
|
||||
//copypasta from regular mob logic for aggression with added limit for pot distance
|
||||
if ((alignment == Alignment.ENEMY || buff(Amok.class) != null ) && state != PASSIVE && state != SLEEPING) {
|
||||
if (enemy != null
|
||||
&& enemy.buff(StoneOfAggression.Aggression.class) != null
|
||||
&& Dungeon.level.distance(enemy.pos, potPos) <= 3){
|
||||
state = HUNTING;
|
||||
return enemy;
|
||||
}
|
||||
for (Char ch : Actor.chars()) {
|
||||
if (ch != this && fieldOfView[ch.pos] && Dungeon.level.distance(ch.pos, potPos) <= 3
|
||||
&& ch.buff(StoneOfAggression.Aggression.class) != null) {
|
||||
state = HUNTING;
|
||||
return ch;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//try to find a new enemy in these circumstances
|
||||
if (enemy == null || !enemy.isAlive() || !Actor.chars().contains(enemy) || state == WANDERING
|
||||
|
||||
@@ -25,6 +25,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.CorrosiveGas;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.quest.MetalShard;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.DM201Sprite;
|
||||
@@ -52,9 +53,11 @@ public class DM201 extends DM200 {
|
||||
|
||||
@Override
|
||||
public void damage(int dmg, Object src) {
|
||||
if ((src instanceof Char && !Dungeon.level.adjacent(pos, ((Char)src).pos))
|
||||
|| enemy == null || !Dungeon.level.adjacent(pos, enemy.pos)){
|
||||
threatened = true;
|
||||
if (!(src instanceof Corruption)) {
|
||||
if ((src instanceof Char && !Dungeon.level.adjacent(pos, ((Char) src).pos))
|
||||
|| enemy == null || !Dungeon.level.adjacent(pos, enemy.pos)) {
|
||||
threatened = true;
|
||||
}
|
||||
}
|
||||
super.damage(dmg, src);
|
||||
}
|
||||
|
||||
@@ -682,10 +682,17 @@ public class DM300 extends Mob {
|
||||
|
||||
@Override
|
||||
public void affectChar(Char ch) {
|
||||
if (!(ch instanceof DM300)){
|
||||
Buff.prolong(ch, Paralysis.class, Dungeon.isChallenged(Challenges.STRONGER_BOSSES) ? 5 : 3);
|
||||
if (ch == Dungeon.hero) {
|
||||
Statistics.bossScores[2] -= 100;
|
||||
if (!(ch instanceof DM300 || ch instanceof Pylon)){
|
||||
if (Dungeon.isChallenged(Challenges.STRONGER_BOSSES)) {
|
||||
ch.damage(Random.NormalIntRange(10, 20), this);
|
||||
} else {
|
||||
ch.damage(Random.NormalIntRange(6, 12), this);
|
||||
}
|
||||
if (ch.isAlive()) {
|
||||
Buff.prolong(ch, Paralysis.class, Dungeon.isChallenged(Challenges.STRONGER_BOSSES) ? 5 : 3);
|
||||
} else if (ch == Dungeon.hero){
|
||||
Dungeon.fail( target );
|
||||
GLog.n( Messages.get( GnollGeomancer.class, "rockfall_kill") );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -294,6 +294,9 @@ public class Ghoul extends Mob {
|
||||
Dungeon.level.occupyCell( ghoul );
|
||||
ghoul.sprite.idle();
|
||||
ghoul.sprite.showStatusWithIcon(CharSprite.POSITIVE, Integer.toString(Math.round(ghoul.HT/10f)), FloatingText.HEALING);
|
||||
if (ghoul.enemy != null && ghoul.enemy.alignment == ghoul.alignment){
|
||||
ghoul.enemy = null; //reset enemy
|
||||
}
|
||||
super.detach();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -80,7 +80,9 @@ public class Guard extends Mob {
|
||||
else {
|
||||
int newPos = -1;
|
||||
for (int i : chain.subPath(1, chain.dist)){
|
||||
if (!Dungeon.level.solid[i] && Actor.findChar(i) == null){
|
||||
//find the closest position to the guard that's open for the target
|
||||
if (!Dungeon.level.solid[i] && Actor.findChar(i) == null
|
||||
&& (Dungeon.level.openSpace[i] || !Char.hasProp(enemy, Property.LARGE))){
|
||||
newPos = i;
|
||||
break;
|
||||
}
|
||||
@@ -127,6 +129,8 @@ public class Guard extends Mob {
|
||||
Dungeon.hero.interrupt();
|
||||
Dungeon.observe();
|
||||
GameScene.updateFog();
|
||||
} else {
|
||||
enemy.sprite.visible = Dungeon.level.heroFOV[pullPos];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -502,7 +502,7 @@ public abstract class Mob extends Char {
|
||||
|
||||
protected boolean getCloser( int target ) {
|
||||
|
||||
if (rooted || target == pos) {
|
||||
if (rooted || target == pos || !Dungeon.level.insideMap(target)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -41,10 +41,11 @@ public class Rat extends Mob {
|
||||
|
||||
@Override
|
||||
protected boolean act() {
|
||||
if (alignment == Alignment.ENEMY
|
||||
if (alignment != Alignment.ALLY
|
||||
&& Dungeon.level.heroFOV[pos]
|
||||
&& Dungeon.hero.armorAbility instanceof Ratmogrify){
|
||||
alignment = Alignment.NEUTRAL;
|
||||
if (enemy == Dungeon.hero) enemy = null;
|
||||
if (state == SLEEPING) state = WANDERING;
|
||||
}
|
||||
return super.act();
|
||||
|
||||
@@ -74,7 +74,7 @@ public class Dewdrop extends Item {
|
||||
}
|
||||
|
||||
Sample.INSTANCE.play( Assets.Sounds.DEWDROP );
|
||||
hero.spendAndNext( TIME_TO_PICK_UP );
|
||||
hero.spendAndNext( pickupDelay() );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ public class EnergyCrystal extends Item {
|
||||
|
||||
GameScene.pickUp( this, pos );
|
||||
hero.sprite.showStatusWithIcon( 0x44CCFF, Integer.toString(quantity), FloatingText.ENERGY );
|
||||
hero.spendAndNext( TIME_TO_PICK_UP );
|
||||
hero.spendAndNext( pickupDelay() );
|
||||
|
||||
Sample.INSTANCE.play( Assets.Sounds.ITEM );
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ public class Gold extends Item {
|
||||
|
||||
GameScene.pickUp( this, pos );
|
||||
hero.sprite.showStatusWithIcon( CharSprite.NEUTRAL, Integer.toString(quantity), FloatingText.GOLD );
|
||||
hero.spendAndNext( TIME_TO_PICK_UP );
|
||||
hero.spendAndNext( pickupDelay() );
|
||||
|
||||
Sample.INSTANCE.play( Assets.Sounds.GOLD, 1, 1, Random.Float( 0.9f, 1.1f ) );
|
||||
updateQuickslot();
|
||||
|
||||
@@ -126,7 +126,7 @@ public class Item implements Bundlable {
|
||||
|
||||
GameScene.pickUp( this, pos );
|
||||
Sample.INSTANCE.play( Assets.Sounds.ITEM );
|
||||
hero.spendAndNext( TIME_TO_PICK_UP );
|
||||
hero.spendAndNext( pickupDelay() );
|
||||
return true;
|
||||
|
||||
} else {
|
||||
@@ -697,6 +697,10 @@ public class Item implements Bundlable {
|
||||
public float castDelay( Char user, int cell ){
|
||||
return TIME_TO_THROW;
|
||||
}
|
||||
|
||||
public float pickupDelay(){
|
||||
return TIME_TO_PICK_UP;
|
||||
}
|
||||
|
||||
protected static Hero curUser = null;
|
||||
protected static Item curItem = null;
|
||||
|
||||
@@ -77,7 +77,7 @@ public class LostBackpack extends Item {
|
||||
|
||||
Item.updateQuickslot();
|
||||
Sample.INSTANCE.play( Assets.Sounds.DEWDROP );
|
||||
hero.spendAndNext(TIME_TO_PICK_UP);
|
||||
hero.spendAndNext(pickupDelay());
|
||||
GameScene.pickUp( this, pos );
|
||||
((HeroSprite)hero.sprite).updateArmor();
|
||||
|
||||
|
||||
@@ -345,6 +345,7 @@ public class DriedRose extends Artifact {
|
||||
|
||||
if (ghost != null){
|
||||
ghost.updateRose();
|
||||
ghost.HP = Math.min(ghost.HP+8, ghost.HT);
|
||||
}
|
||||
|
||||
return super.upgrade();
|
||||
@@ -502,7 +503,7 @@ public class DriedRose extends Artifact {
|
||||
return false;
|
||||
} if ( rose.level() >= rose.levelCap ){
|
||||
GLog.i( Messages.get(this, "no_room") );
|
||||
hero.spendAndNext(TIME_TO_PICK_UP);
|
||||
hero.spendAndNext(pickupDelay());
|
||||
return true;
|
||||
} else {
|
||||
|
||||
@@ -515,7 +516,7 @@ public class DriedRose extends Artifact {
|
||||
|
||||
Sample.INSTANCE.play( Assets.Sounds.DEWDROP );
|
||||
GameScene.pickUp(this, pos);
|
||||
hero.spendAndNext(TIME_TO_PICK_UP);
|
||||
hero.spendAndNext(pickupDelay());
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
@@ -165,7 +165,7 @@ public class MasterThievesArmband extends Artifact {
|
||||
} else {
|
||||
if (loot.doPickUp(curUser)) {
|
||||
//item collection happens instantly
|
||||
curUser.spend(-TIME_TO_PICK_UP);
|
||||
curUser.spend(-loot.pickupDelay());
|
||||
} else {
|
||||
Dungeon.level.drop(loot, curUser.pos).sprite.drop();
|
||||
}
|
||||
|
||||
@@ -518,7 +518,7 @@ public class TimekeepersHourglass extends Artifact {
|
||||
else
|
||||
GLog.i( Messages.get(this, "levelup") );
|
||||
GameScene.pickUp(this, pos);
|
||||
hero.spendAndNext(TIME_TO_PICK_UP);
|
||||
hero.spendAndNext(pickupDelay());
|
||||
return true;
|
||||
} else {
|
||||
GLog.w( Messages.get(this, "no_hourglass") );
|
||||
|
||||
@@ -64,7 +64,7 @@ public abstract class DocumentPage extends Item {
|
||||
}
|
||||
document().findPage(page);
|
||||
Sample.INSTANCE.play( Assets.Sounds.ITEM );
|
||||
hero.spendAndNext( TIME_TO_PICK_UP );
|
||||
hero.spendAndNext( pickupDelay() );
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ public class Guidebook extends Item {
|
||||
}
|
||||
GameScene.flashForDocument(Document.ADVENTURERS_GUIDE, Document.GUIDE_INTRO);
|
||||
Sample.INSTANCE.play( Assets.Sounds.ITEM );
|
||||
hero.spendAndNext( TIME_TO_PICK_UP );
|
||||
hero.spendAndNext( pickupDelay() );
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ public abstract class Key extends Item {
|
||||
WndJournal.last_index = 0;
|
||||
Notes.add(this);
|
||||
Sample.INSTANCE.play( Assets.Sounds.ITEM );
|
||||
hero.spendAndNext( TIME_TO_PICK_UP );
|
||||
hero.spendAndNext( pickupDelay() );
|
||||
GameScene.updateKeyDisplay();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ public class BeaconOfReturning extends Spell {
|
||||
|
||||
Char existing = Actor.findChar(returnPos);
|
||||
if (existing != null && existing != hero){
|
||||
Char toPush = !Char.hasProp(existing, Char.Property.IMMOVABLE) ? hero : existing;
|
||||
Char toPush = Char.hasProp(existing, Char.Property.IMMOVABLE) ? hero : existing;
|
||||
|
||||
ArrayList<Integer> candidates = new ArrayList<>();
|
||||
for (int n : PathFinder.NEIGHBOURS8) {
|
||||
|
||||
@@ -75,7 +75,7 @@ public class TelekineticGrab extends TargetedSpell {
|
||||
Item item = ch.buff(PinCushion.class).grabOne();
|
||||
|
||||
if (item.doPickUp(hero, ch.pos)) {
|
||||
hero.spend(-Item.TIME_TO_PICK_UP); //casting the spell already takes a turn
|
||||
hero.spend(-item.pickupDelay()); //casting the spell already takes a turn
|
||||
GLog.i( Messages.capitalize(Messages.get(hero, "you_now_have", item.name())) );
|
||||
|
||||
} else {
|
||||
@@ -100,7 +100,7 @@ public class TelekineticGrab extends TargetedSpell {
|
||||
Item item = h.peek();
|
||||
if (item.doPickUp(hero, h.pos)) {
|
||||
h.pickUp();
|
||||
hero.spend(-Item.TIME_TO_PICK_UP); //casting the spell already takes a turn
|
||||
hero.spend(-item.pickupDelay()); //casting the spell already takes a turn
|
||||
GLog.i( Messages.capitalize(Messages.get(hero, "you_now_have", item.name())) );
|
||||
|
||||
} else {
|
||||
|
||||
@@ -22,12 +22,12 @@
|
||||
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.melee;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfBlastWave;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.darts.Dart;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
@@ -86,7 +86,10 @@ public class Crossbow extends MeleeWeapon {
|
||||
int dmg = super.proc(attacker, defender, damage);
|
||||
|
||||
//stronger elastic effect
|
||||
if (attacker.buff(ChargedShot.class) != null && !(curItem instanceof Dart)){
|
||||
if (attacker == Dungeon.hero
|
||||
&& Dungeon.hero.buff(ChargedShot.class) != null
|
||||
//not proccing from a dart
|
||||
&& Dungeon.hero.belongings.attackingWeapon() == this){
|
||||
//trace a ballistica to our target (which will also extend past them
|
||||
Ballistica trajectory = new Ballistica(attacker.pos, defender.pos, Ballistica.STOP_TARGET);
|
||||
//trim it to just be the part that goes past them
|
||||
|
||||
@@ -51,16 +51,22 @@ public class HeavyBoomerang extends MissileWeapon {
|
||||
(tier-1) * lvl; //3 scaling, down from 4
|
||||
}
|
||||
|
||||
boolean circleBackhit = false;
|
||||
boolean circlingBack = false;
|
||||
|
||||
@Override
|
||||
protected float adjacentAccFactor(Char owner, Char target) {
|
||||
if (circleBackhit){
|
||||
if (circlingBack){
|
||||
return 1.5f;
|
||||
}
|
||||
return super.adjacentAccFactor(owner, target);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float pickupDelay() {
|
||||
//pickup is instant when circling back
|
||||
return circlingBack ? 0f : super.pickupDelay();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void rangedHit(Char enemy, int cell) {
|
||||
decrementDurability();
|
||||
@@ -126,22 +132,18 @@ public class HeavyBoomerang extends MissileWeapon {
|
||||
@Override
|
||||
public void call() {
|
||||
detach();
|
||||
boomerang.circlingBack = true;
|
||||
if (returnTarget == target){
|
||||
if (!boomerang.spawnedForEffect) {
|
||||
if (target instanceof Hero && boomerang.doPickUp((Hero) target)) {
|
||||
//grabbing the boomerang takes no time
|
||||
((Hero) target).spend(-TIME_TO_PICK_UP);
|
||||
} else {
|
||||
if (!(target instanceof Hero) || !boomerang.doPickUp((Hero) target)) {
|
||||
Dungeon.level.drop(boomerang, returnPos).sprite.drop();
|
||||
}
|
||||
}
|
||||
|
||||
} else if (returnTarget != null){
|
||||
boomerang.circleBackhit = true;
|
||||
if (((Hero)target).shoot( returnTarget, boomerang )) {
|
||||
boomerang.decrementDurability();
|
||||
}
|
||||
boomerang.circleBackhit = false;
|
||||
if (!boomerang.spawnedForEffect && boomerang.durability > 0) {
|
||||
Dungeon.level.drop(boomerang, returnPos).sprite.drop();
|
||||
}
|
||||
@@ -149,6 +151,7 @@ public class HeavyBoomerang extends MissileWeapon {
|
||||
} else if (!boomerang.spawnedForEffect) {
|
||||
Dungeon.level.drop(boomerang, returnPos).sprite.drop();
|
||||
}
|
||||
boomerang.circlingBack = false;
|
||||
CircleBack.this.next();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -539,9 +539,13 @@ abstract public class MissileWeapon extends Weapon {
|
||||
durability = MAX_DURABILITY;
|
||||
}
|
||||
|
||||
masteryPotionBonus = masteryPotionBonus || ((MissileWeapon) other).masteryPotionBonus;
|
||||
levelKnown = levelKnown || other.levelKnown;
|
||||
cursedKnown = cursedKnown || other.cursedKnown;
|
||||
if (((Weapon)other).readyToIdentify()){
|
||||
setIDReady();
|
||||
}
|
||||
|
||||
masteryPotionBonus = masteryPotionBonus || ((MissileWeapon) other).masteryPotionBonus;
|
||||
enchantHardened = enchantHardened || ((MissileWeapon) other).enchantHardened;
|
||||
|
||||
//if other has a curse/enchant status that's a higher priority, copy it. in the following order:
|
||||
@@ -598,7 +602,7 @@ abstract public class MissileWeapon extends Weapon {
|
||||
parent = null;
|
||||
if (!UpgradedSetTracker.pickupValid(hero, this)){
|
||||
Sample.INSTANCE.play( Assets.Sounds.ITEM );
|
||||
hero.spendAndNext( TIME_TO_PICK_UP );
|
||||
hero.spendAndNext( pickupDelay() );
|
||||
GLog.w(Messages.get(this, "dust"));
|
||||
quantity(0);
|
||||
return true;
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
|
||||
public class ThrowingClub extends MissileWeapon {
|
||||
@@ -38,12 +37,8 @@ public class ThrowingClub extends MissileWeapon {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doPickUp(Hero hero, int pos) {
|
||||
if (super.doPickUp(hero, pos)){
|
||||
hero.spendAndNext( -hero.cooldown() );
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
public float pickupDelay() {
|
||||
return 0; //picked up instantly
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
package com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
|
||||
|
||||
public class ThrowingHammer extends MissileWeapon {
|
||||
@@ -38,12 +37,8 @@ public class ThrowingHammer extends MissileWeapon {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doPickUp(Hero hero, int pos) {
|
||||
if (super.doPickUp(hero, pos)){
|
||||
hero.spendAndNext( -hero.cooldown() );
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
public float pickupDelay() {
|
||||
return 0; //picked up instantly
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -25,28 +25,28 @@ import java.util.Locale;
|
||||
|
||||
public enum Languages {
|
||||
ENGLISH("english", "en", Status.O_COMPLETE, null, null),
|
||||
CHI_SMPL("简体中文", "zh", Status.__UNREVIEW, new String[]{"Chronie_Lynn_Iwa", "Jinkeloid(zdx00793)", "endlesssolitude"}, new String[]{"931451545", "Budding", "Fatir", "Fishbone", "Hcat", "HoofBumpBlurryface", "Horr_lski", "Lery", "Lyn_0401", "Lyx0527", "Ooooscar", "RainSlide", "ShatteredFlameBlast", "SpaceAnchor", "SunsetGlowTheDOGE", "Teller", "hmdzl001", "leo", "tempest102", "户方狸奴"}),
|
||||
CHI_SMPL("简体中文", "zh", Status.__UNREVIEW, new String[]{"Chronie_Lynn_Iwa", "Jinkeloid(zdx00793)", "endlesssolitude"}, new String[]{"931451545", "Budding", "Fatir", "Fishbone", "Hcat", "HoofBumpBlurryface", "Horr_lski", "Lery", "Lyn_0401", "Lyx0527", "Ooooscar", "RainSlide", "ShatteredFlameBlast", "SpaceAnchor", "SunsetGlowTheDOGE", "Teller", "hmdzl001", "leo", "tempest102", "tequilasunset", "户方狸奴"}),
|
||||
KOREAN("한국어", "ko", Status.__UNREVIEW, new String[]{"Cocoa", "Flameblast12", "GameConqueror", "Korean2017"}, new String[]{"AFS", "N8fall", "WondarRabb1t", "benepaper", "chlrhwnstkd", "ddojin0115", "eeeei", "enjuxx", "hancyel", "linterpreteur", "lemonam", "lsiebnie", "sora0430"}),
|
||||
RUSSIAN("русский", "ru", Status.__UNREVIEW, new String[]{"AprilRain(Vadzim Navumaû)", "ConsideredHamster", "Dominowood371", "Inevielle", "apxwn", "yarikonline"}, new String[]{"5r", "AngryPotato", "AttHawk46", "BlueberryShortcake", "CatGirlSasha", "Enwviun", "HerrGotlieb", "HoloTheWise", "Ilbko", "JleHuBbluKoT", "KirStaLong", "MrXantar", "Nikets", "OneDuo", "Originalej0name", "Provitia", "Raymundo", "Roycce", "Shamahan", "Thomasg63", "XAutumn", "Ya6lo4ko", "chelikchelik", "dasfan123", "ifritdiezel", "kirusyaga", "kptmx", "leondorus", "long_live_the_9", "pancreper1", "perefrazz", "ponfertato", "roman.yagodin", "tibby", "un_logic", "vivatimperia", "wntrau", "Вoвa"}),
|
||||
SPANISH("español", "es", Status.O_COMPLETE, new String[]{"KeyKai", "Kiroto", "Kohru", "airman12", "grayscales"}, new String[]{"2001sergiobr", "AdventurerKilly", "Alesxanderk", "Bryan092", "CorvosUtopy", "D0n.Kak0", "Dewstend", "Dyrran", "Enddox", "Fervoreking", "Illyatwo2", "Fuwn", "JPCHZ", "LastCry", "Marquezo_577_284", "NAVI1237", "No_se145", "STKmonoqui", "Sh4rkill3r", "Uri2523", "alfongad", "anauta", "benzarr410", "chepe567.jc", "ctrijueque", "damc0616", "desen90", "dhg121", "javifs", "jonismack1", "magmax", "rechebeltran", "tres.14159"}),
|
||||
RUSSIAN("русский", "ru", Status.__UNREVIEW, new String[]{"AprilRain(Vadzim Navumaû)", "ConsideredHamster", "Dominowood371", "Inevielle", "apxwn", "yarikonline"}, new String[]{"5r", "AngryPotato", "AttHawk46", "BlueberryShortcake", "CatGirlSasha", "Enwviun", "HerrGotlieb", "HoloTheWise", "Ilbko", "JleHuBbluKoT", "KirStaLong", "MrXantar", "Nikets", "OneDuo", "Originalej0name", "Provitia", "Raymundo", "Roycce", "Shamahan", "Thomasg63", "XAutumn", "Ya6lo4ko", "chelikchelik", "dasfan123", "ifritdiezel", "katyp2005", "kirusyaga", "kptmx", "leondorus", "long_live_the_9", "pancreper1", "perefrazz", "ponfertato", "roman.yagodin", "tibby", "un_logic", "vivatimperia", "wntrau", "xenrun", "Вoвa"}),
|
||||
SPANISH("español", "es", Status.O_COMPLETE, new String[]{"KeyKai", "Kiroto", "Kohru", "airman12", "grayscales"}, new String[]{"2001sergiobr", "AdventurerKilly", "Alesxanderk", "Bryan092", "CorvosUtopy", "D0n.Kak0", "Dewstend", "Dyrran", "Enddox", "Fervoreking", "Illyatwo2", "Fuwn", "JPCHZ", "LastCry", "Marquezo_577_284", "NAVI1237", "No_se145", "STKmonoqui", "Sh4rkill3r", "Uri2523", "alfongad", "alquimistamyl", "anauta", "benzarr410", "chepe567.jc", "ctrijueque", "damc0616", "desen90", "dhg121", "javifs", "jonismack1", "magmax", "rechebeltran", "saadhabibi077", "tres.14159"}),
|
||||
PORTUGUESE("português", "pt", Status.O_COMPLETE, new String[]{"NicholasPainek", "TDF2001", "matheus208"}, new String[]{"14NGiestas", "Aetheryll", "Andrew_px1", "Arthur_Mastriaga", "Bigode935", "Bionic64", "Chacal.Ex", "ChainedFreaK", "DAVICCOSTA", "DRACOnicus", "Derik", "DredgenVale", "ElefanteFome", "Helen0903", "JST", "Kotaroo05", "MadHorus", "Maria_João", "MarkusCoisa", "Matie", "Ninguem.EXE", "OtávioMoraes", "PingasOwner", "Piraldo", "Sr.BaconDelicioso", "Tete_Teli", "Tio_P_(Krampus)", "Zukkine", "ancientorange", "danypr23", "denis.gnl", "efverick", "gBiazon", "ismael.henriques12", "juniorsilve33", "mfcord", "nattlegal", "owenreilly", "phobos445", "rafazago", "renan408", "try31"}),
|
||||
GERMAN("deutsch", "de", Status.O_COMPLETE, new String[]{"Dallukas", "KrystalCroft", "Wuzzy", "Zap0", "apxwn", "bernhardreiter", "davedude"}, new String[]{"2711chrissi", "Abracadabra", "Anaklysmos", "Ceeee", "DarkPixel", "David.transifex", "EmilKevinManuel", "ErichME", "Faquarl", "JorahEtLabora", "LenzB", "MacMoff", "Micksha", "Niseko", "Ordoviz", "Sarius", "Shtynow", "SirEddi", "Sorpl3x", "SurmanPP", "SwissQ", "ThunfischGott", "Timo_S", "Topicranger", "azrdev", "carrageen", "dome.scheidler", "galactictrans", "gekko303", "jeinzi", "johannes.schobel", "karoshi42", "koryphea", "luciocarreras", "mklr", "niemand", "oragothen", "razzifazzi0", "spixi", "tanjay", "unbekannterTyp", "wunst"}),
|
||||
FRENCH("français", "fr", Status.O_COMPLETE, new String[]{"Emether", "TheKappaDuWeb", "Weende_Bellet", "Xalofar", "canc42", "kultissim", "minikrob", "Lucasgstar"}, new String[]{"3raven", "Alsydis", "Anonyme48", "Axce", "Az_zahr", "Bastien72", "Basttee", "Coco_EC", "Dekadisk", "Draal", "Eragem", "Karnot", "L.E.V.", "Lama", "Le_Valla", "Leandre", "Louson", "Martin.Bellet", "Neopolitan", "NoGi", "Nyrnx", "Opidox", "Pandaman516", "Petit_Chat", "RomTheMareep", "RunningColours", "STPayoube", "Soeiz", "SpeagleZNT", "Teddywestside", "Tronche2Cake", "VRad", "Ygdrazil", "_nim_", "adamch", "adeb", "antoine9298", "clexanis", "eloiseflo", "fricht", "gdavid2", "go11um", "hydrasho", "jan.", "jazzzz", "levilbatard", "linterpreteur", "luffah", "maeltur70", "marmous", "mcbaba29000", "mluzarreta", "panopano", "solthaar", "speagle", "tkf_", "typhr80", "vavavoum", "whereisfelix", "willi3725", "zM_"}),
|
||||
JAPANESE("日本語", "ja", Status.O_COMPLETE, new String[]{"daingewuvzeevisiddfddd", "oz51199"}, new String[]{"Gosamaru", "NickZhrbin", "Otogiri", "Siraore_Rou", "amama", "grassedge", "kiyofumimanabe", "librada", "mocklike", "tomofumikitano"}),
|
||||
CHI_TRAD("繁體中文","zh-hant", Status.__UNREVIEW, new String[]{"JZR", "p2635"}, new String[]{"Fishbone", "Ken4Ro", "Lstron", "Relrin167", "Sotis425", "Yichm", "Zoe096423", "arnolam", "jackymaxj", "redbrow", "shiba", "唐延諭"}),
|
||||
CHI_TRAD("繁體中文","zh-hant", Status.__UNREVIEW, new String[]{"JZR", "p2635"}, new String[]{"DT227", "Fishbone", "Ken4Ro", "Lstron", "Relrin167", "Sotis425", "Yichm", "Zoe096423", "arnolam", "jackymaxj", "redbrow", "shiba", "唐延諭"}),
|
||||
POLISH("polski", "pl", Status.__UNREVIEW, new String[]{"Daniel Witański", "Deksippos", "MrKukurykpl", "chronon", "kuadziw", "szymex73"}, new String[]{"Akmetari", "AntiTime", "Boguc", "Chasseur", "Ciechu", "Darden", "DarkKnightComes", "DogeseleQ", "GRan0000", "Hammil", "I256I", "KarixDaii", "KrnąbrnyOlaf", "Lufix", "MJedi", "MrCommander", "Odiihinia", "Ostsee0912", "Peperos", "RolsoN", "Scharnvirk", "Serpens13", "Tangens", "VasteelXolotl", "Voyteq", "Wiiiiiii", "bobas10", "bogumilg", "bvader95", "dusakus", "elchudy", "jajkoswinka", "michaub", "mikolka9144", "ozziezombie", "szczoteczka22", "taki1", "transportowiec96"}),
|
||||
VIETNAMESE("tiếng việt","vi", Status.O_COMPLETE, new String[]{"Chuseko", "The_Hood", "nguyenanhkhoapythus"}, new String[]{"BlueSheepAlgodoo", "Phuc2401", "SpaceMetropolis", "Teh_boi", "Threyja", "Toluu", "bruhwut", "buicongminh_t63", "deadlevel13", "duongfg250", "h4ndy_c4ndy", "hniV", "khangxyz3g", "ngolamaz3", "nkhhu", "vdgiapp", "vtvinh24"}),
|
||||
TURKISH("türkçe", "tr", Status.__UNREVIEW, new String[]{"LokiofMillenium", "Mustafa.10", "T3kin5iZ", "emrebnk", "gorkem_yılmaz"}, new String[]{"AGORAAA", "AchernarPrime", "AcuriousPotato", "BurningDaylight", "Helgon", "Koga", "Mehmet_Emin_21", "MuratEfeYilmaz", "OzanAlkan", "TR_Muhittin", "Talha_0_0", "TheMBDsvs", "Yllcare", "YORGANSIZMTAV", "ahmetbakicakir", "akkaya.mustafa", "alikeremozfidan", "alpekin98", "barankrky", "denizakalin", "eraysall402", "erdemozdemir98", "hasantahsin160", "immortalsamuraicn", "kayikyaki", "kempilbey", "melezorus34", "mitux", "mustafadoslu", "ryuga", "yasirckr85", "yukete"}),
|
||||
TURKISH("türkçe", "tr", Status.__UNREVIEW, new String[]{"LokiofMillenium", "Mustafa.10", "T3kin5iZ", "emrebnk", "gorkem_yılmaz"}, new String[]{"AGORAAA", "AchernarPrime", "AcuriousPotato", "BurningDaylight", "Helgon", "Koga", "Mehmet_Emin_21", "MuratEfeYilmaz", "OzanAlkan", "TR_Muhittin", "Talha_0_0", "TheMBDsvs", "Yllcare", "YORGANSIZMTAV", "ahmetbakicakir", "akkaya.mustafa", "alikeremozfidan", "alpekin98", "barankrky", "denizakalin", "eraysall402", "erdemozdemir98", "hasantahsin160", "immortalsamuraicn", "kayikyaki", "kempilbey", "melezorus34", "mitux", "mustafadoslu", "ryuga", "superDpermn", "yasirckr85", "yukete"}),
|
||||
INDONESIAN("indonesia", "in", Status.__UNREVIEW, new String[]{"RF_4R4F1_03", "rakapratama"}, new String[]{"An_Ironstone", "Flasherx", "INDRA_SYAHPUTRA", "Izulhaaq", "Karanh", "M.Bintang.K", "PineFirebloom", "QiuQiuQi", "Taka31", "ZakyM313", "ZangieF347", "aachunemiku", "anagakenny24", "aryasatya_arifien", "atmorojo", "di9526985", "esprogarap", "hatsunnimiku", "icebearwand", "kirimaja", "lupar21", "luthfidzaky_ldzy", "mkakhsan301", "nicoalvito", "noeldycreator", "oolek", "wisnugafur"}),
|
||||
ITALIAN("italiano", "it", Status.__UNREVIEW, new String[]{"MottledElm", "NeoAugustus", "bizzolino", "funnydwarf", "inkubo87"}, new String[]{"4est", "Danelix", "DaniMare", "Danzl", "Dj1234", "Eriliken", "Esse78", "Guiller124", "Hydr46605", "IoannesMaria", "LN_90", "Mat323", "Mister64", "Noostale", "PicchiSeba", "Tugamer89", "Tysal", "andrea049ita", "andreafaffo", "andrearubbino00", "cantarini", "carinellialessandro31", "dmytro.tokayev", "mamon68596", "mattiuw", "max1234ita", "maxifire32", "nessunluogo", "righi.a", "umby000", "unknown888", "valerio.bozzolan"}),
|
||||
ITALIAN("italiano", "it", Status.__UNREVIEW, new String[]{"MottledElm", "NeoAugustus", "bizzolino", "funnydwarf", "inkubo87"}, new String[]{"4est", "Danelix", "DaniMare", "Danzl", "Dj1234", "Eriliken", "Esse78", "Guiller124", "Hydr46605", "IoannesMaria", "LN_90", "Mat323", "Mister64", "Noostale", "PicchiSeba", "Tugamer89", "Tysal", "andrea049ita", "andreafaffo", "andrearubbino00", "angelica.caruso", "cantarini", "carinellialessandro31", "dmytro.tokayev", "lorenzofrosi05", "mamon68596", "mattiuw", "max1234ita", "maxifire32", "nessunluogo", "righi.a", "umby000", "unknown888", "valerio.bozzolan"}),
|
||||
UKRANIAN("українська", "uk", Status.O_COMPLETE, new String[]{"Oster", "Snikewin", "zhushman00"}, new String[]{"AlexFenixUA", "Buster54", "Doodlinka", "Dotsent", "Lyttym", "MaxQuiet", "Mops", "Sadsaltan1", "TarasUA", "TheGuyBill", "Tomfire", "Volkov", "ZverWolf", "_bor_", "alexfenixva", "ddmaster3463", "filalex77", "holuydadko", "ingvarfed", "iu0v1", "jesternotricks", "lezzen", "myshokoleksander05", "oliolioxinfree", "qweez", "romanokurg", "so1der", "sterenkevicsasa", "vlisivka", "xojltoh", "yukete", "zhawty", "Мальвочка"}),
|
||||
CZECH("čeština", "cs", Status.__UNREVIEW, new String[]{"ObisMike", "novotnyvaclav"}, new String[]{"16cnovotny", "AshenShugar", "Autony", "Block_Vader", "Buba237", "JStrange", "Nerdiniel", "Patrik123", "RealBrofessor", "Thorn_123", "chuckjirka", "emteckos2", "kristanka"}),
|
||||
CZECH("čeština", "cs", Status.__UNREVIEW, new String[]{"ObisMike", "novotnyvaclav"}, new String[]{"16cnovotny", "AshenShugar", "Autony", "Block_Vader", "Buba237", "JStrange", "Nerdiniel", "Patrik123", "RealBrofessor", "Thorn_123", "chuckjirka", "emteckos2", "kristanka", "luhan.lukas"}),
|
||||
HUNGARIAN("magyar", "hu", Status.O_COMPLETE, new String[]{"dorheim", "summoner001", "szalaik"}, new String[]{"Csanevox", "Navetelen", "acszoltan111", "balazsszalab", "clarovani", "dhialub", "nanometer", "nardomaa", "savarall", "szemetvodor"}),
|
||||
DUTCH("nederlands", "nl", Status.__UNREVIEW, new String[]{"AlbertBrand", "Mvharen"}, new String[]{"AvanLieshout", "Blokheck011", "Frankwert", "Gehenna", "Valco", "ZephyrZodiac", "link200023", "ojppe", "rmw", "th3f4llenh0rr0r"}),
|
||||
DUTCH("nederlands", "nl", Status.O_COMPLETE, new String[]{"AlbertBrand", "Mvharen"}, new String[]{"AvanLieshout", "Blokheck011", "Frankwert", "Gehenna", "Valco", "ZephyrZodiac", "link200023", "ojppe", "rmw", "th3f4llenh0rr0r"}),
|
||||
SWEDISH("svenska", "sv", Status.__UNREVIEW, new String[]{"yeager"}, new String[]{"KeyB", "Moistmemesneverlie", "antonaut", "dotMavriQ", "leowitchhh"}),
|
||||
//FINNISH("suomi", "fi", Status.X_UNFIN, new String[]{"TenguKnight"}, new String[]{"Allugaattori10", "Dakkus", "Jaskas123", "MailBoxGod", "Oftox", "Sautari", "Tikkari"} ),
|
||||
GREEK("ελληνικά", "el", Status.X_UNFINISH, new String[]{"Aeonius", "Saxy"}, new String[]{"DU_Clouds", "VasKyr", "YiorgosH", "fr3sh", "nikolaoskelirakis", "stefboi", "toumbo", "val.exe"}),
|
||||
BELARUSIAN("беларуская","be", Status.X_UNFINISH, new String[]{"AprilRain(Vadzim Navumaû)"}, new String[]{"4ebotar"}),
|
||||
BELARUSIAN("беларуская","be", Status.X_UNFINISH, new String[]{"AprilRain(Vadzim Navumaû)"}, new String[]{"4ebotar", "Loentrin"}),
|
||||
//CATALAN("català", "ca", Status.X_UNFIN, new String[]{"Illyatwo2"}, new String[]{"Elosy", "n1ngu"})
|
||||
//GALICIAN("galego", "gl", Status.X_UNFIN, new String[]{"xecarballido"}, null),
|
||||
//BASQUE("euskara", "eu", Status.X_UNFIN, new String[]{"Deathrevenge", "Osoitz"}, null),
|
||||
|
||||
@@ -369,21 +369,26 @@ public class GameScene extends PixelScene {
|
||||
int uiSize = SPDSettings.interfaceSize();
|
||||
|
||||
//display cutouts can obstruct various UI elements, so we need to adjust for that sometimes
|
||||
float heroPaneExtraWidth = insets.left;
|
||||
float menuBarMaxLeft = uiCamera.width-insets.right-MenuPane.WIDTH;
|
||||
int hpBarMaxWidth = 50; //default max width
|
||||
float buffBarTopRowMaxWidth = 50; //default max width
|
||||
if (largeInsetTop != insets.top){
|
||||
//iOS's Dynamic island badly obstructs the first buff bar row
|
||||
if (DeviceCompat.isiOS()){
|
||||
//TODO bad to hardcode and approximate this atm
|
||||
// need to change this so iOS platformsupport returns cutout dimensions
|
||||
float cutoutLeft = (Game.width*0.3f)/defaultZoom;
|
||||
buffBarTopRowMaxWidth = Math.min(50, cutoutLeft - 32);
|
||||
} else if (DeviceCompat.isAndroid()) {
|
||||
//Android hole punches are of varying size and may obstruct the menu, HP bar, or buff bar
|
||||
float[] buffBarRowLimits = new float[9];
|
||||
float[] buffBarRowAdjusts = new float[9];
|
||||
|
||||
if (largeInsetTop == 0 && insets.top > 0){
|
||||
//smaller non-notch cutouts are of varying size and may obstruct various UI elements
|
||||
// some are small hole punches, some are huge dynamic islands
|
||||
RectF cutout = Game.platform.getDisplayCutout().scale(1f / defaultZoom);
|
||||
//if the cutout is positioned to obstruct the hero portrait in the status pane
|
||||
if (cutout.top < 30
|
||||
&& cutout.left < 20
|
||||
&& cutout.right > 12) {
|
||||
heroPaneExtraWidth = Math.max(heroPaneExtraWidth, cutout.right-12);
|
||||
//make sure we have space to actually move it though
|
||||
heroPaneExtraWidth = Math.min(heroPaneExtraWidth, uiCamera.width - PixelScene.MIN_WIDTH_P);
|
||||
}
|
||||
//if the cutout is positioned to obstruct the menu bar
|
||||
if (cutout.top < 20
|
||||
else if (cutout.top < 20
|
||||
&& cutout.left < menuBarMaxLeft + MenuPane.WIDTH
|
||||
&& cutout.right > menuBarMaxLeft) {
|
||||
menuBarMaxLeft = Math.min(menuBarMaxLeft, cutout.left - MenuPane.WIDTH);
|
||||
@@ -391,7 +396,7 @@ public class GameScene extends PixelScene {
|
||||
menuBarMaxLeft = Math.max(menuBarMaxLeft, PixelScene.MIN_WIDTH_P-MenuPane.WIDTH);
|
||||
}
|
||||
//if the cutout is positioned to obstruct the HP bar
|
||||
if (cutout.left < 78
|
||||
else if (cutout.left < 78
|
||||
&& cutout.top < 4
|
||||
&& cutout.right > 32) {
|
||||
//subtract starting position, but add a bit back due to end of bar
|
||||
@@ -399,13 +404,26 @@ public class GameScene extends PixelScene {
|
||||
hpBarMaxWidth = Math.max(hpBarMaxWidth, 21); //cannot go below 21 (30 effective)
|
||||
}
|
||||
//if the cutout is positioned to obstruct the buff bar
|
||||
if (cutout.left < 80
|
||||
if (cutout.left < 84
|
||||
&& cutout.top < 10
|
||||
&& cutout.right > 32
|
||||
&& cutout.bottom > 11) {
|
||||
buffBarTopRowMaxWidth = cutout.left - 32; //subtract starting position
|
||||
int i = 1;
|
||||
int rowTop = 11;
|
||||
//in most cases this just obstructs one row, but dynamic island can block more =S
|
||||
while (cutout.bottom > rowTop){
|
||||
if (i == 1 || cutout.bottom > rowTop+2 ) { //always shorten first row
|
||||
//subtract starting position, add a bit back to allow slight overlap
|
||||
buffBarRowLimits[i] = cutout.left - 32 + 3;
|
||||
} else {
|
||||
//if row is only slightly cut off, lower it instead of limiting width
|
||||
buffBarRowAdjusts[i] = cutout.bottom - rowTop + 1;
|
||||
rowTop += buffBarRowAdjusts[i];
|
||||
}
|
||||
i++;
|
||||
rowTop += 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float screentop = largeInsetTop;
|
||||
@@ -432,8 +450,10 @@ public class GameScene extends PixelScene {
|
||||
|
||||
status = new StatusPane( SPDSettings.interfaceSize() > 0 );
|
||||
status.camera = uiCamera;
|
||||
StatusPane.heroPaneExtraWidth = heroPaneExtraWidth;
|
||||
StatusPane.hpBarMaxWidth = hpBarMaxWidth;
|
||||
StatusPane.buffBarTopRowMaxWidth = buffBarTopRowMaxWidth;
|
||||
StatusPane.buffBarRowMaxWidths = buffBarRowLimits;
|
||||
StatusPane.buffBarRowAdjusts = buffBarRowAdjusts;
|
||||
status.setRect(insets.left, uiSize > 0 ? uiCamera.height-39-insets.bottom : screentop, uiCamera.width - insets.left - insets.right, 0 );
|
||||
add(status);
|
||||
|
||||
@@ -449,7 +469,14 @@ public class GameScene extends PixelScene {
|
||||
|
||||
boss = new BossHealthBar();
|
||||
boss.camera = uiCamera;
|
||||
boss.setPos( (uiCamera.width - boss.width())/2, screentop + 26);
|
||||
boss.setPos( (uiCamera.width - boss.width())/2, screentop + (landscape() ? 7 : 26));
|
||||
if (buffBarRowLimits[2] != 0){
|
||||
//if we potentially have a 3rd buff bar row, lower by 7px
|
||||
boss.setPos(boss.left(), boss.top() + 7);
|
||||
} else if (buffBarRowAdjusts[2] != 0){
|
||||
//
|
||||
boss.setPos(boss.left(), boss.top() + buffBarRowAdjusts[2]);
|
||||
}
|
||||
add(boss);
|
||||
|
||||
resume = new ResumeIndicator();
|
||||
@@ -513,7 +540,17 @@ public class GameScene extends PixelScene {
|
||||
new Flare( 5, 16 ).color( 0xFFFF00, true ).show( hero, 4f ) ;
|
||||
break;
|
||||
case RETURN:
|
||||
ScrollOfTeleportation.appearVFX( Dungeon.hero );
|
||||
if (Dungeon.level.pit[Dungeon.hero.pos] && !Dungeon.hero.flying){
|
||||
//delay this so falling into the chasm processes properly
|
||||
ShatteredPixelDungeon.runOnRenderThread(new Callback() {
|
||||
@Override
|
||||
public void call() {
|
||||
ScrollOfTeleportation.appearVFX(Dungeon.hero);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
ScrollOfTeleportation.appearVFX(Dungeon.hero);
|
||||
}
|
||||
break;
|
||||
case DESCEND:
|
||||
case FALL:
|
||||
@@ -995,29 +1032,21 @@ public class GameScene extends PixelScene {
|
||||
customWalls.add( visual.create() );
|
||||
}
|
||||
|
||||
private void addHeapSprite( Heap heap ) {
|
||||
private synchronized void addHeapSprite( Heap heap ) {
|
||||
ItemSprite sprite = heap.sprite = (ItemSprite)heaps.recycle( ItemSprite.class );
|
||||
sprite.revive();
|
||||
sprite.link( heap );
|
||||
heaps.add( sprite );
|
||||
}
|
||||
|
||||
private void addDiscardedSprite( Heap heap ) {
|
||||
private synchronized void addDiscardedSprite( Heap heap ) {
|
||||
heap.sprite = (DiscardedItemSprite)heaps.recycle( DiscardedItemSprite.class );
|
||||
heap.sprite.revive();
|
||||
heap.sprite.link( heap );
|
||||
heaps.add( heap.sprite );
|
||||
}
|
||||
|
||||
private void addPlantSprite( Plant plant ) {
|
||||
|
||||
}
|
||||
|
||||
private void addTrapSprite( Trap trap ) {
|
||||
|
||||
}
|
||||
|
||||
private void addBlobSprite( final Blob gas ) {
|
||||
private synchronized void addBlobSprite( final Blob gas ) {
|
||||
if (gas.emitter == null) {
|
||||
gases.add( new BlobEmitter( gas ) );
|
||||
}
|
||||
@@ -1092,18 +1121,6 @@ public class GameScene extends PixelScene {
|
||||
}
|
||||
|
||||
// -------------------------------------------------------
|
||||
|
||||
public static void add( Plant plant ) {
|
||||
if (scene != null) {
|
||||
scene.addPlantSprite( plant );
|
||||
}
|
||||
}
|
||||
|
||||
public static void add( Trap trap ) {
|
||||
if (scene != null) {
|
||||
scene.addTrapSprite( trap );
|
||||
}
|
||||
}
|
||||
|
||||
public static void add( Blob gas ) {
|
||||
Actor.add( gas );
|
||||
@@ -1450,10 +1467,12 @@ public class GameScene extends PixelScene {
|
||||
@Override
|
||||
public void call() {
|
||||
//greater than 0 to account for negative values (which have the first bit set to 1)
|
||||
if (color > 0 && color < 0x01000000) {
|
||||
scene.fadeIn(0xFF000000 | color, lightmode);
|
||||
} else {
|
||||
scene.fadeIn(color, lightmode);
|
||||
if (scene != null) {
|
||||
if (color > 0 && color < 0x01000000) {
|
||||
scene.fadeIn(0xFF000000 | color, lightmode);
|
||||
} else {
|
||||
scene.fadeIn(color, lightmode);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -47,6 +47,7 @@ import com.watabou.noosa.BitmapText;
|
||||
import com.watabou.noosa.Camera;
|
||||
import com.watabou.noosa.Image;
|
||||
import com.watabou.noosa.audio.Music;
|
||||
import com.watabou.utils.DeviceCompat;
|
||||
import com.watabou.utils.GameMath;
|
||||
import com.watabou.utils.RectF;
|
||||
|
||||
@@ -147,7 +148,7 @@ public class RankingsScene extends PixelScene {
|
||||
btnExit.setPos( Camera.main.width - btnExit.width() - insets.right, insets.top );
|
||||
add( btnExit );
|
||||
|
||||
float left = insets.left + (PixelScene.landscape() ? 10 : 0);
|
||||
float left = insets.left + (PixelScene.landscape() && !DeviceCompat.isDesktop() ? 10 : 0);
|
||||
|
||||
if (Rankings.INSTANCE.latestDaily != null) {
|
||||
IconButton btnDailies = new IconButton(Icons.CALENDAR.get()) {
|
||||
|
||||
@@ -37,6 +37,7 @@ import com.shatteredpixel.shatteredpixeldungeon.services.updates.AvailableUpdate
|
||||
import com.shatteredpixel.shatteredpixeldungeon.services.updates.Updates;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.ExitButton;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.IconButton;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.StyledButton;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ui.TitleBackground;
|
||||
@@ -45,19 +46,41 @@ import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.windows.WndSettings;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.windows.WndVictoryCongrats;
|
||||
import com.watabou.glwrap.Blending;
|
||||
import com.watabou.input.PointerEvent;
|
||||
import com.watabou.noosa.BitmapText;
|
||||
import com.watabou.noosa.Camera;
|
||||
import com.watabou.noosa.Game;
|
||||
import com.watabou.noosa.Image;
|
||||
import com.watabou.noosa.PointerArea;
|
||||
import com.watabou.noosa.audio.Music;
|
||||
import com.watabou.noosa.tweeners.Tweener;
|
||||
import com.watabou.utils.ColorMath;
|
||||
import com.watabou.utils.DeviceCompat;
|
||||
import com.watabou.utils.GameMath;
|
||||
import com.watabou.utils.RectF;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
public class TitleScene extends PixelScene {
|
||||
|
||||
|
||||
private Image title;
|
||||
private Fireball leftFB;
|
||||
private Fireball rightFB;
|
||||
private Image signs;
|
||||
|
||||
private StyledButton btnPlay;
|
||||
private StyledButton btnSupport;
|
||||
private StyledButton btnRankings;
|
||||
private StyledButton btnJournal;
|
||||
private StyledButton btnNews;
|
||||
private StyledButton btnChanges;
|
||||
private StyledButton btnSettings;
|
||||
private StyledButton btnAbout;
|
||||
|
||||
private BitmapText version;
|
||||
private IconButton btnFade;
|
||||
private ExitButton btnExit;
|
||||
|
||||
@Override
|
||||
public void create() {
|
||||
|
||||
@@ -81,7 +104,7 @@ public class TitleScene extends PixelScene {
|
||||
w -= insets.left + insets.right;
|
||||
h -= insets.top + insets.bottom;
|
||||
|
||||
Image title = BannerSprites.get( landscape() ? BannerSprites.Type.TITLE_LAND : BannerSprites.Type.TITLE_PORT);
|
||||
title = BannerSprites.get( landscape() ? BannerSprites.Type.TITLE_LAND : BannerSprites.Type.TITLE_PORT);
|
||||
add( title );
|
||||
|
||||
float topRegion = Math.max(title.height - 6, h*0.45f);
|
||||
@@ -92,19 +115,20 @@ public class TitleScene extends PixelScene {
|
||||
align(title);
|
||||
|
||||
if (landscape()){
|
||||
placeTorch(title.x + 30, title.y + 35);
|
||||
placeTorch(title.x + title.width - 30, title.y + 35);
|
||||
leftFB = placeTorch(title.x + 30, title.y + 35);
|
||||
rightFB = placeTorch(title.x + title.width - 30, title.y + 35);
|
||||
} else {
|
||||
placeTorch(title.x + 16, title.y + 70);
|
||||
placeTorch(title.x + title.width - 16, title.y + 70);
|
||||
leftFB = placeTorch(title.x + 16, title.y + 70);
|
||||
rightFB = placeTorch(title.x + title.width - 16, title.y + 70);
|
||||
}
|
||||
|
||||
Image signs = new Image(BannerSprites.get( landscape() ? BannerSprites.Type.TITLE_GLOW_LAND : BannerSprites.Type.TITLE_GLOW_PORT)){
|
||||
signs = new Image(BannerSprites.get( landscape() ? BannerSprites.Type.TITLE_GLOW_LAND : BannerSprites.Type.TITLE_GLOW_PORT)){
|
||||
private float time = 0;
|
||||
@Override
|
||||
public void update() {
|
||||
super.update();
|
||||
am = Math.max(0f, (float)Math.sin( time += Game.elapsed ));
|
||||
am = Math.min(am, title.am);
|
||||
if (time >= 1.5f*Math.PI) time = 0;
|
||||
}
|
||||
@Override
|
||||
@@ -120,7 +144,7 @@ public class TitleScene extends PixelScene {
|
||||
|
||||
final Chrome.Type GREY_TR = Chrome.Type.GREY_BUTTON_TR;
|
||||
|
||||
StyledButton btnPlay = new StyledButton(GREY_TR, Messages.get(this, "enter")){
|
||||
btnPlay = new StyledButton(GREY_TR, Messages.get(this, "enter")){
|
||||
@Override
|
||||
protected void onClick() {
|
||||
if (GamesInProgress.checkAll().size() == 0){
|
||||
@@ -147,10 +171,10 @@ public class TitleScene extends PixelScene {
|
||||
btnPlay.icon(Icons.get(Icons.ENTER));
|
||||
add(btnPlay);
|
||||
|
||||
StyledButton btnSupport = new SupportButton(GREY_TR, Messages.get(this, "support"));
|
||||
btnSupport = new SupportButton(GREY_TR, Messages.get(this, "support"));
|
||||
add(btnSupport);
|
||||
|
||||
StyledButton btnRankings = new StyledButton(GREY_TR,Messages.get(this, "rankings")){
|
||||
btnRankings = new StyledButton(GREY_TR,Messages.get(this, "rankings")){
|
||||
@Override
|
||||
protected void onClick() {
|
||||
ShatteredPixelDungeon.switchNoFade( RankingsScene.class );
|
||||
@@ -160,27 +184,27 @@ public class TitleScene extends PixelScene {
|
||||
add(btnRankings);
|
||||
Dungeon.daily = Dungeon.dailyReplay = false;
|
||||
|
||||
StyledButton btnBadges = new StyledButton(GREY_TR, Messages.get(this, "journal")){
|
||||
btnJournal = new StyledButton(GREY_TR, Messages.get(this, "journal")){
|
||||
@Override
|
||||
protected void onClick() {
|
||||
ShatteredPixelDungeon.switchNoFade( JournalScene.class );
|
||||
}
|
||||
};
|
||||
btnBadges.icon(Icons.get(Icons.JOURNAL));
|
||||
add(btnBadges);
|
||||
btnJournal.icon(Icons.get(Icons.JOURNAL));
|
||||
add(btnJournal);
|
||||
|
||||
StyledButton btnNews = new NewsButton(GREY_TR, Messages.get(this, "news"));
|
||||
btnNews = new NewsButton(GREY_TR, Messages.get(this, "news"));
|
||||
btnNews.icon(Icons.get(Icons.NEWS));
|
||||
add(btnNews);
|
||||
|
||||
StyledButton btnChanges = new ChangesButton(GREY_TR, Messages.get(this, "changes"));
|
||||
btnChanges = new ChangesButton(GREY_TR, Messages.get(this, "changes"));
|
||||
btnChanges.icon(Icons.get(Icons.CHANGES));
|
||||
add(btnChanges);
|
||||
|
||||
StyledButton btnSettings = new SettingsButton(GREY_TR, Messages.get(this, "settings"));
|
||||
btnSettings = new SettingsButton(GREY_TR, Messages.get(this, "settings"));
|
||||
add(btnSettings);
|
||||
|
||||
StyledButton btnAbout = new StyledButton(GREY_TR, Messages.get(this, "about")){
|
||||
btnAbout = new StyledButton(GREY_TR, Messages.get(this, "about")){
|
||||
@Override
|
||||
protected void onClick() {
|
||||
ShatteredPixelDungeon.switchScene( AboutScene.class );
|
||||
@@ -201,8 +225,8 @@ public class TitleScene extends PixelScene {
|
||||
align(btnPlay);
|
||||
btnSupport.setRect(btnPlay.right()+2, btnPlay.top(), btnPlay.width(), BTN_HEIGHT);
|
||||
btnRankings.setRect(btnPlay.left(), btnPlay.bottom()+ GAP, (float) (Math.floor(buttonAreaWidth/3f)-1), BTN_HEIGHT);
|
||||
btnBadges.setRect(btnRankings.right()+2, btnRankings.top(), btnRankings.width(), BTN_HEIGHT);
|
||||
btnNews.setRect(btnBadges.right()+2, btnBadges.top(), btnRankings.width(), BTN_HEIGHT);
|
||||
btnJournal.setRect(btnRankings.right()+2, btnRankings.top(), btnRankings.width(), BTN_HEIGHT);
|
||||
btnNews.setRect(btnJournal.right()+2, btnJournal.top(), btnRankings.width(), BTN_HEIGHT);
|
||||
btnSettings.setRect(btnRankings.left(), btnRankings.bottom() + GAP, btnRankings.width(), BTN_HEIGHT);
|
||||
btnChanges.setRect(btnSettings.right()+2, btnSettings.top(), btnRankings.width(), BTN_HEIGHT);
|
||||
btnAbout.setRect(btnChanges.right()+2, btnSettings.top(), btnRankings.width(), BTN_HEIGHT);
|
||||
@@ -211,23 +235,62 @@ public class TitleScene extends PixelScene {
|
||||
align(btnPlay);
|
||||
btnSupport.setRect(btnPlay.left(), btnPlay.bottom()+ GAP, btnPlay.width(), BTN_HEIGHT);
|
||||
btnRankings.setRect(btnPlay.left(), btnSupport.bottom()+ GAP, (btnPlay.width()/2)-1, BTN_HEIGHT);
|
||||
btnBadges.setRect(btnRankings.right()+2, btnRankings.top(), btnRankings.width(), BTN_HEIGHT);
|
||||
btnJournal.setRect(btnRankings.right()+2, btnRankings.top(), btnRankings.width(), BTN_HEIGHT);
|
||||
btnNews.setRect(btnRankings.left(), btnRankings.bottom()+ GAP, btnRankings.width(), BTN_HEIGHT);
|
||||
btnChanges.setRect(btnNews.right()+2, btnNews.top(), btnNews.width(), BTN_HEIGHT);
|
||||
btnSettings.setRect(btnNews.left(), btnNews.bottom()+GAP, btnRankings.width(), BTN_HEIGHT);
|
||||
btnAbout.setRect(btnSettings.right()+2, btnSettings.top(), btnSettings.width(), BTN_HEIGHT);
|
||||
}
|
||||
|
||||
BitmapText version = new BitmapText( "v" + Game.version, pixelFont);
|
||||
version = new BitmapText( "v" + Game.version, pixelFont);
|
||||
version.measure();
|
||||
version.hardlight( 0x888888 );
|
||||
//TODO perhaps extra check for Android top-right / top-left notches?
|
||||
version.x = insets.left + w - version.width() - 8;
|
||||
version.y = insets.top + h - version.height() - 4;
|
||||
version.x = insets.left + w - version.width() - (DeviceCompat.isDesktop() ? 4 : 8);
|
||||
version.y = insets.top + h - version.height() - (DeviceCompat.isDesktop() ? 2 : 4);
|
||||
add( version );
|
||||
|
||||
btnFade = new IconButton(Icons.CHEVRON.get()){
|
||||
@Override
|
||||
protected void onClick() {
|
||||
enable(false);
|
||||
parent.add(new Tweener(parent, 0.5f) {
|
||||
@Override
|
||||
protected void updateValues(float progress) {
|
||||
if (!btnFade.active) {
|
||||
uiAlpha = 1 - progress;
|
||||
updateFade();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
btnFade.icon().originToCenter();
|
||||
btnFade.icon().angle = 180f;
|
||||
btnFade.setRect(btnAreaLeft + (buttonAreaWidth-16)/2, camera.main.height - 16 - insets.bottom, 16, 16);
|
||||
add(btnFade);
|
||||
|
||||
PointerArea fadeResetter = new PointerArea(0, 0, Camera.main.width, Camera.main.height){
|
||||
@Override
|
||||
public boolean onSignal(PointerEvent event) {
|
||||
if (event != null && event.type == PointerEvent.Type.UP && !btnPlay.active){
|
||||
parent.add(new Tweener(parent, 0.5f) {
|
||||
@Override
|
||||
protected void updateValues(float progress) {
|
||||
uiAlpha = progress;
|
||||
updateFade();
|
||||
if (progress >= 1){
|
||||
btnFade.enable(true);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
add(fadeResetter);
|
||||
|
||||
if (DeviceCompat.isDesktop()) {
|
||||
ExitButton btnExit = new ExitButton();
|
||||
btnExit = new ExitButton();
|
||||
btnExit.setPos( w - btnExit.width(), 0 );
|
||||
add( btnExit );
|
||||
}
|
||||
@@ -241,13 +304,51 @@ public class TitleScene extends PixelScene {
|
||||
fadeIn();
|
||||
}
|
||||
|
||||
private void placeTorch( float x, float y ) {
|
||||
private float uiAlpha;
|
||||
|
||||
public void updateFade() {
|
||||
float alpha = GameMath.gate(0f, uiAlpha, 1f);
|
||||
|
||||
title.am = alpha;
|
||||
leftFB.am = alpha;
|
||||
rightFB.am = alpha;
|
||||
//signs.am = alpha; handles this itself
|
||||
|
||||
btnPlay.enable(alpha != 0);
|
||||
btnSupport.enable(alpha != 0);
|
||||
btnRankings.enable(alpha != 0);
|
||||
btnJournal.enable(alpha != 0);
|
||||
btnNews.enable(alpha != 0);
|
||||
btnChanges.enable(alpha != 0);
|
||||
btnSettings.enable(alpha != 0);
|
||||
btnAbout.enable(alpha != 0);
|
||||
|
||||
btnPlay.alpha(alpha);
|
||||
btnSupport.alpha(alpha);
|
||||
btnRankings.alpha(alpha);
|
||||
btnJournal.alpha(alpha);
|
||||
btnNews.alpha(alpha);
|
||||
btnChanges.alpha(alpha);
|
||||
btnSettings.alpha(alpha);
|
||||
btnAbout.alpha(alpha);
|
||||
|
||||
version.alpha(alpha);
|
||||
btnFade.icon().alpha(alpha);
|
||||
if (btnExit != null){
|
||||
btnExit.enable(alpha != 0);
|
||||
btnExit.icon().alpha(alpha);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private Fireball placeTorch(float x, float y ) {
|
||||
Fireball fb = new Fireball();
|
||||
fb.x = x - fb.width()/2f;
|
||||
fb.y = y - fb.height();
|
||||
|
||||
align(fb);
|
||||
add( fb );
|
||||
return fb;
|
||||
}
|
||||
|
||||
private static class NewsButton extends StyledButton {
|
||||
|
||||
@@ -207,7 +207,7 @@ public class WelcomeScene extends PixelScene {
|
||||
//TODO: change the messages here in accordance with the type of patch.
|
||||
message = Messages.get(this, "patch_intro");
|
||||
message += "\n";
|
||||
//message += "\n" + Messages.get(this, "patch_balance");
|
||||
message += "\n" + Messages.get(this, "patch_balance");
|
||||
message += "\n" + Messages.get(this, "patch_bugfixes");
|
||||
message += "\n" + Messages.get(this, "patch_translations");
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ public class WallBlockingTilemap extends Tilemap {
|
||||
} else {
|
||||
|
||||
//Block the side of an internal wall if:
|
||||
//- the cell above, below, or the cell itself is visible
|
||||
//- any cells above, the one directly below, or the cell itself is visible
|
||||
//and all of the following are NOT true:
|
||||
//- the cell has no neighbours on that side
|
||||
//- the top-side neighbour is visible and the side neighbour isn't a wall.
|
||||
@@ -149,6 +149,8 @@ public class WallBlockingTilemap extends Tilemap {
|
||||
curr = BLOCK_NONE;
|
||||
|
||||
if (!fogHidden(cell - mapWidth)
|
||||
|| !fogHidden(cell - mapWidth - 1)
|
||||
|| !fogHidden(cell - mapWidth + 1)
|
||||
|| !fogHidden(cell)
|
||||
|| !fogHidden(cell + mapWidth)) {
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ package com.shatteredpixel.shatteredpixeldungeon.ui;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.SPDSettings;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BloodParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
@@ -32,13 +34,13 @@ import com.watabou.noosa.BitmapText;
|
||||
import com.watabou.noosa.Image;
|
||||
import com.watabou.noosa.particles.Emitter;
|
||||
import com.watabou.noosa.ui.Component;
|
||||
import com.watabou.utils.Callback;
|
||||
|
||||
public class BossHealthBar extends Component {
|
||||
|
||||
private Image bar;
|
||||
|
||||
private Image rawShielding;
|
||||
private Image shieldedHP;
|
||||
private Image shieldHP;
|
||||
private Image hp;
|
||||
private BitmapText hpText;
|
||||
|
||||
@@ -55,6 +57,8 @@ public class BossHealthBar extends Component {
|
||||
private static BossHealthBar instance;
|
||||
private static boolean bleeding;
|
||||
|
||||
private boolean large;
|
||||
|
||||
public BossHealthBar() {
|
||||
super();
|
||||
visible = active = (boss != null);
|
||||
@@ -70,20 +74,18 @@ public class BossHealthBar extends Component {
|
||||
|
||||
@Override
|
||||
protected void createChildren() {
|
||||
bar = new Image(asset, 0, 0, 64, 16);
|
||||
this.large = SPDSettings.interfaceSize() != 0;
|
||||
|
||||
bar = large ? new Image(asset, 0, 16, 128, 30) : new Image(asset, 0, 0, 64, 16);
|
||||
add(bar);
|
||||
|
||||
width = bar.width;
|
||||
height = bar.height;
|
||||
|
||||
rawShielding = new Image(asset, 15, 25, 47, 4);
|
||||
rawShielding.alpha(0.5f);
|
||||
add(rawShielding);
|
||||
shieldHP = large ? new Image(asset, 0, 55, 96, 9) : new Image(asset, 71, 5, 47, 4);
|
||||
add(shieldHP);
|
||||
|
||||
shieldedHP = new Image(asset, 15, 25, 47, 4);
|
||||
add(shieldedHP);
|
||||
|
||||
hp = new Image(asset, 15, 19, 47, 4);
|
||||
hp = large ? new Image(asset, 0, 46, 96, 9) : new Image(asset, 71, 0, 47, 4);
|
||||
add(hp);
|
||||
|
||||
hpText = new BitmapText(PixelScene.pixelFont);
|
||||
@@ -110,12 +112,16 @@ public class BossHealthBar extends Component {
|
||||
add(bossInfo);
|
||||
|
||||
if (boss != null) {
|
||||
buffs = new BuffIndicator(boss, false);
|
||||
buffs = new BuffIndicator(boss, large);
|
||||
BuffIndicator.setBossInstance(buffs);
|
||||
add(buffs);
|
||||
}
|
||||
|
||||
skull = new Image(asset, 5, 18, 6, 6);
|
||||
if (boss != null && large) {
|
||||
skull = boss.sprite();
|
||||
} else {
|
||||
skull = new Image(asset, 64, 0, 6, 6);
|
||||
}
|
||||
add(skull);
|
||||
|
||||
blood = new Emitter();
|
||||
@@ -131,11 +137,11 @@ public class BossHealthBar extends Component {
|
||||
bar.x = x;
|
||||
bar.y = y;
|
||||
|
||||
hp.x = shieldedHP.x = rawShielding.x = bar.x+15;
|
||||
hp.y = shieldedHP.y = rawShielding.y = bar.y+3;
|
||||
hp.x = shieldHP.x = bar.x+(large ? 30 : 15);
|
||||
hp.y = shieldHP.y = bar.y+(large ? 2 : 3);
|
||||
|
||||
hpText.scale.set(PixelScene.align(0.5f));
|
||||
hpText.x = hp.x + 1;
|
||||
if (!large) hpText.scale.set(PixelScene.align(0.5f));
|
||||
hpText.x = hp.x + (large ? (96-hpText.width())/2f : 1);
|
||||
hpText.y = hp.y + (hp.height - (hpText.baseLine()+hpText.scale.y))/2f;
|
||||
hpText.y -= 0.001f; //prefer to be slightly higher
|
||||
PixelScene.align(hpText);
|
||||
@@ -143,11 +149,18 @@ public class BossHealthBar extends Component {
|
||||
bossInfo.setRect(x, y, bar.width, bar.height);
|
||||
|
||||
if (buffs != null) {
|
||||
buffs.setRect(hp.x, hp.y + 5, 47, 8);
|
||||
buffs.maxBuffs = 12;
|
||||
if (large) {
|
||||
//little extra width here for a 6th column
|
||||
buffs.setRect(hp.x+1, hp.y + 12, 102, 34);
|
||||
} else {
|
||||
buffs.setRect(hp.x, hp.y + 5, 47, 16);
|
||||
}
|
||||
}
|
||||
|
||||
skull.x = bar.x+5;
|
||||
skull.y = bar.y+5;
|
||||
int paneSize = large ? 30 : 16;
|
||||
skull.x = bar.x + (paneSize - skull.width())/2f;
|
||||
skull.y = bar.y + (paneSize - skull.height())/2f;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -169,13 +182,23 @@ public class BossHealthBar extends Component {
|
||||
int shield = boss.shielding();
|
||||
int max = boss.HT;
|
||||
|
||||
hp.scale.x = Math.max( 0, (health-shield)/(float)max);
|
||||
shieldedHP.scale.x = health/(float)max;
|
||||
rawShielding.scale.x = shield/(float)max;
|
||||
float healthPercent = health/(float)max;
|
||||
float shieldPercent = shield/(float)max;
|
||||
|
||||
if (healthPercent + shieldPercent > 1f){
|
||||
float excess = healthPercent + shieldPercent;
|
||||
healthPercent /= excess;
|
||||
shieldPercent /= excess;
|
||||
}
|
||||
|
||||
hp.scale.x = healthPercent;
|
||||
shieldHP.scale.x = healthPercent + shieldPercent;
|
||||
|
||||
if (bleeding != blood.on){
|
||||
if (bleeding) skull.tint( 0xcc0000, 0.6f );
|
||||
if (bleeding) skull.tint( 0xcc0000, large ? 0.3f : 0.6f );
|
||||
else skull.resetColor();
|
||||
bringToFront(blood);
|
||||
blood.pos(skull);
|
||||
blood.on = bleeding;
|
||||
}
|
||||
|
||||
@@ -184,6 +207,8 @@ public class BossHealthBar extends Component {
|
||||
} else {
|
||||
hpText.text(health + "+" + shield + "/" + max);
|
||||
}
|
||||
hpText.measure();
|
||||
hpText.x = hp.x + (large ? (96-hpText.width())/2f : 1);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -196,17 +221,30 @@ public class BossHealthBar extends Component {
|
||||
BossHealthBar.boss = boss;
|
||||
bleed(false);
|
||||
if (instance != null) {
|
||||
instance.visible = instance.active = true;
|
||||
if (boss != null){
|
||||
if (instance.buffs != null){
|
||||
instance.remove(instance.buffs);
|
||||
instance.buffs.destroy();
|
||||
ShatteredPixelDungeon.runOnRenderThread(new Callback() {
|
||||
@Override
|
||||
public void call() {
|
||||
instance.visible = instance.active = true;
|
||||
if (boss != null){
|
||||
if (instance.large){
|
||||
if (instance.skull != null){
|
||||
instance.remove(instance.skull);
|
||||
instance.skull.destroy();
|
||||
}
|
||||
instance.skull = boss.sprite();
|
||||
instance.add(instance.skull);
|
||||
}
|
||||
if (instance.buffs != null){
|
||||
instance.remove(instance.buffs);
|
||||
instance.buffs.destroy();
|
||||
}
|
||||
instance.buffs = new BuffIndicator(boss, instance.large);
|
||||
BuffIndicator.setBossInstance(instance.buffs);
|
||||
instance.add(instance.buffs);
|
||||
instance.layout();
|
||||
}
|
||||
}
|
||||
instance.buffs = new BuffIndicator(boss, false);
|
||||
BuffIndicator.setBossInstance(instance.buffs);
|
||||
instance.add(instance.buffs);
|
||||
instance.layout();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -149,7 +149,10 @@ public class BuffIndicator extends Component {
|
||||
|
||||
private boolean large = false;
|
||||
|
||||
public float firstRowWidth = -1;
|
||||
//in some cases we want to limit some rows but not all by just reducing width
|
||||
public float[] rowWidthLimits = new float[9]; //0 = no limit
|
||||
//sometimes we also need to slightly lower a row, to avoid having to cut off width
|
||||
public float[] rowHeightAdjusts = new float[9]; //0 = default adjust of 1
|
||||
|
||||
public BuffIndicator( Char ch, boolean large ) {
|
||||
super();
|
||||
@@ -180,6 +183,7 @@ public class BuffIndicator extends Component {
|
||||
}
|
||||
|
||||
private boolean buffsHidden = false;
|
||||
public int maxBuffs = 14; //by default
|
||||
|
||||
@Override
|
||||
protected void layout() {
|
||||
@@ -228,33 +232,34 @@ public class BuffIndicator extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
//TODO several aspects of the layout code have been a bit hackily changed to support 2 rows
|
||||
// should clean this up
|
||||
|
||||
//layout
|
||||
int row = 0;
|
||||
int row = 1;
|
||||
float rowTop = 0;
|
||||
int pos = 0;
|
||||
float lastIconLeft = 0;
|
||||
float lastIconRight = 0;
|
||||
int total = 0;
|
||||
for (BuffButton icon : buffButtons.values()){
|
||||
if (total >= 14){ //buff bar supports a max of 14 buffs at once
|
||||
if (total >= maxBuffs){
|
||||
icon.visible = false;
|
||||
continue;
|
||||
}
|
||||
icon.visible = true;
|
||||
|
||||
icon.topOffset = (row > 0 && !large) ? -1 : 0;
|
||||
//offset is needed to handle adjusting oversized click boxes on multiple rows
|
||||
icon.topOffset = (row > 1 && !large) ? -1 : 0;
|
||||
icon.updateIcon();
|
||||
//button areas are slightly oversized, especially on small buttons
|
||||
icon.setRect(x + pos * (size + 1), y + row*(size+1)-icon.topOffset, size + 1, size + (large ? 0 : 5));
|
||||
icon.setRect(x + pos * (size + 1), y + rowTop-icon.topOffset, size + 1, size + (large ? 0 : 5));
|
||||
PixelScene.align(icon);
|
||||
pos++;
|
||||
|
||||
lastIconLeft = icon.left();
|
||||
lastIconRight = icon.right()-1;
|
||||
|
||||
if ((row+1)*(size+1) <= height
|
||||
&& (pos * (size + 1) > width || (row == 0 && firstRowWidth != -1 && pos * (size + 1) > firstRowWidth))){
|
||||
//if we're out of overall width but have more height, or this row has hits its limit
|
||||
if ((rowTop+2*size+2 <= height && (pos * (size + 1) + size > width))
|
||||
|| (rowWidthLimits[row] != 0 && pos * (size + 1) + size > rowWidthLimits[row])){
|
||||
row++;
|
||||
rowTop += size+1 + rowHeightAdjusts[row];
|
||||
pos = 0;
|
||||
}
|
||||
total++;
|
||||
@@ -262,15 +267,15 @@ public class BuffIndicator extends Component {
|
||||
|
||||
buffsHidden = false;
|
||||
//squish buff icons together if there isn't enough room
|
||||
float excessWidth = lastIconLeft - right();
|
||||
float excessWidth = lastIconRight - right();
|
||||
|
||||
if (excessWidth > 0) {
|
||||
//if multiple rows, only compress last row
|
||||
ArrayList<BuffButton> buttons = new ArrayList<>();
|
||||
float lastRowY = y + row*(size+1);
|
||||
float lastRowY = PixelScene.align(y + rowTop);
|
||||
int i = 1;
|
||||
for (BuffButton button : buffButtons.values()){
|
||||
if (i > 14){
|
||||
if (i > maxBuffs){
|
||||
button.visible = false;
|
||||
buffsHidden = true;
|
||||
continue;
|
||||
@@ -282,12 +287,14 @@ public class BuffIndicator extends Component {
|
||||
}
|
||||
|
||||
float leftAdjust = excessWidth/(buttons.size()-1);
|
||||
//can't squish by more than 50%
|
||||
if (leftAdjust >= size*0.48f) leftAdjust = size*0.5f;
|
||||
float cumulativeAdjust = leftAdjust * (buttons.size()-1);
|
||||
|
||||
Collections.reverse(buttons);
|
||||
for (BuffButton icon : buttons) {
|
||||
icon.setPos(icon.left() - cumulativeAdjust, icon.top());
|
||||
icon.visible = icon.left() <= right();
|
||||
icon.visible = icon.right() <= right()+1;
|
||||
if (!icon.visible) buffsHidden = true;
|
||||
PixelScene.align(icon);
|
||||
bringToFront(icon);
|
||||
|
||||
@@ -82,7 +82,7 @@ public class MenuPane extends Component {
|
||||
add(versionOverflowBG);
|
||||
|
||||
version = new BitmapText( "v" + Game.version , PixelScene.pixelFont);
|
||||
version.alpha( 0.5f );
|
||||
version.hardlight( 0xCACFC2 );
|
||||
add(version);
|
||||
|
||||
depthIcon = Icons.get(Dungeon.level.feeling);
|
||||
|
||||
@@ -349,6 +349,9 @@ public class QuickSlotButton extends Button {
|
||||
|
||||
//FIXME: this is currently very expensive, should either optimize ballistica or this, or both
|
||||
public static int autoAim(Char target, Item item){
|
||||
if (Dungeon.hero == null){
|
||||
return -1;
|
||||
}
|
||||
|
||||
//first try to directly target
|
||||
if (item.targetingPos(Dungeon.hero, target.pos) == target.pos) {
|
||||
|
||||
@@ -57,8 +57,7 @@ public class StatusPane extends Component {
|
||||
|
||||
private int lastTier = 0;
|
||||
|
||||
private Image rawShielding;
|
||||
private Image shieldedHP;
|
||||
private Image shieldHP;
|
||||
private Image hp;
|
||||
private BitmapText hpText;
|
||||
private Button heroInfoOnBar;
|
||||
@@ -78,11 +77,15 @@ public class StatusPane extends Component {
|
||||
|
||||
private boolean large;
|
||||
|
||||
//potentially extends the hero portrait space to avoid some cutouts
|
||||
public static float heroPaneExtraWidth = 0;
|
||||
private NinePatch heroPaneCutout;
|
||||
//potentially shrinks and/or repositions the hp bar to avoid some cutouts
|
||||
public static int hpBarMaxWidth = 50;
|
||||
private Image hpCutout;
|
||||
//potentially cuts off the top row of the the buff indicator to avoid some cutouts
|
||||
public static float buffBarTopRowMaxWidth = 50;
|
||||
//potentially adjusts the row(s) of the the buff indicator to avoid some cutouts
|
||||
public static float[] buffBarRowMaxWidths;
|
||||
public static float[] buffBarRowAdjusts;
|
||||
|
||||
public StatusPane( boolean large ){
|
||||
super();
|
||||
@@ -95,6 +98,10 @@ public class StatusPane extends Component {
|
||||
else bg = new NinePatch( asset, 0, 0, 82, 38, 32, 0, 5, 0 );
|
||||
add( bg );
|
||||
|
||||
heroPaneCutout = new NinePatch(asset, 0, 0, 5, 36, 4, 0, 0, 0);
|
||||
heroPaneCutout.visible = false;
|
||||
add(heroPaneCutout);
|
||||
|
||||
hpCutout = new Image(asset, 90, 0, 12, 9);
|
||||
hpCutout.visible = false;
|
||||
add(hpCutout);
|
||||
@@ -126,14 +133,9 @@ public class StatusPane extends Component {
|
||||
compass = new Compass( Statistics.amuletObtained ? Dungeon.level.entrance() : Dungeon.level.exit() );
|
||||
add( compass );
|
||||
|
||||
if (large) rawShielding = new Image(asset, 0, 112, 128, 9);
|
||||
else rawShielding = new Image(asset, 0, 44, 50, 4);
|
||||
rawShielding.alpha(0.5f);
|
||||
add(rawShielding);
|
||||
|
||||
if (large) shieldedHP = new Image(asset, 0, 112, 128, 9);
|
||||
else shieldedHP = new Image(asset, 0, 44, 50, 4);
|
||||
add(shieldedHP);
|
||||
if (large) shieldHP = new Image(asset, 0, 112, 128, 9);
|
||||
else shieldHP = new Image(asset, 0, 44, 50, 4);
|
||||
add(shieldHP);
|
||||
|
||||
if (large) hp = new Image(asset, 0, 103, 128, 9);
|
||||
else hp = new Image(asset, 0, 40, 50, 4);
|
||||
@@ -181,7 +183,9 @@ public class StatusPane extends Component {
|
||||
|
||||
height = large ? 39 : 38;
|
||||
|
||||
bg.x = x;
|
||||
float heroPaneWidth = 30 + heroPaneExtraWidth;
|
||||
|
||||
bg.x = x + heroPaneExtraWidth;
|
||||
bg.y = y;
|
||||
if (large) bg.size( 160, bg.height ); //HP bars must be 128px wide atm
|
||||
else bg.size(hpBarMaxWidth+32, bg.height ); //default max right is 50px health bar + 32
|
||||
@@ -190,7 +194,7 @@ public class StatusPane extends Component {
|
||||
avatar.y = bg.y - avatar.height / 2f + 16;
|
||||
PixelScene.align(avatar);
|
||||
|
||||
heroInfo.setRect( x, y, 30, large ? 40 : 36 );
|
||||
heroInfo.setRect( x, y, heroPaneWidth, large ? 40 : 36 );
|
||||
|
||||
compass.x = avatar.x + avatar.width / 2f - compass.origin.x;
|
||||
compass.y = avatar.y + avatar.height / 2f - compass.origin.y;
|
||||
@@ -200,8 +204,8 @@ public class StatusPane extends Component {
|
||||
exp.x = x + 30;
|
||||
exp.y = y + 30;
|
||||
|
||||
hp.x = shieldedHP.x = rawShielding.x = x + 30;
|
||||
hp.y = shieldedHP.y = rawShielding.y = y + 19;
|
||||
hp.x = shieldHP.x = x + 30;
|
||||
hp.y = shieldHP.y = y + 19;
|
||||
|
||||
hpText.x = hp.x + (128 - hpText.width())/2f;
|
||||
hpText.y = hp.y + 1;
|
||||
@@ -213,7 +217,8 @@ public class StatusPane extends Component {
|
||||
|
||||
heroInfoOnBar.setRect(heroInfo.right(), y + 19, 130, 20);
|
||||
|
||||
buffs.setRect(x + 31, y, 128, 16);
|
||||
//little extra for 14th buff
|
||||
buffs.setRect(x + 31, y, 142, 16);
|
||||
|
||||
busy.x = x + bg.width + 1;
|
||||
busy.y = y + bg.height - 9;
|
||||
@@ -221,7 +226,14 @@ public class StatusPane extends Component {
|
||||
exp.x = x+2;
|
||||
exp.y = y+30;
|
||||
|
||||
float hpleft = x + 30;
|
||||
if (heroPaneExtraWidth > 0){
|
||||
heroPaneCutout.visible = true;
|
||||
heroPaneCutout.x = x;
|
||||
heroPaneCutout.y = y;
|
||||
heroPaneCutout.size(heroPaneExtraWidth+4, heroPaneCutout.height);
|
||||
}
|
||||
|
||||
float hpleft = x + heroPaneWidth;
|
||||
if (hpBarMaxWidth < 82){
|
||||
//the class variable assumes the left of the bar can't move, but we can inset it 9px
|
||||
int hpWidth = (int)hpBarMaxWidth;
|
||||
@@ -233,12 +245,11 @@ public class StatusPane extends Component {
|
||||
hpCutout.y = y;
|
||||
}
|
||||
hp.frame(50-hpWidth, 40, 50, 4);
|
||||
shieldedHP.frame(50-hpWidth, 44, 50, 4);
|
||||
rawShielding.frame(50-hpWidth, 44, 50, 4);
|
||||
shieldHP.frame(50-hpWidth, 44, 50, 4);
|
||||
}
|
||||
|
||||
hp.x = shieldedHP.x = rawShielding.x = hpleft;
|
||||
hp.y = shieldedHP.y = rawShielding.y = y + 2;
|
||||
hp.x = shieldHP.x = hpleft;
|
||||
hp.y = shieldHP.y = y + 2;
|
||||
|
||||
hpText.scale.set(PixelScene.align(0.5f));
|
||||
hpText.x = hp.x + 1;
|
||||
@@ -254,8 +265,13 @@ public class StatusPane extends Component {
|
||||
|
||||
heroInfoOnBar.setRect(heroInfo.right(), y, 50, 9);
|
||||
|
||||
buffs.firstRowWidth = buffBarTopRowMaxWidth;
|
||||
buffs.setRect( x + 31, y + 8, 50, 15 );
|
||||
if (buffBarRowMaxWidths != null){
|
||||
buffs.rowWidthLimits = buffBarRowMaxWidths;
|
||||
}
|
||||
if (buffBarRowAdjusts != null){
|
||||
buffs.rowHeightAdjusts = buffBarRowAdjusts;
|
||||
}
|
||||
buffs.setRect( x + heroPaneWidth + 1, y + 8, 55, 16 );
|
||||
|
||||
busy.x = x + 1;
|
||||
busy.y = y + 37;
|
||||
@@ -291,15 +307,18 @@ public class StatusPane extends Component {
|
||||
avatar.resetColor();
|
||||
}
|
||||
|
||||
hp.scale.x = Math.max( 0, (health-shield)/(float)max);
|
||||
shieldedHP.scale.x = health/(float)max;
|
||||
float healthPercent = health/(float)max;
|
||||
float shieldPercent = shield/(float)max;
|
||||
|
||||
if (shield > health) {
|
||||
rawShielding.scale.x = Math.min(1, shield / (float) max);
|
||||
} else {
|
||||
rawShielding.scale.x = 0;
|
||||
if (healthPercent + shieldPercent > 1f){
|
||||
float excess = healthPercent + shieldPercent;
|
||||
healthPercent /= excess;
|
||||
shieldPercent /= excess;
|
||||
}
|
||||
|
||||
hp.scale.x = healthPercent;
|
||||
shieldHP.scale.x = healthPercent + shieldPercent;
|
||||
|
||||
if (oldHP != health || oldShield != shield || oldMax != max){
|
||||
if (shield <= 0) {
|
||||
hpText.text(health + "/" + max);
|
||||
@@ -322,7 +341,7 @@ public class StatusPane extends Component {
|
||||
expText.x = hp.x + (128 - expText.width())/2f;
|
||||
|
||||
} else {
|
||||
exp.scale.x = (17 / exp.width) * Dungeon.hero.exp / Dungeon.hero.maxExp();
|
||||
exp.scale.x = ((17 + heroPaneExtraWidth) / exp.width) * Dungeon.hero.exp / Dungeon.hero.maxExp();
|
||||
expText.text(Dungeon.hero.exp + "/" + Dungeon.hero.maxExp());
|
||||
}
|
||||
|
||||
@@ -342,7 +361,7 @@ public class StatusPane extends Component {
|
||||
} else {
|
||||
level.text( Integer.toString( lastLvl ) );
|
||||
level.measure();
|
||||
level.x = x + 25.5f - level.width() / 2f;
|
||||
level.x = x + heroPaneExtraWidth + 25.5f - level.width() / 2f;
|
||||
level.y = y + 31.0f - level.baseLine() / 2f;
|
||||
}
|
||||
PixelScene.align(level);
|
||||
@@ -364,9 +383,10 @@ public class StatusPane extends Component {
|
||||
public void alpha( float value ){
|
||||
value = GameMath.gate(0, value, 1f);
|
||||
bg.alpha(value);
|
||||
heroPaneCutout.alpha(value);
|
||||
hpCutout.alpha(value);
|
||||
avatar.alpha(value);
|
||||
rawShielding.alpha(0.5f*value);
|
||||
shieldedHP.alpha(value);
|
||||
shieldHP.alpha(value);
|
||||
hp.alpha(value);
|
||||
hpText.alpha(0.6f*value);
|
||||
exp.alpha(value);
|
||||
|
||||
@@ -86,6 +86,55 @@ public class v3_X_Changes {
|
||||
changes.hardlight(Window.TITLE_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes = new ChangeInfo("v3.2.5", false, null);
|
||||
changes.hardlight(Window.TITLE_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton( new ChangeButton(Icons.get(Icons.SHPX), "Dev Commentary",
|
||||
"v3.2.5 has a couple more small interface improvements and a bunch of little fixes. This should hopefully be the final patch for v3.2 as I move on to early work on the next update!"));
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.DISPLAY), "Interface Changes",
|
||||
"Two additions have been made to the game's UI:\n" +
|
||||
"**-** The Boss health bar is now larger on full size UI, taking advantage of the bigger space.\n" +
|
||||
"**-** The main menu now has a button to hide the interface, letting players look at the new background.\n" +
|
||||
"\n" +
|
||||
"Further tweaks have been made to the game's UI:\n" +
|
||||
"**-** Health bars now display shielding in addition to HP, instead of on top of it.\n" +
|
||||
"**-** The Hero status pane can now extend to the right to avoid cutouts on the top-left of the display, if there is room to do so.\n" +
|
||||
"**-** Improved how the hero buff bar handles large cutouts like the dynamic island\n" +
|
||||
"**-** Further increased the permissiveness of what cutouts the game tries to render around\n" +
|
||||
"**-** Brightened the background of the game version indicator to make it look less like an empty health bar.\n" +
|
||||
"**-** Fixed cases where Shattered would attempt to draw into cutouts when they weren't properly reported by the device."));
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.PREFS), Messages.get(ChangesScene.class, "misc"),
|
||||
"**-** Updated code libraries used to build Shattered's macOS distribution. This should fix the game taking unreasonably long to launch on some newer macs, but also means Shattered now requires at least macOS 10.12 Sierra, up from 10.10 Yosemite.\n" +
|
||||
"\n" +
|
||||
"**-** DM-300's rockfall attack now deals 6-12 damage (10-20 with badder bosses). This is for consistency with the rockfall attack done by the gnoll geomancer, and to prevent specific exploits where DM-300 couldn't damage hiding inorganic allies.\n" +
|
||||
"\n" +
|
||||
"**-** Levelling up the dried rose while the ghost hero is summoned now heals it for the same amount that the upgrade increases max HP."));
|
||||
|
||||
changes.addButton(new ChangeButton(new Image(Assets.Sprites.SPINNER, 144, 0, 16, 16), Messages.get(ChangesScene.class, "bugfixes"),
|
||||
"Fixed the following bugs:\n" +
|
||||
"**Caused by v3.2.X:**\n" +
|
||||
"**-** Thrown weapon merging prioritizing properties on weapons already stuck to enemies, instead of incoming ones\n" +
|
||||
"**-** Thrown weapons not being properly set to ID-ready by wells of awareness when hero has the shard of oblivion\n" +
|
||||
"**-** Rats attacking the hero when they should be neutral in specific cases\n" +
|
||||
"**-** Picking up throwing clubs and hammers taking time if done during time freeze\n" +
|
||||
"**-** Various minor visual/textual errors\n" +
|
||||
"**-** Various rare crash errors",
|
||||
|
||||
"**Existed Prior to v3.2.0:**\n" +
|
||||
"**-** Specific cases where bits of hidden walls could be seen through the fog of war\n" +
|
||||
"**-** Specific errors with inter-floor teleports\n" +
|
||||
"**-** DM-201s retaliating to corruption dmg\n" +
|
||||
"**-** Crossbow's charged shot melee not triggering in some cases\n" +
|
||||
"**-** Tab cycling not working correctly with inventory window\n" +
|
||||
"**-** Golden bees not preferring potential targets affected by aggression debuff\n" +
|
||||
"**-** Aggression debuff effect persisting on downed ghouls once they revive\n" +
|
||||
"**-** Radiance stunning enemies are they are killed by it triggering illuminate\n" +
|
||||
"**-** Prison guards being able to pull large characters into enclosed spaces\n" +
|
||||
"**-** Various minor visual/textual errors"));
|
||||
|
||||
changes = new ChangeInfo("v3.2.4", false, null);
|
||||
changes.hardlight(Window.TITLE_COLOR);
|
||||
changeInfos.add(changes);
|
||||
@@ -105,7 +154,7 @@ public class v3_X_Changes {
|
||||
"Currently the background most strongly ties into the sewers region, but we have plans to add more variants in the future, one for each dungeon region!"));
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.DISPLAY_PORT), "Mobile Layout Changes",
|
||||
"**Shattered now renders in true fullscreen on most mobile devices!**\n" +
|
||||
"**Shattered's in-game screen now renders in true fullscreen on most mobile devices!**\n" +
|
||||
"\n" +
|
||||
"The status bar at the top of the in-game UI has been modified to work around small and medium sized hole punches and rounded corners on modern displays! This includes the dynamic island on modern iPhones. Thanks to these adjustments it's now possible for the UI to move up and for the game to display in true fullscreen during gameplay! Devices with larger cutouts like full-sized notches will unfortunately still have a dark bar on the top, as there isn't room for the UI.\n" +
|
||||
"\n" +
|
||||
@@ -121,52 +170,26 @@ public class v3_X_Changes {
|
||||
"**-** Improved how buff bar layout handles iOS dynamic island at smaller scale values.\n" +
|
||||
"**-** Renamed the mobile fullscreen setting to 'hide navigation bar' or 'hide gesture bar'"));
|
||||
|
||||
changes = new ChangeInfo("v3.2.3", false, null);
|
||||
changes = new ChangeInfo("v3.2.2 & v3.2.3", false, null);
|
||||
changes.hardlight(Window.TITLE_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton( new ChangeButton(Icons.get(Icons.SHPX), "Dev Commentary",
|
||||
"More tech improvements and modernizations for mobile users!\n" +
|
||||
"\n" +
|
||||
"This patch follows up on the previous one with some bug fixes, responses to feedback, and support for true edge-to-edge fullscreen on most game interfaces!\n" +
|
||||
"These are the first of those 'technical improvements' patches I mentioned previously. Several changes have been made to modernize some aspects of Shattered Pixel Dungeon on Android, as well as a few smaller changes on iOS and internal changes on other platforms.\n" +
|
||||
"\n" +
|
||||
"I expect to be releasing one more major patch for v3.2 with further improvements, plus whatever else is needed for handling tech fixes."));
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.DISPLAY_PORT), "Mobile Layout Changes",
|
||||
"**-** Shattered now renders in true edge-to-edge fullscreen on Android 9+ and iOS devices, with transparent navigation bars and rendering into display cutout regions!\n" +
|
||||
"**-** All in-game interfaces have been adjusted to better handle true mobile fullscreen, including better insets on various UI elements at display corners.\n" +
|
||||
"**-** Currently the in-game screen makes use of a solid dark bar at the top to handle display cutouts. This is temporary and that UI will be made true fullscreen soon for people with smaller display cutouts (e.g. hole punches).\n" +
|
||||
"**-** Re-added some orientation control on Android in the form of a 'force landscape' setting. This setting may need to be removed in future Android versions.\n" +
|
||||
"**-** Re-enabled 'fullscreen' setting on iOS (i.e. it can be turned off again), which now lightly raises UI elements to help prevent gesture mistaps"));
|
||||
|
||||
changes.addButton(new ChangeButton(new Image(Assets.Sprites.SPINNER, 144, 0, 16, 16), Messages.get(ChangesScene.class, "bugfixes"),
|
||||
"Fixed the following bugs:\n" +
|
||||
"**Caused by v3.2.2:**\n" +
|
||||
"**-** Windowed mode on desktop always defaulting to 1920x1080, instead of last window size\n" +
|
||||
"**-** Various rare Android crashes caused by internal library updates\n" +
|
||||
"**-** Fullscreen being incorrectly forced off on some older Android devices."));
|
||||
|
||||
changes = new ChangeInfo("v3.2.2", false, null);
|
||||
changes.hardlight(Window.TITLE_COLOR);
|
||||
changeInfos.add(changes);
|
||||
|
||||
changes.addButton( new ChangeButton(Icons.get(Icons.SHPX), "Dev Commentary",
|
||||
"Hey folks, this is the first of those 'technical improvements' patches I mentioned previously. Several changes have been made to modernize some aspects of Shattered Pixel Dungeon on Android, as well as a few smaller changes on iOS and internal changes on other platforms.\n" +
|
||||
"\n" +
|
||||
"One more change that I'm delaying for another patch is adjustments to screen layout logic to better support hole punches and small notches. No promises, but I'd like to let devices with smaller cutouts (like hole punches) play the game in true fullscreen. This may also extend to iOS users and the compact dynamic island."));
|
||||
|
||||
changes.addButton(new ChangeButton(Icons.get(Icons.PREFS), Messages.get(ChangesScene.class, "misc"),
|
||||
"**Android Changes:**\n" +
|
||||
"**-** Removed landscape/portrait setting, game now uses system orientation instead. This is more consistent with the iOS version, and will be required in the future by Google anyway.\n" +
|
||||
"**Mobile UI Changes:**\n" +
|
||||
"**-** Shattered's menu screens now render in true edge-to-edge fullscreen on Android 9+ and iOS devices.\n" +
|
||||
"**-** Android now defaults to device orientation instead of forced portrait, but there is a 'force landscape' setting.\n" +
|
||||
"**-** 'Fullscreen' (hiding the nav bar or gesture bar) now defaults to on, and is forced on if no nav or gesture bar is present.\n" +
|
||||
"**-** Shattered Pixel Dungeon now requires Android 5.0+, up from 4.0+.\n" +
|
||||
"**-** Fully removed Power Saver setting, which was already hidden for Android 4.4+ devices anyway.\n" +
|
||||
"**-** Sharing Gameplay Data now requires Android 6.0+, up from 4.1+.\n" +
|
||||
"**-** Updated various Google Play libraries.\n" +
|
||||
"**-** Fully removed Android Power Saver setting, which was already hidden for Android 4.4+ devices anyway.\n" +
|
||||
"\n" +
|
||||
"**Other Changes:**\n" +
|
||||
"**-** 'Fullscreen' (drawing over the home indicator) is now always on for iOS users, as iOS 26 is about to always auto-hide the home indicator anyway.\n" +
|
||||
"**-** Updated various internal code libraries.\n" +
|
||||
"**-** Shattered Pixel Dungeon now requires Android 5.0+, up from 4.0+.\n" +
|
||||
"**-** Sharing Gameplay Data now requires Android 6.0+, up from 4.1+.\n" +
|
||||
"**-** Desktop JAR build now requires Java 11+, up from 8+.\n" +
|
||||
"**-** Slightly adjusted the visuals at the end of the prison region."));
|
||||
|
||||
|
||||
@@ -133,6 +133,9 @@ public class WndBag extends WndTabbed {
|
||||
BagTab tab = new BagTab( b, i++ );
|
||||
add( tab );
|
||||
tab.select( b == bag );
|
||||
if (b == bag){
|
||||
selected = tab;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -71,23 +71,22 @@ public class WndInfoMob extends WndTitledMessage {
|
||||
image.y = Math.max( 0, name.height() + health.height() - image.height() );
|
||||
|
||||
float w = width - image.width() - GAP;
|
||||
int extraBuffSpace = 0;
|
||||
|
||||
//Tries to make space for up to 11 visible buffs
|
||||
do {
|
||||
name.maxWidth((int)w - extraBuffSpace);
|
||||
buffs.setSize(w - name.width() - 8, 8);
|
||||
extraBuffSpace += 8;
|
||||
} while (extraBuffSpace <= 40 && !buffs.allBuffsVisible());
|
||||
|
||||
name.setPos(x + image.width() + GAP,
|
||||
image.height() > name.height() ? y +(image.height() - name.height()) / 2 : y);
|
||||
|
||||
health.setRect(image.width() + GAP, name.bottom() + GAP, w, health.height());
|
||||
|
||||
buffs.setPos(name.right(), name.bottom() - BuffIndicator.SIZE_SMALL-2);
|
||||
buffs.maxBuffs = 50; //infinite, effectively
|
||||
buffs.setRect(name.right(), name.bottom() - BuffIndicator.SIZE_SMALL-2, w - name.width(), 8);
|
||||
|
||||
height = Math.max(image.y + image.height(), health.bottom());
|
||||
//If buff bar doesn't have enough room, move it below
|
||||
if (!buffs.allBuffsVisible()){
|
||||
buffs.setRect(0, health.bottom(), width, 8);
|
||||
height = Math.max(image.y + image.height(), buffs.bottom());
|
||||
} else {
|
||||
height = Math.max(image.y + image.height(), health.bottom());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ public class WndTabbed extends Window {
|
||||
int idx = tabs.indexOf(selected);
|
||||
idx++;
|
||||
if (idx >= tabs.size()) idx = 0;
|
||||
select(idx);
|
||||
tabs.get(idx).onClick();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -89,17 +89,17 @@ runtime {
|
||||
}
|
||||
}
|
||||
} else if (osName.contains('mac')) {
|
||||
//Adoptium JDK 17 officially supports MacOS 12+, but internals suggest support for 10.12+
|
||||
targetPlatform("mac") {
|
||||
jdkHome = jdkDownload("https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-16.0.1%2B9/OpenJDK16U-jdk_x64_mac_hotspot_16.0.1_9.tar.gz")
|
||||
javaHome = file("./build/jdks/mac/jdk-16.0.1+9/Contents/Home/").getAbsolutePath()
|
||||
jdkHome = jdkDownload("https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.16%2B8/OpenJDK17U-jdk_x64_mac_hotspot_17.0.16_8.tar.gz")
|
||||
javaHome = file("./build/jdks/mac/jdk-17.0.16+8/Contents/Home/").getAbsolutePath()
|
||||
jpackage {
|
||||
jpackageHome = file("./build/jdks/mac/jdk-16.0.1+9/Contents/Home/")
|
||||
jpackageHome = file("./build/jdks/mac/jdk-17.0.16+8/Contents/Home/")
|
||||
imageOptions = ["--icon", file("./src/main/assets/icons/mac.icns"),
|
||||
"--java-options", "-XstartOnFirstThread",
|
||||
"--java-options", "-XX:+IgnoreUnrecognizedVMOptions",
|
||||
//append .apple because com.shatteredpixel.shatteredpixeldungeon was taken =(
|
||||
"--mac-package-identifier", appPackageName + ".apple",
|
||||
"--mac-package-name", "ShattererdPD"]
|
||||
"--mac-package-identifier", appPackageName + ".apple"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,6 @@ import com.watabou.utils.PlatformSupport;
|
||||
import com.watabou.utils.RectF;
|
||||
|
||||
import org.robovm.apple.audiotoolbox.AudioServices;
|
||||
import org.robovm.apple.coregraphics.CGRect;
|
||||
import org.robovm.apple.systemconfiguration.SCNetworkReachability;
|
||||
import org.robovm.apple.systemconfiguration.SCNetworkReachabilityFlags;
|
||||
import org.robovm.apple.uikit.UIApplication;
|
||||
@@ -58,6 +57,38 @@ public class IOSPlatformSupport extends PlatformSupport {
|
||||
return Gdx.graphics.getSafeInsetBottom() > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RectF getDisplayCutout() {
|
||||
int topInset = Gdx.graphics.getSafeInsetTop();
|
||||
|
||||
//older device with no cutout, or landscape (we ignore cutouts in this case)
|
||||
if (topInset == 0){
|
||||
return new RectF();
|
||||
}
|
||||
|
||||
//magic number BS for larger status bar caused by dynamic island
|
||||
boolean hasDynamicIsland = topInset / Gdx.graphics.getBackBufferScale() >= 51;
|
||||
|
||||
if (!hasDynamicIsland){
|
||||
//classic notch, just shrink for the oversized safe are and then return all top.
|
||||
// this is inaccurate, as there's space left and right, but we don't care
|
||||
return new RectF(0, 0, Game.width, topInset / 1.2f);
|
||||
} else {
|
||||
//we estimate dynamic island as being 390x120 px, 40px from top.
|
||||
// this is mostly accurate, slightly oversized
|
||||
RectF cutout = new RectF( Game.width/2 - 195, 40, Game.width/2 + 195, 160);
|
||||
|
||||
//iPhone air specifically has its island a bit lower
|
||||
// so we check for its machine string and also simulator with same width
|
||||
String machineString = HWMachine.getMachineString();
|
||||
if (machineString.equals("iPhone18,4")
|
||||
|| (machineString.equals("arm64") && Game.width == 1260)){
|
||||
cutout.shift(0, 15);
|
||||
}
|
||||
return cutout;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public RectF getSafeInsets(int level) {
|
||||
RectF insets = super.getSafeInsets(INSET_ALL);
|
||||
|
||||
Reference in New Issue
Block a user