the way to teal(just kill)
- 10 Devlogs
- 14 Total hours
movement shooter inspired by a song about a blue man in a grean world
movement shooter inspired by a song about a blue man in a grean world
DEVLOG - 08 added an interesting navigation optimization script
i encountered some lag even with 4 enemies so sadly i had to optimize it on the bright side i saw yesterday a video about exactly that and omfg it saved me and explains the general idea of what i do its just that i do it worse and in a different way
video:https://www.youtube.com/watch?v=BPNr_txi6TU&t=813s
time:13:33(already in link)
how it works?
ok so its not the MOST OPTIMAL but it is good i mean i can every time an enemy die to resort it blah blah blah and use the modulo but this works good enough even though i spent half an hour fixing a bug that doesnt exist(turns out if you select a navigation region and bake navigation mesh it does that to all regions and not just the one you selected) but for some reason i did have to use a raycast down the enemy’s feet for it to work so they wont fall probably because of friction
so anyways here is the code:
extends Node3D
var tickAssigned = []
var tickCount = []
var currentTick = 0;
var tickTimer = 0.0
const TICK_RATE = 0.025
func _ready() -> void:
tickAssigned.resize(navObjects.size())
tickAssigned.fill(0)
tickCount.resize(20);
tickCount.fill(0)
var length = navObjects.size()
for i in tickAssigned.size():
tickAssigned[i] = -1
var num = 20.0 /length
var current = 0.0
for i in length:
if current >= 20:
current -= 20
tickAssigned[i] = int(current)
tickCount[int(current)]+=1
current += num```
# Called every frame. 'delta' is the elapsed time since the previous frame.
```func _process(delta: float) -> void:
tickTimer +=delta
if tickTimer < TICK_RATE:
return
tickTimer = 0.0
var tickDelta = TICK_RATE
var count = 0
for entity in navObjects:
if entity != null:
if tickAssigned[count] == currentTick:
var target = entity.target
if target != null:
var navAgent = entity.navAgent
var mode = entity.mode
var gotShot = entity.gotShot
var SPEED = entity.SPEED
var accelaration = entity.accelaration
var velocity = entity.velocity
if mode == "chase" or gotShot:
navAgent.target_position = Vector3(target.global_position.x,target.global_position.y,target.global_position.z)
var dir = (navAgent.get_next_path_position() - entity.global_position).normalized()
print(entity.name, navAgent.get_next_path_position())
entity.velocity = velocity.lerp(dir * SPEED, tickDelta * accelaration)
entity.look_at(Vector3(target.global_position.x,entity.global_position.y,target.global_position.z),Vector3.UP,true)
entity.shouldMove = true
elif mode == "attack":
navAgent.target_position = Vector3(target.global_position.x,target.global_position.y,target.global_position.z)
var dir = (navAgent.get_next_path_position() - entity.global_position).normalized()
print(entity.name, navAgent.get_next_path_position())
entity.velocity = velocity.lerp(dir * SPEED, tickDelta * accelaration)
entity.look_at(Vector3(target.global_position.x,entity.global_position.y,target.global_position.z),Vector3.UP,true)
entity.shouldMove = true
count+=1
currentTick +=1
if currentTick >= 20:
currentTick = 0
#@onready var body =$body
#@onready var explosionParticles = preload("res://Particles/enemyExplode.tscn")
#var particleInstance
#@export var navAgent : NavigationAgent3D
#@export var damage = 10
#@export var accelaration = 10
#var target
#var mode : String = "idle"
#var gotShot = false```
and the enemy code is too long so i cant put it here
also here is a clip of the current state of the game
DEVLOG - 07 added vertical dash wall jumping and started with the tutorial level
today i wanted to design the first level so i looked up what good level builders there are and saw trenchbroom and after like an hour of trying to make it work on fedora i gave up and tried something called cyclops but it doesnt support my current godot version so i spent MORE TIME diving into its code because there was only 1 small error(or so i thought) which i managed to fix but then every like 3 minutes of using it it just crashed so i guess im sticking with normal godot
AND it took me like 20 versions and about 5 commits that i thought i fixed it to get to a working version of the 4 line code that lets me dash vertically but setting it up based on camera lets you dash up and gain insane momentum instantly so i tried a system of my own which calculated you vertical velocity using your horizontal one and tried a bunch of formulas and ended up with this fine version
so the wall jumping was very easy to do because i just reflect the current movement and add a boost the hard part was that every time before hitting the wall i would already switch in my keyboard to the other other direction so to deal with that i “predicted the future” like i did with the slopes so that the movement feels smoother but to deal with the problem of the keyboard switching i also checked for the opposite directions(which is bassicly copy paste with minuses)so here is the code for that:
if is_on_floor():
canWallJump = false
return
var veloc = Vector3(velocity.x,velocity.y,velocity.z)
#var future = self.global_position + veloc
for i in get_slide_collision_count():
var collision = get_slide_collision(i)
if collision.get_normal().y < .3:
wallNormal = collision.get_normal()
canWallJump = true
return
if veloc.length() > 0.5:
var spaceState = get_world_3d().direct_space_state
var ray = PhysicsRayQueryParameters3D.create(global_position,global_position + veloc.normalized() * 1.2)
ray.exclude = [self.get_rid()]
var hit = spaceState.intersect_ray(ray)
if hit and hit.normal.y < .3:
wallNormal = hit.normal
canWallJump = true
return
var altVeloc = Vector3(-velocity.x,velocity.y,velocity.z)
if altVeloc.length() > 0.5:
var spaceState = get_world_3d().direct_space_state
var ray = PhysicsRayQueryParameters3D.create(global_position,global_position + altVeloc.normalized() * 1.2)
ray.exclude = [self.get_rid()]
var hit = spaceState.intersect_ray(ray)
if hit and hit.normal.y < .3:
wallNormal = hit.normal
canWallJump = true
return
altVeloc = Vector3(velocity.x,velocity.y,-velocity.z)
if altVeloc.length() > 0.5:
var spaceState = get_world_3d().direct_space_state
var ray = PhysicsRayQueryParameters3D.create(global_position,global_position + altVeloc.normalized() * 1.2)
ray.exclude = [self.get_rid()]
var hit = spaceState.intersect_ray(ray)
if hit and hit.normal.y < .3:
wallNormal = hit.normal
canWallJump = true
return
canWallJump = false```
anyway here is a clip of the tutorial level now(compressed cause it was somehow 155mb):
**NOTE**: it will be updated on itch.io after i finish making this tutorial level im just a little tired today and couldnt work on the project yesterday so i uploaded this devlog early
DEVLOG - 06 added a main menu!
now as you can see THERE IS A MAIN MENU and it doesnt work very good on linux but my eye hurts so thats a problem for tommorow and let me know how it is on windows
DEVLOG - 05 (it should’ve taken like 30 minutes wth)
i added enemies that chase you and animations to your movements the animations were the easy part…
but can someone tell me why godot uses the exact same shader to all of my models? so it took me like 50 god damn minutes to realise i need to just duplicate it and then i had a typo and i thought duplicating it doesnt work because of that so i gave up and sent it to chatgpt AND THEN I WAS RIGHT I DO NEED TO DUPLICATE IT
anyways here is a clip of the game now and you have to like it
ALSO SPECIAL THANKS TO CONNOR - thank him he is the reason the downloads now work in itch.io at least thats what i hope because if they dont idfk what to do
itch.io:https://idotweaks.itch.io/the-way-to-tealjust-kill
DEVLOG - 04 HUGE MILESTONE
movement is now finished with all new momentum logic and added dashing
wait… why wont you just see for your selves?
try out the movement in the link here and tell me if you like it:)
https://idotweaks.itch.io/the-way-to-tealjust-kill
note: i added downloadable versions and a web version the game is generally for windows/linux(i am on linux so i kinda have to XD) so i will not be fixing any only web only bugs
anyways i have to put an image here so watch my first attempt of a crosshairT_T
mini devlog - 03.5 i wanted some art to the game so i made this banner it isnt proffesional at all and took me a damn hour for something thats kinda bad but this is what i cam up with i hope you like it
(if you are interested in the project go check out my profile:)
DEVLOG - 03 added enemies that turn teal with time read devlog 00 to understand the game:)
for this game i didnt want a boring health bar what i wanted was a visual indicator and well the green enemies are the health bar now you can see easily how much health they have as you can see in the video
its a simple use of shaders and its my first time! I REALLY HATE THOSE but it works
also look at those particles(i<3particles)
–please like if you liked it and comment suggestions it really makes me feel better and improve the game
DEVLOG - 02 (still day one of the project i just do a lot:)
IF YOU DONT KNOW WHAT THE GAME IS ABOUT GO TO DEVLOG - 00
added teal footsteps and teal bullet holes to emphasize the mix of blue and green
it was implemented using decals which it is the first time i use them so they arent the greatest
as you may have noticed i also added a gun with a simple animation+particles and a raycast currently it has nothing to shoot at but i might fix it soon…
so the basics are done but i do need to add movement like double jump because after all it is a movement shooter and figure out how i can copy ultrakill’s movement so my game doesnt feel so “slow”
next devlog will probably be today againT_T i just cant stop working on itttt
DEVLOG - 01 – how the way to teal(just kill) calculates sliding
i added sliding and right now it isnt as smooth and polished as it might be at the end but i came up with a method that works quite well and im certain i will use it until the end
how it works: if you are sliding a script checks what will be your position if you will continue in your current motion without changing the y if you wont be on the ground it means you will probably be on a slope how do we know how “sloppy”(hehe just like the game) it is? we shoot a raycast starting at the player’s feet down about 5 units(you may do whatever number you like) afterwards we check the position in which the raycast intersected with the floor and use it to calculate the force/boost we will give the player using that i can calculate everything i need to slide the player
note:if you end up using it check my github because in the code you will need to adjust some things like more downward force in order for the player to not fly
anyway here is a clip of it in action the game is in a newborn stage so no judging!
–CODE TIME–
(I NEVER USE COMMENTS BE GRATEFUL)
#calculate the position in the future
var horizontalVel = Vector3(velocity.x,0,velocity.z)
var future = feet.global_position + horizontalVel
#raycast prep
var spaceState = get_world_3d().direct_space_state
#starting above the future pos in case of upward slopes
var rayStart = future + Vector3(0,1,0)
var rayEnd = future + Vector3(0,-5,0)
#setUp rayCast
var rayQuery = PhysicsRayQueryParameters3D.create(rayStart,rayEnd)
#so we dont hit ourselves xd
rayQuery.exclude = [self.get_rid()]
#now lets shoot this bad boyyy
var intersect = spaceState.intersect_ray(rayQuery)
#results time!!!!
if intersect:
#we want to return the distance from now to the future
return feet.global_position.y - intersect.position.y
else:
#if it hits nothing we are fucking flying lets return so fucking much
return 0```
devlog - 00
today i thought about the idea of the game it will be inspired by a song i heard as a kid of a green man in a green world and he encounters a blue man “from a whole different story” the story is that you are a blue man who is sick from the inequality so you go to a mission killing all the green top % to get to a teal world from which comes the name: the way to teal(just kill)
it will be a movement shooter made in godot i will try to create the assets myself but i might end up using some free models
for now we will just use this bean with hands