the way to teal(just kill)
- 21 Devlogs
- 61 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
so pretty much all i did was new ui, make the game fit into a cartoon art style and some cover art for it
the itch.io page sucked so i made it again and its so much better now
so as always the downloadable version is much better but there is still web support
try it out: https://idotweaks.itch.io/the-way-to-tealjust-kill
last devlog i said i am done with the game but after those reviews i just cant stop
i have already made 2 mini bosses and currently am working on some more enemy types, i will change the current levels to be the story mode with added story and dialogue and add a completly new mode which i will talk about in later devlogs
if you rate it please download it, the web version is much much worse
added levels 7-9
sadly the styling system was very bad and i couldnt make it work so i just took it out
you could cheese everything with the dashes so im sorry… i added stamina
so yeah i wont work on this project anymore prob but i am starting my own asm docs! be sure to stay updated!
the boss now attacks with a couple of new attacks! you can see them in the video AND a new paralysis system
so the boss now takes you to his office where he will offer you a deal: for 20% of your health you can get your paralysis level down!
so it looks better now, thats it XD
so it is now updated in both github and itch.io but its very bad in the web versionT_T please just download
itch.io: https://idotweaks.itch.io/the-way-to-tealjust-kill
github: https://github.com/IDoTweaks/the-way-to-teal-just-kill-/releases/tag/NEWEST
btw the video was compressed and then converted so its low quality
the current boss is very lazy in design so i decided to change it completely! with a snake boss, what i did is create a self generating floor and a snake with custom pathfinding
the floor has a function that does holes in it and makes sure the snake
cannot get soft locked(since it cant pass through its own body) then the
snake turns its positon + the player’s position into a tile in the map
and using breadth first search from the head’s tile to the player’s tile it finds the next tile it needs to travel to
the reason is that this mf floor does not like generating how i want it to and i am very bad at algorithms so i had to try again and again and again and then i had to do the same thing with the snake because i havnt touched bfs in like 1.5 years
as you can see while i was on vacation this project got a super star! i am very grateful for it!
as you can see in the video it just follows the player right now, it has no attacks or something like it so i hope i can get it done by the end of this week(its saturday now so by next saturday) and it isnt wired into the game yet so its still just the old boss
As a prize for your great work, look out for a bonus prize in the mail :)
this is a large update 1.1 basically doubles the size of the game and makes it actually feel good to play heres everything:
web version is now fixed BUT its still a desktop game so its worse
github release:https://github.com/IDoTweaks/the-way-to-teal-just-kill-/releases/tag/NEWEST
itch.io:https://idotweaks.itch.io/the-way-to-tealjust-kill
yeah thats it now go kill stuff
i got a report about some web problems which did not happen to me, if you see the textures as too dark tho try downloading it
i was not able to test the mac version as well
after this im shipping this so make sure to look at my github + itch.io
github:https://github.com/IDoTweaks/the-way-to-teal-just-kill-
itch.io: https://idotweaks.itch.io/the-way-to-tealjust-kill
so in the competition the only person that submitted a score was in the
comments and late but he is now the winner:)
@Connor you won! i will add you to the game soon
the game now is in what i feel full technicality ready the only things
needed are: more levels, bosses, more enemies, more obstacles and
interesting things in general and maybe a 3rd gun but other than that
its basically ready so dont forget to playtest and lmk
itch.io:https://idotweaks.itch.io/the-way-to-tealjust-kill
also im the developer of the game so its not that hard for me to get s+
and im sure you can too so just spam ground slam its op(expect a patch
soon🫣🫣🫣)so here is a clip of me getting s+ plus you can see the ghost
after
as you can see in the last devlog the tournament said in it is starting
right now!
this is a speedrunning competition in my 1 level demo game(very early in development) in that game you cant even die yet so go wild
press r to restart + finished the end gui + fixed some score calculation
bugs
the winner will be the one with highest score by the end of the 24
hours/2:30 pm utc or the first person to reach a perfect score and he
will win being inside the game + in the next devlog
itch.io: https://idotweaks.itch.io/the-way-to-tealjust-kill
my discord: swiftfishi3
my slack: loveTheGodotDeveloper
(if there will be any edits i will put them here)
for now take a look at my fastest run(you have to wait a bit and its
mid development)- runs can only be in the current build in itch.io
DEVLOG - 10 this is a large milestone!
COMPETITION ANNOUNCEMENT AT THE END
i updated the map textures to a retro-ish style and updated the bullet holes and steps to look much better too!
i added a timer and score with a grading system that allows for better speedrunning! i added a custom finish level orb with a custom shader that makes it look super cool look at this gameplay it looks like a real game!
now the competition: so the competition will start in the next devlog because i plan to add a restart button to make it easier to speedrun and more now
THE WINNER AND PRIZE: the winner will be the person that will get the highest score in 24 hours after the devlog is posted or the first person to get a perfect score of 20k(which is very hard gl) and the prize will be (imagine a drum roll) yeah you will just be on a wall or something its not that huge i will also write about you in the next devlog if thats important to you
CLARIFICATIONS BECAUSE CLAUDE SAID THIS DEVLOG IS SHIT:
1.the competition will not be in the current build and will be submitted directly to me through slack/discord with the name you have in stardance
2.the prize is shit idk why claude treats it like i should try to deceive you into thinking its good, its bad i promise
3.if someone sends me they got a 20k score it will end idk whats confusing about it anyway only like 3 people will submit probably
itch.io:https://idotweaks.itch.io/the-way-to-tealjust-kill
(textures in web version are bugged please download!)
if you have anything to say about this devlog you may comment it and i will ignore it(unless its a real question)
anyway look at this clippp
DEVLOG - 09 i added a shotgun! the shotgun has a large cooldown + it applies force on you! + itch.io update
IF YOU DONT CARE ABOUT THE TECHNICAL STUFF WATCH THE VIDEO DOWN HERE TO JUST SEE THE COOL SHOTGUN
it was much easier to implement because all i did was add a bunch of raycasts and randomize them with this simple code:
func randomizeRays():
var i : int = 0
for ray in children:
if ray is RayCast3D:
ray.target_position.x = orgPos[i] + randf_range(-spread,spread)
i+=1
ray.target_position.y = orgPos[i] + randf_range(-spread,spread)
i+=1
the actual hard part was getting both guns to work with eachother but i managed to do that
the force function was also interesting because i use a chartacterbody3d in godot i have to make this stuff myself with basically only velocity
so the code is pretty easy to understand i dont think i need to explain much
func _applyForce(point :Vector3,force , maxRange:float = 10):
var dir = global_position - point
var dist = dir.length()
if dist > maxRange:
return
dir = dir.normalized()
var fallOff = clamp(1 - (dist/ maxRange),0,1)
velocity += dir * force * fallOff
knockbackTimer = KNOCKBACK_LOCK_TIME
also the game is now updated and free on itch.io!
link:https://idotweaks.itch.io/the-way-to-tealjust-kill
(please download it its much better than the web version because i cant solve some web specific bugs)
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
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