Giter Club home page Giter Club logo

bulletuphell's Introduction

Dark Peace's BulletUpHell

Presentation

BulletUpHell is the most feature-packed BulletHell Engine in the world. It's a plugin for Godot 3 and 4 that I made over 2 years during my computer science degree. Version 4 is the one recommended, with more features and maintained.

As a BulletHell dev myself, my aim is to create a plugin able to recreate ALL the attack patterns present in your favorite bullethell games. For that, I researched all of the attacks in games like Enter the Gungeon and Binding of Isaac and implemented the necessary features to recreate them all with easiness of use and flexibility in mind. You'll have all the tools you need to make a BulletHell game. It takes care of everything related to bullet spawning : patterns, bullet properties, event triggering,... Features include complex bullet movement (from math equations to custom drawn paths), advanced homing features, built-in animation and sound manager, ability to randomise everything, laser beams, and much more !

You want even more than the best Bullethell engine ? Then go for the improved version : BulletUpHell BLAST. Many exclusive features, more updates, improved API, improved optimisation,... The list of exclusive stuff can be seen here : https://rebrand.ly/BulletUpHell-BLAST.

Here is the official trailer : https://youtu.be/L9ztZr9Ku2Q

Tutorial, installation steps and documentation below the screenshots. (lags on the gif comes from the recorder, not the plugin XD)

Godot_v4 0-stable_win64_kKgJZaEScg Godot_v4 0-stable_win64_9tcJjfETCc Godot_v4 0-stable_win64_5Dstv76K6b Godot_v4 0-stable_win64_LJrtOJvI9x Godot_v4 0-stable_win64_O3nX5Jenfm Godot_v4 0-stable_win64_xVip6jiYaZ

Installation & Usage

Video tutorial to get started : tuto

For the installation and the documentation of all my plugins, check this : https://rebrand.ly/Dark-Peace-Godot-Plugins

I'll also post complete tutorials on my Youtube channel when I'll have the time so consider subscribing to not miss any news ! My youtube channel For any question or request, join my Discord

The plugin has custom nodes and a bunch of resources you can use to create all the complex attack patterns without coding (but some things are just much more easier to do by code, I didn't make it with the goal that someone who doesn't know how to code could use it). Just drag and drop them in your scene, fill up the properties you want and watch as the magic happens. The focus of this plugin is implementing the greatest range of features while keeping it as easy to use as possible. I optimised it as much as I could but if you're looking for 2000+ bullets on screen (why would you even-) then you need a more optimised plugin which is gonna have far less features. If you need up to 2000 bullets that's fine but I recommend not going above 1500 for the sake of your players who have a potatoe laptop.

You want even more than the best Bullethell engine ? Then go for the improved version : [BulletUpHell BLAST]. More features, more updates, improved API, improved optimisation,...

image

Q&A

  • Q: Will there be new features in the future ? A: Yes. But the V4.3 is the final free version. The next update will be part of the premium BLAST version.

  • Q: Are the versions compatible ? A: If you're satisfied with the features of your old version, there is no reason to update. I try to make my versions as compatible as possible but always back up your project before updating.

  • Q: Can I make updates to the plugin ? A: Sure, but please tell me about it. Also any feature idea is welcomed.

bulletuphell's People

Contributors

dark-peace avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bulletuphell's Issues

Feature Request: The ability to add extra metadata to a bullet.

What is your use-case ?
In my game, I want to have multiple kinds of enemies where each enemy can shoot different bullets. I want these bullets to have different stats that the player node can react to when it collides with a bullet.

Describe the feature you'd like
I want to be able to add metadata to bullets, be it damage, the node who shot the bullet, or anything else.

Describe alternatives you've considered
I don't think there's any alternatives.

Idea on how to make your feature

Additional context

PerfBullets integration?

Pretty much what title says. Since both plugins cover one niche game genre, some degree of integration seemed reasonable to me, but there was no info on that. I've opened a similar issue in PerfBullets repository: Moonzel/Godot-PerfBullets#3 , and would appreciate if you gave it a look.

Bouncing Lasers limitations and bug

As is, we have to choose between Lasers bouncing off of objects and ignoring objects. What if I want for lasers to bounce off of mirrors and collide with walls? As is, it seems like that's not possible.

I had assumed that this limitation was as intended, however this creates another issue:

Imagine this scene:

[Mirror] [Block] <=[Laser]

Mirror is part of the group "reflects" which Lasers bounce off of. The Laser sees that it doesn't bounce off the block. The displayed ray, however, renders it's full length and does not collide with the mirror/wall.

See attached images. One of them shows what happens when the laser collides with something in a bounce group, one shows what happens when it does not.

Reflects No-Reflect

I've made some progress on a fix for myself, but I've gotten a little lost in your code trying to figure out the logic for adding points to the line. Would love to see an update that fixes this, but I will continue working on it on my end and post an update if I find a full fix.

Code quality could be better

I know that the bar for GDScript code is not very high, and I consider myself quite tolerant when it comes to other's people code, but there are a couple of issues here that make me not want to even touch this plugin:

  1. You like using Dictionarys way too much. I feel like 99% of the dictionaries in this code should just be replaced with classes for better readability and maintainability
  2. You inherit the classes that you have from very strange bases, like PackedDataContainer. I'm not sure you understand what this class even does, but inheriting from it does absolutely nothing in this context. You should inherit from Resource or better yet RefCounted if you don't need any of the Resource's functionality.

There are other strange things that I noticed, but those are relatively minor. Fixing just these 2 should not take a lot of time and will immediately improve code quality by an order of magnitude, from my point of view at least

Spawn Point can't assign TriggerContainer

First of thank you very much for creating this amazing addon.
Im just in the beginning of implementing it but I'm realy impressed about the functionality :)

Where does the problem occour

Main Branch

What Godot version was used

v4.0.2.stable.official [7a0977ce2]

Problem

I can't assign a TriggerContainer to the Spawnpoint

I took a look in the BuHSpawnpoint.gd

Im not familiar with the _get_property_list() syntax as I'm usually using @export_node_path(SomeClass) for those kind of things. https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_exports.html#nodes

I happened to see a similar behaviour when you tried to assign a class that was not of the correct type. So maybe this needs also to be written different int the _get_property_list() return array. In the docs I couldn't find much explanation about this topic https://docs.godotengine.org/en/stable/contributing/development/core_and_modules/object_class.html#binding-properties-using-set-get-get-property-list

I hope this helps you a little bit :)

func _get_property_list() -> Array:
	return [
		{
			name = "active",
			type = TYPE_BOOL,
			usage = PROPERTY_USAGE_DEFAULT
		},{
			name = "auto_pattern_id",
			type = TYPE_STRING,
			usage = PROPERTY_USAGE_DEFAULT
		},{
			name = "shared_area_name",
			type = TYPE_STRING,
			usage = PROPERTY_USAGE_DEFAULT
		},{
			name = "rotating_speed",
			type = TYPE_FLOAT,
			usage = PROPERTY_USAGE_DEFAULT
		},{
			name = "pool_amount",
			type = TYPE_INT,
			usage = PROPERTY_USAGE_DEFAULT
		},{
			name = "Autostart & Triggering",
			type = TYPE_NIL,
			hint_string = "auto_",
			usage = PROPERTY_USAGE_GROUP
		},{
			name = "auto_start_on_cam",
			type = TYPE_BOOL,
			usage = PROPERTY_USAGE_DEFAULT
		},{
			name = "auto_start_after_time",
			type = TYPE_FLOAT,
			usage = PROPERTY_USAGE_DEFAULT
		},{
			name = "auto_start_at_distance",
			type = TYPE_FLOAT,
			usage = PROPERTY_USAGE_DEFAULT
		},{
			name = "auto_distance_from",
			type = TYPE_NODE_PATH,
			usage = PROPERTY_USAGE_DEFAULT
		},{
			name = "Advanced Triggering",
			type = TYPE_NIL,
			hint_string = "trigger_",
			usage = PROPERTY_USAGE_GROUP
		},{
			name = "trigger_id",
			type = TYPE_NODE_PATH,
			usage = PROPERTY_USAGE_DEFAULT
		},{
			name = "Random",
			type = TYPE_NIL,
			hint_string = "r_",
			usage = PROPERTY_USAGE_GROUP
		},
		{ name = "r_randomisation_chances", type = TYPE_FLOAT,
			hint = PROPERTY_HINT_RANGE, hint_string = "0, 1", usage = PROPERTY_USAGE_DEFAULT },
		{ name = "r_active_chances", type = TYPE_FLOAT,
			hint = PROPERTY_HINT_RANGE, hint_string = "0, 1", usage = PROPERTY_USAGE_DEFAULT },
		{ name = "r_shared_area_choice", type = TYPE_STRING, usage = PROPERTY_USAGE_DEFAULT },
		{ name = "r_rotating_variation", type = TYPE_VECTOR3, usage = PROPERTY_USAGE_DEFAULT },
		{ name = "r_pattern_choice", type = TYPE_ARRAY, usage = PROPERTY_USAGE_DEFAULT },
		{ name = "r_start_time_choice", type = TYPE_STRING, usage = PROPERTY_USAGE_DEFAULT },
		{ name = "r_start_time_variation", type = TYPE_VECTOR3

Example for reproducing the problem

Screen.Recording.2023-04-18.at.20.31.28.mov

A couple minor homing fixes

Hey there! Very cool library, thanks for putting it together and open-sourcing it!

I ran into a few crashes integrating it yesterday/this morning, I thought I'd share the commit in my repo: russmatney/dino@56fbfc2.

I can create a proper PR if you want, this was just a lower-lift share, and maybe you prefer a different solution and/or can get to it sooner.

I prefer to do more things from code in general, which might explain why I hit some of these. For now I'm creating bullet and spawn patterns in an autoloaded scene, then updating and firing bullets from enemy instances this:

func fire(target):
    Spawning.change_property("bullet", "bulletPattern1", "homing_target", target.get_path())
    Spawning.change_property("bullet", "bulletPattern1", "homing_steer", 100)
    Spawning.change_property("bullet", "bulletPattern1", "homing_duration", 3)
    Spawning.spawn(self, "spawnPattern1")

This usage seems reasonable to me. It feels like the lib may expect some homing setup is expected to happen in _ready(), but it's too late if we decide afterwards that a bullet should be homing. Maybe I should just create the bullet and spawn pattern in the code as well, to resolve that?

--

I also spent a bit trying to figure out why some spawns never fired, and eventually figured out that nothing fires unless a spawner is in a positive x and y position. Moving a spawner left of the y axis or above the x axis results in no bullets at all. Maybe this is just a bug on my end? I dug into it briefly, but wasn't able to find a clear reason/solution for this yet.

Let me know what you think and if you'd like an actual PR!

errors

Good Morning. I hope you will see this because I really need your help. I downloaded the bulletuphell files for Godot 4.2 and once I get the files on to the Godot project this comes up

res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/ExampleScenes/ExampleScene.gd:6 - Parse Error: Identifier "Spawning" not declared in the current scope.
modules/gdscript/gdscript.cpp:2788 - Failed to load script "res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/ExampleScenes/ExampleScene.gd" with error "Parse error". (User)
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/ExampleScenes/PlayerTest.gd:5 - Parse Error: Identifier "Spawning" not declared in the current scope.
modules/gdscript/gdscript.cpp:2788 - Failed to load script "res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/ExampleScenes/PlayerTest.gd" with error "Parse error". (User)
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHBulletNode.gd:25 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHBulletNode.gd:27 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHBulletNode.gd:66 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHBulletNode.gd:67 - Parse Error: Identifier "Spawning" not declared in the current scope.
modules/gdscript/gdscript.cpp:2788 - Failed to load script "res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHBulletNode.gd" with error "Parse error". (User)
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHBulletProperties.gd:28 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHBulletProperties.gd:79 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHBulletProperties.gd:83 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHBulletProperties.gd:88 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHBulletProperties.gd:118 - Parse Error: Identifier "Spawning" not declared in the current scope.
modules/gdscript/gdscript.cpp:2788 - Failed to load script "res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHBulletProperties.gd" with error "Parse error". (User)
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHInstanceLister.gd:9 - Parse Error: Identifier "Spawning" not declared in the current scope.
modules/gdscript/gdscript.cpp:2788 - Failed to load script "res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHInstanceLister.gd" with error "Parse error". (User)
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHPattern.gd:85 - Parse Error: Identifier "Spawning" not declared in the current scope.
modules/gdscript/gdscript.cpp:2788 - Failed to load script "res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHPattern.gd" with error "Parse error". (User)
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHSpawnPoint.gd:41 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHSpawnPoint.gd:72 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHSpawnPoint.gd:73 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHSpawnPoint.gd:73 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHSpawnPoint.gd:118 - Parse Error: Identifier "Spawning" not declared in the current scope.
modules/gdscript/gdscript.cpp:2788 - Failed to load script "res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHSpawnPoint.gd" with error "Parse error". (User)
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHTriggerContainer.gd:21 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHTriggerContainer.gd:22 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHTriggerContainer.gd:23 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHTriggerContainer.gd:34 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHTriggerContainer.gd:35 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHTriggerContainer.gd:35 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHTriggerContainer.gd:38 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHTriggerContainer.gd:41 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHTriggerContainer.gd:74 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHTriggerContainer.gd:143 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHTriggerContainer.gd:162 - Parse Error: Identifier "Spawning" not declared in the current scope.
modules/gdscript/gdscript.cpp:2788 - Failed to load script "res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/Nodes/BuHTriggerContainer.gd" with error "Parse error". (User)
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/SpawnPatterns/PatternCustomShape.gd:15 - Parse Error: Identifier "Spawning" not declared in the current scope.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/SpawnPatterns/PatternCustomShape.gd:15 - Parse Error: Cannot use simple "@export" annotation because the type of the initialized value can't be inferred.
modules/gdscript/gdscript.cpp:2788 - Failed to load script "res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/SpawnPatterns/PatternCustomShape.gd" with error "Parse error". (User)
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/SpawnPatterns/PatternLine.gd:10 - Parse Error: Identifier "Spawning" not declared in the current scope.
modules/gdscript/gdscript.cpp:2788 - Failed to load script "res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/SpawnPatterns/PatternLine.gd" with error "Parse error". (User)
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd:6 - Parse Error: Preload file "res://addons/BulletUpHell/Nodes/BuHPattern.gd" does not exist.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd:6 - Parse Error: Preload file "res://addons/BulletUpHell/Sprites/NodeIcons1.png" does not exist.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd:7 - Parse Error: Preload file "res://addons/BulletUpHell/Nodes/BuHBulletProperties.gd" does not exist.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd:7 - Parse Error: Preload file "res://addons/BulletUpHell/Sprites/NodeIcons2.png" does not exist.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd:8 - Parse Error: Preload file "res://addons/BulletUpHell/Nodes/BuHTriggerContainer.gd" does not exist.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd:8 - Parse Error: Preload file "res://addons/BulletUpHell/Sprites/NodeIcons3.png" does not exist.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd:9 - Parse Error: Preload file "res://addons/BulletUpHell/Nodes/BuHSpawnPoint.gd" does not exist.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd:9 - Parse Error: Preload file "res://addons/BulletUpHell/Sprites/NodeIcons14.png" does not exist.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd:10 - Parse Error: Preload file "res://addons/BulletUpHell/Nodes/BuHInstanceLister.gd" does not exist.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd:10 - Parse Error: Preload file "res://addons/BulletUpHell/Sprites/NodeIcons20.png" does not exist.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd:11 - Parse Error: Preload file "res://addons/BulletUpHell/Nodes/BuHBulletNode.gd" does not exist.
res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd:11 - Parse Error: Preload file "res://addons/BulletUpHell/Sprites/NodeIcons19.png" does not exist.
modules/gdscript/gdscript.cpp:2788 - Failed to load script "res://BulletUpHell-Demo-V4.4/addons/BulletUpHell/BuH.gd" with error "Parse error". (User)

(sorry for the load of text) I was wondering what could I do to fix all this up before may 20th

Feature Request : Visual Pattern Editor

What is your use-case ?
I wanna make a different patterns for my bullethell game, but starting a scene after every change is... long

Describe the feature you'd like
Scene with menu for pattern editing and testing. Also button for saving. But i idk if it possible...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.