Pull upstream changes

This commit is contained in:
2025-10-05 15:06:45 +03:00
82 changed files with 728 additions and 424 deletions

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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());

View File

@@ -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

View File

@@ -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!

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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=
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ứ 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 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 nht 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 nht 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 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.

View File

@@ -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=這位矮胖的傢伙看起來更適合在某些大城市裡做買賣而不是這種地下城。這些商品的價格解釋了為什麼他會喜歡在這地方做生意。

View File

@@ -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倍耐久_。

View File

@@ -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.

View File

@@ -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ň.

View File

@@ -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.

View File

@@ -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

View File

@@ -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=투척용 칼

View File

@@ -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.

View File

@@ -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

View File

@@ -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.

View File

@@ -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=你武器上的硬化效果被損耗掉了!

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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ỏ

View File

@@ -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_這陷阱跟上面的一樣不長眼對這裡的生物它都傷得了。_

View File

@@ -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=茂盛花朵

View File

@@ -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

View File

@@ -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.

View File

@@ -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=缩餐节食

View File

@@ -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.

View File

@@ -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=断肠苔(实为花卉而非苔藓)是一种花瓣利如刀片,表面覆有致命毒液的植物。

View File

@@ -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_

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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");

View File

@@ -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"));
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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") );
}
}
}

View File

@@ -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;
}

View File

@@ -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];
}
}

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -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 );

View File

@@ -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();

View File

@@ -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;

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -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();
}

View File

@@ -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") );

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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 {

View File

@@ -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

View File

@@ -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();
}
});

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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),

View File

@@ -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);
}
}
}
});

View File

@@ -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()) {

View File

@@ -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 {

View File

@@ -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");

View File

@@ -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)) {

View File

@@ -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();
}
});
}
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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."));

View File

@@ -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;
}
}
}

View File

@@ -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());
}
}
}
}

View File

@@ -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;
}

View File

@@ -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"]
}
}
}

View File

@@ -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);