~jheckt/TextEscape

95acc337c9fd9f24fd2b8b865b86e42f5b423474 — Jeremy Heckt 5 months ago 13e0b63
game finished
A Exports/TextEscape.dmg => Exports/TextEscape.dmg +0 -0
A Exports/TextEscape.pck => Exports/TextEscape.pck +0 -0
A Exports/TextEscape.sh => Exports/TextEscape.sh +4 -0
@@ 0,0 1,4 @@
#!/bin/sh
echo -ne '\033c\033]0;TextEscape\a'
base_path="$(dirname "$(realpath "$0")")"
"$base_path/TextEscape.x86_64" "$@"

A Exports/TextEscape.x86_64 => Exports/TextEscape.x86_64 +0 -0
A Screenshot.png => Screenshot.png +0 -0
A Screenshot.png.import => Screenshot.png.import +34 -0
@@ 0,0 1,34 @@
[remap]

importer="texture"
type="CompressedTexture2D"
uid="uid://cl31tj3tvonb3"
path="res://.godot/imported/Screenshot.png-4041fbd5caf1794319b3e76676513bf0.ctex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://Screenshot.png"
dest_files=["res://.godot/imported/Screenshot.png-4041fbd5caf1794319b3e76676513bf0.ctex"]

[params]

compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

M Scripts/Commands.gd => Scripts/Commands.gd +49 -12
@@ 9,12 9,9 @@ var usable_commands = [
	"look",
	"pickup",
	"use",
	"listen",
	"examine",
	"inventory",
	"door",
	"map"
]
	"door"]

var command_defs = {
	"?": "Help menu",


@@ 22,11 19,9 @@ var command_defs = {
	"look": "Look around the room",
	"pickup": "Pickup something",
	"use": "Use an item in your inventory",
	"listen": "Listen carefully (sfx)",
	"examine": "Examine something, room or inventory",
	"inventory": "View your inventory",
	"door": "Move through the door in that direction",
	"map": "You forgot pad and pen."
}

###############################################################################


@@ 50,7 45,9 @@ func handle_look():
			return_text = info.LightLookText + "\n" + "Noticed doorways: " + doors_info
			get_tree().call_group("DisplayArea", "display_text", return_text)
			get_tree().call_group("DisplayArea", "display_text", "")
			get_tree().call_group("DisplayArea", "display_text_effect", "Climb Out Of The Basement!", "blood")
			get_tree().call_group("DisplayArea", "display_text_effect", "Climb Out Of The Basement! Go Down and Right!", "blood")
			get_tree().call_group("DisplayArea", "display_text", "You hear a crash from the door to your left, and a shadoy figure appears in the frame.")
			GameState.is_baddie_spawned = true
			return

		return_text = info.LightLookText + "\n" + "Noticed doorways: " + doors_info


@@ 136,6 133,16 @@ func handle_examine(target):

func handle_door(direction):

	## If the direction does not exist we cannot go that way
	if !GameState.room_connection_map[GameState.current_room].has(direction.to_lower()):
		get_tree().call_group("DisplayArea", "display_text", "There is no door that way.")
		return

	## If the baddie is there then you cannot go there
	if GameState.is_baddie_spawned && GameState.baddie_in_room == GameState.room_connection_map[GameState.current_room][direction.to_lower()]:
		get_tree().call_group("DisplayArea", "display_text", "The shadowy figure is blocking your way in this direction. They are coming closer!")
		return

	## If the basement is not unlocked we cannot go down at all
	if !GameState.is_basement_door_unlocked && direction == "down":
		get_tree().call_group("DisplayArea", "display_text", "The door is is locked.")


@@ 146,14 153,44 @@ func handle_door(direction):
		get_tree().call_group("DisplayArea", "display_text", "The door is is locked.")
		return

	## If the direction does not exist we cannot go that way
	if !GameState.room_connection_map[GameState.current_room].has(direction.to_lower()):
		get_tree().call_group("DisplayArea", "display_text", "There is no door that way.")
		return

	if GameState.room_connection_map[GameState.current_room][direction] && GameState.room_connection_map[GameState.current_room][direction] != "":
		

		## If the baddie is spawned, update their room to the last one we were in
		if GameState.is_baddie_spawned:
			GameState.baddie_in_room = GameState.current_room

		
		GameState.current_room = GameState.room_connection_map[GameState.current_room][direction.to_lower()]

		## If the baddie was spawned then check if we are in a one exit room
		if GameState.one_exit_rooms.has(GameState.current_room) && GameState.is_baddie_spawned:

			if GameState.current_room == "chemicalstore":
				if GameState.inventory.has("crampons"):
					get_tree().call_group("DisplayArea", "display_text", "You have moved to another area.")
					get_tree().call_group("DisplayArea", "display_text", "The shadowy figure is right on your tail. You look up at the ceiling in the back of the room and see a dirt tunnel with a rope dangling down. You remember you picked up those [hint=use][u]crampons[/u][/hint] and can use them to climb up the wall.")
					GameState.is_game_over = true
					return

				else:
					get_tree().call_group("DisplayArea", "display_text", "You have moved to another area.")
					get_tree().call_group("DisplayArea", "display_text", "The shadowy figure is right on your tail. You look up at the ceiling in the back of the room and see a dirt tunnel with a rope dangling down. You remember those crampons that were in the restroom that you never picked up. The shadowy figure grabs for your hair and shirt with unnantural speed, and pulled you down. You are done for.")
					get_tree().call_group("DisplayArea", "display_text", "")
					get_tree().call_group("DisplayArea", "display_text", "Please type 'quit the game' to quit the game.")
					GameState.is_game_over = true
					return

			else:
				get_tree().call_group("DisplayArea", "display_text", "You have moved to another area.")
				get_tree().call_group("DisplayArea", "display_text", "The shadowy figure is right on your tail. You realize that this room has no other exits. The shadowy figure grabs for your hair and shirt with unnantural speed, and pulled you down. You are done for.")
				get_tree().call_group("DisplayArea", "display_text", "")
				get_tree().call_group("DisplayArea", "display_text", "Please type 'quit the game' to quit the game.")
				GameState.is_game_over = true
				return

		get_tree().call_group("DisplayArea", "display_text", "You have moved to another area.")

		return

	## If the room does not exist or is not described for now we will display a message

M Scripts/DisplayArea.gd => Scripts/DisplayArea.gd +38 -0
@@ 71,7 71,45 @@ func handle_command(text):
	var command = textsplit[0]
	var args = textsplit.slice(1)


	## If the game is over, intercept first and only allow the player to quit
	if GameState.is_game_over:
		if command != "quit":
			display_text("Please type 'quit the game' to quit the game.")
			return


	## First we have to limit some actions when we put in the battery
	if GameState.inventory.has("battery") && !GameState.is_battery_used:
		if command != "use":
			display_text("You should use the [hint=use][u]battery[/u][/hint] first so you can see what is going on.")
			return
	
		if args.size() > 0:
			if args[0] != "battery":
				display_text("You should use the [hint=use][u]battery[/u][/hint] first so you can see what is going on.")
				return
			if args[0] == "battery":
				GameState.is_battery_used = true
				display_command(command, args)
				Commands.handle_use(args[0])
				return

	
	## If we have the battery in we cannot move until we look at the current room
	if GameState.is_battery_used && !GameState.has_seen_message:
		if command != "look":
			display_text("You should [hint=look][u]look[/u][/hint] around the room first so you can see what is going on.")
			return

		if command == "look":
			GameState.has_seen_message = true
			display_command(command, args)
			Commands.handle_look()
			return



	## First, if we ask for help or fail to enter a command then do that:
	if command not in Commands.usable_commands:
		display_text("[color=red]Invalid command: [/color]" + command)

M Scripts/GameState.gd => Scripts/GameState.gd +15 -2
@@ 7,6 7,9 @@ extends Node
var current_room = "startroom"
var items_in_room = PackedStringArray()
var is_light_on = false
var is_battery_used = false

var is_game_over = false

var room_items_interacted = {}



@@ 32,6 35,9 @@ var room_connection_map = {
		"right": "hallway",
		"left": "closet"
	},
	"closet": {
		"right": "restroom"
	},
	"kitchen": {
		"left": "emptypantry"
	},


@@ 50,11 56,16 @@ var room_connection_map = {
	"toolroom": {
		"left": "basementhallway",
		"right": "chemicalstore"
	},
	"chemicalstore": {
		"left": "toolroom"
	}
}

var one_exit_rooms = ["closet", "kitchen", "basementcloset", "chemicalstore"]


var inventory = ["battery"]
var inventory = []
var all_items_grabbed = [] # For knowing which items to remove from descriptions
var all_items_used = [] # All items SUCCESSFULLY used so as to not be used again



@@ 64,7 75,7 @@ var all_items_can_pickup = {
	"collapsedstore": [""],
	"emptypantry": ["can"],
	"basemententrance": [""],
	"restroom": ["crampons", "wire"],
	"restroom": ["crampons"],
	"closet": ["bkey"],
	"hallway": [""],
	"kitchen": ["ckey"],


@@ 87,6 98,8 @@ var is_closet_unlocked = false

## Baddie
var is_baddie_spawned = false
var baddie_in_room = "collapsedstore"
var has_seen_message = false


###############################################################################

M Scripts/Interactions.gd => Scripts/Interactions.gd +13 -6
@@ 6,11 6,12 @@ extends Node
## "Global" variables
###############################################################################
var interactions_map = {
	"can"	 : Callable(self, "use_can_on_scale"),
	"ckey"	 : Callable(self, "use_closet_key"),
	"bkey"	 : Callable(self, "use_basement_key"),
	"crowbar": Callable(self, "use_crowbar"),
	"battery": Callable(self, "use_battery"),
	"can"	  : Callable(self, "use_can_on_scale"),
	"ckey"	  : Callable(self, "use_closet_key"),
	"bkey"	  : Callable(self, "use_basement_key"),
	"crowbar" : Callable(self, "use_crowbar"),
	"battery" : Callable(self, "use_battery"),
	"crampons": Callable(self, "use_crampons")
}

###############################################################################


@@ 33,6 34,7 @@ func use_basement_key():

func use_crowbar():
	get_tree().call_group("DisplayArea", "display_text", "You use the crowbar to pry open the wooden crate. The crowbar breaks in the process, making a loud noise.")
	get_tree().call_group("DisplayArea", "display_text", "You should examine the [hint=examine][u]crate[/u][/hint] again to see what is inside.")
	GameState.is_crate_open = true
	GameState.all_items_used.append("crowbar")
	GameState.is_baddie_spawned = true


@@ 43,8 45,13 @@ func use_battery():
	GameState.all_items_used.append("battery")

func use_crampons():
	get_tree().quit()
	if GameState.is_baddie_spawned && GameState.current_room == "chemicalstore":
		get_tree().call_group("DisplayArea", "display_text", "You climb out of the tunnel and slam open a basement door. You run out into the dark forest, free and alive.")
		get_tree().call_group("DisplayArea", "display_text", "You win!")
		get_tree().call_group("DisplayArea", "display_text", "Type 'quit the game' to quit the game!")

	else:
		get_tree().call_group("DisplayArea", "display_text", "There is no real reason to use these right now.")

###############################################################################
## Mains

M Scripts/text_line.gd => Scripts/text_line.gd +1 -0
@@ 18,6 18,7 @@ func handle_effect():
			$TextArea.material = ShaderMaterial.new()
			$TextArea.material.shader = blood_shader
			is_shader_set = true
			$TextArea.add_theme_font_size_override("normal_font_size", 32)




M Scripts/text_line.gdshader => Scripts/text_line.gdshader +13 -15
@@ 1,20 1,18 @@
shader_type canvas_item;
uniform vec4 color = vec4(1, 0.05, 0, 1);

uniform sampler2D flowMap; //Displacement map
uniform float strength;    //Force of the effect
uniform float speed;       //Speed of the effect
uniform int frames : hint_range(1, 10); //Frames of the effect
void fragment(){
	vec4 tex = texture(TEXTURE, UV);

    tex.r = UV.x;
    tex.g *= color.g;
    tex.b *= color.b;
    tex.a *= color.a;

//Returns a value between 0 and 1 depending of the frames -> exemple: frames = 4, frame 1 = 0.25
float clock(float time){
	float fframes = float(frames);
	return floor(mod(time * speed, fframes)) / fframes;
    COLOR = tex;
}

void fragment(){
	float c = clock(TIME); //Get clock frame
	vec4 offset = texture(flowMap, vec2(UV.x + c, UV.y + c)) * strength; //Get offset 
	//COLOR = texture(TEXTURE, vec2(UV.x,UV.y) + normal.xy); //Apply offset
	//COLOR = texture(TEXTURE, vec2(UV.x,UV.y) + offset.xy - vec2(0.5,0.5)*strength); //We need to remove the displacement 
	COLOR = vec4(offset.xy, 0.5, 1.0); //Debug
}
\ No newline at end of file
// void vertex() {
//   // Animate Sprite2D moving in big circle around its location
//   VERTEX += vec2(cos(TIME)*100.0, sin(TIME)*100.0);
// }
\ No newline at end of file

M Texts/basementcloset.txt => Texts/basementcloset.txt +1 -1
@@ 1,7 1,7 @@
--Type: Location
--Effects: None
--Light: No
--Doors: Right,Left
--Doors: Right
--Items: pockets
--UseItems: can--scale
--DarkLookText: A small closet that seems to be holding multiple jackets. You feel [hint=examine][u]pockets[/u][/hint] on at least one jacket.

M Texts/basemententrance.txt => Texts/basemententrance.txt +1 -1
@@ 4,4 4,4 @@
--Doors: Left,Right,Up
--Items: jars
--DarkLookText: You feel around a room with a dusty floor. You can feel some [hint=examine][u]jars[/u][/hint] piled up against one wall.
--LightLookText: You can see an entrance to a long and windy basement. There are jars full of rotten pickles against one wall, indicating that this room has not be cared for by anybody for quite some time.
--LightLookText: You can see an entrance to a long and winding basement. There are jars full of rotten pickles against one wall, indicating that this room has not be cared for by anybody for quite some time.

M Texts/chemicalstore.txt => Texts/chemicalstore.txt +2 -2
@@ 3,6 3,6 @@
--Light: No
--Doors: Left
--Items: 
--UseItems: crampons
--UseItems: crampons--win
--DarkLookText: You feel around a room full of glass beakers. It has a strong chemical stench, almost like a mixture of bleach and cat urine.
--LightLookText: You are in some sort of makeshift chemistry laboratory. You see jars full of liquids that are varying shades of yellow and brown. You can see a tunnel dug into the dirt in the ceiling. You may be able to climb out if you have some way to get a better grip with your shoes.
\ No newline at end of file
--LightLookText: You are in some sort of makeshift chemistry laboratory. You see jars full of liquids that are varying shades of yellow and brown. You can see a tunnel dug into the dirt in the ceiling with a rope hanging down. You may be able to climb out if you have some way to get a better grip with your shoes.
\ No newline at end of file

M Texts/emptypantry.txt => Texts/emptypantry.txt +2 -2
@@ 1,7 1,7 @@
--Type: Location
--Effects: None
--Light: No
--Doors: Left,Right,Down
--Items: shelving,bread,can
--Doors: Left,Right
--Items: bread,can
--DarkLookText: You feel around you and you can tell that this is a small room with a lot of shelving. The shelves are pretty empty. {can}You find a sealed [hint=pickup][u]can[/u][/hint] of some kind of thick liquid.{/can} You feel what appears to be a stale loaf of [hint=examine][u]bread[/u][/hint].
--LightLookText: You see around a room that was clearly previously a pantry. There is a lot of shelving. The shelves are pretty empty. {can}You see a sealed [hint=pickup][u]can[/u][/hint] of some kind of thick liquid.{/can} You see a stale loaf of [hint=examine][u]bread[/u][/hint].
\ No newline at end of file

M Texts/restroom.txt => Texts/restroom.txt +3 -3
@@ 2,7 2,7 @@
--Effects: None
--Light: No
--Doors: Left,Right
--Items: crampons,wire
--Items: crampons
--UseItems: ckey--door
--DarkLookText: You feel around the restroom, which is finally a familiar shape to you. It is standard. There is a closed door to the left. {crampons}You check the baby-changing area and find that someone left what felt like [hint=pickup][u]crampons[/u][/hint] attached to some terribly broken boots.{/crampons} {wire}You bravely feel your hand into the trash bin and you can feel some loose [hint=pickup][u]wire[/u][/hint].{/wire} Maybe if you had a closet key you could open the door to the left.
--LightLookText: You see a standard restroom. There is a closed door to the left. The restroom has an odor similar to most. The sink has a pool of red liquid in the bottom, and does not seem to be draining. The toilet has no seat and the bowl is cracked. {crampons}You see near the baby-changing area that someone left what felt like [hint=pickup][u]crampons[/u][/hint] attached to some terribly broken boots.{/crampons} {wire}In the trash bin you can see some loose [hint=pickup][u]wire[/u][/hint]{/wire}. Maybe if you had a closet key you could open the door to the left.
\ No newline at end of file
--DarkLookText: You feel around the restroom, which is finally a familiar shape to you. It is standard. There is a closed door to the left. {crampons}You check the baby-changing area and find that someone left what felt like [hint=pickup][u]crampons[/u][/hint] attached to some terribly broken boots.{/crampons} {wire}You bravely feel your hand into the trash bin and you can feel some loose wire.{/wire} Maybe if you had a closet key you could open the door to the left.
--LightLookText: You see a standard restroom. There is a closed door to the left. The restroom has an odor similar to most. The sink has a pool of red liquid in the bottom, and does not seem to be draining. The toilet has no seat and the bowl is cracked. {crampons}You see near the baby-changing area that someone left what felt like [hint=pickup][u]crampons[/u][/hint] attached to some terribly broken boots.{/crampons} {wire}In the trash bin you can see some loose wire{/wire}. Maybe if you had a closet key you could open the door to the left.
\ No newline at end of file

M Texts/startroom.txt => Texts/startroom.txt +2 -2
@@ 4,5 4,5 @@
--Doors: Left,Right,Down
--Items: sack,crate
--UseItems: crowbar,bkey
--DarkLookText: You do not see much, but you can reach out and feel what you think is a wood [hint=examine][u]crate[/u][/hint]. Behind you can be felt a burlap [hint=examine][u]sack[/u][/hint].
--LightLookText: Looking around the room you see a wooden [hint=examine][u]crate[/u][/hint] with a red-stained lid. On the floor behind you is an empty burlap onion [hint=examine][u]sack[/u][/hint]. On the ground you see clothes from apparently several different people of different sizes. On the wall you notice blood-red lettering that reads....
--DarkLookText: You do not see much, but you can reach out and feel what you think is a wood [hint=examine][u]crate[/u][/hint]. Behind you can be felt a burlap [hint=examine][u]sack[/u][/hint]. On the ground you can feel a door that would lead to a basement.
--LightLookText: Looking around the room you see a wooden [hint=examine][u]crate[/u][/hint] with a red-stained lid. On the floor behind you is an empty burlap onion [hint=examine][u]sack[/u][/hint]. On the ground you see clothes from apparently several different people of different sizes that are covering a door to a basement. On the wall you notice blood-red lettering that reads....

A export_presets.cfg => export_presets.cfg +146 -0
@@ 0,0 1,146 @@
[preset.0]

name="macOS"
platform="macOS"
runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="Exports/TextEscape.dmg"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false

[preset.0.options]

export/distribution_type=1
binary_format/architecture="universal"
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
application/icon=""
application/icon_interpolation=4
application/bundle_identifier="TextEscape"
application/signature="Jeremy Heckt"
application/app_category="Games"
application/short_version="1.0"
application/version="1.0"
application/copyright=""
application/copyright_localized={}
application/min_macos_version="10.12"
display/high_res=true
xcode/platform_build="14C18"
xcode/sdk_version="13.1"
xcode/sdk_build="22C55"
xcode/sdk_name="macosx13.1"
xcode/xcode_version="1420"
xcode/xcode_build="14C18"
codesign/codesign=3
codesign/installer_identity=""
codesign/apple_team_id=""
codesign/identity=""
codesign/entitlements/custom_file=""
codesign/entitlements/allow_jit_code_execution=false
codesign/entitlements/allow_unsigned_executable_memory=false
codesign/entitlements/allow_dyld_environment_variables=false
codesign/entitlements/disable_library_validation=false
codesign/entitlements/audio_input=false
codesign/entitlements/camera=false
codesign/entitlements/location=false
codesign/entitlements/address_book=false
codesign/entitlements/calendars=false
codesign/entitlements/photos_library=false
codesign/entitlements/apple_events=false
codesign/entitlements/debugging=false
codesign/entitlements/app_sandbox/enabled=false
codesign/entitlements/app_sandbox/network_server=false
codesign/entitlements/app_sandbox/network_client=false
codesign/entitlements/app_sandbox/device_usb=false
codesign/entitlements/app_sandbox/device_bluetooth=false
codesign/entitlements/app_sandbox/files_downloads=0
codesign/entitlements/app_sandbox/files_pictures=0
codesign/entitlements/app_sandbox/files_music=0
codesign/entitlements/app_sandbox/files_movies=0
codesign/entitlements/app_sandbox/helper_executables=[]
codesign/custom_options=PackedStringArray()
notarization/notarization=0
privacy/microphone_usage_description=""
privacy/microphone_usage_description_localized={}
privacy/camera_usage_description=""
privacy/camera_usage_description_localized={}
privacy/location_usage_description=""
privacy/location_usage_description_localized={}
privacy/address_book_usage_description=""
privacy/address_book_usage_description_localized={}
privacy/calendar_usage_description=""
privacy/calendar_usage_description_localized={}
privacy/photos_library_usage_description=""
privacy/photos_library_usage_description_localized={}
privacy/desktop_folder_usage_description=""
privacy/desktop_folder_usage_description_localized={}
privacy/documents_folder_usage_description=""
privacy/documents_folder_usage_description_localized={}
privacy/downloads_folder_usage_description=""
privacy/downloads_folder_usage_description_localized={}
privacy/network_volumes_usage_description=""
privacy/network_volumes_usage_description_localized={}
privacy/removable_volumes_usage_description=""
privacy/removable_volumes_usage_description_localized={}
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="#!/usr/bin/env bash
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name}.app/Contents/MacOS/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
dotnet/include_scripts_content=false
dotnet/include_debug_symbols=true

[preset.1]

name="Linux/X11"
platform="Linux/X11"
runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="Exports/TextEscape.x86_64"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false

[preset.1.options]

custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
texture_format/bptc=true
texture_format/s3tc=true
texture_format/etc=false
texture_format/etc2=false
binary_format/architecture="x86_64"
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="#!/usr/bin/env bash
export DISPLAY=:0
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
\"{temp_dir}/{exe_name}\" {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
dotnet/include_scripts_content=false
dotnet/include_debug_symbols=true