From bd36ca821d994756ba6f28badac19e430449691d Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 10 Mar 2021 16:22:07 -0500 Subject: [PATCH] Improvements of status effects in database --- core/assets-raw/sprites/status/burning.png | Bin 276 -> 0 bytes core/assets-raw/sprites/status/disarmed.png | Bin 343 -> 0 bytes core/assets-raw/sprites/status/freezing.png | Bin 329 -> 0 bytes core/assets-raw/sprites/status/melting.png | Bin 304 -> 0 bytes core/assets-raw/sprites/status/muddy.png | Bin 286 -> 0 bytes core/assets-raw/sprites/status/overclock.png | Bin 387 -> 0 bytes core/assets-raw/sprites/status/overdrive.png | Bin 387 -> 0 bytes .../sprites/status/spore-slowed.png | Bin 322 -> 0 bytes core/assets-raw/sprites/status/wet.png | Bin 283 -> 0 bytes core/assets/bundles/bundle.properties | 3 +- core/assets/icons/icons.properties | 19 ++++++ core/src/mindustry/content/StatusEffects.java | 18 +++--- core/src/mindustry/core/Control.java | 4 +- .../mindustry/ctype/UnlockableContent.java | 9 +++ .../mindustry/entities/comp/StatusComp.java | 5 ++ core/src/mindustry/io/JsonIO.java | 4 +- core/src/mindustry/type/StatusEffect.java | 59 +++++++++--------- .../ui/dialogs/ContentInfoDialog.java | 5 +- .../world/blocks/logic/MessageBlock.java | 3 +- tools/src/mindustry/tools/Generators.java | 18 +++++- tools/src/mindustry/tools/ImagePacker.java | 2 +- 21 files changed, 98 insertions(+), 51 deletions(-) delete mode 100644 core/assets-raw/sprites/status/burning.png delete mode 100644 core/assets-raw/sprites/status/disarmed.png delete mode 100644 core/assets-raw/sprites/status/freezing.png delete mode 100644 core/assets-raw/sprites/status/melting.png delete mode 100644 core/assets-raw/sprites/status/muddy.png delete mode 100644 core/assets-raw/sprites/status/overclock.png delete mode 100644 core/assets-raw/sprites/status/overdrive.png delete mode 100644 core/assets-raw/sprites/status/spore-slowed.png delete mode 100644 core/assets-raw/sprites/status/wet.png diff --git a/core/assets-raw/sprites/status/burning.png b/core/assets-raw/sprites/status/burning.png deleted file mode 100644 index 7e82dd44823d8fa5fe3042f00b7c178652228eaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmV+v0qg#WP)CcM>pllt}IbdcLDKo7l8NU<9>n)h@8j@0GMUODqtC*0@zOR{Dj6G z1;EN{XAd!4&j7>4wYgkZ1YOSnCD*zHf|esO36KiEw~+)O+eV}THev_BLhJ$nAVI0=QRk&$hH?VKfKFk(Mb|0-1k#||`dmwERDg?+$`R@SRD@iPz#Bj2SOqNGJpqz4eo8|ra6k5;|+^RWP z7HdJvi1}D*s3r%XB9%D;~;k^LU!g~Ow zhI;{~hkF1l;hqPK>}yyap(Q-}wII}a3&0cJf>7Zor~%Z%saYgA=lneXounmzk?>@G zFN)zfX8=D7F9F=(YN~#TQtLJl3BLgAiOv8u=N6k7& zLJWt)DE~izJs8Wc#NNnYUJ1T*14%HFY^f~)pmr6+!?y;o0^$*l0QLs3FNZ3UhmJM% pu>d$SsFVgrWvc~Iw`|@H@CAH{A4#nhf%5B_rGOo^n_AKCa+fcP{d^J6?JQ^J?y$XD@v2Tdp$#KZBD^R3HO~JyC&W3-^W6cTyEVa7lJqs|qZEU_q3=gnk z{NDof^+R|@zzn3&eZXJuEIE&vSKyTxIqKXJ(4HhCA!bk$bp!~GYi0qWj< zZopp84sa9<;-cwn_Cy3I+YEHpbkC@OCE*e5aGGQUG>I_0A}~v&;1u$rLt&)B%*?(5 b?k}I;{SzNP@uHto00000NkvXXu0mjf6%&Lh diff --git a/core/assets-raw/sprites/status/melting.png b/core/assets-raw/sprites/status/melting.png deleted file mode 100644 index e3b4e54b54c729d30178c3f911b3d2a0e46b70ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304 zcmV-00nh%4P)bMyWK{6qpvw^)@x8bSqN z7di!@1V}-s0Ssbl%>txiW<)apa&rTV0(`|h3c$=+k0pQfq6r)W)sJO!)5-!!%(DQ@ ze0zzqzImQjHi47K`@zh8g&|Y`wfPi;0sxtZArt^^mfF<-_TRHa8b~ETeeuE&DuCMD z-!cR-0zkrU;5$2G5UfwXgmlo|!H(uoZ6EC=&>aAVsD$QG4JH5&B9}o8=`=NzKJyv;fnrK*I9U!DUU=OuVD<#~uHMaByV-2p^TQlDzyLfE-Z{l&0%)U$ zE}nPTOn``$)0QOwZ-%w2auz~&xM>Ix+iaEth8JFMDS-a3;j8h14twN4*U0fgyA*R4 kLOKwl6q-j42%|YIUq8PXKfU1=?EnA(07*qoM6N<$g6ME{;s5{u diff --git a/core/assets-raw/sprites/status/overclock.png b/core/assets-raw/sprites/status/overclock.png deleted file mode 100644 index ede85bb8e9ae70df641f0ae24c5bb5dd2d69e892..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmV-}0et?6P)Nkl=Wn-C)9eUIL45`@X+c{@yFgt$R7ZXW|5A-_=&huAabb zxpkL36@XHZ*lp^~0MYKFbK|c70AkcO?jG*9>C3bRY9h)uqF_Vzd7|yA!Y$81r^N&GYfDTpBnxJu#YtQP*cu-0I(S6v=jw*0azhh!!9~!0PKT` zir6!jalvE&Cd2?%aD|-%YS7#3j{6<}&1gu2P<+nH({%Iz=4}Kd7?-R>6`{`OA)5i1 zco2F5T(KBukTfIBQ~>6rh9RxP002ovPDHLkV1g1orZfNm diff --git a/core/assets-raw/sprites/status/overdrive.png b/core/assets-raw/sprites/status/overdrive.png deleted file mode 100644 index 79a4d561c3a730546c08888c00cfd80a79f8e494..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmV-}0et?6P)NklT*A}ycm-!%A+V74+-1dEct$f}q#i702z-OWZvuCwc*wqfq zibK0pQ!!8iiQT5PnSm4_g!^#Fi0*(Y%+8k8Ax7&|2N(pqqL6;OK@Mdy12i!JJN@%h z86DW(z>sj!6_ANrOx4^pqB}4JI+B?nVmCp9+UPrAaT^&FYYfU_$W;uiJ^B?ZA@HI# ztPfAt0bfuNsN^*6tbtbetI6NMYzM*{eH}|Br=8%e0Tf08(OMJjCz%0tqnQwkK}#`C zAC*5L01VDzC$xKo;>hzIP|y_AiP}`v+%&ua6yFkzc8m(xrL?Ka9oWnOC`00fR^X<5 zOjHhKMt1-O48~%;0XC=NNK_p#h%B^(!Wc3#1K@{%#6VhGG4RwxDh_aT2mIzrKwp%7 hS38h#9NB4jYM$g!T$$3=2FdeW^oue=hu4~}+j6eqNN@N5yOhqy{sxCnUykH9^FJK>j?nAZXH zxT@zaaIXVZ5Lyr6PYJm2I|PO>)SAvc5QcYlAO-gXqG8ec)06Q2jBKd)Ua&Q%Q1fM4 z!|Z`+hymIuwT=;xP%3PvOD$c`3hdd(Km(2y&Lkty1{Wu96C&SMumUn2(6ue&4?rau UN)Br}6aWAK07*qoM6N<$g2d>BWB>pF diff --git a/core/assets-raw/sprites/status/wet.png b/core/assets-raw/sprites/status/wet.png deleted file mode 100644 index 3a26c4974a541f3edb50b12bd72f4245a54a85f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283 zcmV+$0p$LPP)-tk!U{w$ zTr|%llS)_tH1se(W}s5d>@!rL=^bV^Gl6W+ZKwtKM_|`x*R5~>6oGcQBCrI`3M_-O z0;pSdDDS`$iC5rF;4czTew_T5lI~>_NE>U-KOh0l hM8cDrK-j3dumhN37D3DWA(sFE002ovPDHLkV1fi4bL#*A diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index b9dd75fe05..e1d487b504 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -628,11 +628,10 @@ status.melting.name = Melting status.sapped.name = Sapped status.spore-slowed.name = Spore Slowed status.tarred.name = Tarred -status.overdrive.name = Overdrive status.overclock.name = Overclock status.shocked.name = Shocked status.blasted.name = Blasted -status.disarmed.name = Disarmed +status.unmoving = Unmoving settings.language = Language settings.data = Game Data diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index e2dcae538f..88c6b9ccb7 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -315,3 +315,22 @@ 63418=legacy-unit-factory-ground|block-legacy-unit-factory-ground-medium 63417=interplanetary-accelerator|block-interplanetary-accelerator-medium 63416=basalt-boulder|block-basalt-boulder-medium +63415=none|status-none-icon +63414=burning|status-burning-icon +63413=freezing|status-freezing-icon +63412=unmoving|status-unmoving-icon +63411=slow|status-slow-icon +63410=wet|status-wet-icon +63409=muddy|status-muddy-icon +63408=melting|status-melting-icon +63407=sapped|status-sapped-icon +63406=spore-slowed|status-spore-slowed-icon +63405=tarred|status-tarred-icon +63404=overdrive|status-overdrive-icon +63403=overclock|status-overclock-icon +63402=shielded|status-shielded-icon +63401=boss|status-boss-icon +63400=shocked|status-shocked-icon +63399=blasted|status-blasted-icon +63398=corroded|status-corroded-icon +63397=disarmed|status-disarmed-icon diff --git a/core/src/mindustry/content/StatusEffects.java b/core/src/mindustry/content/StatusEffects.java index 798adb92db..39db9cad6b 100644 --- a/core/src/mindustry/content/StatusEffects.java +++ b/core/src/mindustry/content/StatusEffects.java @@ -12,7 +12,7 @@ import mindustry.graphics.*; import static mindustry.Vars.*; public class StatusEffects implements ContentList{ - public static StatusEffect none, burning, freezing, unmoving, slow, wet, muddy, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed, disarmed; + public static StatusEffect none, burning, freezing, unmoving, slow, wet, muddy, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, boss, sporeSlowed, disarmed; @Override public void load(){ @@ -20,14 +20,15 @@ public class StatusEffects implements ContentList{ none = new StatusEffect("none"); burning = new StatusEffect("burning"){{ - color = Pal.lightFlame; + color = Color.valueOf("ffc455"); damage = 0.12f; //over 8 seconds, this would be ~60 damage effect = Fx.burning; + transitionDamage = 8f; init(() -> { opposite(wet, freezing); affinity(tarred, ((unit, time, newTime, result) -> { - unit.damagePierce(8f); + unit.damagePierce(transitionDamage); Fx.burning.at(unit.x + Mathf.range(unit.bounds() / 2f), unit.y + Mathf.range(unit.bounds() / 2f)); result.set(burning, Math.min(time + newTime, 300f)); })); @@ -39,12 +40,13 @@ public class StatusEffects implements ContentList{ speedMultiplier = 0.6f; healthMultiplier = 0.8f; effect = Fx.freezing; + transitionDamage = 18f; init(() -> { opposite(melting, burning); affinity(blasted, ((unit, time, newTime, result) -> { - unit.damagePierce(18f); + unit.damagePierce(transitionDamage); result.set(freezing, time); })); }); @@ -65,10 +67,11 @@ public class StatusEffects implements ContentList{ speedMultiplier = 0.94f; effect = Fx.wet; effectChance = 0.09f; + transitionDamage = 14; init(() -> { affinity(shocked, ((unit, time, newTime, result) -> { - unit.damagePierce(14f); + unit.damagePierce(transitionDamage); if(unit.team == state.rules.waveTeam){ Events.fire(Trigger.shock); } @@ -169,11 +172,6 @@ public class StatusEffects implements ContentList{ reactive = true; }}; - corroded = new StatusEffect("corroded"){{ - color = Pal.plastanium; - damage = 0.1f; - }}; - disarmed = new StatusEffect("disarmed"){{ color = Color.valueOf("e9ead3"); disarm = true; diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index 2ca30a2d51..1b1e2b6a5c 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -139,7 +139,9 @@ public class Control implements ApplicationListener, Loadable{ })); Events.on(UnlockEvent.class, e -> { - ui.hudfrag.showUnlock(e.content); + if(e.content.showUnlock()){ + ui.hudfrag.showUnlock(e.content); + } checkAutoUnlocks(); diff --git a/core/src/mindustry/ctype/UnlockableContent.java b/core/src/mindustry/ctype/UnlockableContent.java index a08dab1b67..85b29469ae 100644 --- a/core/src/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -95,6 +95,10 @@ public abstract class UnlockableContent extends MappableContent{ return cicons[icon.ordinal()]; } + public Cicon prefDatabaseIcon(){ + return Cicon.xlarge; + } + /** Iterates through any implicit dependencies of this content. * For blocks, this would be the items required to build it. */ public void getDependencies(Cons cons){ @@ -115,6 +119,11 @@ public abstract class UnlockableContent extends MappableContent{ return false; } + /** @return whether to show a notification toast when this is unlocked */ + public boolean showUnlock(){ + return true; + } + /** Makes this piece of content unlocked; if it already unlocked, nothing happens. */ public void unlock(){ if(!unlocked && !alwaysUnlocked){ diff --git a/core/src/mindustry/entities/comp/StatusComp.java b/core/src/mindustry/entities/comp/StatusComp.java index bce8444361..89ed591fab 100644 --- a/core/src/mindustry/entities/comp/StatusComp.java +++ b/core/src/mindustry/entities/comp/StatusComp.java @@ -33,6 +33,11 @@ abstract class StatusComp implements Posc, Flyingc{ void apply(StatusEffect effect, float duration){ if(effect == StatusEffects.none || effect == null || isImmune(effect)) return; //don't apply empty or immune effects + //unlock status effects regardless of whether they were applied to friendly units + if(state.isCampaign()){ + effect.unlock(); + } + if(statuses.size > 0){ //check for opposite effects for(int i = 0; i < statuses.size; i ++){ diff --git a/core/src/mindustry/io/JsonIO.java b/core/src/mindustry/io/JsonIO.java index c8e43d5a20..d6ef8f8e17 100644 --- a/core/src/mindustry/io/JsonIO.java +++ b/core/src/mindustry/io/JsonIO.java @@ -208,9 +208,7 @@ public class JsonIO{ static class CustomJson extends Json{ private Object baseObject; - { - apply(this); - } + { apply(this); } @Override public T fromJson(Class type, String json){ diff --git a/core/src/mindustry/type/StatusEffect.java b/core/src/mindustry/type/StatusEffect.java index 015b79abfb..3e322deb2c 100644 --- a/core/src/mindustry/type/StatusEffect.java +++ b/core/src/mindustry/type/StatusEffect.java @@ -1,7 +1,6 @@ package mindustry.type; import arc.graphics.*; -import arc.graphics.g2d.*; import arc.math.*; import arc.struct.*; import arc.util.*; @@ -10,8 +9,8 @@ import mindustry.ctype.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.gen.*; -import mindustry.world.meta.*; import mindustry.ui.*; +import mindustry.world.meta.*; public class StatusEffect extends UnlockableContent{ /** Damage dealt by the unit with the effect. */ @@ -24,6 +23,8 @@ public class StatusEffect extends UnlockableContent{ public float reloadMultiplier = 1f; /** Unit build speed multiplier. */ public float buildSpeedMultiplier = 1f; + /** Damage dealt upon transition to an affinity. */ + public float transitionDamage = 0f; /** Unit weapon(s) disabled. */ public boolean disarm = false; /** Damage per frame. */ @@ -66,37 +67,39 @@ public class StatusEffect extends UnlockableContent{ @Override public void setStats(){ - if(damageMultiplier != 1){ - stats.addPercent(Stat.damageMultiplier, damageMultiplier); + if(damageMultiplier != 1) stats.addPercent(Stat.damageMultiplier, damageMultiplier); + if(healthMultiplier != 1) stats.addPercent(Stat.healthMultiplier, healthMultiplier); + if(speedMultiplier != 1) stats.addPercent(Stat.speedMultiplier, speedMultiplier); + if(reloadMultiplier != 1) stats.addPercent(Stat.reloadMultiplier, reloadMultiplier); + if(buildSpeedMultiplier != 1) stats.addPercent(Stat.buildSpeedMultiplier, buildSpeedMultiplier); + if(damage > 0) stats.add(Stat.damage, damage * 60f, StatUnit.perSecond); + + var afseq = affinities.asArray().sort(); + var opseq = opposites.asArray().sort(); + + for(int i = 0; i < afseq.size; i++){ + var e = afseq.get(i); + stats.add(Stat.affinities, e.emoji() + "" + e.toString()); + } + + if(afseq.any() && transitionDamage != 0){ + stats.add(Stat.affinities, "/ [accent]" + (int)transitionDamage + " " + Stat.damage.localized()); } - if(healthMultiplier != 1){ - stats.addPercent(Stat.healthMultiplier, healthMultiplier); + for(int i = 0; i < opseq.size; i++){ + var e = opseq.get(i); + stats.add(Stat.opposites, e.emoji() + "" + e.toString()); } + } - if(speedMultiplier != 1){ - stats.addPercent(Stat.speedMultiplier, speedMultiplier); - } + @Override + public Cicon prefDatabaseIcon(){ + return Cicon.large; + } - if(reloadMultiplier != 1){ - stats.addPercent(Stat.reloadMultiplier, reloadMultiplier); - } - - if(buildSpeedMultiplier != 1){ - stats.addPercent(Stat.buildSpeedMultiplier, buildSpeedMultiplier); - } - - if(damage > 0){ - stats.add(Stat.damage, damage * 60f, StatUnit.perSecond); - } - - for(StatusEffect e : affinities){ - stats.add(Stat.affinities, e.toString(), StatUnit.none); - } - - for(StatusEffect e : opposites){ - stats.add(Stat.opposites, e.toString(), StatUnit.none); - } + @Override + public boolean showUnlock(){ + return false; } /** Runs every tick on the affected unit while time is greater than 0. */ diff --git a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java index b076d4b766..1d03d360f3 100644 --- a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java @@ -6,7 +6,6 @@ import arc.struct.*; import arc.util.*; import mindustry.ctype.*; import mindustry.graphics.*; -import mindustry.ui.*; import mindustry.world.meta.*; public class ContentInfoDialog extends BaseDialog{ @@ -27,9 +26,9 @@ public class ContentInfoDialog extends BaseDialog{ content.checkStats(); table.table(title1 -> { - int size = 8 * 6; + var size = content.prefDatabaseIcon(); - title1.image(content.icon(Cicon.xlarge)).size(size).scaling(Scaling.fit); + title1.image(content.icon(size)).size(size.size).scaling(Scaling.fit); title1.add("[accent]" + content.localizedName).padLeft(5); }); diff --git a/core/src/mindustry/world/blocks/logic/MessageBlock.java b/core/src/mindustry/world/blocks/logic/MessageBlock.java index 0e34825b49..d279e079d9 100644 --- a/core/src/mindustry/world/blocks/logic/MessageBlock.java +++ b/core/src/mindustry/world/blocks/logic/MessageBlock.java @@ -44,8 +44,7 @@ public class MessageBlock extends Block{ for(int i = 0; i < text.length(); i++){ char c = text.charAt(i); if(c == '\n'){ - count ++; - if(count <= maxNewlines){ + if(count++ <= maxNewlines){ tile.message.append('\n'); } }else{ diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index 2cc68f1eff..baf23762bf 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -376,8 +376,24 @@ public class Generators{ }); ImagePacker.generate("item-icons", () -> { - for(UnlockableContent item : Seq.withArrays(content.items(), content.liquids())){ + for(UnlockableContent item : Seq.withArrays(content.items(), content.liquids(), content.statusEffects())){ + if(item instanceof StatusEffect && !ImagePacker.has(item.getContentType().name() + "-" + item.name)){ + continue; + } + Image base = ImagePacker.get(item.getContentType().name() + "-" + item.name); + //tint status effect icon color + if(item instanceof StatusEffect){ + StatusEffect stat = (StatusEffect)item; + Image tint = base; + base.each((x, y) -> tint.draw(x, y, tint.getColor(x, y).mul(stat.color))); + + //outline the image + Image container = new Image(38, 38); + container.draw(base, 3, 3); + base = container.outline(3, Pal.gray); + } + for(Cicon icon : Cicon.scaled){ //if(icon.size == base.width) continue; Image image = new Image(icon.size, icon.size); diff --git a/tools/src/mindustry/tools/ImagePacker.java b/tools/src/mindustry/tools/ImagePacker.java index 1142de8a26..25c5fa6b27 100644 --- a/tools/src/mindustry/tools/ImagePacker.java +++ b/tools/src/mindustry/tools/ImagePacker.java @@ -106,7 +106,7 @@ public class ImagePacker{ ObjectMap content2id = new ObjectMap<>(); map.each((key, val) -> content2id.put(val.split("\\|")[0], key)); - Seq cont = Seq.withArrays(Vars.content.blocks(), Vars.content.items(), Vars.content.liquids(), Vars.content.units()); + Seq cont = Seq.withArrays(Vars.content.blocks(), Vars.content.items(), Vars.content.liquids(), Vars.content.units(), Vars.content.statusEffects()); cont.removeAll(u -> u instanceof ConstructBlock || u == Blocks.air); int minid = 0xF8FF;