From 372d9cce941e3beb93fe69780744ee03cd36fc80 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Fri, 13 Sep 2019 19:18:05 +0800 Subject: [PATCH 01/30] update forge-android support simplified chinese characters --- .../src/forge/assets/FSkinFont.java | 206 +++++++++--------- 1 file changed, 101 insertions(+), 105 deletions(-) diff --git a/forge-gui-mobile/src/forge/assets/FSkinFont.java b/forge-gui-mobile/src/forge/assets/FSkinFont.java index 5f42bcd27fb..208010bdeef 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinFont.java +++ b/forge-gui-mobile/src/forge/assets/FSkinFont.java @@ -355,111 +355,107 @@ public class FSkinFont { //generate from zh-CN.properties,and cardnames-zh-CN.txt //forge generate 3000+ characters cache need Take some time(MIN_FONT_SIZE - MAX_FONT_SIZE all size) //maybe using libgdx-hiero generate font cache is better - chars += "·âéöû—“”•−●、。「」『』一丁七万三!(),/:;?~鼹鼻齐齑" - + "上下不与丑专且世丘业丛东丝两严丧个中丰临丸丹为丽举乃久么义" - + "之乌乍乐乔乖乘乙九也乡书乱乳乾了予争事二于云互五井亘亚些亡" - + "交亥亦产享京亮亲亵人亿什仁仅仆仇今介仍从仑仓仕他仗付仙代令" - + "以仪们仰仲件价任份仿伊伍伏伐休众优伙会伟传伤伦伪伯伴伶伺似" - + "伽但位低住佐佑体何余佚佛作你佣佩佳使例侍侏供依侠侣侦侧侬侮" - + "侯侵便促俄俊俐俑俘保信修俯俸個倍倒候借倡倦倨倪债值倾假偏做" - + "停偶偷偿傀傍储催傲像僧僭僵僻儒儡儿兀允元充兆先光克免兔兕党" - + "入全八公六兰共关兴兵其具典兹养兼兽内册再冒冕写军农冠冢冥冬" - + "冰冲决况冶冷冻净准凋凌减凑凛凝几凡凤凭凯凰凶出击凿刀刃分切" - + "刈刍刑划列则刚创初删判利别刮到制刷刹刺刻刽剂剃削剌前剎剑剖" - + "剜剥剧剩剪副割剽劈力劝办功加务劣动助努劫励劲劳势勃勇勉勋勒" - + "勘募勤勾包匍匐匕化北匙匠匪匹区医匿十千升午半华协卑卒卓单卖" - + "南博卜占卡卢卦卫印危即却卵卷卸厂厄厅历厉压厚原厢厥厦厨去参" - + "叉及友双反发叔取受变叙叛叠口古句另叨只叫召叮可台史右叶号司" - + "叹吁吃各合吉吊同名后吏吐向吓吕吗君吞吟否含听吮启吱吸吹吻吼" - + "呆告呕员周味呼命咆和咏咒咕咬咯咳咽哀品哈响哑哗哥哨哩哪哭哮" - + "哲哺唐唤售唯唱啃啄商啜啪啮啸喀喂善喉喊喋喘喙喜喝喧喷嗅嗔嗜" - + "嗡嗣嗫嘉嘎嘘嘲嘴嘶噜噤器噬嚎嚼囊囚四回因团囤园困围固国图圆" - + "圈團土圣在地场圾均坊坍坎坏坐坑块坚坛坝坞坟坠坤坦坪坷垂垃型" - + "垒垛垠垢垣垦埃埋城域培基堂堆堕堡堤堪堰塌塑塔塘塞填境墓墙增" - + "墟墨壁壅壕壤士壬壮声壳壶处备复夏外多夜够大天太夫央失头夷夸" - + "夹夺奇奈奉奋奎契奔奖套奢奥女奴她好如妃妄妆妇妈妖妙妥妪妮妲" - + "妹姆姊始姓姜姥姬姿威娃娅娜婆婉婪婶媒嫁嫩嬉子孑孔孕字存孚孢" - + "季孤学孪孳孵孽宁它宅宇守安完宏宗官宙定宜宝实宠审客宣室宪宫" - + "宰害宴家容宾宿寂寄密寇富寒寓寝察寡寨寰寸对寺寻导封射将尉尊" - + "小少尔尖尘尚尝尤尬就尸尹尺尼尽尾局层居屈屋屏屑展属屠履屯山" - + "屹岁岑岔岖岗岚岛岩岱岳岸峡峭峰峻崇崎崔崖崩崽嵌巅巍川巡巢工" - + "左巧巨巫差己已巳巴巷币市布帅帆师希帕帖帘帜帝带席帮帷常帽幅" - + "幔幕干平年并幸幻幼幽广庄庆庇床序库应底店庙府庞废度座庭庶廉" - + "廊延建开异弃弄弊式弑弓引弗弘弟张弥弦弧弩弯弱張弹强归当录彗" - + "形彩彰影役彻彼往征径待很徊律後徒徕得徘徙從御復循微徵德徽心" - + "必忆忌忍忒志忘忠忧快忱念忽忾忿怀态怒怖思急性怨怪怯总恍恐恒" - + "恕恢恣恨恩恫息恰恳恶恸恼悉悍悔悖悟患悦您悬悯悲悼情惊惑惘惚" - + "惠惧惨惩惫惰想惹愁愈愎意愚感愣愤愧愿慈慌慎慑慕慢慧慨慰慷憎" - + "憩懦戈戏成我戒戕或战戟截戮戳戴户戾房所扁扇扈手才扎扑扒打托" - + "扣执扩扫扬扭扮扯扰找承技抄抉把抑抓投抖抗折抚抛抢护报披抱抵" - + "抹押抽拂拆拉拍拒拓拔拖拘招拜拟拣拥拦拧拨择括拯拱拳拷拼拽拾" - + "拿持挂指按挑挖挚挟挠挡挣挥挪挫振挺挽捆捉捍捕捞损换捣捧据捷" - + "捻掀授掉掌掐排掘掠探接控推掩措掮掳掷揍描提插握揭援揽搁搅搏" - + "搐搜搞搬搭携摄摆摇摘摧摩摸摹撒撕撞撤撬播撵撼擅操擎擒擞擦攀" - + "攫支收改攻放政故效敌敏救敕教敞敢散敦敬数敲整文斐斑斓斗斤斥" - + "斧斩断斯新方施旁旅旋族旗无既日旧旨早旭时旷旸旺昂昆昌明昏易" - + "昔昙星映春昨昭是昵昼显晃晋晓晕晖晚晨普景晰晴晶晷智暂暗暮暴" - + "曙曜曝曦曲曳更曼曾替最月有服朗望朝期木未末本札术朵机朽杀杂" - + "权杉李村杖杜束条来杨杯杰松板极构析林枚果枝枢枪枭枯架枷柄柏" - + "某染柜查柩柯柱柳栅标栈栋栏树栓栖栗株样核根格栽桂框案桌桎桑" - + "桓桠档桥桨桩桶梁梅梓梢梣梦梧梨梭梯械检棄棍棒棕棘棚森棱棺椁" - + "植椎椒椽楂楔楚楣楼概榄榆榔榨榴槌槛模横樱樵橇橡橫檀檐次欢欣" - + "欧欲欺歇歌止正此步武歪死歼殁殆殇殉殊残殍殒殓殖殡殴段殷殿毁" - + "毅母每毒比毕毛毡氅氏民氓气氤氦氧氲水永汀汁求汇汉汐汗汛池污" - + "汤汨汪汰汲汹汽沃沈沉沌沐沙沟没沥沦沮河沸油治沼沾沿泄泉泊法" - + "泛泞泡波泣泥注泪泯泰泽洁洋洒洗洛洞津洪洲活洼派流浅浆浇浊测" - + "济浑浓浚浩浪浮浴海浸涅消涉涌涎涛涟涡涤润涨涩液涵淋淘淤淬深" - + "混淹添清渊渎渐渔渗渝渠渡渣渥温港渲渴游湍湖湛湮湾湿溃溅源溜" - + "溢溪溯溶溺滋滑滓滔滚滞满滤滥滨滴漂漏演漠漩漫潘潜潭潮澄澈澹" - + "激濑濒瀑瀚灌火灭灯灰灵灼灾灿炉炎炙炫炬炭炮炸点炼炽烁烂烈烙" - + "烛烟烤烦烧烫烬热烽焉焊焚焦焰然煌煎煞煤照煮煽熄熊熏熔熟熠熵" - + "燃燎燕燧爆爪爬爱爵父片版牌牒牙牛牝牡牢牦牧物牲牵特牺犀犁犄" - + "犧犬犯状狂狄狈狐狗狙狞狡狩独狭狮狰狱狷狸狼猁猎猛猜猪猫献猴" - + "猿獒獠獾玄率玉王玖玛玩玫环现玷玻珀珂珊珍珠班球理琉琐琥琳琴" - + "琵琼瑕瑙瑚瑞瑟瑰璃璞璧瓜瓣瓦瓮瓯瓶瓷甘生用甩甫田由甲电画畅" - + "界畏留略畸畿疆疏疑疗疚疡疣疤疫疮疯疲疵疹疽疾病症痕痛痞痢痨" - + "痪痴痹瘟瘠瘤瘫瘴癣癫癸登白百的皆皇皈皮皱皿盆盈盐监盒盔盖盗" - + "盘盛盟目盲直相盾省看真眠眨眩眷眺眼着睁睡督睥睨睿瞄瞒瞥瞪瞬" - + "瞭瞰瞳矛矢知矫短矮石矾矿码砂砍研砖砦砧破砸砾础硕硫硬确碍碎" - + "碑碟碧碰碳碻碾磁磊磨磷磺礁示礼社祀祈祖祝神祟祠祥票祭祷祸禁" - + "禄福离禽私秃秉秋种科秘秣秤秩积称移秽稀程税稚稳稻穆穗穴究穷" - + "穹空穿突窃窍窒窖窗窘窜窝窟窥立竖站竞章童竭端竹笏笑笔笛笞符" - + "第笼等筑筒答策筛筝筹签简箔算箝管箭箱篓篮篱篷簇簧簪米类粉粒" - + "粗粮粹精糊糙糟系素索紧紫累繁纂纠红约级纪纬纯纱纳纵纷纸纹纺" - + "纽线练组绅细织终绊绍经绒结绕绘给绚络绝绞统绥继绩绪续绮绯绳" - + "维绵综绽绿缀缄缅缆缇缉缎缓缕编缘缚缝缠缩缪缰缸缺罅网罔罗罚" - + "罡罩罪置羁羊美羚羞群羽翁翅翎翔翠翡翰翱翻翼耀老考者而耍耐耕" - + "耗耘耙耳耶职联聚聪肃肆肇肉肌肖肝肠肢肤肥肩肯育肴肺肿胀胁胃" - + "胆背胎胖胜胞胡胧胫胶胸能脂脆脉脊脏脑脓脚脱脸腐腔腕腥腱腹腾" - + "腿膂膏膛膜膝臂臃臣自臭至致舌舍舒舞舟航般舰舱船艇良艰色艺艾" - + "节芒芙芜芥芬芭芮花芳芽苇苍苏苔苗苛苜苟若苦英茁茂范茉茎茜茧" - + "茨茫茸荆草荒荚荡荣荨荫药荷莉莎莓莫莱莲莳获莽菁菇菊菌菜菲萃" - + "萌萍萎萝营萦萧萨萼落著葛葬葵蒂蒙蒸蓄蓑蓝蓟蓿蔑蔓蔚蔷蔻蔽蕈" - + "蕊蕨蕴蕾薄薇薙薪藏藐藓藤藻虎虏虐虑虔虚虫虱虹蚀蚁蚊蚋蚣蚺蛆" - + "蛇蛊蛋蛎蛙蛛蛞蛭蛮蛰蛸蛾蜂蜈蜉蜒蜕蜗蜘蜜蜡蜥蜴蜷蜿蝇蝎蝓蝗" - + "蝙蝠蝣蝾螂螅融螫螳螺蟀蟋蟑蟒蟹蠕蠢血行衍街衡衣补表衫衰袂袋" - + "袍袖被袭裁裂装裔裘褐褛褪褫褴褶襄西要覆见观规觅视览觉觊角解" - + "触言詹誉誓警计认讧讨让训议讯记讲许论讽设访诀证评诅识诈诉词" - + "试诗诘诚诛话诞诡该详诫语误诱诲说诵请诸诺读调谆谈谊谋谍谐谕" - + "谗谜谟谢谣谦谧谨谬谭谱谴谵谷豁象豪豹豺貂貌贝贞负贡财责贤败" - + "货质贩贪贫贬购贮贯贱贴贵贷贸费贺贼贾贿赂赃资赋赌赎赏赐赖赘" - + "赛赞赠赢赤赦赫走赶起超越趋足跃跑跖跚跛距跟跨路跳践跺踏踝踢" - + "踩踪踵踽蹂蹄蹊蹋蹒蹦蹬躁躏身躯躲車车轨轩转轭轮软轰轴轻载较" - + "辉辑输辖辗辙辛辜辞辟辨辩辫辰辱边达迁迂迅过迈迎运近返还这进" - + "远违连迟迦迩迪迫迭述迳迷迸迹追退送适逃逆选逊透逐递途通逝逞" - + "速造逢逮逸逻逼遁遇遍遏道遗遣遥遨遭遮避邀還那邦邪邬邸郊郎部" - + "都鄙酋配酒酬酷酸酿醉醒采釉释里重野量金鉴针钉钓钗钙钜钝钟钢" - + "钥钦钨钩钮钯钱钳钵钻钽铁铃铅铎铜铠铬铭铲银铸铺链销锁锄锅锈" - + "锋锐错锡锢锤锥锦锭键锯锻镇镖镜镬镰镶长間闇门闩闪闭问闯闲间" - + "闷闸闹闻阀阁阅队阱防阳阴阵阶阻阿陀附际陆陋降限院除陨险陪陲" - + "陵陶陷隆随隐隔隘障隧隶隼难雀雄雅集雇雏雕雨雪雯雳零雷雹雾需" - + "霆震霉霍霓霖霜霞霰露霸霹青靖静非靠靡面革靴靶鞍鞑鞭韧音韵韶" - + "页顶项顺须顽顾顿颂预颅领颈颊题颚颜额颠颤风飒飓飘飙飞食餍餐" - + "餮饕饥饭饮饰饱饵饶饿馆馈馐馑首香馨马驭驮驯驰驱驳驹驻驼驽驾" - + "驿骁骂骄骆骇验骏骐骑骗骚骤骨骰骷骸骼髅髓高鬃鬓鬣鬼魁魂魄魅" - + "魇魈魏魔鰴鱼鲁鲜鲤鲨鲮鲸鲽鳃鳄鳍鳐鳗鳝鳞鸟鸠鸡鸢鸣鸦鸽鹅鹉" - + "鹊鹏鹗鹞鹤鹦鹫鹭鹰鹿麋麒麟麦麻黄黎黏黑默黛黜點黠黯鼎鼓鼠鼬" - + "齿龇龙龟"; + chars += "●、。「」『』一丁七万三上下不与丑专且世丘业丛东丝两严丧个中" + + "丰临丸丹为主丽举乃久么义之乌乍乐乔乖乘乙九也乡书乱乳乾了予争" + + "事二于云互五井亘亚些亡交亥亦产享京亮亲亵人亿什仁仅仆仇今介仍" + + "从仑仓仕他仗付仙代令以仪们仰仲件价任份仿伊伍伏伐休众优伙会伟" + + "传伤伦伪伯伴伶伺似伽但位低住佐佑体何余佚佛作你佣佩佳使例侍侏" + + "供依侠侣侦侧侬侮侯侵便促俄俊俐俑俘保信修俯俸個倍倒候借倡倦倨" + + "倪债值倾假偏做停偶偷偿傀傍储催傲像僧僭僵僻儒儡儿兀允元充兆先" + + "光克免兔兕党入全八公六兰共关兴兵其具典兹养兼兽内册再冒冕写军" + + "农冠冢冥冬冰冲决况冶冷冻净准凋凌减凑凛凝几凡凤凭凯凰凶出击凿" + + "刀刃分切刈刍刑划列则刚创初删判利别刮到制刷刹刺刻刽剂剃削剌前" + + "剎剑剖剜剥剧剩剪副割剽劈力劝办功加务劣动助努劫励劲劳势勃勇勉" + + "勋勒勘募勤勾包匍匐匕化北匙匠匪匹区医匿十千升午半华协卑卒卓单" + + "卖南博卜占卡卢卦卫印危即却卵卷卸厂厄厅历厉压厚原厢厥厦厨去参" + + "叉及友双反发叔取受变叙叛叠口古句另叨只叫召叮可台史右叶号司叹" + + "吁吃各合吉吊同名后吏吐向吓吕吗君吞吟否含听吮启吱吸吹吻吼呆告" + + "呕员周味呼命咆和咏咒咕咬咯咳咽哀品哈响哑哗哥哨哩哪哭哮哲哺唐" + + "唤售唯唱啃啄商啜啪啮啸喀喂善喉喊喋喘喙喜喝喧喷嗅嗔嗜嗡嗣嗫嘉" + + "嘎嘘嘲嘴嘶噜噤器噬嚎嚼囊囚四回因团囤园困围固国图圆圈團土圣在" + + "地场圾均坊坍坎坏坐坑块坚坛坝坞坟坠坤坦坪坷垂垃型垒垛垠垢垣垦" + + "埃埋城域培基堂堆堕堡堤堪堰塌塑塔塘塞填境墓墙增墟墨壁壅壕壤士" + + "壬壮声壳壶处备复夏外多夜够大天太夫央失头夷夸夹夺奇奈奉奋奎契" + + "奔奖套奢奥女奴她好如妃妄妆妇妈妖妙妥妪妮妲妹姆姊始姓姜姥姬姿" + + "威娃娅娜婆婉婪婶媒嫁嫩嬉子孑孔孕字存孚孢季孤学孪孳孵孽宁它宅" + + "宇守安完宏宗官宙定宜宝实宠审客宣室宪宫宰害宴家容宾宿寂寄密寇" + + "富寒寓寝察寡寨寰寸对寺寻导封射将尉尊小少尔尖尘尚尝尤尬就尸尹" + + "尺尼尽尾局层居屈屋屏屑展属屠履屯山屹岁岑岔岖岗岚岛岩岱岳岸峡" + + "峭峰峻崇崎崔崖崩崽嵌巅巍川巡巢工左巧巨巫差己已巳巴巷币市布帅" + + "帆师希帕帖帘帜帝带席帮帷常帽幅幔幕干平年并幸幻幼幽广庄庆庇床" + + "序库应底店庙府庞废度座庭庶廉廊延建开异弃弄弊式弑弓引弗弘弟张" + + "弥弦弧弩弯弱張弹强归当录彗形彩彰影役彻彼往征径待很徊律後徒徕" + + "得徘徙從御復循微徵德徽心必忆忌忍忒志忘忠忧快忱念忽忾忿怀态怒" + + "怖思急性怨怪怯总恍恐恒恕恢恣恨恩恫息恰恳恶恸恼悉悍悔悖悟患悦" + + "您悬悯悲悼情惊惑惘惚惠惧惨惩惫惰想惹愁愈愎意愚感愣愤愧愿慈慌" + + "慎慑慕慢慧慨慰慷憎憩懦戈戏成我戒戕或战戟截戮戳戴户戾房所扁扇" + + "扈手才扎扑扒打托扣执扩扫扬扭扮扯扰找承技抄抉把抑抓投抖抗折抚" + + "抛抢护报披抱抵抹押抽拂拆拉拍拒拓拔拖拘招拜拟拣拥拦拧拨择括拯" + + "拱拳拷拼拽拾拿持挂指按挑挖挚挟挠挡挣挥挪挫振挺挽捆捉捍捕捞损" + + "换捣捧据捷捻掀授掉掌掐排掘掠探接控推掩措掮掳掷揍描提插握揭援" + + "揽搁搅搏搐搜搞搬搭携摄摆摇摘摧摩摸摹撒撕撞撤撬播撵撼擅操擎擒" + + "擞擦攀攫支收改攻放政故效敌敏救敕教敞敢散敦敬数敲整文斐斑斓斗" + + "斤斥斧斩断斯新方施旁旅旋族旗无既日旧旨早旭时旷旸旺昂昆昌明昏" + + "易昔昙星映春昨昭是昵昼显晃晋晓晕晖晚晨普景晰晴晶晷智暂暗暮暴" + + "曙曜曝曦曲曳更曼曾替最月有服朗望朝期木未末本札术朵机朽杀杂权" + + "杉李村杖杜束条来杨杯杰松板极构析林枚果枝枢枪枭枯架枷柄柏某染" + + "柜查柩柯柱柳栅标栈栋栏树栓栖栗株样核根格栽桂框案桌桎桑桓桠档" + + "桥桨桩桶梁梅梓梢梣梦梧梨梭梯械检棄棍棒棕棘棚森棱棺椁植椎椒椽" + + "楂楔楚楣楼概榄榆榔榨榴槌槛模横樱樵橇橡橫檀檐次欢欣欧欲欺歇歌" + + "止正此步武歪死歼殁殆殇殉殊残殍殒殓殖殡殴段殷殿毁毅母每毒比毕" + + "毛毡氅氏民氓气氤氦氧氲水永汀汁求汇汉汐汗汛池污汤汨汪汰汲汹汽" + + "沃沈沉沌沐沙沟没沥沦沮河沸油治沼沾沿泄泉泊法泛泞泡波泣泥注泪" + + "泯泰泽洁洋洒洗洛洞津洪洲活洼派流浅浆浇浊测济浑浓浚浩浪浮浴海" + + "浸涅消涉涌涎涛涟涡涤润涨涩液涵淋淘淤淬深混淹添清渊渎渐渔渗渝" + + "渠渡渣渥温港渲渴游湍湖湛湮湾湿溃溅源溜溢溪溯溶溺滋滑滓滔滚滞" + + "满滤滥滨滴漂漏演漠漩漫潘潜潭潮澄澈澹激濑濒瀑瀚灌火灭灯灰灵灼" + + "灾灿炉炎炙炫炬炭炮炸点炼炽烁烂烈烙烛烟烤烦烧烫烬热烽焉焊焚焦" + + "焰然煌煎煞煤照煮煽熄熊熏熔熟熠熵燃燎燕燧爆爪爬爱爵父片版牌牒" + + "牙牛牝牡牢牦牧物牲牵特牺犀犁犄犧犬犯状狂狄狈狐狗狙狞狡狩独狭" + + "狮狰狱狷狸狼猁猎猛猜猪猫献猴猿獒獠獾玄率玉王玖玛玩玫环现玷玻" + + "珀珂珊珍珠班球理琉琐琥琳琴琵琼瑕瑙瑚瑞瑟瑰璃璞璧瓜瓣瓦瓮瓯瓶" + + "瓷甘生用甩甫田由甲电画畅界畏留略畸畿疆疏疑疗疚疡疣疤疫疮疯疲" + + "疵疹疽疾病症痕痛痞痢痨痪痴痹瘟瘠瘤瘫瘴癣癫癸登白百的皆皇皈皮" + + "皱皿盆盈盐监盒盔盖盗盘盛盟目盲直相盾省看真眠眨眩眷眺眼着睁睡" + + "督睥睨睿瞄瞒瞥瞪瞬瞭瞰瞳矛矢知矫短矮石矾矿码砂砍研砖砦砧破砸" + + "砾础硕硫硬确碍碎碑碟碧碰碳碻碾磁磊磨磷磺礁示礼社祀祈祖祝神祟" + + "祠祥票祭祷祸禁禄福离禽私秃秉秋种科秘秣秤秩积称移秽稀程税稚稳" + + "稻穆穗穴究穷穹空穿突窃窍窒窖窗窘窜窝窟窥立竖站竞章童竭端竹笏" + + "笑笔笛笞符第笼等筑筒答策筛筝筹签简箔算箝管箭箱篓篮篱篷簇簧簪" + + "米类粉粒粗粮粹精糊糙糟系素索紧紫累繁纂纠红约级纪纬纯纱纳纵纷" + + "纸纹纺纽线练组绅细织终绊绍经绒结绕绘给绚络绝绞统绥继绩绪续绮" + + "绯绳维绵综绽绿缀缄缅缆缇缉缎缓缕编缘缚缝缠缩缪缰缸缺罅网罔罗" + + "罚罡罩罪置羁羊美羚羞群羽翁翅翎翔翠翡翰翱翻翼耀老考者而耍耐耕" + + "耗耘耙耳耶职联聚聪肃肆肇肉肌肖肝肠肢肤肥肩肯育肴肺肿胀胁胃胆" + + "背胎胖胜胞胡胧胫胶胸能脂脆脉脊脏脑脓脚脱脸腐腔腕腥腱腹腾腿膂" + + "膏膛膜膝臂臃臣自臭至致舌舍舒舞舟航般舰舱船艇良艰色艺艾节芒芙" + + "芜芥芬芭芮花芳芽苇苍苏苔苗苛苜苟若苦英茁茂范茉茎茜茧茨茫茸荆" + + "草荒荚荡荣荨荫药荷莉莎莓莫莱莲莳获莽菁菇菊菌菜菲萃萌萍萎萝营" + + "萦萧萨萼落著葛葬葵蒂蒙蒸蓄蓑蓝蓟蓿蔑蔓蔚蔷蔻蔽蕈蕊蕨蕴蕾薄薇" + + "薙薪藏藐藓藤藻虎虏虐虑虔虚虫虱虹蚀蚁蚊蚋蚣蚺蛆蛇蛊蛋蛎蛙蛛蛞" + + "蛭蛮蛰蛸蛾蜂蜈蜉蜒蜕蜗蜘蜜蜡蜥蜴蜷蜿蝇蝎蝓蝗蝙蝠蝣蝾螂螅融螫" + + "螳螺蟀蟋蟑蟒蟹蠕蠢血行衍街衡衣补表衫衰袂袋袍袖被袭裁裂装裔裘" + + "褐褛褪褫褴褶襄西要覆见观规觅视览觉觊角解触言詹誉誓警计认讧讨" + + "让训议讯记讲许论讽设访诀证评诅识诈诉词试诗诘诚诛话诞诡该详诫" + + "语误诱诲说诵请诸诺读调谆谈谊谋谍谐谕谗谜谟谢谣谦谧谨谬谭谱谴" + + "谵谷豁象豪豹豺貂貌贝贞负贡财责贤败货质贩贪贫贬购贮贯贱贴贵贷" + + "贸费贺贼贾贿赂赃资赋赌赎赏赐赖赘赛赞赠赢赤赦赫走赶起超越趋足" + + "跃跑跖跚跛距跟跨路跳践跺踏踝踢踩踪踵踽蹂蹄蹊蹋蹒蹦蹬躁躏身躯" + + "躲車车轨轩转轭轮软轰轴轻载较辉辑输辖辗辙辛辜辞辟辨辩辫辰辱边" + + "达迁迂迅过迈迎运近返还这进远违连迟迦迩迪迫迭述迳迷迸迹追退送" + + "适逃逆选逊透逐递途通逝逞速造逢逮逸逻逼遁遇遍遏道遗遣遥遨遭遮" + + "避邀還那邦邪邬邸郊郎部都鄙酋配酒酬酷酸酿醉醒采釉释里重野量金" + + "鉴针钉钓钗钙钜钝钟钢钥钦钨钩钮钯钱钳钵钻钽铁铃铅铎铜铠铬铭铲" + + "银铸铺链销锁锄锅锈锋锐错锡锢锤锥锦锭键锯锻镇镖镜镬镰镶长間闇" + + "门闩闪闭问闯闲间闷闸闹闻阀阁阅队阱防阳阴阵阶阻阿陀附际陆陋降" + + "限院除陨险陪陲陵陶陷隆随隐隔隘障隧隶隼难雀雄雅集雇雏雕雨雪雯" + + "雳零雷雹雾需霆震霉霍霓霖霜霞霰露霸霹青靖静非靠靡面革靴靶鞍鞑" + + "鞭韧音韵韶页顶项顺须顽顾顿颂预颅领颈颊题颚颜额颠颤风飒飓飘飙" + + "飞食餍餐餮饕饥饭饮饰饱饵饶饿馆馈馐馑首香馨马驭驮驯驰驱驳驹驻" + + "驼驽驾驿骁骂骄骆骇验骏骐骑骗骚骤骨骰骷骸骼髅髓高鬃鬓鬣鬼魁魂" + + "魄魅魇魈魏魔鰴鱼鲁鲜鲤鲨鲮鲸鲽鳃鳄鳍鳐鳗鳝鳞鸟鸠鸡鸢鸣鸦鸽鹅" + + "鹉鹊鹏鹗鹞鹤鹦鹫鹭鹰鹿麋麒麟麦麻黄黎黏黑默黛黜點黠黯鼎鼓鼠鼬" + + "鼹鼻齐齑齿龇龙龟!(),/:;?~"; final PixmapPacker packer = new PixmapPacker(pageSize, pageSize, Pixmap.Format.RGBA8888, 2, false); final FreeTypeFontParameter parameter = new FreeTypeFontParameter(); From ad067b7444f87e75b976c1cf1e94b8c856f8af27 Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Mon, 16 Sep 2019 23:07:53 -0600 Subject: [PATCH 02/30] push `toStringMap` down into `Trigger` eliminating the need for the conversion. Also add helper method `setTriggeringObjectsFrom` and change `getRunParams` into similar but not identical `getFromRunParams` --- .../forge/game/spellability/SpellAbility.java | 9 +++++++++ .../src/main/java/forge/game/trigger/Trigger.java | 10 +++++----- .../java/forge/game/trigger/TriggerAbandoned.java | 2 +- .../java/forge/game/trigger/TriggerAttached.java | 3 +-- .../trigger/TriggerAttackerBlockedByCreature.java | 3 +-- .../game/trigger/TriggerAttackerUnblocked.java | 4 +--- .../trigger/TriggerAttackerUnblockedOnce.java | 3 +-- .../game/trigger/TriggerAttackersDeclared.java | 3 +-- .../java/forge/game/trigger/TriggerAttacks.java | 11 +++++++---- .../game/trigger/TriggerBlockersDeclared.java | 3 +-- .../java/forge/game/trigger/TriggerBlocks.java | 3 +-- .../forge/game/trigger/TriggerChampioned.java | 3 +-- .../game/trigger/TriggerCounterRemovedOnce.java | 3 +-- .../java/forge/game/trigger/TriggerCountered.java | 11 +++++++---- .../java/forge/game/trigger/TriggerCrewed.java | 3 +-- .../game/trigger/TriggerDamageDealtOnce.java | 4 +--- .../java/forge/game/trigger/TriggerHandler.java | 15 +++++++-------- .../forge/game/trigger/TriggerTapsForMana.java | 4 +--- 18 files changed, 48 insertions(+), 49 deletions(-) diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index fb7c64c7d80..58d74c8d84b 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -565,6 +565,15 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public void setTriggeringObject(final AbilityKey type, final Object o) { triggeringObjects.put(type, o); } + public void setTriggeringObjectsFrom(final Trigger trigger, final AbilityKey... types) { + int typesLength = types.length; + for (int i = 0; i < typesLength; i += 1) { + AbilityKey type = types[i]; + triggeringObjects.put(type, trigger.getFromRunParams(type)); + } + } + + public boolean hasTriggeringObject(final AbilityKey type) { return triggeringObjects.containsKey(type); } diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index 18b0e3c6f50..7d1c0b5fe36 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -66,7 +66,7 @@ public abstract class Trigger extends TriggerReplacementBase { /** The run params. */ - private Map runParams; + private Map runParams; private TriggerType mode; @@ -122,7 +122,7 @@ public abstract class Trigger extends TriggerReplacementBase { this.id = nextId(); this.intrinsic = intrinsic; - this.setRunParams(new HashMap<>()); // TODO: Consider whether this can be null instead, for performance reasons. + this.setRunParams(AbilityKey.newMap()); // TODO: Consider whether this can be null instead, for performance reasons. this.originalMapParams.putAll(params); this.mapParams.putAll(params); this.setHostCard(host); @@ -460,8 +460,8 @@ public abstract class Trigger extends TriggerReplacementBase { * * @return the runParams */ - public Map getRunParams() { - return this.runParams; + public Object getFromRunParams(AbilityKey key) { + return this.runParams.get(key); } /** @@ -470,7 +470,7 @@ public abstract class Trigger extends TriggerReplacementBase { * @param runParams0 * the runParams to set */ - public void setRunParams(final Map runParams0) { + public void setRunParams(final Map runParams0) { this.runParams = runParams0; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java index dcb65899236..42e0e0af649 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java @@ -63,7 +63,7 @@ public class TriggerAbandoned extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Scheme, this.getRunParams().get("Scheme")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Scheme); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java index 96fdfd28ae6..82f6c081ae7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java @@ -73,8 +73,7 @@ public class TriggerAttached extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Source, this.getRunParams().get("AttachSource")); - sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("AttachTarget")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Source, AbilityKey.Target); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java index 7ddb60acdef..f4b01752327 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java @@ -88,8 +88,7 @@ public class TriggerAttackerBlockedByCreature extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Attacker, this.getRunParams().get("Attacker")); - sa.setTriggeringObject(AbilityKey.Blocker, this.getRunParams().get("Blocker")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Attacker, AbilityKey.Blocker); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java index a8e9d41209a..decaca22f1d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java @@ -70,9 +70,7 @@ public class TriggerAttackerUnblocked extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Attacker, this.getRunParams().get("Attacker")); - sa.setTriggeringObject(AbilityKey.Defender, this.getRunParams().get("Defender")); - sa.setTriggeringObject(AbilityKey.DefendingPlayer, this.getRunParams().get("DefendingPlayer")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Attacker, AbilityKey.Defender, AbilityKey.DefendingPlayer); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java index 23567718e5c..11220460602 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java @@ -85,8 +85,7 @@ public class TriggerAttackerUnblockedOnce extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.AttackingPlayer, this.getRunParams().get("AttackingPlayer")); - sa.setTriggeringObject(AbilityKey.Defenders, this.getRunParams().get("Defenders")); + sa.setTriggeringObjectsFrom(this, AbilityKey.AttackingPlayer, AbilityKey.Defenders); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java index f9be4cacdd6..f26bcaa7293 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java @@ -87,8 +87,7 @@ public class TriggerAttackersDeclared extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Attackers, this.getRunParams().get("Attackers")); - sa.setTriggeringObject(AbilityKey.AttackingPlayer, this.getRunParams().get("AttackingPlayer")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Attackers, AbilityKey.AttackingPlayer); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java index cc35af51e0c..551ff2826bb 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java @@ -125,10 +125,13 @@ public class TriggerAttacks extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Attacker, this.getRunParams().get("Attacker")); - sa.setTriggeringObject(AbilityKey.Defender, this.getRunParams().get("Attacked")); - sa.setTriggeringObject(AbilityKey.Defenders, this.getRunParams().get("Defenders")); - sa.setTriggeringObject(AbilityKey.DefendingPlayer, this.getRunParams().get("DefendingPlayer")); + sa.setTriggeringObjectsFrom( + this, + AbilityKey.Attacker, + AbilityKey.Defender, + AbilityKey.Defenders, + AbilityKey.DefendingPlayer + ); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBlockersDeclared.java b/forge-game/src/main/java/forge/game/trigger/TriggerBlockersDeclared.java index c7ec35ae012..57a0947072e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBlockersDeclared.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBlockersDeclared.java @@ -52,8 +52,7 @@ public class TriggerBlockersDeclared extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Blockers, this.getRunParams().get("Blockers")); - sa.setTriggeringObject(AbilityKey.Attackers, this.getRunParams().get("Attackers")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Blockers, AbilityKey.Attackers); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java index 6388a1ed6a2..7f537edea16 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java @@ -89,8 +89,7 @@ public class TriggerBlocks extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Blocker, this.getRunParams().get("Blocker")); - sa.setTriggeringObject(AbilityKey.Attackers, this.getRunParams().get("Attackers")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Blocker, AbilityKey.Attackers); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java index d95e92662ad..e0b27efee0f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java @@ -72,8 +72,7 @@ public class TriggerChampioned extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Championed, this.getRunParams().get("Championed")); - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Championed, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java index a96eb1df4c9..591e6df967e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java @@ -74,8 +74,7 @@ public class TriggerCounterRemovedOnce extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Amount, this.getRunParams().get("CounterAmount")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Amount); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java b/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java index ae5087b29e2..0afa88d020c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java @@ -93,10 +93,13 @@ public class TriggerCountered extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Cause, this.getRunParams().get("Cause")); - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); - sa.setTriggeringObject(AbilityKey.CounteredSA, this.getRunParams().get("CounteredSA")); + sa.setTriggeringObjectsFrom( + this, + AbilityKey.Card, + AbilityKey.Cause, + AbilityKey.Player, + AbilityKey.CounteredSA + ); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java b/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java index 655fa1d591a..624b97e1d24 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java @@ -39,8 +39,7 @@ public class TriggerCrewed extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Vehicle, this.getRunParams().get("Vehicle")); - sa.setTriggeringObject(AbilityKey.Crew, this.getRunParams().get("Crew")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Vehicle, AbilityKey.Crew); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java index 7a8dee7acec..20e744c5755 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java @@ -106,9 +106,7 @@ public class TriggerDamageDealtOnce extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Source, this.getRunParams().get("DamageSource")); - sa.setTriggeringObject(AbilityKey.Targets, this.getRunParams().get("DamageTargets")); - sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Source, AbilityKey.Targets, AbilityKey.DamageAmount); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 87d51dc130d..8db3e275531 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -338,7 +338,7 @@ public class TriggerHandler { private void runStateTrigger(final Map runParams) { for (final Trigger t: activeTriggers) { if (canRunTrigger(t, TriggerType.Always, runParams)) { - runSingleTrigger(t, toStringMap(runParams)); + runSingleTrigger(t, runParams); } } } @@ -376,7 +376,7 @@ public class TriggerHandler { // Static triggers for (final Trigger t : Lists.newArrayList(activeTriggers)) { if (t.isStatic() && canRunTrigger(t, mode, runParams)) { - runSingleTrigger(t, toStringMap(runParams)); + runSingleTrigger(t, runParams); checkStatics = true; } @@ -420,7 +420,6 @@ public class TriggerHandler { final TriggerType mode = wt.getMode(); final Map runParams = wt.getParams(); - final Map stringRunParams = toStringMap(runParams); final List triggers = wt.getTriggers() != null ? wt.getTriggers() : activeTriggers; Card card = null; @@ -450,7 +449,7 @@ public class TriggerHandler { int x = 1 + handlePanharmonicon(t, runParams, player); for (int i = 0; i < x; ++i) { - runSingleTrigger(t, stringRunParams); + runSingleTrigger(t, runParams); } checkStatics = true; } @@ -459,7 +458,7 @@ public class TriggerHandler { for (final Trigger deltrig : delayedTriggersWorkingCopy) { if (deltrig.getHostCard().getController().equals(player)) { if (isTriggerActive(deltrig) && canRunTrigger(deltrig, mode, runParams)) { - runSingleTrigger(deltrig, stringRunParams); + runSingleTrigger(deltrig, runParams); delayedTriggers.remove(deltrig); } } @@ -547,14 +546,14 @@ public class TriggerHandler { // Checks if the conditions are right for a single trigger to go off, and // runs it if so. // Return true if the trigger went off, false otherwise. - private void runSingleTrigger(final Trigger regtrig, final Map runParams) { + private void runSingleTrigger(final Trigger regtrig, final Map runParams) { final Map triggerParams = regtrig.getMapParams(); regtrig.setRunParams(runParams); // All tests passed, execute ability. if (regtrig instanceof TriggerTapsForMana) { - final SpellAbility abMana = (SpellAbility) runParams.get("AbilityMana"); + final SpellAbility abMana = (SpellAbility) runParams.get(AbilityKey.AbilityMana); if (null != abMana && null != abMana.getManaPart()) { abMana.setUndoable(false); } @@ -562,7 +561,7 @@ public class TriggerHandler { SpellAbility sa = null; Card host = regtrig.getHostCard(); - final Card trigCard = regtrig.getRunParams().containsKey("Card") ? (Card)regtrig.getRunParams().get("Card") : null; + final Card trigCard = (Card) regtrig.getFromRunParams(AbilityKey.Card); if (trigCard != null && (host.getId() == trigCard.getId())) { host = trigCard; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java index 5474f5fc6b8..4763c543f04 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -105,9 +105,7 @@ public class TriggerTapsForMana extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); - sa.setTriggeringObject(AbilityKey.Produced, this.getRunParams().get("Produced")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player, AbilityKey.Produced); } @Override From 350756435fc2272ed47f99ecda0cbeeba62e609c Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Mon, 16 Sep 2019 23:16:24 -0600 Subject: [PATCH 03/30] add incorrectly not staged changes --- .../java/forge/game/trigger/TriggerAdapt.java | 2 +- .../game/trigger/TriggerAttackerBlocked.java | 13 ++++++++----- .../forge/game/trigger/TriggerBecomeMonarch.java | 2 +- .../game/trigger/TriggerBecomeMonstrous.java | 3 +-- .../forge/game/trigger/TriggerBecomeRenowned.java | 2 +- .../forge/game/trigger/TriggerBecomesTarget.java | 5 ++--- .../game/trigger/TriggerBecomesTargetOnce.java | 5 ++--- .../game/trigger/TriggerChangesController.java | 2 +- .../forge/game/trigger/TriggerChangesZone.java | 2 +- .../forge/game/trigger/TriggerChangesZoneAll.java | 2 +- .../forge/game/trigger/TriggerCounterAdded.java | 5 +---- .../game/trigger/TriggerCounterAddedAll.java | 2 +- .../game/trigger/TriggerCounterAddedOnce.java | 7 ++----- .../forge/game/trigger/TriggerCounterRemoved.java | 2 +- .../java/forge/game/trigger/TriggerCycled.java | 2 +- .../forge/game/trigger/TriggerDamageDone.java | 13 ++++++++----- .../forge/game/trigger/TriggerDamageDoneOnce.java | 12 +++--------- .../game/trigger/TriggerDamagePrevented.java | 6 +++--- .../game/trigger/TriggerDamagePreventedOnce.java | 4 ++-- .../java/forge/game/trigger/TriggerDestroyed.java | 3 +-- .../java/forge/game/trigger/TriggerDevoured.java | 2 +- .../java/forge/game/trigger/TriggerDiscarded.java | 3 +-- .../java/forge/game/trigger/TriggerDrawn.java | 3 +-- .../java/forge/game/trigger/TriggerEvolved.java | 2 +- .../java/forge/game/trigger/TriggerExerted.java | 3 +-- .../java/forge/game/trigger/TriggerExiled.java | 2 +- .../java/forge/game/trigger/TriggerExploited.java | 3 +-- .../java/forge/game/trigger/TriggerExplores.java | 2 +- .../java/forge/game/trigger/TriggerFight.java | 2 +- .../forge/game/trigger/TriggerFlippedCoin.java | 2 +- .../forge/game/trigger/TriggerInvestigated.java | 2 +- .../forge/game/trigger/TriggerLandPlayed.java | 2 +- .../forge/game/trigger/TriggerLifeGained.java | 3 +-- .../java/forge/game/trigger/TriggerLifeLost.java | 3 +-- .../java/forge/game/trigger/TriggerLosesGame.java | 2 +- .../game/trigger/TriggerPayCumulativeUpkeep.java | 3 +-- .../java/forge/game/trigger/TriggerPayEcho.java | 2 +- .../java/forge/game/trigger/TriggerPayLife.java | 3 +-- .../java/forge/game/trigger/TriggerPhase.java | 2 +- .../java/forge/game/trigger/TriggerPhaseIn.java | 2 +- .../java/forge/game/trigger/TriggerPhaseOut.java | 2 +- .../forge/game/trigger/TriggerPlanarDice.java | 2 +- .../game/trigger/TriggerPlaneswalkedFrom.java | 2 +- .../forge/game/trigger/TriggerPlaneswalkedTo.java | 2 +- .../forge/game/trigger/TriggerRegenerated.java | 3 +-- .../java/forge/game/trigger/TriggerRevealed.java | 2 +- .../forge/game/trigger/TriggerSacrificed.java | 2 +- .../main/java/forge/game/trigger/TriggerScry.java | 2 +- .../game/trigger/TriggerSearchedLibrary.java | 2 +- .../forge/game/trigger/TriggerSetInMotion.java | 2 +- .../java/forge/game/trigger/TriggerShuffled.java | 2 +- .../game/trigger/TriggerSpellAbilityCast.java | 15 +++++++++------ .../game/trigger/TriggerSpellAbilityCopy.java | 2 +- .../java/forge/game/trigger/TriggerSurveil.java | 2 +- .../main/java/forge/game/trigger/TriggerTaps.java | 2 +- .../forge/game/trigger/TriggerTransformed.java | 2 +- .../java/forge/game/trigger/TriggerTurnBegin.java | 2 +- .../forge/game/trigger/TriggerTurnFaceUp.java | 2 +- .../java/forge/game/trigger/TriggerUnattach.java | 3 +-- .../java/forge/game/trigger/TriggerUntaps.java | 2 +- .../main/java/forge/game/trigger/TriggerVote.java | 9 +++++++-- 61 files changed, 97 insertions(+), 109 deletions(-) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java index ab2f92ccba2..a5345b69a63 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java @@ -64,7 +64,7 @@ public class TriggerAdapt extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java index 20fef05e093..2e09e604ca9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java @@ -85,11 +85,14 @@ public class TriggerAttackerBlocked extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Attacker, getRunParams().get("Attacker")); - sa.setTriggeringObject(AbilityKey.Blockers, getRunParams().get("Blockers")); - sa.setTriggeringObject(AbilityKey.Defender, getRunParams().get("Defender")); - sa.setTriggeringObject(AbilityKey.DefendingPlayer, getRunParams().get("DefendingPlayer")); - sa.setTriggeringObject(AbilityKey.NumBlockers, getRunParams().get("NumBlockers")); + sa.setTriggeringObjectsFrom( + this, + AbilityKey.Attacker, + AbilityKey.Blockers, + AbilityKey.Defender, + AbilityKey.DefendingPlayer, + AbilityKey.NumBlockers + ); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java index d52c072f825..c53165cce66 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java @@ -36,7 +36,7 @@ public class TriggerBecomeMonarch extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java index 1e6643e767f..1dba122cb98 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java @@ -65,8 +65,7 @@ public class TriggerBecomeMonstrous extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.MonstrosityAmount, getRunParams().get("MonstrosityAmount")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.MonstrosityAmount); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java index d6086fc7133..23117108cc7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java @@ -63,7 +63,7 @@ public class TriggerBecomeRenowned extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java index 4e87946af5f..d27f3903b9d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java @@ -89,9 +89,8 @@ public class TriggerBecomesTarget extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.SourceSA, this.getRunParams().get("SourceSA")); - sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) this.getRunParams().get("SourceSA")).getHostCard()); - sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("Target")); + sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) getFromRunParams(AbilityKey.SourceSA)).getHostCard()); + sa.setTriggeringObjectsFrom(this, AbilityKey.SourceSA, AbilityKey.Target); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java index 368a1bc2281..eba4a98f119 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java @@ -81,9 +81,8 @@ public class TriggerBecomesTargetOnce extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.SourceSA, this.getRunParams().get("SourceSA")); - sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) this.getRunParams().get("SourceSA")).getHostCard()); - sa.setTriggeringObject(AbilityKey.Targets, this.getRunParams().get("Targets")); + sa.setTriggeringObjectsFrom(this, AbilityKey.SourceSA, AbilityKey.Targets); + sa.setTriggeringObject(AbilityKey.Source, ((SpellAbility) getFromRunParams(AbilityKey.SourceSA)).getHostCard()); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java index 0648a26418d..9c47284385e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java @@ -71,7 +71,7 @@ public class TriggerChangesController extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java index 1cd778b509b..a2574e1c897 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java @@ -218,7 +218,7 @@ public class TriggerChangesZone extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java index f2a36fa0f45..6c0b3b7c259 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java @@ -23,7 +23,7 @@ public class TriggerChangesZoneAll extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - final CardZoneTable table = (CardZoneTable) getRunParams().get("Cards"); + final CardZoneTable table = (CardZoneTable) getFromRunParams(AbilityKey.Cards); CardCollection allCards = this.filterCards(table); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java index 7b87470996a..f6b282ee52a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java @@ -121,10 +121,7 @@ public class TriggerCounterAdded extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - if (this.getRunParams().containsKey("Card")) - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - if (this.getRunParams().containsKey("Player")) - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java index 859fd6b8787..02c97d93d8b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java @@ -25,7 +25,7 @@ public class TriggerCounterAddedAll extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - final GameEntityCounterTable table = (GameEntityCounterTable) getRunParams().get("Objects"); + final GameEntityCounterTable table = (GameEntityCounterTable) getFromRunParams(AbilityKey.Objects); Map all = this.filterTable(table); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java index 4baeaff29c5..29cc7db445d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java @@ -106,11 +106,8 @@ public class TriggerCounterAddedOnce extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - if (this.getRunParams().containsKey("Card")) - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - if (this.getRunParams().containsKey("Player")) - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); - sa.setTriggeringObject(AbilityKey.Amount, this.getRunParams().get("CounterAmount")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player); + sa.setTriggeringObject(AbilityKey.Amount, getFromRunParams(AbilityKey.CounterAmount)); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java index 1f344bfad12..dc3327f1509 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java @@ -83,7 +83,7 @@ public class TriggerCounterRemoved extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java b/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java index 82359ed0c66..2df0732a3a5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java @@ -50,7 +50,7 @@ public class TriggerCycled extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java index 1c9751d0321..65651dd674e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java @@ -119,11 +119,14 @@ public class TriggerDamageDone extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)this.getRunParams().get("DamageSource"))); - sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget")); - sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); - // This parameter is here because LKI information related to combat doesn't work properly - sa.setTriggeringObject(AbilityKey.DefendingPlayer, this.getRunParams().get("DefendingPlayer")); + sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)getFromRunParams(AbilityKey.DamageSource))); + sa.setTriggeringObject(AbilityKey.Target, getFromRunParams(AbilityKey.DamageTarget)); + sa.setTriggeringObjectsFrom( + this, + AbilityKey.DamageAmount, + // This parameter is here because LKI information related to combat doesn't work properly + AbilityKey.DefendingPlayer + ); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java index f80a9c9e3c6..20078a32bbf 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java @@ -58,15 +58,9 @@ public class TriggerDamageDoneOnce extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - if (this.getRunParams().containsKey("DamageTarget")) { - sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget")); - } - if (this.getRunParams().containsKey("DamageSources")) { - sa.setTriggeringObject(AbilityKey.Sources, this.getRunParams().get("DamageSources")); - } - sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); - - + sa.setTriggeringObject(AbilityKey.Target, getFromRunParams(AbilityKey.DamageTarget)); + sa.setTriggeringObject(AbilityKey.Sources, getFromRunParams(AbilityKey.DamageSources)); + sa.setTriggeringObjectsFrom(this, AbilityKey.DamageAmount); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java index 5807e02e70a..8736ba600ee 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java @@ -103,9 +103,9 @@ public class TriggerDamagePrevented extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)this.getRunParams().get("DamageSource"))); - sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget")); - sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); + sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)getFromRunParams(AbilityKey.DamageSource))); + sa.setTriggeringObject(AbilityKey.Target, getFromRunParams(AbilityKey.DamageTarget)); + sa.setTriggeringObjectsFrom(this, AbilityKey.DamageAmount); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java index b2cbf8ce369..9f6839167e7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java @@ -94,8 +94,8 @@ public class TriggerDamagePreventedOnce extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Target, this.getRunParams().get("DamageTarget")); - sa.setTriggeringObject(AbilityKey.DamageAmount, this.getRunParams().get("DamageAmount")); + sa.setTriggeringObject(AbilityKey.Target, getFromRunParams(AbilityKey.DamageTarget)); + sa.setTriggeringObjectsFrom(this, AbilityKey.DamageAmount); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java b/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java index 22a39539d54..a91c5f78802 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java @@ -68,8 +68,7 @@ public class TriggerDestroyed extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Causer, this.getRunParams().get("Causer")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Causer); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java index 9d2ab4a1d8e..6f87272938c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java @@ -61,7 +61,7 @@ public class TriggerDevoured extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Devoured, this.getRunParams().get("Devoured")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Devoured); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java b/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java index 5b046239a43..10acd4010df 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java @@ -86,8 +86,7 @@ public class TriggerDiscarded extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Cause, this.getRunParams().get("Cause")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Cause); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java index 30fae66a797..d8a88321e8f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java @@ -81,8 +81,7 @@ public class TriggerDrawn extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java index 615c5e94f10..80bce94215c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java @@ -62,7 +62,7 @@ public class TriggerEvolved extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java b/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java index b70e1fd4894..221bbcfd0a7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java @@ -33,8 +33,7 @@ public class TriggerExerted extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java index 0842e0732ae..bed1269155b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java @@ -97,7 +97,7 @@ public class TriggerExiled extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java index 49437a4b948..fbab5694a5e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java @@ -72,8 +72,7 @@ public class TriggerExploited extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Exploited, this.getRunParams().get("Exploited")); - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Exploited, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java index 54f1ff15f54..93b9b14cae7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java @@ -62,7 +62,7 @@ public class TriggerExplores extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Explorer, this.getRunParams().get("Card")); + sa.setTriggeringObject(AbilityKey.Explorer, getFromRunParams(AbilityKey.Card)); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java index aecf04ca0db..414e42e698a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java @@ -63,7 +63,7 @@ public class TriggerFight extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Fighter, this.getRunParams().get("Fighter")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Fighter); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java b/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java index 45dbc6a8346..22ebf4ffd9a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java @@ -70,7 +70,7 @@ public class TriggerFlippedCoin extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java b/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java index 4673c43daaf..46ef04bdf7c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java @@ -60,7 +60,7 @@ public class TriggerInvestigated extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } /** {@inheritDoc} */ diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java b/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java index 42facf2e807..9e06d86062a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java @@ -52,7 +52,7 @@ public class TriggerLandPlayed extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java index 9b13cc0d680..ab27b458c5c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java @@ -74,8 +74,7 @@ public class TriggerLifeGained extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.LifeAmount, getRunParams().get("LifeAmount")); - sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.LifeAmount, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java index a592a376217..bd747b33932 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java @@ -71,8 +71,7 @@ public class TriggerLifeLost extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.LifeAmount, this.getRunParams().get("LifeAmount")); - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.LifeAmount, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java index e55850fa631..1b1ad8f2389 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java @@ -39,7 +39,7 @@ public class TriggerLosesGame extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java index 51a74fa139e..c567c311cd6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java @@ -70,8 +70,7 @@ public class TriggerPayCumulativeUpkeep extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.PayingMana, this.getRunParams().get("PayingMana")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.PayingMana); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java index d6f94a2ea0f..9eb5571b930 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java @@ -70,7 +70,7 @@ public class TriggerPayEcho extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java index 9ff7bd8f4a8..89cf4d10920 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java @@ -61,8 +61,7 @@ public class TriggerPayLife extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.LifeAmount, getRunParams().get("LifeAmount")); - sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.LifeAmount, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java index 974d40259e7..19bf36a0dda 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java @@ -60,7 +60,7 @@ public class TriggerPhase extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java index d519d56959e..c250dbe097d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java @@ -28,7 +28,7 @@ public class TriggerPhaseIn extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java index 7adcb00cc8b..9583ff22d6f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java @@ -36,7 +36,7 @@ public class TriggerPhaseOut extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java index 4e1ccdf0a7e..e3b3ddd78ff 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java @@ -56,7 +56,7 @@ public class TriggerPlanarDice extends Trigger { */ @Override public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java index 9cee000a7fe..3d9b36d339e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java @@ -53,7 +53,7 @@ public class TriggerPlaneswalkedFrom extends Trigger { */ @Override public void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Cards, this.getRunParams().get("Cards")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Cards); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java index 5644c090053..efc3f2079dd 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java @@ -53,7 +53,7 @@ public class TriggerPlaneswalkedTo extends Trigger { */ @Override public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Cards, this.getRunParams().get("Cards")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Cards); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java b/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java index 8eea96379ef..b1358375fa9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java @@ -68,8 +68,7 @@ public class TriggerRegenerated extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); - sa.setTriggeringObject(AbilityKey.Cause, this.getRunParams().get("Cause")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card, AbilityKey.Cause); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java index b86e7b10439..096aff377a7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java @@ -32,7 +32,7 @@ public class TriggerRevealed extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java index aac417535ef..4c4a05f110a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java @@ -126,7 +126,7 @@ public class TriggerSacrificed extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java index bd0f3cadac5..5202cec9429 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java @@ -62,7 +62,7 @@ public class TriggerScry extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java index 05fd3e062dc..da568d1437a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java @@ -74,7 +74,7 @@ public class TriggerSearchedLibrary extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java index 1811c949573..92e1ccd981c 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java @@ -77,7 +77,7 @@ public class TriggerSetInMotion extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Scheme, this.getRunParams().get("Scheme")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Scheme); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java index ed801458055..4052524770e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java @@ -74,7 +74,7 @@ public class TriggerShuffled extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java index db43216f341..11085cc424e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java @@ -264,17 +264,20 @@ public class TriggerSpellAbilityCast extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - final SpellAbility castSA = (SpellAbility) getRunParams().get("CastSA"); + final SpellAbility castSA = (SpellAbility) getFromRunParams(AbilityKey.CastSA); final SpellAbilityStackInstance si = sa.getHostCard().getGame().getStack().getInstanceFromSpellAbility(castSA); sa.setTriggeringObject(AbilityKey.Card, castSA.getHostCard()); sa.setTriggeringObject(AbilityKey.SpellAbility, castSA); sa.setTriggeringObject(AbilityKey.StackInstance, si); sa.setTriggeringObject(AbilityKey.SpellAbilityTargetingCards, (si != null ? si.getSpellAbility(true) : castSA).getTargets().getTargetCards()); - sa.setTriggeringObject(AbilityKey.Player, getRunParams().get("Player")); - sa.setTriggeringObject(AbilityKey.Activator, getRunParams().get("Activator")); - sa.setTriggeringObject(AbilityKey.CurrentStormCount, getRunParams().get("CurrentStormCount")); - sa.setTriggeringObject(AbilityKey.CurrentCastSpells, getRunParams().get("CurrentCastSpells")); - sa.setTriggeringObject(AbilityKey.CastSACMC, getRunParams().get("CastSACMC")); + sa.setTriggeringObjectsFrom( + this, + AbilityKey.Player, + AbilityKey.Activator, + AbilityKey.CurrentStormCount, + AbilityKey.CurrentCastSpells, + AbilityKey.CastSACMC + ); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java index 4dc044312ac..f6b553e016f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java @@ -91,7 +91,7 @@ public class TriggerSpellAbilityCopy extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - final SpellAbility copySA = (SpellAbility) getRunParams().get("CopySA"); + final SpellAbility copySA = (SpellAbility) getFromRunParams(AbilityKey.CopySA); final SpellAbilityStackInstance si = sa.getHostCard().getGame().getStack().getInstanceFromSpellAbility(copySA); sa.setTriggeringObject(AbilityKey.Card, copySA.getHostCard()); sa.setTriggeringObject(AbilityKey.SpellAbility, copySA); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java b/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java index 374e97aa73a..740d7f5fd05 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java @@ -56,7 +56,7 @@ public class TriggerSurveil extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } /** {@inheritDoc} */ diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java index 421a34d71ac..fb3ef851185 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java @@ -78,7 +78,7 @@ public class TriggerTaps extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java index ab5944ab9b0..a7d75887819 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java @@ -59,7 +59,7 @@ public class TriggerTransformed extends Trigger { */ @Override public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Transformer, this.getRunParams().get("Transformer")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Transformer); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java index 0c6c879c4b9..eed574ed726 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java @@ -21,7 +21,7 @@ public class TriggerTurnBegin extends Trigger { @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Player, this.getRunParams().get("Player")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Player); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java index 8aa74bb14d3..f5f70484e6d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java @@ -61,7 +61,7 @@ public class TriggerTurnFaceUp extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java index f68eb51c482..c7dc5511b0e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java @@ -73,8 +73,7 @@ public class TriggerUnattach extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Object, getRunParams().get("Object")); - sa.setTriggeringObject(AbilityKey.Attach, getRunParams().get("Attach")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Object, AbilityKey.Attach); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java index f06243482c8..f2f4443f329 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java @@ -67,7 +67,7 @@ public class TriggerUntaps extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject(AbilityKey.Card, this.getRunParams().get("Card")); + sa.setTriggeringObjectsFrom(this, AbilityKey.Card); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java index 07481b9571a..621e4df81a3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java @@ -65,8 +65,13 @@ public class TriggerVote extends Trigger { @Override public final void setTriggeringObjects(final SpellAbility sa) { @SuppressWarnings("unchecked") - final ListMultimap votes = (ArrayListMultimap) this.getRunParams().get("AllVotes"); - sa.setTriggeringObject(AbilityKey.OtherVoters, getVoters(this.getHostCard().getController(), votes, true, true)); + FCollection voters = getVoters( + this.getHostCard().getController(), + (ListMultimap) getFromRunParams(AbilityKey.AllVotes), + true, + true + ); + sa.setTriggeringObject(AbilityKey.OtherVoters, voters); } @Override From 30d37c11b07f61b998cb260758418bd9a76a003a Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Tue, 17 Sep 2019 19:40:45 -0600 Subject: [PATCH 04/30] remove import --- forge-game/src/main/java/forge/game/trigger/TriggerVote.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java index 621e4df81a3..abe296995c3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java @@ -20,7 +20,6 @@ package forge.game.trigger; import java.util.List; import java.util.Map; -import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import forge.game.ability.AbilityKey; From c6a312211003aa08fd37e37edac06b9c4b89800d Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 18 Sep 2019 18:53:51 +0800 Subject: [PATCH 05/30] Update a reference --- forge-gui/res/cardsfolder/d/dark_petition.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/dark_petition.txt b/forge-gui/res/cardsfolder/d/dark_petition.txt index 43559e5a5b4..c9e04c820f2 100644 --- a/forge-gui/res/cardsfolder/d/dark_petition.txt +++ b/forge-gui/res/cardsfolder/d/dark_petition.txt @@ -2,7 +2,7 @@ Name:Dark Petition ManaCost:3 B B Types:Sorcery A:SP$ ChangeZone | Cost$ 3 B B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SubAbility$ DBMana | SpellDescription$ Search your library for a card and put that card into your hand. Then shuffle your library. Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B}. -SVar:DBMana:DB$ Mana | ConditionCheckSVar$ X | ConditionSVarCompare$ GE2 | Produced$ B | Amount$ 3 +SVar:DBMana:DB$ Mana | ConditionCheckSVar$ X | References$ X | ConditionSVarCompare$ GE2 | Produced$ B | Amount$ 3 SVar:X:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn #TODO: Improve the tutoring logic for the AI. Currently will generally look for the most expensive castable thing in the library (which can, of course, be used to advantage in properly constructed AI decks). AI:RemoveDeck:Random From 0fe6b3b52b4f27782db58b4c7864cd15e77f46f5 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 18 Sep 2019 20:03:56 +0800 Subject: [PATCH 06/30] Add Once and Future --- forge-gui/res/cardsfolder/e/endless_atlas.txt | 2 +- forge-gui/res/cardsfolder/f/force_of_negation.txt | 1 - forge-gui/res/cardsfolder/g/grinning_totem.txt | 4 ++-- forge-gui/res/cardsfolder/p/psychic_theft.txt | 2 +- .../res/cardsfolder/upcoming/once_and_future.txt | 12 ++++++++++++ 5 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/once_and_future.txt diff --git a/forge-gui/res/cardsfolder/e/endless_atlas.txt b/forge-gui/res/cardsfolder/e/endless_atlas.txt index 7cede437bbe..1bb6efb56da 100644 --- a/forge-gui/res/cardsfolder/e/endless_atlas.txt +++ b/forge-gui/res/cardsfolder/e/endless_atlas.txt @@ -1,6 +1,6 @@ Name:Endless Atlas ManaCost:2 Types:Artifact -A:AB$ Draw | Cost$ 2 T | CheckSvar$ X | SVarCompare$ GE3 | References$ X | SpellDescription$ Draw a card. Activate this ability only if you control three or more lands with the same name. +A:AB$ Draw | Cost$ 2 T | CheckSVar$ X | SVarCompare$ GE3 | References$ X | SpellDescription$ Draw a card. Activate this ability only if you control three or more lands with the same name. SVar:X:Count$MostCardName Land.YouCtrl Oracle:2, T: Draw a card. Activate this ability only if you control three or more lands with the same name. diff --git a/forge-gui/res/cardsfolder/f/force_of_negation.txt b/forge-gui/res/cardsfolder/f/force_of_negation.txt index 0bfe3e7f8b1..5c84d3dc9e6 100644 --- a/forge-gui/res/cardsfolder/f/force_of_negation.txt +++ b/forge-gui/res/cardsfolder/f/force_of_negation.txt @@ -3,5 +3,4 @@ ManaCost:1 U U Types:Instant A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target nonCreature Spell | ValidTgts$ Card.nonCreature | Destination$ Exile | SpellDescription$ Counter target noncreature spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyayrd. SVar:AltCost:Cost$ ExileFromHand<1/Card.Blue> | OpponentTurn$ True | Description$ If it's not your turn, you may exile a blue card from your hand rather than pay this spell's mana cost. -Svar:Picture:http://mythicspoiler.com/mh1/cards/forceofnegation.jpg Oracle:If it's not your turn, you may exile a blue card from your hand rather than pay this spell's mana cost.\nCounter target noncreature spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyayrd. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/grinning_totem.txt b/forge-gui/res/cardsfolder/g/grinning_totem.txt index 8194fd08f06..f5f2bce00a6 100644 --- a/forge-gui/res/cardsfolder/g/grinning_totem.txt +++ b/forge-gui/res/cardsfolder/g/grinning_totem.txt @@ -4,13 +4,13 @@ Types:Artifact A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | ValidTgts$ Player.Opponent | IsCurse$ True | Chooser$ You | Origin$ Library | Destination$ Exile | ChangeType$ Card | ChangeNum$ 1 | IsCurse$ True | RememberChanged$ True | SubAbility$ TotemEffect | SpellDescription$ Search target opponent's library for a card and exile it. Then that player shuffles their library. Until the beginning of your next upkeep, you may play that card. At the beginning of your next upkeep, if you haven't played it, put it into its owner's graveyard. | StackDescription$ SpellDescription SVar:TotemEffect:DB$ Effect | StaticAbilities$ STGrinning | Duration$ Permanent | RememberObjects$ Remembered | Triggers$ TrigDuration,TrigReturn,TrigLandPlayed,TrigCast | SVars$ DBDuration,ActiveTotem,RemoveEffect,DBReturn | SubAbility$ DBResetSVar # Even though the Effect is "Permanent", it's not really permanent -SVar:DBResetSVar:DB$ StoreSvar | SVar$ ActiveTotem | Type$ Number | Expression$ 1 | SubAbility$ DBCleanup +SVar:DBResetSVar:DB$ StoreSVar | SVar$ ActiveTotem | Type$ Number | Expression$ 1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:ActiveTotem:Number$1 SVar:STGrinning:Mode$ Continuous | Affected$ Card.IsRemembered+OppOwn | MayPlay$ True | EffectZone$ Command | AffectedZone$ Exile | CheckSVar$ ActiveTotem | Description$ Until the beginning of your next upkeep, you may play that card. # Turn off the duration at the beginning of the upkeep statically SVar:TrigDuration:Mode$ Phase | Phase$ Upkeep | Player$ You | Static$ True | TriggerZones$ Command | Execute$ DBDuration -SVar:DBDuration:DB$ StoreSvar | SVar$ ActiveTotem | Type$ Number | Expression$ 0 +SVar:DBDuration:DB$ StoreSVar | SVar$ ActiveTotem | Type$ Number | Expression$ 0 # Return the card as a normal trigger SVar:TrigReturn:Mode$ Phase | Phase$ Upkeep | Player$ You | Static$ True | TriggerZones$ Command | Execute$ DBReturn SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Graveyard | SubAbility$ RemoveEffect diff --git a/forge-gui/res/cardsfolder/p/psychic_theft.txt b/forge-gui/res/cardsfolder/p/psychic_theft.txt index ee8aa45d7e8..a771d08d6de 100644 --- a/forge-gui/res/cardsfolder/p/psychic_theft.txt +++ b/forge-gui/res/cardsfolder/p/psychic_theft.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Player | Origin$ Hand | Destination$ Exile | ChangeType$ Instant,Sorcery | IsCurse$ True | Chooser$ You | ChangeNum$ 1 | RememberChanged$ True | SubAbility$ TheftEffect | SpellDescription$ Target player reveals their hand. You choose an instant or sorcery card from it and exile that card. You may cast that card for as long as it remains exiled. At the beginning of the next end step, if you haven't cast the card, return it to its owner's hand. | StackDescription$ SpellDescription SVar:TheftEffect:DB$ Effect | StaticAbilities$ STThieving | Duration$ Permanent | RememberObjects$ Remembered | Triggers$ TrigReturn,TrigCast | SVars$ ActivePsychic,RemoveEffect,DBReturn | SubAbility$ DBResetSVar # Even though the Effect is "Permanent", it's not really permanent -SVar:DBResetSVar:DB$ StoreSvar | SVar$ ActivePsychic | Type$ Number | Expression$ 1 | SubAbility$ DBCleanup +SVar:DBResetSVar:DB$ StoreSVar | SVar$ ActivePsychic | Type$ Number | Expression$ 1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:ActivePsychic:Number$1 SVar:STThieving:Mode$ Continuous | Affected$ Card.IsRemembered+OppOwn | MayPlay$ True | EffectZone$ Command | AffectedZone$ Exile | CheckSVar$ ActivePsychic | Description$ You may cast that card for as long as it remains exiled. diff --git a/forge-gui/res/cardsfolder/upcoming/once_and_future.txt b/forge-gui/res/cardsfolder/upcoming/once_and_future.txt new file mode 100644 index 00000000000..aac1b9d2b82 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/once_and_future.txt @@ -0,0 +1,12 @@ +Name:Once and Future +ManaCost:3 G +Types:Instant +A:SP$ ChangeZone | Cost$ 3 G | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target card in your graveyard | ValidTgts$ Card.YouOwn | SubAbility$ DBPump | SpellDescription$ Return target card from your graveyard to your hand. Put up to one other target card from your graveyard on top of your library. Exile CARDNAME. Adamant — If at least three green mana was spent to cast this spell, instead return those cards to your hand and exile CARDNAME. +SVar:DBPump:DB$ Pump | TargetMin$ 0 | TargetMax$ 1 | TgtZone$ Graveyard | TgtPrompt$ Choose target card in your graveyard | ValidTgts$ Card.YouOwn | TargetUnique$ True | RememberObjects$ ThisTargetedCard | SubAbility$ DBReturn +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Library | Hidden$ True | Defined$ Remembered | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X | SubAbility$ DBReturn2 +SVar:DBReturn2:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Hidden$ True | Defined$ Remembered | ConditionCheckSVar$ X | References$ X | SubAbility$ DBExile +SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemebered$ True +SVar:X:Count$Adamant.Green.1.0 +AI:RemoveDeck:Random +Oracle:Return target card from your graveyard to your hand. Put up to one other target card from your graveyard on top of your library. Exile Once and Future.\nAdamant — If at least three green mana was spent to cast this spell, instead return those cards to your hand and exile Once and Future. From bafbe73bd65866eb8f86a77e6471e506d6ccb363 Mon Sep 17 00:00:00 2001 From: Ryan1729 Date: Wed, 18 Sep 2019 21:12:13 -0600 Subject: [PATCH 07/30] convert missed keys to enum --- forge-game/src/main/java/forge/game/zone/MagicStack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index a70ed6c30cb..d0040eb9745 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -659,7 +659,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable Date: Wed, 18 Sep 2019 21:34:19 -0600 Subject: [PATCH 08/30] fix restricted cards not being restricted to one. --- forge-gui/src/main/java/forge/deck/DeckgenUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index 67dd9217b04..2ccc98d7e08 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -282,7 +282,7 @@ public class DeckgenUtil { } List restrictedCardsAdded = new ArrayList<>(); for (PaperCard c:selectedCards){ - if (format.getRestrictedCards().contains(c.getName())&&!restrictedCardsAdded.contains(c)){ + if (format.getRestrictedCards().contains(c.getName())&&!restrictedCardsAdded.contains(c.getName())){ playsetList.add(c); restrictedCardsAdded.add(c.getName()); continue; From 3573a27bdb31f637a90d8f384039c1d7a45250dc Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 19 Sep 2019 12:16:41 +0800 Subject: [PATCH 09/30] Add some forgescribed cards --- .../res/cardsfolder/upcoming/acclaimed_contender.txt | 7 +++++++ .../cardsfolder/upcoming/archon_of_absolution.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/barge_in.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/bartered_cow.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/blacklance_paragon.txt | 8 ++++++++ .../res/cardsfolder/upcoming/castle_ardenvale.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/castle_embereth.txt | 9 +++++++++ .../res/cardsfolder/upcoming/castle_garenbrig.txt | 8 ++++++++ .../res/cardsfolder/upcoming/castle_locthwain.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/castle_vantress.txt | 8 ++++++++ .../res/cardsfolder/upcoming/escape_to_the_wilds.txt | 12 ++++++++++++ .../cardsfolder/upcoming/ferocity_of_the_wilds.txt | 6 ++++++ .../upcoming/linden_the_steadfast_queen.txt | 8 ++++++++ .../cardsfolder/upcoming/syr_alin_the_lions_claw.txt | 8 ++++++++ .../upcoming/syr_faren_the_hengehammer.txt | 8 ++++++++ 15 files changed, 126 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/acclaimed_contender.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/archon_of_absolution.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/barge_in.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/bartered_cow.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/blacklance_paragon.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/castle_ardenvale.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/castle_embereth.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/castle_garenbrig.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/castle_locthwain.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/castle_vantress.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/escape_to_the_wilds.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ferocity_of_the_wilds.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/linden_the_steadfast_queen.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/syr_alin_the_lions_claw.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/syr_faren_the_hengehammer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/acclaimed_contender.txt b/forge-gui/res/cardsfolder/upcoming/acclaimed_contender.txt new file mode 100644 index 00000000000..1b3a5160860 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/acclaimed_contender.txt @@ -0,0 +1,7 @@ +Name:Acclaimed Contender +ManaCost:2 W +Types:Creature Human Knight +PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Knight.YouCtrl+Other | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, if you control another Knight, look at the top five cards of your library. You may reveal a Knight, Aura, Equipment, or legendary artifact card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +SVar:TrigDig:DB$ Dig | DigNum$ 5 | ChangeNum$ 1 | ChangeValid$ Card.Knight,Aura,Equipment,Artifact.Legendary | RestRandomOrder$ True +Oracle:When Acclaimed Contender enters the battlefield, if you control another Knight, look at the top five cards of your library. You may reveal a Knight, Aura, Equipment, or legendary artifact card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/archon_of_absolution.txt b/forge-gui/res/cardsfolder/upcoming/archon_of_absolution.txt new file mode 100644 index 00000000000..25c9de6f2c4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/archon_of_absolution.txt @@ -0,0 +1,8 @@ +Name:Archon of Absolution +ManaCost:3 W +Types:Creature Archon +PT:3/2 +K:Flying +K:Protection from white +S:Mode$ CantAttackUnless | ValidCard$ Creature | Target$ You,Planeswalker.YouCtrl | Cost$ 1 | Description$ Creatures can't attack you or a planeswalker you control unless their controller pays {1} for each of those creatures. +Oracle:Flying\nProtection from white (This creature can't be blocked, targeted, dealt damage, enchanted, or equipped by anything white.)\nCreatures can't attack you or a planeswalker you control unless their controller pays {1} for each of those creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/barge_in.txt b/forge-gui/res/cardsfolder/upcoming/barge_in.txt new file mode 100644 index 00000000000..07a14c80710 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/barge_in.txt @@ -0,0 +1,6 @@ +Name:Barge In +ManaCost:R +Types:Instant +A:SP$ Pump | Cost$ R | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBPump | SpellDescription$ Target attacking creature gets +2/+2 until end of turn. Each attacking non-Human creature gains trample until end of turn. +SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.nonHuman+attacking | KW$ Trample +Oracle:Target attacking creature gets +2/+2 until end of turn. Each attacking non-Human creature gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/bartered_cow.txt b/forge-gui/res/cardsfolder/upcoming/bartered_cow.txt new file mode 100644 index 00000000000..323eac840f0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bartered_cow.txt @@ -0,0 +1,10 @@ +Name:Bartered Cow +ManaCost:3 W +Types:Creature Ox +PT:3/3 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | TriggerController$ TriggeredCardController | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies or blocks you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +T:Mode$ Discarded | ValidCard$ Card.Self | Execute$ TrigToken | Secondary$ True | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies or blocks you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +SVar:SacMe:1 +SVar:DiscardMe:3 +Oracle:When Bartered Cow dies or when you discard it, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") diff --git a/forge-gui/res/cardsfolder/upcoming/blacklance_paragon.txt b/forge-gui/res/cardsfolder/upcoming/blacklance_paragon.txt new file mode 100644 index 00000000000..48693c7c552 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blacklance_paragon.txt @@ -0,0 +1,8 @@ +Name:Blacklance Paragon +ManaCost:1 B +Types:Creature Human Knight +PT:3/1 +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target Knight gains deathtouch and lifelink until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Knight | TgtPrompt$ Select target Knight | KW$ Deathtouch & Lifelink +Oracle:Flash\nWhen Blacklance Paragon enters the battlefield, target Knight gains deathtouch and lifelink until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/castle_ardenvale.txt b/forge-gui/res/cardsfolder/upcoming/castle_ardenvale.txt new file mode 100644 index 00000000000..7a11b90efd0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/castle_ardenvale.txt @@ -0,0 +1,10 @@ +Name:Castle Ardenvale +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:LandTapped +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Plains.YouCtrl | ConditionCompare$ EQ0 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control a Plains. +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +A:AB$ Token | Cost$ 2 W W T | TokenAmount$ 1 | TokenScript$ w_1_1_human | TokenOwner$ You | LegacyImage$ w 1 1 human eld | SpellDescription$ Create a 1/1 white Human creature token. +DeckHints:Type$Human +DeckHas:Ability$Token +Oracle:Castle Ardenvale enters the battlefield tapped unless you control a Plains.\n{T}: Add {W}.\n{2}{W}{W}, {T}: Create a 1/1 white Human creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/castle_embereth.txt b/forge-gui/res/cardsfolder/upcoming/castle_embereth.txt new file mode 100644 index 00000000000..1a506611e16 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/castle_embereth.txt @@ -0,0 +1,9 @@ +Name:Castle Embereth +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:LandTapped +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Mountain.YouCtrl | ConditionCompare$ EQ0 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control a Mountain. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +SVar:PlayMain1:TRUE +A:AB$ PumpAll | Cost$ 1 R R T | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | SpellDescription$ Creatures you control get +1/+0 until end of turn. +Oracle:Castle Embereth enters the battlefield tapped unless you control a Mountain.\n{T}: Add {R}.\n{1}{R}{R}, {T}: Creatures you control get +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/castle_garenbrig.txt b/forge-gui/res/cardsfolder/upcoming/castle_garenbrig.txt new file mode 100644 index 00000000000..0a5a271a550 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/castle_garenbrig.txt @@ -0,0 +1,8 @@ +Name:Castle Garenbrig +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:LandTapped +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Forest.YouCtrl | ConditionCompare$ EQ0 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control a Forest. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +A:AB$ Mana | Cost$ 2 G G T | Produced$ G | Amount$ 6 | RestrictValid$ Spell.Creature,Activated.Creature | SpellDescription$ Add six {G}. Spend this mana only to cast creature spells or activate abilities of creatures. +Oracle:Castle Garenbrig enters the battlefield tapped unless you control a Forest.\n{T}: Add {G}.\n{2}{G}{G}, {T}: Add six {G}. Spend this mana only to cast creature spells or activate abilities of creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/castle_locthwain.txt b/forge-gui/res/cardsfolder/upcoming/castle_locthwain.txt new file mode 100644 index 00000000000..3112cad52ad --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/castle_locthwain.txt @@ -0,0 +1,10 @@ +Name:Castle Locthwain +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:LandTapped +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Swamp.YouCtrl | ConditionCompare$ EQ0 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control a Swamp. +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +A:AB$ Draw | Cost$ 1 B B T | NumCards$ 1 | SpellDescription$ Draw a card, then you lose life equal to the number of cards in your hand. | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | References$ X +SVar:X:Count$InYourHand +Oracle:Castle Locthwain enters the battlefield tapped unless you control a Swamp.\n{T}: Add {B}.\n{1}{B}{B}, {T}: Draw a card, then you lose life equal to the number of cards in your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/castle_vantress.txt b/forge-gui/res/cardsfolder/upcoming/castle_vantress.txt new file mode 100644 index 00000000000..15be04c43b1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/castle_vantress.txt @@ -0,0 +1,8 @@ +Name:Castle Vantress +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:LandTapped +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Island.YouCtrl | ConditionCompare$ EQ0 | SpellDescription$ CARDNAME enters the battlefield tapped unless you control an Island. +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ Scry | Cost$ 2 U U T | ScryNum$ 2 | SpellDescription$ Scry 2. +Oracle:Castle Vantress enters the battlefield tapped unless you control an Island.\n{T}: Add {U}.\n{2}{U}{U}, {T}: Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/escape_to_the_wilds.txt b/forge-gui/res/cardsfolder/upcoming/escape_to_the_wilds.txt new file mode 100644 index 00000000000..ef196ed4c5e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/escape_to_the_wilds.txt @@ -0,0 +1,12 @@ +Name:Escape to the Wilds +ManaCost:3 R G +Types:Sorcery +A:SP$ Mill | Cost$ 3 R G | Destination$ Exile | NumCards$ 5 | RememberMilled$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top five cards of your library. You may play cards exiled this way until the end of your next turn. +SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | ForgetOnMoved$ Exile | StaticAbilities$ Play | Duration$ UntilTheEndOfYourNextTurn | SubAbility$ DBEffect2 +SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play cards exiled this the end of your next turn. +SVar:DBEffect2$ Effect | Cost$ 3 R G | Name$ CARDNAME Effect | StaticAbilities$ Exploration | AILogic$ Always | SpellDescription$ You may play an additional land this turn. | SubAbility$ DBCleanup +SVar:Exploration:Mode$ Continuous | Affected$ You | AddKeyword$ AdjustLandPlays:1 | EffectZone$ Command | Description$ You may play an additional land this turn. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:NeedsToPlayVar:ZZ GE1 +SVar:ZZ:Count$ValidHand Land.YouOwn +Oracle:Exile the top five cards of your library. You may play cards exiled this way until the end of your next turn.\nYou may play an additional land this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/ferocity_of_the_wilds.txt b/forge-gui/res/cardsfolder/upcoming/ferocity_of_the_wilds.txt new file mode 100644 index 00000000000..6d09ef063be --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ferocity_of_the_wilds.txt @@ -0,0 +1,6 @@ +Name:Ferocity of the Wilds +ManaCost:2 R +Types:Enchantment +S:Mode$ Continuous | Affected$ Creature.nonHuman+attacking+YouCtrl | AddPower$ 1 | AddKeyword$ Trample | Description$ Attacking non-Human creatures you control get +1/+0 and have trample. +SVar:PlayMain1:TRUE +Oracle:Attacking non-Human creatures you control get +1/+0 and have trample. diff --git a/forge-gui/res/cardsfolder/upcoming/linden_the_steadfast_queen.txt b/forge-gui/res/cardsfolder/upcoming/linden_the_steadfast_queen.txt new file mode 100644 index 00000000000..9936a7111b3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/linden_the_steadfast_queen.txt @@ -0,0 +1,8 @@ +Name:Linden, the Steadfast Queen +ManaCost:W W W +Types:Legendary Creature Human Noble +PT:3/3 +K:Vigilance +T:Mode$ Attacks | ValidCard$ Creature.White+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a white creature you control attacks, you gain 1 life. +SVar:TrigGainLife:DB$GainLife | LifeAmount$ 1 | Defined$ You +Oracle:Vigilance\nWhenever a white creature you control attacks, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/syr_alin_the_lions_claw.txt b/forge-gui/res/cardsfolder/upcoming/syr_alin_the_lions_claw.txt new file mode 100644 index 00000000000..641984a1f42 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/syr_alin_the_lions_claw.txt @@ -0,0 +1,8 @@ +Name:Syr Alin, the Lion's Claw +ManaCost:3 W W +Types:Legendary Creature Human Knight +PT:4/4 +K:First Strike +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, other creatures you control get +1/+1 until end of turn. +SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.Other+YouCtrl | NumAtt$ +1 | NumDef$ +1 +Oracle:First strike\nWhenever Syr Alin, the Lion's Claw attacks, other creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/syr_faren_the_hengehammer.txt b/forge-gui/res/cardsfolder/upcoming/syr_faren_the_hengehammer.txt new file mode 100644 index 00000000000..3415ec81776 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/syr_faren_the_hengehammer.txt @@ -0,0 +1,8 @@ +Name:Syr Faren, the Hengehammer +ManaCost:G G +Types:Legendary Creature Human Knight +PT:2/2 +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target creature gets +X/+X until end of turn, where X is CARDNAME's power. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.attacking+Other | TgtPrompt$ Select another target attacking creature | NumAtt$ X | NumDef$ X | References$ X +SVar:X:Count$CardPower +Oracle:Whenever Syr Faren, the Hengehammer attacks, another target attacking creature gets +X/+X until end of turn, where X is Syr Faren's power. From 91abbcd3c5ed458787f60b68f652f6728bc3cfd6 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 19 Sep 2019 04:31:42 +0000 Subject: [PATCH 10/30] Fix setloadingaMatch prematurely, if the startgame is null there must be an error/showdialog happened. --- .../src/forge/screens/constructed/LobbyScreen.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java index d9b8c2dc78d..b111fa139f4 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java @@ -272,13 +272,13 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { updateDeck(i);//TODO: Investigate why AI names cannot be overriden? updateName(i, getPlayerName(i)); } - //set this so we cant get any multi/rapid tap on start button - Forge.setLoadingaMatch(true); FThreads.invokeInBackgroundThread(new Runnable() { //must call startGame in background thread in case there are alerts @Override public void run() { final Runnable startGame = lobby.startGame(); if (startGame != null) { + //set this so we cant get any multi/rapid tap on start button + Forge.setLoadingaMatch(true); FThreads.invokeInEdtLater(new Runnable() { @Override public void run() { From 1b9bce51657bebd25b5ecfa39ca6819795291b24 Mon Sep 17 00:00:00 2001 From: CCTV-1 Date: Thu, 19 Sep 2019 13:53:55 +0800 Subject: [PATCH 11/30] translation Forge.java --- forge-gui-mobile/src/forge/Forge.java | 23 ++++++++++++++++++----- forge-gui/res/languages/de-DE.properties | 4 ++++ forge-gui/res/languages/en-US.properties | 6 +++++- forge-gui/res/languages/es-ES.properties | 6 +++++- forge-gui/res/languages/zh-CN.properties | 6 +++++- 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 372d19a39c1..3523df7e579 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -28,6 +28,7 @@ import forge.sound.SoundSystem; import forge.toolbox.*; import forge.util.Callback; import forge.util.FileUtil; +import forge.util.Localizer; import forge.util.Utils; import java.util.ArrayList; @@ -96,6 +97,8 @@ public class Forge implements ApplicationListener { textureFiltering = prefs.getPrefBoolean(FPref.UI_LIBGDX_TEXTURE_FILTERING); + final Localizer localizer = Localizer.getInstance(); + //load model on background thread (using progress bar to report progress) FThreads.invokeInBackgroundThread(new Runnable() { @Override @@ -106,13 +109,13 @@ public class Forge implements ApplicationListener { FModel.initialize(splashScreen.getProgressBar(), null); - splashScreen.getProgressBar().setDescription("Loading fonts..."); + splashScreen.getProgressBar().setDescription(localizer.getMessage("lblLoadingFonts")); FSkinFont.preloadAll(); - splashScreen.getProgressBar().setDescription("Loading card translations..."); + splashScreen.getProgressBar().setDescription(localizer.getMessage("lblLoadingCardTranslations")); CardTranslation.preloadTranslation(prefs.getPref(FPref.UI_LANGUAGE)); - splashScreen.getProgressBar().setDescription("Finishing startup..."); + splashScreen.getProgressBar().setDescription(localizer.getMessage("lblFinishingStartup")); Gdx.app.postRunnable(new Runnable() { @Override @@ -248,11 +251,16 @@ public class Forge implements ApplicationListener { } } }; + + final Localizer localizer = Localizer.getInstance(); + if (silent) { callback.run(true); } else { - FOptionPane.showConfirmDialog("Are you sure you wish to restart Forge?", "Restart Forge", "Restart", "Cancel", callback); + FOptionPane.showConfirmDialog( + localizer.getMessage("lblAreYouSureYouWishRestartForge"), localizer.getMessage("lblRestartForge"), + localizer.getMessage("lblRestart"), localizer.getMessage("lblCancel"), callback); } } @@ -268,11 +276,16 @@ public class Forge implements ApplicationListener { } } }; + + final Localizer localizer = Localizer.getInstance(); + if (silent) { callback.run(true); } else { - FOptionPane.showConfirmDialog("Are you sure you wish to exit Forge?", "Exit Forge", "Exit", "Cancel", callback); + FOptionPane.showConfirmDialog( + localizer.getMessage("lblAreYouSureYouWishExitForge"), localizer.getMessage("lblExitForge"), + localizer.getMessage("lblExit"), localizer.getMessage("lblCancel"), callback); } } diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 5142a6a34ce..994f8550aed 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -970,3 +970,7 @@ lblCollection=Sammlung lblCatalog=Katalog lblCommanders=Komandeure lblOathbreakers=Eidbrecher +#Forge.java +lblLoadingFonts=Loading fonts... +lblLoadingCardTranslations=Loading card translations... +lblFinishingStartup=Finishing startup... \ No newline at end of file diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index f94a7edc84c..86f39905691 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -969,4 +969,8 @@ lblInventory=Inventory lblCollection=Collection lblCatalog=Catalog lblCommanders=Commanders -lblOathbreakers=Oathbreakers \ No newline at end of file +lblOathbreakers=Oathbreakers +#Forge.java +lblLoadingFonts=Loading fonts... +lblLoadingCardTranslations=Loading card translations... +lblFinishingStartup=Finishing startup... \ No newline at end of file diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 5e916608fcd..968fbf9fc48 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -969,4 +969,8 @@ lblInventory=Inventario lblCollection=Colección lblCatalog=Catálogo lblCommanders=Commanders -lblOathbreakers=Oathbreakers \ No newline at end of file +lblOathbreakers=Oathbreakers +#Forge.java +lblLoadingFonts=Loading fonts... +lblLoadingCardTranslations=Loading card translations... +lblFinishingStartup=Finishing startup... \ No newline at end of file diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index b23a8408ba6..a588789c5db 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -969,4 +969,8 @@ lblInventory=库存 lblCollection=珍藏 lblCatalog=目录 lblCommanders=指挥官 -lblOathbreakers=破誓者 \ No newline at end of file +lblOathbreakers=破誓者 +#Forge.java +lblLoadingFonts=加载字体中 +lblLoadingCardTranslations=加载卡牌翻译中 +lblFinishingStartup=完成启动 \ No newline at end of file From ee53353501f9dab6d8ef2addd6ae9f49fa22d7fa Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 19 Sep 2019 16:20:11 +0800 Subject: [PATCH 12/30] More forgescribed cards --- .../cardsfolder/upcoming/fortifying_provisions.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/giants_skewer.txt | 9 +++++++++ .../cardsfolder/upcoming/grumgully_the_generous.txt | 7 +++++++ .../res/cardsfolder/upcoming/idyllic_grange.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/loch_dragon.txt | 9 +++++++++ .../cardsfolder/upcoming/mistford_river_turtle.txt | 7 +++++++ .../res/cardsfolder/upcoming/oakhame_adversary.txt | 9 +++++++++ .../cardsfolder/upcoming/overwhelmed_apprentice.txt | 8 ++++++++ .../res/cardsfolder/upcoming/witchs_cottage.txt | 2 +- .../cardsfolder/upcoming/yorvo_lord_of_garenbrig.txt | 12 ++++++++++++ forge-gui/res/tokenscripts/g_7_7_giant.txt | 6 ++++++ 11 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/fortifying_provisions.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/giants_skewer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/grumgully_the_generous.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/idyllic_grange.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/loch_dragon.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mistford_river_turtle.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/oakhame_adversary.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/overwhelmed_apprentice.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/yorvo_lord_of_garenbrig.txt create mode 100644 forge-gui/res/tokenscripts/g_7_7_giant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fortifying_provisions.txt b/forge-gui/res/cardsfolder/upcoming/fortifying_provisions.txt new file mode 100644 index 00000000000..6db938168b6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fortifying_provisions.txt @@ -0,0 +1,8 @@ +Name:Fortifying Provisions +ManaCost:2 W +Types:Enchantment +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddToughness$ 1 | Description$ Creatures you control get +0/+1. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +SVar:PlayMain1:TRUE +Oracle:Creatures you control get +0/+1.\nWhen Fortifying Provisions enters the battlefield, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") diff --git a/forge-gui/res/cardsfolder/upcoming/giants_skewer.txt b/forge-gui/res/cardsfolder/upcoming/giants_skewer.txt new file mode 100644 index 00000000000..d2ecf989060 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/giants_skewer.txt @@ -0,0 +1,9 @@ +Name:Giant's Skewer +ManaCost:1 B +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 1 | Description$ Equipped creature gets +2/+1. +T:Mode$ DamageDone | ValidSource$ Creature.EquippedBy | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever equipped creature deals combat damage to a creature, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +DeckHas:Ability$LifeGain +K:Equip:3 +Oracle:Equipped creature gets +2/+1.\nWhenever equipped creature deals combat damage to a creature, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/grumgully_the_generous.txt b/forge-gui/res/cardsfolder/upcoming/grumgully_the_generous.txt new file mode 100644 index 00000000000..ab653e8e3c8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grumgully_the_generous.txt @@ -0,0 +1,7 @@ +Name:Grumgully, the Generous +ManaCost:1 R G +Types:Legendary Creature Goblin Shaman +PT:3/3 +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.YouCtrl+Other+nonHuman +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each other non-Human creature you controls enters the battlefield with an additional +1/+1 counter on it. +Oracle:Each other non-Human creature you controls enters the battlefield with an additional +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/idyllic_grange.txt b/forge-gui/res/cardsfolder/upcoming/idyllic_grange.txt new file mode 100644 index 00000000000..bb0830870b0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/idyllic_grange.txt @@ -0,0 +1,10 @@ +Name:Idyllic Grange +ManaCost:no cost +Types:Land Plains +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Plains. +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LT3 | References$ ETBCheckSVar | SubAbility$ MoveToPlay +SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield +SVar:ETBCheckSVar:Count$Valid Plains.YouCtrl+Other +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+untapped | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield untapped, put a +1/+1 counter on target creature you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 +Oracle:({T}: Add {W}.)\nIdyllic Grange enters the battlefield tapped unless you control three or more other Plains.\nWhen Idyllic Grange enters the battlefield untapped, put a +1/+1 counter on target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/loch_dragon.txt b/forge-gui/res/cardsfolder/upcoming/loch_dragon.txt new file mode 100644 index 00000000000..97faf198374 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/loch_dragon.txt @@ -0,0 +1,9 @@ +Name:Loch Dragon +ManaCost:U/R U/R U/R U/R +Types:Creature Dragon +PT:3/2 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, you may discard a card. If you do, draw a card. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, you may discard a card. If you do, draw a card. +SVar:TrigDraw:AB$ Draw | Cost$ Discard<1/Card> | NumCards$ 1 +Oracle:Flying\nWhenever Loch Dragon enters the battlefield or attacks, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/mistford_river_turtle.txt b/forge-gui/res/cardsfolder/upcoming/mistford_river_turtle.txt new file mode 100644 index 00000000000..533e41737a7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mistford_river_turtle.txt @@ -0,0 +1,7 @@ +Name:Mistford River Turtle +ManaCost:3 U +Types:Creature Turtle +PT:1/5 +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target creature can't be blocked this turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.nonHuman+Other+attacking | TgtPrompt$ Select another target attacking non-Human creature | KW$ HIDDEN Unblockable +Oracle:Whenever Mistford River Turtle attacks, another target attacking non-Human creature can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/oakhame_adversary.txt b/forge-gui/res/cardsfolder/upcoming/oakhame_adversary.txt new file mode 100644 index 00000000000..f0eb3973ad3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/oakhame_adversary.txt @@ -0,0 +1,9 @@ +Name:Oakhame Adversary +ManaCost:3 G +Types:Creature Elf Warrior +PT:2/3 +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 2 | EffectZone$ All | IsPresent$ Permanent.Green+OppCtrl | Description$ CARDNAME costs {2} less to cast if your opponent controls a green permanent. +K:Deathtouch +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:This spell costs {2} less to cast if your opponent controls a green permanent.\nDeathtouch\nWhenever Oakhame Adversary deals combat damage to a player, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/overwhelmed_apprentice.txt b/forge-gui/res/cardsfolder/upcoming/overwhelmed_apprentice.txt new file mode 100644 index 00000000000..34dc290b974 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/overwhelmed_apprentice.txt @@ -0,0 +1,8 @@ +Name:Overwhelmed Apprentice +ManaCost:U +Types:Creature Human Wizard +PT:1/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield, each opponent puts the top two cards of their library into their graveyard. Then you scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) +SVar:TrigMill:DB$ Mill | Defined$ Player.Opponent | NumCards$ 2 | SubAbility$ DBScry +SVar:DBScry:DB$ Scry | ScryNum$ 2 +Oracle:When Overwhelmed Apprentice enters the battlefield, each opponent puts the top two cards of their library into their graveyard. Then you scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) diff --git a/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt b/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt index b6b9625fad9..f961ea09bbd 100644 --- a/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt +++ b/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt @@ -5,6 +5,6 @@ R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LT3 | References$ ETBCheckSVar | SubAbility$ MoveToPlay SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield SVar:ETBCheckSVar:Count$Valid Swamp.YouCtrl+Other -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put target creature card from your graveyard on top of your library. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+untapped | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield untapped, you may put target creature card from your graveyard on top of your library. SVar:TrigChange:DB$ ChangeZone | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | Origin$ Graveyard | Destination$ Library Oracle:({T}: Add {B}.)\nWitch's Cottage enters the battlefield tapped unless you control three or more other Swamps.\nWhen Witch's Cottage enters the battlefield untapped, you may put target creature card from your graveyard on top of your library. diff --git a/forge-gui/res/cardsfolder/upcoming/yorvo_lord_of_garenbrig.txt b/forge-gui/res/cardsfolder/upcoming/yorvo_lord_of_garenbrig.txt new file mode 100644 index 00000000000..06d4ac10138 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/yorvo_lord_of_garenbrig.txt @@ -0,0 +1,12 @@ +Name:Yorvo, Lord of Garenbrig +ManaCost:G G G +Types:Legendary Creature Giant Noble +PT:0/0 +K:etbCounter:P1P1:4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl+Green | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another green creature enters the battlefield under your control, put a +1/+1 counter on CARDNAME. Then if that creature's power is greater than CARDNAME's power, put another +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | COnditionCheckSVar$ X | ConditionSVarCompare$ GEY | References$ X,Y +SVar:X:TriggeredCard$CardPower +SVar:Y:Count$CardPower +DeckHas:Ability$Counters +Oracle:Yorvo, Lord of Garenbrig enters the battlefield with four +1/+1 counters on it.\nWhenever another green creature enters the battlefield under your control, put a +1/+1 counter on Yorvo. Then if that creature's power is greater than Yorvo's power, put another +1/+1 counter on Yorvo. diff --git a/forge-gui/res/tokenscripts/g_7_7_giant.txt b/forge-gui/res/tokenscripts/g_7_7_giant.txt new file mode 100644 index 00000000000..ab0ad7d07b6 --- /dev/null +++ b/forge-gui/res/tokenscripts/g_7_7_giant.txt @@ -0,0 +1,6 @@ +Name:Giant +Colors:green +ManaCost:no cost +PT:7/7 +Types:Creature Giant +Oracle: \ No newline at end of file From 191ffa67beac288456857bf3c0230f7225cb2f07 Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 19 Sep 2019 16:47:13 +0800 Subject: [PATCH 13/30] More ELD cards --- forge-gui/res/cardsfolder/upcoming/redcap_raiders.txt | 7 +++++++ .../res/cardsfolder/upcoming/revenge_of_ravens.txt | 7 +++++++ .../res/cardsfolder/upcoming/stonecoil_serpent.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/stormfist_crusader.txt | 9 +++++++++ .../res/cardsfolder/upcoming/tall_as_a_beanstalk.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/tempting_witch.txt | 9 +++++++++ .../cardsfolder/upcoming/the_cauldron_of_eternity.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/the_great_henge.txt | 11 +++++++++++ .../upcoming/torbran_thane_of_red_fell.txt | 9 +++++++++ .../res/cardsfolder/upcoming/unexplained_vision.txt | 7 +++++++ 10 files changed, 86 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/redcap_raiders.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/revenge_of_ravens.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/stonecoil_serpent.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/stormfist_crusader.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tall_as_a_beanstalk.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tempting_witch.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/the_cauldron_of_eternity.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/the_great_henge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/torbran_thane_of_red_fell.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/unexplained_vision.txt diff --git a/forge-gui/res/cardsfolder/upcoming/redcap_raiders.txt b/forge-gui/res/cardsfolder/upcoming/redcap_raiders.txt new file mode 100644 index 00000000000..11b60b9d93d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/redcap_raiders.txt @@ -0,0 +1,7 @@ +Name:Redcap Raiders +ManaCost:2 R +Types:Creature Goblin Warrior +PT:3/2 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, you may tap an untapped non-Human creature you control. If you do, CARDNAME gets +1/+1 and gains trample until end of turn. +SVar:TrigPump:AB$ Pump | Cost$ tapXType<1/Creature.nonHuman/non-Human creature> | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | KW$ Trample +Oracle:Whenever Redcap Raiders attacks, you may tap an untapped non-Human creature you control. If you do, Redcap Raiders gets +1/+1 and gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/revenge_of_ravens.txt b/forge-gui/res/cardsfolder/upcoming/revenge_of_ravens.txt new file mode 100644 index 00000000000..262ffd25dd6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/revenge_of_ravens.txt @@ -0,0 +1,7 @@ +Name:Revenge of Ravens +ManaCost:3 B +Types:Enchantment +T:Mode$ Attacks | ValidCard$ Creature | Attacked$ You,Planeswalker.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature attacks you or a planeswalker you control, that creature's controller loses 1 life and you gain 1 life. +SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredAttackerController | LifeAmount$ 1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 1 +Oracle:Whenever a creature attacks you or a planeswalker you control, that creature's controller loses 1 life and you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/stonecoil_serpent.txt b/forge-gui/res/cardsfolder/upcoming/stonecoil_serpent.txt new file mode 100644 index 00000000000..dd379d1423c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/stonecoil_serpent.txt @@ -0,0 +1,10 @@ +Name:Stonecoil Serpent +ManaCost:X +Types:Artifact Creature Snake +PT:0/0 +K:Reach +K:Trample +K:Protection from multicolored +K:etbCounter:P1P1:X +SVar:X:Count$xPaid +Oracle:Reach, trample, protection from multicolored\nStonecoil Serpent enters the battlefield with X +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/stormfist_crusader.txt b/forge-gui/res/cardsfolder/upcoming/stormfist_crusader.txt new file mode 100644 index 00000000000..6f2481fa7f8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/stormfist_crusader.txt @@ -0,0 +1,9 @@ +Name:Stormfist Crusader +ManaCost:B R +Types:Creature Human Knight +PT:2/2 +K:Menace +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your upkeep, each player draws a card and loses 1 life. +SVar:TrigDraw:DB$ Draw | Defined$ Player | NumCards$ 1 | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | Defined$ Player | LifeAmount$ 1 +Oracle:Menace\nAt the beginning of your upkeep, each player draws a card and loses 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/tall_as_a_beanstalk.txt b/forge-gui/res/cardsfolder/upcoming/tall_as_a_beanstalk.txt new file mode 100644 index 00000000000..1d5b16a59ca --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tall_as_a_beanstalk.txt @@ -0,0 +1,7 @@ +Name:Tall as a Beanstalk +ManaCost:3 G +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 3 G | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 3 | AddKeyword$ Reach | AddType$ Giant | Description$ Enchanted creature gets +3/+3, has reach, and is a Giant in addition to its other types. +Oracle:Enchant creature\nEnchanted creature gets +3/+3, has reach, and is a Giant in addition to its other types. diff --git a/forge-gui/res/cardsfolder/upcoming/tempting_witch.txt b/forge-gui/res/cardsfolder/upcoming/tempting_witch.txt new file mode 100644 index 00000000000..34ba26dbdb6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tempting_witch.txt @@ -0,0 +1,9 @@ +Name:Tempting Witch +ManaCost:2 B +Types:Creature Human Warlock +PT:1/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld +DeckHas:Ability$LifeGain +A:AB$ LoseLife | Cost$ 2 T Sac<1/Food> | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 3 | SpellDescription$ Target player loses 3 life. +Oracle:When Tempting Witch enters the battlefield, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\n{2}, {T}, Sacrifice a Food: Target player loses 3 life. diff --git a/forge-gui/res/cardsfolder/upcoming/the_cauldron_of_eternity.txt b/forge-gui/res/cardsfolder/upcoming/the_cauldron_of_eternity.txt new file mode 100644 index 00000000000..fdd657ee8a5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_cauldron_of_eternity.txt @@ -0,0 +1,10 @@ +Name:The Cauldron of Eternity +ManaCost:10 B B +Types:Legendary Artifact +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {2} less for each creature card in your graveyard. +SVar:X:Count$TypeInYourYard.Creature +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ Whenever a creature you control dies, put it on the bottom of its owner's library. +SVar:TrigChange:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 +SVar:BuffedBy:Creature +A:AB$ ChangeZone | Cost$ 2 B T PayLife<2> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Battlefield | SorcerySpeed$ True | SpellDescription$ Return target creature card from your graveyard to the battlefield. Activate this ability only any time you could cast a sorcery. +Oracle:This spell costs {2} less for each creature card in your graveyard.\nWhenever a creature you control dies, put it on the bottom of its owner's library.\n{2}{B}, {T}, Pay 2 life: Return target creature card from your graveyard to the battlefield. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/the_great_henge.txt b/forge-gui/res/cardsfolder/upcoming/the_great_henge.txt new file mode 100644 index 00000000000..4628b019329 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_great_henge.txt @@ -0,0 +1,11 @@ +Name:The Great Henge +ManaCost:7 G G +Types:Legendary Artifact +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {X} less to cast, where X is the greatest power among creatures you control. +SVar:X:Count$GreatestPower_Creature.YouCtrl +A:AB$ Mana | Cost$ T | Produced$ G | Amount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Add {G}{G}. You gain 2 life. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, put a +1/+1 counter on it and draw a card. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:This spell costs {X} less to cast, where X is the greatest power among creatures you control.\n{T}: Add {G}{G}. You gain 2 life.\nWhenever a nontoken creature enters the battlefield under your control, put a +1/+1 counter on it and draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/torbran_thane_of_red_fell.txt b/forge-gui/res/cardsfolder/upcoming/torbran_thane_of_red_fell.txt new file mode 100644 index 00000000000..b22438badd9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/torbran_thane_of_red_fell.txt @@ -0,0 +1,9 @@ +Name:Torbran, Thane of Red Fell +ManaCost:1 R R R +Types:Legendary Creature Dwarf Noble +PT:2/4 +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.RedSource+YouCtrl | ValidTarget$ Player.Opponent,Permanent.OppCtrl | ReplaceWith$ DmgPlus2 | Description$ If a red source you control would deal damage to an opponent or a permanent an opponent controls, it deals that much damage plus 2 instead. +SVar:DmgPlus2:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X +SVar:X:ReplaceCount$DamageAmount/Plus.2 +SVar:PlayMain1:TRUE +Oracle:If a red source you control would deal damage to an opponent or a permanent an opponent controls, it deals that much damage plus 2 instead. diff --git a/forge-gui/res/cardsfolder/upcoming/unexplained_vision.txt b/forge-gui/res/cardsfolder/upcoming/unexplained_vision.txt new file mode 100644 index 00000000000..7f484b8a997 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/unexplained_vision.txt @@ -0,0 +1,7 @@ +Name:Unexplained Vision +ManaCost:4 U +Types:Sorcery +A:SP$ Draw | Cost$ 4 U | NumCards$ 3 | SubAbility$ DBScry | SpellDescription$ Draw three cards. Adamant — If at least three blue mana was spent to cast this spell, scry 3. +SVar:DBScry:DB$ Scry | ScryNum$ 3 | ConditionCheckSVar$ X | References$ X +SVar:X:Count$Adamant.Blue.1.0 +Oracle:Draw three cards.\nAdamant — If at least three blue mana was spent to cast this spell, scry 3. From a90b6033b04e16e9a74c543163df91314a946805 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 19 Sep 2019 10:54:34 +0000 Subject: [PATCH 14/30] TriggerHandler: fix Dieharmonicon with new TriggerKeys --- .../src/main/java/forge/game/trigger/TriggerHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 87d51dc130d..cf2f159ae65 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -735,8 +735,8 @@ public class TriggerHandler { } } else if (kw.startsWith("Dieharmonicon")) { // 700.4. The term dies means "is put into a graveyard from the battlefield." - if (runParams.get(AbilityKey.Destination) instanceof String) { - final String origin = (String) runParams.get(AbilityKey.Destination); + if (runParams.get(AbilityKey.Origin) instanceof String) { + final String origin = (String) runParams.get(AbilityKey.Origin); if ("Battlefield".equals(origin) && runParams.get(AbilityKey.Destination) instanceof String) { final String dest = (String) runParams.get(AbilityKey.Destination); if ("Graveyard".equals(dest) && runParams.get(AbilityKey.Card) instanceof Card) { From 42aa6f0eb36bc94d3daa08457fe862737da7d268 Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 19 Sep 2019 19:08:09 +0800 Subject: [PATCH 15/30] More forgescribed cards --- forge-gui/res/cardsfolder/upcoming/rampart_smasher.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/sorcerers_broom.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/vantress_paladin.txt | 7 +++++++ 3 files changed, 21 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/rampart_smasher.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sorcerers_broom.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/vantress_paladin.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rampart_smasher.txt b/forge-gui/res/cardsfolder/upcoming/rampart_smasher.txt new file mode 100644 index 00000000000..dca21af2bcb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rampart_smasher.txt @@ -0,0 +1,6 @@ +Name:Rampart Smasher +ManaCost:R/G R/G R/G R/G +Types:Creature Giant +PT:5/5 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Knight,Creature.Wall | Description$ CARDNAME can't be blocked by Knights or Walls. +Oracle:Rampart Smasher can't be blocked by Knights or Walls. diff --git a/forge-gui/res/cardsfolder/upcoming/sorcerers_broom.txt b/forge-gui/res/cardsfolder/upcoming/sorcerers_broom.txt new file mode 100644 index 00000000000..94a6a2c8eea --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sorcerers_broom.txt @@ -0,0 +1,8 @@ +Name:Sorcerer's Broom +ManaCost:2 +Types:Artifact Creature Spirit +PT:2/1 +T:Mode$ Sacrificed | ValidCard$ Permanent.Other | Execute$ TrigCopy | TriggerZones$ Battlefield | ValidPlayer$ You | TriggerDescription$ Whenever you sacrifice another permanent, you may pay {3}. If you do, create a token that's a copy of CARDNAME. +SVar:TrigCopy:AB$ CopyPermanent | Cost$ 3 | Defined$ Self | NumCopies$ 1 +AI:RemoveDeck:All +Oracle:Whenever you sacrifice another permanent, you may pay {3}. If you do, create a token that's a copy of Sorcerer's Broom. diff --git a/forge-gui/res/cardsfolder/upcoming/vantress_paladin.txt b/forge-gui/res/cardsfolder/upcoming/vantress_paladin.txt new file mode 100644 index 00000000000..3b0476c39c0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vantress_paladin.txt @@ -0,0 +1,7 @@ +Name:Vantress Paladin +ManaCost:3 U +Types:Creature Human Knight +PT:2/2 +K:Flying +K:etbCounter:P1P1:1:Adamant$ Blue:Adamant — If at least three blue mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. +Oracle:Flying\nAdamant — If at least three blue mana was spent to cast this spell, Vantress Paladin enters the battlefield with a +1/+1 counter on it. From 80c6c2328949fb22542a2493213169394d944c6b Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 19 Sep 2019 20:57:49 +0800 Subject: [PATCH 16/30] Update ability text if it's not translated --- forge-game/src/main/java/forge/game/card/CardView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 19b1bfa52f8..53911856989 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -557,7 +557,7 @@ public class CardView extends GameEntityView { } tname = tname.isEmpty() ? state.getName() : tname; - toracle = toracle.isEmpty() ? state.getOracleText() : toracle; + if (isSplitCard()) { taltname = getAlternateState().getName(); taltoracle = getAlternateState().getOracleText(); @@ -572,7 +572,7 @@ public class CardView extends GameEntityView { sb.append(taltoracle); return sb.toString().trim(); } else { - return toracle; + return toracle.isEmpty() ? state.getOracleText() : toracle; } } From 904822eb78011b25ce41469d8141261d35b8b6f4 Mon Sep 17 00:00:00 2001 From: Dagin Svezek Date: Fri, 20 Sep 2019 05:37:35 +0000 Subject: [PATCH 17/30] german translation update & fix some typos --- forge-gui/res/languages/de-DE.properties | 26 ++++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 994f8550aed..4a84d50e47a 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -179,8 +179,8 @@ KeyboardShortcuts=Tastenkombinationen lblAchievements=Errungenschaften # VSubmenuDownloaders.java btnDownloadSetPics=Bilder(LQ) Sets herunterladen -btnDownloadPicsHQ=Bilder(HQ Karten herunterladen (Sehr langsam!) btnDownloadPics=Bilder(LQ) Karten herunterladen +btnDownloadPicsHQ=Bilder(HQ) Karten herunterladen (Sehr langsam!) btnDownloadQuestImages=Bilder für Quests herunterladen btnDownloadAchievementImages=Bilder für Erfolge herunterladen btnReportBug=Einen Fehler melden @@ -389,7 +389,7 @@ lblVanguardDesc=Jeder Spieler hat eine eigene spielbeeinflussende \"Avatar\"-Kar lblCommander=Commander lblCommanderDesc=Jeder Spieler hat eine legendäre \"General\"-Karte, welche (fast) jederzeit gespielt werden kann und die Farben des Decks bestimmt. lblOathbreaker=Eidbrecher -lblOathbreakerDesc=Jeder Spieler hat eine Plainswalker-Karte als seinen "Eidbrecher", welche jederzeit gespielt werdeb kann und die Farben des Decks festlegt. Jeder Spieler hat außerdem noch einnen "Signatur"-Spruch, welcher gespielt werden kann, solange der Eidbrecher im Spiel ist. +lblOathbreakerDesc=Jeder Spieler hat eine Planeswalker-Karte als seinen "Eidbrecher", welche jederzeit gespielt werden kann und die Farben des Decks festlegt. Jeder Spieler hat außerdem noch einen "Signatur"-Spruch, welcher gespielt werden kann, solange der Eidbrecher im Spiel ist. lblTinyLeaders=Kleine Anführer lblTinyLeadersDesc=Jeder Spieler hat eine legendäre \"General\"-Karte, welche (fast) jederzeit gespielt werden kann und die Farben des Decks bestimmt. Alle Karten haben umgewandelte Manakosten von max. 3. lblBrawl=Brawl @@ -528,7 +528,7 @@ lblConstructedDecks=Konstruierte Decks lblCommanderDecks=Commander Decks lblRandomCommanderDecks=Zufälliges Commander Deck lblRandomCommanderCard-basedDecks=Zufälliges Commander Deck (kartenbasiert) -lblOathbreakerDecks=Oathbreaker-Decks +lblOathbreakerDecks=Eidbrecher-Decks lblTinyLeadersDecks=Kleine-Anführer-Decks lblBrawlDecks=Brawl Decks lblSchemeDecks=Komplott-Decks @@ -796,7 +796,7 @@ lbltoplanardeck=zum Weltendeck lbltoconspiracydeck=zum Verschwörungsdeck lblMove=Verschieben #VDock.java -lblDock=Anhängen +lblDock=Symbolleiste lblViewDeckList=Zeige Deckliste lblRevertLayout=Layout zurücksetzen lblOpenLayout=Lade Layout @@ -849,8 +849,8 @@ ttbtnRandDeck5=Erzeugt konstuiertes Deck in fünf Farben lblCurrentDeck2=aktuelles Deck lblUntitled=Unbenannt #VPrompt.java -lblPrompt=Abfrage -lblGameSetup=Spielaufbau +lblPrompt=Meldungen +lblGameSetup=Spielvorbereitung #ColumnDef.java lblAIStatus=KI-Status lblCMC=UMK @@ -891,13 +891,13 @@ lblSettings=Einstellungen #SettingsPage.java lblAutomaticBugReports=Automatischer Fehlerbericht lblBattlefieldTextureFiltering=Texturenfilter Spielfeld -lblCompactListItems=kompakte Liste -lblCompactTabs=kompakte Tabs +lblCompactListItems=Kompakte Liste +lblCompactTabs=Kompakte Tabs lblCardOverlays=Karten-Overlays lblDisableCardEffect=Karten-"Effekt"-Anzeige abschalten lblDynamicBackgroundPlanechase=Weltenjagd dynamischer Hintergrund lblGameplayOptions=Spiel-Optionen -lblGeneralSettings=allgem. Einstellungen +lblGeneralSettings=Allgem. Einstellungen lblHotSeatMode=Hot-Seat-Modus lblLandscapeMode=Querformat lblLater=Später @@ -912,7 +912,7 @@ lblShowCardManaCostOverlays=Blende die Manakosten der Karten ein lblShowCardNameOverlays=Blende den Namen der Karten ein lblShowCardOverlays=Zeige Karten-Einblendungen an lblShowCardPTOverlays=Blende Stärke und Widerstand ein -lblShowMatchBackground=Zeige Duell hintergund an +lblShowMatchBackground=Zeige Duell-Hintergund an lblVibrateAfterLongPress=Vibieren nach langem Tastendruck lblVibrateWhenLosingLife=Vibrieren nach Lebenspunktverlust lblVibrationOptions=Vibrationsoptionen @@ -971,6 +971,6 @@ lblCatalog=Katalog lblCommanders=Komandeure lblOathbreakers=Eidbrecher #Forge.java -lblLoadingFonts=Loading fonts... -lblLoadingCardTranslations=Loading card translations... -lblFinishingStartup=Finishing startup... \ No newline at end of file +lblLoadingFonts=Lade Schriften... +lblLoadingCardTranslations=Lade Kartenübersetzungen... +lblFinishingStartup=Abschliessen... From dfeeff6e3b713f11ab62db5e5451ffea963af6cd Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 20 Sep 2019 20:29:41 +0800 Subject: [PATCH 18/30] More ELD cards --- .../res/cardsfolder/upcoming/bloodhaze_wolverine.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/fabled_passage.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/festive_funeral.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/foreboding_fruit.txt | 8 ++++++++ .../res/cardsfolder/upcoming/improbable_alliance.txt | 9 +++++++++ .../res/cardsfolder/upcoming/irencrag_pyromancer.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/locthwain_paladin.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/mad_ratter.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/mantle_of_tides.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt | 9 +++++++++ forge-gui/res/tokenscripts/r_1_1_dwarf.txt | 6 ++++++ 11 files changed, 84 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/bloodhaze_wolverine.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/fabled_passage.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/festive_funeral.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/foreboding_fruit.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/improbable_alliance.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/irencrag_pyromancer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/locthwain_paladin.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mad_ratter.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mantle_of_tides.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt create mode 100644 forge-gui/res/tokenscripts/r_1_1_dwarf.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bloodhaze_wolverine.txt b/forge-gui/res/cardsfolder/upcoming/bloodhaze_wolverine.txt new file mode 100644 index 00000000000..9acbdf89503 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bloodhaze_wolverine.txt @@ -0,0 +1,7 @@ +Name:Bloodhaze Wolverine +ManaCost:1 R +Types:Creature Wolverine +PT:2/1 +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you draw your second card each turn, CARDNAME gets +1/+1 and gains first strike until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | KW$ First Strike +Oracle:Whenever you draw your second card each turn, Bloodhaze Wolverine gets +1/+1 and gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/fabled_passage.txt b/forge-gui/res/cardsfolder/upcoming/fabled_passage.txt new file mode 100644 index 00000000000..0dd3dd1dba4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fabled_passage.txt @@ -0,0 +1,7 @@ +Name:Fabled Passage +ManaCost:no cost +Types:Land +A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | RememerChanged$ True | SubAbility$ DBUntap | SpellDescription$ Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. Then if you control four or more lands, untap that land. +SVar:DBUntap:DB$ Untap | Defined$ Remembered | ConditionPresent$ Land.YouCtrl | ConditionCompare$ GE4 | ConditionDescription$ If you control four or more lands, untap that land. | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:{T}, Sacrifice Fabled Passage: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. Then if you control four or more lands, untap that land. diff --git a/forge-gui/res/cardsfolder/upcoming/festive_funeral.txt b/forge-gui/res/cardsfolder/upcoming/festive_funeral.txt new file mode 100644 index 00000000000..cbf1ae394d0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/festive_funeral.txt @@ -0,0 +1,6 @@ +Name:Festive Funeral +ManaCost:4 B +Types:Instant +A:SP$ Pump | Cost$ 4 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | References$ X | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the number of cards in your graveyard. +SVar:X:Count$InYourYard +Oracle:Target creature gets -X/-X until end of turn, where X is the number of cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/foreboding_fruit.txt b/forge-gui/res/cardsfolder/upcoming/foreboding_fruit.txt new file mode 100644 index 00000000000..b0137c2de2b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/foreboding_fruit.txt @@ -0,0 +1,8 @@ +Name:Foreboding Fruit +ManaCost:2 B +Types:Sorcery +A:SP$ Draw | Cost$ 2 B | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SubAbility$ DBLoseLife | SpellDescription$ Target player draws two cards and loses 2 life. Adamant — If at least three black mana was spent to cast this spell, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 2 life.") +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2 | Defined$ Targeted | SubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld | References$ X +SVar:X:Count$Adamant.Black.1.0 +Oracle:Target player draws two cards and loses 2 life.\nAdamant — If at least three black mana was spent to cast this spell, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 2 life.") diff --git a/forge-gui/res/cardsfolder/upcoming/improbable_alliance.txt b/forge-gui/res/cardsfolder/upcoming/improbable_alliance.txt new file mode 100644 index 00000000000..d202d4c64dc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/improbable_alliance.txt @@ -0,0 +1,9 @@ +Name:Improbable Alliance +ManaCost:U R +Types:Enchantment +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you draw your second card each turn, create a 1/1 blue Faerie creature token with flying. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_1_1_faerie_flying | TokenOwner$ You | LegacyImage$ u 1 1 faerie flying eld +A:AB$ Draw | Cost$ 4 U R | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +AI:RemoveDeck:All +Oracle:Whenever you draw your second card each turn, create a 1/1 blue Faerie creature token with flying.\n{4}{U}{R}: Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/upcoming/irencrag_pyromancer.txt b/forge-gui/res/cardsfolder/upcoming/irencrag_pyromancer.txt new file mode 100644 index 00000000000..6559ba57551 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/irencrag_pyromancer.txt @@ -0,0 +1,8 @@ +Name:Irencrag Pyromancer +ManaCost:2 R +Types:Creature Human Wizard +PT:0/4 +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever you draw your second card each turn, CARDNAME deals 3 damage to any target. +SVar:TrigDmg:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 +AI:RemoveDeck:Random +Oracle:Whenever you draw your second card each turn, Irencrag Pyromancer deals 3 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/locthwain_paladin.txt b/forge-gui/res/cardsfolder/upcoming/locthwain_paladin.txt new file mode 100644 index 00000000000..e9e5f59d791 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/locthwain_paladin.txt @@ -0,0 +1,7 @@ +Name:Locthwain Paladin +ManaCost:3 B +Types:Creature Human Knight +PT:3/2 +K:Menace +K:etbCounter:P1P1:1:Adamant$ Black:Adamant — If at least three black mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. +Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nAdamant — If at least three black mana was spent to cast this spell, Locthwain Paladin enters the battlefield with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/mad_ratter.txt b/forge-gui/res/cardsfolder/upcoming/mad_ratter.txt new file mode 100644 index 00000000000..dc66876f36f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mad_ratter.txt @@ -0,0 +1,8 @@ +Name:Mad Ratter +ManaCost:3 R +Types:Creature Goblin +PT:1/2 +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you draw your second card each turn, create two 1/1 black Rat creature tokens. +SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ b_1_1_rat | TokenOwner$ You | LegacyImage$ b 1 1 rat eld +SVar:PlayMain1:TRUE +Oracle:Whenever you draw your second card each turn, create two 1/1 black Rat creature tokens. diff --git a/forge-gui/res/cardsfolder/upcoming/mantle_of_tides.txt b/forge-gui/res/cardsfolder/upcoming/mantle_of_tides.txt new file mode 100644 index 00000000000..28670bc5792 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mantle_of_tides.txt @@ -0,0 +1,9 @@ +Name:Mantle of Tides +ManaCost:U +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 2 | Description$ Equipped creature gets +1/+2. +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigAttach | TriggerDescription$ Whenever you draw your second card each turn, attach CARDNAME to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +SVar:PlayMain1:TRUE +K:Equip:3 +Oracle:Equipped creature gets +1/+2.\nWhenever you draw your second card each turn, attach Mantle of Tides to target creature you control.\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt b/forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt new file mode 100644 index 00000000000..f4f7e149b61 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt @@ -0,0 +1,9 @@ +Name:Mystic Sanctuary +ManaCost:no cost +Types:Land Island +R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Islands. +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Island.YouCtrl+Other | ConditionCompare$ LT3 | SubAbility$ MoveToPlay +SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put target instant or sorcery card from your graveyard on top of your library. +SVar:TrigChange:DB$ ChangeZone | TgtPrompt$ Choose target instant or sorcery card in your graveyard | ValidTgts$ Instant.YouOwn,Sorcery.YouOwn | Origin$ Graveyard | Destination$ Library +Oracle:({T}: Add {U}.)\nMystic Sanctuary enters the battlefield tapped unless you control three or more other Islands.\nWhen Mystic Sanctuary enters the battlefield untapped, you may put target instant or sorcery card from your graveyard on top of your library. diff --git a/forge-gui/res/tokenscripts/r_1_1_dwarf.txt b/forge-gui/res/tokenscripts/r_1_1_dwarf.txt new file mode 100644 index 00000000000..f6ff5776ddf --- /dev/null +++ b/forge-gui/res/tokenscripts/r_1_1_dwarf.txt @@ -0,0 +1,6 @@ +Name:Dwarf +ManaCost:no cost +Types:Creature Dwarf +Colors:red +PT:1/1 +Oracle: From e07504a55e5ba6ab1eb172550db01af47b84c3b8 Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 20 Sep 2019 20:37:06 +0800 Subject: [PATCH 19/30] Update 3 scripts --- forge-gui/res/cardsfolder/upcoming/idyllic_grange.txt | 3 +-- forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt | 2 +- forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/idyllic_grange.txt b/forge-gui/res/cardsfolder/upcoming/idyllic_grange.txt index bb0830870b0..41d7e14ea13 100644 --- a/forge-gui/res/cardsfolder/upcoming/idyllic_grange.txt +++ b/forge-gui/res/cardsfolder/upcoming/idyllic_grange.txt @@ -2,9 +2,8 @@ Name:Idyllic Grange ManaCost:no cost Types:Land Plains R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Plains. -SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LT3 | References$ ETBCheckSVar | SubAbility$ MoveToPlay +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Plains.YouCtrl+Other | ConditionCompare$ LT3 | SubAbility$ MoveToPlay SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield -SVar:ETBCheckSVar:Count$Valid Plains.YouCtrl+Other T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+untapped | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield untapped, put a +1/+1 counter on target creature you control. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 Oracle:({T}: Add {W}.)\nIdyllic Grange enters the battlefield tapped unless you control three or more other Plains.\nWhen Idyllic Grange enters the battlefield untapped, put a +1/+1 counter on target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt b/forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt index f4f7e149b61..ceb98944205 100644 --- a/forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt +++ b/forge-gui/res/cardsfolder/upcoming/mystic_sanctuary.txt @@ -4,6 +4,6 @@ Types:Land Island R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Islands. SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Island.YouCtrl+Other | ConditionCompare$ LT3 | SubAbility$ MoveToPlay SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put target instant or sorcery card from your graveyard on top of your library. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+untapped | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put target instant or sorcery card from your graveyard on top of your library. SVar:TrigChange:DB$ ChangeZone | TgtPrompt$ Choose target instant or sorcery card in your graveyard | ValidTgts$ Instant.YouOwn,Sorcery.YouOwn | Origin$ Graveyard | Destination$ Library Oracle:({T}: Add {U}.)\nMystic Sanctuary enters the battlefield tapped unless you control three or more other Islands.\nWhen Mystic Sanctuary enters the battlefield untapped, you may put target instant or sorcery card from your graveyard on top of your library. diff --git a/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt b/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt index f961ea09bbd..4fd8616f7a5 100644 --- a/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt +++ b/forge-gui/res/cardsfolder/upcoming/witchs_cottage.txt @@ -2,9 +2,8 @@ Name:Witch's Cottage ManaCost:no cost Types:Land Swamp R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Swamps. -SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LT3 | References$ ETBCheckSVar | SubAbility$ MoveToPlay +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Swamp.YouCtrl+Other | ConditionCompare$ LT3 | SubAbility$ MoveToPlay SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield -SVar:ETBCheckSVar:Count$Valid Swamp.YouCtrl+Other T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+untapped | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield untapped, you may put target creature card from your graveyard on top of your library. SVar:TrigChange:DB$ ChangeZone | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | Origin$ Graveyard | Destination$ Library Oracle:({T}: Add {B}.)\nWitch's Cottage enters the battlefield tapped unless you control three or more other Swamps.\nWhen Witch's Cottage enters the battlefield untapped, you may put target creature card from your graveyard on top of your library. From 96c840eebeee35efe9051e3dd67b002d3ef48490 Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 20 Sep 2019 20:54:16 +0800 Subject: [PATCH 20/30] More ELD cards --- .../cardsfolder/upcoming/return_of_the_wildspeaker.txt | 8 ++++++++ .../res/cardsfolder/upcoming/rosethorn_halberd.txt | 8 ++++++++ .../res/cardsfolder/upcoming/sage_of_the_falls.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/so_tiny.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/steelgaze_griffin.txt | 9 +++++++++ .../res/cardsfolder/upcoming/thrill_of_possibility.txt | 7 +++++++ 6 files changed, 51 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/return_of_the_wildspeaker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rosethorn_halberd.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sage_of_the_falls.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/so_tiny.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/steelgaze_griffin.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thrill_of_possibility.txt diff --git a/forge-gui/res/cardsfolder/upcoming/return_of_the_wildspeaker.txt b/forge-gui/res/cardsfolder/upcoming/return_of_the_wildspeaker.txt new file mode 100644 index 00000000000..25e67135c63 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/return_of_the_wildspeaker.txt @@ -0,0 +1,8 @@ +Name:Return of the Wildspeaker +ManaCost:4 G +Types:Instant +A:SP$ Charm | Cost$ 4 G | Choices$ DBDraw,DBPumpAll +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | References$ X | SpellDescription$ Draw cards equal to the greatest power among non-Human creatures you control. +SVar:X:Count$GreatestPower_Creature.YouCtrl+nonHuman +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl+nonHuman | NumAtt$ 3 | NumDef$ 3 | SpellDescription$ Non-Human creatures you control get +3/+3 until end of turn. +Oracle:Choose one —\n• Draw cards equal to the greatest power among non-Human creatures you control.\n• Non-Human creatures you control get +3/+3 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/rosethorn_halberd.txt b/forge-gui/res/cardsfolder/upcoming/rosethorn_halberd.txt new file mode 100644 index 00000000000..9d5682f0fb4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rosethorn_halberd.txt @@ -0,0 +1,8 @@ +Name:Rosethorn Halberd +ManaCost:G +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target non-Human creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.nonHuman+YouCtrl | TgtPrompt$ Select target non-Human creature you control +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 1 | Description$ Equipped creature gets +2/+1. +K:Equip:5 +Oracle:When Rosethorn Halberd enters the battlefield, attach it to target non-Human creature you control.\nEquipped creature gets +2/+1.\nEquip {5} ({5}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/sage_of_the_falls.txt b/forge-gui/res/cardsfolder/upcoming/sage_of_the_falls.txt new file mode 100644 index 00000000000..ab70f78266d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sage_of_the_falls.txt @@ -0,0 +1,9 @@ +Name:Sage of the Falls +ManaCost:4 U +Types:Creature Merfolk Wizard +PT:2/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME or another non-Human creature enters the battlefield under you control, you may draw a card. If you do, discard a card. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonHuman+Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoot | OptionalDecider$ You | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another non-Human creature enters the battlefield under you control, you may draw a card. If you do, discard a card. +SVar:TrigLoot:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +Oracle:Whenever Sage of the Falls or another non-Human creature enters the battlefield under you control, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/upcoming/so_tiny.txt b/forge-gui/res/cardsfolder/upcoming/so_tiny.txt new file mode 100644 index 00000000000..8c4560df64b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/so_tiny.txt @@ -0,0 +1,10 @@ +Name:So Tiny +ManaCost:U +Types:Enchantment Aura +K:Flash +K:Enchant creature +A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -X | References$ X,Y | Description$ Enchanted creature gets -2/-0. It gets -6/-0 instead as long as its controller has seven or more cards in their graveyard. +SVar:X:Count$Compare Y GE7.6.2 +SVar:Y:Count$ValidGraveyard Card.EnchantedControllerCtrl +Oracle:Flash\nEnchant creature\nEnchanted creature gets -2/-0. It gets -6/-0 instead as long as its controller has seven or more cards in their graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/steelgaze_griffin.txt b/forge-gui/res/cardsfolder/upcoming/steelgaze_griffin.txt new file mode 100644 index 00000000000..0b46be76958 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/steelgaze_griffin.txt @@ -0,0 +1,9 @@ +Name:Steelgaze Griffin +ManaCost:4 U +Types:Creature Griffin +PT:2/4 +K:Flying +T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ When you draw your second card each turn, CARDNAME gets +2/+0 until end of turn. +SVar:TrigPump:DB$ Pump | NumAtt$ +2 | NumDef$ +0 | Defined$ Self +SVar:PlayMain1:TRUE +Oracle:Flying\nWhen you draw your second card each turn, Steelgaze Griffin gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/thrill_of_possibility.txt b/forge-gui/res/cardsfolder/upcoming/thrill_of_possibility.txt new file mode 100644 index 00000000000..3536b7d3689 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thrill_of_possibility.txt @@ -0,0 +1,7 @@ +Name:Thrill of Possibility +ManaCost:1 R +Types:Instant +A:SP$ Draw | Cost$ 1 R Discard<1/Card> | Defined$ You | NumCards$ 2 | SpellDescription$ Draw two cards. +DeckHas:Ability$Discard +DeckHints:Keyword$Madness & Ability$Delirium +Oracle:As an additional cost to cast this spell, discard a card.\nDraw two cards. From cb18c226496c177870357e694f7251f1e412a809 Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 20 Sep 2019 21:29:36 +0800 Subject: [PATCH 21/30] Add Hushbringer --- .../src/main/java/forge/game/GlobalRuleChange.java | 1 + .../java/forge/game/trigger/TriggerHandler.java | 14 ++++++++++++++ forge-gui/res/cardsfolder/upcoming/hushbringer.txt | 10 ++++++++++ 3 files changed, 25 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/hushbringer.txt diff --git a/forge-game/src/main/java/forge/game/GlobalRuleChange.java b/forge-game/src/main/java/forge/game/GlobalRuleChange.java index 2e7fc2ca2ab..3eb37542dcf 100644 --- a/forge-game/src/main/java/forge/game/GlobalRuleChange.java +++ b/forge-game/src/main/java/forge/game/GlobalRuleChange.java @@ -27,6 +27,7 @@ public enum GlobalRuleChange { manapoolsDontEmpty ("Mana pools don't empty as steps and phases end."), noCycling ("Players can't cycle cards."), noCreatureETBTriggers ("Creatures entering the battlefield don't cause abilities to trigger."), + noCreatureDyingTriggers ("Creatures dying don't cause abilities to trigger."), noLegendRule ("The legend rule doesn't apply."), noPrevention ("Damage can't be prevented."), /* onlyOneAttackerATurn ("No more than one creature can attack each turn."), */ diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index cf2f159ae65..39bb51ff6af 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -541,6 +541,20 @@ public class TriggerHandler { } } } // Torpor Orb check + + if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noCreatureDyingTriggers) + && !regtrig.isStatic() && mode.equals(TriggerType.ChangesZone)) { + if (runParams.get(AbilityKey.Destination) instanceof String && runParams.get(AbilityKey.Origin) instanceof String) { + final String dest = (String) runParams.get(AbilityKey.Destination); + final String origin = (String) runParams.get(AbilityKey.Origin); + if (dest.equals("Graveyard") && origin.equals("Battlefield") && runParams.get(AbilityKey.Card) instanceof Card) { + final Card card = (Card) runParams.get(AbilityKey.Card); + if (card.isCreature()) { + return false; + } + } + } + } return true; } diff --git a/forge-gui/res/cardsfolder/upcoming/hushbringer.txt b/forge-gui/res/cardsfolder/upcoming/hushbringer.txt new file mode 100644 index 00000000000..3fc0204661c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hushbringer.txt @@ -0,0 +1,10 @@ +Name:Hushbringer +ManaCost:1 W +Types:Creature Faerie +PT:1/2 +K:Flying +K:Lifelink +S:Mode$ Continuous | GlobalRule$ Creatures entering the battlefield don't cause abilities to trigger. | Description$ Creatures entering the battlefield or dying don't cause abilities to trigger. +S:Mode$ Continuous | GlobalRule$ Creatures dying don't cause abilities to trigger. | Secondary$ True | Description$ Creatures entering the battlefield or dying don't cause abilities to trigger. +AI:RemoveDeck:Random +Oracle:Flying, lifelink\nCreatures entering the battlefield or dying don't cause abilities to trigger. From 0c354e8a704a09461988923ebeff6e0541ad2aaa Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 8 Sep 2019 09:30:48 +0200 Subject: [PATCH 22/30] Adventure: add Logic to cast as Spell --- .../main/java/forge/card/CardSplitType.java | 3 +- .../main/java/forge/card/CardStateName.java | 1 + .../src/main/java/forge/game/GameAction.java | 4 ++ .../main/java/forge/game/GameActionUtil.java | 14 ++++++ .../src/main/java/forge/game/card/Card.java | 48 ++++++++++++++++--- .../java/forge/game/card/CardFactory.java | 9 +++- .../java/forge/game/card/CardFactoryUtil.java | 26 ++++++++++ .../forge/game/spellability/SpellAbility.java | 7 +++ .../foulmire_knight_profane_insight.txt | 16 +++++++ 9 files changed, 120 insertions(+), 8 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/foulmire_knight_profane_insight.txt diff --git a/forge-core/src/main/java/forge/card/CardSplitType.java b/forge-core/src/main/java/forge/card/CardSplitType.java index a949ec8b975..f1e53ed0898 100644 --- a/forge-core/src/main/java/forge/card/CardSplitType.java +++ b/forge-core/src/main/java/forge/card/CardSplitType.java @@ -8,7 +8,8 @@ public enum CardSplitType Transform(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Transformed), Meld(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Meld), Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit), - Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped); + Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped), + Adventure(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Adventure); CardSplitType(FaceSelectionMethod calcMode, CardStateName stateName) { method = calcMode; diff --git a/forge-core/src/main/java/forge/card/CardStateName.java b/forge-core/src/main/java/forge/card/CardStateName.java index b7333a7de23..70b857dc5c8 100644 --- a/forge-core/src/main/java/forge/card/CardStateName.java +++ b/forge-core/src/main/java/forge/card/CardStateName.java @@ -9,6 +9,7 @@ public enum CardStateName { Meld, LeftSplit, RightSplit, + Adventure, ; diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 908f2bc678e..d45c5794e99 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -146,6 +146,10 @@ public class GameAction { } } + // if an adventureCard is put from Stack somewhere else, need to reset to Original State + if (c.isAdventureCard() && (zoneFrom.is(ZoneType.Stack) || !zoneTo.is(ZoneType.Stack))) { + c.setState(CardStateName.Original, true); + } // Clean up the temporary Dash SVar when the Dashed card leaves the battlefield // Clean up the temporary AtEOT SVar diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index e425d2fff6e..5db2ff403e6 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -22,6 +22,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import forge.card.CardStateName; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostParser; import forge.game.ability.AbilityUtils; @@ -101,6 +102,19 @@ public final class GameActionUtil { } source.turnFaceDownNoUpdate(); lkicheck = true; + } else if (sa.isAdventure() && !source.isInZone(ZoneType.Battlefield)) { + if (!source.isLKI()) { + source = CardUtil.getLKICopy(source); + } + // need way to copy adventure state + if (!source.hasState(CardStateName.Adventure)) { + source.addAlternateState(CardStateName.Adventure, false); + source.getState(CardStateName.Adventure).copyFrom( + sa.getHostCard().getState(CardStateName.Adventure), true); + } + + source.setState(CardStateName.Adventure, false); + lkicheck = true; } if (lkicheck) { diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 99ecc3df0ea..3e16bf717b3 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -351,9 +351,12 @@ public class Card extends GameEntity implements Comparable { else if (isDoubleFaced() && currentStateName != CardStateName.Transformed) { return CardStateName.Transformed; } - else if (this.isMeldable() && currentStateName != CardStateName.Meld) { + else if (isMeldable() && currentStateName != CardStateName.Meld) { return CardStateName.Meld; } + else if (this.isAdventureCard() && currentStateName != CardStateName.Adventure) { + return CardStateName.Adventure; + } else { return CardStateName.Original; } @@ -803,6 +806,10 @@ public class Card extends GameEntity implements Comparable { return getRules() != null && getRules().getSplitType() == CardSplitType.Split; } + public final boolean isAdventureCard() { + return getRules() != null && getRules().getSplitType() == CardSplitType.Adventure; + } + public final boolean isBackSide() { return backside; } @@ -1989,7 +1996,19 @@ public class Card extends GameEntity implements Comparable { continue; } - final String sAbility = formatSpellAbility(sa); + String sAbility = formatSpellAbility(sa); + + // add Adventure to AbilityText + if (sa.isAdventure() && state.getView().getState().equals(CardStateName.Original)) { + StringBuilder sbSA = new StringBuilder(); + sbSA.append("Adventure ").append(getState(CardStateName.Adventure).getName()); + if (sa.getPayCosts() != null) { + sbSA.append(" ").append(sa.getPayCosts().toSimpleString()); + } + sbSA.append(": "); + sbSA.append(sAbility); + sAbility = sbSA.toString(); + } if (sa.getManaPart() != null) { if (addedManaStrings.contains(sAbility)) { @@ -2397,10 +2416,21 @@ public class Card extends GameEntity implements Comparable { // add Facedown abilities from Original state but only if this state is face down // need CardStateView#getState or might crash in StackOverflow - if ((mana == null || mana == false) && isFaceDown() && state.getView().getState() == CardStateName.FaceDown) { - for (SpellAbility sa : getState(CardStateName.Original).getNonManaAbilities()) { - if (sa.isManifestUp() || sa.isMorphUp()) { - list.add(sa); + if (isInZone(ZoneType.Battlefield)) { + if ((mana == null || mana == false) && isFaceDown() && state.getView().getState() == CardStateName.FaceDown) { + for (SpellAbility sa : getState(CardStateName.Original).getNonManaAbilities()) { + if (sa.isManifestUp() || sa.isMorphUp()) { + list.add(sa); + } + } + } + } else { + // Adenture may only be cast not from Battlefield + if (isAdventureCard() && state.getView().getState() == CardStateName.Original) { + for (SpellAbility sa : getState(CardStateName.Adventure).getSpellAbilities()) { + if (mana == null || mana == sa.isManaAbility()) { + list.add(sa); + } } } } @@ -5731,6 +5761,12 @@ public class Card extends GameEntity implements Comparable { } public void setSplitStateToPlayAbility(final SpellAbility sa) { + if (isAdventureCard()) { + if (sa.isAdventure()) { + setState(CardStateName.Adventure, true); + } + return; + } if (!isSplitCard()) { return; // just in case } diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 98dab46962d..115f53982e2 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -305,6 +305,11 @@ public class CardFactory { } else if (c.isMeldable() && cp instanceof PaperCard) { c.setState(CardStateName.Meld, false); c.setImageKey(cp.getImageKey(true)); + } else if (c.isAdventureCard()) { + c.setState(CardStateName.Adventure, false); + c.setImageKey(originalPicture); + c.setSetCode(cp.getEdition()); + c.setRarity(cp.getRarity()); } c.setSetCode(cp.getEdition()); @@ -325,7 +330,6 @@ public class CardFactory { // ****************************************************************** // ************** Link to different CardFactories ******************* - if (state == CardStateName.LeftSplit || state == CardStateName.RightSplit) { for (final SpellAbility sa : card.getSpellAbilities()) { if (state == CardStateName.LeftSplit) { @@ -342,6 +346,9 @@ public class CardFactory { } else if (state != CardStateName.Original){ CardFactoryUtil.setupKeywordedAbilities(card); } + if (state == CardStateName.Adventure) { + CardFactoryUtil.setupAdventureAbility(card); + } } card.setState(CardStateName.Original, false); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 829f0979785..4ef2afa3fee 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -4738,4 +4738,30 @@ public class CardFactoryUtil { } return byClause + StringUtils.join(orClauses, " or ") + "."; } + + public static void setupAdventureAbility(Card card) { + if (card.getCurrentStateName() != CardStateName.Adventure) { + return; + } + SpellAbility sa = card.getFirstSpellAbility(); + if (sa == null) { + return; + } + sa.setAdventure(true); + + String abExile = "DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile | StackDescription$ None"; + + AbilitySub saExile = (AbilitySub)AbilityFactory.getAbility(abExile, card); + + String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ExileOnMoved$ Exile"; + AbilitySub saEffect = (AbilitySub)AbilityFactory.getAbility(abEffect, card); + + StringBuilder sb = new StringBuilder(); + sb.append("Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonAdventure"); + sb.append(" | AffectedZone$ Exile | Description$ You may cast the card."); + saEffect.setSVar("Play", sb.toString()); + + saExile.setSubAbility(saEffect); + sa.appendSubAbility(saExile); + } } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index fb7c64c7d80..65a653a4e66 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -118,6 +118,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private boolean basicLandAbility = false; + private boolean adventure = false; private SplitSide splitSide = null; enum SplitSide { LEFT, RIGHT } @@ -852,6 +853,12 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public void setRightSplit() { splitSide = SplitSide.RIGHT; } + public boolean isAdventure() { + return this.adventure; + } + public void setAdventure(boolean adventure) { + this.adventure = adventure; + } public SpellAbility copy() { return copy(hostCard, false); diff --git a/forge-gui/res/cardsfolder/upcoming/foulmire_knight_profane_insight.txt b/forge-gui/res/cardsfolder/upcoming/foulmire_knight_profane_insight.txt new file mode 100644 index 00000000000..7965754d32f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/foulmire_knight_profane_insight.txt @@ -0,0 +1,16 @@ +Name:Foulmire Knight +ManaCost:B +Types:Creature Zombie Knight +PT:1/1 +K:Deathtouch +Oracle:Deathtouch +AlternateMode:Adventure + +ALTERNATE + +Name:Profane Insight +ManaCost:2 B +Types:Instant Adventure +A:SP$ Draw | Cost$ 2 B | Defined$ You | NumCards$ 1 | SubAbility$ DBLoseLife | SpellDescription$ You draw a card and you lose 1 life. +SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 1 +Oracle:You draw a card and you lose 1 life. From 378d0e26ab0616d9f147fdf1a85dd5f8b37d5a12 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 8 Sep 2019 23:40:56 +0200 Subject: [PATCH 23/30] Adventure: add - separator --- forge-game/src/main/java/forge/game/card/Card.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 3e16bf717b3..a2d5ef9ff22 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2001,7 +2001,7 @@ public class Card extends GameEntity implements Comparable { // add Adventure to AbilityText if (sa.isAdventure() && state.getView().getState().equals(CardStateName.Original)) { StringBuilder sbSA = new StringBuilder(); - sbSA.append("Adventure ").append(getState(CardStateName.Adventure).getName()); + sbSA.append("Adventure — ").append(getState(CardStateName.Adventure).getName()); if (sa.getPayCosts() != null) { sbSA.append(" ").append(sa.getPayCosts().toSimpleString()); } From 94805103da02d55bce61eb8dfd7bfa3c6cff8e32 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 12 Sep 2019 08:15:00 +0000 Subject: [PATCH 24/30] Spell: add extra check for Adventure cards --- .../java/forge/game/spellability/Spell.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index b3761737538..0c41a3fc6b3 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -100,6 +100,10 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable if (card.isSplitCard()) { CardStateName name = isLeftSplit() ? CardStateName.LeftSplit : CardStateName.RightSplit; isInstant = card.getState(name).getType().isInstant(); + } else if (isAdventure()) { + if (card.hasState(CardStateName.Adventure)) { + isInstant = card.getState(CardStateName.Adventure).getType().isInstant(); + } } boolean lkicheck = false; @@ -130,6 +134,19 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable } card.turnFaceDownNoUpdate(); lkicheck = true; + } else if (isAdventure()) { + if (!card.isLKI()) { + card = CardUtil.getLKICopy(card); + } + // need way to copy adventure state + if (!card.hasState(CardStateName.Adventure)) { + card.addAlternateState(CardStateName.Adventure, false); + card.getState(CardStateName.Adventure).copyFrom( + getHostCard().getState(CardStateName.Adventure), true); + } + + card.setState(CardStateName.Adventure, false); + lkicheck = true; } From d9dd31b263126c9ab4b99a8658d89b55d2aa3662 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 13 Sep 2019 10:31:40 +0000 Subject: [PATCH 25/30] ELD: Animating Faerie --- .../upcoming/animating_faerie_bring_to_life.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/animating_faerie_bring_to_life.txt diff --git a/forge-gui/res/cardsfolder/upcoming/animating_faerie_bring_to_life.txt b/forge-gui/res/cardsfolder/upcoming/animating_faerie_bring_to_life.txt new file mode 100644 index 00000000000..c499d5251d5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/animating_faerie_bring_to_life.txt @@ -0,0 +1,16 @@ +Name:Animating Faerie +ManaCost:2 U +Types:Creature Faerie +PT:2/2 +K:Flying +Oracle:Flying +AlternateMode:Adventure + +ALTERNATE + +Name:Bring to Life +ManaCost:2 U +Types:Sorcery Adventure +A:SP$ Animate | Cost$ 2 U | ValidTgts$ Artifact.nonCreature+YouCtrl | TgtPrompt$ Select noncreature artifact | Power$ 0 | Toughness$ 0 | Types$ Artifact,Creature | RemoveCardTypes$ True | Permanent$ True | SubAbility$ DBPutCounter | SpellDescription$ Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on it. +SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 4 +Oracle:Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on it. \ No newline at end of file From 7a504bf3c851c6b22c94ac309b2b7704385ddcc4 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 13 Sep 2019 10:49:53 +0000 Subject: [PATCH 26/30] Update CardFactoryUtil.java --- forge-game/src/main/java/forge/game/card/CardFactoryUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 4ef2afa3fee..a4598259209 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -4753,7 +4753,7 @@ public class CardFactoryUtil { AbilitySub saExile = (AbilitySub)AbilityFactory.getAbility(abExile, card); - String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ExileOnMoved$ Exile"; + String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ExileOnMoved$ Exile | Duration$ Permanent"; AbilitySub saEffect = (AbilitySub)AbilityFactory.getAbility(abEffect, card); StringBuilder sb = new StringBuilder(); From feaa01f70cff338f31709e5ef3eee4badb3a7b13 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 13 Sep 2019 12:50:54 +0000 Subject: [PATCH 27/30] ELD: Merchant of the Vale --- .../upcoming/merchant_of_the_vale_haggle.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/merchant_of_the_vale_haggle.txt diff --git a/forge-gui/res/cardsfolder/upcoming/merchant_of_the_vale_haggle.txt b/forge-gui/res/cardsfolder/upcoming/merchant_of_the_vale_haggle.txt new file mode 100644 index 00000000000..e88a20025ec --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/merchant_of_the_vale_haggle.txt @@ -0,0 +1,17 @@ +Name:Merchant of the Vale +ManaCost:2 R +Types:Creature Human Peasant +PT:2/3 +A:AB$ Draw | Cost$ 2 R Discard<1/Card> | NumCards$ 1 | Defined$ You | SpellDescription$ Draw a card. +Oracle:{2}{R}, Discard a card: Draw a card. +AlternateMode:Adventure + +ALTERNATE + +Name:Haggle +ManaCost:R +Types:Instant Adventure +A:SP$ Discard | Cost$ R | NumCards$ 1 | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ You may discard a card. If you do, draw a card. +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:You may discard a card. If you do, draw a card. (Then exile this card. You may cast the creature later from exile.) \ No newline at end of file From 1e7ed8452214c001abaaeb51bc8ecc52e7ce566a Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 15 Sep 2019 17:55:05 +0200 Subject: [PATCH 28/30] CardProperty: add AdventureCard for Creature with adventure --- .../src/main/java/forge/game/card/CardProperty.java | 4 ++++ forge-gui/res/cardsfolder/upcoming/edgewall_innkeeper.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/wandermare.txt | 8 ++++++++ 3 files changed, 19 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/edgewall_innkeeper.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wandermare.txt diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 3a2969c98eb..73cccee915e 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -107,6 +107,10 @@ public class CardProperty { if (card.isSplitCard()) { return false; } + } else if (property.equals("AdventureCard")) { + if (!card.isAdventureCard()) { + return false; + } } else if (property.startsWith("leftcmc") || property.startsWith("rightcmc")) { int x; int y = 0; diff --git a/forge-gui/res/cardsfolder/upcoming/edgewall_innkeeper.txt b/forge-gui/res/cardsfolder/upcoming/edgewall_innkeeper.txt new file mode 100644 index 00000000000..db027f357e7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/edgewall_innkeeper.txt @@ -0,0 +1,7 @@ +Name:Edgewall Innkeeper +ManaCost:G +Types:Creature Human Peasant +PT:1/1 +T:Mode$ SpellCast | ValidCard$ Creature.AdventureCard | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell that has an Adventure, draw a card. +SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 +Oracle:Whenever you cast a creature spell that has an Adventure, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/wandermare.txt b/forge-gui/res/cardsfolder/upcoming/wandermare.txt new file mode 100644 index 00000000000..75c4b295306 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wandermare.txt @@ -0,0 +1,8 @@ +Name:Wandermare +ManaCost:1 G W +Types:Creature Horse +PT:3/3 +T:Mode$ SpellCast | ValidCard$ Creature.AdventureCard | ValidActivatingPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell that has an Adventure, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters +Oracle:Whenever you cast a creature spell that has an Adventure, put a +1/+1 counter on Wandermare. (It doesn’t need to have gone on the adventure first.) From b7b1c3a4370433cd5ae2af9ac7e56d59ebed9e65 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Fri, 20 Sep 2019 16:20:35 +0200 Subject: [PATCH 29/30] As Foretold: fix the cmc check --- .../main/java/forge/game/GameActionUtil.java | 46 +++++++++++++------ .../java/forge/game/card/CardProperty.java | 22 --------- forge-gui/res/cardsfolder/a/as_foretold.txt | 4 +- 3 files changed, 33 insertions(+), 39 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 5db2ff403e6..be395f2f6d2 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -114,6 +114,38 @@ public final class GameActionUtil { } source.setState(CardStateName.Adventure, false); + + // need to reset CMC + source.setLKICMC(-1); + source.setLKICMC(source.getCMC()); + lkicheck = true; + } else if (source.isSplitCard() && (sa.isLeftSplit() || sa.isRightSplit())) { + if (!source.isLKI()) { + source = CardUtil.getLKICopy(source); + } + if (sa.isLeftSplit()) { + if (!source.hasState(CardStateName.LeftSplit)) { + source.addAlternateState(CardStateName.LeftSplit, false); + source.getState(CardStateName.LeftSplit).copyFrom( + sa.getHostCard().getState(CardStateName.LeftSplit), true); + } + + source.setState(CardStateName.LeftSplit, false); + } + + if (sa.isRightSplit()) { + if (!source.hasState(CardStateName.RightSplit)) { + source.addAlternateState(CardStateName.RightSplit, false); + source.getState(CardStateName.RightSplit).copyFrom( + sa.getHostCard().getState(CardStateName.RightSplit), true); + } + + source.setState(CardStateName.RightSplit, false); + } + + // need to reset CMC + source.setLKICMC(-1); + source.setLKICMC(source.getCMC()); lkicheck = true; } @@ -146,20 +178,6 @@ public final class GameActionUtil { newSA = sa.copyWithManaCostReplaced(activator, o.getAltManaCost()); newSA.setBasicSpell(false); changedManaCost = true; - if (host.hasSVar("AsForetoldSplitCMCHack")) { - // TODO: This is a temporary workaround for As Foretold interaction with split cards, better solution needed. - if (sa.isLeftSplit()) { - int leftCMC = sa.getHostCard().getCMC(Card.SplitCMCMode.LeftSplitCMC); - if (leftCMC > host.getCounters(CounterType.TIME)) { - continue; - } - } else if (sa.isRightSplit()) { - int rightCMC = sa.getHostCard().getCMC(Card.SplitCMCMode.RightSplitCMC); - if (rightCMC > host.getCounters(CounterType.TIME)) { - continue; - } - } - } } else { newSA = sa.copy(activator); } diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 73cccee915e..34674f9c52f 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -111,28 +111,6 @@ public class CardProperty { if (!card.isAdventureCard()) { return false; } - } else if (property.startsWith("leftcmc") || property.startsWith("rightcmc")) { - int x; - int y = 0; - String rhs = ""; - - if (property.startsWith("leftcmc")) { - rhs = property.substring(9); - y = card.getCMC(Card.SplitCMCMode.LeftSplitCMC); - } else if (property.startsWith("rightcmc")) { - rhs = property.substring(10); - y = card.getCMC(Card.SplitCMCMode.RightSplitCMC); - } - - try { - x = Integer.parseInt(rhs); - } catch (final NumberFormatException e) { - x = AbilityUtils.calculateAmount(source, rhs, spellAbility); - } - - if (!Expressions.compare(y, property, x)) { - return false; - } } else if (property.startsWith("YouCtrl")) { if (!controller.equals(sourceController)) { return false; diff --git a/forge-gui/res/cardsfolder/a/as_foretold.txt b/forge-gui/res/cardsfolder/a/as_foretold.txt index cfc3e86bd67..b282a3d18af 100644 --- a/forge-gui/res/cardsfolder/a/as_foretold.txt +++ b/forge-gui/res/cardsfolder/a/as_foretold.txt @@ -3,9 +3,7 @@ ManaCost:2 U Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a time counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ TIME | CounterNum$ 1 -S:Mode$ Continuous | MayPlay$ True | MayPlayAltManaCost$ 0 | MayPlayLimit$ 1 | MayPlayDontGrantZonePermissions$ True | Affected$ Card.YouCtrl+NotSplit+nonLand+cmcLEX | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Description$ Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast with converted mana cost X or less, where X is the number of time counters on CARDNAME. -S:Mode$ Continuous | MayPlay$ True | MayPlayAltManaCost$ 0 | MayPlayLimit$ 1 | MayPlayDontGrantZonePermissions$ True | Affected$ Card.YouCtrl+Split+nonLand+leftcmcLEX,Card.YouCtrl+Split+nonLand+rightcmcLEX | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Secondary$ True +S:Mode$ Continuous | MayPlay$ True | MayPlayAltManaCost$ 0 | MayPlayLimit$ 1 | MayPlayDontGrantZonePermissions$ True | Affected$ Card.YouCtrl+nonLand+cmcLEX | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Description$ Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast with converted mana cost X or less, where X is the number of time counters on CARDNAME. SVar:X:Count$CardCounters.TIME -SVar:AsForetoldSplitCMCHack:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/as_foretold.jpg Oracle:At the beginning of your upkeep, put a time counter on As Foretold.\nOnce each turn, you may pay {0} rather than pay the mana cost for a spell you cast with converted mana cost X or less, where X is the number of time counters on As Foretold. From 9b3fa50deefe011281670e799d1410c08558ef1d Mon Sep 17 00:00:00 2001 From: Hanmac Date: Fri, 20 Sep 2019 18:03:06 +0200 Subject: [PATCH 30/30] Adventure: If an object becomes a copy of an object that has an Adventure, the copy also has an Adventure. --- forge-game/src/main/java/forge/game/GameActionUtil.java | 6 ------ forge-game/src/main/java/forge/game/card/Card.java | 2 +- forge-game/src/main/java/forge/game/card/CardFactory.java | 8 ++++++++ .../src/main/java/forge/game/card/CardFactoryUtil.java | 2 +- .../src/main/java/forge/game/card/CardProperty.java | 8 ++++++++ forge-game/src/main/java/forge/game/card/CardUtil.java | 5 +++++ .../src/main/java/forge/game/spellability/Spell.java | 6 ------ .../res/cardsfolder/upcoming/mysterious_pathlighter.txt | 8 ++++++++ 8 files changed, 31 insertions(+), 14 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/mysterious_pathlighter.txt diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index be395f2f6d2..b0575c15420 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -106,12 +106,6 @@ public final class GameActionUtil { if (!source.isLKI()) { source = CardUtil.getLKICopy(source); } - // need way to copy adventure state - if (!source.hasState(CardStateName.Adventure)) { - source.addAlternateState(CardStateName.Adventure, false); - source.getState(CardStateName.Adventure).copyFrom( - sa.getHostCard().getState(CardStateName.Adventure), true); - } source.setState(CardStateName.Adventure, false); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index a2d5ef9ff22..7044c836f46 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -807,7 +807,7 @@ public class Card extends GameEntity implements Comparable { } public final boolean isAdventureCard() { - return getRules() != null && getRules().getSplitType() == CardSplitType.Adventure; + return hasState(CardStateName.Adventure); } public final boolean isBackSide() { diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 115f53982e2..ecbfaeae056 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -735,6 +735,14 @@ public class CardFactory { final CardState ret2 = new CardState(out, CardStateName.Flipped); ret2.copyFrom(in.getState(CardStateName.Flipped, true), false); result.put(CardStateName.Flipped, ret2); + } else if (in.isAdventureCard()) { + final CardState ret1 = new CardState(out, CardStateName.Original); + ret1.copyFrom(in.getState(CardStateName.Original, true), false); + result.put(CardStateName.Original, ret1); + + final CardState ret2 = new CardState(out, CardStateName.Adventure); + ret2.copyFrom(in.getState(CardStateName.Adventure, true), false); + result.put(CardStateName.Adventure, ret2); } else { // in all other cases just copy the current state to original final CardState ret = new CardState(out, CardStateName.Original); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index a4598259209..d5176500cef 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -4753,7 +4753,7 @@ public class CardFactoryUtil { AbilitySub saExile = (AbilitySub)AbilityFactory.getAbility(abExile, card); - String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ExileOnMoved$ Exile | Duration$ Permanent"; + String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ExileOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.nonCopiedSpell"; AbilitySub saEffect = (AbilitySub)AbilityFactory.getAbility(abEffect, card); StringBuilder sb = new StringBuilder(); diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 34674f9c52f..3de4411ab84 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1340,6 +1340,14 @@ public class CardProperty { if (card.isToken()) { return false; } + } else if (property.startsWith("copiedSpell")) { + if (!card.isCopiedSpell()) { + return false; + } + } else if (property.startsWith("nonCopiedSpell")) { + if (card.isCopiedSpell()) { + return false; + } } else if (property.startsWith("hasXCost")) { SpellAbility sa1 = card.getFirstSpellAbility(); if (sa1 != null && !sa1.isXCost()) { diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 4dcd5e489bf..82a306157e0 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -225,6 +225,11 @@ public final class CardUtil { newCopy.turnFaceDownNoUpdate(); } + if (in.isAdventureCard() && in.getFaceupCardStateName().equals(CardStateName.Original)) { + newCopy.addAlternateState(CardStateName.Adventure, false); + newCopy.getState(CardStateName.Adventure).copyFrom(in.getState(CardStateName.Adventure), true); + } + /* if (in.isCloned()) { newCopy.addAlternateState(CardStateName.Cloner, false); diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index 0c41a3fc6b3..51a83100632 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -138,12 +138,6 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable if (!card.isLKI()) { card = CardUtil.getLKICopy(card); } - // need way to copy adventure state - if (!card.hasState(CardStateName.Adventure)) { - card.addAlternateState(CardStateName.Adventure, false); - card.getState(CardStateName.Adventure).copyFrom( - getHostCard().getState(CardStateName.Adventure), true); - } card.setState(CardStateName.Adventure, false); lkicheck = true; diff --git a/forge-gui/res/cardsfolder/upcoming/mysterious_pathlighter.txt b/forge-gui/res/cardsfolder/upcoming/mysterious_pathlighter.txt new file mode 100644 index 00000000000..251f8db2232 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mysterious_pathlighter.txt @@ -0,0 +1,8 @@ +Name:Mysterious Pathlighter +ManaCost:2 W +Types:Creature Faerie +PT:2/2 +K:Flying +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.YouCtrl+AdventureCard +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each creature you control that has an Adventure enters the battlefield with an additional +1/+1 counter on it. +Oracle:Flying\nEach creature you control that has an Adventure enters the battlefield with an additional +1/+1 counter on it.