├── .gitignore ├── .vscode └── settings.json ├── CHANGELOG ├── LICENSE ├── README.md ├── bundles ├── bundle.properties ├── bundle_ru.properties └── bundle_zh_CN.properties ├── content └── blocks │ ├── adjustable-overdrive-projector.json │ ├── cheat-item.json │ ├── cheat-liquid.hjson │ ├── cheat-power.hjson │ ├── chrono-pusher.json │ ├── chrono-unloader.json │ ├── chrono-vault.hjson │ ├── dps-tester-land-factory.json │ ├── dps-wall-1.json │ ├── dps-wall-2.json │ ├── dps-wall-3.json │ ├── dps-wall-4.json │ ├── dps-wall-5.json │ ├── dps-wall-display.json │ ├── enemys-cannot-move.json │ ├── enemys-control.json │ ├── enemys-no-damage.json │ ├── enemys-remove.json │ ├── global-radar.json │ ├── invincible-core.json │ ├── invincible-force-projector.json │ ├── invincible-wall-large.json │ ├── invincible-wall-medium.json │ ├── invincible-wall-small.json │ ├── must-die-turret.json │ ├── next-wave.json │ ├── one-shot-turret.json │ ├── point-turret.json │ ├── smart-filler.json.notfinished │ ├── static-drill.json │ ├── super-battery.json │ ├── team-changer.json │ ├── turret-turret.json.not │ ├── ultra-overdrive.json │ └── unit-factory.json ├── icon.png ├── mod.hjson ├── package.ps1 ├── package.sh ├── preview.png ├── preview.xcf ├── previews ├── 1.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg ├── 5.jpg └── 6.jpg ├── scripts ├── abomb4-lib │ ├── hud.js │ └── multi-crafter.js ├── jsconfig.json ├── main.js └── super-cheat │ ├── adjustable-overdrive-projector.js │ ├── cheat-item.js │ ├── chrono-pusher.js │ ├── chrono-unloader.js │ ├── dps-tester-unit.js │ ├── dps-walls.js │ ├── enemys-cannot-move.js │ ├── enemys-control.js │ ├── enemys-no-damage.js │ ├── enemys-remove.js │ ├── invincible-core.js │ ├── invincible-force-projector.js │ ├── invincible-ship.js │ ├── invincible-simple-blocks.js │ ├── lib.js │ ├── must-die-turret.js │ ├── next-wave.js │ ├── one-shot-turret.js │ ├── point-turret.js │ ├── quantum-launchpad.js │ ├── smart-filler.js │ ├── static-drill.js │ ├── team-changer.js │ ├── terminator.js │ ├── turret-turret.js │ └── unit-factory.js ├── sounds ├── b.ogg ├── healLaser.ogg ├── s.ogg └── swings.ogg └── sprites ├── blocks ├── cheat │ ├── cheat-item.png │ ├── cheat-liquid.png │ ├── cheat-power.png │ ├── next-wave.png │ └── quantum-launchpad.png ├── conveyors │ ├── electrum-conveyor-0-0.png │ ├── electrum-conveyor-0-1.png │ ├── electrum-conveyor-0-2.png │ ├── electrum-conveyor-0-3.png │ ├── electrum-conveyor-1-0.png │ ├── electrum-conveyor-1-1.png │ ├── electrum-conveyor-1-2.png │ ├── electrum-conveyor-1-3.png │ ├── electrum-conveyor-2-0.png │ ├── electrum-conveyor-2-1.png │ ├── electrum-conveyor-2-2.png │ ├── electrum-conveyor-2-3.png │ ├── electrum-conveyor-3-0.png │ ├── electrum-conveyor-3-1.png │ ├── electrum-conveyor-3-2.png │ ├── electrum-conveyor-3-3.png │ ├── electrum-conveyor-4-0.png │ ├── electrum-conveyor-4-1.png │ ├── electrum-conveyor-4-2.png │ ├── electrum-conveyor-4-3.png │ └── electrum-conveyor.png ├── distribution │ ├── chrono-pusher-bottom.png │ ├── chrono-pusher-full.png │ ├── chrono-pusher-rotator.png │ ├── chrono-pusher-top.png │ ├── chrono-pusher.png │ ├── chrono-pusher.xcf │ ├── chrono-unloader-bottom.png │ ├── chrono-unloader-full.png │ ├── chrono-unloader-rotator.png │ ├── chrono-unloader-top.png │ ├── chrono-unloader.png │ └── chrono-unloader.xcf ├── effects │ ├── adjustable-overdrive-projector-top.png │ ├── adjustable-overdrive-projector.png │ ├── chrono-vault.png │ ├── global-radar.png │ ├── invincible-core.png │ ├── slow-overdrive-projector-01-top.png │ ├── slow-overdrive-projector-01.png │ ├── slow-overdrive-projector-05-top .png │ ├── slow-overdrive-projector-05.png │ ├── team-changer-full.png │ ├── team-changer-team.png │ ├── team-changer.png │ ├── team-changer.xcf │ ├── ultra-overdrive-top.png │ └── ultra-overdrive.png ├── mechpad │ └── invincible-ship-pad.png ├── power │ ├── super-battery-top.png │ └── super-battery.png ├── production │ ├── static-drill-item.png │ ├── static-drill-rotator.png │ ├── static-drill-top.png │ └── static-drill.png ├── shields │ ├── enemys-cannot-move-top.png │ ├── enemys-cannot-move.png │ ├── enemys-control-top.png │ ├── enemys-control.png │ ├── enemys-no-damage-top.png │ ├── enemys-no-damage.png │ ├── enemys-remove.png │ ├── invincible-force-projector-top.png │ └── invincible-force-projector.png ├── turrets │ ├── base-turret-turret.png │ ├── must-die-turret-base.png │ ├── must-die-turret.png │ ├── one-shot-turret.png │ ├── point-turret.png │ ├── turret-turret.png │ └── turret-turret.xcf ├── unit │ ├── dps-tester-land-factory-team.png │ ├── dps-tester-land-factory.png │ ├── unit-factory-team.png │ ├── unit-factory.png │ └── unit-factory.xcf └── walls │ ├── dps-wall-1.png │ ├── dps-wall-2.png │ ├── dps-wall-3.png │ ├── dps-wall-4.png │ ├── dps-wall-5.png │ ├── dps-wall-display.png │ ├── invincible-wall-large.png │ ├── invincible-wall-medium.png │ └── invincible-wall-small.png ├── icons ├── down1.png ├── down2.png ├── down3.png ├── down4.png ├── up1.png ├── up2.png ├── up3.png └── up4.png └── units ├── dps-tester-land-base.png ├── dps-tester-land-cell.png ├── dps-tester-land-leg.png ├── dps-tester-land-outline.png ├── dps-tester-land.png ├── invincible-ship-weapon.png └── invincible-ship.png /.gitignore: -------------------------------------------------------------------------------- 1 | super-cheat-v*.zip 2 | .idea 3 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "licenser.license": "GPLv3", 3 | "licenser.author": "abomb4", 4 | "licenser.projectName": "Dimension Shard", 5 | "javascript.preferences.importModuleSpecifier": "non-relative", 6 | "javascript.preferences.importModuleSpecifierEnding": "index", 7 | "javascript.updateImportsOnFileMove.enabled": "never" 8 | } 9 | -------------------------------------------------------------------------------- /CHANGELOG: -------------------------------------------------------------------------------- 1 | 4.0.0: 2 | - 支持 V8 (v149) 3 | - 修改无敌飞船的武器,改为一种远射程的定点炮 4 | - 无敌飞船现在有很大的雷达范围 5 | - 新增建筑‘全球雷达’ 6 | 7 | 3.1.1: 8 | - Fixed Adjustable Overdrive Projector crash bug in v145.1 9 | 10 | 3.1.0: 11 | - 新增一个‘一击炮’,发射单发子弹 12 | - 新增一个‘点杀炮’,直接点杀目标 13 | - 修改无敌飞船的子弹,大幅度缩短攻击距离 14 | - 修复物品源贴图在 v7 不显示物品的问题 15 | - 修复若干 json 警告 16 | - 因为不知道怎么让力场投影有默认状态,现在都只有默认状态了 17 | - 修复可调整超速器有时崩溃的问题 18 | - 超速投影默认不被瞄准 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 无敌作弊 Invincible Cheat Mod 2 | 不做人的 Mindustry 作弊 Mod,滥用会影响游戏体验。 3 | 4 | Inhumane Mindustry cheating mod, abuse will affect the game experience. 5 | 6 |
7 | 8 | This is a cheat mod, abuse will reduce your game experience, be careful for using this. 9 | 10 | GitHub: https://github.com/abomb4/super-cheat 11 | 12 | email: abomb4@163.com 13 | 14 | Wellcome to feedback! 15 | 16 | Features: 17 | - Adjustable Overdrive Projector (speedup, or slow down) 18 | - Invincible Core and Invincible build plane 19 | - Cheat Items (power source, liquid source, item source with 36x faster) 20 | - Invincible Wall, Invincible Force Projector 21 | - Several strange force projectors 22 | - Chronosphere Unloader and Pusher 23 | - Unit Factory 24 | - DPS Tester Unit 25 | - Team Changer 26 | 27 | 这是个作弊 mod,会降低游戏体验,请谨慎使用。 28 | 主要特性: 29 | - 可调整的超速投影(更快,也可以更慢) 30 | - 无敌核心,无敌建造机 31 | - 作弊物品(电源、水源、物品源超快版) 32 | - 无敌围墙,无敌力场 33 | - 一大堆神奇力场 34 | - 时空提取器、时空推送器 35 | - 单位工厂 36 | - DPS 测试单位 37 | - 队伍更换器 38 | 39 | Это читерный мод, злоупотребление испортит интерес к игре, острожней с этим. 40 | Возможности: 41 | - Настраиваемый сверхприводный проектор (ускорение или замедление) 42 | - Блоки, меняющие команду, за которую играют те или иные единицы (или вы сами) 43 | - Измеритель урона в секунду 44 | - Непобедимое ядро и его строительная боевая единица 45 | - Cheat Items (power source, liquid source, item source with 36x faster) 46 | - Неразрушаемые стены, силовой проектор с бесконечной прочностью 47 | - Несколько полезных проекторов 48 | - Дистанционный загрузчик и разгрузчик 49 | - Универсальный завод боевых единиц, также может производить их для врагов -------------------------------------------------------------------------------- /bundles/bundle.properties: -------------------------------------------------------------------------------- 1 | block.invincible-cheat-mod-v8-invincible-wall-small.name = Small Invincible Wall 2 | block.invincible-cheat-mod-v8-invincible-wall-medium.name = Medium Invincible Wall 3 | block.invincible-cheat-mod-v8-invincible-wall-large.name = Large Invincible Wall 4 | block.invincible-cheat-mod-v8-cheat-item.name = Cheat Item Source 5 | block.invincible-cheat-mod-v8-cheat-item.description = An item source with 36x dump speed. 6 | block.invincible-cheat-mod-v8-cheat-power.name = Cheat Unlimited Power 7 | block.invincible-cheat-mod-v8-cheat-power.description = Produces huge amounts of power. (10,000,000,000) 8 | block.invincible-cheat-mod-v8-cheat-liquid.name = Cheat Liquid Source 9 | block.invincible-cheat-mod-v8-cheat-liquid.description = Like the usual liquid source, but has more health. 10 | block.invincible-cheat-mod-v8-chrono-vault.name = Chrono Vault 11 | block.invincible-cheat-mod-v8-chrono-vault.description = A massive vault, which is incredibly strong. 12 | block.invincible-cheat-mod-v8-enemys-cannot-move.name = Enemy Freezer Field 13 | block.invincible-cheat-mod-v8-enemys-cannot-move.description = Prevents enemies from moving in its field. (Applies to all enemy teams) (Does not apply to blocks) 14 | block.invincible-cheat-mod-v8-enemys-control.name = Team Changer Field 15 | block.invincible-cheat-mod-v8-enemys-control.description = Forces enemies to join your team when they touch its field, and will stay in your team even if the field is removed. (Applies to all enemy teams) (Does not apply to blocks) 16 | block.invincible-cheat-mod-v8-enemys-no-damage.name = Damage Disabler Field 17 | block.invincible-cheat-mod-v8-enemys-no-damage.description = When an enemy touches its field. The damage from all its weapons will be removed. (Applies to all enemy teams) (Does not apply to blocks) 18 | block.invincible-cheat-mod-v8-enemys-remove.name = Enemy Death Field 19 | block.invincible-cheat-mod-v8-enemys-remove.description = Immediately removes all enemies that touches its field. (Applies to all enemy teams) (Does not apply to blocks) 20 | block.invincible-cheat-mod-v8-invincible-core.name = Invincible Core 21 | block.invincible-cheat-mod-v8-invincible-core.description = An Invincible Core that puts you into an immortal unit. 22 | block.invincible-cheat-mod-v8-invincible-force-projector.name = Invincible Force Projector 23 | block.invincible-cheat-mod-v8-invincible-force-projector.description = A force projector with infinite shield health. 24 | block.invincible-cheat-mod-v8-invincible-ship-pad.name = Invincible Ship Pad 25 | block.invincible-cheat-mod-v8-invincible-ship-pad.description = Provides transformation into a invincible ship mech. 26 | block.invincible-cheat-mod-v8-next-wave.name = Wave Caller 27 | block.invincible-cheat-mod-v8-next-wave.description = Allows you to call a wave even if there is an active one happening.\nThe Up Arrow calls 1 wave while the Danger Sign calls 10 waves.\n[scarlet]Spamming may lead to heavy lag or a crash. 28 | block.invincible-cheat-mod-v8-quantum-launchpad.name = Ultimate Launchpad 29 | block.invincible-cheat-mod-v8-quantum-launchpad.description = Launches batches of items instantly to any selected sector after being loaded up. 30 | block.invincible-cheat-mod-v8-ultra-overdrive.name = Ultimate Overdrive Projector 31 | block.invincible-cheat-mod-v8-ultra-overdrive.description = Overdrives everything in its radius at blazing fast speeds. 32 | block.invincible-cheat-mod-v8-slow-overdrive-projector-01.name = Slower Overdrive Projector (10%) 33 | block.invincible-cheat-mod-v8-slow-overdrive-projector-01.description = Slows down blocks by 10%, effective on all teams. 34 | block.invincible-cheat-mod-v8-slow-overdrive-projector-05.name = Slower Overdrive Projector (50%) 35 | block.invincible-cheat-mod-v8-slow-overdrive-projector-05.description = Slows dowm blocks by 50%, effective on all teams. 36 | block.invincible-cheat-mod-v8-must-die-turret.name = Cheat Turret 37 | block.invincible-cheat-mod-v8-must-die-turret.description = Fires homing, piercing, fragmenting bullets, instantly kills enemies, completely ignoring health. 38 | block.invincible-cheat-mod-v8-one-shot-turret.name = One Shot Turret 39 | block.invincible-cheat-mod-v8-one-shot-turret.description = Fires a single powerful bullet that can only kill one enemy at a time. (Doesn not work well at low fp) 40 | block.invincible-cheat-mod-v8-point-turret.name = Point Turret 41 | block.invincible-cheat-mod-v8-point-turret.description = Can directly destroy a target at a point within range, similar to Foreshadow. 42 | block.invincible-cheat-mod-v8-turret-turret.name = Turret Turret 43 | block.invincible-cheat-mod-v8-turret-turret.description = A turret that shoots different turrets. Also has a chance of shooting itself(and by that i mean a clone of itself).\nNote: Has a chance of shooting a reactor so prevent anyone from shooting at your factories or anything important. 44 | block.invincible-cheat-mod-v8-static-drill.name = Static Drill 45 | block.invincible-cheat-mod-v8-static-drill.description = Drills everything in in a speed of 60 items per second. Cannot be overdrived. 46 | block.invincible-cheat-mod-v8-adjustable-overdrive-projector.name = Adjustable Overdrive Projector 47 | block.invincible-cheat-mod-v8-adjustable-overdrive-projector.description = Overdrive speed can be changed from 0.01 to 1000, effective on every team. 48 | block.invincible-cheat-mod-v8-super-battery.name = Super Battery 49 | block.invincible-cheat-mod-v8-super-battery.description = Has 1 million power capacity. 50 | block.invincible-cheat-mod-v8-chrono-unloader.name = Chrono Unloader 51 | block.invincible-cheat-mod-v8-chrono-unloader.description = Allows you to take certain items from buildings that you connect it to.\nYou can select what to extract by clicking on it. 52 | block.invincible-cheat-mod-v8-chrono-pusher.name = Chrono Pusher 53 | block.invincible-cheat-mod-v8-chrono-pusher.description = Allows you to input items in buildings that you connect it to.\n(You can't force items that the block dosen't accept with this.) 54 | block.invincible-cheat-mod-v8-unit-factory.name = Unit Factory 55 | block.invincible-cheat-mod-v8-unit-factory.description = Allows you to generate any unit and also allows you to change its team. 56 | block.invincible-cheat-mod-v8-team-changer.name = Team Changer Core 57 | block.invincible-cheat-mod-v8-team-changer.description = A core that allows you to change teams. 58 | block.invincible-cheat-mod-v8-team-changer.details = OH NO, somebody rebelled!!!! 59 | block.invincible-cheat-mod-v8-dps-tester-land-factory.name = DPS Tester Factory 60 | block.invincible-cheat-mod-v8-dps-tester-land-factory.description = Produces a DPS Tester Unit. The armor and hitsize of all DPS Tester Units in the game can be modified through this factory (Only restart the game to reset the armor and hit size). 61 | block.invincible-cheat-mod-v8-dps-wall-1.name = DPS Wall 1 62 | block.invincible-cheat-mod-v8-dps-wall-1.description = 1x1 DPS Wall. Usage: build a DPS Wall Display and connect it to this wall, DPS will be displayed on the Display. 63 | block.invincible-cheat-mod-v8-dps-wall-2.name = DPS Wall 2 64 | block.invincible-cheat-mod-v8-dps-wall-2.description = 2x2 DPS Wall Wall. Usage: build a DPS Wall Display and connect it to this wall, DPS will be displayed on the Display. 65 | block.invincible-cheat-mod-v8-dps-wall-3.name = DPS Wall 3 66 | block.invincible-cheat-mod-v8-dps-wall-3.description = 3x3 DPS Wal Wall. Usage: build a DPS Wall Display and connect it to this wall, DPS will be displayed on the Display. 67 | block.invincible-cheat-mod-v8-dps-wall-4.name = DPS Wall 4 68 | block.invincible-cheat-mod-v8-dps-wall-4.description = 4x4 DPS Wal Wall. Usage: build a DPS Wall Display and connect it to this wall, DPS will be displayed on the Display. 69 | block.invincible-cheat-mod-v8-dps-wall-5.name = DPS Wall 5 70 | block.invincible-cheat-mod-v8-dps-wall-5.description = 5x5 的 DPS Wal Wall. Usage: build a DPS Wall Display and connect it to this wall, DPS will be displayed on the Display. 71 | block.invincible-cheat-mod-v8-dps-wall-display.name = DPS Wall Display 72 | block.invincible-cheat-mod-v8-dps-wall-display.description = After connecting multiple DPS Walls, we can view their DPS statistics. 73 | block.invincible-cheat-mod-v8-global-radar.name = Global Radar 74 | block.invincible-cheat-mod-v8-global-radar.description = Reveals terrain and enemy units across the entire map 75 | 76 | unit.invincible-cheat-mod-v8-invincible-ship.name = Invincible Ship 77 | unit.invincible-cheat-mod-v8-invincible-ship.description = Invincible, has a shield, can heal units and oneshots everything that belongs to an enemy team. 78 | unit.invincible-cheat-mod-v8-dps-tester-land.name = DPS Tester Unit 79 | unit.invincible-cheat-mod-v8-dps-tester-land.description = A unit can display the damage received and the calculated DPS over a period of time. Clears data after 6s if no damage is received. 80 | 81 | message.invincible-cheat-mod-v8.next-wave-1 = +1 wave 82 | message.invincible-cheat-mod-v8.next-wave-10 = +10 waves 83 | 84 | message.invincible-cheat-mod-v8.projector-up-1 = +0.01 85 | message.invincible-cheat-mod-v8.projector-up-2 = +0.1 86 | message.invincible-cheat-mod-v8.projector-up-3 = +1 87 | message.invincible-cheat-mod-v8.projector-up-4 = +10 88 | message.invincible-cheat-mod-v8.projector-down-1 = -0.01 89 | message.invincible-cheat-mod-v8.projector-down-2 = -0.1 90 | message.invincible-cheat-mod-v8.projector-down-3 = -1 91 | message.invincible-cheat-mod-v8.projector-down-4 = -10 92 | 93 | message.invincible-cheat-mod-v8.dps-armor-up = Armor +1 94 | message.invincible-cheat-mod-v8.dps-armor-down = Armor -1 95 | message.invincible-cheat-mod-v8.dps-hitsize-up = Hit Size +1 96 | message.invincible-cheat-mod-v8.dps-hitsize-down = Hit Size -1 97 | 98 | message.invincible-cheat-mod-v8.dps-info-armor = Armor: {0} 99 | message.invincible-cheat-mod-v8.dps-info-hitsize = HitSize: {0} 100 | message.invincible-cheat-mod-v8.dps-info-hits = Hits: {0} 101 | message.invincible-cheat-mod-v8.dps-info-duration-frame = Duration(frame): {0} 102 | message.invincible-cheat-mod-v8.dps-info-duration-real = Duration(real): {0} 103 | message.invincible-cheat-mod-v8.dps-info-origin-damage = Origin damage: {0} 104 | message.invincible-cheat-mod-v8.dps-info-real-damage = Real damage: {0} 105 | message.invincible-cheat-mod-v8.dps-info-dps-origin = DPS origin: {0} 106 | message.invincible-cheat-mod-v8.dps-info-dps-real = DPS real: {0} -------------------------------------------------------------------------------- /bundles/bundle_ru.properties: -------------------------------------------------------------------------------- 1 | block.invincible-cheat-mod-v8-invincible-wall-small.name = Маленькая непобедимая стена 2 | block.invincible-cheat-mod-v8-invincible-wall-medium.name = Средняя непобедимая стена 3 | block.invincible-cheat-mod-v8-invincible-wall-large.name = Большая непобедимая стена 4 | block.invincible-cheat-mod-v8-cheat-item.name = Быстрый источник предметов 5 | block.invincible-cheat-mod-v8-cheat-item.description = Источник предметов с увеличенной в 36 раз скоростью отдачи. 6 | block.invincible-cheat-mod-v8-cheat-power.name = Мощный источник энергии 7 | block.invincible-cheat-mod-v8-cheat-power.description = Производит 10 миллиардов единиц энергии. 8 | block.invincible-cheat-mod-v8-cheat-liquid.name = Прочный источник жидкостей 9 | block.invincible-cheat-mod-v8-cheat-liquid.description = Гораздо прочнее, чем ванильный источник жидкостей. 10 | block.invincible-cheat-mod-v8-chrono-vault.name = Хроно хранилище 11 | block.invincible-cheat-mod-v8-chrono-vault.description = Хранит 100 миллионов предметов и имеет огромную прочность. 12 | block.invincible-cheat-mod-v8-enemys-cannot-move.name = Поле "Холодильник" 13 | block.invincible-cheat-mod-v8-enemys-cannot-move.description = Блокирует возможность перемещения всех вражеских боевых единиц, находящихся в этом поле. Не воздействует на блоки. 14 | block.invincible-cheat-mod-v8-enemys-control.name = Поле "Вербальщик" 15 | block.invincible-cheat-mod-v8-enemys-control.description = Принуждает вражеские боевые единицы, прикоснувшиеся к полю, перейти в вашу команду, последующий контакт с полем не обязателен. Не воздействует на блоки. 16 | block.invincible-cheat-mod-v8-enemys-no-damage.name = Поле "Эгида" 17 | block.invincible-cheat-mod-v8-enemys-no-damage.description = Аннулирует урон всех орудий у всех вражеских боевых единиц, прикоснувихся к полю. Не воздействует на блоки. 18 | block.invincible-cheat-mod-v8-enemys-remove.name = Поле "Бездна" 19 | block.invincible-cheat-mod-v8-enemys-remove.description = Удаляет все прикоснувшиеся к полю вражеские боевые единицы. Не воздействует на блоки. 20 | block.invincible-cheat-mod-v8-invincible-core.name = Непобедимое ядро 21 | block.invincible-cheat-mod-v8-invincible-core.description = Непобедимое ядро. Личная боевая единица ядра также непобедима. 22 | block.invincible-cheat-mod-v8-invincible-force-projector.name = Сверхсиловой проектор 23 | block.invincible-cheat-mod-v8-invincible-force-projector.description = Создаёт вокруг себя шестиугольное силовое поле с бесконечной прочностью. 24 | block.invincible-cheat-mod-v8-invincible-ship-pad.name = Invincible Ship Pad 25 | block.invincible-cheat-mod-v8-invincible-ship-pad.description = Provides transformation into a invincible ship mech. 26 | block.invincible-cheat-mod-v8-next-wave.name = Контроллер волн 27 | block.invincible-cheat-mod-v8-next-wave.description = Позволяет вызывать волну врагов, даже если не завершена текущая волна.\nКнопка "Стрелка вверх" вызывает 1 волну. Кнопка "Внимание!" вызывает сразу 10 волн.\n[scarlet]Вызов большого количества волн может привести к лагам или к вылету игры. 28 | block.invincible-cheat-mod-v8-quantum-launchpad.name = Пусковая сверхплощадка 29 | block.invincible-cheat-mod-v8-quantum-launchpad.description = Запускает партии предметов в выбранные секторы. 30 | block.invincible-cheat-mod-v8-ultra-overdrive.name = Гиперприводный проектор 31 | block.invincible-cheat-mod-v8-ultra-overdrive.description = Ускоряет все блоки в радиусе действия примерно в 100 тысяч раз. 32 | block.invincible-cheat-mod-v8-slow-overdrive-projector-01.name = Замедляющий проектор (10%) 33 | block.invincible-cheat-mod-v8-slow-overdrive-projector-01.description = Замедляет все блоки в радиусе действия на 10%, воздействует на все команды. 34 | block.invincible-cheat-mod-v8-slow-overdrive-projector-05.name = Замедляющий проектор (50%) 35 | block.invincible-cheat-mod-v8-slow-overdrive-projector-05.description = Замедляет все блоки в радиусе действия на 50%, воздействует на все команды. 36 | block.invincible-cheat-mod-v8-must-die-turret.name = Турель-терминатор 37 | block.invincible-cheat-mod-v8-must-die-turret.description = Стреляет снарядами, моментально уничтожающими врагов, игнорируя их прочность. 38 | block.invincible-cheat-mod-v8-turret-turret.name = Турельная турель 39 | block.invincible-cheat-mod-v8-turret-turret.description = Стреляет другими турелями, которые в свою очередь стреляют своими снарядами. Может выстрелить другой "Турельной турелью".\nВнимание: может выстрелить реактором, который взорвётся при падении. Избегайте стрельбы в сторону своей базы. 40 | block.invincible-cheat-mod-v8-static-drill.name = Статический бур 41 | block.invincible-cheat-mod-v8-static-drill.description = Добывает любую руду со скоростью 60 предметов в секунду. Игнорирует бонус сверхприводных проеуторов. 42 | block.invincible-cheat-mod-v8-adjustable-overdrive-projector.name = Настраиваемый сверхприводный проектор 43 | block.invincible-cheat-mod-v8-adjustable-overdrive-projector.description = Ускоряет все блоки всех команд в радиусе действия в заданное число раз (от 0.01 до 1000). 44 | block.invincible-cheat-mod-v8-super-battery.name = Ёмкий аккуулятор 45 | block.invincible-cheat-mod-v8-super-battery.description = Накапливает энергию во времена её избытка. Выводит энергию во времена её дефицита. Имеет огромную ёмкость. 46 | block.invincible-cheat-mod-v8-chrono-unloader.name = Хроно разгрузчик 47 | block.invincible-cheat-mod-v8-chrono-unloader.description = Дстанционно выгружает выбранный предмет из выбранного блока. 48 | block.invincible-cheat-mod-v8-chrono-pusher.name = Хроно загрузчик 49 | block.invincible-cheat-mod-v8-chrono-pusher.description = Дистационно загружает вводимые предметы в выбранную постройку, если она можёт их принять. 50 | block.invincible-cheat-mod-v8-unit-factory.name = Универсальная фабрика 51 | block.invincible-cheat-mod-v8-unit-factory.description = Производит любую боевую единицы, может причислить её к любой команде. 52 | block.invincible-cheat-mod-v8-team-changer.name = Ядро "Вербальщик" 53 | block.invincible-cheat-mod-v8-team-changer.description = Позволяет менять команду, за которую играть. 54 | block.invincible-cheat-mod-v8-team-changer.details = О НЕТ, КТО-ТО УСТРОИЛ БУНТ!!! 55 | block.invincible-cheat-mod-v8-dps-tester-land-factory.name = Фабрика "Тестировщика урона" 56 | block.invincible-cheat-mod-v8-dps-tester-land-factory.description = Производит "Тестировщик урона". Броню и размер хит-бокса производимых боевых единиц можно поменять в конфигурации блока. 57 | block.invincible-cheat-mod-v8-global-radar.name = Глобальный радар 58 | block.invincible-cheat-mod-v8-global-radar.description = Раскрывает местность и вражеские юниты на всей карте. 59 | 60 | unit.invincible-cheat-mod-v8-invincible-ship.name = Страж "Непобедимого ядра" 61 | unit.invincible-cheat-mod-v8-invincible-ship.description = Имеет силовое поле с бесконечной прочностью, может чинить союзные боевые единицы и уничтожает всё с одного выстрела. 62 | unit.invincible-cheat-mod-v8-dps-tester-land.name = Тестировщик урона 63 | unit.invincible-cheat-mod-v8-dps-tester-land.description = Боевая единица для тестирования урожия. Отображает полученный урон и вычисленный урон в секунду. Сброс данных происходит, если в течении 6 секунд не был получен урон. 64 | 65 | message.invincible-cheat-mod-v8.next-wave-1 = 1 волна 66 | message.invincible-cheat-mod-v8.next-wave-10 = 10 волн 67 | 68 | message.invincible-cheat-mod-v8.projector-up-1 = +0.01 69 | message.invincible-cheat-mod-v8.projector-up-2 = +0.1 70 | message.invincible-cheat-mod-v8.projector-up-3 = +1 71 | message.invincible-cheat-mod-v8.projector-up-4 = +10 72 | message.invincible-cheat-mod-v8.projector-down-1 = -0.01 73 | message.invincible-cheat-mod-v8.projector-down-2 = -0.1 74 | message.invincible-cheat-mod-v8.projector-down-3 = -1 75 | message.invincible-cheat-mod-v8.projector-down-4 = -10 76 | 77 | message.invincible-cheat-mod-v8.dps-armor-up = Броня +1 78 | message.invincible-cheat-mod-v8.dps-armor-down = Броня -1 79 | message.invincible-cheat-mod-v8.dps-hitsize-up = Размер хит-бокса +1 80 | message.invincible-cheat-mod-v8.dps-hitsize-down = Размер хит-бокса -1 81 | 82 | message.invincible-cheat-mod-v8.dps-info-armor = Броня: {0} 83 | message.invincible-cheat-mod-v8.dps-info-hitsize = Размер хит-бокса: {0} 84 | message.invincible-cheat-mod-v8.dps-info-hits = Попаданий: {0} 85 | message.invincible-cheat-mod-v8.dps-info-duration-frame = Длительность (тики): {0} 86 | message.invincible-cheat-mod-v8.dps-info-duration-real = Длительность (секунды): {0} 87 | message.invincible-cheat-mod-v8.dps-info-origin-damage = Нанесённый урон за всё время: {0} 88 | message.invincible-cheat-mod-v8.dps-info-real-damage = Полученный урон за всё время: {0} 89 | message.invincible-cheat-mod-v8.dps-info-dps-origin = Нанесённый урон в секунду: {0} 90 | message.invincible-cheat-mod-v8.dps-info-dps-real = Полученный урон в секунду: {0} -------------------------------------------------------------------------------- /bundles/bundle_zh_CN.properties: -------------------------------------------------------------------------------- 1 | block.invincible-cheat-mod-v8-invincible-wall-small.name = 小型无敌围墙 2 | block.invincible-cheat-mod-v8-invincible-wall-medium.name = 中型无敌围墙 3 | block.invincible-cheat-mod-v8-invincible-wall-large.name = 大型无敌围墙 4 | block.invincible-cheat-mod-v8-cheat-item.name = 作弊物品源 5 | block.invincible-cheat-mod-v8-cheat-item.description = 输出速度是原版物品源的 36 倍。 6 | block.invincible-cheat-mod-v8-cheat-power.name = 作弊电源 7 | block.invincible-cheat-mod-v8-cheat-power.description = 电源 8 | block.invincible-cheat-mod-v8-cheat-liquid.name = 作弊液体源 9 | block.invincible-cheat-mod-v8-cheat-liquid.description = 好多水 10 | block.invincible-cheat-mod-v8-chrono-vault.name = 时空仓库 11 | block.invincible-cheat-mod-v8-chrono-vault.description = 巨型仓库,超结实 12 | block.invincible-cheat-mod-v8-enemys-cannot-move.name = 敌人静止 13 | block.invincible-cheat-mod-v8-enemys-cannot-move.description = 范围内敌人静止 14 | block.invincible-cheat-mod-v8-enemys-control.name = 控制敌人 15 | block.invincible-cheat-mod-v8-enemys-control.description = 范围内敌人变成我们的 16 | block.invincible-cheat-mod-v8-enemys-no-damage.name = 敌人无伤害 17 | block.invincible-cheat-mod-v8-enemys-no-damage.description = 将敌人伤害降为0 18 | block.invincible-cheat-mod-v8-enemys-remove.name = 移除敌人 19 | block.invincible-cheat-mod-v8-enemys-remove.description = 直接移除敌人 20 | block.invincible-cheat-mod-v8-invincible-core.name = 无敌核心 21 | block.invincible-cheat-mod-v8-invincible-core.description = 是核心,且无敌 22 | block.invincible-cheat-mod-v8-invincible-force-projector.name = 无敌力场 23 | block.invincible-cheat-mod-v8-invincible-force-projector.description = 吸吸吸吸吸吸吸吸吸吸吸吸吸吸吸吸 24 | block.invincible-cheat-mod-v8-invincible-ship-pad.name = 无敌机甲平台 25 | block.invincible-cheat-mod-v8-invincible-ship-pad.description = 变身无敌飞船,自身无敌,带有无敌护盾,治疗友方,子弹一击必杀,建造速度无穷 26 | block.invincible-cheat-mod-v8-next-wave.name = 下一波 27 | block.invincible-cheat-mod-v8-next-wave.description = 随便叫下一波,当心卡死 28 | block.invincible-cheat-mod-v8-quantum-launchpad.name = 超级发射台 29 | block.invincible-cheat-mod-v8-quantum-launchpad.description = 输入一个材料可以发射 10000 个材料。 30 | block.invincible-cheat-mod-v8-ultra-overdrive.name = 超速投影 31 | block.invincible-cheat-mod-v8-ultra-overdrive.description = 最大程度加速 32 | block.invincible-cheat-mod-v8-slow-overdrive-projector-01.name = 缓慢投影0.1 33 | block.invincible-cheat-mod-v8-slow-overdrive-projector-01.description = 降低方块工作速度为 10%,对敌我双方有效。 34 | block.invincible-cheat-mod-v8-slow-overdrive-projector-05.name = 缓慢投影0.5 35 | block.invincible-cheat-mod-v8-slow-overdrive-projector-05.description = 降低方块工作速度为 50%,对敌我双方有效。 36 | block.invincible-cheat-mod-v8-must-die-turret.name = 作弊炮 37 | block.invincible-cheat-mod-v8-must-die-turret.description = 发射跟踪、高穿透、可多次分裂的子弹,子弹一击必杀。 38 | block.invincible-cheat-mod-v8-one-shot-turret.name = 一击炮 39 | block.invincible-cheat-mod-v8-one-shot-turret.description = 发射单发大威力子弹,一次只能打死一个敌人。(在低 FPS 下效果不好) 40 | block.invincible-cheat-mod-v8-point-turret.name = 点杀炮 41 | block.invincible-cheat-mod-v8-point-turret.description = 可直接消灭范围内一个点的一个目标,类似厄兆。 42 | block.invincible-cheat-mod-v8-turret-turret.name = 炮炮 43 | block.invincible-cheat-mod-v8-turret-turret.description = 射炮的炮。注意这东西有很小的几率发射核反应堆,可能会炸死我们自己的基地。 44 | block.invincible-cheat-mod-v8-static-drill.name = 稳定钻头 45 | block.invincible-cheat-mod-v8-static-drill.description = 啥都能钻,60/s,不能被力场加速。 46 | block.invincible-cheat-mod-v8-adjustable-overdrive-projector.name = 变速器 47 | block.invincible-cheat-mod-v8-adjustable-overdrive-projector.description = 可以调整速度从 0.01 到 1000,同时影响敌友双方. 48 | block.invincible-cheat-mod-v8-super-battery.name = 超级电池 49 | block.invincible-cheat-mod-v8-super-battery.description = 1 mil。 50 | block.invincible-cheat-mod-v8-chrono-unloader.name = 时空提取器 51 | block.invincible-cheat-mod-v8-chrono-unloader.description = 可以从很远的建筑上提取物品。 52 | block.invincible-cheat-mod-v8-chrono-pusher.name = 时空推送器 53 | block.invincible-cheat-mod-v8-chrono-pusher.description = 可以将物品推送到很远的建筑中。 54 | block.invincible-cheat-mod-v8-unit-factory.name = 单位工厂 55 | block.invincible-cheat-mod-v8-unit-factory.description = 生成任何单位。 56 | block.invincible-cheat-mod-v8-team-changer.name = 队伍更换器 57 | block.invincible-cheat-mod-v8-team-changer.description = 把玩家和本方块一起变成别的队伍 58 | block.invincible-cheat-mod-v8-team-changer.details = 夭寿啦,有人叛变啦!!! 59 | block.invincible-cheat-mod-v8-dps-tester-land-factory.name = DPS 单位工厂 60 | block.invincible-cheat-mod-v8-dps-tester-land-factory.description = 生产 DPS 测试单位。可以通过该工厂修改游戏中所有 DPS 测试单位的护甲和尺寸(只有重新启动游戏才能重置护甲和尺寸)。 61 | block.invincible-cheat-mod-v8-dps-wall-1.name = DPS测试墙1 62 | block.invincible-cheat-mod-v8-dps-wall-1.description = 1x1 的 DPS测试墙。使用方式:建立 DPS 测试墙显示屏,连接到该围墙,即可统计该围墙收到的伤害。 63 | block.invincible-cheat-mod-v8-dps-wall-2.name = DPS测试墙2 64 | block.invincible-cheat-mod-v8-dps-wall-2.description = 2x2 的 DPS测试墙。使用方式:建立 DPS 测试墙显示屏,连接到该围墙,即可统计该围墙收到的伤害。 65 | block.invincible-cheat-mod-v8-dps-wall-3.name = DPS测试墙3 66 | block.invincible-cheat-mod-v8-dps-wall-3.description = 3x3 的 DPS测试墙。使用方式:建立 DPS 测试墙显示屏,连接到该围墙,即可统计该围墙收到的伤害。 67 | block.invincible-cheat-mod-v8-dps-wall-4.name = DPS测试墙4 68 | block.invincible-cheat-mod-v8-dps-wall-4.description = 4x4 的 DPS测试墙。使用方式:建立 DPS 测试墙显示屏,连接到该围墙,即可统计该围墙收到的伤害。 69 | block.invincible-cheat-mod-v8-dps-wall-5.name = DPS测试墙5 70 | block.invincible-cheat-mod-v8-dps-wall-5.description = 5x5 的 DPS测试墙。使用方式:建立 DPS 测试墙显示屏,连接到该围墙,即可统计该围墙收到的伤害。 71 | block.invincible-cheat-mod-v8-dps-wall-display.name = DPS测试墙显示屏 72 | block.invincible-cheat-mod-v8-dps-wall-display.description = 连接多个DPS测试墙之后,可以统计它们受到的伤害。 73 | block.invincible-cheat-mod-v8-global-radar.name = 全球雷达 74 | block.invincible-cheat-mod-v8-global-radar.description = 揭示整个地图的地形与敌方单位。 75 | 76 | 77 | unit.invincible-cheat-mod-v8-invincible-ship.name = 无敌飞船 78 | unit.invincible-cheat-mod-v8-invincible-ship.description = 无敌飞船,自身无敌,带有无敌护盾,治疗友方,子弹一击必杀,建造速度无穷 79 | unit.invincible-cheat-mod-v8-dps-tester-land.name = DPS 测试单位 80 | unit.invincible-cheat-mod-v8-dps-tester-land.description = 可以显示一段时间内收到的伤害及算得的 DPS。6s 不受攻击后清空数据。 81 | 82 | message.invincible-cheat-mod-v8.next-wave-1 = 下一波 83 | message.invincible-cheat-mod-v8.next-wave-10 = 下十波 84 | 85 | message.invincible-cheat-mod-v8.projector-up-1 = +0.01 86 | message.invincible-cheat-mod-v8.projector-up-2 = +0.1 87 | message.invincible-cheat-mod-v8.projector-up-3 = +1 88 | message.invincible-cheat-mod-v8.projector-up-4 = +10 89 | message.invincible-cheat-mod-v8.projector-down-1 = -0.01 90 | message.invincible-cheat-mod-v8.projector-down-2 = -0.1 91 | message.invincible-cheat-mod-v8.projector-down-3 = -1 92 | message.invincible-cheat-mod-v8.projector-down-4 = -10 93 | 94 | message.invincible-cheat-mod-v8.dps-armor-up = 护甲 +1 95 | message.invincible-cheat-mod-v8.dps-armor-down = 护甲 -1 96 | message.invincible-cheat-mod-v8.dps-hitsize-up = 尺寸 +1 97 | message.invincible-cheat-mod-v8.dps-hitsize-down = 尺寸 -1 98 | -------------------------------------------------------------------------------- /content/blocks/adjustable-overdrive-projector.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 2500, 3 | "size": 2, 4 | "hasPower": false, 5 | "targetable": false, 6 | "consumes": {}, 7 | "requirements": [], 8 | "category": "effect", 9 | "research": "ultra-overdrive" 10 | } 11 | -------------------------------------------------------------------------------- /content/blocks/cheat-item.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 2000, 3 | "category": "distribution", 4 | "requirements": [], 5 | "research": "core-shard" 6 | } 7 | -------------------------------------------------------------------------------- /content/blocks/cheat-liquid.hjson: -------------------------------------------------------------------------------- 1 | type: LiquidSource 2 | health: 2000 3 | category: liquid 4 | requirements: [] 5 | research: cheat-item 6 | -------------------------------------------------------------------------------- /content/blocks/cheat-power.hjson: -------------------------------------------------------------------------------- 1 | // type: PowerSource 2 | health: 2000 3 | category: power 4 | laserRange: 100 5 | maxNodes: 1500 6 | requirements: [] 7 | research: cheat-liquid -------------------------------------------------------------------------------- /content/blocks/chrono-pusher.json: -------------------------------------------------------------------------------- 1 | { 2 | "size": 2, 3 | "health": 2000, 4 | "update": true, 5 | "solid": true, 6 | "hasItems": true, 7 | "configurable": true, 8 | "category": "distribution", 9 | "requirements": [], 10 | "research": "chrono-unloader" 11 | } 12 | -------------------------------------------------------------------------------- /content/blocks/chrono-unloader.json: -------------------------------------------------------------------------------- 1 | { 2 | "size": 2, 3 | "health": 2000, 4 | "update": true, 5 | "solid": true, 6 | "hasItems": true, 7 | "configurable": true, 8 | "category": "distribution", 9 | "requirements": [], 10 | "research": "cheat-item" 11 | } 12 | -------------------------------------------------------------------------------- /content/blocks/chrono-vault.hjson: -------------------------------------------------------------------------------- 1 | type: StorageBlock 2 | health: 20000, 3 | itemCapacity: 100000000 4 | hasItems: true 5 | size: 6 6 | requirements: [ 7 | ] 8 | category: effect 9 | research: invincible-core 10 | -------------------------------------------------------------------------------- /content/blocks/dps-tester-land-factory.json: -------------------------------------------------------------------------------- 1 | { 2 | "research": "unit-factory" 3 | } 4 | -------------------------------------------------------------------------------- /content/blocks/dps-wall-1.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 64444, 3 | "size": 1, 4 | "requirements": [], 5 | "update": true, 6 | "solid": true, 7 | "category": "defense", 8 | "research": "dps-tester-land-factory" 9 | } 10 | -------------------------------------------------------------------------------- /content/blocks/dps-wall-2.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 64444, 3 | "size": 2, 4 | "requirements": [], 5 | "update": true, 6 | "solid": true, 7 | "category": "defense", 8 | "research": "dps-wall-1" 9 | } 10 | -------------------------------------------------------------------------------- /content/blocks/dps-wall-3.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 64444, 3 | "size": 3, 4 | "requirements": [], 5 | "update": true, 6 | "solid": true, 7 | "category": "defense", 8 | "research": "dps-wall-2" 9 | } 10 | -------------------------------------------------------------------------------- /content/blocks/dps-wall-4.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 64444, 3 | "size": 4, 4 | "requirements": [], 5 | "update": true, 6 | "solid": true, 7 | "category": "defense", 8 | "research": "dps-wall-3" 9 | } 10 | -------------------------------------------------------------------------------- /content/blocks/dps-wall-5.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 64444, 3 | "size": 5, 4 | "requirements": [], 5 | "update": true, 6 | "solid": true, 7 | "category": "defense", 8 | "research": "dps-wall-4" 9 | } 10 | -------------------------------------------------------------------------------- /content/blocks/dps-wall-display.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 64444, 3 | "size": 5, 4 | "requirements": [], 5 | "update": true, 6 | "solid": true, 7 | "configurable": true, 8 | "category": "defense", 9 | "research": "dps-wall-5" 10 | } 11 | -------------------------------------------------------------------------------- /content/blocks/enemys-cannot-move.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 2000, 3 | "size": 3, 4 | "solid": true, 5 | "targetable": false, 6 | "hasLiquids": false, 7 | "hasPower": false, 8 | "update": true, 9 | "radius": 210, 10 | "requirements": [ 11 | ], 12 | "category": "effect", 13 | "research": "invincible-force-projector" 14 | } 15 | -------------------------------------------------------------------------------- /content/blocks/enemys-control.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 100, 3 | "size": 3, 4 | "solid": false, 5 | "hasLiquids": false, 6 | "hasPower": false, 7 | "update": true, 8 | "radius": 210, 9 | "requirements": [ 10 | ], 11 | "category": "effect", 12 | "research": "enemys-no-damage" 13 | } 14 | -------------------------------------------------------------------------------- /content/blocks/enemys-no-damage.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 2000, 3 | "size": 3, 4 | "solid": true, 5 | "targetable": false, 6 | "hasLiquids": false, 7 | "hasPower": false, 8 | "update": true, 9 | "radius": 210, 10 | "requirements": [ 11 | ], 12 | "category": "effect", 13 | "research": "enemys-cannot-move" 14 | } 15 | -------------------------------------------------------------------------------- /content/blocks/enemys-remove.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 100, 3 | "size": 3, 4 | "solid": false, 5 | "hasLiquids": false, 6 | "hasPower": false, 7 | "update": true, 8 | "radius": 210, 9 | "requirements": [ 10 | ], 11 | "category": "effect", 12 | "research": "enemys-control" 13 | } 14 | -------------------------------------------------------------------------------- /content/blocks/global-radar.json: -------------------------------------------------------------------------------- 1 | { 2 | "size": 2, 3 | "health": 3000, 4 | "fogRadius": 100000, 5 | "solid": true, 6 | "targetable": true, 7 | "hasItems": false, 8 | "destructible": true, 9 | "category": "effect", 10 | "requirements": [], 11 | "research": "next-wave" 12 | } 13 | -------------------------------------------------------------------------------- /content/blocks/invincible-core.json: -------------------------------------------------------------------------------- 1 | { 2 | "size": 3, 3 | "hasItems": true, 4 | "unloadable": true, 5 | "breakable": true, 6 | "rebuildable": false, 7 | "health": 1000, 8 | "itemCapacity": 100000, 9 | "requirements": [], 10 | "category": "effect", 11 | "research": "cheat-item" 12 | } 13 | -------------------------------------------------------------------------------- /content/blocks/invincible-force-projector.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 100, 3 | "size": 3, 4 | "solid": true, 5 | "targetable": false, 6 | "hasLiquids": false, 7 | "hasPower": false, 8 | "radius": 210, 9 | "requirements": [ 10 | ], 11 | "category": "effect", 12 | "research": "cheat-power" 13 | } 14 | -------------------------------------------------------------------------------- /content/blocks/invincible-wall-large.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 1, 3 | "size": 3, 4 | "requirements": [], 5 | "category": "defense", 6 | "research": "invincible-wall-medium" 7 | } 8 | -------------------------------------------------------------------------------- /content/blocks/invincible-wall-medium.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 1, 3 | "size": 2, 4 | "requirements": [], 5 | "category": "defense", 6 | "research": "invincible-wall-small" 7 | } 8 | -------------------------------------------------------------------------------- /content/blocks/invincible-wall-small.json: -------------------------------------------------------------------------------- 1 | { 2 | "health": 1, 3 | "size": 1, 4 | "requirements": [], 5 | "category": "defense", 6 | "research": "cheat-power" 7 | } 8 | -------------------------------------------------------------------------------- /content/blocks/must-die-turret.json: -------------------------------------------------------------------------------- 1 | { 2 | "category": "turret", 3 | "health": 6000, 4 | "range": 500, 5 | "inaccuracy": 25, 6 | "rotateSpeed": 20, 7 | "targetInterval": 0, 8 | "shootCone": 80, 9 | "shootSound": "shootBig", 10 | "requirements": [], 11 | "research": "cheat-item" 12 | } 13 | -------------------------------------------------------------------------------- /content/blocks/next-wave.json: -------------------------------------------------------------------------------- 1 | { 2 | "size": 2, 3 | "health": 2000, 4 | "update": true, 5 | "solid": false, 6 | "targetable": false, 7 | "hasItems": false, 8 | "configurable": true, 9 | "category": "effect", 10 | "requirements": [], 11 | "research": "cheat-power" 12 | } 13 | -------------------------------------------------------------------------------- /content/blocks/one-shot-turret.json: -------------------------------------------------------------------------------- 1 | { 2 | "category": "turret", 3 | "size": 2, 4 | "health": 6000, 5 | "range": 600, 6 | "reload": 30, 7 | "inaccuracy": 0, 8 | "rotateSpeed": 22, 9 | "targetInterval": 0, 10 | "shootCone": 2, 11 | "shootSound": "shootBig", 12 | "consumes": { 13 | "coolant": { 14 | "amount": 6 15 | } 16 | }, 17 | "coolantMultiplier": 0.8333333, 18 | "requirements": [], 19 | "research": "must-die-turret" 20 | } 21 | -------------------------------------------------------------------------------- /content/blocks/point-turret.json: -------------------------------------------------------------------------------- 1 | { 2 | "category": "turret", 3 | "size": 2, 4 | "health": 6000, 5 | "range": 600, 6 | "reload": 30, 7 | "inaccuracy": 0, 8 | "rotateSpeed": 22, 9 | "targetInterval": 0, 10 | "shootCone": 2, 11 | "shootSound": "shootBig", 12 | "consumes": { 13 | "coolant": { 14 | "amount": 6 15 | } 16 | }, 17 | "coolantMultiplier": 0.8333333, 18 | "requirements": [], 19 | "research": "must-die-turret" 20 | } 21 | -------------------------------------------------------------------------------- /content/blocks/smart-filler.json.notfinished: -------------------------------------------------------------------------------- 1 | { 2 | "size": 3, 3 | "health": 6000, 4 | "fogRadius": 60, 5 | "solid": true, 6 | "update": true, 7 | "targetable": true, 8 | "hasItems": false, 9 | "destructible": true, 10 | "category": "distribution", 11 | "requirements": [], 12 | "research": "next-wave" 13 | } 14 | -------------------------------------------------------------------------------- /content/blocks/static-drill.json: -------------------------------------------------------------------------------- 1 | { 2 | "size": 1, 3 | "health": 1500, 4 | "tier": 2147483647, 5 | "drillTime": 1, 6 | "hardnessDrillMultiplier": 0, 7 | "liquidBoostIntensity": 2, 8 | "canOverdrive": false, 9 | "warmupSpeed": 30, 10 | "drillEffect": "none", 11 | "updateEffect": "none", 12 | "rotateSpeed": 8, 13 | "consumes": { 14 | "liquid": { 15 | "liquid": "water", 16 | "amount": 0.01, 17 | "booster": true, 18 | "optional": true 19 | } 20 | }, 21 | "itemCapacity": 1000000, 22 | "liquidCapacity": 1, 23 | "requirements": [], 24 | "category": "production", 25 | "research": "cheat-item" 26 | } 27 | -------------------------------------------------------------------------------- /content/blocks/super-battery.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "Battery", 3 | "category": "power", 4 | "buildVisibility": "shown", 5 | "size": 1, 6 | "health": 1000, 7 | "emptyLightColor": "#000000", 8 | "fullLightColor": "#ff3eee", 9 | "consumes": { 10 | "powerBuffered": 1000000 11 | }, 12 | "requirements": [], 13 | "research": "cheat-power" 14 | } 15 | -------------------------------------------------------------------------------- /content/blocks/team-changer.json: -------------------------------------------------------------------------------- 1 | { 2 | "size": 3, 3 | "hasItems": true, 4 | "unloadable": true, 5 | "breakable": true, 6 | "rebuildable": false, 7 | "configurable": true, 8 | "health": 1000, 9 | "itemCapacity": 10000, 10 | "requirements": [], 11 | "category": "effect", 12 | "research": "invincible-core" 13 | } 14 | -------------------------------------------------------------------------------- /content/blocks/turret-turret.json.not: -------------------------------------------------------------------------------- 1 | { 2 | "category": "turret", 3 | "health": 6000, 4 | "size": 4, 5 | "range": 570, 6 | "inaccuracy": 15, 7 | "rotateSpeed": 20, 8 | "targetInterval": 0, 9 | "shootCone": 80, 10 | "shootSound": "shoot", 11 | "requirements": [], 12 | "research": "must-die-turret" 13 | } 14 | -------------------------------------------------------------------------------- /content/blocks/ultra-overdrive.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "OverdriveProjector", 3 | "health": 1221, 4 | "size": 2, 5 | "range": 180, 6 | "hasPower": false, 7 | "speedBoostPhase": 120, 8 | "useTime": 1000, 9 | "phaseRangeBoost": 0, 10 | "speedBoost": 1000.0, 11 | "consumes": {}, 12 | "requirements": [], 13 | "category": "effect", 14 | "research": "chrono-vault" 15 | } 16 | -------------------------------------------------------------------------------- /content/blocks/unit-factory.json: -------------------------------------------------------------------------------- 1 | { 2 | "research": "next-wave" 3 | } 4 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/icon.png -------------------------------------------------------------------------------- /mod.hjson: -------------------------------------------------------------------------------- 1 | displayName: (v8) Invincible Cheat 无敌作弊 2 | name: "Invincible Cheat Mod v8" 3 | author: 滞人 4 | description: ''' 5 | This is a [red]cheat[] mod, abuse will reduce your game experience, be careful for using this. 6 | GitHub: https://github.com/abomb4/super-cheat 7 | email: abomb4@163.com 8 | Wellcome to feedback! 9 | 如果 Android 玩家发现物品描述都是英文,去游戏设置 -> 语言 -> 切换成任意其他语言(如繁体中文)-> 重启 -> 切回简体中文即可。 10 | 11 | Features: 12 | - Adjustable Overdrive Projector (speedup, or slow down) 13 | - Team Changer 14 | - DPS Tester Unit and Walls 15 | - Invincible Core and Invincible build plane 16 | - Cheat Items (power source, liquid source, item source with 36x faster) 17 | - Invincible Wall, Invincible Force Projector 18 | - Several strange projectors 19 | - Chronosphere Unloader and Pusher 20 | - Unit Factory that can build unit for enemys 21 | 22 | 这是个[red]作弊[] mod,会降低游戏体验,请谨慎使用。 23 | 主要特性: 24 | - 可调整的超速投影(更快,也可以更慢) 25 | - 队伍更换器 26 | - DPS 测试单位与测试墙 27 | - 无敌核心,无敌建造机 28 | - 作弊物品(电源、水源、物品源超快版) 29 | - 无敌围墙,无敌力场 30 | - 一大堆神奇力场 31 | - 时空提取器、时空推送器 32 | - 单位工厂(可以给敌人出兵) 33 | 34 | Это [red]читерный[] мод, злоупотребление испортит интерес к игре, острожней с этим. 35 | Возможности: 36 | - Настраиваемый сверхприводный проектор (ускорение или замедление) 37 | - Блоки, меняющие команду, за которую играют те или иные единицы (или вы сами) 38 | - Измеритель урона в секунду 39 | - Непобедимое ядро и его строительная боевая единица 40 | - Cheat Items (power source, liquid source, item source with 36x faster) 41 | - Неразрушаемые стены, силовой проектор с бесконечной прочностью 42 | - Несколько полезных проекторов 43 | - Дистанционный загрузчик и разгрузчик 44 | - Универсальный завод боевых единиц, также может производить их для врагов 45 | ''' 46 | version: 4.0.0 47 | minGameVersion: 149 48 | -------------------------------------------------------------------------------- /package.ps1: -------------------------------------------------------------------------------- 1 | # 读取 mod.hjson 文件并提取版本号 2 | $version = Select-String -Path "mod.hjson" -Pattern "^version:" | ForEach-Object { $_.Line -replace "version:", "" -replace "\s", "" } 3 | 4 | # 压缩指定文件和目录 5 | $zipFileName = "super-cheat-v$version.zip" 6 | $filesToZip = @("README.md", "preview.png", "icon.png", "LICENSE", "mod.hjson", "bundles", "content", "scripts", "sounds", "sprites") 7 | 8 | Compress-Archive -Path $filesToZip -DestinationPath $zipFileName -Force 9 | -------------------------------------------------------------------------------- /package.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | version=$(cat mod.hjson |grep -e "^version:" |awk '{print $2}') 3 | zip -r "super-cheat-v${version}.zip" README.md preview.png icon.png LICENSE mod.hjson bundles/ content/ scripts/ sprites/ sounds/ -------------------------------------------------------------------------------- /preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/preview.png -------------------------------------------------------------------------------- /preview.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/preview.xcf -------------------------------------------------------------------------------- /previews/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/previews/1.jpg -------------------------------------------------------------------------------- /previews/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/previews/2.jpg -------------------------------------------------------------------------------- /previews/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/previews/3.jpg -------------------------------------------------------------------------------- /previews/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/previews/4.jpg -------------------------------------------------------------------------------- /previews/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/previews/5.jpg -------------------------------------------------------------------------------- /previews/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/previews/6.jpg -------------------------------------------------------------------------------- /scripts/abomb4-lib/hud.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | 配置项定义: 4 | interface FragConfig { 5 | rows: number; // 有几行 6 | columns: number; // 有几列 7 | categories: FragCategory[]; // 分类信息 8 | } 9 | interface FragCategory { 10 | icon: () => TextureRegionDrawable; // 图标获取函数,如 () => Icon.warning 11 | blocks: Block[]; // 该分类包含的方块列表 12 | } 13 | */ 14 | 15 | /** 16 | * 创建一个左下角的额外分类窗口,需要自定义分类。 17 | * 18 | * copied from PlacementFragment 19 | * 20 | * rows: 4 21 | * columns: 6 22 | * categories: 7 elements 23 | * 24 | * +------------------------------------+ 25 | * | +--+ +--+ +--+ +--+ +--+ +--+ | 26 | * | | | | | | | | | | | | | | 27 | * | +--+ +--+ +--+ +--+ +--+ +--+ | 28 | * | +--+ +--+ +--+ +--+ +--+ +--+ | 29 | * | | | | | | | | | | | | | | 30 | * | +--+ +--+ +--+ +--+ +--+ +--+ | 31 | * | +--+ +--+ +--+ +--+ +--+ +--+ | 32 | * | | | | | | | | | | | | | | 33 | * | +--+ +--+ +--+ +--+ +--+ +--+ | 34 | * | +--+ +--+ +--+ +--+ +--+ +--+ | 35 | * | | | | | | | | | | | | | | 36 | * | +--+ +--+ +--+ +--+ +--+ +--+ | 37 | * |------------------------------------| 38 | * | +--+ +--+ +--+ +--+ +--+ +--+ | 39 | * | | | | | | | | | | | | | | 40 | * | +--+ +--+ +--+ +--+ +--+ +--+ | 41 | * | +--+ | 42 | * | | | | 43 | * | +--+ | 44 | * +------------------------------------+ 45 | * 46 | * @param {FragConfig} 配置项 47 | * @author abomb4 48 | */ 49 | var leftFrag = (fragConfig) => { 50 | // TODO validate fragConfig 51 | const iconWidth = 46; 52 | const padding = 4; 53 | const MARGIN_RIGHT = 314; 54 | 55 | var currentCategory = 0; 56 | var menuHoverBlock; 57 | var selectedBlocks = new ObjectMap(); 58 | var scrollPositions = new ObjectFloatMap(); 59 | var blockTable; 60 | var blockPane; 61 | var toggler; 62 | 63 | var hide = true; 64 | 65 | var fragment; 66 | /** 判断某个方块类型是不是属于左下角 */ 67 | function containsContent(content) { 68 | var found = false; 69 | var cs = fragConfig.categories; 70 | loop: for (var i = 0; i < cs.length; i++) { 71 | var category = cs[i]; 72 | for (var j = 0; j < category.blocks.length; j++) { 73 | var block = category.blocks[j]; 74 | if (content == block) { 75 | found = true; 76 | break loop; 77 | } 78 | } 79 | } 80 | 81 | return found; 82 | } 83 | function rebuild() { 84 | if (fragment) { 85 | currentCategory = 0; 86 | var index = toggler.getZIndex(); 87 | var group = toggler.parent; 88 | toggler.remove(); 89 | fragment.build(group); 90 | toggler.setZIndex(index); 91 | } 92 | } 93 | Events.on(WorldLoadEvent, cons(event => { 94 | Core.app.post(run(() => { 95 | rebuild(); 96 | })); 97 | })); 98 | Events.on(UnlockEvent, cons(event => { 99 | if (containsContent(event.content)) { 100 | rebuild(); 101 | } 102 | })); 103 | 104 | function unlocked(block) { 105 | return block.unlockedNow(); 106 | } 107 | function getSelectedBlock(cat) { 108 | return selectedBlocks.get(cat, prov(() => { 109 | var category = fragConfig.categories[cat] 110 | return category.blocks.find(v => unlocked(v)); 111 | })); 112 | } 113 | fragment = new JavaAdapter(Fragment, { 114 | build(parent) { 115 | parent.fill(cons(full => { 116 | toggler = full; 117 | full.bottom().right().marginRight(MARGIN_RIGHT).visibility = boolp(() => Vars.ui.hudfrag.shown); 118 | if (hide) { 119 | full.button(Icon.eyeSmall, run(() => { 120 | hide = false; 121 | rebuild(); 122 | })).width(50).height(50); 123 | } else { 124 | 125 | full.button(Icon.cancel, run(() => { 126 | hide = true; 127 | rebuild(); 128 | })).width(50).height(50).bottom(); 129 | full.table(cons(frame => { 130 | 131 | var rebuildCategory = run(() => { 132 | 133 | blockTable.clear(); 134 | blockTable.top().margin(5); 135 | 136 | var index = 0; 137 | var group = new ButtonGroup(); 138 | group.setMinCheckCount(0); 139 | 140 | var category = fragConfig.categories[currentCategory || 0]; 141 | for (var j = 0; j < category.blocks.length; j++) { 142 | var block = ((sss) => category.blocks[sss])(j); 143 | if (!unlocked(block)) { continue; } 144 | if (index++ % fragConfig.columns == 0) { 145 | blockTable.row(); 146 | } 147 | 148 | var button = ((block) => 149 | blockTable.button(new TextureRegionDrawable(block.icon(Cicon.medium)), Styles.selecti, run(() => { 150 | if (unlocked(block)) { 151 | if (Core.input.keyDown(Packages.arc.input.KeyCode.shiftLeft) && Fonts.getUnicode(block.name) != 0) { 152 | Core.app.setClipboardText(Fonts.getUnicode(block.name) + ""); 153 | Vars.ui.showInfoFade("@copied"); 154 | } else { 155 | Vars.control.input.block = Vars.control.input.block == block ? null : block; 156 | selectedBlocks.put(currentCategory, Vars.control.input.block); 157 | hide = true; 158 | rebuild(); 159 | } 160 | } 161 | })).size(iconWidth).group(group).name("block-" + block.name).get() 162 | )(block); 163 | button.resizeImage(Cicon.medium.size); 164 | 165 | button.update(((block, button) => run(() => { 166 | var core = Vars.player.core(); 167 | var color = (Vars.state.rules.infiniteResources 168 | || (core != null && (core.items.has(block.requirements, Vars.state.rules.buildCostMultiplier) || Vars.state.rules.infiniteResources))) 169 | && Vars.player.isBuilder() ? Color.white : Color.gray; 170 | 171 | button.forEach(cons(elem => { elem.setColor(color); })); 172 | button.setChecked(Vars.control.input.block == block); 173 | 174 | if (!block.isPlaceable()) { 175 | button.forEach(cons(elem => elem.setColor(Color.darkGray))); 176 | } 177 | 178 | button.hovered(run(() => menuHoverBlock = block)); 179 | button.exited(run(() => { 180 | if (menuHoverBlock == block) { 181 | menuHoverBlock = null; 182 | } 183 | })); 184 | }))(block, button)); 185 | } 186 | 187 | //add missing elements to even out table size 188 | if (index < fragConfig.columns) { 189 | for (var k = 0; k < fragConfig.columns - index; k++) { 190 | blockTable.add().size(iconWidth); 191 | } 192 | } 193 | blockTable.act(0); 194 | blockPane.setScrollYForce(scrollPositions.get(currentCategory, 0)); 195 | Core.app.post(() => { 196 | blockPane.setScrollYForce(scrollPositions.get(currentCategory, 0)); 197 | blockPane.act(0); 198 | blockPane.layout(); 199 | }); 200 | 201 | }); 202 | 203 | frame.image().color(Pal.gray).colspan(fragConfig.columns).height(padding).growX(); 204 | frame.row(); 205 | frame.table(Tex.pane2, cons(blocksSelect => { 206 | blocksSelect.margin(padding).marginTop(0); 207 | blockPane = blocksSelect.pane(cons(blocks => blockTable = blocks)).height(iconWidth * fragConfig.rows + padding) 208 | .update(cons(pane => { 209 | if (pane.hasScroll()) { 210 | var result = Core.scene.hit(Core.input.mouseX(), Core.input.mouseY(), true); 211 | if (result == null || !result.isDescendantOf(pane)) { 212 | Core.scene.setScrollFocus(null); 213 | } 214 | } 215 | })).grow().get(); 216 | blockPane.setStyle(Styles.smallPane); 217 | blocksSelect.row(); 218 | blocksSelect.table(cons(table => { 219 | 220 | table.image().color(Pal.gray).height(padding).colspan(fragConfig.columns).growX(); 221 | table.row(); 222 | table.left().margin(0).defaults().size(iconWidth).left(); 223 | 224 | var group = new ButtonGroup(); 225 | var index = 0; 226 | var cs = fragConfig.categories; 227 | for (var i = 0; i < cs.length; i++) { 228 | if (index++ % fragConfig.columns == 0) { 229 | table.row(); 230 | } 231 | var category = cs[i]; 232 | (cc => { 233 | table.button(category.icon(), Styles.clearTogglei, run(() => { 234 | currentCategory = cc; 235 | if (Vars.control.input.block != null) { 236 | Vars.control.input.block = getSelectedBlock(currentCategory); 237 | } 238 | rebuildCategory.run(); 239 | })).group(group).update(cons(v => v.setChecked(currentCategory == v))).name("category-" + cc); 240 | })(i); 241 | } 242 | //add missing elements to even out table size 243 | if (index < fragConfig.columns) { 244 | for (var k = 0; k < fragConfig.columns - index; k++) { 245 | table.add().size(iconWidth); 246 | } 247 | } 248 | })).name("inputTable").growX(); 249 | })).fillY().bottom().touchable(Touchable.enabled); 250 | 251 | rebuildCategory.run(); 252 | // frame.update(() -> { 253 | // if(gridUpdate(control.input)) rebuildCategory.run(); 254 | // }); 255 | })); 256 | } 257 | })); 258 | }, 259 | }); 260 | 261 | return fragment; 262 | }; 263 | 264 | Events.on(ClientLoadEvent, cons((e) => { 265 | var frag = leftFrag({ 266 | rows: 4, 267 | columns: 6, 268 | categories: [ 269 | { 270 | icon: () => Icon.warning, blocks: [ 271 | Blocks.mechanicalDrill, Blocks.conveyor, Blocks.duo, Blocks.copperWall, 272 | Blocks.distributor, Blocks.junction, Blocks.itemBridge, Blocks.scatter, 273 | Blocks.graphitePress, Blocks.hail, Blocks.combustionGenerator, Blocks.battery, 274 | Blocks.pneumaticDrill, Blocks.titaniumConveyor, Blocks.siliconSmelter, Blocks.airFactory, 275 | ] 276 | }, 277 | { icon: () => Icon.power, blocks: [Blocks.rtgGenerator] }, 278 | ] 279 | }); 280 | frag.build(Vars.ui.hudGroup); 281 | })); 282 | -------------------------------------------------------------------------------- /scripts/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "", 4 | "target": "ES6" 5 | }, 6 | "include": [ 7 | "**/*" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /scripts/main.js: -------------------------------------------------------------------------------- 1 | 2 | require('super-cheat/lib') 3 | require('super-cheat/cheat-item') 4 | require('super-cheat/must-die-turret') 5 | require('super-cheat/one-shot-turret') 6 | require('super-cheat/point-turret') 7 | require('super-cheat/enemys-cannot-move') 8 | require('super-cheat/enemys-control') 9 | require('super-cheat/enemys-no-damage') 10 | require('super-cheat/enemys-remove') 11 | require('super-cheat/invincible-core') 12 | require('super-cheat/static-drill') 13 | require('super-cheat/invincible-force-projector') 14 | require('super-cheat/invincible-simple-blocks') 15 | require('super-cheat/next-wave') 16 | require('super-cheat/quantum-launchpad') 17 | require('super-cheat/adjustable-overdrive-projector') 18 | require('super-cheat/chrono-unloader') 19 | require('super-cheat/chrono-pusher') 20 | // require('super-cheat/turret-turret') 21 | require('super-cheat/dps-tester-unit') 22 | require('super-cheat/dps-walls') 23 | require('super-cheat/unit-factory') 24 | require('super-cheat/team-changer') 25 | require('super-cheat/smart-filler') 26 | 27 | // Events.on(EventType.ClientLoadEvent, cons(e => { 28 | 29 | // Icon.trash = new Packages.arc.scene.style.TextureRegionDrawable(Core.atlas.find("invincible-cheat-mod-v8-must-die-turret", Core.atlas.find("clear"))) 30 | // Icon.icons.put("trash", Icon.trash); 31 | 32 | // Vars.ui.settings = new SettingsMenuDialog(); 33 | 34 | // var dialog = new JavaAdapter(BaseDialog, {}, "si"); 35 | // dialog.shown(run(() => { 36 | // dialog.cont.table(Tex.button, cons(t => { 37 | // t.defaults().size(280, 60).left(); 38 | // t.button("aoisdjiasjdio", Icon.trash, Styles.cleart, run(() => { 39 | // dialog.hide(); 40 | // })); 41 | // })); 42 | // })); 43 | 44 | // dialog.show(); 45 | // })); 46 | -------------------------------------------------------------------------------- /scripts/super-cheat/adjustable-overdrive-projector.js: -------------------------------------------------------------------------------- 1 | 2 | const lib = require('super-cheat/lib'); 3 | 4 | const healed = new IntSet(); 5 | 6 | (() => { 7 | 8 | function speedToText(speed) { 9 | var s = speed + ""; 10 | if (s.length > 4) { 11 | return s.slice(0, s.length - 2); 12 | } else if (s.length > 2) { 13 | return s.slice(0, s.length - 2) + '.' + s.slice(s.length - 2, s.length); 14 | } else if (s.length == 2) { 15 | return "0." + s; 16 | } else { 17 | return "0.0" + s; 18 | } 19 | } 20 | 21 | var up1 ; 22 | var up2 ; 23 | var up3 ; 24 | var up4 ; 25 | var down1 ; 26 | var down2 ; 27 | var down3 ; 28 | var down4 ; 29 | 30 | const MAX = 1000 * 100; 31 | const MIN = 1; 32 | // 使用数组下标获取;存储的是乘以 100 的数字 33 | const commandMap = [1, 10, 100, 1000]; 34 | 35 | var lastNumber = 200; 36 | 37 | const range = 120; 38 | const reload = 30; 39 | const baseColor = Color.valueOf("feb380"); 40 | const phaseColor = Color.valueOf("ff9ed5"); 41 | 42 | const INIT_MASK = 1000000; 43 | 44 | var blockType = extend(Block, "adjustable-overdrive-projector", { 45 | load() { 46 | up1 = lib.loadRegion("up1"); 47 | up2 = lib.loadRegion("up2"); 48 | up3 = lib.loadRegion("up3"); 49 | up4 = lib.loadRegion("up4"); 50 | down1 = lib.loadRegion("down1"); 51 | down2 = lib.loadRegion("down2"); 52 | down3 = lib.loadRegion("down3"); 53 | down4 = lib.loadRegion("down4"); 54 | this.super$load(); 55 | }, 56 | drawPlace(x, y, rotation, valid) { 57 | const tilesize = Vars.tilesize; 58 | Drawf.dashCircle(x * tilesize + this.offset, y * tilesize + this.offset, range, Pal.accent); 59 | }, 60 | }); 61 | blockType.update = true; 62 | blockType.solid = true; 63 | blockType.configurable = true; 64 | 65 | lib.setBuilding(blockType, (block) => { 66 | var heat = 0; 67 | var charge = 1; 68 | var phaseHeat = 0; 69 | // 存储的是乘以 100 的整数 70 | var speedTo = 200; 71 | function getHeat() { return heat; }; 72 | function getCharge() { return charge; }; 73 | function getPhaseHeat() { return phaseHeat; }; 74 | function getSpeedTo() { return speedTo; }; 75 | function getSpeedToDecimal() { return speedTo / 100; }; 76 | function getSpeedToText() { return new Packages.java.lang.String(speedToText(speedTo)); }; 77 | function setHeat(v) { heat = v; }; 78 | function setCharge(v) { charge = v; }; 79 | function setPhaseHeat(v) { phaseHeat = v; }; 80 | function setSpeedTo(v) { speedTo = v; }; 81 | 82 | return new JavaAdapter(Building, { 83 | playerPlaced() { 84 | // 算出最少需要多少次可以达到 lastNumber ,并发送指定次数个 configure 85 | Core.app.post(run(() => this.configure(lastNumber + INIT_MASK))); 86 | }, 87 | buildConfiguration(table) { 88 | table.button(new Packages.arc.scene.style.TextureRegionDrawable(up1), Styles.cleari, run(() => { this.configure(0) })).size(40).tooltip(lib.getMessage("message", "projector-up-1")); 89 | table.button(new Packages.arc.scene.style.TextureRegionDrawable(up2), Styles.cleari, run(() => { this.configure(1) })).size(40).tooltip(lib.getMessage("message", "projector-up-2")); 90 | table.button(new Packages.arc.scene.style.TextureRegionDrawable(up3), Styles.cleari, run(() => { this.configure(2) })).size(40).tooltip(lib.getMessage("message", "projector-up-3")); 91 | table.button(new Packages.arc.scene.style.TextureRegionDrawable(up4), Styles.cleari, run(() => { this.configure(3) })).size(40).tooltip(lib.getMessage("message", "projector-up-4")); 92 | table.row(); 93 | table.button(new Packages.arc.scene.style.TextureRegionDrawable(down1), Styles.cleari, run(() => { this.configure(100) })).size(40).tooltip(lib.getMessage("message", "projector-down-1")); 94 | table.button(new Packages.arc.scene.style.TextureRegionDrawable(down2), Styles.cleari, run(() => { this.configure(101) })).size(40).tooltip(lib.getMessage("message", "projector-down-2")); 95 | table.button(new Packages.arc.scene.style.TextureRegionDrawable(down3), Styles.cleari, run(() => { this.configure(102) })).size(40).tooltip(lib.getMessage("message", "projector-down-3")); 96 | table.button(new Packages.arc.scene.style.TextureRegionDrawable(down4), Styles.cleari, run(() => { this.configure(103) })).size(40).tooltip(lib.getMessage("message", "projector-down-4")); 97 | }, 98 | configured(player, value) { 99 | // 小于 100 视为减小命令,大于 1000000(七位数)视为初始化 100 | if (value > INIT_MASK) { 101 | setSpeedTo(value - INIT_MASK); 102 | } else if (value >= 100) { 103 | var commandVal = commandMap[value - 100]; 104 | var result = Math.max(MIN, getSpeedTo() - commandVal); 105 | setSpeedTo(result); 106 | lastNumber = getSpeedTo(); 107 | } else { 108 | var commandVal = commandMap[value]; 109 | var result = Math.min(MAX, getSpeedTo() + commandVal); 110 | setSpeedTo(result); 111 | lastNumber = getSpeedTo(); 112 | } 113 | }, 114 | drawLight(){ 115 | Drawf.light(this.team, this.x, this.y, 50 * this.efficiency, baseColor, 0.7 * this.efficiency); 116 | }, 117 | drawSelect(){ 118 | var realRange = range; 119 | Vars.indexer.eachBlock(this, realRange, boolf(other => other.block.canOverdrive), cons(other => { 120 | var tmp = Tmp.c1.set(baseColor); 121 | tmp.a = Mathf.absin(4, 1); 122 | Drawf.selected(other, tmp); 123 | })); 124 | Drawf.dashCircle(this.x, this.y, realRange, baseColor); 125 | }, 126 | draw(){ 127 | this.super$draw(); 128 | const tilesize = Vars.tilesize; 129 | var f = 1 - (Time.time / 100) % 1; 130 | 131 | Draw.color(baseColor, phaseColor, getPhaseHeat()); 132 | Draw.alpha(getHeat() * Mathf.absin(Time.time, 10, 1) * 0.5); 133 | Draw.rect(this.topRegion, this.tile.drawx(), this.tile.drawy()); 134 | Draw.alpha(1); 135 | Lines.stroke((2 * f + 0.2) * getHeat()); 136 | Lines.square(this.tile.drawx(), this.tile.drawy(), (1 - f) * 8); 137 | 138 | var font = Fonts.def; 139 | font.draw(getSpeedToText(), this.x, this.y + 1.5, Color.purple, 0.18, false, Align.center); 140 | 141 | Draw.reset(); 142 | }, 143 | updateTile() { 144 | const speedBoost = getSpeedToDecimal(); 145 | const duration = reload + 1; 146 | Vars.indexer.eachBlock(this, range, boolf(other => true), cons(other => { 147 | if (speedBoost < 1) { 148 | if (speedBoost <= other.timeScale) { 149 | other.timeScaleDuration = Math.max(other.timeScaleDuration, duration); 150 | } 151 | other.applySlowdown(speedBoost, duration); 152 | } else { 153 | other.applyBoost(speedBoost, duration); 154 | } 155 | })); 156 | }, 157 | write(writer) { 158 | this.super$write(writer); 159 | writer.f(heat); 160 | writer.f(phaseHeat); 161 | writer.f(speedTo); 162 | }, 163 | read(reader, revision) { 164 | this.super$read(reader, revision); 165 | heat = reader.f(); 166 | phaseHeat = reader.f(); 167 | speedTo = reader.f(); 168 | }, 169 | }); 170 | }); 171 | })(); 172 | -------------------------------------------------------------------------------- /scripts/super-cheat/cheat-item.js: -------------------------------------------------------------------------------- 1 | var lib = require('super-cheat/lib'); 2 | 3 | var itemSource = extend(ItemSource, 'cheat-item', {}); 4 | lib.setBuildingSimple(itemSource, ItemSource.ItemSourceBuild, { 5 | dump(item) { 6 | var count = 36; 7 | this.items.set(item, count); 8 | while (count > 0 && this.super$dump(item)) { 9 | count--; 10 | } 11 | }, 12 | }); 13 | 14 | var powerSource = extend(PowerSource, 'cheat-power', {}); 15 | lib.setBuildingSimple(powerSource, PowerSource.PowerSourceBuild, { 16 | getPowerProduction(tile) { 17 | return this.enabled ? 10000000000 : 0; 18 | } 19 | }); 20 | -------------------------------------------------------------------------------- /scripts/super-cheat/dps-tester-unit.js: -------------------------------------------------------------------------------- 1 | const lib = require('super-cheat/lib') 2 | 3 | function keep3(num) { 4 | let numStr = num.toString() 5 | let index = numStr.indexOf('.') 6 | return index === -1 ? numStr : numStr.slice(0, index + 4) 7 | } 8 | const landGroup = new EntityGroup(Packages.mindustry.gen.Entityc, false, false) 9 | 10 | const landFactory = extend(UnitFactory, 'dps-tester-land-factory', { 11 | currentArmor: UnitTypes.reign.armor, 12 | currentHitSize: UnitTypes.reign.hitSize, 13 | }) 14 | landFactory.buildVisibility = BuildVisibility.shown 15 | landFactory.size = 3 16 | landFactory.hasPower = false 17 | landFactory.targetable = false 18 | landFactory.health = 65535 19 | landFactory.itemCapacity = 1 20 | landFactory.payloadSpeed = 3 21 | landFactory.category = Category.units 22 | 23 | function setArmor(val) { 24 | landFactory.currentArmor = Math.max(0, val) 25 | landUnitType.armor = landFactory.currentArmor 26 | } 27 | function setHitSize(val) { 28 | landFactory.currentHitSize = Math.max(0, val) 29 | landUnitType.hitSize = landFactory.currentHitSize 30 | } 31 | const CALL_setArmor = (() => { 32 | const TYPE = 'dpsArmor' 33 | 34 | function makePackage(val) { 35 | return val + '' 36 | } 37 | /** 38 | * Read packet to objects 39 | * 40 | * @param {string} str the packet 41 | * @returns {{val: number}} contains 3 42 | */ 43 | function readPackage(str) { 44 | return { 45 | val: parseInt(str) 46 | } 47 | } 48 | 49 | /** Forwawd to other clients */ 50 | function forwardPackage(pack) { 51 | Call.clientPacketReliable(TYPE, pack) 52 | } 53 | 54 | /** Client receives skill active packet, deal self */ 55 | if (Vars.netClient) { 56 | Vars.netClient.addPacketHandler(TYPE, cons(pack => { 57 | const info = readPackage(pack) 58 | if (info.val || info.val === 0) { 59 | setArmor(info.val) 60 | } 61 | })) 62 | } 63 | 64 | /** Server receives skill active packet, deal self and forward packet */ 65 | Vars.netServer.addPacketHandler(TYPE, lib.cons2((player, pack) => { 66 | const info = readPackage(pack) 67 | if (info.val || info.val === 0) { 68 | setArmor(info.val) 69 | forwardPackage(pack) 70 | } 71 | })) 72 | 73 | return (val) => { 74 | // const pack = makePackage(val) 75 | // // Send to EVERY client if i'm server 76 | // Call.clientPacketReliable(TYPE, pack) 77 | // // Send to THE server if i'm client 78 | // Call.serverPacketReliable(TYPE, pack) 79 | // if (!Vars.net.client()) { 80 | // setArmor(val) 81 | // } 82 | 83 | // Armor is no need sync 84 | setArmor(val) 85 | } 86 | })() 87 | const CALL_setHitSize = (() => { 88 | const TYPE = 'dpsHitSize' 89 | 90 | function makePackage(val) { 91 | return val + '' 92 | } 93 | /** 94 | * Read packet to objects 95 | * 96 | * @param {string} str the packet 97 | * @returns {{val: number}} contains 3 98 | */ 99 | function readPackage(str) { 100 | return { 101 | val: parseInt(str) 102 | } 103 | } 104 | 105 | /** Forwawd to other clients */ 106 | function forwardPackage(pack) { 107 | Call.clientPacketReliable(TYPE, pack) 108 | } 109 | 110 | /** Client receives skill active packet, deal self */ 111 | if (Vars.netClient) { 112 | Vars.netClient.addPacketHandler(TYPE, cons(pack => { 113 | const info = readPackage(pack) 114 | if (info.val || info.val === 0) { 115 | setHitSize(info.val) 116 | } 117 | })) 118 | } 119 | 120 | /** Server receives skill active packet, deal self and forward packet */ 121 | Vars.netServer.addPacketHandler(TYPE, lib.cons2((player, pack) => { 122 | const info = readPackage(pack) 123 | if (info.val || info.val === 0) { 124 | setHitSize(info.val) 125 | forwardPackage(pack) 126 | } 127 | })) 128 | 129 | return (val) => { 130 | const pack = makePackage(val) 131 | // Send to EVERY client if i'm server 132 | Call.clientPacketReliable(TYPE, pack) 133 | // Send to THE server if i'm client 134 | Call.serverPacketReliable(TYPE, pack) 135 | if (!Vars.net.client()) { 136 | setHitSize(val) 137 | } 138 | } 139 | })() 140 | Events.on(EventType.PlayerConnect, cons(e => { 141 | CALL_setArmor(landFactory.currentArmor); 142 | CALL_setHitSize(landFactory.currentHitSize); 143 | })) 144 | 145 | lib.setBuildingSimple(landFactory, UnitFactory.UnitFactoryBuild, { 146 | updateTile() { 147 | this.currentPlan = 0 148 | this.super$updateTile() 149 | }, 150 | buildConfiguration(table) { 151 | table.button(new Packages.arc.scene.style.TextureRegionDrawable(lib.loadRegion("up1")), Styles.cleari, run(() => { 152 | CALL_setArmor(landFactory.currentArmor + 1) 153 | })).size(40).tooltip(lib.getMessage("message", "dps-armor-up")) 154 | table.button(new Packages.arc.scene.style.TextureRegionDrawable(lib.loadRegion("down1")), Styles.cleari, run(() => { 155 | CALL_setArmor(landFactory.currentArmor - 1) 156 | })).size(40).tooltip(lib.getMessage("message", "dps-armor-down")) 157 | 158 | table.button(new Packages.arc.scene.style.TextureRegionDrawable(lib.loadRegion("up2")), Styles.cleari, run(() => { 159 | CALL_setHitSize(landFactory.currentHitSize + 1) 160 | })).size(40).tooltip(lib.getMessage("message", "dps-hitsize-up")) 161 | table.button(new Packages.arc.scene.style.TextureRegionDrawable(lib.loadRegion("down2")), Styles.cleari, run(() => { 162 | CALL_setHitSize(landFactory.currentHitSize - 1) 163 | })).size(40).tooltip(lib.getMessage("message", "dps-hitsize-down")) 164 | }, 165 | }) 166 | 167 | const boardTimeTotal = 60 * 6 168 | const landClassId = 46 169 | const landConstructor = prov(() => new JavaAdapter(MechUnit, { 170 | dmgRecord: { 171 | totalOrigin: 0, 172 | totalReal: 0, 173 | hits: 0, 174 | firstHitTime: 0, 175 | lastHitTime: 0, 176 | showBoardTime: 0, 177 | }, 178 | recordDamage(amount, ignoreArmor) { 179 | 180 | const origin = amount 181 | const real = (ignoreArmor ? amount : Math.max(amount - this.armor, Vars.minArmorDamage * amount)) / this.healthMultiplier 182 | this.dmgRecord.totalOrigin += origin 183 | this.dmgRecord.totalReal += real 184 | this.dmgRecord.hits += 1 185 | if (this.dmgRecord.firstHitTime == 0) { 186 | this.dmgRecord.firstHitTime = Time.time 187 | } 188 | this.dmgRecord.showBoardTime = boardTimeTotal 189 | this.dmgRecord.lastHitTime = Time.time 190 | }, 191 | // -=-=-= 192 | classId() { return landClassId; }, 193 | update() { 194 | this.super$update() 195 | this.armor = landFactory.currentArmor 196 | this.hitSize = landFactory.currentHitSize 197 | this.dmgRecord.showBoardTime = Math.max(this.dmgRecord.showBoardTime - Time.delta, 0) 198 | if (this.dmgRecord.showBoardTime == 0 && this.dmgRecord.totalOrigin > 0) { 199 | this.dmgRecord.totalOrigin = 0 200 | this.dmgRecord.totalReal = 0 201 | this.dmgRecord.hits = 0 202 | this.dmgRecord.firstHitTime = 0 203 | this.dmgRecord.lastHitTime = 0 204 | this.dmgRecord.showBoardTime = 0 205 | } 206 | }, 207 | draw() { 208 | this.super$draw() 209 | if (this.dmgRecord.showBoardTime > 0) { 210 | const font = Fonts.def 211 | var color = Color.yellow.cpy() 212 | const fontSize = 12 / 60 213 | const gap = Vars.mobile ? fontSize / 0.04 : fontSize / 0.06 214 | const x = this.x - 20 215 | var y = this.y + (Vars.mobile ? 52 : 40) 216 | 217 | var hits = this.dmgRecord.hits 218 | var gameDuration = this.dmgRecord.lastHitTime - this.dmgRecord.firstHitTime 219 | var realDuration = gameDuration / 60 220 | var originDamage = this.dmgRecord.totalOrigin 221 | var realDamage = this.dmgRecord.totalReal 222 | var originDps = originDamage / (realDuration == 0 ? 1 : realDuration) 223 | var realDps = realDamage / (realDuration == 0 ? 1 : realDuration) 224 | 225 | Draw.z(Layer.weather + 1) 226 | color.a = Math.min(this.dmgRecord.showBoardTime / boardTimeTotal * 3, 1) 227 | 228 | const s = "message.invincible-cheat-mod-v8.dps-info-"; 229 | font.draw(Core.bundle.format(s + "armor", this.armor), x, (y -= gap), color, fontSize, false, Align.left) 230 | font.draw(Core.bundle.format(s + "hitsize", this.hitSize), x, (y -= gap), color, fontSize, false, Align.left) 231 | font.draw(Core.bundle.format(s + "hits", hits), x, (y -= gap), color, fontSize, false, Align.left) 232 | font.draw(Core.bundle.format(s + "duration-frame", keep3(gameDuration)), x, (y -= gap), color, fontSize, false, Align.left) 233 | font.draw(Core.bundle.format(s + "duration-real", keep3(realDuration)), x, (y -= gap), color, fontSize, false, Align.left) 234 | font.draw(Core.bundle.format(s + "origin-damage", keep3(originDamage)), x, (y -= gap), color, fontSize, false, Align.left) 235 | font.draw(Core.bundle.format(s + "real-damage", keep3(realDamage)), x, (y -= gap), color, fontSize, false, Align.left) 236 | font.draw(Core.bundle.format(s + "dps-origin", keep3(originDps)), x, (y -= gap), color, fontSize, false, Align.left) 237 | font.draw(Core.bundle.format(s + "dps-real", keep3(realDps)), x, (y -= gap), color, fontSize, false, Align.left) 238 | Draw.reset() 239 | } 240 | }, 241 | damagePierce(amount, withEffect) { 242 | var pre = this.hitTime 243 | this.recordDamage(amount, true) 244 | if (!withEffect) { 245 | this.hitTime = pre 246 | } 247 | }, 248 | damage(amount, withEffect) { 249 | if (withEffect === undefined) { 250 | this.recordDamage(amount, false) 251 | // this.super$damage(amount) 252 | } else { 253 | this.super$damage(amount, withEffect) 254 | } 255 | }, 256 | add() { 257 | if (this.added == true) { 258 | return 259 | } 260 | landGroup.add(this) 261 | this.super$add() 262 | }, 263 | remove() { 264 | if (this.added == false) { 265 | return 266 | } 267 | landGroup.remove(this) 268 | this.super$remove() 269 | }, 270 | })) 271 | EntityMapping.idMap[landClassId] = landConstructor 272 | const landUnitType = (() => { 273 | const m = extend(UnitType, 'dps-tester-land', { 274 | }) 275 | 276 | m.constructor = landConstructor 277 | 278 | m.armor = 0 279 | m.health = 65535 280 | m.speed = 0.4 281 | m.rotateSpeed = 2 282 | m.flying = false 283 | m.rotateShooting = true 284 | m.hitSize = 25 285 | m.destructibleWreck = false 286 | m.canDrown = false 287 | m.mechFrontSway = 1 288 | m.mechStepParticles = true 289 | m.mechStepShake = 0.15 290 | m.singleTarget = true 291 | m.mineSpeed = 50000 292 | m.mineTier = 2147483647 293 | m.buildSpeed = Infinity 294 | m.itemCapacity = 9999 295 | m.canBoost = true 296 | m.boostMultiplier = 5 297 | m.landShake = 4 298 | m.engineOffset = 12 299 | m.engineSize = 6 300 | m.lowAltitude = true 301 | m.mineWalls = true; 302 | m.envDisabled = 0; 303 | return m 304 | })() 305 | 306 | landFactory.plans = Seq.with( 307 | new UnitFactory.UnitPlan(landUnitType, 1, ItemStack.with(Items.graphite, 1)) 308 | ) 309 | -------------------------------------------------------------------------------- /scripts/super-cheat/dps-walls.js: -------------------------------------------------------------------------------- 1 | var lib = require('super-cheat/lib') 2 | 3 | function createDpsWall() { 4 | return { 5 | displays: [], 6 | linkAdd(display) { 7 | if (this.displays.indexOf(display) < 0) { 8 | this.displays.push(display) 9 | } 10 | }, 11 | linkRemove(display) { 12 | let index = this.displays.indexOf(display) 13 | if (index >= 0) { 14 | this.displays.splice(index, 1) 15 | } 16 | }, 17 | damage(v1, v2, v3) { 18 | if (v2 === undefined && v3 === undefined) { 19 | let amount = v1 20 | for (let display of this.displays) { 21 | display.recordDamage(this, amount) 22 | } 23 | } else if (v3 === undefined) { 24 | this.super$damage(v1, v2) 25 | } else { 26 | this.super$damage(v1, v2, v3) 27 | } 28 | }, 29 | write(writer) { 30 | this.super$write(writer); 31 | writer.s(this.displays.length); 32 | for (let display of this.displays) { 33 | writer.i(display.pos()); 34 | } 35 | }, 36 | read(reader, revision) { 37 | this.super$read(reader, revision); 38 | let length = reader.s(); 39 | for (let i = 0; i < length; i++) { 40 | let pos = reader.i() 41 | let linkTarget = Vars.world.build(pos); 42 | if (linkTarget) { 43 | this.displays.push(linkTarget) 44 | } 45 | } 46 | }, 47 | } 48 | } 49 | 50 | lib.setBuilding(extend(Wall, "dps-wall-1", {}), block => new JavaAdapter(Wall.WallBuild, createDpsWall(), block)) 51 | lib.setBuilding(extend(Wall, "dps-wall-2", {}), block => new JavaAdapter(Wall.WallBuild, createDpsWall(), block)) 52 | lib.setBuilding(extend(Wall, "dps-wall-3", {}), block => new JavaAdapter(Wall.WallBuild, createDpsWall(), block)) 53 | lib.setBuilding(extend(Wall, "dps-wall-4", {}), block => new JavaAdapter(Wall.WallBuild, createDpsWall(), block)) 54 | lib.setBuilding(extend(Wall, "dps-wall-5", {}), block => new JavaAdapter(Wall.WallBuild, createDpsWall(), block)) 55 | 56 | // ------------------------ the display ------------------------ 57 | 58 | const range = 1200 59 | 60 | function keep2(num) { 61 | let numStr = num.toString() 62 | let index = numStr.indexOf('.') 63 | return index === -1 ? numStr : num > 10000000 ? numStr.slice(0, index) : numStr.slice(0, index + 3) 64 | } 65 | 66 | const boardTimeTotal = 60 * 6 67 | 68 | const DpsWallDisplay = extend(Wall, "dps-wall-display", { 69 | 70 | drawPlace(x, y, rotation, valid) { 71 | Drawf.dashCircle(x * Vars.tilesize, y * Vars.tilesize, range, Pal.accent); 72 | }, 73 | pointConfig(config, transformer) { 74 | // Rotate relative points 75 | if (IntSeq.__javaObject__.isInstance(config)) { 76 | // ROTATE IT! 77 | var newSeq = new IntSeq(config.size); 78 | var linkX = null; 79 | for (var i = 0; i < config.size; i++) { 80 | var num = config.get(i); 81 | if (linkX == null) { 82 | linkX = num; 83 | } else { 84 | // The source position is relative to right bottom, transform it. 85 | var point = new Point2(linkX * 2 - 1, num * 2 - 1); 86 | 87 | transformer.get(point); 88 | newSeq.add((point.x + 1) / 2); 89 | newSeq.add((point.y + 1) / 2); 90 | linkX = null; 91 | } 92 | } 93 | return newSeq; 94 | } else { 95 | return config; 96 | } 97 | }, 98 | }) 99 | DpsWallDisplay.config(IntSeq, lib.cons2((tile, sq) => { 100 | // This seems only used by coping block 101 | var links = new Seq(java.lang.Integer); 102 | var linkX = null; 103 | for (var i = 0; i < sq.size; i++) { 104 | var num = sq.get(i); 105 | if (linkX == null) { 106 | linkX = num; 107 | } else { 108 | var pos = Point2.pack(linkX + tile.tileX(), num + tile.tileY()); 109 | links.add(lib.int(pos)); 110 | linkX = null; 111 | } 112 | } 113 | 114 | tile.setLink(links); 115 | })); 116 | DpsWallDisplay.config(java.lang.Integer, lib.cons2((tile, int) => { 117 | tile.setOneLink(int); 118 | })); 119 | DpsWallDisplay.configClear(tile => { 120 | tile.setLink(null); 121 | }); 122 | 123 | function isDpsWall(entity) { 124 | return entity && ( 125 | entity.block.name.indexOf("dps-wall-1") >= 0 126 | || 127 | entity.block.name.indexOf("dps-wall-2") >= 0 128 | || 129 | entity.block.name.indexOf("dps-wall-3") >= 0 130 | || 131 | entity.block.name.indexOf("dps-wall-4") >= 0 132 | || 133 | entity.block.name.indexOf("dps-wall-5") >= 0 134 | ) 135 | } 136 | function linkValid(the, pos) { 137 | if (pos === undefined || pos === null || pos == -1) return false; 138 | var linkTarget = Vars.world.build(pos); 139 | return linkTarget && isDpsWall(linkTarget) && the.within(linkTarget, range); 140 | } 141 | lib.setBuilding(DpsWallDisplay, (block) => new JavaAdapter(Wall.WallBuild, { 142 | links: new Seq(java.lang.Integer), 143 | dmgRecord: { 144 | totalDamage: 0, 145 | hits: 0, 146 | firstHitTime: 0, 147 | lastHitTime: 0, 148 | showBoardTime: 0, 149 | }, 150 | getLink() { return this.links }, 151 | setLink(v) { this.links = v }, 152 | setOneLink(v) { 153 | var int = new java.lang.Integer(v) 154 | if (!this.links.remove(boolf(i => i == int))) { 155 | var linkTarget = Vars.world.build(int) 156 | if (isDpsWall(linkTarget)) { 157 | this.links.add(int) 158 | linkTarget.linkAdd(this) 159 | } 160 | } 161 | }, 162 | recordDamage(entity, amount) { 163 | this.dmgRecord.totalDamage += amount 164 | this.dmgRecord.hits += 1 165 | if (this.dmgRecord.firstHitTime == 0) { 166 | this.dmgRecord.firstHitTime = Time.time 167 | } 168 | this.dmgRecord.showBoardTime = boardTimeTotal 169 | this.dmgRecord.lastHitTime = Time.time 170 | }, 171 | remove() { 172 | if (this.added == false) return; 173 | var it = this.links.iterator(); 174 | while (it.hasNext()) { 175 | var pos = it.next(); 176 | var linkTarget = Vars.world.build(pos) 177 | if (isDpsWall(linkTarget)) { 178 | linkTarget.linkRemove(this) 179 | } 180 | } 181 | 182 | this.super$remove(); 183 | }, 184 | updateTile() { 185 | this.super$updateTile() 186 | this.dmgRecord.showBoardTime = Math.max(this.dmgRecord.showBoardTime - Time.delta, 0) 187 | if (this.dmgRecord.showBoardTime == 0 && this.dmgRecord.totalDamage > 0) { 188 | this.dmgRecord.totalDamage = 0 189 | this.dmgRecord.hits = 0 190 | this.dmgRecord.firstHitTime = 0 191 | this.dmgRecord.lastHitTime = 0 192 | this.dmgRecord.showBoardTime = 0 193 | } 194 | }, 195 | drawConfigure() { 196 | const tilesize = Vars.tilesize; 197 | var sin = Mathf.absin(Time.time, 6, 1); 198 | 199 | Draw.color(Pal.accent); 200 | Lines.stroke(1); 201 | Drawf.circles(this.x, this.y, (this.tile.block().size / 2 + 1) * Vars.tilesize + sin - 2, Pal.accent); 202 | 203 | for (var i = 0; i < this.links.size; i++) { 204 | var pos = this.links.get(i); 205 | if (linkValid(this, pos)) { 206 | var linkTarget = Vars.world.build(pos); 207 | Drawf.square(linkTarget.x, linkTarget.y, linkTarget.block.size * tilesize / 2 + 1, Pal.place); 208 | } 209 | } 210 | Drawf.dashCircle(this.x, this.y, range, Pal.accent); 211 | }, 212 | onConfigureBuildTapped(other) { 213 | if (this == other) { 214 | return false; 215 | } 216 | if (this.dst(other) <= range && other.team == this.team && isDpsWall(other)) { 217 | this.configure(new java.lang.Integer(other.pos())); 218 | return false; 219 | } 220 | 221 | return true; 222 | }, 223 | config() { 224 | var output = new IntSeq(this.links.size * 2); 225 | // This seems called by coping block 226 | for (var i = 0; i < this.links.size; i++) { 227 | var pos = this.links.get(i); 228 | var point2 = Point2.unpack(pos).sub(this.tile.x, this.tile.y); 229 | output.add(point2.x, point2.y); 230 | } 231 | return output; 232 | }, 233 | draw() { 234 | this.super$draw() 235 | if (this.dmgRecord.showBoardTime > 0) { 236 | const font = Fonts.def 237 | var color = Color.yellow.cpy() 238 | const fontSize = 12 / 60 239 | const gap = Vars.mobile ? fontSize / 0.04 : fontSize / 0.06 240 | const x = this.x - 13 241 | var y = this.y + (Vars.mobile ? 29 : 17) 242 | 243 | var hits = this.dmgRecord.hits 244 | var gameDuration = this.dmgRecord.lastHitTime - this.dmgRecord.firstHitTime 245 | var realDuration = gameDuration / 60 246 | var damage = this.dmgRecord.totalDamage 247 | var dps = damage / (realDuration == 0 ? 1 : realDuration) 248 | 249 | Draw.z(Layer.weather + 1) 250 | color.a = Math.min(this.dmgRecord.showBoardTime / boardTimeTotal * 3, 1) 251 | font.draw("Hits: " + hits, x, (y -= gap), color, fontSize, false, Align.left) 252 | // font.draw("Duration(frame): " + keep2(gameDuration), x, (y -= gap), color, fontSize, false, Align.left) 253 | // font.draw("Duration(seconds): " + keep2(realDuration), x, (y -= gap), color, fontSize, false, Align.left) 254 | font.draw("Dmg: " + keep2(damage), x, (y -= gap), color, fontSize, false, Align.left) 255 | font.draw("DPS: " + keep2(dps), x, (y -= gap), color, fontSize, false, Align.left) 256 | Draw.reset() 257 | } 258 | }, 259 | damage(v1, v2, v3) { 260 | if (v2 === undefined && v3 === undefined) { 261 | let amount = v1 262 | this.recordDamage(this, amount) 263 | } else if (v3 === undefined) { 264 | this.super$damage(v1, v2) 265 | } else { 266 | this.super$damage(v1, v2, v3) 267 | } 268 | }, 269 | write(write) { 270 | this.super$write(write); 271 | write.s(this.links.size); 272 | var it = this.links.iterator(); 273 | while (it.hasNext()) { 274 | var pos = it.next(); 275 | write.i(pos); 276 | } 277 | }, 278 | read(read, revision) { 279 | this.super$read(read, revision); 280 | this.links = new Seq(java.lang.Integer); 281 | var linkSize = read.s(); 282 | for (var i = 0; i < linkSize; i++) { 283 | var pos = read.i(); 284 | this.links.add(new java.lang.Integer(pos)); 285 | } 286 | }, 287 | }, block)) 288 | -------------------------------------------------------------------------------- /scripts/super-cheat/enemys-cannot-move.js: -------------------------------------------------------------------------------- 1 | 2 | const lib = require('super-cheat/lib'); 3 | 4 | const cannotMoveEffect = new StatusEffect("cannotMove"); 5 | 6 | cannotMoveEffect.speedMultiplier = 0; 7 | cannotMoveEffect.effect = Fx.none; 8 | 9 | const shieldConsumer = (paramEntity) => cons(trait => { 10 | if (trait.team != paramEntity.team 11 | && Intersector.isInsideHexagon(paramEntity.x, paramEntity.y, paramEntity.realRadius() * 2, trait.x, trait.y)) { 12 | trait.apply(cannotMoveEffect, 30); 13 | } 14 | }); 15 | const COLOR = new Color(0, 200, 250, 1); 16 | const blockType = extend(ForceProjector, "enemys-cannot-move", {}); 17 | lib.setBuildingSimple(blockType, ForceProjector.ForceBuild, { 18 | updateTile() { 19 | var phaseValid = this.itemConsumer != null && this.itemConsumer.efficiency(this) > 0; 20 | 21 | this.phaseHeat = Mathf.lerpDelta(this.phaseHeat, Mathf.num(phaseValid), 0.1); 22 | 23 | if (phaseValid && !this.broken && this.timer.get(blockType.timerUse, blockType.phaseUseTime) && this.efficiency > 0) { 24 | this.consume(); 25 | } 26 | 27 | this.radscl = Mathf.lerpDelta(this.radscl, this.broken ? 0 : this.warmup, 0.05); 28 | 29 | if (Mathf.chanceDelta(this.buildup / this.breakage * 0.1)) { 30 | Fx.reactorsmoke.at(this.x + Mathf.range(tilesize / 2), this.y + Mathf.range(tilesize / 2)); 31 | } 32 | 33 | this.warmup = Mathf.lerpDelta(this.warmup, this.efficiency, 0.1); 34 | 35 | if (this.buildup > 0) { 36 | var scale = !this.broken ? cooldownNormal : this.cooldownBrokenBase; 37 | var cons = this.block.consumes.get(ConsumeType.liquid); 38 | if (cons.valid(this)) { 39 | cons.update(this); 40 | scale *= (cooldownLiquid * (1 + (this.liquids.current().heatCapacity - 0.4) * 0.9)); 41 | } 42 | 43 | this.buildup -= delta() * scale; 44 | } 45 | 46 | if (this.broken && this.buildup <= 0) { 47 | this.broken = false; 48 | } 49 | 50 | if (this.buildup >= this.breakage + this.phaseShieldBoost && !this.broken) { 51 | this.broken = true; 52 | this.buildup = this.breakage; 53 | Fx.shieldBreak.at(this.x, this.y, this.realRadius(), this.team.color); 54 | } 55 | 56 | if (this.hit > 0) { 57 | this.hit -= 1 / 5 * Time.delta; 58 | } 59 | 60 | var realRadius = this.realRadius(); 61 | 62 | if (realRadius > 0 && !this.broken) { 63 | Groups.unit.intersect(this.x - realRadius, this.y - realRadius, realRadius * 2, realRadius * 2, shieldConsumer(this)); 64 | } 65 | }, 66 | drawShield() { 67 | var x = this.x; 68 | var y = this.y; 69 | var hit = this.hit; 70 | if (!this.broken) { 71 | var radius = this.realRadius(); 72 | 73 | Draw.z(Layer.shields); 74 | 75 | 76 | if (Core.settings.getBool("animatedshields")) { 77 | Draw.color(COLOR, Color.white, Mathf.clamp(hit)); 78 | Fill.poly(x, y, 6, radius); 79 | Draw.color(this.team.color, Color.white, Mathf.clamp(hit)); 80 | Lines.poly(x, y, 6, radius); 81 | } else { 82 | Lines.stroke(1.5); 83 | Draw.color(COLOR, Color.white, Mathf.clamp(hit)); 84 | Draw.alpha(0.09 + Mathf.clamp(0.08 * hit)); 85 | Fill.poly(x, y, 6, radius); 86 | Draw.color(this.team.color, Color.white, Mathf.clamp(hit)); 87 | Draw.alpha(1); 88 | Lines.poly(x, y, 6, radius); 89 | Draw.reset(); 90 | } 91 | } 92 | 93 | Draw.reset(); 94 | }, 95 | // damage(damage) { }, 96 | // handleDamage(tile, amount) { return 0; }, 97 | }); 98 | -------------------------------------------------------------------------------- /scripts/super-cheat/enemys-control.js: -------------------------------------------------------------------------------- 1 | 2 | const lib = require('super-cheat/lib'); 3 | 4 | const shieldConsumer = (paramEntity) => cons(trait => { 5 | if (trait.team != paramEntity.team 6 | && !trait.dead 7 | && Intersector.isInsideHexagon(paramEntity.x, paramEntity.y, paramEntity.realRadius() * 2, trait.x, trait.y)) { 8 | if (paramEntity.team.data().countType(trait.type) > Units.getCap(paramEntity.team)) { 9 | Call.unitDespawn(trait); 10 | } else { 11 | trait.dead = true; 12 | trait.health = 0; 13 | trait.kill(); 14 | if (Vars.net.client()) { 15 | // Client do not create new unit 16 | return; 17 | } 18 | trait.remove(); 19 | var unit = trait.type.create(Vars.player.team()); 20 | unit.set(trait.x, trait.y); 21 | unit.rotation = trait.rotation; 22 | unit.add(); 23 | } 24 | } 25 | }); 26 | const COLOR = Color.pink; 27 | const blockType = extend(ForceProjector, "enemys-control", {}); 28 | lib.setBuildingSimple(blockType, ForceProjector.ForceBuild, { 29 | updateTile() { 30 | var phaseValid = this.itemConsumer != null && this.itemConsumer.efficiency(this) > 0; 31 | 32 | this.phaseHeat = Mathf.lerpDelta(this.phaseHeat, Mathf.num(phaseValid), 0.1); 33 | 34 | if (phaseValid && !this.broken && this.timer.get(blockType.timerUse, blockType.phaseUseTime) && this.efficiency > 0) { 35 | this.consume(); 36 | } 37 | 38 | this.radscl = Mathf.lerpDelta(this.radscl, this.broken ? 0 : this.warmup, 0.05); 39 | 40 | if (Mathf.chanceDelta(this.buildup / this.breakage * 0.1)) { 41 | Fx.reactorsmoke.at(this.x + Mathf.range(tilesize / 2), this.y + Mathf.range(tilesize / 2)); 42 | } 43 | 44 | this.warmup = Mathf.lerpDelta(this.warmup, this.efficiency, 0.1); 45 | 46 | if (this.buildup > 0) { 47 | var scale = !this.broken ? cooldownNormal : this.cooldownBrokenBase; 48 | var cons = this.block.consumes.get(ConsumeType.liquid); 49 | if (cons.valid(this)) { 50 | cons.update(this); 51 | scale *= (cooldownLiquid * (1 + (this.liquids.current().heatCapacity - 0.4) * 0.9)); 52 | } 53 | 54 | this.buildup -= delta() * scale; 55 | } 56 | 57 | if (this.broken && this.buildup <= 0) { 58 | this.broken = false; 59 | } 60 | 61 | if (this.buildup >= this.breakage + this.phaseShieldBoost && !this.broken) { 62 | this.broken = true; 63 | this.buildup = this.breakage; 64 | Fx.shieldBreak.at(this.x, this.y, this.realRadius(), this.team.color); 65 | } 66 | 67 | if (this.hit > 0) { 68 | this.hit -= 1 / 5 * Time.delta; 69 | } 70 | 71 | var realRadius = this.realRadius(); 72 | 73 | if (realRadius > 0 && !this.broken) { 74 | Groups.unit.intersect(this.x - realRadius, this.y - realRadius, realRadius * 2, realRadius * 2, shieldConsumer(this)); 75 | } 76 | }, 77 | drawShield() { 78 | var x = this.x; 79 | var y = this.y; 80 | var hit = this.hit; 81 | if (!this.broken) { 82 | var radius = this.realRadius(); 83 | 84 | Draw.z(Layer.shields); 85 | 86 | 87 | if (Core.settings.getBool("animatedshields")) { 88 | Draw.color(COLOR, Color.white, Mathf.clamp(hit)); 89 | Fill.poly(x, y, 6, radius); 90 | Draw.color(this.team.color, Color.white, Mathf.clamp(hit)); 91 | Lines.poly(x, y, 6, radius); 92 | } else { 93 | Lines.stroke(1.5); 94 | Draw.color(COLOR, Color.white, Mathf.clamp(hit)); 95 | Draw.alpha(0.09 + Mathf.clamp(0.08 * hit)); 96 | Fill.poly(x, y, 6, radius); 97 | Draw.color(this.team.color, Color.white, Mathf.clamp(hit)); 98 | Draw.alpha(1); 99 | Lines.poly(x, y, 6, radius); 100 | Draw.reset(); 101 | } 102 | } 103 | 104 | Draw.reset(); 105 | }, 106 | damage(damage) { }, 107 | handleDamage(tile, amount) { return 0; }, 108 | }); 109 | -------------------------------------------------------------------------------- /scripts/super-cheat/enemys-no-damage.js: -------------------------------------------------------------------------------- 1 | const lib = require('super-cheat/lib'); 2 | 3 | const noDamageEffect = new StatusEffect("noDamageEffect"); 4 | 5 | noDamageEffect.effect = Fx.none; 6 | noDamageEffect.damageMultiplier = 0; 7 | 8 | const shieldConsumer = (paramEntity) => cons(trait => { 9 | if (trait.team != paramEntity.team 10 | && Intersector.isInsideHexagon(paramEntity.x, paramEntity.y, paramEntity.realRadius() * 2, trait.x, trait.y)) { 11 | trait.apply(noDamageEffect, 30); 12 | } 13 | }); 14 | const COLOR = Pal.heal; 15 | const blockType = extend(ForceProjector, "enemys-no-damage", {}); 16 | lib.setBuildingSimple(blockType, ForceProjector.ForceBuild, { 17 | updateTile() { 18 | var phaseValid = this.itemConsumer != null && this.itemConsumer.efficiency(this) > 0; 19 | 20 | this.phaseHeat = Mathf.lerpDelta(this.phaseHeat, Mathf.num(phaseValid), 0.1); 21 | 22 | if (phaseValid && !this.broken && this.timer.get(blockType.timerUse, blockType.phaseUseTime) && this.efficiency > 0) { 23 | this.consume(); 24 | } 25 | 26 | this.radscl = Mathf.lerpDelta(this.radscl, this.broken ? 0 : this.warmup, 0.05); 27 | 28 | if (Mathf.chanceDelta(this.buildup / this.breakage * 0.1)) { 29 | Fx.reactorsmoke.at(this.x + Mathf.range(tilesize / 2), this.y + Mathf.range(tilesize / 2)); 30 | } 31 | 32 | this.warmup = Mathf.lerpDelta(this.warmup, this.efficiency, 0.1); 33 | 34 | if (this.buildup > 0) { 35 | var scale = !this.broken ? cooldownNormal : this.cooldownBrokenBase; 36 | var cons = this.block.consumes.get(ConsumeType.liquid); 37 | if (cons.valid(this)) { 38 | cons.update(this); 39 | scale *= (cooldownLiquid * (1 + (this.liquids.current().heatCapacity - 0.4) * 0.9)); 40 | } 41 | 42 | this.buildup -= delta() * scale; 43 | } 44 | 45 | if (this.broken && this.buildup <= 0) { 46 | this.broken = false; 47 | } 48 | 49 | if (this.buildup >= this.breakage + this.phaseShieldBoost && !this.broken) { 50 | this.broken = true; 51 | this.buildup = this.breakage; 52 | Fx.shieldBreak.at(this.x, this.y, this.realRadius(), this.team.color); 53 | } 54 | 55 | if (this.hit > 0) { 56 | this.hit -= 1 / 5 * Time.delta; 57 | } 58 | 59 | var realRadius = this.realRadius(); 60 | 61 | if (realRadius > 0 && !this.broken) { 62 | Groups.unit.intersect(this.x - realRadius, this.y - realRadius, realRadius * 2, realRadius * 2, shieldConsumer(this)); 63 | } 64 | }, 65 | drawShield() { 66 | var x = this.x; 67 | var y = this.y; 68 | var hit = this.hit; 69 | if (!this.broken) { 70 | var radius = this.realRadius(); 71 | 72 | Draw.z(Layer.shields); 73 | 74 | 75 | if (Core.settings.getBool("animatedshields")) { 76 | Draw.color(COLOR, Color.white, Mathf.clamp(hit)); 77 | Fill.poly(x, y, 6, radius); 78 | Draw.color(this.team.color, Color.white, Mathf.clamp(hit)); 79 | Lines.poly(x, y, 6, radius); 80 | } else { 81 | Lines.stroke(1.5); 82 | Draw.color(COLOR, Color.white, Mathf.clamp(hit)); 83 | Draw.alpha(0.09 + Mathf.clamp(0.08 * hit)); 84 | Fill.poly(x, y, 6, radius); 85 | Draw.color(this.team.color, Color.white, Mathf.clamp(hit)); 86 | Draw.alpha(1); 87 | Lines.poly(x, y, 6, radius); 88 | Draw.reset(); 89 | } 90 | } 91 | 92 | Draw.reset(); 93 | }, 94 | // damage(damage) { }, 95 | // handleDamage(tile, amount) { return 0; }, 96 | }); 97 | -------------------------------------------------------------------------------- /scripts/super-cheat/enemys-remove.js: -------------------------------------------------------------------------------- 1 | 2 | const lib = require('super-cheat/lib'); 3 | 4 | const shieldConsumer = (paramEntity) => cons(trait => { 5 | if (trait.team != paramEntity.team 6 | && Intersector.isInsideHexagon(paramEntity.x, paramEntity.y, paramEntity.realRadius() * 2, trait.x, trait.y)) { 7 | trait.remove(); 8 | } 9 | }); 10 | const COLOR = Color.purple; 11 | const blockType = extend(ForceProjector, "enemys-remove", {}); 12 | lib.setBuildingSimple(blockType, ForceProjector.ForceBuild, { 13 | updateTile() { 14 | var phaseValid = this.itemConsumer != null && this.itemConsumer.efficiency(this) > 0; 15 | 16 | this.phaseHeat = Mathf.lerpDelta(this.phaseHeat, Mathf.num(phaseValid), 0.1); 17 | 18 | if (phaseValid && !this.broken && this.timer.get(blockType.timerUse, blockType.phaseUseTime) && this.efficiency > 0) { 19 | this.consume(); 20 | } 21 | 22 | this.radscl = Mathf.lerpDelta(this.radscl, this.broken ? 0 : this.warmup, 0.05); 23 | 24 | if (Mathf.chanceDelta(this.buildup / this.breakage * 0.1)) { 25 | Fx.reactorsmoke.at(this.x + Mathf.range(tilesize / 2), this.y + Mathf.range(tilesize / 2)); 26 | } 27 | 28 | this.warmup = Mathf.lerpDelta(this.warmup, this.efficiency, 0.1); 29 | 30 | if (this.buildup > 0) { 31 | var scale = !this.broken ? cooldownNormal : this.cooldownBrokenBase; 32 | var cons = this.block.consumes.get(ConsumeType.liquid); 33 | if (cons.valid(this)) { 34 | cons.update(this); 35 | scale *= (cooldownLiquid * (1 + (this.liquids.current().heatCapacity - 0.4) * 0.9)); 36 | } 37 | 38 | this.buildup -= delta() * scale; 39 | } 40 | 41 | if (this.broken && this.buildup <= 0) { 42 | this.broken = false; 43 | } 44 | 45 | if (this.buildup >= this.breakage + this.phaseShieldBoost && !this.broken) { 46 | this.broken = true; 47 | this.buildup = this.breakage; 48 | Fx.shieldBreak.at(this.x, this.y, this.realRadius(), this.team.color); 49 | } 50 | 51 | if (this.hit > 0) { 52 | this.hit -= 1 / 5 * Time.delta; 53 | } 54 | 55 | var realRadius = this.realRadius(); 56 | 57 | if (realRadius > 0 && !this.broken) { 58 | Groups.unit.intersect(this.x - realRadius, this.y - realRadius, realRadius * 2, realRadius * 2, shieldConsumer(this)); 59 | } 60 | }, 61 | drawShield() { 62 | var x = this.x; 63 | var y = this.y; 64 | var hit = this.hit; 65 | if (!this.broken) { 66 | var radius = this.realRadius(); 67 | 68 | Draw.z(Layer.shields); 69 | 70 | 71 | if (Core.settings.getBool("animatedshields")) { 72 | Draw.color(COLOR, Color.white, Mathf.clamp(hit)); 73 | Fill.poly(x, y, 6, radius); 74 | Draw.color(this.team.color, Color.white, Mathf.clamp(hit)); 75 | Lines.poly(x, y, 6, radius); 76 | } else { 77 | Lines.stroke(1.5); 78 | Draw.color(COLOR, Color.white, Mathf.clamp(hit)); 79 | Draw.alpha(0.09 + Mathf.clamp(0.08 * hit)); 80 | Fill.poly(x, y, 6, radius); 81 | Draw.color(this.team.color, Color.white, Mathf.clamp(hit)); 82 | Draw.alpha(1); 83 | Lines.poly(x, y, 6, radius); 84 | Draw.reset(); 85 | } 86 | } 87 | 88 | Draw.reset(); 89 | }, 90 | damage(damage) { }, 91 | handleDamage(tile, amount) { return 0; }, 92 | }); 93 | -------------------------------------------------------------------------------- /scripts/super-cheat/invincible-core.js: -------------------------------------------------------------------------------- 1 | var lib = require('super-cheat/lib'); 2 | var invincibleShipJs = require('super-cheat/invincible-ship'); 3 | 4 | const invincibleCore = extend(CoreBlock, "invincible-core", { 5 | canBreak(tile) { return Vars.state.teams.cores(tile.team()).size > 1; }, 6 | canReplace(other) { return other.alwaysReplace; }, 7 | canPlaceOn(tile, team) { return true; }, 8 | placeBegan(tile, previous) {}, 9 | beforePlaceBegan(tile, previous) {}, 10 | 11 | drawPlace(x, y, rotation, valid) {}, 12 | }); 13 | lib.setBuildingSimple(invincibleCore, CoreBlock.CoreBuild, { 14 | damage(damage) { }, 15 | handleDamage(tile, amount) { return 0; }, 16 | }); 17 | invincibleCore.unitType = invincibleShipJs.invincibleShip; 18 | -------------------------------------------------------------------------------- /scripts/super-cheat/invincible-force-projector.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 此文件描述没法挡子弹的冷冻力场,原理复杂,开 mod 服务器时有可能会死。 3 | * 如此复杂的原因:(md 一堆 package-private 级别的字段,根本没法继承,只能都重写一遍了) 4 | * 1. update 难以定制,想去掉挡子弹的代码很不容易 5 | * 2. 力场颜色难以修改,因为 update() 里面写死了 new ShieldEntity,并且力场的渲染是在 Renderer 里写死的 6 | */ 7 | 8 | const lib = require('super-cheat/lib'); 9 | 10 | const shieldConsumer = (paramEntity) => cons(trait => { 11 | if (trait.team != paramEntity.team 12 | && trait.type.absorbable 13 | && Intersector.isInsideHexagon(paramEntity.x, paramEntity.y, paramEntity.realRadius() * 2, trait.x, trait.y)) { 14 | trait.absorb(); 15 | Fx.absorb.at(trait); 16 | paramEntity.hit = 1; 17 | } 18 | }); 19 | const blockType = extend(ForceProjector, "invincible-force-projector", {}); 20 | 21 | lib.setBuildingSimple(blockType, ForceProjector.ForceBuild, { 22 | updateTile() { 23 | var phaseValid = this.itemConsumer != null && this.itemConsumer.efficiency(this) > 0; 24 | 25 | this.phaseHeat = Mathf.lerpDelta(this.phaseHeat, Mathf.num(phaseValid), 0.1); 26 | 27 | if (phaseValid && !this.broken && this.timer.get(blockType.timerUse, blockType.phaseUseTime) && this.efficiency > 0) { 28 | this.consume(); 29 | } 30 | 31 | this.radscl = Mathf.lerpDelta(this.radscl, this.broken ? 0 : this.warmup, 0.05); 32 | 33 | if (Mathf.chanceDelta(this.buildup / this.breakage * 0.1)) { 34 | Fx.reactorsmoke.at(this.x + Mathf.range(tilesize / 2), this.y + Mathf.range(tilesize / 2)); 35 | } 36 | 37 | this.warmup = Mathf.lerpDelta(this.warmup, this.efficiency, 0.1); 38 | 39 | if (this.buildup > 0) { 40 | var scale = !this.broken ? cooldownNormal : this.cooldownBrokenBase; 41 | var cons = this.block.consumes.get(ConsumeType.liquid); 42 | if (cons.valid(this)) { 43 | cons.update(this); 44 | scale *= (cooldownLiquid * (1 + (this.liquids.current().heatCapacity - 0.4) * 0.9)); 45 | } 46 | 47 | this.buildup -= delta() * scale; 48 | } 49 | 50 | if (this.broken && this.buildup <= 0) { 51 | this.broken = false; 52 | } 53 | 54 | if (this.buildup >= this.breakage + this.phaseShieldBoost && !this.broken) { 55 | this.broken = true; 56 | this.buildup = this.breakage; 57 | Fx.shieldBreak.at(this.x, this.y, this.realRadius(), this.team.color); 58 | } 59 | 60 | if (this.hit > 0) { 61 | this.hit -= 1 / 5 * Time.delta; 62 | } 63 | 64 | var realRadius = this.realRadius(); 65 | 66 | if (realRadius > 0 && !this.broken) { 67 | Groups.bullet.intersect(this.x - realRadius, this.y - realRadius, realRadius * 2, realRadius * 2, shieldConsumer(this)); 68 | } 69 | }, 70 | damage(damage) { }, 71 | handleDamage(tile, amount) { return 0; }, 72 | }); 73 | -------------------------------------------------------------------------------- /scripts/super-cheat/invincible-ship.js: -------------------------------------------------------------------------------- 1 | 2 | const lib = require('super-cheat/lib') 3 | 4 | const InvincibleForceFieldAbility = (radius, regen, max, cooldown) => { 5 | 6 | var realRad; 7 | var paramUnit; 8 | var paramField; 9 | var shieldConsumer = cons(trait => { 10 | if (trait.team != paramUnit.team 11 | && trait.type.absorbable 12 | && Intersector.isInsideHexagon(paramUnit.x, paramUnit.y, realRad * 2, trait.x, trait.y) 13 | && paramUnit.shield > 0) { 14 | 15 | trait.absorb(); 16 | Fx.absorb.at(trait); 17 | 18 | paramField.alpha = 1; 19 | } 20 | }); 21 | 22 | const ability = new JavaAdapter(ForceFieldAbility, { 23 | update(unit) { 24 | unit.shield = Infinity; 25 | this.radiusScale = Mathf.lerpDelta(this.radiusScale, 1, 0.06) 26 | realRad = this.radiusScale * this.radius; 27 | paramUnit = unit; 28 | paramField = this; 29 | Groups.bullet.intersect(unit.x - realRad, unit.y - realRad, realRad * 2, realRad * 2, shieldConsumer); 30 | this.alpha = Math.max(this.alpha - Time.delta / 10, 0); 31 | }, 32 | copy() { 33 | return InvincibleForceFieldAbility(radius, regen, max, cooldown); 34 | }, 35 | draw(unit) { 36 | this.super$draw(unit); 37 | }, 38 | }, radius, regen, max, cooldown); 39 | 40 | return ability; 41 | }; 42 | 43 | const invincibleBulletType = (() => { 44 | 45 | const bt = extend(PointBulletType, { 46 | hitEntity(b, other, initialHealth) { 47 | if (other && other.kill) { 48 | Call.unitDestroy(other.id) 49 | } 50 | }, 51 | hitTile(b, tile, x, y, health, direct) { 52 | this.super$hitTile(b, tile, x, y, health, direct) ; 53 | if (tile) { 54 | tile.killed() 55 | } 56 | }, 57 | }); 58 | 59 | const tailEffectTime = 12; 60 | const trialEffect = lib.newEffect(tailEffectTime, e => { 61 | let fx = Angles.trnsx(e.rotation, 24) 62 | let fy = Angles.trnsy(e.rotation, 24) 63 | Lines.stroke(3 * e.fout(), Pal.spore); 64 | Lines.line(e.x, e.y, e.x + fx, e.y + fy); 65 | 66 | Drawf.light(e.x, e.y, 60 * e.fout(), Pal.spore, 0.5); 67 | }); 68 | const hitEffect = lib.newEffect(8, (e) => { 69 | Draw.color(Pal.spore); 70 | Lines.stroke(e.fout() * 1.5); 71 | 72 | Angles.randLenVectors(e.id, 8, e.finpow() * 22, lib.floatc2((x, y) => { 73 | let ang = Mathf.angle(x, y); 74 | Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1); 75 | })); 76 | }); 77 | const shootEffect = lib.newEffect(8, (e) => { 78 | Draw.color(Pal.spore, Pal.reactorPurple, e.fin()); 79 | let w = 1.0 + 5 * e.fout(); 80 | Drawf.tri(e.x, e.y, w, 15 * e.fout(), e.rotation); 81 | Drawf.tri(e.x, e.y, w, 3 * e.fout(), e.rotation + 180); 82 | }); 83 | const smokeEffect = lib.newEffect(8, (e) => { 84 | Draw.color(Pal.spore, Pal.reactorPurple, Pal.reactorPurple2, e.fin()); 85 | 86 | Angles.randLenVectors(e.id, 5, e.finpow() * 6, e.rotation, 20, (x, y) => { 87 | Fill.circle(e.x + x, e.y + y, e.fout() * 1.5); 88 | }); 89 | }); 90 | 91 | bt.damage = Infinity; 92 | // bt.splashDamage = Infinity; 93 | bt.speed = 600; 94 | // bt.hitSize = 6; 95 | // bt.width = 9; 96 | // bt.height = 45; 97 | bt.lifetime = 1; 98 | bt.inaccuracy = 0 99 | bt.keepVelocity = false 100 | bt.trailSpacing = 20 101 | bt.hitShake = 0.3 102 | bt.shootEffect = shootEffect 103 | bt.smokeEffect = smokeEffect 104 | bt.despawnEffect = hitEffect 105 | bt.hitEffect = hitEffect 106 | bt.trailEffect = trialEffect 107 | return bt; 108 | })(); 109 | 110 | const invincibleWeapon = (() => { 111 | 112 | const w = extend(Weapon, {}); 113 | 114 | w.name = lib.modName + '-' + 'invincible-ship-weapon'; 115 | w.length = 1.5; 116 | w.reload = 10; 117 | // w.ejectEffect = Fx.shellEjectSmall; 118 | w.bullet = invincibleBulletType; 119 | w.rotate = true; 120 | w.rotateSpeed = 20; 121 | w.x = 3; 122 | w.y = 2; 123 | return w; 124 | })(); 125 | 126 | const mech = (() => { 127 | const m = extend(UnitType, 'invincible-ship', {}); 128 | 129 | m.abilities.add(new RepairFieldAbility(Infinity, 60, 8 * 8)); 130 | // m.abilities.add(new JavaAdapter(ForceFieldAbility, {}, 60, Infinity, Infinity, 300)); 131 | m.abilities.add(InvincibleForceFieldAbility(60, Infinity, Infinity, 300)); 132 | m.constructor = prov(() => extend(UnitTypes.alpha.constructor.get().class, { 133 | damage(amount) { }, 134 | })); 135 | m.defaultController = prov(() => new BuilderAI()); 136 | 137 | m.weapons.add(invincibleWeapon); 138 | m.flying = true; 139 | m.speed = 120; 140 | m.hitSize = 16; 141 | m.accel = 0.01; 142 | m.rotateSpeed = 20; 143 | m.baseRotateSpeed = 20; 144 | // m.boostMultiplier = 3; 145 | // m.canBoost = false; 146 | m.drag = 0.1; 147 | m.mass = 31210; 148 | m.shake = 3; 149 | m.health = 10; 150 | m.mineSpeed = 50000; 151 | m.mineTier = 2147483647; 152 | m.buildSpeed = Infinity; 153 | m.itemCapacity = 9999; 154 | m.canHeal = false; 155 | m.engineOffset = 5; 156 | m.engineSize = 3; 157 | m.rotateShooting = false; 158 | m.payloadCapacity = (200 * 200) * (8 * 8); 159 | m.ammoCapacity = 200000000; 160 | m.ammoResupplyAmount = 1; 161 | m.commandLimit = 30; 162 | // m.weaponOffsetY = -2; 163 | // m.weaponOffsetX = 5; 164 | m.coreUnitDock = true; 165 | m.mineWalls = true; 166 | m.envDisabled = 0; 167 | m.fogRadius = 80; 168 | 169 | return m; 170 | })(); 171 | 172 | exports.invincibleShip = mech; 173 | -------------------------------------------------------------------------------- /scripts/super-cheat/invincible-simple-blocks.js: -------------------------------------------------------------------------------- 1 | var lib = require('super-cheat/lib'); 2 | 3 | lib.setBuildingSimple(extend(Wall, "invincible-wall-small", {}), Wall.WallBuild, { 4 | damage(damage) { }, 5 | handleDamage(tile, amount) { return 0; }, 6 | }); 7 | lib.setBuildingSimple(extend(Wall, "invincible-wall-medium", {}), Wall.WallBuild, { 8 | damage(damage) { }, 9 | handleDamage(tile, amount) { return 0; }, 10 | }); 11 | lib.setBuildingSimple(extend(Wall, "invincible-wall-large", {}), Wall.WallBuild, { 12 | damage(damage) { }, 13 | handleDamage(tile, amount) { return 0; }, 14 | }); 15 | -------------------------------------------------------------------------------- /scripts/super-cheat/lib.js: -------------------------------------------------------------------------------- 1 | 2 | exports.loadSound = function (name, setter) { 3 | const params = new Packages.arc.assets.loaders.SoundLoader.SoundParameter(); 4 | params.loadedCallback = new Packages.arc.assets.AssetLoaderParameters.LoadedCallback({ 5 | finishedLoading(asset, str, cls) { 6 | // print('1 load sound ' + name + ' from arc'); 7 | setter(asset.get(str, cls)); 8 | } 9 | }); 10 | 11 | Core.assets.load("sounds/" + name, Packages.arc.audio.Sound, params).loaded = new Cons({ 12 | get(a) { 13 | // print('2 load sound ' + name + ' from arc'); 14 | setter(a); 15 | } 16 | }); 17 | } 18 | 19 | exports.modName = "invincible-cheat-mod-v8"; 20 | 21 | exports.newEffect = (lifetime, renderer) => new Effect(lifetime, cons(renderer)); 22 | 23 | exports.cons2 = (func) => new Cons2({ get: (v1, v2) => func(v1, v2) }); 24 | exports.floatc2 = (func) => new Floatc2({ get: (v1, v2) => func(v1, v2) }); 25 | exports.boolf2 = (func) => new Boolf2({ get: (v1, v2) => func(v1, v2) }); 26 | exports.func = (getter) => new Func({ get: getter }); 27 | exports.raycaster = (func) => new Geometry.Raycaster({ accept: func }); 28 | exports.intc = (func) => new Intc({ get: func }); 29 | exports.intc2 = (func) => new Intc2({ get: func }); 30 | exports.floatf = (func) => new Floatf({ get: func }); 31 | 32 | exports.loadRegion = (name) => { 33 | if (Vars.headless === true) { 34 | return null 35 | } 36 | return Core.atlas.find(exports.modName + '-' + name, "error") 37 | }; 38 | 39 | /** 40 | * @param {Block} blockType The block type 41 | * @param {(block: Block) => Building} buildingCreator 42 | * A function receives block type, return Building instance; 43 | * don't use prov (this function will use prov once) 44 | */ 45 | exports.setBuilding = function(blockType, buildingCreator) { 46 | blockType.buildType = prov(() => buildingCreator(blockType)); 47 | } 48 | 49 | /** 50 | * @param {Block} blockType The block type 51 | * @param {Class} buildingType The building type 52 | * @param {Object} overrides Object that as second parameter of extend() 53 | */ 54 | exports.setBuildingSimple = function(blockType, buildingType, overrides) { 55 | blockType.buildType = prov(() => new JavaAdapter(buildingType, overrides, blockType)); 56 | } 57 | 58 | /** 59 | * Get message from bundle. 60 | * @param {string} type the prefix such as block, unit, mech 61 | * @param 62 | */ 63 | exports.getMessage = function(type, key) { 64 | return Core.bundle.get(type + "." + exports.modName + "." + key); 65 | } 66 | 67 | exports.int = (v) => new java.lang.Integer(v); 68 | 69 | exports.createProbabilitySelector = function() { 70 | const objects = []; 71 | const probabilities = []; 72 | var maxProbabilitySum = 0; 73 | 74 | return { 75 | showProbabilities() { 76 | const p = []; 77 | var previous = 0; 78 | for (var i = 0; i < probabilities.length; i++) { 79 | var current = probabilities[i]; 80 | p.push(parseFloat(((current - previous) / maxProbabilitySum).toFixed(5))) 81 | previous = current; 82 | } 83 | return p; 84 | }, 85 | add(obj, probability) { 86 | if (!Number.isInteger(probability)) { 87 | throw "'probability' must integer." 88 | } 89 | maxProbabilitySum += probability; 90 | objects.push(obj); 91 | probabilities.push(maxProbabilitySum); 92 | }, 93 | random: function() { 94 | const random = Math.floor(Math.random() * maxProbabilitySum); 95 | // Can use binary search 96 | for (var i = 0; i < probabilities.length; i++) { 97 | var max = probabilities[i]; 98 | if (random < max) { 99 | return objects[i]; 100 | } 101 | } 102 | throw "IMPOSSIBLE!!! THIS IS A BUG" 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /scripts/super-cheat/must-die-turret.js: -------------------------------------------------------------------------------- 1 | 2 | // 死 3 | 4 | const lib = require('super-cheat/lib'); 5 | 6 | 7 | const destoryBeamBulletType = (() => { 8 | const THE_COLOR = Color.purple; 9 | 10 | const fragBulletType = (() => { 11 | 12 | const hitEffect = lib.newEffect(8, (e) => { 13 | Draw.color(Color.black, THE_COLOR, e.fin()); 14 | Lines.stroke(0.5 + e.fout()); 15 | Lines.circle(e.x, e.y, e.fin() * 10); 16 | }); 17 | 18 | const despawnEffect = lib.newEffect(8, (e) => { 19 | Draw.color(Color.black, THE_COLOR, e.fin()); 20 | Lines.stroke(0.5 + e.fout()); 21 | Lines.circle(e.x, e.y, e.fin() * 5); 22 | }); 23 | 24 | const bt = extend(BasicBulletType, { 25 | hitEntity(b, other, initialHealth) { 26 | if (other && other.kill) { 27 | // other.kill(); 28 | Call.unitDestroy(other.id) 29 | } 30 | }, 31 | hitTile(b, tile, x, y, health, direct) { 32 | this.super$hitTile(b, tile, x, y, health, direct); 33 | if (tile && tile.team != b.team) { 34 | tile.killed(); 35 | } 36 | }, 37 | draw(b) { 38 | Draw.color(THE_COLOR); 39 | // Lines.stroke(1); 40 | // Lines.lineAngleCenter(b.x, b.y, b.rotation(), 6); 41 | // Draw.color(Color.white); 42 | // Lines.lineAngleCenter(b.x, b.y, b.rotation(), 1); 43 | 44 | Drawf.tri(b.x, b.y, 4, 8, b.rotation()); 45 | Drawf.tri(b.x, b.y, 4, 12, b.rotation() - 180); 46 | Draw.reset(); 47 | }, 48 | update(b) { 49 | // Rewrite homing power (adds a delay) trail logic 50 | if (this.homingPower > 0.0001 && b.time > 12) { 51 | var target = Units.closestTarget(b.team, b.x, b.y, this.homingRange, 52 | boolf(e => (e.isGrounded() && this.collidesGround) || (e.isFlying() && this.collidesAir)), 53 | boolf(t => this.collidesGround) 54 | ); 55 | if (target != null) { 56 | b.vel.setAngle(Mathf.slerpDelta(b.rotation(), b.angleTo(target), this.homingPower)); 57 | } 58 | } 59 | }, 60 | }); 61 | bt.pierce = true; 62 | bt.pierceCap = 6; 63 | bt.pierceBuilding = false; 64 | bt.healPercent = 500; 65 | bt.speed = 3.5; 66 | bt.damage = Infinity; 67 | bt.homingPower = 0.3; 68 | bt.homingRange = 50; 69 | bt.splashDamage = 3; 70 | bt.splashDamageRadius = 10; 71 | bt.hitEffect = hitEffect; 72 | bt.despawnEffect = despawnEffect; 73 | bt.lifetime = 35; 74 | bt.shootEffect = Fx.none; 75 | return bt; 76 | })(); 77 | 78 | const tailEffectTime = 12; 79 | const tailEffect = lib.newEffect(tailEffectTime, e => { 80 | Draw.color(Color.black, THE_COLOR, Math.max(0, e.fout() * 2 - 1)); 81 | Drawf.tri(e.x, e.y, 8 * e.fout(), 16, e.rotation); 82 | Drawf.tri(e.x, e.y, 8 * e.fout(), 30 * Math.min(1, e.data.time / 8 * 0.8 + 0.2), e.rotation - 180); 83 | }); 84 | 85 | const hitEffect = lib.newEffect(8, (e) => { 86 | Draw.color(Color.black, THE_COLOR, e.fin()); 87 | Lines.stroke(0.5 + e.fout()); 88 | Lines.circle(e.x, e.y, e.fin() * 30); 89 | }); 90 | 91 | const despawnEffect = lib.newEffect(8, (e) => { 92 | Draw.color(Color.black, THE_COLOR, e.fin()); 93 | Lines.stroke(0.5 + e.fout()); 94 | Lines.circle(e.x, e.y, e.fin() * 5); 95 | }); 96 | 97 | const bt = extend(BasicBulletType, { 98 | hitTile(b, tile, x, y, health, direct) { 99 | this.super$hitTile(b, tile, x, y, health, direct); 100 | if (tile && tile.team != b.team) { 101 | tile.killed() 102 | } 103 | }, 104 | draw(b) { 105 | Draw.color(THE_COLOR); 106 | // Lines.stroke(2); 107 | // Lines.lineAngleCenter(b.x, b.y, b.rotation(), 15); 108 | // Draw.color(Color.white); 109 | // Lines.lineAngleCenter(b.x, b.y, b.rotation(), 1); 110 | 111 | Drawf.tri(b.x, b.y, 8, 16, b.rotation()); 112 | Drawf.tri(b.x, b.y, 8, 30 * Math.min(1, b.time / this.speed * 0.8 + 0.2), b.rotation() - 180); 113 | Draw.reset(); 114 | }, 115 | update(b) { 116 | // Rewrite homing power (adds a delay) trail logic 117 | if (this.homingPower > 0.0001 && b.time > 25) { 118 | var target = Units.closestTarget(b.team, b.x, b.y, this.homingRange, 119 | boolf(e => (e.isGrounded() && this.collidesGround) || (e.isFlying() && this.collidesAir)), 120 | boolf(t => this.collidesGround) 121 | ); 122 | if (target != null) { 123 | b.vel.setAngle(Mathf.slerpDelta(b.rotation(), b.angleTo(target), this.homingPower)); 124 | } 125 | } 126 | 127 | if (b.timer.get(1, 1)) { 128 | tailEffect.at(b.x, b.y, b.rotation(), THE_COLOR, { time: ((v) => v)(b.time) }); 129 | } 130 | }, 131 | }); 132 | bt.pierce = true; 133 | bt.pierceCap = 6; 134 | bt.pierceBuilding = false; 135 | bt.hitSize = 8; 136 | bt.healPercent = 1000; 137 | bt.speed = 6; 138 | bt.damage = Infinity; 139 | bt.homingPower = 0.3; 140 | bt.homingRange = 240; 141 | bt.splashDamage = Infinity; 142 | bt.splashDamageRadius = 30; 143 | bt.shootEffect = Fx.none; 144 | bt.hitEffect = hitEffect; 145 | bt.despawnEffect = despawnEffect; 146 | bt.fragBullet = fragBulletType; 147 | bt.fragBullets = 6; 148 | bt.lifetime = 110; 149 | return bt; 150 | })(); 151 | 152 | const turret = extend(Turret, 'must-die-turret', { 153 | load() { 154 | this.super$load(); 155 | this.baseRegion = lib.loadRegion("must-die-turret-base"); 156 | }, 157 | // generateIcons(){ 158 | // const list = this.super$generateIcons(); 159 | // list[0] = Core.atlas.find(lib.modName + "-must-die-turret-base"); 160 | // list[1] = Core.atlas.find(this.name); 161 | // return list; 162 | // }, 163 | }); 164 | 165 | lib.setBuildingSimple(turret, Turret.TurretBuild, { 166 | hasAmmo() { return true; }, 167 | peekAmmo() { return destoryBeamBulletType; }, 168 | useAmmo() { return destoryBeamBulletType; }, 169 | }); 170 | 171 | turret.targetInterval = 0; 172 | -------------------------------------------------------------------------------- /scripts/super-cheat/next-wave.js: -------------------------------------------------------------------------------- 1 | const lib = require('super-cheat/lib') 2 | 3 | lib.setBuilding(extend(Block, "next-wave", {}), (block) => extend(Building, { 4 | //override the method to build configuration 5 | buildConfiguration(table) { 6 | table.button(Icon.upOpen, Styles.cleari, run(() => { 7 | this.configure(0) 8 | })).size(50).tooltip(lib.getMessage("message", "next-wave-1")); 9 | table.button(Icon.warningSmall, Styles.cleari, run(() => { 10 | this.configure(1) 11 | })).size(50).tooltip(lib.getMessage("message", "next-wave-10")); 12 | }, 13 | 14 | //override configure event 15 | configured(player, value) { 16 | switch (value) { 17 | case 0: { 18 | // Evil thing, any one can call next wave 19 | if (Vars.net.client()) { 20 | Call.adminRequest(Vars.player, Packages.mindustry.net.Packets.AdminAction.wave); 21 | } else { 22 | Vars.state.wavetime = 0; 23 | } 24 | break; 25 | } 26 | case 1: { 27 | for (var i = 10; i > 0; i--) { 28 | if (Vars.net.client()) { 29 | Call.adminRequest(Vars.player, Packages.mindustry.net.Packets.AdminAction.wave); 30 | } else { 31 | Vars.logic.runWave(); 32 | } 33 | } 34 | break; 35 | } 36 | default: { 37 | // print('Unknown config event value ' + value); 38 | } 39 | } 40 | } 41 | })); 42 | -------------------------------------------------------------------------------- /scripts/super-cheat/one-shot-turret.js: -------------------------------------------------------------------------------- 1 | const lib = require('super-cheat/lib'); 2 | 3 | const invincibleBulletType = (() => { 4 | 5 | const bt = extend(BasicBulletType, { 6 | hitEntity(b, other, initialHealth) { 7 | if (other && other.kill) { 8 | Call.unitDestroy(other.id) 9 | } 10 | }, 11 | hitTile(b, tile, x, y, health, direct) { 12 | this.super$hitTile(b, tile, x, y, health, direct) ; 13 | if (tile) { 14 | tile.killed() 15 | } 16 | }, 17 | }); 18 | 19 | bt.damage = Infinity; 20 | bt.splashDamage = Infinity; 21 | bt.speed = 24; 22 | bt.hitSize = 6; 23 | bt.width = 9; 24 | bt.height = 45; 25 | bt.lifetime = 26; 26 | bt.inaccuracy = 0; 27 | bt.despawnEffect = Fx.hitBulletSmall; 28 | bt.keepVelocity = false; 29 | return bt; 30 | })(); 31 | 32 | const turret = extend(Turret, 'one-shot-turret', { 33 | }); 34 | 35 | lib.setBuildingSimple(turret, Turret.TurretBuild, { 36 | hasAmmo() { return true; }, 37 | peekAmmo() { return invincibleBulletType; }, 38 | useAmmo() { return invincibleBulletType; }, 39 | shoot(type) { 40 | this.super$shoot(type) 41 | }, 42 | }); 43 | 44 | turret.targetInterval = 0; 45 | -------------------------------------------------------------------------------- /scripts/super-cheat/point-turret.js: -------------------------------------------------------------------------------- 1 | 2 | // 死 3 | 4 | const lib = require('super-cheat/lib'); 5 | 6 | const invincibleBulletType = (() => { 7 | 8 | const bt = extend(PointBulletType, { 9 | hitEntity(b, other, initialHealth) { 10 | if (other && other.kill) { 11 | Call.unitDestroy(other.id) 12 | } 13 | }, 14 | hitTile(b, tile, x, y, health, direct) { 15 | this.super$hitTile(b, tile, x, y, health, direct) ; 16 | if (tile) { 17 | tile.killed() 18 | } 19 | }, 20 | }); 21 | 22 | const tailEffectTime = 12; 23 | const trialEffect = lib.newEffect(tailEffectTime, e => { 24 | let fx = Angles.trnsx(e.rotation, 24) 25 | let fy = Angles.trnsy(e.rotation, 24) 26 | Lines.stroke(3 * e.fout(), Pal.spore); 27 | Lines.line(e.x, e.y, e.x + fx, e.y + fy); 28 | 29 | Drawf.light(e.x, e.y, 60 * e.fout(), Pal.spore, 0.5); 30 | }); 31 | const hitEffect = lib.newEffect(8, (e) => { 32 | Draw.color(Pal.spore); 33 | Lines.stroke(e.fout() * 1.5); 34 | 35 | Angles.randLenVectors(e.id, 8, e.finpow() * 22, lib.floatc2((x, y) => { 36 | let ang = Mathf.angle(x, y); 37 | Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1); 38 | })); 39 | }); 40 | 41 | bt.damage = Infinity; 42 | // bt.splashDamage = Infinity; 43 | bt.speed = 0.00001; 44 | // bt.hitSize = 6; 45 | // bt.width = 9; 46 | // bt.height = 45; 47 | // bt.lifetime = 0; 48 | bt.inaccuracy = 0 49 | bt.keepVelocity = false 50 | bt.trailSpacing = 20 51 | bt.hitShake = 0.3 52 | bt.despawnEffect = hitEffect 53 | bt.hitEffect = hitEffect 54 | bt.trailEffect = trialEffect 55 | return bt; 56 | })(); 57 | 58 | const shootEffect = lib.newEffect(21, e => { 59 | Draw.color(Pal.spore) 60 | for (let i of Mathf.signs) { 61 | Drawf.tri(e.x, e.y, 4 * e.fout(), 29, e.rotation + 90 * i); 62 | } 63 | }); 64 | 65 | const turret = extend(Turret, 'point-turret', { 66 | }); 67 | turret.shootEffect = shootEffect 68 | 69 | lib.setBuildingSimple(turret, Turret.TurretBuild, { 70 | hasAmmo() { return true; }, 71 | peekAmmo() { return invincibleBulletType; }, 72 | useAmmo() { return invincibleBulletType; }, 73 | shoot(type) { 74 | if (this.isControlled() || this.logicShooting) { 75 | this.super$shoot(type) 76 | } else if (this.target) { 77 | if (this.target instanceof Packages.mindustry.gen.Buildingc) { 78 | this.target.killed() 79 | } else if (this.target instanceof Packages.mindustry.gen.Unitc) { 80 | Call.unitDestroy(this.target.id) 81 | } 82 | const rot = this.rotation 83 | this.totalShots += 1 84 | let bulletX = this.x + Angles.trnsx(rot - 90, turret.shootX, turret.shootY) 85 | let bulletY = this.y + Angles.trnsy(rot - 90, turret.shootX, turret.shootY) 86 | turret.shootSound.at(bulletX, bulletY, Mathf.random(turret.soundPitchMin, turret.soundPitchMax)) 87 | 88 | turret.ammoUseEffect.at( 89 | this.x - Angles.trnsx(rot, turret.ammoEjectBack), 90 | this.y - Angles.trnsy(rot, turret.ammoEjectBack), 91 | rot * Mathf.sign(0) 92 | ) 93 | 94 | const angle = Mathf.angle(this.target.x - bulletX, this.target.y - bulletY) 95 | Geometry.iterateLine(0, bulletX, bulletY, this.target.x, this.target.y, type.trailSpacing, 96 | lib.floatc2((x, y) => { 97 | type.trailEffect.at(x, y, angle); 98 | }) 99 | ) 100 | 101 | if (turret.shootEffect) { 102 | turret.shootEffect.at(bulletX, bulletY, angle, Pal.spore) 103 | } 104 | if (turret.shake > 0){ 105 | Effect.shake(turret.shake, turret.shake, this) 106 | } 107 | this.useAmmo() 108 | this.curRecoil = 1 109 | this.heat = 1 110 | } else { 111 | this.super$shoot(type) 112 | } 113 | }, 114 | }); 115 | 116 | turret.targetInterval = 0; 117 | -------------------------------------------------------------------------------- /scripts/super-cheat/quantum-launchpad.js: -------------------------------------------------------------------------------- 1 | const lib = require('super-cheat/lib') 2 | 3 | const evilNumber = 10000; 4 | var blockType = extend(LaunchPad, "quantum-launchpad", {}); 5 | 6 | lib.setBuildingSimple(blockType, LaunchPad.LaunchPadBuild, { 7 | 8 | updateTile() { 9 | if (!Vars.state.isCampaign()) return; 10 | var items = this.items; 11 | var itemCapacity = this.itemCapacity; 12 | var launchTime = this.timeScale; 13 | var team = this.timeScale; 14 | var timerLaunch = this.timeScale; 15 | var timeScale = this.timeScale; 16 | 17 | //launch when full and base conditions are met 18 | if (items.total() >= itemCapacity && efficiency >= 1 && timer(timerLaunch, launchTime / timeScale)) { 19 | var entity = LaunchPayload.create(); 20 | items.each((item, amount) => entity.stacks.add(new ItemStack(item, amount * evilNumber))); 21 | entity.set(this); 22 | entity.lifetime(120); 23 | entity.team(team); 24 | entity.add(); 25 | Fx.launchPod.at(this); 26 | items.clear(); 27 | Effect.shake(3, 3, this); 28 | } 29 | } 30 | }); 31 | -------------------------------------------------------------------------------- /scripts/super-cheat/smart-filler.js: -------------------------------------------------------------------------------- 1 | const lib = require('super-cheat/lib'); 2 | 3 | const range = 27; 4 | 5 | const baseColor = Pal.reactorPurple; 6 | const tilesize = Vars.tilesize; 7 | const indexer = Vars.indexer; 8 | const world = Vars.world; 9 | const content = Vars.content; 10 | const state = Vars.state; 11 | 12 | const taken = new IntSet(); 13 | 14 | const itemValueList = []; 15 | const bestTurretCoolantMap = {}; 16 | const bestItemTurretAmmoMap = {}; 17 | 18 | /** 19 | * Describe a requirement 20 | * 21 | * @param {string} category liquid, item, power 22 | * @param {Object} type Liquid, Item, null 23 | * @param {number} amount Amount 24 | */ 25 | function ResourcesRequirement(category, type, amount) { 26 | this.category = category; 27 | this.type = type; 28 | this.amount = amount; 29 | } 30 | 31 | /** 32 | * Describe a factory 33 | * 34 | * @param {number} craftTime time 35 | * @param {ResourcesRequirement[]} requirements craft resources usage 36 | * @param {Item[]} factoryRequirements factory requirements 37 | */ 38 | function FactoryInfo(craftTime, requirements, factoryRequirements) { 39 | this.craftTime = craftTime; 40 | this.requirements = requirements; 41 | this.factoryRequirements = factoryRequirements; 42 | } 43 | 44 | /** 45 | * 尝试初始化物品价值列表,最值钱的放在前面。 46 | * 47 | * (不保证在其他 Mod 中也准确) 48 | * 49 | * 首先资源基础价值 = 工厂所需其他材料; 50 | * 然后要加上制作它所需的资源,包括物品、热量、液体、电力、生产速度。 51 | * 从游戏经验来看,资源需求对资源价值的影响大概是: 52 | * - 需求种类越多越麻烦,铜铅钛硅四种资源直接增大了蓝图难度,同时需要热量、液体、物品的难度 53 | * - 数量需求,如产一个 phase fabric 所需的巨大的沙子需求,经常跑满整个传输体系 54 | * - 生产速度,比如碳化物非常缓慢的产生速度 55 | */ 56 | function initItemValueList() { 57 | const map = {}; 58 | const factoryMap = {}; 59 | function getRequirementGroup(type) { 60 | let c = factoryMap[type]; 61 | if (c == undefined) { 62 | c = []; 63 | factoryMap[type] = c; 64 | } 65 | return c; 66 | } 67 | // 1. find ore or floor, calculate by hardness (beryllum and tungsten are special) 68 | let i; 69 | i = content.blocks.iterator(); 70 | blockloop: 71 | while (i.hasNext()) { 72 | let block = i.next(); 73 | if (block.itemDrop) { 74 | if (block.itemDrop == Items.beryllium) { 75 | map.put(block.itemDrop, Item.coal.hardness); 76 | } else if (block.itemDrop == Items.tungsten) { 77 | map.put(block.itemDrop, Item.titanium.hardness); 78 | } else if (block.itemDrop == Items.graphite) { 79 | map.put(block.itemDrop, Item.titanium.hardness); 80 | } else { 81 | map.put(block.itemDrop, block.itemDrop.hardness); 82 | } 83 | } 84 | // 2. get all factories 85 | if (block instanceof GenericCrafter) { 86 | let reqs = []; 87 | let craftTime = block.craftTime; 88 | let factoryRequirements = []; 89 | let resourcesKink = 0; 90 | // 1 heat = 30 power 91 | // 1 power = 1/60 92 | let heat = block.heatRequirement; 93 | for (let requirement of block.requirements) { 94 | factoryRequirements.add(requirement.item); 95 | } 96 | for (let consume of block.nonOptionalConsumers) { 97 | if (consume instanceof ConsumeItems) { 98 | for (let citem of consume.items) { 99 | reqs.add(ResourcesRequirement("item", citem.item, citem.amount)); 100 | } 101 | } else if (consume instanceof ConsumeLiquids) { 102 | for (let cliquid of consume.liquids) { 103 | reqs.add(ResourcesRequirement("liquid", cliquid.liquid, cliquid.amount)); 104 | } 105 | } else if (consume instanceof ConsumeLiquid) { 106 | reqs.add(ResourcesRequirement("liquid", consume.liquid, consume.amount)); 107 | } else if (consume instanceof ConsumePower) { 108 | reqs.add(ResourcesRequirement("power", null, consume.usage)); 109 | } 110 | } 111 | let info = FactoryInfo(craftTime, reqs, factoryRequirements); 112 | let cost = 0; 113 | 114 | if (block.outputLiquids) { 115 | for (let liquid of block.outputLiquids) { 116 | getRequirementGroup(liquid).push(info); 117 | } 118 | } 119 | if (block.outputItems) { 120 | for (let item of block.outputItems) { 121 | // TODO if factory require it self, exclude this factory 122 | getRequirementGroup(item).push(info); 123 | } 124 | } 125 | } else if (block instanceof Separator) { 126 | for (let r of block.results) { 127 | if (!map[r.item]) { 128 | factoryMap[r.item] = block; 129 | } 130 | } 131 | } 132 | } 133 | 134 | // 2. find 135 | 136 | i = content.items.iterator(); 137 | while (i.hasNext()) { 138 | let item = i.next(); 139 | 140 | } 141 | } 142 | 143 | /** 144 | * Fill blocks with resources 145 | * 146 | * @param {SmartFiller} filler The Smart Filler 147 | * @param {Building} b Building to fill 148 | */ 149 | function fillBuilding(filler, b) { 150 | const block = b.block; 151 | // turret 152 | if (b instanceof BaseTurret.BaseTurretBuild) { 153 | // fill collant 154 | if (block.coolant != null) { 155 | let c = bestTurretCoolantMap[block]; 156 | if (!c) { 157 | // find best collant to that type of turret 158 | let bestLiquid = ""; 159 | let bestLiquidHeatCapacity = 0; 160 | let i = content.liquids().iterator(); 161 | while (i.hasNext()) { 162 | let liquid = i.next(); 163 | if(!block.consumesLiquid(liquid)) continue; 164 | if (bestLiquid == null || liquid.heatCapacity > bestLiquidHeatCapacity) { 165 | bestLiquid = liquid; 166 | bestLiquidHeatCapacity = liquid.heatCapacity; 167 | } 168 | } 169 | c = bestLiquid; 170 | bestTurretCoolantMap[block] = c; 171 | } 172 | 173 | if (c != "") { 174 | b.handleLiquid(filler, c, block.liquidCapacity); 175 | } 176 | } 177 | 178 | if (b instanceof ItemTurret.ItemTurretBuild) { 179 | // fill with best ammo 180 | let t = bestItemTurretAmmoMap[block]; 181 | if (!t) { 182 | // find best ammo 183 | let bestAmmo = ""; 184 | let bestAmmoStrength = 0; 185 | 186 | let i = content.items().iterator(); 187 | while (i.hasNext()) { 188 | let item = i.next(); 189 | if (!block.consumesItem(item)) { 190 | continue; 191 | } 192 | 193 | } 194 | t = bestAmmo; 195 | bestItemTurretAmmoMap[block] = t; 196 | } 197 | if (t != "") { 198 | b.handleStack(t, block.itemCapacity, filler); 199 | } 200 | } 201 | return; 202 | } else if (b instanceof StorageBlock.StorageBuild) { 203 | // fill everything 204 | if (block.coreMerge && b.linkedCore != null) { 205 | // fill cores 206 | let i = content.items().iterator(); 207 | while (i.hasNext()) { 208 | let item = i.next(); 209 | let fill = b.linkedCore.storageCapacity - b.linkedCore.items.get(item); 210 | if (fill > 0) { 211 | b.items.add(fill); 212 | if (net.server() || !net.active() && b.team == state.rules.defaultTeam && state.isCampaign()) { 213 | state.rules.sector.info.handleCoreItem(item, fill); 214 | } 215 | } 216 | } 217 | } else { 218 | // fill normal vault 219 | let i = content.items().iterator(); 220 | while (i.hasNext()) { 221 | let item = i.next(); 222 | let fill = b.block.itemCapacity - b.items.get(item); 223 | if (fill > 0) { 224 | b.items.add(item, fill); 225 | } 226 | } 227 | } 228 | } 229 | } 230 | 231 | const blockType = extend(Block, "smart-filler", { 232 | 233 | drawPlace(x, y, rotation, valid) { 234 | x *= tilesize; 235 | y *= tilesize; 236 | 237 | Drawf.dashSquare(baseColor, x, y, range * tilesize); 238 | indexer.eachBlock(Vars.player.team(), Tmp.r1.setCentered(x, y, range * tilesize), b => true, t => { 239 | let c = Tmp.c1.set(baseColor); 240 | c.a = Mathf.absin(4, 1); 241 | Drawf.selected(t, c) 242 | }); 243 | }, 244 | }); 245 | 246 | blockType.buildType = prov(() => { 247 | const targets = new Seq(); 248 | let lastChange = -2; 249 | 250 | function updateTargets(that) { 251 | targets.clear(); 252 | taken.clear(); 253 | indexer.eachBlock(that.team, Tmp.r1.setCentered(that.x, that.y, range * tilesize), 254 | b => true, b => { 255 | // keep fillable building 256 | if (b.block.hasItems || b.block.hasLiquids) { 257 | targets.add(b); 258 | } 259 | }); 260 | } 261 | 262 | return new JavaAdapter(Building, { 263 | 264 | updateTile() { 265 | if(lastChange != world.tileChanges) { 266 | lastChange = world.tileChanges; 267 | updateTargets(this); 268 | } 269 | 270 | let i = targets.iterator(); 271 | while (i.hasNext()) { 272 | let t = i.next(); 273 | fillBuilding(this, t); 274 | } 275 | }, 276 | }); 277 | }); 278 | -------------------------------------------------------------------------------- /scripts/super-cheat/static-drill.js: -------------------------------------------------------------------------------- 1 | var lib = require('super-cheat/lib'); 2 | 3 | const block = extend(Drill, "static-drill", {}); 4 | lib.setBuildingSimple(block, Drill.DrillBuild, { 5 | dump(item) { 6 | if (item) { 7 | for (var i = 36; i > 0; i--) { 8 | this.super$dump(item); 9 | } 10 | } 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /scripts/super-cheat/team-changer.js: -------------------------------------------------------------------------------- 1 | var lib = require('super-cheat/lib'); 2 | var invincibleShipJs = require('super-cheat/invincible-ship'); 3 | 4 | const block = extend(CoreBlock, "team-changer", { 5 | canBreak(tile) { return Vars.state.teams.cores(tile.team()).size > 1; }, 6 | canReplace(other) { return other.alwaysReplace; }, 7 | canPlaceOn(tile, team) { return true; }, 8 | placeBegan(tile, previous) {}, 9 | beforePlaceBegan(tile, previous) {}, 10 | 11 | drawPlace(x, y, rotation, valid) {}, 12 | }); 13 | // block.config(java.lang.Integer, lib.cons2((tile, i) => { 14 | // tile.team = Team.get(i); 15 | // })); 16 | 17 | const allTeams = [ 18 | Team.derelict, Team.sharded, Team.crux, 19 | Team.green, Team.blue, 20 | ]; 21 | lib.setBuildingSimple(block, CoreBlock.CoreBuild, { 22 | damage(damage) { }, 23 | handleDamage(tile, amount) { return 0; }, 24 | 25 | buildConfiguration(table) { 26 | const tmp = new ImageButton(); 27 | const g = new ButtonGroup(tmp); 28 | g.remove(tmp); 29 | const cont = new Table(); 30 | cont.defaults().size(32); 31 | var i = 0; 32 | allTeams.forEach(team => { 33 | (team => { 34 | var button = cont.button(Tex.whiteui, Styles.clearTogglei, 24, run(() => { 35 | })).group(g).get(); 36 | button.changed(run(() => { 37 | if (button.isChecked()) { 38 | this.configure(lib.int(team.id)); 39 | } 40 | })); 41 | button.getStyle().imageUp = Tex.whiteui.tint(team.color.r, team.color.g, team.color.b, team.color.a); 42 | button.update(run(() => button.setChecked(this.team == team) )); 43 | 44 | if (i++ % 3 == 3) { 45 | cont.row(); 46 | } 47 | })(team); 48 | }); 49 | // if (i % 3 != 0) { 50 | // var remaining = 3 - (i % 3); 51 | // for (var j = 0; j < remaining; j++) { 52 | // cont.image(Styles.black6); 53 | // } 54 | // } 55 | var pane = new ScrollPane(cont, Styles.smallPane); 56 | pane.setScrollingDisabled(true, false); 57 | pane.setOverscroll(false, false); 58 | table.add(pane).maxHeight(Scl.scl(40 * 2)).left(); 59 | table.row(); 60 | }, 61 | configured(builder, value) { 62 | this.super$configured(builder, value); 63 | if (builder != null && builder.isPlayer()) { 64 | const team = Team.get(value); 65 | builder.team = team; 66 | builder.getPlayer().team(team); 67 | 68 | this.onRemoved(); 69 | this.team = team; 70 | this.onProximityUpdate(); 71 | } 72 | }, 73 | }); 74 | block.unitType = UnitTypes.gamma; 75 | -------------------------------------------------------------------------------- /scripts/super-cheat/terminator.js: -------------------------------------------------------------------------------- 1 | 2 | const lib = require('super-cheat/lib'); 3 | 4 | const THE_COLOR = Color.valueOf("ff1111"); 5 | 6 | const healBeamFrag = (() => { 7 | 8 | const tailEffect = newEffect(6, e => { 9 | Draw.color(Color.black, THE_COLOR, Math.max(0, e.fout() * 2 - 1)); 10 | Drawf.tri(e.x, e.y, 4 * e.fout(), 8, e.rotation); 11 | Drawf.tri(e.x + Angles.trnsx(e.rotation, 8), e.y + Angles.trnsy(e.rotation, 8), 4 * (e.fout() * 0.8 + 0.2), 24 * (e.fin() * 0.8 + 0.2), e.rotation - 180); 12 | }); 13 | 14 | const hitEffect = newEffect(8, (e) => { 15 | Draw.color(Color.black, THE_COLOR, e.fin()); 16 | Lines.stroke(0.5 + e.fout()); 17 | Lines.circle(e.x, e.y, e.fin() * 10); 18 | }); 19 | 20 | const despawnEffect = newEffect(8, (e) => { 21 | Draw.color(Color.black, THE_COLOR, e.fin()); 22 | Lines.stroke(0.5 + e.fout()); 23 | Lines.circle(e.x, e.y, e.fin() * 5); 24 | }); 25 | 26 | const bt = extend(HealBulletType, { 27 | load() { 28 | this.super$load(); 29 | this.healPercent = 5; 30 | this.speed = 3; 31 | this.damage = 6; 32 | this.homingPower = 15; 33 | this.homingRange = 50; 34 | this.splashDamage = 3; 35 | this.splashDamageRadius = 10; 36 | this.hitEffect = hitEffect; 37 | this.despawnEffect = despawnEffect; 38 | this.lifetime = 20; 39 | this.shootEffect = Fx.none; 40 | }, 41 | collides(b, tile){ 42 | return tile.getTeam() != b.getTeam() || tile.entity.healthf() < 1; 43 | }, 44 | draw(b) { 45 | Draw.color(THE_COLOR); 46 | // Lines.stroke(1); 47 | // Lines.lineAngleCenter(b.x, b.y, b.rot(), 6); 48 | // Draw.color(Color.white); 49 | // Lines.lineAngleCenter(b.x, b.y, b.rot(), 1); 50 | 51 | Drawf.tri(b.x, b.y, 4, 8, b.rot()); 52 | Drawf.tri(b.x, b.y, 4, 12, b.rot() - 180); 53 | Draw.reset(); 54 | }, 55 | update(b) { 56 | if (b.timer.get(1, 1)) { 57 | Effects.effect(tailEffect, THE_COLOR, b.x, b.y, b.rot()); 58 | } 59 | if (this.homingPower > 0.0001) { 60 | var target = Units.closestTarget(b.getTeam(), b.x, b.y, this.homingRange, boolf(e => !e.isFlying() || this.collidesAir)); 61 | if (target != null) { 62 | b.velocity().setAngle(Mathf.slerpDelta(b.velocity().angle(), b.angleTo(target), 0.2)); 63 | } 64 | } 65 | }, 66 | hitTile(b, tile) { 67 | this.hit(b); 68 | tile = tile.link(); 69 | 70 | if (tile.entity != null && tile.getTeam() == b.getTeam() && (tile.block() != BuildBlock)) { 71 | Effects.effect(Fx.healBlockFull, THE_COLOR, tile.drawx(), tile.drawy(), tile.block().size); 72 | tile.entity.healBy(this.healPercent / 100 * tile.entity.maxHealth()); 73 | } 74 | } 75 | }); 76 | return bt; 77 | })(); 78 | const healBeam = (() => { 79 | const tailEffectTime = 12; 80 | const tailEffect = newEffect(tailEffectTime, e => { 81 | Draw.color(Color.black, THE_COLOR, Math.max(0, e.fout() * 2 - 1)); 82 | Drawf.tri(e.x, e.y, 8 * e.fout(), 16, e.rotation); 83 | Drawf.tri(e.x, e.y, 8 * e.fout(), 30 * Math.min(1, e.data.time / 6 * 0.8 + 0.2), e.rotation - 180); 84 | }); 85 | 86 | const hitEffect = newEffect(8, (e) => { 87 | Draw.color(Color.black, THE_COLOR, e.fin()); 88 | Lines.stroke(0.5 + e.fout()); 89 | Lines.circle(e.x, e.y, e.fin() * 30); 90 | }); 91 | 92 | const despawnEffect = newEffect(8, (e) => { 93 | Draw.color(Color.black, THE_COLOR, e.fin()); 94 | Lines.stroke(0.5 + e.fout()); 95 | Lines.circle(e.x, e.y, e.fin() * 5); 96 | }); 97 | 98 | const bt = extend(HealBulletType, { 99 | load() { 100 | this.hitSize = 8; 101 | this.healPercent = 10; 102 | this.speed = 6; 103 | this.damage = 30; 104 | this.homingPower = 60; 105 | this.homingRange = 240; 106 | this.splashDamage = 10; 107 | this.splashDamageRadius = 30; 108 | this.hitEffect = hitEffect; 109 | this.despawnEffect = despawnEffect; 110 | this.fragBullet = healBeamFrag; 111 | this.fragBullets = 6; 112 | this.lifetime = 60; 113 | }, 114 | draw(b) { 115 | Draw.color(THE_COLOR); 116 | // Lines.stroke(2); 117 | // Lines.lineAngleCenter(b.x, b.y, b.rot(), 15); 118 | // Draw.color(Color.white); 119 | // Lines.lineAngleCenter(b.x, b.y, b.rot(), 1); 120 | 121 | Drawf.tri(b.x, b.y, 8, 16, b.rot()); 122 | Drawf.tri(b.x, b.y, 8, 30 * Math.min(1, b.time() / this.speed * 0.8 + 0.2), b.rot() - 180); 123 | Draw.reset(); 124 | }, 125 | update(b) { 126 | 127 | if (b.timer.get(1, 1)) { 128 | Effects.effect(tailEffect, THE_COLOR, b.x, b.y, b.rot(), { time: ((v) => v)(b.time()) }); 129 | } 130 | if (this.homingPower > 0.0001 && b.time() > 25) { 131 | var target = Units.closestTarget(b.getTeam(), b.x, b.y, this.homingRange, boolf(e => !e.isFlying() || this.collidesAir)); 132 | if (target != null) { 133 | b.velocity().setAngle(Mathf.slerpDelta(b.velocity().angle(), b.angleTo(target), 0.2)); 134 | } 135 | } 136 | }, 137 | }); 138 | return bt; 139 | })(); 140 | 141 | const terminatorMainWeapon = (() => { 142 | 143 | const fullName = lib.modName + '-' + 'super-heal-beam-weapon'; 144 | const w = extend(Weapon, { 145 | load() { 146 | // Add a prefix prevent confliction with other mods 147 | this.name = fullName; 148 | this.super$load(); 149 | 150 | // const assetName = lib.modName + '-' + this.name; 151 | // this.region = Core.atlas.find( 152 | // assetName + "-equip", 153 | // Core.atlas.find(assetName + "-equip", Core.atlas.find("clear")) 154 | // ); 155 | // print('load ' + this.name + '-equip : ' + this.region); 156 | }, 157 | }); 158 | 159 | w.name = fullName; 160 | w.bullet = healBeam; 161 | w.inaccuracy = 0; 162 | w.shots = 4; 163 | w.spacing = 2; 164 | w.reload = 30; 165 | w.shotDelay = 3; 166 | 167 | w.length = 16; 168 | w.width = 22; 169 | w.shake = 0.5; 170 | w.recoil = 2; 171 | w.alternate = true; 172 | w.shootSound = Sounds.shootBig; 173 | w.ejectEffect = Fx.shellEjectMedium; 174 | w.shootEffect = Fx.shootBig; 175 | return w; 176 | })(); 177 | 178 | const lancerLaser2 = (() => { 179 | const tmpColor = new Color(); 180 | const colors = [Pal.lancerLaser.cpy().mul(1, 1, 1, 0.4), Pal.lancerLaser, Color.white]; 181 | const tscales = [1, 0.7, 0.5, 0.2]; 182 | const strokes = [2, 1.5, 1, 0.3]; 183 | const lenscales = [1, 1.1, 1.13, 1.17]; 184 | const length = 160; 185 | 186 | const bt = extend(BasicBulletType, { 187 | init(b) { 188 | if (b) { 189 | Damage.collideLine(b, b.getTeam(), this.hitEffect, b.x, b.y, b.rot(), length); 190 | } 191 | }, 192 | range() { 193 | return length; 194 | }, 195 | draw(b) { 196 | const f = Mathf.curve(b.fin(), 0, 0.2); 197 | const baseLen = length * f; 198 | 199 | Lines.lineAngle(b.x, b.y, b.rot(), baseLen); 200 | for (var s = 0; s < 3; s++) { 201 | Draw.color(colors[s]); 202 | for (var i = 0; i < tscales.length; i++) { 203 | Lines.stroke(7 * b.fout() * (s == 0 ? 1.5 : s == 1 ? 1 : 0.3) * tscales[i]); 204 | Lines.lineAngle(b.x, b.y, b.rot(), baseLen * lenscales[i]); 205 | } 206 | } 207 | Draw.reset(); 208 | }, 209 | }); 210 | 211 | bt.hitEffect = Fx.hitLancer; 212 | bt.despawnEffect = Fx.none; 213 | bt.speed = 0.01; 214 | bt.hitSize = 4; 215 | bt.drawSize = 420; 216 | bt.damage = 70; 217 | bt.lifetime = 16; 218 | bt.pierce = true; 219 | bt.keepVelocity = false; 220 | bt.collidesTiles = false; 221 | 222 | return bt; 223 | })(); 224 | 225 | const lancerLaserWeapon = (() => { 226 | 227 | const w = extend(Weapon, { 228 | load() { 229 | // Add a prefix prevent confliction with other mods 230 | this.name = lib.modName + '-' + 'super-cheat-lancer-weapon'; 231 | this.super$load(); 232 | 233 | // const assetName = lib.modName + '-' + this.name; 234 | // this.region = Core.atlas.find( 235 | // assetName + "-equip", 236 | // Core.atlas.find(assetName + "-equip", Core.atlas.find("clear")) 237 | // ); 238 | // print('load ' + this.name + '-equip : ' + this.region); 239 | }, 240 | }); 241 | 242 | w.name = lib.modName + '-' + 'super-cheat-lancer-weapon'; 243 | w.bullet = lancerLaser2; 244 | w.inaccuracy = 0; 245 | w.shots = 1; 246 | 247 | w.reload = 10; 248 | w.shake = 0.5; 249 | w.recoil = 2; 250 | w.length = 6; // Y length 251 | w.alternate = true; 252 | w.shootSound = Sounds.bigshot; 253 | return w; 254 | })(); 255 | 256 | // 构建多武器集合,目前集合武器不能给 player 用 257 | function makeGroupWeapon(mainWeapon, weapons) { 258 | 259 | // Create virtual shooter for every sub weapons 260 | const w = extend(Weapon, { 261 | load() { 262 | mainWeapon.load(); 263 | this.name = mainWeapon.name; 264 | this.super$load(); 265 | weapons.forEach(v => v.load()); 266 | }, 267 | update(shooter, x, y, angle, left) { 268 | if (angle == null && left == null) { 269 | // update(ShooterTrait shooter, float pointerX, float pointerY) 270 | mainWeapon.update(shooter, x, y); 271 | weapons.forEach(v => v.update(shooter, x, y)); 272 | } else { 273 | // update(ShooterTrait shooter, float mountX, float mountY, float angle, boolean left) 274 | mainWeapon.update(shooter, x, y, angle, left); 275 | weapons.forEach(v => v.update(shooter, x, y, angle, left)); 276 | } 277 | }, 278 | getRecoil(player, left) { 279 | return mainWeapon.getRecoil(player, left); 280 | }, 281 | shoot(p, x, y, angle, left) { 282 | // They shoot by themselvs 283 | // mainWeapon.shoot(p, x, y, angle, left); 284 | }, 285 | }); 286 | 287 | w.name = mainWeapon.name; 288 | w.bullet = mainWeapon.bullet; 289 | w.inaccuracy = mainWeapon.inaccuracy; 290 | w.shots = mainWeapon.shots; 291 | w.reload = mainWeapon.reload; 292 | w.shake = mainWeapon.shake; 293 | w.recoil = mainWeapon.recoil; 294 | w.length = mainWeapon.length; 295 | w.alternate = mainWeapon.alternate; 296 | w.shootSound = mainWeapon.shootSound; 297 | w.spacing = mainWeapon.spacing; 298 | w.shotDelay = mainWeapon.shotDelay; 299 | w.length = mainWeapon.length; 300 | w.width = mainWeapon.width; 301 | 302 | return w; 303 | } 304 | 305 | const superWeapon = makeGroupWeapon(terminatorMainWeapon, []); 306 | 307 | const terminator = (() => { 308 | 309 | // const unit = extend(UnitType, 'terminator-unit', { 310 | // load() { 311 | // this.weapon = superHealBeamShotgunWeapon; 312 | // this.super$load(); 313 | // }, 314 | // }); 315 | const unit = extend(UnitType, 'terminator-unit', { 316 | load() { 317 | this.create(prov(() => new GroundUnit())); 318 | // this.weapon = terminatorMainWeapon; 319 | this.weapon = superWeapon; 320 | this.super$load(); 321 | }, 322 | }); 323 | return unit; 324 | })(); 325 | -------------------------------------------------------------------------------- /scripts/super-cheat/turret-turret.js: -------------------------------------------------------------------------------- 1 | const lib = require('super-cheat/lib'); 2 | 3 | function randomInt(start, end) { 4 | return start + Math.floor(Math.random() * end - start); 5 | } 6 | function bulletTypesOfItemTurret(turret) { 7 | const arr = []; 8 | const values = turret.ammoTypes.values().toSeq().iterator(); 9 | while (values.hasNext()) { 10 | arr.push(values.next()); 11 | } 12 | return () => arr[randomInt(0, arr.length)]; 13 | } 14 | const hitEffects = { 15 | 1: Fx.hitBulletBig, 16 | 2: Fx.flakExplosion, 17 | 3: Fx.blastExplosion, 18 | 4: Fx.massiveExplosion 19 | }; 20 | function defineTurretBullet(turret, takeBullet, options) { 21 | const tr = new Vec2(); 22 | const finalOptions = Object.assign({ 23 | shotChance: 0.025, 24 | speed: 2.8, 25 | lifetime: 240, 26 | damage: 20, 27 | shrinkY: 0, 28 | drag: -0.01, 29 | splashDamageRadius: 16 * turret.size, 30 | splashDamage: turret.health / 15, 31 | ammoMultiplier: 4, 32 | homingPower: 0.08, 33 | homingRange: 100, 34 | homingDelay: 20, 35 | inaccuracy: 5, 36 | trailChance: 0, 37 | status: StatusEffects.blasted, 38 | statusDuration: 60, 39 | spin: 4, 40 | hitEffect: hitEffects[turret.size], 41 | despawnEffect: hitEffects[turret.size], 42 | backColor: Color.valueOf("00000000"), 43 | frontColor: Color.valueOf("beacbe"), 44 | }, options); 45 | const name = turret.name; 46 | 47 | var t = (() => { 48 | return new JavaAdapter(BasicBulletType, { 49 | init(b) { 50 | if (b) { 51 | this.super$init(b); 52 | b.data = { 53 | shotCounter: 0, 54 | bulletLife: 0, 55 | bullet: null, 56 | spinDirection: [1, -1][Math.floor(Math.random() * 2)], 57 | startRotation: Math.floor(Math.random() * 360) 58 | }; 59 | } 60 | }, 61 | draw(b) { 62 | var shrinkY = this.shrinkY; 63 | var shrinkX = this.shrinkX; 64 | var height = this.height * ((1 - shrinkY) + shrinkY * b.fout()); 65 | var width = this.width * ((1 - shrinkX) + shrinkX * b.fout()); 66 | var offset = -90 + (this.spin != 0 ? b.time * this.spin * b.data.spinDirection + b.data.startRotation : 0); 67 | Draw.color(this.frontColor); 68 | Draw.rect(this.frontRegion, b.x, b.y, width, height, b.rotation() + offset); 69 | Draw.reset(); 70 | }, 71 | update(b) { 72 | this.super$update(b); 73 | 74 | var offset = (this.spin != 0 ? b.time * this.spin * b.data.spinDirection + b.data.startRotation : 0); 75 | var angle = b.rotation() + offset; 76 | tr.trns(angle, turret.size * Vars.tilesize / 2); 77 | var x = b.x + tr.x; 78 | var y = b.y + tr.y; 79 | 80 | if (b.data.bulletLife > 0) { 81 | if (b.data.bullet) { 82 | b.data.bulletLife = Math.max(0, b.data.bulletLife - 1); 83 | b.data.bullet.rotation(angle); 84 | b.data.bullet.set(x, y); 85 | b.data.bullet.time = 0; 86 | if (b.data.bulletLife <= 0) { 87 | b.data.bullet = null; 88 | } 89 | } else { 90 | b.data.bulletLife = 0; 91 | } 92 | } 93 | 94 | if (Mathf.chanceDelta(finalOptions.shotChance)) { 95 | turret.shootSound.at(b.x, b.y, Mathf.random(0.9, 1.1)); 96 | var bt = takeBullet(); 97 | 98 | if (turret.shootDuration > 0) { 99 | // for meltdown 100 | if (b.data.bulletLife <= 0) { 101 | b.data.bulletLife = turret.shootDuration / 2; 102 | b.data.bullet = bt.create(b, b.team, x, y, angle, 1, 0.8); 103 | turret.shootEffect.at(x, y, angle); 104 | } 105 | } else if (turret.burstSpacing > 0.0001) { 106 | for (var i = 0; i < turret.shots; i++) { 107 | Time.run(turret.burstSpacing * i, run(() => { 108 | bt.create(b, b.team, x, y, angle + Mathf.range(turret.inaccuracy + bt.inaccuracy), 0.8, 0.8); 109 | turret.shootEffect.at(x, y, angle); 110 | if (bt.shootEffect) { 111 | bt.shootEffect.at(x, y, angle); 112 | } 113 | })); 114 | } 115 | } else { 116 | turret.shootEffect.at(x, y, angle); 117 | if (bt.shootEffect) { 118 | bt.shootEffect.at(x, y, angle); 119 | } 120 | if (turret.alternate) { 121 | var i = (b.data.shotCounter % turret.shots) - (turret.shots - 1) / 2; 122 | bt.create(b, b.team, x, y, angle, 0.8, 0.8); 123 | } else { 124 | for (var i = 0; i < turret.shots; i++) { 125 | bt.create(b, b.team, x, y, angle + (i - (turret.shots / 2)) * turret.spread, 0.8 + Mathf.range(turret.velocityInaccuracy), 0.8); 126 | } 127 | } 128 | b.data.shotCounter++; 129 | } 130 | 131 | } 132 | } 133 | }, finalOptions.speed, finalOptions.damage, name); 134 | })(); 135 | 136 | t.width = turret.size * 8; 137 | t.height = turret.size * 8; 138 | t.speed = finalOptions.speed; 139 | t.lifetime = finalOptions.lifetime; 140 | t.damage = finalOptions.damage; 141 | t.shrinkY = finalOptions.shrinkY; 142 | t.drag = finalOptions.drag; 143 | t.splashDamageRadius = finalOptions.splashDamageRadius; 144 | t.splashDamage = finalOptions.splashDamage; 145 | t.ammoMultiplier = finalOptions.ammoMultiplier; 146 | t.hitEffect = finalOptions.hitEffect; 147 | t.despawnEffect = finalOptions.despawnEffect; 148 | t.homingPower = finalOptions.homingPower; 149 | t.homingRange = finalOptions.homingRange; 150 | t.homingDelay = finalOptions.homingDelay; 151 | t.inaccuracy = finalOptions.inaccuracy; 152 | t.trailChance = finalOptions.trailChance; 153 | t.status = finalOptions.status; 154 | t.statusDuration = finalOptions.statusDuration; 155 | t.shrinkY = finalOptions.shrinkY; 156 | t.spin = finalOptions.spin; 157 | t.backColor = finalOptions.backColor; 158 | t.frontColor = finalOptions.frontColor; 159 | return t; 160 | } 161 | 162 | function defineBlockBullet(type, options, rewrites) { 163 | if (!rewrites) { 164 | rewrites = {}; 165 | } 166 | const finalOptions = Object.assign({ 167 | shotChance: 0.025, 168 | speed: 2.8, 169 | lifetime: 240, 170 | damage: 20, 171 | shrinkY: 0, 172 | drag: -0.01, 173 | splashDamageRadius: 16 * type.size, 174 | splashDamage: type.health / 2, 175 | ammoMultiplier: 4, 176 | homingPower: 0.08, 177 | homingRange: 100, 178 | homingDelay: 20, 179 | inaccuracy: 5, 180 | trailChance: 0, 181 | status: StatusEffects.blasted, 182 | statusDuration: 60, 183 | spin: 4, 184 | hitEffect: hitEffects[type.size], 185 | despawnEffect: hitEffects[type.size], 186 | hitSound: Sounds.none, 187 | backColor: Color.valueOf("00000000"), 188 | frontColor: Color.valueOf("beacbe"), 189 | }, options); 190 | 191 | var t = new JavaAdapter(BasicBulletType, rewrites, finalOptions.speed, finalOptions.damage, type.name); 192 | 193 | t.width = type.size * 8; 194 | t.height = type.size * 8; 195 | t.speed = finalOptions.speed; 196 | t.lifetime = finalOptions.lifetime; 197 | t.damage = finalOptions.damage; 198 | t.shrinkY = finalOptions.shrinkY; 199 | t.drag = finalOptions.drag; 200 | t.splashDamageRadius = finalOptions.splashDamageRadius; 201 | t.splashDamage = finalOptions.splashDamage; 202 | t.ammoMultiplier = finalOptions.ammoMultiplier; 203 | t.hitEffect = finalOptions.hitEffect; 204 | t.despawnEffect = finalOptions.despawnEffect; 205 | t.homingPower = finalOptions.homingPower; 206 | t.homingRange = finalOptions.homingRange; 207 | t.homingDelay = finalOptions.homingDelay; 208 | t.inaccuracy = finalOptions.inaccuracy; 209 | t.trailChance = finalOptions.trailChance; 210 | t.status = finalOptions.status; 211 | t.statusDuration = finalOptions.statusDuration; 212 | t.shrinkY = finalOptions.shrinkY; 213 | t.spin = finalOptions.spin; 214 | t.hitSound = finalOptions.hitSound; 215 | t.backColor = finalOptions.backColor; 216 | t.frontColor = finalOptions.frontColor; 217 | return t; 218 | } 219 | 220 | const tt = extend(Turret, 'turret-turret', { 221 | load() { 222 | this.super$load(); 223 | this.region = lib.loadRegion("turret-turret") 224 | }, 225 | icons() { 226 | return [lib.loadRegion("base-turret-turret"), lib.loadRegion("turret-turret")] 227 | } 228 | }); 229 | tt.size = 4; 230 | 231 | const bulletTypes = (() => { 232 | const all = lib.createProbabilitySelector(); 233 | function d(turret, bullet, options, probability) { 234 | all.add(defineTurretBullet(turret, () => bullet, options), probability); 235 | } 236 | function di(turret, options, probability) { 237 | all.add(defineTurretBullet(turret, bulletTypesOfItemTurret(turret), options), probability); 238 | } 239 | di(Blocks.duo, { shotChance: 0.035 }, 1000); 240 | di(Blocks.scatter, { shotChance: 0.035 }, 1000); 241 | di(Blocks.scorch, { shotChance: 0.06 }, 800); 242 | di(Blocks.hail, { shotChance: 0.035 }, 1000); 243 | di(Blocks.wave, { shotChance: 0.1 }, 700); 244 | d(Blocks.lancer, Blocks.lancer.shootType, { shotChance: 0.03 }, 800); 245 | d(Blocks.arc, Blocks.arc.shootType, { shotChance: 0.04 }, 1000); 246 | di(Blocks.swarmer, { shotChance: 0.035 }, 800); 247 | di(Blocks.salvo, { shotChance: 0.035 }, 800); 248 | di(Blocks.tsunami, { shotChance: 0.1 }, 500); 249 | di(Blocks.fuse, { shotChance: 0.035 }, 700); 250 | di(Blocks.ripple, { shotChance: 0.02 }, 700); 251 | di(Blocks.cyclone, { shotChance: 0.12 }, 700); 252 | di(Blocks.spectre, { shotChance: 0.15 }, 600); 253 | d(Blocks.meltdown, Blocks.meltdown.shootType, { shotChance: 0.03 }, 400); 254 | // tu 255 | (() => { 256 | const tr = new Vec2(); 257 | all.add(defineBlockBullet(Blocks.thoriumReactor, {}, { 258 | hit(b, x, y) { 259 | if (!x) { x = b.x; } 260 | if (!y) { y = b.y; } 261 | this.super$hit(b, x, y); 262 | Sounds.explosionbig.at(b); 263 | Effect.shake(6, 16, x, y); 264 | Fx.nuclearShockwave.at(x, y); 265 | for (var i = 0; i < 6; i++) { 266 | Time.run(Mathf.random(40), run(() => Fx.nuclearcloud.at(x, y))); 267 | } 268 | Damage.damage(x, y, 269 | Blocks.thoriumReactor.explosionRadius * Vars.tilesize, 270 | Blocks.thoriumReactor.explosionDamage * 4); 271 | 272 | for (var i = 0; i < 20; i++) { 273 | Time.run(Mathf.random(50), run(() => { 274 | tr.rnd(Mathf.random(40)); 275 | Fx.explosion.at(tr.x + x, tr.y + y); 276 | })); 277 | } 278 | for(var i = 0; i < 70; i++){ 279 | Time.run(Mathf.random(80), run(() => { 280 | tr.rnd(Mathf.random(120)); 281 | Fx.nuclearsmoke.at(tr.x + x, tr.y + y); 282 | })); 283 | } 284 | } 285 | }), 40); 286 | })(); 287 | // Impact 288 | (() => { 289 | const tr = new Vec2(); 290 | all.add(defineBlockBullet(Blocks.impactReactor, { 291 | backColor: Color.valueOf("4e3c4e") 292 | }, { 293 | hit(b, x, y) { 294 | if (!x) { x = b.x; } 295 | if (!y) { y = b.y; } 296 | this.super$hit(b, x, y); 297 | Sounds.explosionbig.at(b); 298 | Effect.shake(6, 16, x, y); 299 | Fx.impactShockwave.at(x, y); 300 | for (var i = 0; i < 6; i++) { 301 | Time.run(Mathf.random(80), run(() => Fx.impactcloud.at(x, y))); 302 | } 303 | Damage.damage(x, y, 304 | Blocks.impactReactor.explosionRadius * Vars.tilesize, 305 | Blocks.impactReactor.explosionDamage * 4); 306 | 307 | for (var i = 0; i < 20; i++) { 308 | Time.run(Mathf.random(80), run(() => { 309 | tr.rnd(Mathf.random(40)); 310 | Fx.explosion.at(tr.x + x, tr.y + y); 311 | })); 312 | } 313 | for(var i = 0; i < 70; i++){ 314 | Time.run(Mathf.random(90), run(() => { 315 | tr.rnd(Mathf.random(120)); 316 | Fx.impactsmoke.at(tr.x + x, tr.y + y); 317 | })); 318 | } 319 | } 320 | }), 25); 321 | })(); 322 | // Self 323 | all.add(defineTurretBullet(tt, () => bulletTypes.random(), { shotChance: 0.08 }), 50); 324 | 325 | return { 326 | random() { return all.random(); } 327 | }; 328 | })(); 329 | 330 | lib.setBuildingSimple(tt, Turret.TurretBuild, { 331 | hasAmmo() { return true; }, 332 | peekAmmo() { return bulletTypes.random(); }, 333 | useAmmo() { return bulletTypes.random(); }, 334 | }); 335 | -------------------------------------------------------------------------------- /scripts/super-cheat/unit-factory.js: -------------------------------------------------------------------------------- 1 | 2 | const lib = require('super-cheat/lib'); 3 | 4 | var teamRegion; 5 | const block = extend(UnitFactory, 'unit-factory', { 6 | init() { 7 | this.plans = Vars.content.getBy(ContentType.unit) 8 | .map(func(unitType => new UnitFactory.UnitPlan(unitType, 1, ItemStack.with(Items.graphite, 1)))) 9 | .select(boolf(plan => !plan.unit.isHidden())) 10 | this.super$init(); 11 | this.itemCapacity = 1; 12 | this.capacities[Items.graphite.id] = 1; 13 | }, 14 | load() { 15 | this.super$load(); 16 | teamRegion = lib.loadRegion('unit-factory-team'); 17 | }, 18 | }); 19 | block.buildVisibility = BuildVisibility.shown; 20 | block.size = 3; 21 | block.hasPower = false; 22 | block.targetable = false; 23 | block.health = 65535; 24 | block.itemCapacity = 1; 25 | block.payloadSpeed = 3; 26 | block.category = Category.units; 27 | 28 | block.config(java.lang.Integer, lib.cons2((tile, i) => { 29 | tile.currentPlan = i < 0 || i >= block.plans.size ? -1 : i; 30 | tile.progress = 0; 31 | tile.payload = null; 32 | })); 33 | 34 | block.config(UnitType, lib.cons2((tile, val) => { 35 | tile.currentPlan = block.plans.indexOf(boolf(p => p.unit == val)); 36 | tile.progress = 0; 37 | tile.payload = null; 38 | })); 39 | block.config(IntSeq, lib.cons2((tile, val) => { 40 | const i = val.get(0); 41 | tile.currentPlan = i < 0 || i >= block.plans.size ? -1 : i; 42 | tile.progress = 0; 43 | tile.setTargetTeam(Team.get(val.get(1))); 44 | tile.payload = null; 45 | })); 46 | const allTeams = [ 47 | Team.derelict, Team.sharded, Team.crux, 48 | Team.green, Team.blue, Team.malis, 49 | ]; 50 | lib.setBuilding(block, (block) => { 51 | 52 | var targetTeam = Team.sharded; 53 | return new JavaAdapter(UnitFactory.UnitFactoryBuild, { 54 | setTargetTeam(team) { 55 | targetTeam = team; 56 | }, 57 | init(tile, team, c, d) { 58 | this.super$init(tile, team, c, d); 59 | targetTeam = team; 60 | return this; 61 | }, 62 | buildConfiguration(table) { 63 | const tmp = new ImageButton(); 64 | const g = new ButtonGroup(tmp); 65 | g.remove(tmp); 66 | const cont = new Table(); 67 | cont.defaults().size(40); 68 | var i = 0; 69 | allTeams.forEach(team => { 70 | (team => { 71 | var button = cont.button(Tex.whiteui, Styles.clearTogglei, 24, run(() => { 72 | })).group(g).get(); 73 | button.changed(run(() => targetTeam = (button.isChecked() ? team : null))); 74 | button.getStyle().imageUp = Tex.whiteui.tint(team.color.r, team.color.g, team.color.b, team.color.a); 75 | button.update(run(() => button.setChecked(targetTeam == team))); 76 | 77 | if (i++ % 4 == 3) { 78 | cont.row(); 79 | } 80 | })(team); 81 | }); 82 | if (i % 4 != 0) { 83 | var remaining = 4 - (i % 4); 84 | for (var j = 0; j < remaining; j++) { 85 | cont.image(Styles.black6); 86 | } 87 | } 88 | var pane = new ScrollPane(cont, Styles.smallPane); 89 | pane.setScrollingDisabled(true, false); 90 | pane.setOverscroll(false, false); 91 | table.add(pane).maxHeight(Scl.scl(40 * 2)).left(); 92 | table.row(); 93 | this.super$buildConfiguration(table); 94 | }, 95 | draw() { 96 | this.super$draw(); 97 | Draw.color(targetTeam.color); 98 | Draw.rect(lib.loadRegion('unit-factory-team'), this.x, this.y); 99 | }, 100 | dumpPayload() { 101 | this.payload.unit.team = targetTeam; 102 | this.super$dumpPayload(); 103 | }, 104 | config() { 105 | return IntSeq.with(this.currentPlan, targetTeam.id); 106 | }, 107 | write(write) { 108 | this.super$write(write); 109 | write.b(targetTeam.id); 110 | }, 111 | read(read, revision) { 112 | this.super$read(read, revision); 113 | targetTeam = Team.get(read.b()); 114 | }, 115 | }, block); 116 | }); 117 | -------------------------------------------------------------------------------- /sounds/b.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sounds/b.ogg -------------------------------------------------------------------------------- /sounds/healLaser.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sounds/healLaser.ogg -------------------------------------------------------------------------------- /sounds/s.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sounds/s.ogg -------------------------------------------------------------------------------- /sounds/swings.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sounds/swings.ogg -------------------------------------------------------------------------------- /sprites/blocks/cheat/cheat-item.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/cheat/cheat-item.png -------------------------------------------------------------------------------- /sprites/blocks/cheat/cheat-liquid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/cheat/cheat-liquid.png -------------------------------------------------------------------------------- /sprites/blocks/cheat/cheat-power.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/cheat/cheat-power.png -------------------------------------------------------------------------------- /sprites/blocks/cheat/next-wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/cheat/next-wave.png -------------------------------------------------------------------------------- /sprites/blocks/cheat/quantum-launchpad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/cheat/quantum-launchpad.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-0-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-0-0.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-0-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-0-1.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-0-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-0-2.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-0-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-0-3.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-1-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-1-0.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-1-1.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-1-2.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-1-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-1-3.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-2-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-2-0.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-2-1.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-2-2.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-2-3.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-3-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-3-0.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-3-1.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-3-2.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-3-3.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-4-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-4-0.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-4-1.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-4-2.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor-4-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor-4-3.png -------------------------------------------------------------------------------- /sprites/blocks/conveyors/electrum-conveyor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/conveyors/electrum-conveyor.png -------------------------------------------------------------------------------- /sprites/blocks/distribution/chrono-pusher-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/distribution/chrono-pusher-bottom.png -------------------------------------------------------------------------------- /sprites/blocks/distribution/chrono-pusher-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/distribution/chrono-pusher-full.png -------------------------------------------------------------------------------- /sprites/blocks/distribution/chrono-pusher-rotator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/distribution/chrono-pusher-rotator.png -------------------------------------------------------------------------------- /sprites/blocks/distribution/chrono-pusher-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/distribution/chrono-pusher-top.png -------------------------------------------------------------------------------- /sprites/blocks/distribution/chrono-pusher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/distribution/chrono-pusher.png -------------------------------------------------------------------------------- /sprites/blocks/distribution/chrono-pusher.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/distribution/chrono-pusher.xcf -------------------------------------------------------------------------------- /sprites/blocks/distribution/chrono-unloader-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/distribution/chrono-unloader-bottom.png -------------------------------------------------------------------------------- /sprites/blocks/distribution/chrono-unloader-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/distribution/chrono-unloader-full.png -------------------------------------------------------------------------------- /sprites/blocks/distribution/chrono-unloader-rotator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/distribution/chrono-unloader-rotator.png -------------------------------------------------------------------------------- /sprites/blocks/distribution/chrono-unloader-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/distribution/chrono-unloader-top.png -------------------------------------------------------------------------------- /sprites/blocks/distribution/chrono-unloader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/distribution/chrono-unloader.png -------------------------------------------------------------------------------- /sprites/blocks/distribution/chrono-unloader.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/distribution/chrono-unloader.xcf -------------------------------------------------------------------------------- /sprites/blocks/effects/adjustable-overdrive-projector-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/adjustable-overdrive-projector-top.png -------------------------------------------------------------------------------- /sprites/blocks/effects/adjustable-overdrive-projector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/adjustable-overdrive-projector.png -------------------------------------------------------------------------------- /sprites/blocks/effects/chrono-vault.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/chrono-vault.png -------------------------------------------------------------------------------- /sprites/blocks/effects/global-radar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/global-radar.png -------------------------------------------------------------------------------- /sprites/blocks/effects/invincible-core.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/invincible-core.png -------------------------------------------------------------------------------- /sprites/blocks/effects/slow-overdrive-projector-01-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/slow-overdrive-projector-01-top.png -------------------------------------------------------------------------------- /sprites/blocks/effects/slow-overdrive-projector-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/slow-overdrive-projector-01.png -------------------------------------------------------------------------------- /sprites/blocks/effects/slow-overdrive-projector-05-top .png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/slow-overdrive-projector-05-top .png -------------------------------------------------------------------------------- /sprites/blocks/effects/slow-overdrive-projector-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/slow-overdrive-projector-05.png -------------------------------------------------------------------------------- /sprites/blocks/effects/team-changer-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/team-changer-full.png -------------------------------------------------------------------------------- /sprites/blocks/effects/team-changer-team.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/team-changer-team.png -------------------------------------------------------------------------------- /sprites/blocks/effects/team-changer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/team-changer.png -------------------------------------------------------------------------------- /sprites/blocks/effects/team-changer.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/team-changer.xcf -------------------------------------------------------------------------------- /sprites/blocks/effects/ultra-overdrive-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/ultra-overdrive-top.png -------------------------------------------------------------------------------- /sprites/blocks/effects/ultra-overdrive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/effects/ultra-overdrive.png -------------------------------------------------------------------------------- /sprites/blocks/mechpad/invincible-ship-pad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/mechpad/invincible-ship-pad.png -------------------------------------------------------------------------------- /sprites/blocks/power/super-battery-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/power/super-battery-top.png -------------------------------------------------------------------------------- /sprites/blocks/power/super-battery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/power/super-battery.png -------------------------------------------------------------------------------- /sprites/blocks/production/static-drill-item.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/production/static-drill-item.png -------------------------------------------------------------------------------- /sprites/blocks/production/static-drill-rotator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/production/static-drill-rotator.png -------------------------------------------------------------------------------- /sprites/blocks/production/static-drill-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/production/static-drill-top.png -------------------------------------------------------------------------------- /sprites/blocks/production/static-drill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/production/static-drill.png -------------------------------------------------------------------------------- /sprites/blocks/shields/enemys-cannot-move-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/shields/enemys-cannot-move-top.png -------------------------------------------------------------------------------- /sprites/blocks/shields/enemys-cannot-move.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/shields/enemys-cannot-move.png -------------------------------------------------------------------------------- /sprites/blocks/shields/enemys-control-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/shields/enemys-control-top.png -------------------------------------------------------------------------------- /sprites/blocks/shields/enemys-control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/shields/enemys-control.png -------------------------------------------------------------------------------- /sprites/blocks/shields/enemys-no-damage-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/shields/enemys-no-damage-top.png -------------------------------------------------------------------------------- /sprites/blocks/shields/enemys-no-damage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/shields/enemys-no-damage.png -------------------------------------------------------------------------------- /sprites/blocks/shields/enemys-remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/shields/enemys-remove.png -------------------------------------------------------------------------------- /sprites/blocks/shields/invincible-force-projector-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/shields/invincible-force-projector-top.png -------------------------------------------------------------------------------- /sprites/blocks/shields/invincible-force-projector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/shields/invincible-force-projector.png -------------------------------------------------------------------------------- /sprites/blocks/turrets/base-turret-turret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/turrets/base-turret-turret.png -------------------------------------------------------------------------------- /sprites/blocks/turrets/must-die-turret-base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/turrets/must-die-turret-base.png -------------------------------------------------------------------------------- /sprites/blocks/turrets/must-die-turret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/turrets/must-die-turret.png -------------------------------------------------------------------------------- /sprites/blocks/turrets/one-shot-turret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/turrets/one-shot-turret.png -------------------------------------------------------------------------------- /sprites/blocks/turrets/point-turret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/turrets/point-turret.png -------------------------------------------------------------------------------- /sprites/blocks/turrets/turret-turret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/turrets/turret-turret.png -------------------------------------------------------------------------------- /sprites/blocks/turrets/turret-turret.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/turrets/turret-turret.xcf -------------------------------------------------------------------------------- /sprites/blocks/unit/dps-tester-land-factory-team.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/unit/dps-tester-land-factory-team.png -------------------------------------------------------------------------------- /sprites/blocks/unit/dps-tester-land-factory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/unit/dps-tester-land-factory.png -------------------------------------------------------------------------------- /sprites/blocks/unit/unit-factory-team.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/unit/unit-factory-team.png -------------------------------------------------------------------------------- /sprites/blocks/unit/unit-factory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/unit/unit-factory.png -------------------------------------------------------------------------------- /sprites/blocks/unit/unit-factory.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/unit/unit-factory.xcf -------------------------------------------------------------------------------- /sprites/blocks/walls/dps-wall-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/walls/dps-wall-1.png -------------------------------------------------------------------------------- /sprites/blocks/walls/dps-wall-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/walls/dps-wall-2.png -------------------------------------------------------------------------------- /sprites/blocks/walls/dps-wall-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/walls/dps-wall-3.png -------------------------------------------------------------------------------- /sprites/blocks/walls/dps-wall-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/walls/dps-wall-4.png -------------------------------------------------------------------------------- /sprites/blocks/walls/dps-wall-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/walls/dps-wall-5.png -------------------------------------------------------------------------------- /sprites/blocks/walls/dps-wall-display.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/walls/dps-wall-display.png -------------------------------------------------------------------------------- /sprites/blocks/walls/invincible-wall-large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/walls/invincible-wall-large.png -------------------------------------------------------------------------------- /sprites/blocks/walls/invincible-wall-medium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/walls/invincible-wall-medium.png -------------------------------------------------------------------------------- /sprites/blocks/walls/invincible-wall-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/blocks/walls/invincible-wall-small.png -------------------------------------------------------------------------------- /sprites/icons/down1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/icons/down1.png -------------------------------------------------------------------------------- /sprites/icons/down2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/icons/down2.png -------------------------------------------------------------------------------- /sprites/icons/down3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/icons/down3.png -------------------------------------------------------------------------------- /sprites/icons/down4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/icons/down4.png -------------------------------------------------------------------------------- /sprites/icons/up1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/icons/up1.png -------------------------------------------------------------------------------- /sprites/icons/up2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/icons/up2.png -------------------------------------------------------------------------------- /sprites/icons/up3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/icons/up3.png -------------------------------------------------------------------------------- /sprites/icons/up4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/icons/up4.png -------------------------------------------------------------------------------- /sprites/units/dps-tester-land-base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/units/dps-tester-land-base.png -------------------------------------------------------------------------------- /sprites/units/dps-tester-land-cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/units/dps-tester-land-cell.png -------------------------------------------------------------------------------- /sprites/units/dps-tester-land-leg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/units/dps-tester-land-leg.png -------------------------------------------------------------------------------- /sprites/units/dps-tester-land-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/units/dps-tester-land-outline.png -------------------------------------------------------------------------------- /sprites/units/dps-tester-land.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/units/dps-tester-land.png -------------------------------------------------------------------------------- /sprites/units/invincible-ship-weapon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/units/invincible-ship-weapon.png -------------------------------------------------------------------------------- /sprites/units/invincible-ship.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abomb4/super-cheat/6175e8f7c29d9682623274ce318649ffd9d4bea6/sprites/units/invincible-ship.png --------------------------------------------------------------------------------