Compare commits
7 Commits
f89cd1ad63
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 2928e2b45f | |||
| 9bc71c0e32 | |||
| 701769fcd7 | |||
| a7a6b2123a | |||
| fc37d81350 | |||
| d5931b1822 | |||
| fe92b8bbb8 |
File diff suppressed because one or more lines are too long
101
data/cards.json
101
data/cards.json
@@ -276,7 +276,7 @@
|
||||
"xDamagePerEnergy": 5,
|
||||
"desc": "모든 에너지를 사용해 에너지당 모든 적에게 피해 5",
|
||||
"image": "fe83c7635b0e49ed83d75a2833adb53e",
|
||||
"class": "warrior",
|
||||
"class": "crusader",
|
||||
"rarity": "unique",
|
||||
"fx": "1b0afc410a1a458598eb7ca2fb26e97d"
|
||||
},
|
||||
@@ -300,7 +300,7 @@
|
||||
"attackDamageVsWeakMultiplier": 2,
|
||||
"desc": "피해 4. 대상이 약화 상태면 피해 2배",
|
||||
"image": "09370fc7551e47238fd103a80fba558e",
|
||||
"class": "warrior",
|
||||
"class": "page",
|
||||
"rarity": "unique",
|
||||
"fx": "863812c5c2f84132ac7465b50ec2283e"
|
||||
},
|
||||
@@ -312,7 +312,7 @@
|
||||
"draw": 2,
|
||||
"desc": "피해 6, 카드 2장 뽑기",
|
||||
"image": "379d86e3de064959aa4612f71e84ccfb",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique",
|
||||
"fx": "e8a145a6c43d493f9ad50fab03b200aa"
|
||||
},
|
||||
@@ -324,7 +324,7 @@
|
||||
"combatCostReductionOnPlay": 1,
|
||||
"desc": "피해 12. 사용할 때마다 이번 전투에서 비용 1 감소",
|
||||
"image": "1bc3e52b330648faae9eafd5a205e37b",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique",
|
||||
"fx": "48754be05be344358cddd55aa8fe11f4"
|
||||
},
|
||||
@@ -336,7 +336,7 @@
|
||||
"damagePerCardDrawnThisCombat": 1,
|
||||
"desc": "피해 6. 이번 전투에서 뽑은 카드마다 피해 +1",
|
||||
"image": "e2580523efc6457385114b78ad0d7cce",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique",
|
||||
"fx": "6f283d96d5804b4fb88009685a11c1f8"
|
||||
},
|
||||
@@ -348,7 +348,7 @@
|
||||
"hits": 2,
|
||||
"desc": "피해 8 x 2회",
|
||||
"image": "115e309771604743853abad2d8d186bc",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique",
|
||||
"fx": "997fa6999aa04dbb97a1dd99025fa2ba"
|
||||
},
|
||||
@@ -359,7 +359,7 @@
|
||||
"damage": 15,
|
||||
"desc": "피해 15",
|
||||
"image": "b7030d8caedc4fbc9f38fe1e541d6e6b",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique",
|
||||
"fx": "2799562e984c4a4da3b73e1f3431057c"
|
||||
},
|
||||
@@ -372,7 +372,7 @@
|
||||
"strength": 3,
|
||||
"desc": "피해 5 x 2회, 힘 +3",
|
||||
"image": "9aac955d159f49c1bc913ef96128e781",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique",
|
||||
"fx": "1b0afc410a1a458598eb7ca2fb26e97d"
|
||||
},
|
||||
@@ -384,7 +384,7 @@
|
||||
"gainEnergy": 1,
|
||||
"desc": "피해 14, 에너지 +1",
|
||||
"image": "90a9bf8eeb844b578b4e2d93ac43fedf",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique",
|
||||
"fx": "291b2298db88476f8ae3c6c78f53c9b7"
|
||||
},
|
||||
@@ -397,7 +397,7 @@
|
||||
"vuln": 1,
|
||||
"desc": "피해 12, 약화 1, 취약 1",
|
||||
"image": "251b6e12329048429490049a4f3cf564",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique",
|
||||
"fx": "863812c5c2f84132ac7465b50ec2283e"
|
||||
},
|
||||
@@ -408,7 +408,7 @@
|
||||
"damage": 32,
|
||||
"desc": "피해 32",
|
||||
"image": "92021d62341a4bce9cfd09d1b4b865db",
|
||||
"class": "warrior",
|
||||
"class": "crusader",
|
||||
"rarity": "unique",
|
||||
"fx": "e8a145a6c43d493f9ad50fab03b200aa"
|
||||
},
|
||||
@@ -421,7 +421,7 @@
|
||||
"exhaust": true,
|
||||
"desc": "모든 적에게 피해 16. 소멸.",
|
||||
"image": "b4020dbadee6401f9893a020fe4154b1",
|
||||
"class": "warrior",
|
||||
"class": "crusader",
|
||||
"rarity": "unique",
|
||||
"fx": "48754be05be344358cddd55aa8fe11f4"
|
||||
},
|
||||
@@ -434,7 +434,7 @@
|
||||
"damagePerAttackPlayedThisTurn": 2,
|
||||
"desc": "모든 적에게 피해 12. 이번 턴 사용한 공격 카드마다 피해 +2",
|
||||
"image": "e4acdf27d68549db8858d6082169c70c",
|
||||
"class": "warrior",
|
||||
"class": "crusader",
|
||||
"rarity": "unique",
|
||||
"fx": "6f283d96d5804b4fb88009685a11c1f8"
|
||||
},
|
||||
@@ -468,7 +468,7 @@
|
||||
"intangible": 1,
|
||||
"desc": "방어도 5, 무형 1",
|
||||
"image": "992dabf6aff2400e92b2f4f705d8ebe7",
|
||||
"class": "warrior",
|
||||
"class": "page",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"SecondWind": {
|
||||
@@ -479,7 +479,7 @@
|
||||
"blockPerExhaustedCard": 5,
|
||||
"desc": "손의 공격이 아닌 모든 카드를 소멸시키고, 소멸시킨 카드마다 방어도 5",
|
||||
"image": "21af4bccc5054a5dbc8245dfa7f08681",
|
||||
"class": "warrior",
|
||||
"class": "page",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"Taunt": {
|
||||
@@ -501,7 +501,7 @@
|
||||
"draw": 3,
|
||||
"desc": "카드 1장 버리고 카드 3장 뽑기",
|
||||
"image": "64daadf1a98e490d9c14ef52ec776e63",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"EvilEye": {
|
||||
@@ -511,7 +511,7 @@
|
||||
"block": 16,
|
||||
"desc": "방어도 16",
|
||||
"image": "09370fc7551e47238fd103a80fba558e",
|
||||
"class": "warrior",
|
||||
"class": "page",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"ForgottenRitual": {
|
||||
@@ -534,7 +534,7 @@
|
||||
"exhaust": true,
|
||||
"desc": "카드 2장 뽑기, 에너지 +1. 소멸.",
|
||||
"image": "1bc3e52b330648faae9eafd5a205e37b",
|
||||
"class": "warrior",
|
||||
"class": "page",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"Dominate": {
|
||||
@@ -581,7 +581,7 @@
|
||||
"thorns": 4,
|
||||
"desc": "방어도 12, 가시 4",
|
||||
"image": "9aac955d159f49c1bc913ef96128e781",
|
||||
"class": "warrior",
|
||||
"class": "page",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"StoneArmor": {
|
||||
@@ -592,7 +592,7 @@
|
||||
"value": 4,
|
||||
"desc": "매턴 방어도 +4",
|
||||
"image": "90a9bf8eeb844b578b4e2d93ac43fedf",
|
||||
"class": "warrior",
|
||||
"class": "page",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"FeelNoPain": {
|
||||
@@ -603,7 +603,7 @@
|
||||
"value": 3,
|
||||
"desc": "매턴 방어도 +3",
|
||||
"image": "251b6e12329048429490049a4f3cf564",
|
||||
"class": "warrior",
|
||||
"class": "page",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"Inflame": {
|
||||
@@ -614,7 +614,7 @@
|
||||
"value": 1,
|
||||
"desc": "매턴 힘 +1",
|
||||
"image": "92021d62341a4bce9cfd09d1b4b865db",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"Inferno": {
|
||||
@@ -635,7 +635,7 @@
|
||||
"cardPlayedRandomDamage": 3,
|
||||
"desc": "카드를 사용할 때마다 무작위 적에게 피해 3",
|
||||
"image": "e4acdf27d68549db8858d6082169c70c",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"Rupture": {
|
||||
@@ -646,7 +646,7 @@
|
||||
"value": 1,
|
||||
"desc": "매턴 힘 +1",
|
||||
"image": "7648c3b8e1ca44fc8ec353561207a670",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"Vicious": {
|
||||
@@ -666,7 +666,7 @@
|
||||
"cardPlayedRandomDamage": 8,
|
||||
"desc": "카드를 사용할 때마다 무작위 적에게 피해 8",
|
||||
"image": "992dabf6aff2400e92b2f4f705d8ebe7",
|
||||
"class": "warrior",
|
||||
"class": "fighter",
|
||||
"rarity": "unique"
|
||||
},
|
||||
"PactsEnd": {
|
||||
@@ -678,7 +678,7 @@
|
||||
"playableWhenDrawPileEmpty": true,
|
||||
"desc": "뽑을 카드 더미가 비었을 때 모든 적에게 피해 17",
|
||||
"image": "21af4bccc5054a5dbc8245dfa7f08681",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend",
|
||||
"fx": "e8a145a6c43d493f9ad50fab03b200aa"
|
||||
},
|
||||
@@ -691,7 +691,7 @@
|
||||
"damagePerAttackPlayedThisTurn": 2,
|
||||
"desc": "피해 4 x 2회. 이번 턴 사용한 공격 카드마다 피해 +2",
|
||||
"image": "fe83c7635b0e49ed83d75a2833adb53e",
|
||||
"class": "warrior",
|
||||
"class": "crusader",
|
||||
"rarity": "legend",
|
||||
"fx": "48754be05be344358cddd55aa8fe11f4"
|
||||
},
|
||||
@@ -704,7 +704,7 @@
|
||||
"aoe": true,
|
||||
"desc": "모든 적에게 피해 2 x 4회",
|
||||
"image": "64daadf1a98e490d9c14ef52ec776e63",
|
||||
"class": "warrior",
|
||||
"class": "crusader",
|
||||
"rarity": "legend",
|
||||
"fx": "6f283d96d5804b4fb88009685a11c1f8"
|
||||
},
|
||||
@@ -717,7 +717,7 @@
|
||||
"exhaust": true,
|
||||
"desc": "피해를 10 줍니다. 치명타라면, 최대 체력이 3 증가합니다. 소멸.",
|
||||
"image": "09370fc7551e47238fd103a80fba558e",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend",
|
||||
"fx": "997fa6999aa04dbb97a1dd99025fa2ba"
|
||||
},
|
||||
@@ -729,7 +729,7 @@
|
||||
"hits": 3,
|
||||
"desc": "피해 5 x 3회",
|
||||
"image": "379d86e3de064959aa4612f71e84ccfb",
|
||||
"class": "warrior",
|
||||
"class": "crusader",
|
||||
"rarity": "legend",
|
||||
"fx": "2799562e984c4a4da3b73e1f3431057c"
|
||||
},
|
||||
@@ -743,7 +743,7 @@
|
||||
"exhaust": true,
|
||||
"desc": "손의 다른 카드마다 피해 +7 후 모두 버리기. 소멸.",
|
||||
"image": "1bc3e52b330648faae9eafd5a205e37b",
|
||||
"class": "warrior",
|
||||
"class": "crusader",
|
||||
"rarity": "legend",
|
||||
"fx": "1b0afc410a1a458598eb7ca2fb26e97d"
|
||||
},
|
||||
@@ -755,7 +755,7 @@
|
||||
"enemyStrengthLossThisTurn": 10,
|
||||
"desc": "피해 15. 이번 턴 적 힘 -10",
|
||||
"image": "e2580523efc6457385114b78ad0d7cce",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend",
|
||||
"fx": "291b2298db88476f8ae3c6c78f53c9b7"
|
||||
},
|
||||
@@ -789,7 +789,7 @@
|
||||
"handCostZeroThisTurn": true,
|
||||
"desc": "이번 턴 손의 카드 비용이 0",
|
||||
"image": "9aac955d159f49c1bc913ef96128e781",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend"
|
||||
},
|
||||
"Offering": {
|
||||
@@ -801,7 +801,7 @@
|
||||
"exhaust": true,
|
||||
"desc": "에너지 +2, 카드 3장 뽑기. 소멸.",
|
||||
"image": "90a9bf8eeb844b578b4e2d93ac43fedf",
|
||||
"class": "warrior",
|
||||
"class": "crusader",
|
||||
"rarity": "legend"
|
||||
},
|
||||
"OneTwoPunch": {
|
||||
@@ -823,7 +823,7 @@
|
||||
"exhaust": true,
|
||||
"desc": "손의 모든 카드를 소멸시키고, 소멸시킨 카드 수만큼 뽑습니다. 소멸.",
|
||||
"image": "92021d62341a4bce9cfd09d1b4b865db",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend"
|
||||
},
|
||||
"Impervious": {
|
||||
@@ -834,7 +834,7 @@
|
||||
"exhaust": true,
|
||||
"desc": "방어도 30. 소멸.",
|
||||
"image": "b4020dbadee6401f9893a020fe4154b1",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend"
|
||||
},
|
||||
"NotYet": {
|
||||
@@ -845,7 +845,7 @@
|
||||
"exhaust": true,
|
||||
"desc": "HP 10 회복. 소멸.",
|
||||
"image": "e4acdf27d68549db8858d6082169c70c",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend"
|
||||
},
|
||||
"Aggression": {
|
||||
@@ -877,7 +877,7 @@
|
||||
"value": 8,
|
||||
"desc": "매턴 방어도 +8",
|
||||
"image": "992dabf6aff2400e92b2f4f705d8ebe7",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend"
|
||||
},
|
||||
"Pyre": {
|
||||
@@ -888,7 +888,7 @@
|
||||
"value": 1,
|
||||
"desc": "매턴 에너지 +1",
|
||||
"image": "21af4bccc5054a5dbc8245dfa7f08681",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend"
|
||||
},
|
||||
"DarkEmbrace": {
|
||||
@@ -898,7 +898,7 @@
|
||||
"drawOnExhaust": 1,
|
||||
"desc": "카드가 소멸될 때마다 카드 1장 뽑기",
|
||||
"image": "fe83c7635b0e49ed83d75a2833adb53e",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend"
|
||||
},
|
||||
"Unmovable": {
|
||||
@@ -910,7 +910,7 @@
|
||||
"blockGainMultiplier": 2,
|
||||
"desc": "이번 전투 동안 방어도 획득량 2배",
|
||||
"image": "64daadf1a98e490d9c14ef52ec776e63",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend"
|
||||
},
|
||||
"Juggernaut": {
|
||||
@@ -920,7 +920,7 @@
|
||||
"cardPlayedRandomDamage": 5,
|
||||
"desc": "카드를 사용할 때마다 무작위 적에게 피해 5",
|
||||
"image": "09370fc7551e47238fd103a80fba558e",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend"
|
||||
},
|
||||
"Hellraiser": {
|
||||
@@ -941,7 +941,7 @@
|
||||
"value": 0,
|
||||
"desc": "내 턴 시작 시 방어도가 사라지지 않습니다.",
|
||||
"image": "1bc3e52b330648faae9eafd5a205e37b",
|
||||
"class": "warrior",
|
||||
"class": "knight",
|
||||
"rarity": "legend"
|
||||
},
|
||||
"DemonForm": {
|
||||
@@ -952,7 +952,7 @@
|
||||
"value": 2,
|
||||
"desc": "매턴 힘 +2",
|
||||
"image": "e2580523efc6457385114b78ad0d7cce",
|
||||
"class": "warrior",
|
||||
"class": "crusader",
|
||||
"rarity": "legend"
|
||||
},
|
||||
"SlashBlast": {
|
||||
@@ -1803,7 +1803,7 @@
|
||||
},
|
||||
"Ricochet": {
|
||||
"name": "통통 튀는 표창",
|
||||
"cost": 2,
|
||||
"cost": 1,
|
||||
"kind": "Attack",
|
||||
"class": "assassin",
|
||||
"rarity": "normal",
|
||||
@@ -2859,7 +2859,8 @@
|
||||
"kind": "Skill",
|
||||
"class": "assassin",
|
||||
"rarity": "normal",
|
||||
"desc": "카드를 2장 뽑습니다. 카드를 1장 버립니다. 표창 1장을 손에 넣습니다.",
|
||||
"desc": "방어도 4를 얻습니다. 카드를 2장 뽑고 1장 버립니다. 표창 1장을 손에 넣습니다.",
|
||||
"block": 4,
|
||||
"draw": 2,
|
||||
"discard": 1,
|
||||
"addShiv": 1,
|
||||
@@ -2880,7 +2881,7 @@
|
||||
},
|
||||
"AssassinPhysicalTraining": {
|
||||
"name": "피지컬 트레이닝",
|
||||
"cost": 2,
|
||||
"cost": 1,
|
||||
"kind": "Power",
|
||||
"class": "assassin",
|
||||
"rarity": "normal",
|
||||
@@ -2927,7 +2928,7 @@
|
||||
},
|
||||
"HermitShadowPartner": {
|
||||
"name": "쉐도우 파트너",
|
||||
"cost": 2,
|
||||
"cost": 1,
|
||||
"kind": "Skill",
|
||||
"class": "hermit",
|
||||
"rarity": "legend",
|
||||
@@ -3026,12 +3027,12 @@
|
||||
"SilentStrike",
|
||||
"SilentStrike",
|
||||
"SilentStrike",
|
||||
"SilentStrike",
|
||||
"SilentDefend",
|
||||
"LuckySeven",
|
||||
"SilentDefend",
|
||||
"SilentDefend",
|
||||
"SilentDefend",
|
||||
"SilentDefend",
|
||||
"NimbleBody",
|
||||
"Neutralize",
|
||||
"Survivor"
|
||||
]
|
||||
|
||||
BIN
data/cards.xlsx
BIN
data/cards.xlsx
Binary file not shown.
900
map/map01.map
900
map/map01.map
File diff suppressed because it is too large
Load Diff
@@ -210,7 +210,8 @@ function fight(state, branch, kind, section, rng, options) {
|
||||
state.turns += result.turns;
|
||||
if (!result.win) return false;
|
||||
healFromRelics(state, 'combatEnd');
|
||||
if (kind !== 'boss') offerReward(state.job, branch, state.deck, rng, options.minimumRewardValue);
|
||||
const rewardStrategy = state.job === 'warrior' || state.job === 'rogue' ? state.job : branch;
|
||||
if (kind !== 'boss') offerReward(state.job, rewardStrategy, state.deck, rng, options.minimumRewardValue);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -297,6 +297,7 @@ if m.block > 0 and pierce ~= true then
|
||||
m.block = m.block - absorbed
|
||||
dmg = dmg - absorbed
|
||||
end
|
||||
self:ShakeCombatCamera()
|
||||
m.hp = m.hp - dmg
|
||||
if dmg > 0 then
|
||||
local poison = self:AddPowerFieldTotal("attackPoison")
|
||||
@@ -304,6 +305,7 @@ if dmg > 0 then
|
||||
self:ApplyPoisonToMonster(m, poison)
|
||||
end
|
||||
end
|
||||
self:ShowDmgPop(m.slot, dmg)
|
||||
self:MonsterHitMotion(m.slot)
|
||||
local killed = false
|
||||
if m.hp <= 0 then
|
||||
@@ -332,6 +334,7 @@ end
|
||||
if m == nil then
|
||||
return false
|
||||
end
|
||||
self:ShakeCombatCamera()
|
||||
m.hp = m.hp - amount
|
||||
self:ShowDmgPop(m.slot, amount)
|
||||
self:MonsterHitMotion(m.slot)
|
||||
@@ -358,6 +361,7 @@ local m = alive[math.random(1, #alive)]
|
||||
if m == nil then
|
||||
return false
|
||||
end
|
||||
self:ShakeCombatCamera()
|
||||
m.hp = m.hp - amount
|
||||
self:ShowDmgPop(m.slot, amount)
|
||||
self:MonsterHitMotion(m.slot)
|
||||
@@ -383,7 +387,7 @@ local burstEvery = self:AddPowerFieldTotal("poisonApplicationBurstEvery")
|
||||
local burstDamage = self:AddPowerFieldTotal("poisonApplicationBurstDamage")
|
||||
if burstEvery ~= nil and burstEvery > 0 and burstDamage ~= nil and burstDamage > 0 then
|
||||
if (self.PoisonApplicationsThisCombat % burstEvery) == 0 then
|
||||
self:DealDamageToAllMonsters(burstDamage)
|
||||
self:DealDamageToAllMonsters(burstDamage, false)
|
||||
end
|
||||
end`, [
|
||||
{ Type: 'any', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'target' },
|
||||
@@ -392,6 +396,17 @@ end`, [
|
||||
method('DealDamageToAllMonsters', `if self.Monsters == nil then
|
||||
return false
|
||||
end
|
||||
local anyAlive = false
|
||||
for i = 1, #self.Monsters do
|
||||
local m = self.Monsters[i]
|
||||
if m ~= nil and m.alive == true then
|
||||
anyAlive = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if anyAlive == true and isAttack == true then
|
||||
self:ShakeCombatCamera()
|
||||
end
|
||||
local killCount = 0
|
||||
for i = 1, #self.Monsters do
|
||||
local m = self.Monsters[i]
|
||||
@@ -440,6 +455,13 @@ return killCount > 0`, [
|
||||
], 0, 'boolean'),
|
||||
method('PlayAttackFx', `local m = self.Monsters[targetIndex]
|
||||
if m == nil or m.alive ~= true or m.entity == nil or not isvalid(m.entity) then
|
||||
local shown = damage
|
||||
if m ~= nil and m.alive == true and m.vuln > 0 then
|
||||
shown = math.floor(damage * 1.5)
|
||||
end
|
||||
if m ~= nil and m.alive == true and m.weak > 0 and self.ActiveAttackDamageVsWeakMultiplier ~= nil and self.ActiveAttackDamageVsWeakMultiplier > 1 then
|
||||
shown = math.floor(shown * self.ActiveAttackDamageVsWeakMultiplier)
|
||||
end
|
||||
self:DealDamageToTarget(damage, pierce)
|
||||
self.ActiveAttackDamageVsWeakMultiplier = 1
|
||||
self:RenderCombat()
|
||||
@@ -474,7 +496,6 @@ _TimerService:SetTimerOnce(function()
|
||||
self.ActiveKillReward = 0
|
||||
self.ActiveKillMaxHpGain = 0
|
||||
self.ActiveAttackDamageVsWeakMultiplier = 1
|
||||
self:ShowDmgPop(targetIndex, shown)
|
||||
self:RenderCombat()
|
||||
self:CheckCombatEnd()
|
||||
end, 0.35)`, [
|
||||
@@ -565,6 +586,7 @@ end
|
||||
if dmg > 0 and self.PlayerIntangible ~= nil and self.PlayerIntangible > 0 and dmg > 1 then
|
||||
dmg = 1
|
||||
end
|
||||
self:ShakeCombatCamera()
|
||||
if dmg > 0 then
|
||||
self.PlayerHp = self.PlayerHp - dmg
|
||||
local reactiveBlock = self:AddPowerFieldTotal("blockOnDamaged")
|
||||
@@ -599,7 +621,7 @@ if dmg > 0 then
|
||||
end
|
||||
if self:HasRelic("centennialPuzzle") and self.FirstHpLossDone == false then
|
||||
self.FirstHpLossDone = true
|
||||
self:DrawCards(3)
|
||||
self:DrawCards(3, true)
|
||||
self:RenderHand(false)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -321,7 +321,7 @@ if self.NextTurnAddCards ~= nil then
|
||||
end
|
||||
local drawN = 5 + (self.NextTurnDraw or 0) + powerTurnDraw
|
||||
self.NextTurnDraw = 0
|
||||
self:DrawCards(drawN)
|
||||
self:DrawCards(drawN, true)
|
||||
self:RenderHand(true)
|
||||
self:RenderCombat()
|
||||
if powerTurnDiscard > 0 then
|
||||
|
||||
@@ -313,6 +313,108 @@ if amount < 0 then
|
||||
end
|
||||
self.PlayerBlock = self.PlayerBlock + amount
|
||||
return amount`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'base' }], 0, 'number'),
|
||||
method('RunAttackSequence', `if hitDamages == nil or #hitDamages <= 0 then
|
||||
return
|
||||
end
|
||||
local function countAliveMonsters()
|
||||
local n = 0
|
||||
if self.Monsters ~= nil then
|
||||
for mi = 1, #self.Monsters do
|
||||
local om = self.Monsters[mi]
|
||||
if om ~= nil and om.alive == true then
|
||||
n = n + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
return n
|
||||
end
|
||||
local function randomAliveMonsterIndex()
|
||||
local alive = {}
|
||||
if self.Monsters ~= nil then
|
||||
for mi = 1, #self.Monsters do
|
||||
local om = self.Monsters[mi]
|
||||
if om ~= nil and om.alive == true then
|
||||
table.insert(alive, mi)
|
||||
end
|
||||
end
|
||||
end
|
||||
if #alive <= 0 then
|
||||
return 0
|
||||
end
|
||||
return alive[math.random(1, #alive)]
|
||||
end
|
||||
self.FxBusy = true
|
||||
local hitIndex = 1
|
||||
local lockedTargetIndex = self.TargetIndex or 0
|
||||
local function finishSequence()
|
||||
self.FxBusy = false
|
||||
self.ActiveAttackDamageVsWeakMultiplier = 1
|
||||
self:RenderCombat()
|
||||
self:CheckCombatEnd()
|
||||
end
|
||||
local function step()
|
||||
if self.CombatOver == true then
|
||||
finishSequence()
|
||||
return
|
||||
end
|
||||
if countAliveMonsters() <= 0 then
|
||||
finishSequence()
|
||||
return
|
||||
end
|
||||
if hitIndex == 1 then
|
||||
self.DamageDealtThisTurn = (self.DamageDealtThisTurn or 0) + (roundPlannedDamage or 0)
|
||||
end
|
||||
local roundKilled = false
|
||||
if useAoe == true then
|
||||
roundKilled = self:DealDamageToAllMonsters(hitDamages[hitIndex] or 0, true)
|
||||
else
|
||||
local targetIdx = lockedTargetIndex
|
||||
if randomTargetEachHit == true then
|
||||
targetIdx = randomAliveMonsterIndex()
|
||||
end
|
||||
if targetIdx ~= nil and targetIdx > 0 then
|
||||
if randomTargetEachHit ~= true then
|
||||
local lockedMonster = nil
|
||||
if self.Monsters ~= nil then
|
||||
lockedMonster = self.Monsters[targetIdx]
|
||||
end
|
||||
if lockedMonster == nil or lockedMonster.alive ~= true then
|
||||
finishSequence()
|
||||
return
|
||||
end
|
||||
end
|
||||
local prev = self.TargetIndex
|
||||
self.TargetIndex = targetIdx
|
||||
roundKilled = self:DealDamageToTarget(hitDamages[hitIndex] or 0, pierce == true)
|
||||
self.TargetIndex = prev
|
||||
end
|
||||
end
|
||||
self:RenderCombat()
|
||||
self:CheckCombatEnd()
|
||||
hitIndex = hitIndex + 1
|
||||
if self.CombatOver == true then
|
||||
finishSequence()
|
||||
return
|
||||
end
|
||||
if hitIndex <= #hitDamages then
|
||||
_TimerService:SetTimerOnce(step, 0.2)
|
||||
return
|
||||
end
|
||||
if repeatOnKill == true and roundKilled == true and countAliveMonsters() > 0 then
|
||||
hitIndex = 1
|
||||
_TimerService:SetTimerOnce(step, 0.2)
|
||||
return
|
||||
end
|
||||
finishSequence()
|
||||
end
|
||||
step()`, [
|
||||
{ Type: 'any', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'hitDamages' },
|
||||
{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'roundPlannedDamage' },
|
||||
{ Type: 'boolean', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'useAoe' },
|
||||
{ Type: 'boolean', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'randomTargetEachHit' },
|
||||
{ Type: 'boolean', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'pierce' },
|
||||
{ Type: 'boolean', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'repeatOnKill' },
|
||||
]),
|
||||
method('CountOtherHandSkills', `if self.Hand == nil then
|
||||
return 0
|
||||
end
|
||||
@@ -784,6 +886,7 @@ if c.kind == "Attack" then
|
||||
baseDmg = xEnergy * c.xDamagePerEnergy
|
||||
end
|
||||
local total = 0
|
||||
local hitDamages = {}
|
||||
local hitN = c.hits or 1
|
||||
if c.otherHandAtLeast ~= nil and c.bonusHitsWhenOtherHandAtLeast ~= nil then
|
||||
local otherHand = 0
|
||||
@@ -796,7 +899,9 @@ if c.kind == "Attack" then
|
||||
end
|
||||
end
|
||||
for h = 1, hitN do
|
||||
total = total + self:CalcPlayerAttack(baseDmg)
|
||||
local hitDamage = self:CalcPlayerAttack(baseDmg)
|
||||
hitDamages[h] = hitDamage
|
||||
total = total + hitDamage
|
||||
end
|
||||
local useAoe = c.aoe == true
|
||||
if c.class == "shiv" and (self.ShivAoeThisCombat == true or self:HasPowerField("shivAoe") == true) then
|
||||
@@ -805,60 +910,7 @@ if c.kind == "Attack" then
|
||||
if c.class == "shiv" and self.ShivFirstDamageBonusUsed ~= true and self:HasPowerField("firstShivDamageBonus") == true then
|
||||
self.ShivFirstDamageBonusUsed = true
|
||||
end
|
||||
local function countAliveMonsters()
|
||||
local n = 0
|
||||
if self.Monsters ~= nil then
|
||||
for mi = 1, #self.Monsters do
|
||||
local om = self.Monsters[mi]
|
||||
if om ~= nil and om.alive == true then n = n + 1 end
|
||||
end
|
||||
end
|
||||
return n
|
||||
end
|
||||
local function randomAliveMonsterIndex()
|
||||
local alive = {}
|
||||
if self.Monsters ~= nil then
|
||||
for mi = 1, #self.Monsters do
|
||||
local om = self.Monsters[mi]
|
||||
if om ~= nil and om.alive == true then
|
||||
table.insert(alive, mi)
|
||||
end
|
||||
end
|
||||
end
|
||||
if #alive <= 0 then
|
||||
return 0
|
||||
end
|
||||
return alive[math.random(1, #alive)]
|
||||
end
|
||||
local function resolveAttackRound()
|
||||
local roundKilled = false
|
||||
if useAoe == true then
|
||||
local killed = self:DealDamageToAllMonsters(total, true)
|
||||
if killed == true then roundKilled = true end
|
||||
elseif c.randomTargetEachHit == true then
|
||||
for h = 1, hitN do
|
||||
local targetIdx = randomAliveMonsterIndex()
|
||||
if targetIdx ~= nil and targetIdx > 0 then
|
||||
local prev = self.TargetIndex
|
||||
self.TargetIndex = targetIdx
|
||||
local killed = self:DealDamageToTarget(total / hitN, c.pierce == true)
|
||||
self.TargetIndex = prev
|
||||
if killed == true then roundKilled = true end
|
||||
end
|
||||
end
|
||||
else
|
||||
local killed = self:DealDamageToTarget(total, c.pierce == true)
|
||||
if killed == true then roundKilled = true end
|
||||
end
|
||||
return roundKilled
|
||||
end
|
||||
local totalDamage = 0
|
||||
local roundKilled = false
|
||||
repeat
|
||||
roundKilled = resolveAttackRound()
|
||||
totalDamage = totalDamage + total
|
||||
until c.repeatOnKill ~= true or roundKilled ~= true or countAliveMonsters() <= 0
|
||||
self.DamageDealtThisTurn = (self.DamageDealtThisTurn or 0) + totalDamage
|
||||
self:RunAttackSequence(hitDamages, total, useAoe, c.randomTargetEachHit == true, c.pierce == true, c.repeatOnKill == true)
|
||||
end
|
||||
if c.block ~= nil then
|
||||
self:AddCardBlock(c.block + (self.HolyChargeCount or 0) * (c.blockPerHolyCharge or 0))
|
||||
|
||||
@@ -25,7 +25,7 @@ for i = 1, #self.RunRelics do
|
||||
elseif r.effect == "strength" then
|
||||
self.PlayerStr = self.PlayerStr + r.value
|
||||
elseif r.effect == "draw" then
|
||||
self:DrawCards(r.value)
|
||||
self:DrawCards(r.value, true)
|
||||
self:RenderHand(false)
|
||||
elseif r.effect == "heal" or r.effect == "healOnAttack" or r.effect == "healOnWin" then
|
||||
self.PlayerHp = self.PlayerHp + r.value
|
||||
@@ -151,7 +151,6 @@ if p.effect == "heal" then
|
||||
self.PlayerHp = math.min(self.PlayerHp + p.value, self.PlayerMaxHp)
|
||||
elseif p.effect == "damage" then
|
||||
self:DealDamageToTarget(p.value, false)
|
||||
self:ShowDmgPop(self.TargetIndex, p.value)
|
||||
elseif p.effect == "strength" then
|
||||
self.PlayerStr = self.PlayerStr + p.value
|
||||
elseif p.effect == "block" then
|
||||
|
||||
@@ -100,13 +100,21 @@ end
|
||||
self:SetText("/ui/RunUIGroup/CombatHud/PlayerPanel/Buffs", pb)
|
||||
self:RenderRun()`),
|
||||
method('ShowDmgPop', `local slotKey = string.format("%d", math.floor(slot or 0))
|
||||
local base = "/ui/RunUIGroup/CombatHud/DmgPop" .. slotKey
|
||||
if self.DmgPopSlotQueue == nil then
|
||||
self.DmgPopSlotQueue = {}
|
||||
end
|
||||
local popIndex = (self.DmgPopSlotQueue[slotKey] or 0) + 1
|
||||
if popIndex > 5 then
|
||||
popIndex = 1
|
||||
end
|
||||
self.DmgPopSlotQueue[slotKey] = popIndex
|
||||
local base = "/ui/RunUIGroup/CombatHud/DmgPop" .. slotKey .. "_" .. tostring(popIndex)
|
||||
local pop = _EntityService:GetEntityByPath(base)
|
||||
if pop == nil then
|
||||
return
|
||||
end
|
||||
self.DmgPopSeq = (self.DmgPopSeq or 0) + 1
|
||||
local popSeq = self.DmgPopSeq
|
||||
local function showNow()
|
||||
self:SetEntityEnabled(base, false)
|
||||
self:SetText(base, "")
|
||||
local damageDigitRuids = { ${DAMAGE_DIGIT_RUIDS.map(luaStr).join(', ')} }
|
||||
local shown = tostring(math.max(0, math.floor(amount)))
|
||||
@@ -114,6 +122,7 @@ if string.len(shown) > ${DAMAGE_POP_MAX_DIGITS} then
|
||||
shown = string.sub(shown, 1, ${DAMAGE_POP_MAX_DIGITS})
|
||||
end
|
||||
local digits = {}
|
||||
local digitPathsToEnable = {}
|
||||
for i = 1, string.len(shown) do
|
||||
table.insert(digits, tonumber(string.sub(shown, i, i)) or 0)
|
||||
end
|
||||
@@ -132,7 +141,7 @@ for i = 1, ${DAMAGE_POP_MAX_DIGITS} do
|
||||
if digitEntity.UITransformComponent ~= nil then
|
||||
digitEntity.UITransformComponent.anchoredPosition = Vector2(startX + (i - 1) * (${DAMAGE_POP_DIGIT_W} + ${DAMAGE_POP_DIGIT_SPACING}), 0)
|
||||
end
|
||||
self:SetEntityEnabled(digitPath, true)
|
||||
table.insert(digitPathsToEnable, digitPath)
|
||||
else
|
||||
self:SetEntityEnabled(digitPath, false)
|
||||
end
|
||||
@@ -151,7 +160,7 @@ else
|
||||
popPos = Vector2(sp.x, sp.y + 76)
|
||||
end
|
||||
end
|
||||
if pop ~= nil and pop.UITransformComponent ~= nil then
|
||||
if pop.UITransformComponent ~= nil then
|
||||
if popPos ~= nil then
|
||||
pop.UITransformComponent.anchoredPosition = popPos
|
||||
else
|
||||
@@ -159,24 +168,31 @@ if pop ~= nil and pop.UITransformComponent ~= nil then
|
||||
end
|
||||
end
|
||||
self:SetEntityEnabled(base, true)
|
||||
for i = 1, #digitPathsToEnable do
|
||||
self:SetEntityEnabled(digitPathsToEnable[i], true)
|
||||
end
|
||||
for i = 1, 6 do
|
||||
_TimerService:SetTimerOnce(function()
|
||||
if self.DmgPopSeq ~= popSeq then
|
||||
return
|
||||
end
|
||||
local p = _EntityService:GetEntityByPath(base)
|
||||
if p ~= nil and p.UITransformComponent ~= nil then
|
||||
local cur = p.UITransformComponent.anchoredPosition
|
||||
p.UITransformComponent.anchoredPosition = Vector2(cur.x, cur.y + 7)
|
||||
end
|
||||
end, 0.045 * i)
|
||||
local alpha = 1 - (i / 6)
|
||||
if alpha < 0 then alpha = 0 end
|
||||
for di = 1, ${DAMAGE_POP_MAX_DIGITS} do
|
||||
local digitEntity = _EntityService:GetEntityByPath(base .. "/Digit" .. tostring(di))
|
||||
if digitEntity ~= nil and digitEntity.Enable == true and digitEntity.SpriteGUIRendererComponent ~= nil then
|
||||
digitEntity.SpriteGUIRendererComponent.Color = Color(1, 1, 1, alpha)
|
||||
end
|
||||
end
|
||||
end, 0.05 * i)
|
||||
end
|
||||
_TimerService:SetTimerOnce(function()
|
||||
if self.DmgPopSeq ~= popSeq then
|
||||
return
|
||||
end
|
||||
self:SetEntityEnabled(base, false)
|
||||
end, 0.48)`, [
|
||||
end, 0.3)
|
||||
end
|
||||
showNow()`, [
|
||||
{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' },
|
||||
{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'amount' },
|
||||
]),
|
||||
@@ -188,6 +204,48 @@ else
|
||||
end
|
||||
self:SetEntityEnabled(base, true)
|
||||
_TimerService:SetTimerOnce(function() self:SetEntityEnabled(base, false) end, 0.6)`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'amount' }]),
|
||||
method('ShakeCombatCamera', `local lp = _UserService.LocalPlayer
|
||||
local cam = nil
|
||||
if lp ~= nil then
|
||||
cam = lp.CameraComponent
|
||||
end
|
||||
if cam == nil then
|
||||
cam = _CameraService:GetCurrentCameraComponent()
|
||||
end
|
||||
if cam == nil then
|
||||
return
|
||||
end
|
||||
self.CombatCameraShakeSeq = (self.CombatCameraShakeSeq or 0) + 1
|
||||
local seq = self.CombatCameraShakeSeq
|
||||
local baseCameraOffset = Vector2(${CAM.cameraOffsetX}, ${CAM.cameraOffsetY})
|
||||
cam.CameraOffset = baseCameraOffset
|
||||
local offsets = {
|
||||
Vector2(-0.22, 0),
|
||||
Vector2(0.2, 0),
|
||||
Vector2(-0.12, 0),
|
||||
Vector2(0.06, 0),
|
||||
Vector2(0, 0),
|
||||
}
|
||||
for i = 1, #offsets do
|
||||
local delta = offsets[i]
|
||||
_TimerService:SetTimerOnce(function()
|
||||
local lp2 = _UserService.LocalPlayer
|
||||
local cam2 = nil
|
||||
if lp2 ~= nil then
|
||||
cam2 = lp2.CameraComponent
|
||||
end
|
||||
if cam2 == nil then
|
||||
cam2 = _CameraService:GetCurrentCameraComponent()
|
||||
end
|
||||
if cam2 == nil then
|
||||
return
|
||||
end
|
||||
if seq ~= self.CombatCameraShakeSeq then
|
||||
return
|
||||
end
|
||||
cam2.CameraOffset = Vector2(baseCameraOffset.x + delta.x, baseCameraOffset.y + delta.y)
|
||||
end, 0.028 * (i - 1))
|
||||
end`, []),
|
||||
method('PlayerAttackMotion', `local lp = _UserService.LocalPlayer
|
||||
if lp == nil then
|
||||
return
|
||||
@@ -301,4 +359,5 @@ if self.AscensionLevel > 0 then
|
||||
end
|
||||
self:SetText("/ui/RunUIGroup/CombatHud/TopBar/Floor", floorText)
|
||||
self:SetText("/ui/RunUIGroup/CombatHud/TopBar/Gold", "메소 " .. string.format("%d", self.Gold))`),
|
||||
|
||||
];
|
||||
|
||||
@@ -106,6 +106,8 @@ self.HolyChargeCount = 0
|
||||
self.DamagePowerStrengthUsed = false
|
||||
self.DamageDealtThisTurn = 0
|
||||
self.DmgPopSeq = 0
|
||||
self.CombatCameraShakeSeq = 0
|
||||
self.DmgPopSlotQueue = {}
|
||||
self.FirstHpLossDone = false
|
||||
self.ClayBlockNext = 0
|
||||
self.DiscardSelectRemaining = 0
|
||||
|
||||
@@ -49,9 +49,9 @@ end`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], N
|
||||
method('ShowMainMenu', `self.SelectedClass = ""
|
||||
self:RenderAscension()
|
||||
self:ShowState("menu")
|
||||
self:SetText("/ui/DefaultGroup/MainMenu/Title", "메이플 덱 어드벤처")
|
||||
self:SetText("/ui/DefaultGroup/MainMenu/Subtitle", "캐릭터를 고르고 덱을 만들어 모험을 시작하세요")
|
||||
self:SetText("/ui/DefaultGroup/MainMenu/NewGameButton", "새 게임")
|
||||
self:SetText("/ui/DefaultGroup/MainMenu/Title", "Maple Deck Adventure")
|
||||
self:SetText("/ui/DefaultGroup/MainMenu/Subtitle", "Choose your character and begin your run")
|
||||
self:SetText("/ui/DefaultGroup/MainMenu/NewGameButton", "New Game")
|
||||
self:BindMenuButtons()`),
|
||||
method('BindMenuButtons', `local buttonEntity = _EntityService:GetEntityByPath("/ui/DefaultGroup/MainMenu/NewGameButton")
|
||||
if buttonEntity ~= nil and (buttonEntity.ButtonComponent ~= nil or buttonEntity:AddComponent("ButtonComponent") ~= nil) then
|
||||
@@ -136,22 +136,28 @@ self:BindLobbyButtons()
|
||||
self:BindMenuButtons()
|
||||
self:GoLobbyMap()`),
|
||||
method('RenderSoulLabel', `local soulPoints = self.SoulPoints or 0
|
||||
self:SetText("/ui/LobbyUIGroup/LobbyHud/SoulLabel", "영혼 " .. string.format("%d", soulPoints))
|
||||
self:SetText("/ui/LobbyUIGroup/SoulShopHud/Souls", "영혼 " .. string.format("%d", soulPoints))`),
|
||||
self:SetText("/ui/LobbyUIGroup/LobbyHud/SoulLabel", "Soul " .. string.format("%d", soulPoints))
|
||||
self:SetText("/ui/LobbyUIGroup/SoulShopHud/Souls", "Soul " .. string.format("%d", soulPoints))`),
|
||||
method('BindLobbyButtons', `if self.LobbyBound == true then
|
||||
return
|
||||
end
|
||||
self.LobbyBound = true
|
||||
local function bindClick(path, handler)
|
||||
local entity = _EntityService:GetEntityByPath(path)
|
||||
if entity ~= nil and (entity.ButtonComponent ~= nil or entity:AddComponent("ButtonComponent") ~= nil) then
|
||||
entity:ConnectEvent(ButtonClickEvent, handler)
|
||||
local ascMinus = _EntityService:GetEntityByPath("/ui/LobbyUIGroup/LobbyHud/AscMinus")
|
||||
if ascMinus ~= nil and (ascMinus.ButtonComponent ~= nil or ascMinus:AddComponent("ButtonComponent") ~= nil) then
|
||||
ascMinus:ConnectEvent(ButtonClickEvent, function() self:AdjustAscension(-1) end)
|
||||
end
|
||||
local ascPlus = _EntityService:GetEntityByPath("/ui/LobbyUIGroup/LobbyHud/AscPlus")
|
||||
if ascPlus ~= nil and (ascPlus.ButtonComponent ~= nil or ascPlus:AddComponent("ButtonComponent") ~= nil) then
|
||||
ascPlus:ConnectEvent(ButtonClickEvent, function() self:AdjustAscension(1) end)
|
||||
end
|
||||
bindClick("/ui/LobbyUIGroup/LobbyHud/AscMinus", function() self:AdjustAscension(-1) end)
|
||||
bindClick("/ui/LobbyUIGroup/LobbyHud/AscPlus", function() self:AdjustAscension(1) end)
|
||||
bindClick("/ui/LobbyUIGroup/BoardHud/Close", function() self:CloseBoard() end)
|
||||
bindClick("/ui/LobbyUIGroup/SoulShopHud/Close", function() self:CloseSoulShop() end)`),
|
||||
local boardClose = _EntityService:GetEntityByPath("/ui/LobbyUIGroup/BoardHud/Close")
|
||||
if boardClose ~= nil and (boardClose.ButtonComponent ~= nil or boardClose:AddComponent("ButtonComponent") ~= nil) then
|
||||
boardClose:ConnectEvent(ButtonClickEvent, function() self:CloseBoard() end)
|
||||
end
|
||||
local soulClose = _EntityService:GetEntityByPath("/ui/LobbyUIGroup/SoulShopHud/Close")
|
||||
if soulClose ~= nil and (soulClose.ButtonComponent ~= nil or soulClose:AddComponent("ButtonComponent") ~= nil) then
|
||||
soulClose:ConnectEvent(ButtonClickEvent, function() self:CloseSoulShop() end)
|
||||
end`),
|
||||
method('ShowCodex', `self.CodexMode = true
|
||||
self.ClassDeckMode = true
|
||||
local close = _EntityService:GetEntityByPath("/ui/DeckUIGroup/DeckAllHud/Close")
|
||||
|
||||
@@ -41,24 +41,36 @@ if lp ~= nil then
|
||||
end
|
||||
self:RenderSoulLabel()`, [{ Type: "number", DefaultValue: null, SyncDirection: 0, Attributes: [], Name: "n" }]),
|
||||
method('BuySoulUnlock', `local d = nil
|
||||
if self.SoulShopDef ~= nil then d = self.SoulShopDef[slot] end
|
||||
if d == nil then return end
|
||||
if self.SoulUnlocks ~= nil and self.SoulUnlocks[d.key] == true then
|
||||
self:Toast("이미 보유 중입니다")
|
||||
if self.SoulShopDef ~= nil then
|
||||
d = self.SoulShopDef[slot]
|
||||
end
|
||||
if d == nil then
|
||||
return
|
||||
end
|
||||
if (self.SoulPoints or 0) < d.cost then
|
||||
self:Toast("영혼이 부족합니다")
|
||||
local unlockKey = d.key
|
||||
local unlockCost = d.cost
|
||||
local unlockName = d.name or "Unlock"
|
||||
if unlockKey == nil or unlockCost == nil then
|
||||
return
|
||||
end
|
||||
self.SoulPoints = self.SoulPoints - d.cost
|
||||
if self.SoulUnlocks == nil then self.SoulUnlocks = {} end
|
||||
self.SoulUnlocks[d.key] = true
|
||||
if self.SoulUnlocks ~= nil and self.SoulUnlocks[unlockKey] == true then
|
||||
self:Toast("Already owned")
|
||||
return
|
||||
end
|
||||
if (self.SoulPoints or 0) < unlockCost then
|
||||
self:Toast("Not enough soul")
|
||||
return
|
||||
end
|
||||
self.SoulPoints = self.SoulPoints - unlockCost
|
||||
if self.SoulUnlocks == nil then
|
||||
self.SoulUnlocks = {}
|
||||
end
|
||||
self.SoulUnlocks[unlockKey] = true
|
||||
local lp = _UserService.LocalPlayer
|
||||
if lp ~= nil then
|
||||
self:SaveSouls(self.SoulPoints, self:SerializeUnlocks(), lp.PlayerComponent.UserId)
|
||||
end
|
||||
self:Toast(d.name .. " 해금!")
|
||||
self:Toast(unlockName .. " unlocked")
|
||||
self:RenderSoulLabel()
|
||||
self:RenderSoulShop()`, [{ Type: "number", DefaultValue: null, SyncDirection: 0, Attributes: [], Name: "slot" }]),
|
||||
method('RenderSoulShop', `local defs = self.SoulShopDef or {}
|
||||
@@ -68,16 +80,20 @@ for i = 1, 4 do
|
||||
if d == nil then
|
||||
self:SetEntityEnabled(base, false)
|
||||
else
|
||||
local itemName = d.name or "Unlock"
|
||||
local itemDesc = d.desc or ""
|
||||
local itemKey = d.key
|
||||
local itemCost = d.cost or 0
|
||||
self:SetEntityEnabled(base, true)
|
||||
self:SetText(base .. "/Name", d.name)
|
||||
self:SetText(base .. "/Desc", d.desc)
|
||||
local owned = self.SoulUnlocks ~= nil and self.SoulUnlocks[d.key] == true
|
||||
self:SetText(base .. "/Name", itemName)
|
||||
self:SetText(base .. "/Desc", itemDesc)
|
||||
local owned = itemKey ~= nil and self.SoulUnlocks ~= nil and self.SoulUnlocks[itemKey] == true
|
||||
if owned then
|
||||
self:SetText(base .. "/Status", "보유 중")
|
||||
elseif (self.SoulPoints or 0) >= d.cost then
|
||||
self:SetText(base .. "/Status", tostring(d.cost) .. " 영혼 · 구매")
|
||||
self:SetText(base .. "/Status", "Owned")
|
||||
elseif (self.SoulPoints or 0) >= itemCost then
|
||||
self:SetText(base .. "/Status", tostring(itemCost) .. " soul · buy")
|
||||
else
|
||||
self:SetText(base .. "/Status", tostring(d.cost) .. " 영혼 · 부족")
|
||||
self:SetText(base .. "/Status", tostring(itemCost) .. " soul · low")
|
||||
end
|
||||
end
|
||||
end`),
|
||||
|
||||
@@ -36,6 +36,8 @@ function writeCodeblocks() {
|
||||
prop('number', 'TweenEventId', '0'),
|
||||
prop('number', 'CardHoverTweenId', '0'),
|
||||
prop('number', 'DmgPopSeq', '0'),
|
||||
prop('number', 'CombatCameraShakeSeq', '0'),
|
||||
prop('any', 'DmgPopSlotQueue'),
|
||||
prop('any', 'EndTurnHandler'),
|
||||
prop('any', 'NewGameHandler'),
|
||||
prop('any', 'WarriorSelectHandler'),
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
"enable": true,
|
||||
"visible": true,
|
||||
"localize": true,
|
||||
"displayOrder": 4,
|
||||
"displayOrder": 6,
|
||||
"pathConstraints": "//",
|
||||
"revision": 1,
|
||||
"origin": {
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
"enable": true,
|
||||
"visible": true,
|
||||
"localize": true,
|
||||
"displayOrder": 5,
|
||||
"displayOrder": 1,
|
||||
"pathConstraints": "//",
|
||||
"revision": 1,
|
||||
"origin": {
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
"enable": true,
|
||||
"visible": true,
|
||||
"localize": true,
|
||||
"displayOrder": 1,
|
||||
"displayOrder": 2,
|
||||
"pathConstraints": "//",
|
||||
"revision": 1,
|
||||
"origin": {
|
||||
|
||||
20448
ui/RunUIGroup.ui
20448
ui/RunUIGroup.ui
File diff suppressed because it is too large
Load Diff
@@ -24,7 +24,7 @@
|
||||
"enable": true,
|
||||
"visible": true,
|
||||
"localize": true,
|
||||
"displayOrder": 2,
|
||||
"displayOrder": 3,
|
||||
"pathConstraints": "//",
|
||||
"revision": 1,
|
||||
"origin": {
|
||||
|
||||
Reference in New Issue
Block a user