diff --git a/src/main/java/tanks/Game.java b/src/main/java/tanks/Game.java index 87091531..f5fd6c1d 100644 --- a/src/main/java/tanks/Game.java +++ b/src/main/java/tanks/Game.java @@ -495,7 +495,7 @@ public static void initScript() registerObstacle(ObstacleMud.class, "mud"); registerObstacle(ObstacleIce.class, "ice"); registerObstacle(ObstacleSnow.class, "snow"); - registerObstacle(ObstacleLava.class, "lava"); +// registerObstacle(ObstacleLava.class, "lava"); registerObstacle(ObstacleBoostPanel.class, "boostpanel"); registerObstacle(ObstacleTeleporter.class, "teleporter"); registerObstacle(ObstacleBeatBlock.class, "beat"); diff --git a/src/main/java/tanks/gui/screen/ScreenChangelog.java b/src/main/java/tanks/gui/screen/ScreenChangelog.java index c5549a6d..0c9b34c6 100644 --- a/src/main/java/tanks/gui/screen/ScreenChangelog.java +++ b/src/main/java/tanks/gui/screen/ScreenChangelog.java @@ -480,6 +480,20 @@ public static void setupLogs() } ); + new Changelog("v1.6.a", new String[] + { + "*What's new in Tanks v1.6.a:\n\n" + + "Added an enormous number of new bullet options\n" + + "Improved item editor\n" + + "Improved the tank editor for spawned and transformed tanks\n" + + "Level editor menu UI improvements\n" + + "Added beat blocks\n" + + "Made fireworks prettier and more performant\n" + + "Updated music\n" + + "Added third color for players\n" + + "Bug fixes and other minor improvements\n" + } + ); } } } \ No newline at end of file diff --git a/src/main/java/tanks/gui/screen/ScreenDebug.java b/src/main/java/tanks/gui/screen/ScreenDebug.java index 9274b966..7c5b4788 100644 --- a/src/main/java/tanks/gui/screen/ScreenDebug.java +++ b/src/main/java/tanks/gui/screen/ScreenDebug.java @@ -3,6 +3,7 @@ import tanks.Drawing; import tanks.Game; import tanks.gui.Button; +import tanks.tank.TankPlayer; public class ScreenDebug extends Screen { @@ -12,6 +13,7 @@ public class ScreenDebug extends Screen public String tankIDsText = "Show tank IDs: "; public String invulnerableText = "Invulnerable: "; public String fancyLightsText = "Fancy lighting: "; + public String destroyCheatText = "Destroy cheat: "; public ScreenDebug() { @@ -47,25 +49,24 @@ public ScreenDebug() fancyLighting.setText(fancyLightsText, ScreenOptions.onText); else fancyLighting.setText(fancyLightsText, ScreenOptions.offText); + + if (TankPlayer.enableDestroyCheat) + destroyCheat.setText(destroyCheatText, ScreenOptions.onText); + else + destroyCheat.setText(destroyCheatText, ScreenOptions.offText); } - Button back = new Button(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2 + 210, this.objWidth, this.objHeight, "Back", () -> Game.screen = new ScreenTitle() - ); + Button back = new Button(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2 + 210, this.objWidth, this.objHeight, "Back", () -> Game.screen = new ScreenTitle()); - Button keyboardTest = new Button(Drawing.drawing.interfaceSizeX / 2 - this.objXSpace / 2, Drawing.drawing.interfaceSizeY / 2 - this.objYSpace * 2, this.objWidth, this.objHeight, "Test keyboard", () -> Game.screen = new ScreenTestKeyboard() - ); + Button keyboardTest = new Button(Drawing.drawing.interfaceSizeX / 2 - this.objXSpace / 2, Drawing.drawing.interfaceSizeY / 2 - this.objYSpace * 2.5, this.objWidth, this.objHeight, "Test keyboard", () -> Game.screen = new ScreenTestKeyboard()); - Button textboxTest = new Button(Drawing.drawing.interfaceSizeX / 2 - this.objXSpace / 2, Drawing.drawing.interfaceSizeY / 2 - this.objYSpace * 1, this.objWidth, this.objHeight, "Test text boxes", () -> Game.screen = new ScreenTestTextbox() - ); + Button textboxTest = new Button(Drawing.drawing.interfaceSizeX / 2 - this.objXSpace / 2, Drawing.drawing.interfaceSizeY / 2 - this.objYSpace * 1.5, this.objWidth, this.objHeight, "Test text boxes", () -> Game.screen = new ScreenTestTextbox()); - Button modelTest = new Button(Drawing.drawing.interfaceSizeX / 2 - this.objXSpace / 2, Drawing.drawing.interfaceSizeY / 2 + this.objYSpace * 0, this.objWidth, this.objHeight, "Test models", () -> Game.screen = new ScreenTestModel(Drawing.drawing.createModel("/models/tankcamoflauge/base/")) - ); + Button modelTest = new Button(Drawing.drawing.interfaceSizeX / 2 - this.objXSpace / 2, Drawing.drawing.interfaceSizeY / 2 - this.objYSpace * 0.5, this.objWidth, this.objHeight, "Test models", () -> Game.screen = new ScreenTestModel(Drawing.drawing.createModel("/models/tankcamoflauge/base/"))); - Button fontTest = new Button(Drawing.drawing.interfaceSizeX / 2 - this.objXSpace / 2, Drawing.drawing.interfaceSizeY / 2 + this.objYSpace * 1, this.objWidth, this.objHeight, "Test fonts", () -> Game.screen = new ScreenTestFonts() - ); + Button fontTest = new Button(Drawing.drawing.interfaceSizeX / 2 - this.objXSpace / 2, Drawing.drawing.interfaceSizeY / 2 + this.objYSpace * 0.5, this.objWidth, this.objHeight, "Test fonts", () -> Game.screen = new ScreenTestFonts()); - Button fireworks = new Button(Drawing.drawing.interfaceSizeX / 2 - this.objXSpace / 2, Drawing.drawing.interfaceSizeY / 2 + this.objYSpace * 2, this.objWidth, this.objHeight, "Test fireworks", () -> Game.screen = new ScreenTestFireworks() - ); + Button fireworks = new Button(Drawing.drawing.interfaceSizeX / 2 - this.objXSpace / 2, Drawing.drawing.interfaceSizeY / 2 + this.objYSpace * 1.5, this.objWidth, this.objHeight, "Test fireworks", () -> Game.screen = new ScreenTestFireworks()); Button traceAllRays = new Button(Drawing.drawing.interfaceSizeX / 2 + this.objXSpace / 2, Drawing.drawing.interfaceSizeY / 2 + this.objYSpace * -2.5, this.objWidth, this.objHeight, "", new Runnable() { @@ -151,6 +152,20 @@ public void run() } }); + Button destroyCheat = new Button(Drawing.drawing.interfaceSizeX / 2 - this.objXSpace / 2, Drawing.drawing.interfaceSizeY / 2 + this.objYSpace * 2.5, this.objWidth, this.objHeight, "", new Runnable() + { + @Override + public void run() + { + TankPlayer.enableDestroyCheat = !TankPlayer.enableDestroyCheat; + + if (TankPlayer.enableDestroyCheat) + destroyCheat.setText(destroyCheatText, ScreenOptions.onText); + else + destroyCheat.setText(destroyCheatText, ScreenOptions.offText); + } + }); + @Override @@ -167,6 +182,7 @@ public void update() tankIDs.update(); fancyLighting.update(); fireworks.update(); + destroyCheat.update(); back.update(); } @@ -189,6 +205,7 @@ public void draw() fontTest.draw(); fancyLighting.draw(); fireworks.draw(); + destroyCheat.draw(); back.draw(); } } diff --git a/src/main/java/tanks/gui/screen/ScreenItemEditor.java b/src/main/java/tanks/gui/screen/ScreenItemEditor.java deleted file mode 100644 index 3848c6bf..00000000 --- a/src/main/java/tanks/gui/screen/ScreenItemEditor.java +++ /dev/null @@ -1,400 +0,0 @@ -package tanks.gui.screen; - -public class ScreenItemEditor extends Screen implements IConditionalOverlayScreen -{ - @Override - public boolean isOverlayEnabled() - { - return false; - } - - @Override - public void update() - { - - } - - @Override - public void draw() - { - - } - -// public Item item; -// public IItemScreen screen; -// -// public int rows = 4; -// public int yoffset = -150; -// -// public int page = 0; -// -// public boolean drawBehindScreen = false; -// public String message = null; -// -// public ArrayList properties = new ArrayList<>(); -// -// public Button next = new Button(Drawing.drawing.interfaceSizeX / 2 + 190, Drawing.drawing.interfaceSizeY / 2 + 240, this.objWidth, this.objHeight, "Next page", () -> page++); -// -// public Button previous = new Button(Drawing.drawing.interfaceSizeX / 2 - 190, Drawing.drawing.interfaceSizeY / 2 + 240, this.objWidth, this.objHeight, "Previous page", () -> page--); -// -// public Button back = new Button(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2 + 300, this.objWidth, this.objHeight, "Ok", new Runnable() -// { -// @Override -// public void run() -// { -// item.exportProperties(); -// screen.refreshItems(); -// Game.screen = (Screen) screen; -// } -// } -// ); -// -// public Button dismissMessage = new Button(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2 + Drawing.drawing.objHeight, Drawing.drawing.objWidth, Drawing.drawing.objHeight, "Ok", () -> message = null); -// -// public Button delete = new Button(Drawing.drawing.interfaceSizeX / 2 - 190, Drawing.drawing.interfaceSizeY / 2 - 250, this.objWidth, this.objHeight, "Delete item", new Runnable() -// { -// @Override -// public void run() -// { -// Game.screen = (Screen) screen; -// screen.removeItem(item); -// } -// } -// ); -// -// public Button save = new Button(Drawing.drawing.interfaceSizeX / 2 + 190, Drawing.drawing.interfaceSizeY / 2 - 250, this.objWidth, this.objHeight, "Save to template", new Runnable() -// { -// @Override -// public void run() -// { -// item.exportProperties(); -// BaseFile f = Game.game.fileManager.getFile(Game.homedir + Game.itemDir + "/" + item.name.replace(" ", "_") + ".tanks"); -// -// if (!f.exists()) -// { -// try -// { -// f.create(); -// f.startWriting(); -// f.println(item.toString()); -// f.stopWriting(); -// -// message = "Item added to templates!"; -// } -// catch (IOException e) -// { -// Game.exitToCrash(e); -// } -// } -// else -// message = "An item template with this name already exists!"; -// } -// } -// ); -// -// public ScreenItemEditor(Item item, IItemScreen s) -// { -// this(item, s, false, false); -// } -// -// public ScreenItemEditor(Item item, IItemScreen s, boolean omitPrice, boolean omitUnlockLevel) -// { -// super(350, 40, 380, 60); -// -// this.allowClose = false; -// -// this.next.image = "icons/forward.png"; -// this.next.imageSizeX = 25; -// this.next.imageSizeY = 25; -// this.next.imageXOffset = 145; -// -// this.previous.image = "icons/back.png"; -// this.previous.imageSizeX = 25; -// this.previous.imageSizeY = 25; -// this.previous.imageXOffset = -145; -// -// this.item = item; -// this.screen = s; -// -// this.music = ((Screen)s).music; -// this.musicID = ((Screen)s).musicID; -// -// for (UIProperty p: this.item.properties.values()) -// { -// String name = Game.formatString(p.name); -// -// if (p.name.equals("price") && omitPrice) -// continue; -// -// if (p.name.equals("unlocks-after-level") && omitUnlockLevel) -// continue; -// -// if (p instanceof UIPropertyInt) -// { -// TextBox t = new TextBox(0, 0, this.objWidth, this.objHeight, name, () -> {}, p.value + ""); -// t.function = () -> -// { -// if (t.inputText.length() == 0) -// t.inputText = p.value + ""; -// else -// p.value = Integer.parseInt(t.inputText); -// }; -// -// t.maxChars = 9; -// t.allowLetters = false; -// t.allowSpaces = false; -// t.allowNegatives = true; -// -// properties.add(t); -// } -// else if (p instanceof UIPropertyDouble) -// { -// TextBox t = new TextBox(0, 0, this.objWidth, this.objHeight, name, () -> {}, p.value + ""); -// t.function = () -> -// { -// try -// { -// if (t.inputText.length() == 0) -// t.inputText = p.value + ""; -// else -// p.value = Double.parseDouble(t.inputText); -// } -// catch (Exception e) -// { -// p.value = 0.0; -// t.inputText = "0.0"; -// } -// }; -// -// t.allowDoubles = true; -// t.allowLetters = false; -// t.allowSpaces = false; -// t.allowNegatives = true; -// -// properties.add(t); -// } -// else if (p instanceof UIPropertyString) -// { -// TextBox t = new TextBox(0, 0, this.objWidth, this.objHeight, name, () -> {}, p.value + ""); -// t.function = () -> -// { -// if (t.inputText.length() == 0) -// t.inputText = (String) p.value; -// else -// p.value = t.inputText; -// }; -// -// t.enableCaps = true; -// t.allowSpaces = true; -// -// properties.add(t); -// } -// else if (p instanceof UIPropertyBoolean) -// { -// Selector t = new Selector(0, 0, this.objWidth, this.objHeight, name, new String[]{"Yes", "No"}, () -> {}); -// -// if ((boolean) p.value) -// t.selectedOption = 0; -// else -// t.selectedOption = 1; -// -// t.function = () -> p.value = t.selectedOption == 0; -// -// t.drawBehindScreen = this.drawBehindScreen; -// -// properties.add(t); -// } -// else if (p instanceof UIPropertySelector) -// { -// Selector t = new Selector(0, 0, this.objWidth, this.objHeight, name, ((UIPropertySelector) p).values, () -> {}); -// t.selectedOption = (int) p.value; -// t.images = ((UIPropertySelector) p).images; -// -// t.function = () -> p.value = t.selectedOption; -// -// t.drawBehindScreen = this.drawBehindScreen; -// -// properties.add(t); -// } -// else if (p instanceof UIPropertyImageSelector) -// { -// SelectorImage t = new SelectorImage(0, 0, this.objWidth, this.objHeight, name, ((UIPropertyImageSelector) p).values, () -> {}); -// t.drawImages = true; -// t.selectedOption = (int) p.value; -// -// t.function = () -> p.value = t.selectedOption; -// -// t.drawBehindScreen = this.drawBehindScreen; -// -// properties.add(t); -// } -// } -// -// for (int i = 0; i < properties.size(); i++) -// { -// int page = i / (rows * 3); -// int offset = 0; -// -// if (page * rows * 3 + rows < properties.size()) -// offset = -190; -// -// if (page * rows * 3 + rows * 2 < properties.size()) -// offset = -380; -// -// double posY = Drawing.drawing.interfaceSizeY / 2 + yoffset + (i % rows) * 90; -// -// if (i / rows % 3 == 0) -// properties.get(i).setPosition(Drawing.drawing.interfaceSizeX / 2 + offset, posY); -// else if (i / rows % 3 == 1) -// properties.get(i).setPosition(Drawing.drawing.interfaceSizeX / 2 + offset + 380, posY); -// else -// properties.get(i).setPosition(Drawing.drawing.interfaceSizeX / 2 + offset + 380 * 2, posY); -// } -// } -// -// @Override -// public void update() -// { -// if (this.message != null) -// this.dismissMessage.update(); -// else -// { -// for (int i = page * rows * 3; i < Math.min(page * rows * 3 + rows * 3, properties.size()); i++) -// { -// if (properties.get(i) instanceof Selector) -// ((Selector) properties.get(i)).drawBehindScreen = this.drawBehindScreen; -// -// properties.get(i).update(); -// } -// -// back.update(); -// delete.update(); -// save.update(); -// -// previous.enabled = page > 0; -// next.enabled = (properties.size() > (1 + page) * rows * 3); -// -// if (rows * 3 < properties.size()) -// { -// previous.update(); -// next.update(); -// } -// -// if (Game.game.input.editorPause.isValid()) -// { -// back.function.run(); -// Game.game.input.editorPause.invalidate(); -// } -// } -// } -// -// @Override -// public void draw() -// { -// if (this.drawBehindScreen) -// { -// this.enableMargins = ((Screen) this.screen).enableMargins; -// ((Screen) this.screen).draw(); -// } -// else -// { -// Drawing.drawing.setLighting(Level.currentLightIntensity, Math.max(Level.currentLightIntensity * 0.75, Level.currentShadowIntensity)); -// this.drawDefaultBackground(); -// } -// -// if (Game.screen instanceof ScreenSelector) -// return; -// -// if (this.message != null) -// { -// this.dismissMessage.draw(); -// -// if (Level.isDark()) -// Drawing.drawing.setColor(255, 255, 255); -// else -// Drawing.drawing.setColor(0, 0, 0); -// -// Drawing.drawing.setInterfaceFontSize(Drawing.drawing.textSize); -// Drawing.drawing.displayInterfaceText(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2 - 60, this.message); -// } -// else -// { -// back.draw(); -// delete.draw(); -// save.draw(); -// -// previous.enabled = page > 0; -// next.enabled = (properties.size() > (1 + page) * rows * 3); -// -// if (rows * 3 < properties.size()) -// { -// previous.draw(); -// next.draw(); -// -// if (Level.isDark()) -// Drawing.drawing.setColor(255, 255, 255); -// else -// Drawing.drawing.setColor(0, 0, 0); -// -// Drawing.drawing.setInterfaceFontSize(this.textSize); -// Drawing.drawing.displayInterfaceText(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2 + 200, -// "Page %d of %d", (page + 1), (properties.size() / (rows * 3) + Math.min(1, properties.size() % (rows * 3)))); -// } -// -// for (int i = Math.min(page * rows * 3 + rows * 3, properties.size()) - 1; i >= page * rows * 3; i--) -// { -// properties.get(i).draw(); -// } -// -// if (Level.isDark()) -// Drawing.drawing.setColor(255, 255, 255); -// else -// Drawing.drawing.setColor(0, 0, 0); -// -// Drawing.drawing.setInterfaceFontSize(this.titleSize); -// Drawing.drawing.displayInterfaceText(Drawing.drawing.interfaceSizeX / 2, Drawing.drawing.interfaceSizeY / 2 - 300, "%s item properties", Translation.translate(item.getTypeName())); -// } -// } -// -// @Override -// public double getOffsetX() -// { -// if (drawBehindScreen) -// return ((Screen)screen).getOffsetX(); -// else -// return super.getOffsetX(); -// } -// -// @Override -// public double getOffsetY() -// { -// if (drawBehindScreen) -// return ((Screen)screen).getOffsetY(); -// else -// return super.getOffsetY(); -// } -// -// @Override -// public double getScale() -// { -// if (drawBehindScreen) -// return ((Screen)screen).getScale(); -// else -// return super.getScale(); -// } -// -// @Override -// public boolean isOverlayEnabled() -// { -// if (screen instanceof IConditionalOverlayScreen) -// return ((IConditionalOverlayScreen) screen).isOverlayEnabled(); -// -// return screen instanceof ScreenGame || screen instanceof ILevelPreviewScreen || screen instanceof IOverlayScreen; -// } -// -// @Override -// public void onAttemptClose() -// { -// ((Screen)this.screen).onAttemptClose(); -// } -} diff --git a/src/main/java/tanks/gui/screen/leveleditor/OverlayShop.java b/src/main/java/tanks/gui/screen/leveleditor/OverlayShop.java index 74cbbf0c..d6d0cd7f 100644 --- a/src/main/java/tanks/gui/screen/leveleditor/OverlayShop.java +++ b/src/main/java/tanks/gui/screen/leveleditor/OverlayShop.java @@ -87,6 +87,7 @@ public void load() { shopList = new ButtonList(new ArrayList<>(), 0, 0, -30); shopList.arrowsEnabled = true; + shopList.manualDarkMode = true; shopList.reorderBehavior = (i, j) -> { diff --git a/src/main/java/tanks/gui/screen/leveleditor/OverlayStartingItems.java b/src/main/java/tanks/gui/screen/leveleditor/OverlayStartingItems.java index 0da06a65..68cbdbe5 100644 --- a/src/main/java/tanks/gui/screen/leveleditor/OverlayStartingItems.java +++ b/src/main/java/tanks/gui/screen/leveleditor/OverlayStartingItems.java @@ -77,6 +77,7 @@ public void load() { startingItemsList = new ButtonList(new ArrayList<>(), 0, 0, -30); startingItemsList.arrowsEnabled = true; + startingItemsList.manualDarkMode = true; startingItemsList.reorderBehavior = (i, j) -> { diff --git a/src/main/java/tanks/tankson/TanksON.java b/src/main/java/tanks/tankson/TanksON.java index 12303f6b..96d1173e 100644 --- a/src/main/java/tanks/tankson/TanksON.java +++ b/src/main/java/tanks/tankson/TanksON.java @@ -12,6 +12,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.util.*; /** @@ -61,10 +62,10 @@ public void skipWhitespace() } } - protected static Object getDefault(Class c) throws InstantiationException, IllegalAccessException + protected static Object getDefault(Class c) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { if (!defaults.containsKey(c)) - defaults.put(c, c.newInstance()); + defaults.put(c, c.getConstructor().newInstance()); return defaults.get(c); } diff --git a/src/main/resources/crusades/adventure_crusade.tanks b/src/main/resources/crusades/adventure_crusade.tanks index c4043cbb..bae78988 100644 --- a/src/main/resources/crusades/adventure_crusade.tanks +++ b/src/main/resources/crusades/adventure_crusade.tanks @@ -1,18 +1,18 @@ properties 3,3,true items -Fire bullet,bullet_fire.png,5,5,3,100,bullet,normal,fire,6.25,0,1.0,3,75.0,10.0,1.0,false -Laser,bullet_laser.png,20,11,1,20,bullet,laser,none,3.125,0,1.0,0,100.0,10.0,1.5,false -Bouncy fire bullet,bullet_fire_trail.png,10,13,1,20,bullet,normal,fire_and_smoke,6.25,2,1.0,3,50.0,10.0,1.0,false -Mega mine,mine.png,25,15,5,50,mine,2000.0,50.0,250.0,4.0,1,100.0,60.0,true -Zap,bullet_electric.png,15,17,5,50,bullet,electric,none,3.125,5,0.125,0,50.0,10.0,1.0,false -Shield,shield.png,50,19,1,10,shield,1.0,5.0,50.0 -Freezing bullet,bullet_freeze.png,10,21,1,25,bullet,freezing,ice,3.125,0,0.25,1,50.0,10.0,1.0,false -Flamethrower,bullet_flame.png,4,23,100,1000,bullet,flamethrower,none,3.125,0,1.0,0,0.0,10.0,0.0,false -Mega bullet,bullet_large.png,15,25,2,20,bullet,normal,trail,3.125,3,1.0,5,100.0,25.0,4.0,true -Healing ray,bullet_healing.png,25,27,100,5000,bullet,healing,none,3.125,0,0.01,0,0.0,10.0,0.0,false -Mini bullet,bullet_mini.png,5,29,20,500,bullet,normal,trail,6.25,0,0.125,8,5.0,5.0,1.0,false -Dark fire bullet,bullet_dark_fire.png,10,31,5,250,bullet,normal,dark_fire,6.25,0,1.0,5,30.0,10.0,1.0,false +{"obj_type":"crusade_shop_item","stack":{"obj_type":"item_stack","item":{"obj_type":"item","name":"Fire bullet","item_type":"bullet","icon":"bullet_fire.png","cooldown":75.0,"bullet":{"obj_type":"bullet","max_live_bullets":3,"bullet_type":"bullet","effect":"fire","bounces":0,"speed":6.25}},"amount":3,"max":100},"unlock_level":5,"price":5} +{"obj_type":"crusade_shop_item","stack":{"obj_type":"item_stack","item":{"obj_type":"item","name":"Laser","item_type":"bullet","icon":"bullet_laser.png","cooldown":100.0,"bullet":{"obj_type":"bullet","override_color":true,"override_color2":true,"max_live_bullets":0,"color_g2":200.0,"bullet_type":"laser","recoil":1.5,"sound":"laser.ogg","color_r2":255.0,"color_b2":200.0,"bounces":0,"color_r":255.0}},"amount":1,"max":20},"unlock_level":11,"price":20} +{"obj_type":"crusade_shop_item","stack":{"obj_type":"item_stack","item":{"obj_type":"item","name":"Bouncy fire bullet","item_type":"bullet","icon":"bullet_fire_trail.png","cooldown":50.0,"bullet":{"obj_type":"bullet","max_live_bullets":3,"bullet_type":"bullet","effect":"fire_trail","sound":"shoot_power.ogg","bounces":2,"speed":6.25}},"amount":1,"max":20},"unlock_level":13,"price":10} +{"obj_type":"crusade_shop_item","stack":{"obj_type":"item_stack","item":{"obj_type":"item","name":"Mega mine","mine":{"obj_type":"mine","explosion":{"obj_type":"explosion","damage":4.0,"destroys_obstacles":true,"bullet_knockback":0.0,"tank_knockback":0.0,"destroys_bullets":true,"damage_radius":250.0,"knockback_radius":225.0},"timer":2000.0,"size":60.0,"max_live_mines":1},"item_type":"mine","icon":"mine.png","cooldown":100.0},"amount":5,"max":50},"unlock_level":15,"price":25} +{"obj_type":"crusade_shop_item","stack":{"obj_type":"item_stack","item":{"obj_type":"item","name":"Zap","item_type":"bullet","icon":"bullet_electric.png","cooldown":50.0,"bullet":{"obj_type":"bullet","override_color":true,"override_color2":true,"damage":0.125,"color_g2":255.0,"bullet_type":"laser","sound":"laser.ogg","color_b2":255.0,"stun":100.0,"chain_count":5,"max_live_bullets":0,"color_g":255.0,"color_r2":200.0,"bounces":0,"color_b":255.0}},"amount":5,"max":50},"unlock_level":17,"price":15} +{"obj_type":"crusade_shop_item","stack":{"obj_type":"item_stack","item":{"obj_type":"item","name":"Shield","max_extra_health":5.0,"item_type":"shield","icon":"shield.png","cooldown":50.0,"health_boost":1.0},"amount":1,"max":10},"unlock_level":19,"price":50} +{"obj_type":"crusade_shop_item","stack":{"obj_type":"item_stack","item":{"obj_type":"item","name":"Freezing bullet","item_type":"bullet","icon":"bullet_freeze.png","cooldown":50.0,"bullet":{"obj_type":"bullet","override_color2":true,"damage":0.25,"max_live_bullets":1,"color_g2":255.0,"bullet_type":"bullet","freezing":true,"effect":"ice","color_r2":255.0,"color_b2":255.0,"bounces":0}},"amount":1,"max":25},"unlock_level":21,"price":10} +{"obj_type":"crusade_shop_item","stack":{"obj_type":"item_stack","item":{"obj_type":"item","name":"Flamethrower","item_type":"bullet","icon":"bullet_flame.png","cooldown":0.0,"bullet":{"obj_type":"bullet","override_color":true,"override_color2":true,"bullet_type":"gas","recoil":0.0,"lifespan":100.0,"sound":"flame.ogg","collide_bullets":false,"color_r":255.0,"glow_size":3.0,"bush_burn":true,"max_live_bullets":0,"color_g":255.0,"color_r2":255.0,"bounces":0,"end_size":100.0,"bush_lower":false}},"amount":100,"max":1000},"unlock_level":23,"price":4} +{"obj_type":"crusade_shop_item","stack":{"obj_type":"item_stack","item":{"obj_type":"item","name":"Mega bullet","item_type":"bullet","icon":"bullet_large.png","cooldown":100.0,"bullet":{"obj_type":"bullet","bullet_type":"bullet","size":25.0,"recoil":4.0,"bounces":3,"heavy":true}},"amount":2,"max":20},"unlock_level":25,"price":15} +{"obj_type":"crusade_shop_item","stack":{"obj_type":"item_stack","item":{"obj_type":"item","name":"Healing ray","item_type":"bullet","icon":"bullet_healing.png","cooldown":0.0,"bullet":{"obj_type":"bullet","override_color":true,"override_color2":true,"damage":-0.01,"color_g2":255.0,"bullet_type":"laser","recoil":0.0,"sound":null,"color_b2":200.0,"collide_bullets":false,"max_live_bullets":0,"color_g":255.0,"color_r2":200.0,"bounces":0}},"amount":100,"max":5000},"unlock_level":27,"price":25} +{"obj_type":"crusade_shop_item","stack":{"obj_type":"item_stack","item":{"obj_type":"item","name":"Mini bullet","item_type":"bullet","icon":"bullet_mini.png","cooldown":5.0,"bullet":{"obj_type":"bullet","damage":0.125,"max_live_bullets":8,"bullet_type":"bullet","size":5.0,"bounces":0,"speed":6.25}},"amount":20,"max":500},"unlock_level":29,"price":5} +{"obj_type":"crusade_shop_item","stack":{"obj_type":"item_stack","item":{"obj_type":"item","name":"Dark fire bullet","item_type":"bullet","icon":"bullet_dark_fire.png","cooldown":30.0,"bullet":{"obj_type":"bullet","bullet_type":"bullet","effect":"dark_fire","bounces":0,"speed":6.25}},"amount":5,"max":250},"unlock_level":31,"price":10} levels {28,18,235,207,166,20,20,20|18-6...11,3-3-hard-2.0,3-4-hard-1.5,3-5-hard-2.0,3-6-hard-1.5,3-7-hard-2.0,3-8-hard-1.5,3-9-hard-2.0,3-10-hard-1.5,3-11-hard-2.0,3-12-hard-1.5,3-13-hard-2.0,3-14-hard-1.5,4-3-hard-1.5,4-14-hard-2.0,5-3-hard-2.0,5-14-hard-1.5,6-3-hard-1.5,6-14-hard-2.0,7-3-hard-2.0,7-14-hard-1.5,8-3-hard-1.5,8-14-hard-2.0,9-3-hard-2.0,9-14-hard-1.5,10-3-hard-1.5,10-14-hard-2.0,11-3-hard-2.0,11-14-hard-1.5,12-3-hard-1.5,12-14-hard-2.0,13-3-hard-2.0,13-14-hard-1.5,14-3-hard-1.5,14-14-hard-2.0,15-3-hard-2.0,15-14-hard-1.5,16-3-hard-1.5,16-14-hard-2.0,17-3-hard-2.0,17-14-hard-1.5,18-3-hard-1.5,18-14-hard-2.0,19-3-hard-2.0,19-14-hard-1.5,20-3-hard-1.5,20-14-hard-2.0,21-3-hard-2.0,21-14-hard-1.5,22-3-hard-1.5,22-14-hard-2.0,23-3-hard-2.0,23-14-hard-1.5,24-3-hard-1.5,24-4-hard-2.0,24-5-hard-1.5,24-6-hard-2.0,24-7-hard-1.5,24-8-hard-2.0,24-9-hard-1.5,24-10-hard-2.0,24-11-hard-1.5,24-12-hard-2.0,24-13-hard-1.5,24-14-hard-2.0,0...27-0-shrub,0...27-1-shrub,0...27-2-shrub,0-3...17-shrub,1-3...17-shrub,2-3...17-shrub,3...27-15-shrub,3...27-16-shrub,3...27-17-shrub,25-3...14-shrub,26-3...14-shrub,27-3...14-shrub|21-7-brown-2-enemy,6-10-player-0-ally|ally-true,enemy-true} name=Grassy_welcome {28,11,166,207,207,20,20,20|7-3...5-normal-0.5,14-5...7-normal-0.5,21-3...5-normal-0.5,0...27-2-hard-0.5,0-3...8-hard-0.5,1...27-8-hard-0.5,27-3...7-hard-0.5,0...27-0-snow,0...27-1-snow,0...27-9-snow,0...27-10-snow|10-4-brown-1-enemy,17-6-brown-3-enemy,25-4-brown-1-enemy,3-5-player-0-ally|ally-true,enemy-true} name=Snowy_tunnel diff --git a/src/main/resources/items/items.tanks b/src/main/resources/items/items.tanks index f0b36bed..46bb5a81 100644 --- a/src/main/resources/items/items.tanks +++ b/src/main/resources/items/items.tanks @@ -1,19 +1,19 @@ -Basic bullet,bullet_normal.png,1,0,10,100,bullet,normal,trail,3.125,1,1.0,5,20.0,10.0,1.0,false -Basic mine,mine.png,1,0,4,100,mine,1000.0,50.0,125.0,2.0,2,50.0,30.0,true -Fire bullet,bullet_fire.png,5,0,3,100,bullet,normal,fire,6.25,0,1.0,3,75.0,10.0,1.0,false -Laser,bullet_laser.png,20,0,1,20,bullet,laser,none,3.125,0,1.0,0,100.0,10.0,1.5,false -Bouncy fire bullet,bullet_fire_trail.png,10,0,1,20,bullet,normal,fire_and_smoke,6.25,2,1.0,3,50.0,10.0,1.0,false -Mega mine,mine.png,25,0,5,50,mine,2000.0,50.0,250.0,4.0,4,100.0,60.0,true -Zap,bullet_electric.png,15,0,5,50,bullet,electric,none,3.125,3,0.125,0,50.0,10.0,1.0,false -Shield,shield.png,50,0,1,10,shield,1.0,5.0,50.0 -Freezing bullet,bullet_freeze.png,10,0,1,25,bullet,freezing,ice,3.125,0,0.25,1,50.0,10.0,1.0,false -Flamethrower,bullet_flame.png,4,0,100,1000,bullet,flamethrower,none,3.125,0,1.0,0,0.0,10.0,0.0,false -Mega bullet,bullet_large.png,15,0,2,20,bullet,normal,trail,3.125,3,1.0,5,100.0,25.0,4.0,true -Artillery shell,bullet_arc.png,5,0,2,40,bullet,arc,none,3.125,0,1.0,4,60.0,25.0,0.0,false -Healing ray,bullet_healing.png,25,0,100,5000,bullet,healing,none,3.125,0,0.01,0,0.0,10.0,0.0,false -Explosive bullet,bullet_explosive.png,10,0,2,25,bullet,explosive,trail,3.125,0,1.0,2,75.0,20.0,1.0,false -Booster,bullet_boost.png,10,0,10,100,bullet,boost,ember,6.25,0,1.0,5,20.0,10.0,1.0,false -Mini bullet,bullet_mini.png,5,0,20,500,bullet,normal,trail,6.25,0,0.125,8,5.0,5.0,1.0,false -Dark fire bullet,bullet_dark_fire.png,10,0,5,250,bullet,normal,dark_fire,6.25,0,1.0,5,30.0,10.0,1.0,false -Homing bullet,bullet_homing.png,25,0,2,10,bullet,homing,fire,6.25,0,1.0,3,100.0,10.0,0.0,false,0.0,1,30.0 -Air,bullet_air.png,8,0,100,10000,bullet,air,none,6.25,0,1.0,0,0.0,10.0,0.0,false,20.0,1,30.0 +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Basic bullet","item_type":"bullet","icon":"bullet_normal.png","cooldown":20.0,"bullet":{"obj_type":"bullet","bullet_type":"bullet"}},"amount":10,"max":100} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Fire bullet","item_type":"bullet","icon":"bullet_fire.png","cooldown":75.0,"bullet":{"obj_type":"bullet","max_live_bullets":3,"bullet_type":"bullet","effect":"fire","bounces":0,"speed":6.25}},"amount":3,"max":100} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Laser","item_type":"bullet","icon":"bullet_laser.png","cooldown":100.0,"bullet":{"obj_type":"bullet","override_color":true,"override_color2":true,"max_live_bullets":0,"color_g2":200.0,"bullet_type":"laser","recoil":1.5,"sound":"laser.ogg","color_r2":255.0,"color_b2":200.0,"bounces":0,"color_r":255.0}},"amount":1,"max":20} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Bouncy fire bullet","item_type":"bullet","icon":"bullet_fire_trail.png","cooldown":50.0,"bullet":{"obj_type":"bullet","max_live_bullets":3,"bullet_type":"bullet","effect":"fire_trail","sound":"shoot_power.ogg","bounces":2,"speed":6.25}},"amount":1,"max":20} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Zap","item_type":"bullet","icon":"bullet_electric.png","cooldown":50.0,"bullet":{"obj_type":"bullet","override_color":true,"override_color2":true,"damage":0.125,"color_g2":255.0,"bullet_type":"laser","sound":"laser.ogg","color_b2":255.0,"stun":100.0,"chain_count":3,"max_live_bullets":0,"color_g":255.0,"color_r2":200.0,"bounces":0,"color_b":255.0}},"amount":5,"max":50} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Freezing bullet","item_type":"bullet","icon":"bullet_freeze.png","cooldown":50.0,"bullet":{"obj_type":"bullet","override_color2":true,"damage":0.25,"max_live_bullets":1,"color_g2":255.0,"bullet_type":"bullet","freezing":true,"effect":"ice","color_r2":255.0,"color_b2":255.0,"bounces":0}},"amount":1,"max":25} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Flamethrower","item_type":"bullet","icon":"bullet_flame.png","cooldown":0.0,"bullet":{"obj_type":"bullet","override_color":true,"override_color2":true,"bullet_type":"gas","recoil":0.0,"lifespan":100.0,"sound":"flame.ogg","collide_bullets":false,"color_r":255.0,"glow_size":3.0,"bush_burn":true,"max_live_bullets":0,"color_g":255.0,"color_r2":255.0,"bounces":0,"end_size":100.0,"bush_lower":false}},"amount":100,"max":1000} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Mega bullet","item_type":"bullet","icon":"bullet_large.png","cooldown":100.0,"bullet":{"obj_type":"bullet","bullet_type":"bullet","size":25.0,"recoil":4.0,"bounces":3,"heavy":true}},"amount":2,"max":20} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Artillery shell","item_type":"bullet","icon":"bullet_arc.png","cooldown":60.0,"bullet":{"obj_type":"bullet","max_live_bullets":4,"max_range":1000.0,"bullet_type":"artillery","size":25.0,"recoil":0.0,"effect":"long_trail","sound":"arc.ogg","bounces":0}},"amount":2,"max":40} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Healing ray","item_type":"bullet","icon":"bullet_healing.png","cooldown":0.0,"bullet":{"obj_type":"bullet","override_color":true,"override_color2":true,"damage":-0.01,"color_g2":255.0,"bullet_type":"laser","recoil":0.0,"sound":null,"color_b2":200.0,"collide_bullets":false,"max_live_bullets":0,"color_g":255.0,"color_r2":200.0,"bounces":0}},"amount":100,"max":5000} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Explosive bullet","item_type":"bullet","icon":"bullet_explosive.png","cooldown":75.0,"bullet":{"obj_type":"bullet","explosion":{"obj_type":"explosion"},"max_live_bullets":2,"bullet_type":"bullet","size":20.0,"bounces":0}},"amount":2,"max":25} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Booster","item_type":"bullet","icon":"bullet_boost.png","cooldown":20.0,"bullet":{"obj_type":"bullet","override_color2":true,"damage":0.0,"color_g2":180.0,"bullet_type":"bullet","boosting":true,"effect":"ember","color_r2":255.0,"bounces":0,"speed":6.25}},"amount":10,"max":100} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Mini bullet","item_type":"bullet","icon":"bullet_mini.png","cooldown":5.0,"bullet":{"obj_type":"bullet","damage":0.125,"max_live_bullets":8,"bullet_type":"bullet","size":5.0,"bounces":0,"speed":6.25}},"amount":20,"max":500} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Dark fire bullet","item_type":"bullet","icon":"bullet_dark_fire.png","cooldown":30.0,"bullet":{"obj_type":"bullet","bullet_type":"bullet","effect":"dark_fire","bounces":0,"speed":6.25}},"amount":5,"max":250} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Homing bullet","item_type":"bullet","icon":"bullet_homing.png","cooldown":100.0,"bullet":{"obj_type":"bullet","multishot_spread_angle":30.0,"max_live_bullets":3,"bullet_type":"bullet","recoil":0.0,"effect":"fire","homing_sharpness":0.18181818181818182,"bounces":0,"speed":6.25}},"amount":2,"max":10} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Air","item_type":"bullet","icon":"bullet_air.png","cooldown":0.0,"bullet":{"obj_type":"bullet","damage":0.0,"color_noise_b":64.0,"color_g2":131.0,"recoil":0.0,"color_noise_g":76.0,"lifespan":200.0,"accuracy_spread_angle":20.0,"sound":"wind.ogg","color_r":160.0,"speed":6.25,"knockback_tank":0.1,"color_noise_r":95.0,"color_g":179.0,"color_r2":100.0,"bounces":0,"glow_intensity":0.0,"color_b":191.0,"knockback_bullet":0.04,"sound_pitch_variation":1.0,"multishot_spread_angle":30.0,"override_color":true,"override_color2":true,"bullet_type":"gas","color_b2":151.0,"glow_size":0.0,"max_live_bullets":0,"end_size":400.0,"opacity":0.16666666666666666,"bush_lower":false}},"amount":100,"max":10000} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Basic mine","mine":{"obj_type":"mine","explosion":{"obj_type":"explosion","damage_radius":112.5}},"item_type":"mine","icon":"mine.png","cooldown":50.0},"amount":4,"max":100} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Mega mine","mine":{"obj_type":"mine","explosion":{"obj_type":"explosion","damage":4.0,"damage_radius":250.0},"timer":2000.0,"size":60.0,"max_live_mines":4},"item_type":"mine","icon":"mine.png","cooldown":100.0},"amount":5,"max":50} +{"obj_type":"item_stack","item":{"obj_type":"item","name":"Shield","max_extra_health":5.0,"item_type":"shield","icon":"shield.png","cooldown":50.0,"health_boost":1.0},"amount":1,"max":10}