Update MLPD 0.6.0
Merged to 123 SPD, this is a major update.Commit for the first time!
|
@ -3,7 +3,7 @@
|
|||
* Copyright (C) 2012-2015 Oleg Dolya
|
||||
*
|
||||
* Shattered Pixel Dungeon
|
||||
* Copyright (C) 2014-2022 Evan Debenham
|
||||
* Copyright (C) 2014-2021 Evan Debenham
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -24,86 +24,86 @@ package com.watabou.noosa.ui;
|
|||
import com.watabou.noosa.Group;
|
||||
|
||||
public class Component extends Group {
|
||||
|
||||
protected float x;
|
||||
protected float y;
|
||||
|
||||
public float x;
|
||||
public float y;
|
||||
protected float width;
|
||||
protected float height;
|
||||
|
||||
|
||||
public Component() {
|
||||
super();
|
||||
createChildren();
|
||||
}
|
||||
|
||||
|
||||
public Component setPos( float x, float y ) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
layout();
|
||||
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public Component setSize( float width, float height ) {
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
layout();
|
||||
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public Component setRect( float x, float y, float width, float height ) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
layout();
|
||||
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public boolean inside( float x, float y ) {
|
||||
return x >= this.x && y >= this.y && x < this.x + width && y < this.y + height;
|
||||
}
|
||||
|
||||
|
||||
public void fill( Component c ) {
|
||||
setRect( c.x, c.y, c.width, c.height );
|
||||
}
|
||||
|
||||
|
||||
public float left() {
|
||||
return x;
|
||||
}
|
||||
|
||||
|
||||
public float right() {
|
||||
return x + width;
|
||||
}
|
||||
|
||||
|
||||
public float centerX() {
|
||||
return x + width / 2;
|
||||
}
|
||||
|
||||
|
||||
public float top() {
|
||||
return y;
|
||||
}
|
||||
|
||||
|
||||
public float bottom() {
|
||||
return y + height;
|
||||
}
|
||||
|
||||
|
||||
public float centerY() {
|
||||
return y + height / 2;
|
||||
}
|
||||
|
||||
|
||||
public float width() {
|
||||
return width;
|
||||
}
|
||||
|
||||
|
||||
public float height() {
|
||||
return height;
|
||||
}
|
||||
|
||||
|
||||
protected void createChildren() {
|
||||
}
|
||||
|
||||
|
||||
protected void layout() {
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ public class PathFinder {
|
|||
|
||||
//performance-light shortcuts for some common pathfinder cases
|
||||
//they are in array-access order for increased memory performance
|
||||
public static int[] NEIGHBOURS1;
|
||||
public static int[] NEIGHBOURS4;
|
||||
public static int[] NEIGHBOURS8;
|
||||
public static int[] NEIGHBOURS9;
|
||||
|
@ -64,6 +65,7 @@ public class PathFinder {
|
|||
dir = new int[]{-1, +1, -width, +width, -width-1, -width+1, +width-1, +width+1};
|
||||
dirLR = new int[]{-1-width, -1, -1+width, -width, +width, +1-width, +1, +1+width};
|
||||
|
||||
NEIGHBOURS1 = new int[]{-width};
|
||||
NEIGHBOURS4 = new int[]{-width, -1, +1, +width};
|
||||
NEIGHBOURS8 = new int[]{-width-1, -width, -width+1, -1, +1, +width-1, +width, +width+1};
|
||||
NEIGHBOURS9 = new int[]{-width-1, -width, -width+1, -1, 0, +1, +width-1, +width, +width+1};
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
package com.watabou.utils;
|
||||
|
||||
import static com.watabou.utils.DeviceCompat.isDebug;
|
||||
|
||||
import com.badlogic.gdx.Gdx;
|
||||
import com.badlogic.gdx.graphics.Pixmap;
|
||||
import com.badlogic.gdx.graphics.g2d.BitmapFont;
|
||||
|
@ -33,7 +35,9 @@ import java.util.HashMap;
|
|||
public abstract class PlatformSupport {
|
||||
|
||||
public abstract void updateDisplaySize();
|
||||
|
||||
public void logd( String message ) {
|
||||
if (isDebug()) Gdx.app.log("DEBUG", message);
|
||||
}
|
||||
public abstract void updateSystemUI();
|
||||
|
||||
public abstract boolean connectedToUnmeteredNetwork();
|
||||
|
|
|
@ -8,6 +8,6 @@
|
|||
<string name="customactivityoncrash_error_activity_error_details_close">Close</string>
|
||||
<string name="customactivityoncrash_error_activity_error_details_copy">Copy to clipboard</string>
|
||||
<string name="customactivityoncrash_error_activity_error_details_copied">Copied to clipboard</string>
|
||||
<string name="reload">Reload</string>
|
||||
<string name="died">diefdsa</string>
|
||||
<string name="customactivityoncrash_error_activity_error_details_reload">Reload</string>
|
||||
<string name="customactivityoncrash_error_activity_error_details_died">diefdsa</string>
|
||||
</resources>
|
||||
|
|
BIN
core/src/main/assets/Boss/SLMKING0.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
core/src/main/assets/Boss/SLMKING1.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
core/src/main/assets/Boss/SLMKING2.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
core/src/main/assets/Boss/SLMKING3.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
core/src/main/assets/Boss/SLMKING4.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
core/src/main/assets/Boss/SLMKING5.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
core/src/main/assets/Boss/SLMKING6.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
core/src/main/assets/Boss/SlimeKing.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
core/src/main/assets/Npcs/Nxhy.png
Normal file
After Width: | Height: | Size: 609 B |
BIN
core/src/main/assets/Npcs/White.png
Normal file
After Width: | Height: | Size: 470 B |
BIN
core/src/main/assets/Npcs/nyz.png
Normal file
After Width: | Height: | Size: 515 B |
BIN
core/src/main/assets/Npcs/rt.png
Normal file
After Width: | Height: | Size: 647 B |
BIN
core/src/main/assets/SRPD/BlackGhost.png
Normal file
After Width: | Height: | Size: 668 B |
BIN
core/src/main/assets/SRPD/Brigand.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
core/src/main/assets/SRPD/MolotovHuntsman.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
core/src/main/assets/SRPD/ShieldHuntsman.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
core/src/main/assets/SRPD/SkullShaman.png
Normal file
After Width: | Height: | Size: 975 B |
BIN
core/src/main/assets/SRPD/TorchHuntsman.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
core/src/main/assets/SRPD/icefire.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
core/src/main/assets/environment/Reload.png
Normal file
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 3.5 KiB |
BIN
core/src/main/assets/environment/tiles_cold.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
core/src/main/assets/environment/tiles_died.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
core/src/main/assets/environment/water-1.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
core/src/main/assets/interfaces/chrome_gold.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
core/src/main/assets/interfaces/dashboard.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
core/src/main/assets/interfaces/enemy_hp.png
Normal file
After Width: | Height: | Size: 204 B |
BIN
core/src/main/assets/interfaces/exp_bar.png
Normal file
After Width: | Height: | Size: 83 B |
BIN
core/src/main/assets/interfaces/hp_bar.png
Normal file
After Width: | Height: | Size: 109 B |
BIN
core/src/main/assets/interfaces/hunger_bar.png
Normal file
After Width: | Height: | Size: 178 B |
BIN
core/src/main/assets/interfaces/loading_cold.png
Normal file
After Width: | Height: | Size: 721 B |
BIN
core/src/main/assets/interfaces/lst.png
Normal file
After Width: | Height: | Size: 87 B |
BIN
core/src/main/assets/interfaces/shield_bar.png
Normal file
After Width: | Height: | Size: 108 B |
BIN
core/src/main/assets/interfaces/talent_button_dark.png
Normal file
After Width: | Height: | Size: 324 B |
|
@ -2,8 +2,8 @@
|
|||
actors.buffs.sanity.bad=我感觉我不太好……
|
||||
actors.buffs.sanity.tobad=理智过低了会死吗?
|
||||
actors.buffs.sanity.diedsoul=希望不在……绝望永存……
|
||||
actors.buffs.deadSoul.name=前世的回想
|
||||
actors.buffs.deadSoul.desc=你的亡魂带走了你前世的一切,杀死它,夺回自己的一切!
|
||||
actors.buffs.deadsoul.name=前世的回想
|
||||
actors.buffs.deadsoul.desc=你的亡魂带走了你前世的一切,杀死它,夺回自己的一切!
|
||||
actors.buffs.championenemy$deadsoulsx.name=前世回响
|
||||
actors.buffs.championenemy$deadsoulsx.desc=它是你前世的回响。打败它,夺回它的力量,让自己重归完整。
|
||||
|
||||
|
@ -499,7 +499,7 @@ actors.hero.heroclass.mage_desc_subclasses=在击杀第二个Boss后可以选择
|
|||
|
||||
actors.hero.heroclass.rogue=极影铃虹
|
||||
actors.hero.heroclass.rogue_unlock=极影铃虹可使用她特有的_暗影斗篷_操控战局,并通过隐身伏击敌人。\n\n_在一局游戏中执行20次伏击_以解锁极影铃虹。
|
||||
actors.hero.heroclass.rogue_desc_item=极影铃虹初始携带一件独特神器:_暗影斗篷。_ 穿上后,极影铃虹可以随时将自己隐形。\n\n暗影斗篷和其她神器一样不能被升级卷轴直接强化。暗影斗篷会随极影铃虹的使用而升级。
|
||||
actors.hero.heroclass.rogue_desc_item=极影铃虹初始携带一件独特神器:_暗影斗篷。_ 穿上后,极影铃虹可以随时将自己隐形。\n\n暗影斗篷和其他神器一样不能被升级卷轴直接强化。暗影斗篷会随极影铃虹的使用而升级。
|
||||
actors.hero.heroclass.rogue_desc_loadout=极影铃虹初始携带一把_匕首。_用这把匕首伏击敌人会造成额外伤害。\n\n极影铃虹初始携带_三把飞刀。_飞刀可以扔出攻击远处,并且用飞刀伏击敌人还会造成额外伤害。\n\n极影铃虹初始携带一个可以收纳种子和符石等小件物品的_绒布袋。_
|
||||
actors.hero.heroclass.rogue_desc_misc=极影铃虹能探测到更远的秘密和陷阱。\n\n极影铃虹能在地牢中找到更多秘密。\n\n极影铃虹开局鉴定的物品有:\n- 鉴定卷轴\n- 隐形药剂\n- 探地卷轴
|
||||
actors.hero.heroclass.rogue_desc_subclasses=在击杀第二个Boss后可以选择一种专精。极影铃虹可以在两种专精中二选一:
|
||||
|
@ -648,7 +648,7 @@ actors.hero.talent.excess_charge.title=盈能屏障
|
|||
actors.hero.talent.excess_charge.desc=_+1:_战斗魔女在使用满充能的老魔杖近战攻击时,有_20%几率_获得2倍于魔杖等级的护盾值。\n\n_+2:_战斗魔女在使用满充能的老魔杖近战攻击时,有_40%几率_获得2倍于魔杖等级的护盾值。\n\n_+3:_战斗魔女在使用满充能的老魔杖近战攻击时,有_60%几率_获得2倍于魔杖等级的护盾值。
|
||||
|
||||
actors.hero.talent.soul_siphon.title=灵魂分食
|
||||
actors.hero.talent.soul_siphon.desc=_+1:_其她单位的近战攻击同样会触发噬魂女皇的灵魂标记,但只有_13%效果_。\n\n_+2:_其她单位的近战攻击同样会触发噬魂女皇的灵魂标记,但只有_27%效果_。\n\n_+3:_其她单位的近战攻击同样会触发噬魂女皇的灵魂标记,但只有_40%效果_。
|
||||
actors.hero.talent.soul_siphon.desc=_+1:_其他单位的近战攻击同样会触发噬魂女皇的灵魂标记,但只有_13%效果_。\n\n_+2:_其他单位的近战攻击同样会触发噬魂女皇的灵魂标记,但只有_27%效果_。\n\n_+3:_其他单位的近战攻击同样会触发噬魂女皇的灵魂标记,但只有_40%效果_。
|
||||
actors.hero.talent.soul_eater.title=噬魂秘法
|
||||
actors.hero.talent.soul_eater.desc=_+1:_灵魂标记单位受到的每点物理伤害都会提供相当于_0.33回合_的饥饿值;当持有灵魂标记的单位死亡时,噬魂女皇有_10%几率_触发一次进食效果。\n\n_+2:_灵魂标记单位受到的每点物理伤害都会提供相当于_0.67回合_的饥饿值;当持有灵魂标记的单位死亡时,噬魂女皇有_20%几率_触发一次进食效果。\n\n_+3:_灵魂标记单位受到的每点物理伤害都会提供相当于_1回合_的饥饿值;当持有灵魂标记的单位死亡时,噬魂女皇有_30%几率_触发一次进食效果。
|
||||
actors.hero.talent.necromancers_minions.title=怨灵爪牙
|
||||
|
@ -720,10 +720,10 @@ actors.hero.talent.hasty_retreat.desc=_+1:_极影铃虹在闪现后获得_1回
|
|||
actors.hero.talent.body_replacement.title=替身掩护
|
||||
actors.hero.talent.body_replacement.desc=_+1:_闪现时,极影铃虹会留下一个有_ 20 点生命与 1-3 点护甲_的替身木桩。\n\n_+2:_闪现时,极影铃虹会留下一个有_ 40 点生命与 2-6 点护甲_的替身木桩。\n\n_+3:_闪现时,极影铃虹会留下一个有_ 60 点生命与 3-9 点护甲_的替身木桩。\n\n_+4:_闪现时,极影铃虹会留下一个有_ 80 点生命与 4~12 点护甲_的替身木桩。\n\n同一时间只可存在一个替身木桩。
|
||||
actors.hero.talent.shadow_step.title=烟幕潜行
|
||||
actors.hero.talent.shadow_step.desc=_+1:_极影铃虹隐身时,烟幕爆炸可以瞬间发动,并且充能花费会_降低 20%_。隐身时的烟幕爆炸不会致盲敌人,也不会触发其她天赋。\n\n_+2:_极影铃虹隐身时,烟幕爆炸可以瞬间发动,并且充能花费会_降低 36%_。隐身时的烟幕爆炸不会致盲敌人,也不会触发其她天赋。\n\n_+3:_极影铃虹隐身时,烟幕爆炸可以瞬间发动,并且充能花费会_降低 50%_。隐身时的烟幕爆炸不会致盲敌人,也不会触发其她天赋。\n\n_+4:_极影铃虹隐身时,烟幕爆炸可以瞬间发动,并且充能花费会_降低 60%_。隐身时的烟幕爆炸不会致盲敌人,也不会触发其她天赋。
|
||||
actors.hero.talent.shadow_step.desc=_+1:_极影铃虹隐身时,烟幕爆炸可以瞬间发动,并且充能花费会_降低 20%_。隐身时的烟幕爆炸不会致盲敌人,也不会触发其他天赋。\n\n_+2:_极影铃虹隐身时,烟幕爆炸可以瞬间发动,并且充能花费会_降低 36%_。隐身时的烟幕爆炸不会致盲敌人,也不会触发其他天赋。\n\n_+3:_极影铃虹隐身时,烟幕爆炸可以瞬间发动,并且充能花费会_降低 50%_。隐身时的烟幕爆炸不会致盲敌人,也不会触发其他天赋。\n\n_+4:_极影铃虹隐身时,烟幕爆炸可以瞬间发动,并且充能花费会_降低 60%_。隐身时的烟幕爆炸不会致盲敌人,也不会触发其他天赋。
|
||||
|
||||
actors.hero.talent.fear_the_reaper.title=恐惧蔓延
|
||||
actors.hero.talent.fear_the_reaper.desc=_+1:_拥有夺命印记的敌人在生命值降为 0 时会获得_残废_效果。\n\n_+2:_拥有夺命印记的敌人在生命值降为 0 时会获得_残废与恐惧_效果。\n\n_+3:_拥有夺命印记的敌人在生命值降为 0 时会获得_残废与恐惧_效果,并且 3 方格内的其她敌人也会获得_残废_效果。\n\n_+4:_拥有夺命印记的敌人在生命值降为 0 时会获得_残废与恐惧_效果,并且 3 方格内的其她敌人也会获得_残废与恐惧_效果。
|
||||
actors.hero.talent.fear_the_reaper.desc=_+1:_拥有夺命印记的敌人在生命值降为 0 时会获得_残废_效果。\n\n_+2:_拥有夺命印记的敌人在生命值降为 0 时会获得_残废与恐惧_效果。\n\n_+3:_拥有夺命印记的敌人在生命值降为 0 时会获得_残废与恐惧_效果,并且 3 方格内的其他敌人也会获得_残废_效果。\n\n_+4:_拥有夺命印记的敌人在生命值降为 0 时会获得_残废与恐惧_效果,并且 3 方格内的其他敌人也会获得_残废与恐惧_效果。
|
||||
actors.hero.talent.deathly_durability.title=死神外衣
|
||||
actors.hero.talent.deathly_durability.desc=_+1:_死于夺命印记的敌人会赋予极影铃虹其被印记时生命值 _13%_ 的护盾值。\n\n_+2:_死于夺命印记的敌人会赋予极影铃虹其被印记时生命值 _25%_ 的护盾值。\n\n_+3:_死于夺命印记的敌人会赋予极影铃虹其被印记时生命值 _38%_ 的护盾值。\n\n_+4:_死于夺命印记的敌人会赋予极影铃虹其被印记时生命值 _50%_ 的护盾值。
|
||||
actors.hero.talent.double_mark.title=双重印记
|
||||
|
@ -742,7 +742,7 @@ actors.hero.talent.natures_bounty.desc=_+1:_颐莲梅錵在探索地下城的
|
|||
actors.hero.talent.survivalists_intuition.title=生存直觉
|
||||
actors.hero.talent.survivalists_intuition.desc=_+1:_颐莲梅錵鉴定任何装备的速度提升为原来的_ 1.75 倍_。\n\n_+2:_颐莲梅錵鉴定任何装备的速度提升为原来的_ 2.5 倍_。
|
||||
actors.hero.talent.followup_strike.title=追加打击
|
||||
actors.hero.talent.followup_strike.desc=_+1:_当颐莲梅錵用她的弓或其它投掷武器击中敌人时,她对该敌人的下一次近战攻击将造成_ 2 点额外伤害_。\n\n_+2:_当颐莲梅錵用她的弓或其她投掷武器击中敌人时。她对该敌人的下一次近战攻击将造成_ 3 点额外伤害_。
|
||||
actors.hero.talent.followup_strike.desc=_+1:_当颐莲梅錵用她的弓或其它投掷武器击中敌人时,她对该敌人的下一次近战攻击将造成_ 2 点额外伤害_。\n\n_+2:_当颐莲梅錵用她的弓或其他投掷武器击中敌人时。她对该敌人的下一次近战攻击将造成_ 3 点额外伤害_。
|
||||
actors.hero.talent.natures_aid.title=自然助力
|
||||
actors.hero.talent.natures_aid.desc=_+1:_视野内的植物被踩踏时,颐莲梅錵会获得每 3 回合衰减一次的 0~2 点树肤。\n\n_+2:_视野内的植物被踩踏时,颐莲梅錵会获得每 5 回合衰减一次的 0~2 点树肤。
|
||||
|
||||
|
@ -827,12 +827,12 @@ actors.mobs.npcs.blacksmith.cursed=我可不碰诅咒的东西!
|
|||
actors.mobs.npcs.blacksmith.degraded=这简直就是个垃圾,质量太差了!
|
||||
actors.mobs.npcs.blacksmith.cant_reforge=我不能重铸这些物品!
|
||||
actors.mobs.npcs.blacksmith.def_verb=格挡
|
||||
actors.mobs.npcs.blacksmith.desc=这个巨魔看起来和任何其她巨魔一样:又高又瘦,皮肤的色泽和纹理都像是石头。这位巨魔铁匠正在拿着一把与其体形极其不符的小锤子不停地修修补补。
|
||||
actors.mobs.npcs.blacksmith.desc=这个巨魔看起来和任何其他巨魔一样:又高又瘦,皮肤的色泽和纹理都像是石头。这位巨魔铁匠正在拿着一把与其体形极其不符的小锤子不停地修修补补。
|
||||
|
||||
actors.mobs.npcs.ghost.name=悲伤幽灵
|
||||
actors.mobs.npcs.ghost.rat_1=你好,%s…曾经我像你一样——既强大又自信…但我被一个邪恶的野兽杀死了…我不能离开这个地方……直到我完成我的复仇…杀死_腐臭老鼠_,就是它夺走了我的生命…\n\n它就在这层…四处散播污秽…_小心它的周边的臭云以及带有腐蚀性的撕咬,它产生的粘液可溶于水…_
|
||||
actors.mobs.npcs.ghost.rat_2=请帮助我…杀了那个令人憎恶的东西…\n\n_在水附近与它战斗…躲开它的恶臭…_
|
||||
actors.mobs.npcs.ghost.gnoll_1=你好,%s…曾经我像你一样——既强大又自信…但我被一个狡猾的敌人杀死了…我不能离开这个地方……直到我完成我的复仇…杀死_豺狼猎手_,就是它夺走了我的生命…\n\n它与其她豺狼人不同…它会隐藏自己并使用投掷武器… _小心它的毒镖和火镖,尽量靠近它…_
|
||||
actors.mobs.npcs.ghost.gnoll_1=你好,%s…曾经我像你一样——既强大又自信…但我被一个狡猾的敌人杀死了…我不能离开这个地方……直到我完成我的复仇…杀死_豺狼猎手_,就是它夺走了我的生命…\n\n它与其他豺狼人不同…它会隐藏自己并使用投掷武器… _小心它的毒镖和火镖,尽量靠近它…_
|
||||
actors.mobs.npcs.ghost.gnoll_2=请帮助我……杀了那个诡诈的家伙……\n\n_别让它打到你……离它越近越好……_
|
||||
actors.mobs.npcs.ghost.crab_1=你好,%s…曾经我像你一样——既强大又自信…但我被一个古老的生物杀死了…我不能离开这个地方……直到我完成我的复仇…杀死_巨钳螃蟹_,就是它夺走了我的生命…\n\n它经历了无数岁月的洗礼…有一个巨大的蟹钳和非常厚重的蟹壳…_小心它的蟹钳,你必须偷袭这只巨蟹否则它会用钳子格挡你的攻击..._
|
||||
actors.mobs.npcs.ghost.crab_2=拜托帮助我……杀了那个甲壳类……\n\n_如果它发现你……就会挡住你所有的攻击……_
|
||||
|
@ -846,12 +846,12 @@ 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=小恶魔是一种低等恶魔。它们既没有强大的力量也没有魔法天赋,但她们相当聪明而且善于交际。许多小恶魔都喜欢生活在没有其她恶魔存在的地方。
|
||||
actors.mobs.npcs.imp.desc=小恶魔是一种低等恶魔。它们既没有强大的力量也没有魔法天赋,但她们相当聪明而且善于交际。许多小恶魔都喜欢生活在没有其他恶魔存在的地方。
|
||||
|
||||
actors.mobs.npcs.impshopkeeper.name=野心勃勃的小恶魔
|
||||
actors.mobs.npcs.impshopkeeper.greetings=你好,%s!
|
||||
actors.mobs.npcs.impshopkeeper.thief=我以为我可以相信你!
|
||||
actors.mobs.npcs.impshopkeeper.desc=小恶魔是一种低等恶魔。它们既没有强大的力量也没有魔法天赋,但她们相当聪明而且善于交际,因此许多小恶魔喜欢生活在没有其她恶魔存在的地方。
|
||||
actors.mobs.npcs.impshopkeeper.desc=小恶魔是一种低等恶魔。它们既没有强大的力量也没有魔法天赋,但她们相当聪明而且善于交际,因此许多小恶魔喜欢生活在没有其他恶魔存在的地方。
|
||||
|
||||
actors.mobs.npcs.mirrorimage.name=镜像
|
||||
actors.mobs.npcs.mirrorimage.desc=这个幻象和你非常相似,甚至还装备着你当前的武器和护甲。\n\n镜像会猎寻敌人,并用它们的镜像武器对其发动攻击。镜像武器的使用方式与特性和你手中的一样,但造成的伤害会低些。镜像出生的时候没有实体,但攻击后会显形。\n\n镜像有一定的攻击能力,但非常脆弱,受到伤害就会瞬间消散。
|
||||
|
@ -885,7 +885,7 @@ actors.mobs.npcs.sheep.desc=这是一只魔法绵羊。为什么叫它魔法绵
|
|||
actors.mobs.npcs.shopkeeper.name=商人
|
||||
actors.mobs.npcs.shopkeeper.thief=小偷,小偷!
|
||||
actors.mobs.npcs.shopkeeper.sell=选择一件要出售的物品
|
||||
actors.mobs.npcs.shopkeeper.desc=这个矮胖的家伙看起来更适合在某些大城市里做买卖而不是这种地牢。这些商品的价格解释了为什么她会喜欢在这儿做生意。
|
||||
actors.mobs.npcs.shopkeeper.desc=这个矮胖的家伙看起来更适合在某些大城市里做买卖而不是这种地牢。这些商品的价格解释了为什么他会喜欢在这儿做生意。
|
||||
|
||||
actors.mobs.npcs.wandmaker.name=老杖匠
|
||||
actors.mobs.npcs.wandmaker.intro_warrior=啊,能在这片压抑的地方遇见一位英雄可真是个惊喜!如果你愿意帮助我这个老人家脱离苦海的话,你可以帮忙做一个任务。
|
||||
|
@ -901,7 +901,7 @@ actors.mobs.npcs.wandmaker.reminder_dust=灰烬找到了吗,%s?试着寻找
|
|||
actors.mobs.npcs.wandmaker.reminder_ember=余烬找的怎么样了,%s?你需要找到_四根蜡烛_和一个_仪式场地_。
|
||||
actors.mobs.npcs.wandmaker.reminder_berry=腐莓种子找的怎么样了,%s?它就在一个_充满植被的房间_里。
|
||||
actors.mobs.npcs.wandmaker.def_verb=格挡
|
||||
actors.mobs.npcs.wandmaker.desc=这位老先生的表情看起来十分困扰。她正在被一个力场盾牌保护着。
|
||||
actors.mobs.npcs.wandmaker.desc=这位老先生的表情看起来十分困扰。他正在被一个力场盾牌保护着。
|
||||
|
||||
|
||||
|
||||
|
@ -927,7 +927,7 @@ actors.mobs.bee.desc=尽管它们体积小,但金色蜜蜂有着强烈的保
|
|||
actors.mobs.brute.name=豺狼暴徒
|
||||
actors.mobs.brute.enraged=激怒
|
||||
actors.mobs.brute.def_verb=格挡
|
||||
actors.mobs.brute.desc=暴徒是豺狼人中体型最庞大,力量最强壮且生命力最顽强的精英。受到致命伤时,她们会陷入疯狂之中,获得暂时的护盾和极高的伤害加成。
|
||||
actors.mobs.brute.desc=暴徒是豺狼人中体型最庞大,力量最强壮且生命力最顽强的精英。受到致命伤时,他们会陷入疯狂之中,获得暂时的护盾和极高的伤害加成。
|
||||
actors.mobs.brute$bruterage.name=豺狼狂暴
|
||||
actors.mobs.brute$bruterage.desc=这个豺狼暴徒的死亡已经不可避免,但它想拉你作为陪葬品!\n\n时间的推移或是外界的伤害都会消磨护盾。在护盾消散殆尽之际,暴徒会彻底消亡。然而,一定要小心,在这一阶段暴徒会造成巨额伤害!\n\n剩余的护盾:%d。
|
||||
|
||||
|
@ -988,7 +988,7 @@ actors.mobs.dwarfking.enraged=汝杀不掉朕,%s。朕・即・不・朽!
|
|||
actors.mobs.dwarfking.losing=不!汝不得如此...汝不知晓朕的王国之下埋藏着什么...
|
||||
actors.mobs.dwarfking.defeated=一无所知的蠢货...汝会毁了一切的...
|
||||
actors.mobs.dwarfking.rankings_desc=屈服在矮人国王御前
|
||||
actors.mobs.dwarfking.desc=许多年前,矮人议会中一名最强的巫师洞察了凌驾于生死之上的秘术。很快她就借助这种强大的力量,控制、腐化了王室与整个议会,并将魔爪伸向王国中的每一名矮人。现在她成为了矮人国的国王,统领着数量庞大的死灵。\n\n矮人国王是极具进攻性的强敌,会尝试利用她手下的死灵大军压制入侵者。
|
||||
actors.mobs.dwarfking.desc=许多年前,矮人议会中一名最强的巫师洞察了凌驾于生死之上的秘术。很快他就借助这种强大的力量,控制、腐化了王室与整个议会,并将魔爪伸向王国中的每一名矮人。现在他成为了矮人国的国王,统领着数量庞大的死灵。\n\n矮人国王是极具进攻性的强敌,会尝试利用他手下的死灵大军压制入侵者。
|
||||
actors.mobs.dwarfking$dkghoul.rankings_desc=屈服在矮人国王御前
|
||||
actors.mobs.dwarfking$dkmonk.rankings_desc=屈服在矮人国王御前
|
||||
actors.mobs.dwarfking$dkwarlock.rankings_desc=屈服在矮人国王御前
|
||||
|
@ -1012,7 +1012,7 @@ actors.mobs.fetidrat.name=腐臭老鼠
|
|||
actors.mobs.fetidrat.desc=这只老鼠很不对劲。它油腻的黑毛和腐烂的皮肤与你之前见过的健康老鼠很不同。浅绿色的眼睛让它显得更具威胁。\n\n这只老鼠周围盘绕着一片可怕恶臭,靠近时臭气尤为浓烈。\n\n黑色的淤泥从它的嘴中流出。淤泥腐蚀掉了地砖,但遇水似乎就会溶解。
|
||||
|
||||
actors.mobs.ghoul.name=矮人尸群
|
||||
actors.mobs.ghoul.desc=在矮人王国逐渐衰亡,现在的矮人国王掌握了绝对的权力时,一些较为弱小的或是反抗国王的矮人受到了不公的待遇。然而随着矮人国王逐渐精通黑暗魔法,这些矮人逐渐屈从于其意志,并最终沦为了其大军中的一枚棋子。\n\n矮人尸群中的个体本身没有强大的战斗力,但它们总是结伴作战,试图利用数量优势击败强大的对手。_一名矮人尸群成员被击倒时,如果周围仍有其她同类,它将会在几回合后重生_。
|
||||
actors.mobs.ghoul.desc=在矮人王国逐渐衰亡,现在的矮人国王掌握了绝对的权力时,一些较为弱小的或是反抗国王的矮人受到了不公的待遇。然而随着矮人国王逐渐精通黑暗魔法,这些矮人逐渐屈从于其意志,并最终沦为了其大军中的一枚棋子。\n\n矮人尸群中的个体本身没有强大的战斗力,但它们总是结伴作战,试图利用数量优势击败强大的对手。_一名矮人尸群成员被击倒时,如果周围仍有其他同类,它将会在几回合后重生_。
|
||||
|
||||
actors.mobs.gnoll.name=豺狼巡查
|
||||
actors.mobs.gnoll.desc=豺狼是鬣狗状的类人生物。它们在下水道和地牢里游荡,不时向上行动试图向地表发起进攻。豺狼巡查是它们种群里最普通的一员,它们既没有豺狼暴徒强壮,也赶不上萨满聪明。
|
||||
|
@ -1040,7 +1040,7 @@ actors.mobs.goo.desc=我们对粘咕所知甚少。它甚至很有可能不是
|
|||
actors.mobs.greatcrab.name=巨大螃蟹
|
||||
actors.mobs.greatcrab.noticed=巨型螃蟹用它硕大的钳子格挡了这次攻击。
|
||||
actors.mobs.greatcrab.def_verb=格挡
|
||||
actors.mobs.greatcrab.desc=这只螃蟹的块头相当大,甚至超过了其她的下水道螃蟹。它的蓝色甲壳上布满了裂纹和藤壶,足以证明其经历的无数岁月。它爬行缓慢,那只巨大的钳子让它难以保持平衡。\n\n尽管这螃蟹只剩下一边的钳子,但钳子的个头完全弥补了这点不足。螃蟹只要发现危险就会把爪子举在身前,利用坚不可摧的甲壳进行防御。不过螃蟹无法格挡未察觉的攻击,也无法同时格挡多个敌人的进攻。
|
||||
actors.mobs.greatcrab.desc=这只螃蟹的块头相当大,甚至超过了其他的下水道螃蟹。它的蓝色甲壳上布满了裂纹和藤壶,足以证明其经历的无数岁月。它爬行缓慢,那只巨大的钳子让它难以保持平衡。\n\n尽管这螃蟹只剩下一边的钳子,但钳子的个头完全弥补了这点不足。螃蟹只要发现危险就会把爪子举在身前,利用坚不可摧的甲壳进行防御。不过螃蟹无法格挡未察觉的攻击,也无法同时格挡多个敌人的进攻。
|
||||
|
||||
actors.mobs.guard.name=监狱守卫
|
||||
actors.mobs.guard.scorpion=给我过来!
|
||||
|
@ -1053,7 +1053,7 @@ actors.mobs.king.defeated=你杀不死我,%s…我是…不朽的…
|
|||
actors.mobs.king.def_verb=格挡
|
||||
actors.mobs.king.arise=以我之名,复苏吧!奴隶们!
|
||||
actors.mobs.king.rankings_desc=屈服在矮人国王御前
|
||||
actors.mobs.king.desc=这名最后的矮人国王以对死灵术式的透彻理解而闻名。她成功说服王国议会的全体成员参加了一场本应让所有参与者获得永生的祭祀仪式。最终成功的只有国王自己——如果不算上她身边那支化为枯骨的死灵大军的话。
|
||||
actors.mobs.king.desc=这名最后的矮人国王以对死灵术式的透彻理解而闻名。他成功说服王国议会的全体成员参加了一场本应让所有参与者获得永生的祭祀仪式。最终成功的只有国王自己——如果不算上他身边那支化为枯骨的死灵大军的话。
|
||||
actors.mobs.king$undead.name=矮人亡灵
|
||||
actors.mobs.king$undead.def_verb=格挡
|
||||
actors.mobs.king$undead.rankings_desc=屈服在矮人国王御前
|
||||
|
@ -1077,9 +1077,9 @@ actors.mobs.mob.rankings_desc=死于:%s
|
|||
actors.mobs.monk.name=矮人武僧
|
||||
actors.mobs.monk.def_verb=格挡
|
||||
actors.mobs.monk.parried=招架
|
||||
actors.mobs.monk.desc=这些僧侣皆是狂热的信徒,倾其所能从一切异族手中保护国王的安全。狂热的信仰使得她们将自己的意志交给了国王,只剩下没有思想的躯壳在城市中游荡。\n\n矮人武僧既不披甲亦不执械,仅仅依靠自己的徒手格斗技巧退敌。精神集中的武僧会必定格挡住一次进攻,哪怕是必中的攻击。武僧在移动时会更快地集中精神,在战斗中就相对慢些。
|
||||
actors.mobs.monk.desc=这些僧侣皆是狂热的信徒,倾其所能从一切异族手中保护国王的安全。狂热的信仰使得他们将自己的意志交给了国王,只剩下没有思想的躯壳在城市中游荡。\n\n矮人武僧既不披甲亦不执械,仅仅依靠自己的徒手格斗技巧退敌。精神集中的武僧会必定格挡住一次进攻,哪怕是必中的攻击。武僧在移动时会更快地集中精神,在战斗中就相对慢些。
|
||||
actors.mobs.monk$focus.name=精神集中
|
||||
actors.mobs.monk$focus.desc=这个武僧已经完全集中于目标的一举一动,似乎能预料到目标的下一步动作。\n\n精神集中的武僧一定会格挡下一次物理攻击。格挡会分散武僧的注意力,使得她们需要一段时间重新集中精力来成功格挡攻击。在移动时武僧恢复地相对更快。
|
||||
actors.mobs.monk$focus.desc=这个武僧已经完全集中于目标的一举一动,似乎能预料到目标的下一步动作。\n\n精神集中的武僧一定会格挡下一次物理攻击。格挡会分散武僧的注意力,使得他们需要一段时间重新集中精力来成功格挡攻击。在移动时武僧恢复地相对更快。
|
||||
|
||||
actors.mobs.piranha.name=巨型食人鱼
|
||||
actors.mobs.piranha.desc=这些肉食性鱼类不是地下水池中的天然生物。它们被专门培育用来保护被水淹没的储藏室。
|
||||
|
@ -1106,7 +1106,7 @@ actors.mobs.scorpio.name=巨型蝎子
|
|||
actors.mobs.scorpio.desc=这些巨大的节肢类恶魔生物会尽可能避免一切近距离接触,并且会在远处射出能够致残的尖刺。
|
||||
|
||||
actors.mobs.senior.name=武僧大师
|
||||
actors.mobs.senior.desc=这些僧侣皆是狂热的信徒,倾其所能从一切异族手中保护国王的安全。狂热的信仰使得她们将自己的意志交给了国王,只剩下没有思想的躯壳在城市中游荡。\n\n这只武僧掌握了精深的格斗技巧,相较于普通的武僧,她能在移动时更迅速恢复集中。精神集中的武僧会必定格挡住一次进攻,哪怕是必中的攻击。武僧在移动时会更快地集中精神,在战斗中就相对慢些。
|
||||
actors.mobs.senior.desc=这些僧侣皆是狂热的信徒,倾其所能从一切异族手中保护国王的安全。狂热的信仰使得他们将自己的意志交给了国王,只剩下没有思想的躯壳在城市中游荡。\n\n这只武僧掌握了精深的格斗技巧,相较于普通的武僧,他能在移动时更迅速恢复集中。精神集中的武僧会必定格挡住一次进攻,哪怕是必中的攻击。武僧在移动时会更快地集中精神,在战斗中就相对慢些。
|
||||
|
||||
actors.mobs.shaman.name=豺狼萨满
|
||||
actors.mobs.shaman.bolt_kill=魔力的冲击粉碎了你...
|
||||
|
@ -1131,8 +1131,8 @@ actors.mobs.snake.name=下水道巨蛇
|
|||
actors.mobs.snake.hint=试试点击检查按钮再选择蛇,以了解如何击败它们。
|
||||
actors.mobs.snake.desc=这些体型庞大的蛇能通过快速滑行以闪避普通的攻击,让它们难以命中。不过伏击与魔法攻击会使它们措手不及。\n\n在这条蛇的视野外攻击它时可以触发伏击。当这条蛇在追击你时,可以尝试躲入一扇门后,再_在蛇进门的瞬间发动攻击_。
|
||||
|
||||
actors.mobs.spectralnecromancer.name=招魂茉莉伊洛
|
||||
actors.mobs.spectralnecromancer.desc=死灵茉莉伊洛们通常对召唤骷髅欲罢不能,但其中某些个体却偏爱使唤更为缥缈无形的造物。招魂茉莉伊洛们便选择了怨灵作为她们的爪牙!\n\n怨灵的个体战斗力或许不如骷髅,但这帮招魂茉莉伊洛无论一次性召唤出多少手下都不会嫌多!
|
||||
actors.mobs.spectralnecromancer.name=招魂法师
|
||||
actors.mobs.spectralnecromancer.desc=死灵法师们通常对召唤骷髅欲罢不能,但其中某些个体却偏爱使唤更为缥缈无形的造物。招魂法师们便选择了怨灵作为他们的爪牙!\n\n怨灵的个体战斗力或许不如骷髅,但这帮招魂法师无论一次性召唤出多少手下都不会嫌多!
|
||||
|
||||
actors.mobs.spinner.name=矿洞蜘蛛
|
||||
actors.mobs.spinner.desc=绿色而多毛的洞穴蜘蛛们会试着去躲避直接的战斗,它们更喜欢在远处等待其猎物卷入蜘网,在剧毒中慢慢死去。它们也能向远处喷吐蛛网,阻挡敌人的行动路线。
|
||||
|
@ -1171,11 +1171,11 @@ actors.mobs.thief.name=疯狂小偷
|
|||
actors.mobs.thief.stole=小偷偷走了你的%s!
|
||||
actors.mobs.thief.carries=\n\n这个小偷携带着一个_%s_。明显是偷来的。
|
||||
actors.mobs.thief.escapes=小偷带着你的%s逃走了!
|
||||
actors.mobs.thief.desc=这些囚犯逃出了她们的牢房,却没能逃出这座监牢。随着时间流逝,这座监牢彻底摧毁了她们仅存的心智,以及对自由的向往。这些疯狂的小偷和强盗很久以前就已经彻底忘记它们是谁,以及它们为何偷窃。\n\n这些敌人比起面对面地战斗,更倾向于偷走你的财物随后逃之夭夭。一定要看紧它们,否则你以后可能再也不会见到自己的被盗财物了。
|
||||
actors.mobs.thief.desc=这些囚犯逃出了他们的牢房,却没能逃出这座监牢。随着时间流逝,这座监牢彻底摧毁了他们仅存的心智,以及对自由的向往。这些疯狂的小偷和强盗很久以前就已经彻底忘记它们是谁,以及它们为何偷窃。\n\n这些敌人比起面对面地战斗,更倾向于偷走你的财物随后逃之夭夭。一定要看紧它们,否则你以后可能再也不会见到自己的被盗财物了。
|
||||
|
||||
actors.mobs.warlock.name=矮人噬魂女皇
|
||||
actors.mobs.warlock.name=矮人术士
|
||||
actors.mobs.warlock.bolt_kill=暗影能量使你的生命衰竭了……
|
||||
actors.mobs.warlock.desc=当矮人的兴趣从工程建设转向奥秘学术时,噬魂女皇们开始在城市中掌权。它们从元素魔法起步,但很快就开始研究恶魔学和死灵术。最强大的噬魂女皇掌握了矮人王国的王权,其她噬魂女皇如果想继续练习黑暗魔法,就必须放弃精神的自由,将意志交给她控制。\n\n这些噬魂女皇拥有具有强大的干扰性魔法,能暂时抑制装备的升级魔力。装备的等级越高,受降级魔法的影响就越严重。
|
||||
actors.mobs.warlock.desc=当矮人的兴趣从工程建设转向奥秘学术时,术士们开始在城市中掌权。它们从元素魔法起步,但很快就开始研究恶魔学和死灵术。最强大的术士掌握了矮人王国的王权,其他术士如果想继续练习黑暗魔法,就必须放弃精神的自由,将意志交给他控制。\n\n这些术士拥有具有强大的干扰性魔法,能暂时抑制装备的升级魔力。装备的等级越高,受降级魔法的影响就越严重。
|
||||
|
||||
actors.mobs.wraith.name=怨灵
|
||||
actors.mobs.wraith.desc=怨灵是来自于墓穴中渴望复仇的罪人之魂。作为飘渺的非实体很难被正常武器击中。
|
||||
|
@ -1184,16 +1184,16 @@ actors.mobs.yog.name=Yog-Dzewa
|
|||
actors.mobs.yog.notice=希望已死,汝之存在亦将化为虚无…
|
||||
actors.mobs.yog.defeated=…
|
||||
actors.mobs.yog.rankings_desc=被Yog-Dzewa吞噬
|
||||
actors.mobs.yog.desc=Yog-Dzewa是一位上古之神,来自混沌位面的强大存在。一个世纪前,古代矮人在同恶魔大军的战争中惨胜,却无法杀死这名神祇。她们只得将这名存在封印在都城下的厅堂之中,希望这位力量被削弱的神祇永无重见天日之时。
|
||||
actors.mobs.yog.desc=Yog-Dzewa是一位上古之神,来自混沌位面的强大存在。一个世纪前,古代矮人在同恶魔大军的战争中惨胜,却无法杀死这名神祇。他们只得将这名存在封印在都城下的厅堂之中,希望这位力量被削弱的神祇永无重见天日之时。
|
||||
actors.mobs.yog$rottingfist.name=腐烂之拳
|
||||
actors.mobs.yog$rottingfist.rankings_desc=被Yog-Dzewa吞噬
|
||||
actors.mobs.yog$rottingfist.desc=Yog-Dzewa是一位上古之神,来自混沌位面的强大存在。一个世纪前,古代矮人在同恶魔大军的战争中惨胜,却无法杀死这名神祇。她们只得将这名存在封印在都城下的厅堂之中,希望这位力量被削弱的神祇永无重见天日之时。
|
||||
actors.mobs.yog$rottingfist.desc=Yog-Dzewa是一位上古之神,来自混沌位面的强大存在。一个世纪前,古代矮人在同恶魔大军的战争中惨胜,却无法杀死这名神祇。他们只得将这名存在封印在都城下的厅堂之中,希望这位力量被削弱的神祇永无重见天日之时。
|
||||
actors.mobs.yog$burningfist.name=燃烧之拳
|
||||
actors.mobs.yog$burningfist.rankings_desc=被Yog-Dzewa吞噬
|
||||
actors.mobs.yog$burningfist.desc=Yog-Dzewa是一位上古之神,来自混沌位面的强大存在。一个世纪前,古代矮人在同恶魔大军的战争中惨胜,却无法杀死这名神祇。她们只得将这名存在封印在都城下的厅堂之中,希望这位力量被削弱的神祇永无重见天日之时。
|
||||
actors.mobs.yog$burningfist.desc=Yog-Dzewa是一位上古之神,来自混沌位面的强大存在。一个世纪前,古代矮人在同恶魔大军的战争中惨胜,却无法杀死这名神祇。他们只得将这名存在封印在都城下的厅堂之中,希望这位力量被削弱的神祇永无重见天日之时。
|
||||
actors.mobs.yog$larva.name=古神幼虫
|
||||
actors.mobs.yog$larva.rankings_desc=被Yog-Dzewa吞噬
|
||||
actors.mobs.yog$larva.desc=Yog-Dzewa是一位上古之神,来自混沌位面的强大存在。一个世纪前,古代矮人在同恶魔大军的战争中惨胜,却无法杀死这名神祇。她们只得将这名存在封印在都城下的厅堂之中,希望这位力量被削弱的神祇永无重见天日之时。
|
||||
actors.mobs.yog$larva.desc=Yog-Dzewa是一位上古之神,来自混沌位面的强大存在。一个世纪前,古代矮人在同恶魔大军的战争中惨胜,却无法杀死这名神祇。他们只得将这名存在封印在都城下的厅堂之中,希望这位力量被削弱的神祇永无重见天日之时。
|
||||
|
||||
actors.mobs.yogdzewa.name=Yog-Dzewa
|
||||
actors.mobs.yogdzewa.notice=我 看 见 你 了
|
||||
|
@ -1201,7 +1201,7 @@ actors.mobs.yogdzewa.darkness=黑暗正在逼近……
|
|||
actors.mobs.yogdzewa.hope=汝・之・希・望・皆・为・虚・妄
|
||||
actors.mobs.yogdzewa.defeated=……
|
||||
actors.mobs.yogdzewa.rankings_desc=被Yog-Dzewa吞噬
|
||||
actors.mobs.yogdzewa.desc=Yog-Dzewa是一个古老的神;一个将自己的力量延伸向凡间世界并吞噬它们、以为自身无尽的成长提供养分的巨大怪物。矮人一定是在玩弄黑暗魔法的时候引起了这个巨大恐怖的注意,并且从那以后就一直试图控制她,使之无法侵吞外界。\n\n这位古神起源于一个原始的、充满魔法与混沌的维度,且无法将她的真实形态带入这个世界。因此,她创造了自己的化身并召唤了恶魔们作为她的仆从来完成它的命令。\n\n这只巨眼是古神在这个世界上力量的焦点。虽然这只眼睛本身是不可移动的,但它能够射出强大的魔能光束,并召唤各种恶魔仆从来帮助它。
|
||||
actors.mobs.yogdzewa.desc=Yog-Dzewa是一个古老的神;一个将自己的力量延伸向凡间世界并吞噬它们、以为自身无尽的成长提供养分的巨大怪物。矮人一定是在玩弄黑暗魔法的时候引起了这个巨大恐怖的注意,并且从那以后就一直试图控制他,使之无法侵吞外界。\n\n这位古神起源于一个原始的、充满魔法与混沌的维度,且无法将他的真实形态带入这个世界。因此,他创造了自己的化身并召唤了恶魔们作为他的仆从来完成它的命令。\n\n这只巨眼是古神在这个世界上力量的焦点。虽然这只眼睛本身是不可移动的,但它能够射出强大的魔能光束,并召唤各种恶魔仆从来帮助它。
|
||||
actors.mobs.yogdzewa.desc_spawners=你感觉到恶魔能量正从上层涌向古神之眼。你在上面活着留下的什么东西正在给古神回馈着能量。_古神会使用这股能量召唤更强大的手下!_
|
||||
actors.mobs.yogdzewa$larva.name=古神幼虫
|
||||
actors.mobs.yogdzewa$larva.rankings_desc=被Yog-Dzewa吞噬
|
||||
|
|
|
@ -188,7 +188,7 @@ challenges.sbsg = Π突变巨兽Π
|
|||
challenges.sbsg_desc=人类回想起了,被巨人支配的恐惧\n-所有生物都会突变激素变得更大,但一些因为一些其他不良反应原因会变得更小。\n-生物的大小决定了他们的移动速度、防御、闪避和近战伤害。\n-你的极度饥饿也会变得更加致命。\n-同时,如果怪物失去了你的视野,他将变回去,属性也会和无挑一样。
|
||||
challenges.exsg = Π药水癔症Π
|
||||
challenges.exsg_desc=药水癔症详细规则:\n力量药水 力量-1\n灵视药剂 喝后失明5回合\n隐形药剂 喝后立刻怒吼\n经验药剂 喝后立刻流血6回合\n极速药剂 喝后立刻残废8回合\n==========================\n小型口粮 吃后立刻获得极速8回合\n炖肉 吃后立刻升级\n冷冻生肉片 吃后获得奥术护盾\n全肉大饼 吃后立刻获得8回合极速 且+1力量\n不知道何种原因,大部分正面药水你都感觉有毒!\n部分药水完全处于DeBuff,但食物却会很有用!\n恐药异症的效果同样存在
|
||||
challenges.light&black = Π光与影Π
|
||||
challenges.light&black = Π空洞旅程Π
|
||||
challenges.light&black_desc=\n_一次次的踏入地牢只会使自己更加的被恶毒的魔法侵蚀。_这一次,你已不知道是何时再来到这个地牢,但邪恶的诡异气氛扑面而来。一个神秘人给了你一个提灯。你却不知道何时会被这里的魔法吞噬。\n\n开启本挑战,将会获得在开局获得特殊理智Buff,并且追加一个新道具_提灯_,提灯的精神力量需要玩家击败敌人获得。\n\n_只有光芒中,你才能活下去。否则,你会被黑暗蚕食,一点点的丧失理智,成为怪物。_\n\n一旦你理智过低将会出现特殊怪物和Debuff。理智为0将立刻死亡并成为怪物,如果有十字架将会复活并回复100理智,但你上次的东西将全部在上一次你理智变为0的怪物身上。\n\n_它是你前世的回响。打败它,夺回它的力量,让自己重归完整。_\n\n_完成光与影挑战将会在0层追加神秘人物……以及解锁全新物品和武器!_\n\n开启本挑战将会在开局获得240点理智,在_没有光芒下_和_部分怪物的近战_将会使你理智降低。详情查看下表:\n\n-棕色老鼠:20%概率(-1理智/每回合)\n-黑色怨灵:10%概率(-3理智/每回合)\n-火把猎人:40%概率(-1理智/每回合)\n-矮人术士:15%概率(-5理智/每回合)\n-寒冰老鼠:25%概率(-2理智/每回合)\n-DM200:10%概率(-7理智/每回合)\n-矮人武僧:30%的概率(-3理智/每回合)\n\n_环境理智扣除_:\n-没有光芒Buff的情况下\n:\n\n_理智回复策略_:\n-_1_:存在光芒的情况下以:[(+1理智+楼层深度/10)/每回合](举例:20层没有光芒的情况下,1+20/10=3(+3智/每回合)\n-_2_.商人售卖信仰药水,喝下去追加40回合理智\n-_3_.击败敌人可以获得敌人的灵魂,灵魂到一定数量可以使提灯可以再次点亮道路。灵魂也可以缓慢回复理智。(50灵魂=1理智回复)
|
||||
|
||||
challenges.happy = 深度调查
|
||||
|
|
129
core/src/main/assets/messages/private/private_el.properties
Normal file
|
@ -0,0 +1,129 @@
|
|||
items.heap.grave=Ταφόπλακα του Ήρωα
|
||||
|
||||
|
||||
scenes.hallofheroesscene.title=Πάνθεον των Ηρώων
|
||||
scenes.hallofheroesscene.no_games=Δεν υπάρχουν ήρωες σε αυτή την σελίδα
|
||||
scenes.hallofheroesscene.page=Σελίδα %1$d/%2$d
|
||||
|
||||
scenes.supporterscene.gplay_msg=Αν σάς αρέσει το Shattered Pixel Dungeon, και θέλετε να με βοηθήσετε να συνεχίσω την ανάπτυξή του, _παρακαλώ σκεφτείτε να γίνετε υποστηρικτής!_ Υπάρχουν και κάποια κοσμητικά πρόσθετα, αποκλειστικά διαθέσιμα στους υποστηρικτές!\n\nΠατήστε οποιοδήποτε πλήκτρο παρακάτω, για να μάθετε περισσότερα.
|
||||
scenes.supporterscene.loading=Φόρτωση...
|
||||
scenes.supporterscene.failed=Δεν μπόρεσαν να εμφανιστούν οι πληροφορίες πληρωμής!\n\nΒεβαιώσου ότι είσαι συνδεδεμένος στο ίντερνετ.
|
||||
scenes.supporterscene.silver=Ασημένιος Υποστηρικτής
|
||||
scenes.supporterscene.gold=Χρυσός Υποστηρικτής
|
||||
scenes.supporterscene.shattered=Υποστηρικτής Shattered
|
||||
scenes.supporterscene.purchased=Αγοράστηκε!
|
||||
scenes.supporterscene.pending=Αναμένεται Πληρωμή...
|
||||
|
||||
scenes.titlescene.thank_you=Σάς ευχαριστώ!
|
||||
|
||||
|
||||
ui.donationbutton.pls_1=Παρακαλώ Σκεφτείτε Να Κάνετε Δωρεά
|
||||
ui.donationbutton.pls_2=Δωρεές & Ανταμοιβές
|
||||
ui.donationbutton.pls_3=Κάντε Δωρεά, Λάβετε Ανταμοιβές!
|
||||
ui.donationbutton.pls_4=Δωρεές & Εξτρά
|
||||
ui.donationbutton.ty_1=Σε Ευχαριστώ!
|
||||
ui.donationbutton.ty_3=Ευχαριστώ για τη Δωρεά!
|
||||
ui.donationbutton.ty_2=Ευχαριστώ!
|
||||
|
||||
ui.renamebutton.title=Δώσε Ένα Όνομα Ήρωα
|
||||
ui.renamebutton.rename=Μετονομασία
|
||||
ui.renamebutton.revert=Επαναφορά
|
||||
|
||||
|
||||
windows.wndanalytics.title=Κοινοποίηση Δεδομένων Παιχνιδιού
|
||||
windows.wndanalytics.policy=Πλήρης Πολιτική Απορρήτου
|
||||
windows.wndanalytics.text=Μπορείτε να βοηθήσετε το Shattered Pixel Dungeon με το διαμοιρασμό των δεδομένων από το παιχνίδι σας.\n\nΑυτές οι πληροφορίες είναι εξαιρετικά χρήσιμες όταν παίρνονται αποφάσεις στο σχεδιασμό του παιχνιδιού· γι'αυτό η συναίνεση είναι πολύ καλός τρόπος να υποστηρίξετε το παιχνίδι, απλά παίζοντας.\n\nΚαμία προσωπική πληροφορία δε συλλέγεται και η χρήση δεδομένων δικτύου είναι ελάχιστη.
|
||||
windows.wndanalytics.games=Ο μοιρασμός των δεδομένων παιχνιδιού είναι αυτόματα ενεργοποιημένος, ως μέρος του Google Play Games.
|
||||
|
||||
windows.wndsupportertiers$tier1info.title=Ασημένιος Υποστηρικτής
|
||||
windows.wndsupportertiers$tier1info.intro=Οι ασημένιοι υποστηρικτές λαμβάνουν ανταμοιβές γύρω από τους ήρωες του παιχνιδιού! Μπορείτε επίσης να αναβαθμιστείτε σε υψηλότερη βαθμίδα υποστηρικτή, οποιαδήποτε στιγμή.
|
||||
windows.wndsupportertiers$tier1info.rewards=Ασημένιες Ανταμοιβές:
|
||||
windows.wndsupportertiers$tier1info.menu=Ασημένιο Κουμπί Μενού
|
||||
windows.wndsupportertiers$tier1info.rename_title=Ονόμασε τον ήρωά σου
|
||||
windows.wndsupportertiers$tier1info.rename_desc=Οι χαρακτήρες και η λίστα κατάταξης θα σε αναφέρουν με το όνομά σου!
|
||||
windows.wndsupportertiers$tier1info.graves_title=Ταφόπλακες
|
||||
windows.wndsupportertiers$tier1info.graves_desc=Τα λείψανα πεσόντων ηρώων εμφανίζονται σε ξεχωριστή ταφόπλακα, με μοναδικό επιτάφιο!
|
||||
windows.wndsupportertiers$tier2info.title=Χρυσός Υποστηρικτής
|
||||
windows.wndsupportertiers$tier2info.intro=Μαζί με τις ασημένιες ανταμοιβές, οι Χρυσοί Υποστηρικτές λαμβάνουν πιο εκτενείς επιλογές μετονομασίας και μία μεγάλη επέκταση των κατατάξεων του παιχνιδιού!
|
||||
windows.wndsupportertiers$tier2info.rewards=Χρυσές Ανταμοιβές:
|
||||
windows.wndsupportertiers$tier2info.silver=Όλες οι Ασημένιες Ανταμοιβές
|
||||
windows.wndsupportertiers$tier2info.menu=Χρυσό Κουμπί Μενού
|
||||
windows.wndsupportertiers$tier2info.rename_title=Μετονομασία Εξοπλισμού
|
||||
windows.wndsupportertiers$tier2info.rename_desc=Δώσε στον αγαπημένο σου εξοπλισμό ατομικές ονομασίες!
|
||||
windows.wndsupportertiers$tier2info.hall_title=Πάνθεον των Ηρώων
|
||||
windows.wndsupportertiers$tier2info.hall_desc=Τέσσερις ξεχωριστές σελίδες κατατάξεων με υποστήριξη για προσαρμοσμένες σημειώσεις!
|
||||
windows.wndsupportertiers$tier3info.title=Υποστηρικτής Shattered
|
||||
windows.wndsupportertiers$tier3info.intro=Οι Shattered Υποστηρικτές λαμβάνουν τα πάντα στις προηγούμενες βαθμίδες, συν μία αποκλειστική χρυσή κορνίζα σε όλο το παιχνίδι! Σε ευχαριστώ πολύ για την υποστήριξή σου!
|
||||
windows.wndsupportertiers$tier3info.rewards=Ανταμοιβές Shattered:
|
||||
windows.wndsupportertiers$tier3info.silver=Όλες οι Ασημένιες Ανταμοιβές
|
||||
windows.wndsupportertiers$tier3info.golden=Όλες οι Χρυσές Ανταμοιβές
|
||||
windows.wndsupportertiers$tier3info.menu=Σμαραγδένιο Κουμπί Μενού
|
||||
windows.wndsupportertiers$tier3info.interface_title=Χρυσή Οθόνη Διεπαφής
|
||||
windows.wndsupportertiers$tier3info.interface_desc=Τα παράθυρα και η κύρια οθόνη διεπαφής του παιχνιδιού λαμβάνουν μία λαμπερή χρυσή κορνίζα!
|
||||
windows.wndsupportertiers$tier3info.enable_gold=Ενεργοποίηση Χρυσής ΟΔ
|
||||
windows.wndsupportertiers$tier3info.disable_gold=Απενεργοποιήση Χρυσής ΟΔ
|
||||
windows.wndsupportertiers$iconbutton.normal=Θέσε το Εικονίδιο σε Κανονικό
|
||||
windows.wndsupportertiers$iconbutton.silver=Θέσε το Εικονίδιο σε Ασημένιο
|
||||
windows.wndsupportertiers$iconbutton.golden=Θέσε το Εικονίδιο σε Χρυσό
|
||||
windows.wndsupportertiers$iconbutton.shattered=Θέσε το Εικονίδιο σε Shattered
|
||||
windows.wndsupportertiers$paymentbutton.purchase=Ανόρασε - %s
|
||||
windows.wndsupportertiers$paymentbutton.pending=Αναμένεται Πληρωμή...
|
||||
|
||||
windows.wndgame.rename_equip=Μετονομασία Εξοπλισμού
|
||||
windows.wndgame.select_item=διάλεξε ένα αντικείμενο
|
||||
windows.wndgame.dialog_title=Δώσε Ένα Όνομα Αντικειμένου
|
||||
windows.wndgame.dialog_rename=Μετονομασία
|
||||
windows.wndgame.dialog_revert=Επαναφορά
|
||||
|
||||
windows.wndgoogleplaygames.title=Google Play Games
|
||||
windows.wndgoogleplaygames.text=Το Shattered Pixel Dungeon χρησιμοποιεί το Google Play Games για να υποστηρίξει έξτρα χαρακτηριστικά!\n\nΜε το να συνδέεται στο Google Play Games το Shattered Pixel Dungeon μπορεί:\n- Να συγχρονίζει τις κατατάξεις και τα σήματα μεταξύ συσκευών\n- Να ξεκλειδώνει επιτεύγματα Google Play\n- Να συλλέγει δεδομένα για να βοηθήσει να βελτιωθεί το παιχνίδι\n\nΜπορείς να αποσυνδεθείς ανά πάσα στιγμή, και η χρήση δεδομένων μένει στο ελάχιστο.
|
||||
windows.wndgoogleplaygames.connect=Σύνδεση
|
||||
windows.wndgoogleplaygames.disconnect=Αποσύνδεση
|
||||
windows.wndgoogleplaygames.policy=Πλήρης Πολιτική Απορρήτου
|
||||
windows.wndgoogleplaygames.close=Κλείσιμο
|
||||
windows.wndgoogleplaygames.data_use_title=Πληροφορίες Χρήσης Δεδομένων
|
||||
windows.wndgoogleplaygames.data_use_text=Το Shattered Pixel Dungeon χρησιμοποιεί τις υπηρεσίες Google Play για τους ακόλουθους σκοπούς:\n\n- Να παρέχει έξτρα χαρακτηριστικά στο παιχνίδι, όπως συγχρονισμό δεδομένων και επιτεύγματα Google Play.\n\n- Να μαζέψει ανώνυμες δημογραφικές πληροφορίες οι οποίες χρησιμοποιούνται για να κατανοηθεί καλύτερα ποιός παίζει το παιχνίδι.\n- Να μαζέψει δεδομένα παιξίματος τα οποία χρησιμοποιούνται για καλύτερη κατανοήση του πώς να βελτιωθεί το παιχνίδι.\n\nΤο Shattered Pixel Dungeon δεν συλλέγει καμία προσωπική ταυτοποιητική πληροφορία.
|
||||
windows.wndgoogleplaygames.outdated_warn=Από την επόμενη ενημέρωση παιχνιδιού (%1$s), το Google Play Games θα απαιτεί Android %2$s και, επομένως, θα είναι απενεργοποιημένο σ'αυτήν τη συσκευή.\n\nΤίποτε απ'τα συγχρονισμένα δεδομένα σου δε θα χαθεί· αλλά η συσκευή σου δε θα μπορεί να συγχρονίσει νέα δεδομένα, ή να ξεκλειδώσει νέα επιτεύγματα Google Play.
|
||||
|
||||
windows.wndranking.copy=Αντιγραφή στο Πάνθεον των Ηρώων
|
||||
windows.wndranking.move=Μετακίνηση
|
||||
windows.wndranking.page=Σελίδα %d
|
||||
windows.wndranking.move_where=Πού θα ήθελες να μετακινήσεις τον ήρωά σου;
|
||||
windows.wndranking.page_full=Αυτή η σελίδα είναι γεμάτη· θα πρέπει πρώτα να αφαιρέσετε καταγραφές.
|
||||
windows.wndranking.remove=Διαγραφή
|
||||
windows.wndranking.remove_warn=Θέλετε σίγουρα να αφαιρέσετε αυτήν την καταγραφή από το Πάνθεον των ηρώων;\n\nΕάν δε βρίσκεται στη σελίδα κατάταξης, θα χαθεί οριστικά.
|
||||
windows.wndranking.notes=Σχόλια
|
||||
windows.wndranking.custom_note=Προσωπικό Σχόλιο
|
||||
windows.wndranking.save=Αποθήκευση
|
||||
windows.wndranking.cancel=Ακύρωση
|
||||
windows.wndranking.already_there=Αυτή η καταγραφή υπάρχει ήδη στο Πάνθεον των Ηρώων.
|
||||
windows.wndranking.copy_where=Πού θα ήθελες να αντιγράψεις τον ήρωά σου;
|
||||
|
||||
windows.wndsettings.analytics=Κοινοποίηση Δεδομένων Παιχνιδιού
|
||||
windows.wndsettings.googleplaygames=Google Play Games
|
||||
|
||||
windows.wndsupportprompt.please_consider=Εάν σάς αρέσει το ShatteredPD, και θέλετε να με βοηθήσετε να συνεχίσω την ανάπτυξή του, παρακαλώ σκεφτείτε να υποστηρίξετε το παιχνίδι!
|
||||
windows.wndsupportprompt.share_data=Ένας εύκολος τρόπος να βοηθήσετε είναι με _το διαμοιρασμό των δεδομένων από το παιχνίδι σας._\n\nΧρησιμοποιώ αυτές τις πληροφορίες για να πάρω αποφάσεις πάνω στο σχεδιασμό του παιχνιδιού· γι'αυτό, η αποστολή δεδομένων είναι πολύ καλός τρόπος να υποστηρίξετε το παιχνίδι, παίζοντάς το.\n\nΚαμία προσωπική πληροφορία δε συλλέγεται και η χρήση δεδομένων δικτύου είναι ελάχιστη. Μπορείτε να αλλάξετε αυτήν τη ρύθμιση ανά πάσα στιγμή, ή να δείτε την πλήρη πολιτική απορρήτου· από την καρτέλα "Ρυθμίσεις συνδεσιμότητας" στο μενού ρυθμίσεων.
|
||||
windows.wndsupportprompt.continue=Συνέχισε
|
||||
windows.wndsupportprompt.thank_you=_Σας ευχαριστώ!_\n\nΕάν σάς ενδιαφέρουν άλλοι τρόποι υποστήριξης του παιχνιδιού, μπορείτε:
|
||||
windows.wndsupportprompt.okay=Εντάξει, κανένα πρόβλημα.\n\nΕάν σάς ενδιαφέρουν άλλοι τρόποι να υποστηρίξετε το παιχνίδι, μπορείτε να:
|
||||
windows.wndsupportprompt.rating_support=_- Δώσε στο παιχνίδι μία ειλικρινή αξιολόγηση ή κριτική._ Αυτές αυξάνουν την ορατότητα του παιχνιδιού, που βοηθά περισσότερους ανθρώπους να το βρουν!\n\n_- Υποστήριξε το παιχνίδι απευθείας._ Υποστηρίζοντας συμβάλλεις άμεσα στην ανάπτυξη του Shattered, συν ότι θα λάβεις μερικά εξτρά ως ευχαριστώ!\n\nΕυχαριστώ για τον χρόνο σου, καλή εξερεύνηση μπουντρουμιών!
|
||||
windows.wndsupportprompt.rating=Άφησε μία Αξιολόγηση/Κριτική
|
||||
windows.wndsupportprompt.support=Άνοιξε την Οθόνη Υποστηρικτή
|
||||
|
||||
bones.here_lies_nameless=Εδώ κείτεται ένας/μία ανώνυμος/η %s.
|
||||
bones.here_lies_named=Εδώ κείτεται ο/η %2$s %1$s.
|
||||
bones.pacifist=Ξακουστός ως ειρηνιστής, ο ήρωας πέθανε χωρίς να στερήσει άλλη ζωή.
|
||||
bones.rats=Ένας αξιότιμος κοπανητής αρουραίων, έχει νικήσει %d εχθρούς πριν πεθάνει.
|
||||
bones.crabs=Ένας ικανός συνθλίβων καβουριών, έχουν νικήσει %d εχθρούς πριν πεθάνουν.
|
||||
bones.undead=Ένας τρόμος για τους εκρηκτικούς ζωντανούς νεκρούς, έχει νικήσει %d εχθρούς πριν πεθάνει.
|
||||
bones.thieves=Ένας κυνηγός τρλαμένων κλεφτών, έχει νικήσει %d εχθρούς πριν πεθάνει.
|
||||
bones.bats=Ένας κόπτης φτερών νυχτερίδων, έχει νικήσει %d εχθρούς πριν πεθάνει.
|
||||
bones.brutes=Ένας συνθλίβων περικεφαλαίων gnoll, έχει νικήσει %d εχθρούς πριν πεθάνει.
|
||||
bones.monks=Έμπειρος στην μάχη νάνων πολεμιστών, έχει νικήσει %d εχθρούς πριν πεθάνει.
|
||||
bones.golems=Ένας καταστροφέας εφευρέσεων νάνων, έχει νικήσει %d εχθρούς πριν πεθάνει.
|
||||
bones.demons=Ένας θρυλικός κυνηγός δαιμόνων, έχει νικήσει %d εχθρούς πριν πεθάνει.
|
||||
bones.yog=Προκαλών ενός θεού δαίμονα, έχει νικήσει %d εχθρούς πριν πεθάνει.
|
||||
bones.forgot_vial=Τι ντροπή, που στις ωδίνες του θανάτου ξέχασε ότι το φιαλίδιο δρόσου δεν ανασταίνει αυτόματα.
|
||||
bones.forgot_potion=Ντροπή που στις ωδίνες του θανάτου ξέχασαν να πιούν ένα Φίλτρο Γιατρειάς.
|
||||
bones.rest_in_peace=Αφήνουν τα υπάρχοντά τους σ'αυτόν τον κόσμο, προτού περάσουν στον επόμενο. Με την ελπίδα ότι ίσως κάποιος άλλος ήρωας αποφύγει τη φρικτή τους μοίρα.
|
|
@ -1,4 +1,18 @@
|
|||
#scenes.aboutscene.=
|
||||
windows.wndsettings$displaytab.splash_screen=启动时的瀑布界面
|
||||
windows.wndsettings$displaytab.disable=关闭
|
||||
windows.wndsettings$displaytab.full=开启
|
||||
|
||||
scenes.feedbackscene$1.title=确定退出游戏?
|
||||
scenes.feedbackscene$1.intro=你确定要退出游戏吗?
|
||||
scenes.feedbackscene$1.sponsor_msg=如果是,请点击退出游戏。如果不是,请点击回到游戏。
|
||||
scenes.feedbackscene$1.feedback_msg=地牢总是危险多端的,因此,往往需要你去探索他们。
|
||||
scenes.feedbackscene$1.feedback_msg_pr=你可以加入魔绫开发总群,与作者交谈,与其他大佬一起学习进步。
|
||||
scenes.feedbackscene$1.thanks=魔绫像素地牢随时欢迎你的再次回归。
|
||||
scenes.feedbackscene$1.sponsor_link=退出游戏
|
||||
scenes.feedbackscene$1.feedback_link=回到游戏
|
||||
scenes.feedbackscene$1.join_link=加入魔绫开发总群
|
||||
|
||||
|
||||
scenes.changesscene.earlier=破碎更新动态
|
||||
scenes.changesscene.later=魔绫更新动态
|
||||
|
@ -104,6 +118,7 @@ scenes.gamescene.descend=你降入了地牢的第%d层。
|
|||
scenes.gamescene.spawner_warn=你感觉有一个恶魔能量的供给源在你头顶上......
|
||||
scenes.gamescene.spawner_warn_final=你能感觉到恶魔能量从楼上辐射到了这里!并且这里正在扭曲变换,你有大麻烦了!
|
||||
|
||||
scenes.gamescene.resurrect=十字架使你重置了地牢……
|
||||
scenes.gamescene.warp=你四周的墙壁开始扭曲变换!
|
||||
scenes.gamescene.return=你回到了地牢的第%d层。
|
||||
scenes.gamescene.secret_hint=直觉告诉你这层的某处一定存在着一个隐藏的房间...
|
||||
|
|
|
@ -1,7 +1,14 @@
|
|||
windows.textchallenges.seed_custom_title = 种子
|
||||
windows.textchallenges.seed_custom_title = 种子windows.textchallenges.seed_custom_title = 种子
|
||||
windows.textchallenges.hint = 不输入即为随机种子
|
||||
windows.textchallenges.delete_seed_input = 清除
|
||||
|
||||
windows.wndinfomob.dsinfo = 闪避概率:
|
||||
windows.wndinfomob.maxinfo = 最大等级:
|
||||
windows.wndinfomob.getexp = 可获经验:
|
||||
windows.wndinfomob.getdmg = 伤害波段:
|
||||
windows.wndinfomob.itm = 固定掉落:
|
||||
windows.wndinfomob.shield= 护盾属性:
|
||||
|
||||
windows.wndblacksmith.prompt=好吧,按之前说好的,我得帮你做点事:我可以重铸2件物品并将它们制成一个品质更好的。
|
||||
windows.wndblacksmith.select=选择要重铸的物品
|
||||
windows.wndblacksmith.reforge=重铸物品
|
||||
|
|
BIN
core/src/main/assets/mobs/dm150.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
core/src/main/assets/mobs/dm300.png
Normal file
After Width: | Height: | Size: 716 B |
BIN
core/src/main/assets/mobs/dm300attackmode.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
core/src/main/assets/mobs/dm300deathballmode.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
core/src/main/assets/mobs/dm300special.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
core/src/main/assets/mobs/dm300spidermode.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
core/src/main/assets/mobs/dm75.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
core/src/main/assets/music/Open.ogg
Normal file
BIN
core/src/main/assets/sounds/ansdoship.mp3
Normal file
BIN
core/src/main/assets/splashes/ansdoship.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
core/src/main/assets/splashes/gdx.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
core/src/main/assets/splashes/mage.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
core/src/main/assets/splashes/r.jpg
Normal file
After Width: | Height: | Size: 508 KiB |
BIN
core/src/main/assets/splashes/warrior.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
core/src/main/assets/sprites/BrownBat.png
Normal file
After Width: | Height: | Size: 665 B |
BIN
core/src/main/assets/sprites/FireBallMob.png
Normal file
After Width: | Height: | Size: 1021 B |
BIN
core/src/main/assets/sprites/FireMagicGirl.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
core/src/main/assets/sprites/RedSearm.png
Normal file
After Width: | Height: | Size: 5.4 KiB |
BIN
core/src/main/assets/sprites/Viaw.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
core/src/main/assets/sprites/bluenecromancer.png
Normal file
After Width: | Height: | Size: 1000 B |
BIN
core/src/main/assets/sprites/boss/SlimeKing.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
core/src/main/assets/sprites/boss/SlimePrincess.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
core/src/main/assets/sprites/coldrat.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
core/src/main/assets/sprites/crstal.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
core/src/main/assets/sprites/crstalspawn.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
core/src/main/assets/sprites/dm720.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
core/src/main/assets/sprites/dwarven_flameboi.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
core/src/main/assets/sprites/flamec01.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
core/src/main/assets/sprites/icegolem.png
Normal file
After Width: | Height: | Size: 961 B |
BIN
core/src/main/assets/sprites/icemagicgirl.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
core/src/main/assets/sprites/ife_scriopi.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
core/src/main/assets/sprites/items.png
Normal file
After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB |
BIN
core/src/main/assets/sprites/jamulet.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
core/src/main/assets/sprites/monkdied.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
core/src/main/assets/sprites/pylonks.png
Normal file
After Width: | Height: | Size: 278 B |
BIN
core/src/main/assets/sprites/rednecromancer.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
core/src/main/assets/sprites/rednecromancer_ex.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
core/src/main/assets/sprites/ren.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
core/src/main/assets/sprites/slimekingch.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
core/src/main/assets/sprites/thief2.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
core/src/main/assets/sprites/unkown.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
core/src/main/assets/sprites/zei.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
|
@ -22,6 +22,24 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon;
|
||||
|
||||
public class Assets {
|
||||
public static final String BGM_1 = "music/Level1.ogg";
|
||||
public static final String BGM_2 = "music/Level2.ogg";
|
||||
public static final String BGM_3 = "music/Level3.ogg";
|
||||
public static final String BGM_4 = "music/Level4.ogg";
|
||||
public static final String BGM_5 = "music/Level5.ogg";
|
||||
public static final String BGM_0 = "music/Level0.ogg";
|
||||
public static final String DEATHA = "sounds/death.mp3";
|
||||
public static final String TOWN = "music/town.ogg";
|
||||
public static final String BGM_BOSSA = "music/Boss1.ogg";
|
||||
public static final String BGM_BOSSB = "music/Boss2.ogg";
|
||||
public static final String BGM_BOSSC = "music/Boss3.ogg";
|
||||
public static final String BGM_BOSSC3 = "music/Ice.ogg";
|
||||
public static final String BGM_BOSSD = "music/Boss4.ogg";
|
||||
public static final String BGM_BOSSD2 = "music/DwarfMaster.ogg";
|
||||
public static final String BGM_BOSSE = "music/Boss5.ogg";
|
||||
public static final String BGM_BOSSE3 = "music/Yogdead.ogg";
|
||||
public static final String RUN = "music/Run.ogg";
|
||||
public static final String NYZSHOP = "music/nyzshop2.ogg";
|
||||
|
||||
public static class Effects {
|
||||
public static final String EFFECTS = "effects/effects.png";
|
||||
|
@ -55,6 +73,14 @@ public class Assets {
|
|||
public static final String CAVES_BOSS = "environment/custom_tiles/caves_boss.png";
|
||||
public static final String CITY_BOSS = "environment/custom_tiles/city_boss.png";
|
||||
public static final String HALLS_SP = "environment/custom_tiles/halls_special.png";
|
||||
|
||||
public static final String TILES_COLD = "environment/Reload.png";
|
||||
public static final String TILES_DIED = "environment/tiles_died.png";
|
||||
|
||||
public static final String WATER_COLD= "environment/water-1.png";
|
||||
public static final String PRISON_EXIT_OLD = "environment/custom_tiles/prison_exit_old.png";
|
||||
public static final String PRISON_EXIT_NEW = "environment/custom_tiles/prison_exit_new.png";
|
||||
public static final String P_BOSS = "environment/custom_tiles/p_boss.png";
|
||||
}
|
||||
|
||||
//TODO include other font assets here? Some are platform specific though...
|
||||
|
@ -114,6 +140,8 @@ public class Assets {
|
|||
|
||||
public static class Music {
|
||||
public static final String THEME = "music/theme.ogg";
|
||||
public static final String GO = "music/Open.ogg";
|
||||
public static final String SHOP = "music/shop.ogg";
|
||||
public static final String THEME_1 = "music/theme.ogg";
|
||||
public static final String THEME_2 = "music/theme.ogg";
|
||||
|
||||
|
@ -136,6 +164,12 @@ public class Assets {
|
|||
public static final String HALLS_1 = "music/halls_1.ogg";
|
||||
public static final String HALLS_2 = "music/halls_2.ogg";
|
||||
public static final String HALLS_BOSS = "music/Boss5.ogg";
|
||||
|
||||
public static final String GAME = "music/game.ogg";
|
||||
public static final String SURFACE = "music/surface.ogg";
|
||||
public static final String NBPL = "music/nbpl.ogg";
|
||||
public static final String RENSHOP = "music/RENSHOP.ogg";
|
||||
public static final String Dragon = "music/dragon.ogg";
|
||||
}
|
||||
|
||||
public static class Sounds {
|
||||
|
@ -208,6 +242,7 @@ public class Assets {
|
|||
public static final String CHAINS = "sounds/chains.mp3";
|
||||
public static final String SCAN = "sounds/scan.mp3";
|
||||
public static final String SHEEP = "sounds/sheep.mp3";
|
||||
public static final String ANSDOSHIP = "sounds/ansdoship.mp3";
|
||||
|
||||
public static final String[] all = new String[]{
|
||||
CLICK, BADGE, GOLD,
|
||||
|
@ -220,7 +255,7 @@ public class Assets {
|
|||
DESCEND, EAT, READ, LULLABY, DRINK, SHATTER, ZAP, LIGHTNING, LEVELUP, DEATH,
|
||||
CHALLENGE, CURSED, TRAP, EVOKE, TOMB, ALERT, MELD, BOSS, BLAST, PLANT, RAY, BEACON,
|
||||
TELEPORT, CHARMS, MASTERY, PUFF, ROCKS, BURNING, FALLING, GHOST, SECRET, BONES,
|
||||
BEE, DEGRADE, MIMIC, DEBUFF, CHARGEUP, GAS, CHAINS, SCAN, SHEEP
|
||||
BEE, DEGRADE, MIMIC, DEBUFF, CHARGEUP, GAS, CHAINS, SCAN, SHEEP, ANSDOSHIP
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -229,6 +264,8 @@ public class Assets {
|
|||
public static final String MAGE = "splashes/mage.jpg";
|
||||
public static final String ROGUE = "splashes/rogue.jpg";
|
||||
public static final String HUNTRESS = "splashes/huntress.jpg";
|
||||
public static final String GDX = "splashes/gdx.png";
|
||||
public static final String ANSDOSHIP = "splashes/ansdoship.png";
|
||||
}
|
||||
|
||||
public static class Sprites {
|
||||
|
@ -236,6 +273,7 @@ public class Assets {
|
|||
//BOSS
|
||||
public static final String FRAS = "sprites/boss/FireMagicGirl.png";
|
||||
public static final String NECROREDEX = "sprites/boss/rednecromancer_ex.png";
|
||||
public static final String SLIMEPRINCESS = "sprites/boss/SlimePrincess.png";
|
||||
|
||||
public static final String ITEMS = "sprites/items/items.png";
|
||||
public static final String ITEM_ICONS = "sprites/item_icons.png";
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.LockedFloor;
|
||||
import com.watabou.noosa.audio.Music;
|
||||
|
||||
public class BGMPlayer {
|
||||
public static void playBGMWithDepth() {
|
||||
if (Dungeon.hero != null) {
|
||||
if (Dungeon.hero.buff(LockedFloor.class) != null) {
|
||||
BGMPlayer.playBoss();
|
||||
return;
|
||||
}
|
||||
}
|
||||
int d = Dungeon.depth;
|
||||
if (d == -1) {
|
||||
Music.INSTANCE.play(Assets.TOWN, true);
|
||||
}else if (d == 0) {
|
||||
Music.INSTANCE.play(Assets.TOWN, true);
|
||||
} else if (d > 0 && d <= 5) {
|
||||
Music.INSTANCE.play(Assets.BGM_1, true);
|
||||
} else if (d > 5 && d <= 10) {
|
||||
Music.INSTANCE.play(Assets.BGM_2, true);
|
||||
} else if (d > 10 && d <= 15) {
|
||||
Music.INSTANCE.play(Assets.BGM_3, true);
|
||||
} else if (d > 15 && d <= 20) {
|
||||
Music.INSTANCE.play(Assets.BGM_4, true);
|
||||
} else if (d > 20 && d <= 26) {
|
||||
Music.INSTANCE.play(Assets.BGM_5, true);
|
||||
} else
|
||||
//default
|
||||
Music.INSTANCE.play(Assets.Music.THEME, true);
|
||||
}
|
||||
|
||||
/*
|
||||
第1层 补给层
|
||||
第2层 粘咕
|
||||
第3层 史莱姆王
|
||||
第4层 补给层
|
||||
第5层 天狗
|
||||
第6层 宝箱王
|
||||
第7层 补给层
|
||||
第8层 DM720
|
||||
第9层 冰雪魔女
|
||||
第10层 DM300
|
||||
第11层 补给层
|
||||
第12层 EX古神
|
||||
**第13层** DM920
|
||||
*/
|
||||
|
||||
public static void playBoss() {
|
||||
int t = Dungeon.depth;
|
||||
if (Dungeon.bossLevel() && t == 5) {
|
||||
Music.INSTANCE.play(Assets.BGM_BOSSA, true);
|
||||
} else if (Dungeon.bossLevel() && t == 10) {
|
||||
Music.INSTANCE.play(Assets.BGM_BOSSB, true);
|
||||
} else if (Dungeon.bossLevel() && t == 15 && Statistics.spawnersIce > 0) {
|
||||
Music.INSTANCE.play(Assets.BGM_BOSSC3, true);
|
||||
} else if (Dungeon.bossLevel() && t == 15) {
|
||||
Music.INSTANCE.play(Assets.BGM_BOSSC, true);
|
||||
} else if (Dungeon.bossLevel() && t == 20) {
|
||||
if((Statistics.boss_enhance & 0x8) != 0) Music.INSTANCE.play(Assets.BGM_BOSSD2, true);
|
||||
else Music.INSTANCE.play(Assets.BGM_BOSSD, true);
|
||||
} else if (Dungeon.bossLevel() && t == 25 && (Statistics.spawnersAlive > 0)) {
|
||||
Music.INSTANCE.play(Assets.BGM_BOSSE3, true);
|
||||
}else if (Dungeon.bossLevel() && t == 25){
|
||||
Music.INSTANCE.play(Assets.BGM_BOSSE, true);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -81,7 +81,22 @@ import java.util.ArrayList;
|
|||
import java.util.HashSet;
|
||||
|
||||
public class Dungeon {
|
||||
|
||||
public static int cycle;
|
||||
public static int escalatingDepth() {
|
||||
switch (cycle) {
|
||||
case 0:
|
||||
return depth;
|
||||
case 1:
|
||||
return (int) (depth * 1.4f + 31);
|
||||
case 2:
|
||||
return depth * 5 + 200;
|
||||
case 3:
|
||||
return depth * 50 + 2500;
|
||||
case 4:
|
||||
return depth * 100 + 4300;
|
||||
}
|
||||
return depth;
|
||||
}
|
||||
//enum of items which have limited spawns, records how many have spawned
|
||||
//could all be their own separate numbers, but this allows iterating, much nicer for bundling/initializing.
|
||||
public static enum LimitedDrops {
|
||||
|
|
|
@ -38,6 +38,11 @@ public class SPDSettings extends GameSettings {
|
|||
//Version info
|
||||
|
||||
public static final String KEY_VERSION = "version";
|
||||
|
||||
private static final String DEBUG_REPORT = "debug_report";
|
||||
public static boolean debugReport() {
|
||||
return getBoolean(DEBUG_REPORT,false);
|
||||
}
|
||||
|
||||
public static void version( int value) {
|
||||
put( KEY_VERSION, value );
|
||||
|
@ -56,6 +61,17 @@ public class SPDSettings extends GameSettings {
|
|||
public static final String KEY_ZOOM = "zoom";
|
||||
public static final String KEY_BRIGHTNESS = "brightness";
|
||||
public static final String KEY_GRID = "visual_grid";
|
||||
public static final String KEY_SPLASH_SCREEN= "splash_screen";
|
||||
|
||||
//瀑布系统
|
||||
public static void splashScreen( int value ) {
|
||||
put( KEY_SPLASH_SCREEN, value );
|
||||
}
|
||||
|
||||
public static int splashScreen() {
|
||||
return getInt( KEY_SPLASH_SCREEN, 1 );
|
||||
}
|
||||
|
||||
|
||||
private static final String KEY_DARK = "dark_ui";
|
||||
//暗色系统
|
||||
|
@ -64,6 +80,8 @@ public class SPDSettings extends GameSettings {
|
|||
private static final String KEY_PAGE = "page_ui";
|
||||
|
||||
private static final String KEY_PCUI = "pc_ui";
|
||||
|
||||
private static final String KEY_SWAP = "quickswap";
|
||||
|
||||
public static void fullscreen( boolean value ) {
|
||||
put( KEY_FULLSCREEN, value );
|
||||
|
@ -403,4 +421,11 @@ public class SPDSettings extends GameSettings {
|
|||
put( KEY_PCUI, value );
|
||||
}
|
||||
|
||||
public static boolean quickSwapper() {
|
||||
return getBoolean(KEY_SWAP, false);
|
||||
}
|
||||
|
||||
public static void quickSwapper(boolean value) {
|
||||
put( KEY_SWAP, value );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,17 +23,21 @@ package com.shatteredpixel.shatteredpixeldungeon;
|
|||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfMetamorphosis;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GoScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.TitleScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.WelcomeScene;
|
||||
import com.watabou.noosa.Game;
|
||||
import com.watabou.noosa.audio.Music;
|
||||
import com.watabou.noosa.audio.Sample;
|
||||
import com.watabou.utils.DeviceCompat;
|
||||
import com.watabou.utils.PlatformSupport;
|
||||
|
||||
public class ShatteredPixelDungeon extends Game {
|
||||
|
||||
private static String log = "";
|
||||
public static void appendLog(String string) {
|
||||
log += "\n\n" + string;
|
||||
}
|
||||
|
||||
//variable constants for specific older versions of shattered, used for data conversion
|
||||
//versions older than v0.9.2b are no longer supported, and data from them is ignored
|
||||
public static final int v0_9_2b = 531;
|
||||
|
@ -44,7 +48,7 @@ public class ShatteredPixelDungeon extends Game {
|
|||
public static final int v1_2_0 = 609;
|
||||
|
||||
public ShatteredPixelDungeon( PlatformSupport platform ) {
|
||||
super( sceneClass == null ? WelcomeScene.class : sceneClass, platform );
|
||||
super( sceneClass == null ? GoScene.class : sceneClass, platform );
|
||||
|
||||
//v1.2.0
|
||||
com.watabou.utils.Bundle.addAlias(
|
||||
|
@ -162,12 +166,10 @@ public class ShatteredPixelDungeon extends Game {
|
|||
|
||||
@Override
|
||||
public void finish() {
|
||||
if (!DeviceCompat.isiOS()) {
|
||||
super.finish();
|
||||
} else {
|
||||
|
||||
//can't exit on iOS (Apple guidelines), so just go to title screen
|
||||
switchScene(TitleScene.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void switchNoFade(Class<? extends PixelScene> c){
|
||||
|
@ -178,7 +180,16 @@ public class ShatteredPixelDungeon extends Game {
|
|||
PixelScene.noFade = true;
|
||||
switchScene( c, callback );
|
||||
}
|
||||
|
||||
|
||||
public static void switchForceFade(Class<? extends PixelScene> c){
|
||||
switchForceFade(c, null);
|
||||
}
|
||||
|
||||
public static void switchForceFade(Class<? extends PixelScene> c, SceneChangeCallback callback) {
|
||||
PixelScene.forceFade = true;
|
||||
switchScene( c, callback );
|
||||
}
|
||||
|
||||
public static void seamlessResetScene(SceneChangeCallback callback) {
|
||||
if (scene() instanceof PixelScene){
|
||||
((PixelScene) scene()).saveWindows();
|
||||
|
@ -187,11 +198,10 @@ public class ShatteredPixelDungeon extends Game {
|
|||
resetScene();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void seamlessResetScene(){
|
||||
seamlessResetScene(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void switchScene() {
|
||||
super.switchScene();
|
||||
|
|
|
@ -0,0 +1,765 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon;
|
||||
|
||||
import static com.shatteredpixel.shatteredpixeldungeon.Dungeon.hero;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Actor;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.ToxicGas;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Amok;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Blindness;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Burning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FlavourBuff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HalomethaneBurning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Paralysis;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Sleep;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Terror;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Vertigo;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.custom.utils.BallisticaFloat;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.custom.utils.GME;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.custom.utils.timing.VirtualTimer;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.BeamCustom;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.CellEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Effects;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Flare;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.MagicMissile;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.BloodParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.PurpleParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.sprites.CrstalSprite;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
|
||||
import com.watabou.utils.Bundle;
|
||||
import com.watabou.utils.Callback;
|
||||
import com.watabou.utils.PathFinder;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public abstract class SpellCaster extends Mob {
|
||||
{
|
||||
spriteClass = CrstalSprite.class;
|
||||
|
||||
HP = HT = 45;
|
||||
|
||||
maxLvl = -99;
|
||||
|
||||
EXP = 10;
|
||||
|
||||
properties.add(Property.BOSS);
|
||||
properties.add(Property.INORGANIC);
|
||||
properties.add(Property.IMMOVABLE);
|
||||
|
||||
state = PASSIVE;
|
||||
alignment = Alignment.NEUTRAL;
|
||||
viewDistance = 9;
|
||||
}
|
||||
|
||||
protected int lastTargeting=-1;
|
||||
protected int count=0;
|
||||
|
||||
protected enum State{
|
||||
PREPARING, AIMING, SHOOTING
|
||||
}
|
||||
|
||||
@Override
|
||||
public int drRoll(){
|
||||
return Random.NormalIntRange(3, 6);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean act(){
|
||||
spend(TICK);
|
||||
if(alignment == Alignment.NEUTRAL) return true;
|
||||
State s = countDown();
|
||||
if(s == State.SHOOTING) {
|
||||
zapProc();
|
||||
}else{
|
||||
findTarget();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected int maxCount(){
|
||||
return 6;
|
||||
}
|
||||
|
||||
public void setCount(int count) {
|
||||
this.count = count;
|
||||
}
|
||||
|
||||
protected State countDown(){
|
||||
if(maxCount() - count > 0 && maxCount() - count < 3) warn(maxCount()-count);
|
||||
if(count >= maxCount()){
|
||||
count = Random.Int(0, 3) - 3; return State.SHOOTING;
|
||||
}else if(count == maxCount() - 1){
|
||||
count ++;
|
||||
//sprite.showStatus( CharSprite.NEGATIVE, Messages.get(this, "!") );
|
||||
//sprite.showStatus( CharSprite.NEGATIVE, "!!!" );
|
||||
return State.AIMING;
|
||||
}else{
|
||||
count ++;
|
||||
return State.PREPARING;
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean findTarget(){
|
||||
if(enemy != null){
|
||||
//record last pos of enemy. Not update if out of FOV.
|
||||
if(enemySeen){
|
||||
lastTargeting = enemy.pos;
|
||||
return true;
|
||||
}else{
|
||||
lastTargeting = Dungeon.hero.pos;
|
||||
}
|
||||
}else{
|
||||
lastTargeting = Dungeon.hero.pos;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected abstract void zapProc();
|
||||
|
||||
protected abstract void warn(int num);
|
||||
|
||||
public void activate(){
|
||||
alignment = Alignment.ENEMY;
|
||||
((CrstalSprite) sprite).activate();
|
||||
yell("水晶已经激活,请注意摧毁!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSprite sprite() {
|
||||
CrstalSprite p = (CrstalSprite) super.sprite();
|
||||
if (alignment != Alignment.NEUTRAL) p.activate();
|
||||
return p;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notice() {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
public abstract void spriteHardlight();
|
||||
|
||||
@Override
|
||||
public void add(Buff buff) {
|
||||
//immune to all buffs/debuffs when inactive
|
||||
if (alignment != Alignment.NEUTRAL) {
|
||||
super.add(buff);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void damage(int dmg, Object src) {
|
||||
//immune to damage when inactive
|
||||
if (alignment == Alignment.NEUTRAL){
|
||||
return;
|
||||
}
|
||||
//prevents one-hit kill
|
||||
if (dmg >= 20){
|
||||
dmg = 20 + (int)(Math.sqrt(8*(dmg - 14) + 1) - 1)/2;
|
||||
}
|
||||
super.damage(dmg, src);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void die(Object cause){
|
||||
Dungeon.level.passable[pos] = true;
|
||||
super.die(cause);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void storeInBundle(Bundle bundle) {
|
||||
super.storeInBundle(bundle);
|
||||
bundle.put("ALIGNMENT", alignment);
|
||||
bundle.put("lastPos", lastTargeting);
|
||||
bundle.put("countDown", count);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle bundle) {
|
||||
super.restoreFromBundle(bundle);
|
||||
alignment = bundle.getEnum("ALIGNMENT", Char.Alignment.class);
|
||||
lastTargeting = bundle.getInt("lastPos");
|
||||
count = bundle.getInt("countDown");
|
||||
}
|
||||
|
||||
{
|
||||
immunities.add( Paralysis.class );
|
||||
immunities.add( Amok.class );
|
||||
immunities.add( Sleep.class );
|
||||
immunities.add( ToxicGas.class );
|
||||
immunities.add( Terror.class );
|
||||
immunities.add( Vertigo.class );
|
||||
}
|
||||
/*
|
||||
protected void checkDeath(Char ch, Object src){
|
||||
if(ch == Dungeon.hero && !ch.isAlive()){
|
||||
Dungeon.fail(src.getClass());
|
||||
}
|
||||
}
|
||||
|
||||
protected void showWarn(int color, String text, Object... args){
|
||||
if (args.length > 0) {
|
||||
text = Messages.format( text, args );
|
||||
}
|
||||
float x = sprite.destinationCenter().x;
|
||||
float y = sprite.destinationCenter().y - sprite.height()/2f;
|
||||
if (sprite.ch != null) {
|
||||
FloatingText.show( x, y, sprite.ch.pos, text, color );
|
||||
} else {
|
||||
FloatingText.show( x, y, text, color );
|
||||
}
|
||||
}
|
||||
*/
|
||||
//modifier works 115% efficiently to adjust difficulty
|
||||
public static void zapDamage(Char ch, int min, int max, float modifier, Object src){
|
||||
int damage = Random.IntRange(min, max);
|
||||
if(ch.buff(Marked.class)!=null){
|
||||
damage = Math.round(damage*(1f+modifier*1.15f));
|
||||
}
|
||||
ch.damage(damage, src);
|
||||
if(ch == Dungeon.hero && !ch.isAlive()){
|
||||
Dungeon.fail(src.getClass());
|
||||
}
|
||||
}
|
||||
|
||||
public static class FrostCaster extends SpellCaster{
|
||||
|
||||
@Override
|
||||
protected void zapProc() {
|
||||
//the collision pos of MAGIC_BOLT MUST be the pos of target, so find chars at collisionPos
|
||||
Ballistica ba = new Ballistica(pos, lastTargeting, Ballistica.PROJECTILE);
|
||||
|
||||
sprite.parent.add(new BeamCustom(
|
||||
sprite.center(),
|
||||
DungeonTilemap.tileCenterToWorld(ba.collisionPos),
|
||||
Effects.Type.DEATH_RAY).setLifespan(0.45f).setColor(0x6060FF));
|
||||
|
||||
hitProc(ba);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void warn(int num) {
|
||||
//if(num==2) sprite.showStatus( 0x5050FF, "!" );
|
||||
if(num==1) {sprite.showStatus(0x5050FF, "傲慢");
|
||||
new Flare( 6, 32 ).color( 0x5050FF, true ).show(sprite, 3f );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void spriteHardlight() {
|
||||
sprite.hardlight(0x2222FF);
|
||||
}
|
||||
|
||||
protected void hitProc(Ballistica ba){
|
||||
Char ch = findChar(ba.collisionPos);
|
||||
if(ch != null){
|
||||
ch.sprite.burst( 0xFF99CCFF, 5 );
|
||||
if(ch.alignment != Alignment.ENEMY){
|
||||
Buff.affect(ch, Chill.class, 5f);
|
||||
zapDamage(ch, 8, 12, 0.45f, this);
|
||||
}
|
||||
}
|
||||
Buff.affect(this, FrostPostShoot.class).setSource(ba.collisionPos);
|
||||
}
|
||||
|
||||
public static class FrostPostShoot extends Buff{
|
||||
private int source=-1;
|
||||
public void setSource(int pos){
|
||||
source = pos;
|
||||
}
|
||||
@Override
|
||||
public void storeInBundle(Bundle b){
|
||||
b.put("sourcePosFrost", source);
|
||||
super.storeInBundle(b);
|
||||
}
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle b){
|
||||
super.restoreFromBundle(b);
|
||||
source = b.getInt("sourcePosFrost");
|
||||
}
|
||||
@Override
|
||||
public boolean attachTo(Char target){
|
||||
spend(TICK);
|
||||
return super.attachTo(target);
|
||||
}
|
||||
@Override
|
||||
public boolean act(){
|
||||
if(source != -1){
|
||||
for(int i: PathFinder.NEIGHBOURS4){
|
||||
Ballistica ballistica = new Ballistica(source, source+i, Ballistica.MAGIC_BOLT);
|
||||
MagicMissile m = MagicMissile.boltFromChar(target.sprite.parent, MagicMissile.FROST, target.sprite,
|
||||
ballistica.collisionPos, () -> {
|
||||
//hitProc(ballistica);
|
||||
});
|
||||
m.reset(MagicMissile.FROST,
|
||||
DungeonTilemap.tileCenterToWorld(source+i),
|
||||
DungeonTilemap.tileCenterToWorld(ballistica.collisionPos),
|
||||
new Callback() {
|
||||
@Override
|
||||
public void call() {
|
||||
hitProc(ballistica);
|
||||
}
|
||||
} );
|
||||
m.setSpeed(400f);
|
||||
VirtualTimer.countTime(10f, m::destroy);
|
||||
}
|
||||
}
|
||||
detach();
|
||||
return true;
|
||||
}
|
||||
protected void hitProc(Ballistica ballistica){
|
||||
Char ch = findChar(ballistica.collisionPos);
|
||||
if(ch != null){
|
||||
ch.sprite.burst( 0xFF99CCFF, 3 );
|
||||
if(ch.alignment != Alignment.ENEMY){
|
||||
Buff.affect(ch, Chill.class, 3f);
|
||||
zapDamage(ch, 5, 8, 0.9f, FrostCaster.class);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class ExplosionCaster extends SpellCaster{
|
||||
|
||||
@Override
|
||||
protected void zapProc() {
|
||||
Ballistica ba = new Ballistica(pos, lastTargeting, Ballistica.PROJECTILE);
|
||||
|
||||
sprite.parent.add(new BeamCustom(
|
||||
sprite.center(),
|
||||
DungeonTilemap.tileCenterToWorld(ba.collisionPos),
|
||||
Effects.Type.DEATH_RAY).setLifespan(0.45f).setColor(0xFF4040));
|
||||
|
||||
hitProc(ba);
|
||||
|
||||
Buff.affect(this, ExplosivePostShoot.class).setSource(ba.collisionPos);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void spriteHardlight() {
|
||||
sprite.hardlight(0xFF2222);
|
||||
}
|
||||
|
||||
protected void hitProc(Ballistica ba){
|
||||
ArrayList<Char> affected = new ArrayList<>();
|
||||
|
||||
sprite.parent.add(new BeamCustom(
|
||||
DungeonTilemap.tileCenterToWorld(ba.collisionPos-1),
|
||||
DungeonTilemap.tileCenterToWorld(ba.collisionPos+1),
|
||||
Effects.Type.DEATH_RAY).setLifespan(0.4f).setColor(0x00FFFFFF));
|
||||
|
||||
sprite.parent.add(new BeamCustom(
|
||||
DungeonTilemap.tileCenterToWorld(ba.collisionPos-Dungeon.level.width()),
|
||||
DungeonTilemap.tileCenterToWorld(ba.collisionPos+Dungeon.level.width()),
|
||||
Effects.Type.DEATH_RAY).setLifespan(0.4f).setColor(0x00FFFFFF));
|
||||
|
||||
boolean terrainAffected = false;
|
||||
int[] cells = GME.NEIGHBOURS5();
|
||||
for (int n : cells) {
|
||||
int c = ba.collisionPos + n;
|
||||
if (c >= 0 && c < Dungeon.level.length()) {
|
||||
|
||||
if (Dungeon.level.flamable[c]) {
|
||||
Dungeon.level.destroy(c);
|
||||
GameScene.updateMap(c);
|
||||
terrainAffected = true;
|
||||
}
|
||||
|
||||
|
||||
Char ch = Actor.findChar(c);
|
||||
if (ch != null) {
|
||||
affected.add(ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (Char ch : affected){
|
||||
|
||||
//if they have already been killed by another bomb
|
||||
if(!ch.isAlive()){
|
||||
continue;
|
||||
}
|
||||
|
||||
ch.sprite.centerEmitter().burst( PurpleParticle.BURST, 2 );
|
||||
ch.sprite.flash();
|
||||
|
||||
if(ch.alignment == Alignment.ENEMY) continue;
|
||||
|
||||
Buff.affect(ch, Marked.class, 6f);
|
||||
|
||||
zapDamage(ch, 7, 12, 0.45f, this);
|
||||
}
|
||||
|
||||
if (terrainAffected) {
|
||||
Dungeon.observe();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void warn(int num) {
|
||||
//if(num==2) sprite.showStatus( 0xFF7070, "!" );
|
||||
if(num==1) {
|
||||
sprite.showStatus(0xFF7070, "妒忌");
|
||||
new Flare( 6, 32 ).color( 0xFF7070, true ).show(sprite, 3f );
|
||||
}
|
||||
}
|
||||
|
||||
public static class ExplosivePostShoot extends Buff{
|
||||
private int source=-1;
|
||||
public void setSource(int pos){
|
||||
source = pos;
|
||||
}
|
||||
@Override
|
||||
public void storeInBundle(Bundle b){
|
||||
b.put("sourcePosExplosive", source);
|
||||
super.storeInBundle(b);
|
||||
}
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle b){
|
||||
super.restoreFromBundle(b);
|
||||
source = b.getInt("sourcePosExplosive");
|
||||
}
|
||||
@Override
|
||||
public boolean attachTo(Char target){
|
||||
spend(TICK);
|
||||
return super.attachTo(target);
|
||||
}
|
||||
@Override
|
||||
public boolean act(){
|
||||
if(source != -1){
|
||||
final int[] directions = { -1 - Dungeon.level.width(), - 1 + Dungeon.level.width(),
|
||||
1 - Dungeon.level.width(), 1 + Dungeon.level.width()};
|
||||
for(int i: directions){
|
||||
Ballistica ballistica = new Ballistica(source, source+i, Ballistica.STOP_SOLID);
|
||||
hitProc(ballistica);
|
||||
target.sprite.parent.add(new BeamCustom(DungeonTilemap.tileCenterToWorld(source),
|
||||
DungeonTilemap.tileCenterToWorld(ballistica.collisionPos),
|
||||
Effects.Type.DEATH_RAY).setLifespan(0.45f).setColor(0x00FFFFFF));
|
||||
}
|
||||
}
|
||||
detach();
|
||||
return true;
|
||||
}
|
||||
protected void hitProc(Ballistica ballistica){
|
||||
for(int i: ballistica.subPath(1, ballistica.dist)) {
|
||||
Char ch = findChar(i);
|
||||
if (ch != null) {
|
||||
ch.sprite.centerEmitter().burst( PurpleParticle.BURST, 1 );
|
||||
ch.sprite.flash();
|
||||
if (ch.alignment != Alignment.ENEMY) {
|
||||
zapDamage(ch, 5, 7, 0.9f, ExplosionCaster.class);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class LightCaster extends SpellCaster{
|
||||
|
||||
@Override
|
||||
protected void zapProc() {
|
||||
Ballistica ba = new Ballistica(pos, lastTargeting, Ballistica.STOP_SOLID);
|
||||
|
||||
sprite.parent.add(new BeamCustom(
|
||||
sprite.center(),
|
||||
DungeonTilemap.tileCenterToWorld(ba.collisionPos),
|
||||
Effects.Type.LIGHT_RAY).setLifespan(0.7f).setColor(0x00FFFFFF));
|
||||
|
||||
hitProc(ba);
|
||||
|
||||
findTarget();
|
||||
|
||||
Buff.affect(this, LightProcShot.class).setSource(lastTargeting);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void warn(int num) {
|
||||
//if(num==2) sprite.showStatus( 0xFFFFFF, "!" );
|
||||
if(num==1){ sprite.showStatus(0xFFFFFF, "暴怒");
|
||||
new Flare( 6, 32 ).color( 0xFFFFFF, true ).show(sprite, 3f );}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void spriteHardlight() {
|
||||
sprite.hardlight(0xFFFFFF);
|
||||
}
|
||||
|
||||
protected void hitProc(Ballistica ba){
|
||||
for(int i: ba.subPath(1, ba.dist)) {
|
||||
Char ch = findChar(i);
|
||||
if (ch != null) {
|
||||
ch.sprite.emitter().burst(Speck.factory(Speck.LIGHT), 6 );
|
||||
if (ch.alignment != Alignment.ENEMY) {
|
||||
Buff.affect(ch, Blindness.class, 4f);
|
||||
zapDamage(ch, 9, 12, 0.6f, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class LightProcShot extends Buff{
|
||||
private int source=-1;
|
||||
public void setSource(int pos){
|
||||
source = pos;
|
||||
}
|
||||
@Override
|
||||
public void storeInBundle(Bundle b){
|
||||
b.put("sourcePosLight", source);
|
||||
super.storeInBundle(b);
|
||||
}
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle b){
|
||||
super.restoreFromBundle(b);
|
||||
source = b.getInt("sourcePosLight");
|
||||
}
|
||||
@Override
|
||||
public boolean attachTo(Char target){
|
||||
spend(TICK);
|
||||
return super.attachTo(target);
|
||||
}
|
||||
@Override
|
||||
public boolean act(){
|
||||
if(source != -1){
|
||||
final float[] angles = {-23f, 0f, 23f};
|
||||
final float sourceAngle = GME.angle(target.pos, source);
|
||||
for(float a: angles){
|
||||
BallisticaFloat bf = new BallisticaFloat(target.pos, sourceAngle + a, 25, BallisticaFloat.STOP_SOLID);
|
||||
Ballistica ballistica = new Ballistica(target.pos, bf.collisionPosI, Ballistica.STOP_SOLID);
|
||||
hitProc(ballistica);
|
||||
target.sprite.parent.add(new BeamCustom(DungeonTilemap.tileCenterToWorld(target.pos),
|
||||
DungeonTilemap.tileCenterToWorld(ballistica.collisionPos),
|
||||
Effects.Type.LIGHT_RAY).setLifespan(0.6f).setColor(0x00FFFFFF));
|
||||
}
|
||||
}
|
||||
detach();
|
||||
return true;
|
||||
}
|
||||
protected void hitProc(Ballistica ballistica){
|
||||
for(int i: ballistica.subPath(1, ballistica.dist)) {
|
||||
Char ch = findChar(i);
|
||||
if (ch != null) {
|
||||
ch.sprite.emitter().burst(Speck.factory(Speck.LIGHT), 4 );
|
||||
if (ch.alignment != Alignment.ENEMY) {
|
||||
Buff.affect(ch, Blindness.class, 2f);
|
||||
zapDamage(ch, 6, 9, 1.2f, LightCaster.class);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class BounceCaster extends SpellCaster{
|
||||
|
||||
@Override
|
||||
protected void zapProc() {
|
||||
Ballistica ba = new Ballistica(pos, lastTargeting, Ballistica.MAGIC_BOLT);
|
||||
|
||||
sprite.parent.add(new BeamCustom(
|
||||
sprite.center(),
|
||||
DungeonTilemap.tileCenterToWorld(ba.collisionPos),
|
||||
Effects.Type.DEATH_RAY).setLifespan(0.65f).setColor(0x30FF30));
|
||||
|
||||
if(ba.collisionPos != lastTargeting) {
|
||||
findTarget();
|
||||
Buff.affect(this, BouncePostShoot.class).setTrace(ba.collisionPos, lastTargeting);
|
||||
}
|
||||
hitProc(ba);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void warn(int num) {
|
||||
//if(num==2) sprite.showStatus( 0x30FF30, "!" );
|
||||
if(num==1) {sprite.showStatus(0x30FF30, "懒惰");
|
||||
new Flare( 6, 32 ).color( 0x30FF30, true ).show(sprite, 3f );}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void spriteHardlight() {
|
||||
sprite.hardlight(0x30FF30);
|
||||
}
|
||||
|
||||
protected void hitProc(Ballistica ba){
|
||||
Char ch = findChar(ba.collisionPos);
|
||||
if (ch != null) {
|
||||
CellEmitter.center(ch.pos).burst( BloodParticle.BURST, 2 );
|
||||
if (ch.alignment != Alignment.ENEMY) {
|
||||
Buff.affect(ch, Marked.class, 5f);
|
||||
zapDamage(ch, 6, 9, 0.45f, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class BouncePostShoot extends Buff{
|
||||
private int source=-1;
|
||||
private int to = -1;
|
||||
public void setTrace(int pos, int nextPos){
|
||||
source = pos;
|
||||
to = nextPos;
|
||||
}
|
||||
@Override
|
||||
public void storeInBundle(Bundle b){
|
||||
b.put("sourcePosBounce", source);
|
||||
b.put("toPosBounce", to);
|
||||
super.storeInBundle(b);
|
||||
}
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle b){
|
||||
super.restoreFromBundle(b);
|
||||
source = b.getInt("sourcePosBounce");
|
||||
to = b.getInt("toPosBounce");
|
||||
}
|
||||
@Override
|
||||
public boolean attachTo(Char target){
|
||||
spend(TICK);
|
||||
return super.attachTo(target);
|
||||
}
|
||||
@Override
|
||||
public boolean act(){
|
||||
if(source != -1){
|
||||
Ballistica ballistica = new Ballistica(source, to, Ballistica.STOP_SOLID);
|
||||
hitProc(ballistica);
|
||||
target.sprite.parent.add(new BeamCustom(DungeonTilemap.tileCenterToWorld(source),
|
||||
DungeonTilemap.tileCenterToWorld(ballistica.collisionPos),
|
||||
Effects.Type.DEATH_RAY).setLifespan(0.55f).setColor(0x30FF30));
|
||||
}
|
||||
detach();
|
||||
return true;
|
||||
}
|
||||
protected void hitProc(Ballistica ballistica){
|
||||
for(int i: ballistica.subPath(1, ballistica.dist)) {
|
||||
Char ch = findChar(i);
|
||||
if (ch != null) {
|
||||
CellEmitter.center(ch.pos).burst( BloodParticle.BURST, 1 );
|
||||
if (ch.alignment != Alignment.ENEMY) {
|
||||
Buff.affect(ch, Marked.class, 3f);
|
||||
zapDamage(ch, 3, 6, 0.9f, BounceCaster.class);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class HaloFireCaster extends SpellCaster{
|
||||
|
||||
@Override
|
||||
protected void zapProc() {
|
||||
Ballistica ba = new Ballistica(pos, lastTargeting, Ballistica.MAGIC_BOLT);
|
||||
|
||||
sprite.parent.add(new BeamCustom(
|
||||
sprite.center(),
|
||||
DungeonTilemap.tileCenterToWorld(ba.collisionPos),
|
||||
Effects.Type.DEATH_RAY).setLifespan(0.65f).setColor(0x30FF30));
|
||||
|
||||
if(ba.collisionPos != lastTargeting) {
|
||||
findTarget();
|
||||
Buff.affect(this, BouncePostShoot.class).setTrace(ba.collisionPos, lastTargeting);
|
||||
}
|
||||
hitProc(ba);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void warn(int num) {
|
||||
//if(num==2) sprite.showStatus( 0x30FF30, "!" );
|
||||
if(num==1) {sprite.showStatus(0xff0000, "暴食");
|
||||
new Flare( 6, 32 ).color( 0x30FF30, true ).show(sprite, 3f );}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void spriteHardlight() {
|
||||
sprite.hardlight(0xff0000);
|
||||
}
|
||||
|
||||
protected void hitProc(Ballistica ba){
|
||||
Char ch = findChar(ba.collisionPos);
|
||||
if (ch != null) {
|
||||
CellEmitter.center(ch.pos).burst( BloodParticle.BURST, 2 );
|
||||
if (ch.alignment != Alignment.ENEMY) {
|
||||
Buff.affect( hero, HalomethaneBurning.class ).reignite( hero, 7f );
|
||||
zapDamage(ch, 6, 9, 0.45f, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class BouncePostShoot extends Buff{
|
||||
private int source=-1;
|
||||
private int to = -1;
|
||||
public void setTrace(int pos, int nextPos){
|
||||
source = pos;
|
||||
to = nextPos;
|
||||
}
|
||||
@Override
|
||||
public void storeInBundle(Bundle b){
|
||||
b.put("sourcePosBounce", source);
|
||||
b.put("toPosBounce", to);
|
||||
super.storeInBundle(b);
|
||||
}
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle b){
|
||||
super.restoreFromBundle(b);
|
||||
source = b.getInt("sourcePosBounce");
|
||||
to = b.getInt("toPosBounce");
|
||||
}
|
||||
@Override
|
||||
public boolean attachTo(Char target){
|
||||
spend(TICK);
|
||||
return super.attachTo(target);
|
||||
}
|
||||
@Override
|
||||
public boolean act(){
|
||||
if(source != -1){
|
||||
Ballistica ballistica = new Ballistica(source, to, Ballistica.STOP_SOLID);
|
||||
hitProc(ballistica);
|
||||
target.sprite.parent.add(new BeamCustom(DungeonTilemap.tileCenterToWorld(source),
|
||||
DungeonTilemap.tileCenterToWorld(ballistica.collisionPos),
|
||||
Effects.Type.DEATH_RAY).setLifespan(0.55f).setColor(0xff0000));
|
||||
}
|
||||
detach();
|
||||
return true;
|
||||
}
|
||||
protected void hitProc(Ballistica ballistica){
|
||||
for(int i: ballistica.subPath(1, ballistica.dist)) {
|
||||
Char ch = findChar(i);
|
||||
if (ch != null) {
|
||||
CellEmitter.center(ch.pos).burst( BloodParticle.BURST, 1 );
|
||||
if (ch.alignment != Alignment.ENEMY) {
|
||||
Buff.affect( hero, Burning.class ).reignite( hero, 4f );
|
||||
zapDamage(ch, 3, 6, 0.9f, HaloFireCaster.class);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class Marked extends FlavourBuff {
|
||||
@Override
|
||||
public boolean attachTo( Char target ){
|
||||
if(target.sprite!=null) target.sprite.showStatus(0xB040B0, Messages.get(SpellCaster.class, "marked"));
|
||||
return super.attachTo(target);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fx(boolean on) {
|
||||
if (on) target.sprite.add(CharSprite.State.MARKED);
|
||||
else target.sprite.remove(CharSprite.State.MARKED);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -32,6 +32,8 @@ public class Statistics {
|
|||
public static int itemsCrafted;
|
||||
public static int piranhasKilled;
|
||||
public static int ankhsUsed;
|
||||
public static int spawnersIce;
|
||||
public static int naiyaziCollected;
|
||||
|
||||
//used for hero unlock badges
|
||||
public static int upgradesUsed;
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.actors;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRetribution;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfPsionicBlast;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.enchantments.Grim;
|
||||
import com.watabou.utils.Random;
|
||||
|
||||
public class Boss extends Mob {
|
||||
|
||||
protected static float baseMin;
|
||||
protected static float baseMax;
|
||||
protected static float baseAcc;
|
||||
protected static float baseEva;
|
||||
protected static float baseHT;
|
||||
protected static float baseMinDef;
|
||||
protected static float baseMaxDef;
|
||||
|
||||
protected void initProperty() {
|
||||
properties.add(Property.BOSS);
|
||||
immunities.add(Grim.class);
|
||||
immunities.add(ScrollOfPsionicBlast.class);
|
||||
immunities.add(ScrollOfRetribution.class);
|
||||
}
|
||||
|
||||
protected void initBaseStatus(float min, float max, float acc, float eva, float ht, float mid, float mad) {
|
||||
baseMin = min;
|
||||
baseMax = max;
|
||||
baseAcc = acc;
|
||||
baseEva = eva;
|
||||
baseHT = ht;
|
||||
baseMinDef = mid;
|
||||
baseMaxDef = mad;
|
||||
}
|
||||
|
||||
protected void initStatus(int exp) {
|
||||
defenseSkill = Math.round(baseEva);
|
||||
EXP = exp;
|
||||
HP = HT = Math.round(baseHT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int damageRoll() {
|
||||
return Math.round(Random.NormalFloat( baseMin, baseMax ));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int attackSkill( Char target ) {
|
||||
return Math.round(baseAcc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int drRoll() {
|
||||
return Math.round(Random.NormalFloat(baseMinDef, baseMaxDef));
|
||||
}
|
||||
}
|
||||
|
|
@ -38,7 +38,6 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.ChampionEnemy;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Charm;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Chill;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corrosion;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Corruption;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Cripple;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Doom;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Dread;
|
||||
|
@ -46,6 +45,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FireImbue;
|
|||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Frost;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.FrostImbue;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Fury;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.HaloFireImBlue;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Haste;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hex;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Hunger;
|
||||
|
@ -81,7 +81,6 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRetributio
|
|||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfTeleportation;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfChallenge;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.exotic.ScrollOfPsionicBlast;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.stones.StoneOfAggression;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFireblast;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfFrost;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.wands.WandOfLightning;
|
||||
|
@ -288,7 +287,7 @@ public abstract class Char extends Actor {
|
|||
}
|
||||
}
|
||||
|
||||
final public boolean attack( Char enemy ){
|
||||
public boolean attack(Char enemy){
|
||||
return attack(enemy, 1f, 0f, 1f);
|
||||
}
|
||||
|
||||
|
@ -788,7 +787,7 @@ public abstract class Char extends Actor {
|
|||
return 0;
|
||||
}
|
||||
|
||||
public final void move( int step ) {
|
||||
public void move(int step) {
|
||||
move( step, true );
|
||||
}
|
||||
|
||||
|
@ -902,6 +901,8 @@ public abstract class Char extends Actor {
|
|||
new HashSet<Class>( Arrays.asList(AllyBuff.class, Dread.class) )),
|
||||
MINIBOSS ( new HashSet<Class>(),
|
||||
new HashSet<Class>( Arrays.asList(AllyBuff.class, Dread.class) )),
|
||||
NOBIG ( new HashSet<Class>(),
|
||||
new HashSet<Class>( Arrays.asList(HaloFireImBlue.class) )),
|
||||
UNDEAD,
|
||||
DEMONIC,
|
||||
INORGANIC ( new HashSet<Class>(),
|
||||
|
|
|
@ -0,0 +1,73 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.actors.blobs;
|
||||
|
||||
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.buffs.Corrosion;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.watabou.utils.Bundle;
|
||||
|
||||
public class DiedBlackGas extends Blob {
|
||||
|
||||
//FIXME should have strength per-cell
|
||||
private int strength = 0;
|
||||
|
||||
@Override
|
||||
protected void evolve() {
|
||||
super.evolve();
|
||||
|
||||
if (volume == 0){
|
||||
strength = 0;
|
||||
} else {
|
||||
Char ch;
|
||||
int cell;
|
||||
|
||||
for (int i = area.left; i < area.right; i++){
|
||||
for (int j = area.top; j < area.bottom; j++){
|
||||
cell = i + j* Dungeon.level.width();
|
||||
if (cur[cell] > 0 && (ch = Actor.findChar( cell )) != null) {
|
||||
if (!ch.isImmune(this.getClass()))
|
||||
Buff.affect(ch, Corrosion.class).set(2f, strength);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public DiedBlackGas setStrength(int str){
|
||||
if (str > strength) {
|
||||
strength = str;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
private static final String STRENGTH = "strength";
|
||||
|
||||
@Override
|
||||
public void restoreFromBundle(Bundle bundle) {
|
||||
super.restoreFromBundle(bundle);
|
||||
strength = bundle.getInt( STRENGTH );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void storeInBundle(Bundle bundle) {
|
||||
super.storeInBundle(bundle);
|
||||
bundle.put( STRENGTH, strength );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void use( BlobEmitter emitter ) {
|
||||
super.use( emitter );
|
||||
|
||||
emitter.pour( Speck.factory(Speck.CORROSION), 0.4f );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tileDesc() {
|
||||
return Messages.get(this, "desc");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
package com.shatteredpixel.shatteredpixeldungeon.actors.blobs;
|
||||
|
||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Buff;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.buffs.Shadows;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShaftParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.journal.Notes;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
|
||||
public class FoliageMob extends Blob {
|
||||
|
||||
@Override
|
||||
protected void evolve() {
|
||||
|
||||
int[] map = Dungeon.level.map;
|
||||
|
||||
boolean visisble = false;
|
||||
|
||||
int cell;
|
||||
for (int i = area.left; i < area.right; i++) {
|
||||
for (int j = area.top; j < area.bottom; j++) {
|
||||
cell = i + j*Dungeon.level.width();
|
||||
if (cur[cell] > 0) {
|
||||
|
||||
off[cell] = cur[cell];
|
||||
volume += off[cell];
|
||||
|
||||
if (map[cell] == Terrain.EMBERS) {
|
||||
map[cell] = Terrain.GRASS;
|
||||
GameScene.updateMap(cell);
|
||||
}
|
||||
|
||||
visisble = visisble || Dungeon.level.heroFOV[cell];
|
||||
|
||||
} else {
|
||||
off[cell] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Hero hero = Dungeon.hero;
|
||||
if (hero.isAlive() && cur[hero.pos] > 0) {
|
||||
Shadows s = Buff.affect( hero, Shadows.class );
|
||||
if (s != null){
|
||||
s.prolong();
|
||||
}
|
||||
}
|
||||
|
||||
if (visisble) {
|
||||
Notes.add( Notes.Landmark.SHOP2 );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void use( BlobEmitter emitter ) {
|
||||
super.use( emitter );
|
||||
emitter.start( ShaftParticle.FACTORY, 0.9f, 0 );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tileDesc() {
|
||||
return Messages.get(this, "desc");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,130 @@
|
|||
/*
|
||||
* Pixel Dungeon
|
||||
* Copyright (C) 2012-2015 Oleg Dolya
|
||||
*
|
||||
* Shattered Pixel Dungeon
|
||||
* Copyright (C) 2014-2021 Evan Debenham
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
package com.shatteredpixel.shatteredpixeldungeon.actors.blobs;
|
||||
|
||||
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.buffs.HalomethaneBurning;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.BlobEmitter;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.HalomethaneFlameParticle;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.items.Heap;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.messages.Messages;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.plants.Plant;
|
||||
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
|
||||
/*定义磷火系统*/
|
||||
public class HalomethaneFire extends Blob {
|
||||
|
||||
@Override
|
||||
protected void evolve() {
|
||||
|
||||
boolean[] flamable = Dungeon.level.flamable;
|
||||
int cell;
|
||||
int fire;
|
||||
|
||||
Freezing freeze = (Freezing)Dungeon.level.blobs.get( Freezing.class );
|
||||
//燃烧效果粒子总和
|
||||
|
||||
boolean observe = false;
|
||||
|
||||
for (int i = area.left-1; i <= area.right; i++) {
|
||||
for (int j = area.top-1; j <= area.bottom; j++) {
|
||||
cell = i + j*Dungeon.level.width();
|
||||
if (cur[cell] > 0) {
|
||||
|
||||
if (freeze != null && freeze.volume > 0 && freeze.cur[cell] > 0){
|
||||
freeze.clear(cell);
|
||||
off[cell] = cur[cell] = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
burn( cell );
|
||||
|
||||
fire = cur[cell] - 1;
|
||||
if (fire <= 0 && flamable[cell]) {
|
||||
|
||||
Dungeon.level.destroy( cell );
|
||||
|
||||
observe = true;
|
||||
GameScene.updateMap( cell );
|
||||
|
||||
}
|
||||
|
||||
} else if (freeze == null || freeze.volume <= 0 || freeze.cur[cell] <= 0) {
|
||||
|
||||
if (flamable[cell]
|
||||
&& (cur[cell-1] > 0
|
||||
|| cur[cell+1] > 0
|
||||
|| cur[cell-Dungeon.level.width()] > 0
|
||||
|| cur[cell+Dungeon.level.width()] > 0)) {
|
||||
fire = 4;
|
||||
burn( cell );
|
||||
area.union(i, j);
|
||||
} else {
|
||||
fire = 0;
|
||||
}
|
||||
|
||||
} else {
|
||||
fire = 0;
|
||||
}
|
||||
|
||||
volume += (off[cell] = fire);
|
||||
}
|
||||
}
|
||||
|
||||
if (observe) {
|
||||
Dungeon.observe();
|
||||
}
|
||||
}
|
||||
|
||||
//定义燃烧效果和渲染燃烧行动
|
||||
public static void burn( int pos ) {
|
||||
Char ch = Actor.findChar( pos );
|
||||
if (ch != null && !ch.isImmune(HalomethaneFire.class)) {
|
||||
Buff.affect( ch, HalomethaneBurning.class ).reignite( ch );
|
||||
}
|
||||
|
||||
Heap heap = Dungeon.level.heaps.get( pos );
|
||||
if (heap != null) {
|
||||
heap.burn();
|
||||
}
|
||||
|
||||
Plant plant = Dungeon.level.plants.get( pos );
|
||||
if (plant != null){
|
||||
plant.wither();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void use( BlobEmitter emitter ) {
|
||||
super.use( emitter );
|
||||
emitter.pour( HalomethaneFlameParticle.FACTORY, 0.03f );
|
||||
//定义粒子系统 HalomethaneFlameParticle渲染
|
||||
}
|
||||
|
||||
@Override
|
||||
public String tileDesc() {
|
||||
return Messages.get(this, "desc");
|
||||
}
|
||||
|
||||
}
|