Parasight ( A Metroidvania )

Hi guys, if you didn’t know I’m making a game … about robots over here I’ll be posting art, code.. but not lore … no spoilers :shushing_face:

2 Likes

So the idea of my game is a Metroidvania where u have a gun and u PEW-PEW Enemies…
Idle 1
Idk…

2 Likes

Ohh yeah, I forgot to mention the main villain is a parasite…

2 Likes

Cool!!!

Are there swamps?

2 Likes

Yep, that’s what the green area on the map represents.

1 Like

are you going to be adding symbols for the map?(like abilities, locks, and keys(locks and keys is just what I’m calling rooms you need something too get to))

2 Likes

Yeah, the map we have here is just a simple version, but it’s a great starting point!

1 Like

So far I’ve made the Auto-load code which is also connected to my player code.

extends Node2D

This will store the player’s position and abilities

var player_position: Vector2 = Vector2(0, 0) # Starting position (x, y)
var has_ability: bool = false # Does the player have an ability?

Reference to the actual player node

var player_node: Node2D = null

Called when the autoload is initialized

@onready var player_scene = preload(“res://Scene Folder/player.tscn”) # Adjust to your player scene path

func _ready():

Check if we are in the gameplay scene and instantiate the player there

if get_tree().current_scene.name == “GameScene”: # Make sure it’s the gameplay scene
if player_node == null:
player_node = player_scene.instantiate()
get_tree().current_scene.add_child(player_node) # Add the player to the current scene

		# Set player position from stored data (only if needed)
		player_node.position = player_position

Updates the player’s position (if needed)

func set_player_position(new_position: Vector2):
player_position = new_position
if player_node:
player_node.position = new_position

Updates the player’s ability status

func set_player_ability(has_ability_status: bool):
has_ability = has_ability_status

extends CharacterBody2D

@export var walk_speed = 50
@export var run_speed = 100
@export_range(0,1) var acceleration = 0.1
@export_range(0,1) var deceleration = 0.1

@export var jump_force = -267
@export_range(0,1) var decelerate_on_jump_release = 0.5

@export var dash_speed = 300
@export var dash_max_distance = 50
@export var dash_curve : Curve
@export var dash_cooldown = 1.0

@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D
@onready var dash_player: AudioStreamPlayer = $DashPlayer
@onready var jump_sound: AudioStreamPlayer = $JumpSound
@onready var run_sound: AudioStreamPlayer = $RunSound

var is_dashing = false
var dash_start_position = 0
var dash_direction = 0
var dash_timer = 0

Renamed the method to avoid conflict with the built-in position property

func set_player_position(new_position: Vector2) → void:
position = new_position # Update the player’s position globally

func set_ability(has_ability: bool) → void:

Example ability logic: You can add ability-related code here

if has_ability:

Enable some ability (e.g., unlock a special move)

pass
else:

Disable ability

pass

func _physics_process(delta: float) → void:

Add the gravity.

if not is_on_floor():
velocity += get_gravity() * delta

# Handle jump.
if Input.is_action_just_pressed("jump") and (is_on_floor() or is_on_wall()):
	velocity.y = jump_force
	jump_sound.play()

if Input.is_action_just_released("jump") and velocity.y < 0:
	velocity.y *= decelerate_on_jump_release

# Flip the character
# And also the directional movment.
var direction := Input.get_axis("left", "right")

# Flip the character
if direction > 0:
	animated_sprite_2d.flip_h = false
elif direction < 0:
	animated_sprite_2d.flip_h = true

# Player animations
if is_on_floor():
	if direction == 0:
		animated_sprite_2d.play("idle")
	else:
		animated_sprite_2d.play("run")
else:
	animated_sprite_2d.play("jump")


# I Show Speed
var speed
if Input.is_action_pressed("run"):
	speed = run_speed
else:
	speed = walk_speed


if direction:
	velocity.x = move_toward(velocity.x, direction * speed, speed * acceleration)
else:
	velocity.x = move_toward(velocity.x, 0, walk_speed * deceleration)

# I Show Dash
if Input.is_action_just_pressed("dash") and direction and not is_dashing and dash_timer <= 0:
	is_dashing = true
	dash_start_position = position.x
	dash_direction = direction
	dash_timer = dash_cooldown
	
# I am DASH
if is_dashing:
	dash_player.play()
	animated_sprite_2d.play("dash")
	var current_distance = abs(position.x - dash_start_position)
	if current_distance >= dash_max_distance or is_on_wall():
		is_dashing = false
	else:
		velocity.x =dash_direction * dash_speed  * dash_curve.sample(current_distance / dash_max_distance)
		velocity.y = 0
		
if dash_timer > 0:
	dash_timer -= delta


move_and_slide()

I’m going for a Dewdrop Dynasty Look…

2 Likes

The GUI I currently have sucks I know.

1 Like

Strong stuff you’ve got here art-wise!
Any GDD or plans for how the game will play, or the main mechanics?

1 Like

(post deleted by author)

I’m building the demo first so I can see if the idea works.

Core mechanics so far: shooting, recoil movement, platforming, and enemies that react to hits.

I don’t have a full GDD yet — I sketch ideas in my notebook and expand them as I build

Nice! I don’t use a GDD either, but I’ve found that a task tracker works well for my needs.

Those core mechanics seem pretty standard - what’s the unique mechanic that can set this game apart? It’s a metroidvania, so I’m guessing there’ll be unlockable abilities?