diff --git a/package.json b/package.json index a0b722e2..3b3aa723 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "url": "https://github.com/serprex/openEtG" }, "devDependencies": { - "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.6", "@pencil.js/spritesheet": "^1.5.1", "babel-loader": "^9.1.3", "babel-preset-solid": "^1.8.17", diff --git a/src/cards.csv b/src/cards.csv index bbe8ebfc..649c8624 100644 --- a/src/cards.csv +++ b/src/cards.csv @@ -180,8 +180,8 @@ 7227|Plague Mask|2|1|2|3||2|buff=poisondr+1:7=doctor| 5228|Frailty|2|3|1|1|||frail| 7228|Frailty|2|3|1|1|||frail2| -5229|Skelton Axe|2|0|3|5|6|3|1=bonesharpen| -7229|Skelton Axe|2|0|3|5|6|3|1=bonesplit| +5229|Skelton Axe|2|0|3|5|4|3|1=bonesharpen| +7229|Skelton Axe|2|0|3|5|6|3|1=bonesharpen| 5230|Shard of Sacrifice|2|3|3|2|||sosa| 7230|Shard of Sacrifice|2|3|3|2|||sosa| 5250|Death Pendulum|2|2|0|0|||pend|pillar+stackable+additive+charges=1 @@ -242,8 +242,8 @@ 7326|Brawl|3|3|3|13|||brawl| 5327|Boar|3|4|1|3|2|1|growth 1 0| 7327|Boar|3|4|1|3|3|1|growth 1 1| -5328|Scepter of Ruling|3|0|3|5|7|5|3:12=rule| -7328|Scepter of Ruling|3|0|3|5|8|5|2:12=rule| +5328|Scepter of Ruling|3|0|3|5|7|5|2:12=beguile| +7328|Scepter of Ruling|3|0|3|5|8|5|1:12=beguile| 5330|Shard of Focus|3|4|3|6||1|1=accretion| 7330|Shard of Focus|3|4|3|4||1|1=accretion| 5331|Stasis|3|3|2|1|||stasisdraw+owndraw=sanctify+owndiscard=sanctify| @@ -817,4 +817,4 @@ 6230|Shard of Wisdom|12|3|3|3|||wisdom| 8230|Shard of Wisdom|12|3|3|2|||wisdom| 6250|Aether Pendulum|12|2|0|0|||pend|pillar+stackable+additive+charges=1 -8250|Aether Pendulum|12|2|0|0|||pend+ownplay=pillar1|pillar+stackable+additive+charges=1 +8250|Aether Pendulum|12|2|0|0|||pend+ownplay=pillar1|pillar+stackable+additive+charges=1 \ No newline at end of file diff --git a/src/rs/src/skill.rs b/src/rs/src/skill.rs index 0ed42776..50ca185c 100644 --- a/src/rs/src/skill.rs +++ b/src/rs/src/skill.rs @@ -267,6 +267,7 @@ pub enum Skill { blockhp, bloodmoon, bolsterintodeck, + bonesharpen, boneyard, bounce, bow, @@ -276,6 +277,7 @@ pub enum Skill { brokenmirror, bubbleclear, burrow, + burstout, butterfly, catapult, catlife, @@ -293,6 +295,8 @@ pub enum Skill { cseed, cseed2, dagger, + databloat, + datashrink, deadalive, deathwish, deckblast, @@ -353,6 +357,7 @@ pub enum Skill { firebrand, firestorm(i16), firewall, + fish, flood, flooddeath, flyingweapon, @@ -360,6 +365,7 @@ pub enum Skill { foedraw, forcedraw, forceplay, + fossilize, fractal, frail, frail2, @@ -375,6 +381,7 @@ pub enum Skill { golemhit, gpull, gpullspell, + grab2h, grave, growth(i8, i8), guard, @@ -383,8 +390,10 @@ pub enum Skill { hammer, hasten, hatch, + haunt, heal, heatmirror, + heatstroke, hitownertwice, holylight, hope, @@ -466,6 +475,7 @@ pub enum Skill { precognition, predator, predatoroff, + protect, protectall, protectonce, protectoncedmg, @@ -502,6 +512,7 @@ pub enum Skill { scramblespam, serendipity, shardgolem, + shazam, shtriga, shuffle3, silence, @@ -536,6 +547,7 @@ pub enum Skill { tempering(i16), tesseractsummon, thorn(u8), + throwfeather, throwrock, tick, tidalhealing, @@ -900,6 +912,19 @@ impl<'a> Display for SkillName<'a> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let &SkillName { sk, ctx, id } = self; match sk { + Skill::bonesharpen => f.write_str("bonesharpen"), + Skill::burstout => f.write_str("burstout"), + Skill::databloat => f.write_str("databloat"), + Skill::datashrink => f.write_str("datashrink"), + Skill::haunt => f.write_str("haunt"), + Skill::throwfeather => f.write_str("throwfeather"), + Skill::heatstroke => f.write_str("heatstroke"), + Skill::grab2h + => f.write_str("grab2h"), + Skill::protect => f.write_str("protect"), + Skill::fish => f.write_str("fish"), + Skill::shazam => f.write_str("shazam"), + Skill::fossilize => f.write_str("fossilize"), Skill::r#_tracedeath => Ok(()), Skill::abomination => Ok(()), Skill::absorbdmg => f.write_str("absorbdmg"), @@ -1571,6 +1596,124 @@ impl Skill { pub fn proc(self, ctx: &mut Game, c: i16, t: i16, data: &mut ProcData) { match self { + Skill::bonesharpen => { + ctx.incrAtk(t, ctx.get(c, Stat::atk)); + } + Skill::burstout => { + let owner = ctx.get_owner(c); + let mut n = 0; + for cr in ctx.get_player(owner).creatures { + if cr != 0 { + let crcard = ctx.get(cr, Stat::card); + let bugs = [card::ChromaticButterfly, + card::SpiderCow, + card::Deathstalker, + card::FleshSpider, + card::Antlion, + card::Graboid, + card::Shrieker, + card::Scorpion, + card::GiantSpider, + card::AshEater, + card::DivingBellSpider, + card::BobbitWorm, + card::NullMantis, + card::Dragonfly, + card::Firefly, + card::FireflyQueen, + card::Scarab, + card::DuneScorpion, + card::Devourer, + card::Parasite, + card::PhaseSpider, + ]; + if bugs.iter().any(|x| card::IsOf(crcard, x)) { + n += 1; + Skill::parallel.proc(ctx, cr, cr, data); + } + } + } + ctx.poison(owner, n); + } + Skill::databloat => { + if ctx.get_kind(t) == Kind::Player { + for id in ctx.get_player(t).hand_iter() { + ctx.incrStatus(t, Stat::cost, 1) + } + } else { + ctx.incrStatus(t, Stat::cost, 2) + } + + } + Skill::datashrink => { + if ctx.get_kind(t) == Kind::Player { + for id in ctx.get_player(t).hand_iter() { + ctx.incrStatus(t, Stat::cost, -1) + } + } else { + ctx.incrStatus(t, Stat::cost, -2) + } + } + Skill::haunt => {} + Skill::throwfeather => {} + Skill::heatstroke => {} + Skill::grab2h => {} + Skill::protect => {} + Skill::fish => {} + Skill::shazam => { + let owner = ctx.get_owner(c); + let mut options = [etg::Chroma; 3]; + let mut idx = 0; + if ctx.get_player(owner).quanta(etg::Life) > 1 { + options[idx as usize] = etg::Life; + idx += 1; + } + if ctx.get_player(owner).quanta(etg::Light) > 1 { + options[idx as usize] = etg::Light; + idx += 1; + } + if ctx.get_player(owner).quanta(etg::Air) > 1 { + options[idx as usize] = etg::Air; + idx += 1; + } + if idx != 0 { + let option = options[ctx.upto(idx)]; + ctx.spend(owner, option, 2); + match option { + etg::Life => { + let town = ctx.get_owner(t); + ctx.set(town, Stat::gpull, t); + ctx.transform(t, card::GuardianAngel); + } + etg::Light => { + ctx.set(t, Stat::atk, 3); + ctx.set(t, Stat::hp, 3); + } + etg::Air => { + ctx.transform(t, card::Wyrm); + ctx.set(t, Stat::atk, 2); + ctx.set(t, Stat::hp, 2); + } + _ => unsafe { core::hint::unreachable_unchecked() }, + + } + } + } + Skill::fossilize => { + if ctx.get(t, Flag::golem) { + let town = ctx.get_owner(t); + ctx.set(town, Stat::gpull, t); + ctx.dmg(t, -20); + } else { + let atk = ctx.get(t, Stat::atk); + let hp = ctx.get(t, Stat::hp); + let maxhp = ctx.get(t, Stat::maxhp); + ctx.transform(t, card::ClockworkGolem); + ctx.set(t, Stat::atk, atk); + ctx.set(t, Stat::hp, hp); + ctx.set(t, Stat::maxhp, maxhp); + } + } Self::r#_tracedeath => { ctx.incrStatus(ctx.turn, Stat::lives, 1); }