Love Creating Experiences. Love Making Games.
Heya, I'm Deep, a game developer who loves building, shipping and to prototype with different game ideas, with experience in different aspects of game development but loves programming the most.






A Simple Game I made for Codeday Lucknow 2026 Workshop about basic of Game Development and demonstration in Godot.
A Development Sandbox made in unreal engine using both c++ and blueprint, Fully replicated. Planning to make this into a sandbox which will contain my game dev shenanigans.
A drifting game with a mix of real life and arcadey fun, with scoring system and dynamic assisted drifting. Got inspired to make a drifting game by Japanese car culture.
Fixed-camera survival horror inspired by original Resident Evil & Silent Hill. Game simulates visuals similar to ps1 games and other limitations they had which gives it that unique visuals.
3D Pixelated dungeon crawler with procedural generation, optimized to run on Raspberry Pi. Showcased at Hack Club Shiba in a physical arcade cabinet!
First-person integration of Epic's GASP with Dual-mesh FPV system. Planning to make it into a fast-paced first-person zombie parkour game. With custom hero props made in Blender.
A Learning project that I made to teach myself about the Animation workflow in game dev and how to build a combat system using custom animations.
Zone-based first-person RPG built to learn about large-scale world building mainly with Enemy AI, animations, custom shaders & melee combat.
Cute Chibi-style 2D zombie platformer with a companion character called ghosty with proper ending. My very first game without any full game tutorials.
Game Developer who builds, ships and loves to prototypes with different game ideas across different game engines like Unreal Engine, Godot, and Unity. I love to learn new pipelines, workflows and tools that improve my games and skills. I enjoy exploring both the technical and creative sides of building projects.
I like experimenting with new ideas, building projects from scratch, learning new things, solving problems and seeing ideas come to life. I also love helping people and sharing what I learn with others.
Recently graduated from high school, I was and am shipping games in my spare time and loving every second of it.
▶ PLAY MY GAMES
void USActionComponent::ServerStartAction_Implementation(AActor* InstigatorActor, FGameplayTag NameTag) { StartActionByName(InstigatorActor, NameTag); } bool USActionComponent::StartActionByName(AActor* Instigator, FGameplayTag NameTag) { SCOPE_CYCLE_COUNTER(STAT_StartActionByName); UE_LOG(LogTemp, Warning, TEXT("StartActionByName called with: %s, Actions.Num=%d"), *NameTag.ToString(), Actions.Num()); for (USAction* Action : Actions) { if (IsValid(Action) && Action->GetNameTag() == NameTag) { if (!Action->CanStartAction(Instigator)) { continue; } if (!GetOwner()->HasAuthority()) { ServerStartAction(Instigator, NameTag); } else { Action->StartAction(Instigator); } TRACE_BOOKMARK(TEXT("StartAction: %s"), *GetNameSafe(Action)); return true; } } return false; } void USActionComponent::ServerStopAction_Implementation(AActor* InstigatorActor, FGameplayTag NameTag) { StopActionByName(InstigatorActor, NameTag); } bool USActionComponent::StopActionByName(AActor* Instigator, FGameplayTag NameTag) { for (USAction* Action : Actions) { if (IsValid(Action) && Action->GetNameTag() == NameTag) { if (Action->GetIsActionRunning()) { if (!GetOwner()->HasAuthority()) { ServerStopAction(Instigator, NameTag); } else { Action->StopAction(Instigator); } return true; } } } return false; }
bool USAction::CanStartAction_Implementation(AActor* Instigator) { if (GetIsActionRunning()) { return false; } USActionComponent* ActionComp = GetOwningComponent(); if (ActionComp->ActiveGameplayTags.HasAny(BlockedTags)) { return false; } return true; } void USAction::StartAction_Implementation(AActor* Instigator) { UE_LOG(LogTemp, Log, TEXT("Running Action: %s"), *GetNameSafe(this)) USActionComponent* ActionComp = GetOwningComponent(); ActionComp->ActiveGameplayTags.AppendTags(GrantsTags); bIsActionRunning = true; } void USAction::StopAction_Implementation(AActor* Instigator) { UE_LOG(LogTemp, Log, TEXT("Stopped Action: %s"), *GetNameSafe(this)) USActionComponent* ActionComp = GetOwningComponent(); ActionComp->ActiveGameplayTags.RemoveTags(GrantsTags); bIsActionRunning = false; }
UENUM(BlueprintType) enum class EMoveAxis : uint8 { X, Y, Z }; UCLASS() class PROJECTIDK_API USCheatManager : public UCheatManager { GENERATED_BODY() public: UFUNCTION(Exec) void HealSelf(float Amount = -1.0f); UFUNCTION(Exec) void DamageSelf(float Amount = -1.0f); UFUNCTION(Exec) void GrantCoin(int32 Amount = 1000); UFUNCTION(Exec) void KillAll(); UFUNCTION(Exec) void MoveInDirectionBy(float ByCm = 200, EMoveAxis Axis = EMoveAxis::Z); };
void USCheatManager::HealSelf(float Amount) { APlayerController* MyPC = GetOuterAPlayerController(); if (APawn* MyPawn = MyPC->GetPawn()) { USAttributeComponent* AttributeComp = USAttributeComponent::GetAttributes(MyPawn); if (Amount < 0) { Amount = AttributeComp->GetMaxHealth(); } AttributeComp->ApplyHealthChange(MyPawn, Amount); } } void USCheatManager::DamageSelf(float Amount) { APlayerController* MyPC = GetOuterAPlayerController(); if (APawn* MyPawn = MyPC->GetPawn()) { USAttributeComponent* AttributeComp = USAttributeComponent::GetAttributes(MyPawn); if (Amount < 0) { Amount = AttributeComp->GetMaxHealth(); } AttributeComp->ApplyHealthChange(MyPawn, -Amount); } } void USCheatManager::GrantCoin(int32 Amount) { APlayerController* MyPC = GetOuterAPlayerController(); if (APawn* MyPawn = MyPC->GetPawn()) { ASPlayerState* SPlayerState = MyPawn->GetPlayerState<ASPlayerState>(); if (IsValid(SPlayerState)) { SPlayerState->ApplyCreditChange(MyPawn, Amount); } } } void USCheatManager::KillAll() { APlayerController* MyPC = GetOuterAPlayerController(); if (APawn* MyPawn = MyPC->GetPawn()) { for (TActorIterator<ASAICharacter> It(GetWorld()); It; ++It) { ASAICharacter* Bot = *It; USAttributeComponent* AttributeComp = USAttributeComponent::GetAttributes(Bot); if (AttributeComp && AttributeComp->GetIsAlive()) { AttributeComp->Kill(MyPawn); } } } } void USCheatManager::MoveInDirectionBy(float ByCm, ::EMoveAxis Axis) { APlayerController* MyPC = GetOuterAPlayerController(); if (ACharacter* MyCharacter = MyPC->GetCharacter()) { if (UCharacterMovementComponent* MoveComp = MyCharacter->GetCharacterMovement()) { MoveComp->Velocity = FVector::ZeroVector; } FVector Direction = FVector::ZeroVector; switch (Axis) { case EMoveAxis::X: Direction = MyCharacter->GetActorForwardVector(); break; case EMoveAxis::Y: Direction = MyCharacter->GetActorRightVector(); break; case EMoveAxis::Z: Direction = FVector::UpVector; break; } MyCharacter->AddActorWorldOffset(Direction * ByCm, false); } }


import bpy step = 2 ## determines the step obj = bpy.context.active_object if obj and obj.animation_data and obj.animation_data.action: action = obj.animation_data.action for fcurve in action.fcurves: keys = fcurve.keyframe_points # remove keys except every nth for i in reversed(range(len(keys))): if i % step != 0: keys.remove(keys[i]) # set constant interpolation for kp in keys: kp.interpolation = 'CONSTANT' # refresh UI for area in bpy.context.screen.areas: if area.type in {'DOPESHEET_EDITOR', 'GRAPH_EDITOR'}: area.tag_redraw() else: print("Select an object with animation.")
shader_type canvas_item; uniform sampler2D screen_tex: hint_screen_texture, repeat_disable, filter_nearest; // get what is being rendered, tells Godot to not tile it and use pixel-perfect sampling so it doesnt get blurry // 4×4 ps1 ordered dither matrix, it hold the offset values that gets applied to each pixel depending on its screen postion const float dither[16] = float[16]( -4.0, 0.0, -3.0, 1.0, 2.0, -2.0, 3.0, -1.0, -3.0, 1.0, -4.0, 0.0, 3.0, -1.0, 2.0, -2.0 ); void fragment() { // fragment func lets you manipulation each pixel vec3 screen_color = texture(screen_tex, UV).rgb; // get the rgb color of the pixel // this gets where the pixel sit in the dither matrix int x = int(FRAGCOORD.x) % 4; // FRAGCOORD is the pixel's actual 2D screen postion and % get it to 0 to 3 range int y = int(FRAGCOORD.y) % 4; int index = y * 4 + x; // converts 2D coordinates into a flat array index float dither_offset = (dither[index] / 8.0); // gets the offset vec3 quantized_color = floor((screen_color * 255.0) / 8.0 + dither_offset) / 31.0; // quantizes 8bit color with dither offset to a 5bit color COLOR = vec4(quantized_color, 1); // applies the color and 1 is the alpha value }
shader_type spatial; render_mode blend_mix, cull_back, depth_prepass_alpha, shadows_disabled, specular_disabled, vertex_lighting; // these just strips the modern rendering features uniform sampler2D base_tex: source_color, filter_nearest; // Its a parameter in the shader for the material base color uniform vec2 texture_tile = vec2(1, 1); // tiles the texture uniform vec2 texture_offset = vec2(0, 0); // offset if needed uniform bool snap_enabled = true; // should have jitter effect? uniform float snap_res: hint_range(60.0, 480.0, 1) = 128.0; // smaller value more jitter, fake resolution for vertex positions void vertex() { // runs for every vertex in a mesh and lets you manipulate it, we are reversing the modern rendering pipeline so we can inject our code into it vec4 view_space_pos = MODELVIEW_MATRIX * vec4(VERTEX, 1.0); // object space to view space vec4 clip_space_pos = PROJECTION_MATRIX * view_space_pos; // view space to clip space if (snap_enabled) { vec2 ndc = clip_space_pos.xy / clip_space_pos.w; // converts it into NDC (Normalized Device Coordinates, the –1 to +1 screen space) by dividing it by the forth direction of the modern clip space w ndc = round(ndc * snap_res) / snap_res; // locks the vertex to one of the point in the fake res across the screen clip_space_pos.xy = ndc * clip_space_pos.w; // converts back to clip space } POSITION = clip_space_pos; // sets the postion } void fragment() { // in fragment shader we are only applying back the textures vec4 base = texture(base_tex, UV * texture_tile + texture_offset); ALBEDO = base.rgb; ALPHA = base.a; }
const RARITY_WEIGHTS : Dictionary = { "Mythic": 1, "Legendary": 2, "Epic": 4, "Rare": 8, "Common": 13 } func pick_weighted_rarity() -> String: var pool: Array[String] = [] var luck_factor: float = player.StatsManager.stats.luck for rarity: String in allrarity: if rarity in RARITY_WEIGHTS: var base_weight: float = RARITY_WEIGHTS[rarity] var luck_boost: float = 1.0 match rarity: "Mythic": luck_boost = 1.0 + (luck_factor * 10.0) "Legendary": luck_boost = 1.0 + (luck_factor * 7.0) "Epic": luck_boost = 1.0 + (luck_factor * 5.0) "Rare": luck_boost = 1.0 + (luck_factor * 2.0) "Common": luck_boost = 1.0 - (luck_factor * 0.2) var adjusted_weight := int(base_weight * luck_boost) for _i in range(adjusted_weight): pool.append(rarity) return pool.pick_random()
func push_rigid_bodies() -> void: for i: int in get_slide_collision_count(): var c: KinematicCollision3D = get_slide_collision(i) if c.get_collider() is RigidBody3D: var push_dir: Vector3 = -c.get_normal() var velocity_diff_in_push_dir: float = self.velocity.dot(push_dir) - c.get_collider().linear_velocity.dot(push_dir) velocity_diff_in_push_dir = max(0., velocity_diff_in_push_dir) const MY_APPROX_MASS_KG: int = 80 var mass_ratio: float = min(1., MY_APPROX_MASS_KG / c.get_collider().mass) if mass_ratio < 0.25: continue push_dir.y = 0 var push_force: float = mass_ratio * 5.0 #magic number c.get_collider().apply_impulse(push_dir * velocity_diff_in_push_dir * push_force, c.get_position() - c.get_collider().global_position)