13 Commits
V1.3 ... main

Author SHA1 Message Date
Pasha Bibko
b97eaf1475 Fixed formatting in GameDesignDoc.md 2025-08-14 14:48:00 +01:00
Pasha Bibko
c2cd9f3466 Added game design doc 2025-05-14 21:40:20 +01:00
Pasha Bibko
f538eae622 Added images to README.md 2025-05-13 22:21:46 +01:00
Pasha Bibko
d7dc1503bc Updated README.md 2025-05-13 22:19:28 +01:00
Pasha Bibko
a50e6fe3c5 Centered image 2025-05-13 22:18:00 +01:00
Pasha Bibko
9820decad0 Tried to make image take up more space 2025-05-13 22:14:24 +01:00
Pasha Bibko
a481fbbc89 Test 2025-05-13 22:11:03 +01:00
Pasha Bibko
c742b06311 Made menu decorations work on all resolutions 2025-05-12 09:41:46 +01:00
Pasha Bibko
95a2c4b43b Fixed shaders
Removed unused shaders from project
2025-05-12 09:35:02 +01:00
Pasha Bibko
8a89758ae5 Updated README.md 2025-05-09 15:26:41 +01:00
abfc6cd910 ghfghgfhgf 2025-05-02 14:58:30 +01:00
e706d5577a jxckjgx, 2025-05-02 14:58:26 +01:00
b2530ee2b7 Did suff 2025-05-02 14:57:55 +01:00
22 changed files with 1127 additions and 618 deletions

View File

@@ -7,19 +7,17 @@ Material:
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: TransparrentRed
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_Name: EdgeDetMat
m_Shader: {fileID: 4800000, guid: 211b73cf71b1f6a48aa152214d4a886d, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: 3000
stringTagMap:
RenderType: Transparent
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
@@ -66,20 +64,20 @@ Material:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 10
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 3
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 0, b: 0, a: 0.5019608}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
m_BuildTextureStacks: []

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 45fd8ac89ef24ee4a8f8aef5818a3179
guid: b4f28ecf1d1c85941ae7097df1b9f763
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000

View File

@@ -215,7 +215,7 @@ Transform:
m_GameObject: {fileID: 4525855263416128436}
serializedVersion: 2
m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068}
m_LocalPosition: {x: 0, y: 5, z: -0.1}
m_LocalPosition: {x: 0, y: 5, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
@@ -317,6 +317,7 @@ GameObject:
m_Component:
- component: {fileID: 8290014685027761188}
- component: {fileID: 4196137517685965440}
- component: {fileID: 848597767875800347}
m_Layer: 0
m_Name: Back
m_TagString: Untagged
@@ -360,3 +361,16 @@ BoxCollider:
serializedVersion: 3
m_Size: {x: 10, y: 10, z: 5}
m_Center: {x: 0, y: 5, z: -3.5}
--- !u!114 &848597767875800347
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7967144210440699741}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 859e4c4c9b11c654a8ab3891fbd8c5b3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Manager: {fileID: 4470023418895194988}

View File

@@ -110,7 +110,7 @@ Camera:
width: 1
height: 1
near clip plane: 0.3
far clip plane: 100
far clip plane: 500
field of view: 60
orthographic: 0
orthographic size: 5

View File

@@ -78,6 +78,6 @@ Material:
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 0, b: 0, a: 1}
- _Color: {r: 0, g: 0, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
m_BuildTextureStacks: []

File diff suppressed because one or more lines are too long

View File

@@ -1406,8 +1406,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 100, y: 300}
m_SizeDelta: {x: 30, y: 500}
m_AnchoredPosition: {x: 100, y: 2000}
m_SizeDelta: {x: 30, y: 4000}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &429625967
MonoBehaviour:
@@ -1929,8 +1929,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 100, y: 150}
m_SizeDelta: {x: 30, y: 500}
m_AnchoredPosition: {x: 100, y: 1900}
m_SizeDelta: {x: 30, y: 4000}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &494790299
MonoBehaviour:
@@ -2843,8 +2843,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -100, y: 150}
m_SizeDelta: {x: 30, y: 500}
m_AnchoredPosition: {x: -100, y: 1900}
m_SizeDelta: {x: 30, y: 4000}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &891445732
MonoBehaviour:
@@ -3522,8 +3522,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 375, y: 300}
m_SizeDelta: {x: 30, y: 400}
m_AnchoredPosition: {x: 375, y: 2000}
m_SizeDelta: {x: 30, y: 4000}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1105138783
MonoBehaviour:
@@ -3708,8 +3708,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -375, y: 300}
m_SizeDelta: {x: 30, y: 400}
m_AnchoredPosition: {x: -375, y: 2000}
m_SizeDelta: {x: 30, y: 4000}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1270506661
MonoBehaviour:
@@ -4055,8 +4055,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 215, y: 300}
m_SizeDelta: {x: 30, y: 500}
m_AnchoredPosition: {x: 215, y: 2000}
m_SizeDelta: {x: 30, y: 4000}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1326695718
MonoBehaviour:
@@ -4500,7 +4500,7 @@ MonoBehaviour:
m_LineSpacing: 1
m_Text: 'Note:
Only works on red walls'
Only works on BLUE walls'
--- !u!222 &1529889363
CanvasRenderer:
m_ObjectHideFlags: 0

View File

@@ -8,6 +8,10 @@ public class GravityController
// Constant gravity scale
const float m_GravityScale = -20.0f;
Vector3 m_Up = Vector3.zero;
public static Vector3 up => s_Instance.m_Up;
// Private constructor to stop accidental creation
private GravityController() { }
@@ -27,5 +31,6 @@ public class GravityController
{
// Sets the gravity
Physics.gravity = new Vector3(0, m_GravityScale * scale, 0);
m_Up = Physics.gravity;
}
}

View File

@@ -0,0 +1,10 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PortalBack : MonoBehaviour
{
[SerializeField] PortalManager m_Manager;
// private void OnCollisionEnter(Collision collision) => m_Manager.ForceTeleport();
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 859e4c4c9b11c654a8ab3891fbd8c5b3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -18,7 +18,7 @@ public class PortalManager : MonoBehaviour
// Private variables //
PortalManager m_OtherManager;
PortalCamera m_PortalCamera;
[SerializeField] PortalCamera m_PortalCamera;
// Gets the other end of the portal
public PortalManager Linked() => m_OtherManager;
@@ -52,6 +52,23 @@ public class PortalManager : MonoBehaviour
m_PlayerPoint.position = CameraController.Instance().transform.position;
}
public void ForceTeleport()
{
// Calculates if the player is going towards the portal
Vector3 difference = PlayerMovement.Pos() - transform.position;
// Rotates the player
float rotDif = -Quaternion.Angle(transform.rotation, m_OtherManager.transform.rotation) + m_AngleDif;
CameraController.Instance().RotatePlayerDirection(new Vector2(0f, rotDif));
// Tellss the player it went through a portal
PlayerMovement.Instance().WentThroughPortal(rotDif);
// Teleports the player
Vector3 offset = Quaternion.Euler(0f, rotDif, 0f) * difference;
PlayerMovement.SetPos(m_OtherManager.transform.position + offset - new Vector3(0, 1.0f, 0));
}
// When something enters the portal
private void OnTriggerEnter(Collider other)
{

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,9 +1,9 @@
fileFormatVersion: 2
guid: ed0c2c8a99e92e14ba740ac8aa428288
TextureImporter:
internalIDToNameTable: []
fileIDToRecycleName: {}
externalObjects: {}
serializedVersion: 11
serializedVersion: 7
mipmaps:
mipMapMode: 0
enableMipMap: 1
@@ -57,33 +57,30 @@ TextureImporter:
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
applyGammaDecoding: 1
platformSettings:
- serializedVersion: 3
- serializedVersion: 2
buildTarget: DefaultTexturePlatform
maxTextureSize: 512
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
textureCompression: 2
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
- serializedVersion: 2
buildTarget: Standalone
maxTextureSize: 512
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
textureCompression: 2
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
- serializedVersion: 2
buildTarget: iPhone
maxTextureSize: 512
resizeAlgorithm: 0
@@ -94,8 +91,7 @@ TextureImporter:
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 3
- serializedVersion: 2
buildTarget: WebGL
maxTextureSize: 512
resizeAlgorithm: 0
@@ -106,7 +102,6 @@ TextureImporter:
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
spriteSheet:
serializedVersion: 2
sprites: []
@@ -114,12 +109,10 @@ TextureImporter:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 29720fcdf33dc1c44900e42bb5835507
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7abb74942295fc244bdfe8bb8236881d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
/*
███████╗██████╗░░██████╗░███████╗  ██████╗░███████╗████████╗███████╗░█████╗░████████╗██╗░█████╗░███╗░░██╗
██╔════╝██╔══██╗██╔════╝░██╔════╝  ██╔══██╗██╔════╝╚══██╔══╝██╔════╝██╔══██╗╚══██╔══╝██║██╔══██╗████╗░██║
█████╗░░██║░░██║██║░░██╗░█████╗░░  ██║░░██║█████╗░░░░░██║░░░█████╗░░██║░░╚═╝░░░██║░░░██║██║░░██║██╔██╗██║
██╔══╝░░██║░░██║██║░░╚██╗██╔══╝░░  ██║░░██║██╔══╝░░░░░██║░░░██╔══╝░░██║░░██╗░░░██║░░░██║██║░░██║██║╚████║
███████╗██████╔╝╚██████╔╝███████╗  ██████╔╝███████╗░░░██║░░░███████╗╚█████╔╝░░░██║░░░██║╚█████╔╝██║░╚███║
╚══════╝╚═════╝░░╚═════╝░╚══════╝  ╚═════╝░╚══════╝░░░╚═╝░░░╚══════╝░╚════╝░░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝
░██████╗██╗░░██╗░█████╗░██████╗░███████╗██████╗░
██╔════╝██║░░██║██╔══██╗██╔══██╗██╔════╝██╔══██╗
╚█████╗░███████║███████║██║░░██║█████╗░░██████╔╝
░╚═══██╗██╔══██║██╔══██║██║░░██║██╔══╝░░██╔══██╗
██████╔╝██║░░██║██║░░██║██████╔╝███████╗██║░░██║
╚═════╝░╚═╝░░╚═╝╚═╝░░╚═╝╚═════╝░╚══════╝╚═╝░░╚═╝
█▀▀▄ █──█   ▀▀█▀▀ █──█ █▀▀   ░█▀▀▄ █▀▀ ▀█─█▀ █▀▀ █── █▀▀█ █▀▀█ █▀▀ █▀▀█
█▀▀▄ █▄▄█   ─░█── █▀▀█ █▀▀   ░█─░█ █▀▀ ─█▄█─ █▀▀ █── █──█ █──█ █▀▀ █▄▄▀
▀▀▀─ ▄▄▄█   ─░█── ▀──▀ ▀▀▀   ░█▄▄▀ ▀▀▀ ──▀── ▀▀▀ ▀▀▀ ▀▀▀▀ █▀▀▀ ▀▀▀ ▀─▀▀
____________________________________________________________________________________________________________________________________________
▄▀█ █▀ █▀ █▀▀ ▀█▀ ▀   █░█ █░░ ▀█▀ █ █▀▄▀█ ▄▀█ ▀█▀ █▀▀   ▄█ █▀█ ▄█▄   █▀ █░█ ▄▀█ █▀▄ █▀▀ █▀█ █▀
█▀█ ▄█ ▄█ ██▄ ░█░ ▄   █▄█ █▄▄ ░█░ █ █░▀░█ █▀█ ░█░ ██▄   ░█ █▄█ ░▀░   ▄█ █▀█ █▀█ █▄▀ ██▄ █▀▄ ▄█
____________________________________________________________________________________________________________________________________________
License:
The license is ATTRIBUTION 3.0
More license info here:
https://creativecommons.org/licenses/by/3.0/
____________________________________________________________________________________________________________________________________________
This shader has NOT been tested on any other PC configuration except the following:
CPU: Intel Core i5-6400
GPU: NVidia GTX 750Ti
RAM: 16GB
Windows: 10 x64
DirectX: 11
____________________________________________________________________________________________________________________________________________
*/
Shader "Ultimate 10+ Shaders/Edge Detection" /* The edge detection algorithm that is implemented in this shader is named "Sobel Edge Detection" */
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "Queue"="Transparent" }
Cull Back
GrabPass { }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 position : POSITION;
float4 screenPos : TEXCOORD0;
};
fixed4 _Color;
sampler2D _GrabTexture : register(s0);
v2f vert(appdata input)
{
v2f output;
output.position = UnityObjectToClipPos(input.vertex);
output.screenPos = output.position;
return output;
}
half4 pixel;
half2 uv;
fixed onePixelW, onePixelH;
half4 frag(v2f input) : SV_Target
{
uv = input.screenPos.xy / input.screenPos.w;
uv.x = (uv.x + 1) * .5;
uv.y = 1.0 - (uv.y + 1) * .5;
onePixelW = 1.0 / _ScreenParams.x;
onePixelH = 1.0 / _ScreenParams.y;
pixel = 0;
pixel = abs(
tex2D(_GrabTexture, half2(uv.x - onePixelW, uv.y)) -
tex2D(_GrabTexture, half2(uv.x + onePixelW, uv.y)) +
tex2D(_GrabTexture, half2(uv.x, uv.y + onePixelH)) -
tex2D(_GrabTexture, half2(uv.x, uv.y - onePixelH))
);
return pixel * _Color;
}
ENDCG
}
}
}

View File

@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 211b73cf71b1f6a48aa152214d4a886d
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:

96
GameDesignDoc.md Normal file
View File

@@ -0,0 +1,96 @@
# **The Mobius Line**
Your job is to get to the other train platform as fast as possible. There is just one problem, no geometric rules are guaranteed to work.
### **Contents**
- 1.1 Genres
- 1.2 Target audience
- 1.3 Unique selling points
- 2.1 Player experience
- 2.2 Visual and audio style
- 2.3 Game world fiction
- 2.4 Platforms, Technology and Scope
- 3.1 Core loops
- 3.2 Objectives and Progression
- 3.3 Game systems
- 3.4 Interactivity
### **1.1 Main Genres**
The main genres for my game will be speed and non-Euclidean. Speed is implemented as a genre in my game as your goal is to get to the end of the level as fast as possible. If you do not get to the train fast enough you will have to replay the level until you reach the desired speed.
Non-Euclidean is a lesser known genre and is the description for any geometric space that does not follow Euler's rules of geometry. This can mean a variety of things but in "The Mobius Line" it is simpler to think of it as portals that teleport the player around without them noticing. This will be implemented in the levels to make it more challenging to the player to figure out the fastest way to reach the end.
### **1.2 Target audiences**
##### **Groups**
The main target audience of "The Mobius Line" will be people who like to traverse through game levels as fast as possible. The game will be interesting to them as it is the main concept of the core loop.
A secondary target audience of the game will be people who are interested in non-Euclidean geometry as it is the main way the levels are constructed. They may not be as interested in completing the levels as fast as possible but they will want to explore the levels with their unique geometry.
##### **Age rating**
Within the game there will be nothing that means the game is not appropriate for younger players as I do not want to stop someone playing my game just because of their age. Whilst the game is appropriate for all ages it will be designed for 12+ audiences with its high mechanical skill and patience requirements.
### **1.3 Unique selling points**
##### **- Competitive community**
Due to the nature of "The Mobius Line" it will have a competitive community. To facilitate this and help support it I will implement a speedrun clock for players to monitor their time as well as providing a replay feature so players can see how they got their fastest time.
##### **- Non-Euclidean gameplay**
Non-Euclidean geometry will be a large part of the game. It will attract players that would have not originally found my game interesting as well as creating a more interesting experience as exploring the levels will be a more complex task than just walking around.
##### **- High skill ceilings**
The movement in "The Mobius Line" will be designed to have a high skill ceiling. There will be a variety of mechanics that the player can use but they will not be explained to the player at the start and they will have to find special areas to learn them. This will make sure the player is always learning and improving at the game.
### **2.1 Player experience**
The game is set in the London Underground where the end and start of levels will be different platforms within a station. This should feel somewhat familiar to most players as most modern cities have an underground train system which are often quite similar to the London Underground. The player will be a person of Russian/Eastern European heritage and will be able to choose if they are a male or female. The main way the players will be kept engaged is by challenging themself to get a faster time on that level, and by exploring the levels which will intrigue their brains as they will not make sense.
### **2.2 Visual and Audio style**
The look and sound of the game is heavily inspired by the London Underground as that is where the setting of the game is. The goal of this is to make it feel familiar despite the game being set in a world that follows very different rules to ours. The game will use as much as it can from actual London Underground stations and the rest of the assets will be inspired by their real life counterparts.
The design of the tunnels is meant to mirror the differences between UK and eastern European culture. The familiarity of the tunnels echoes the similarities between the cultures. Whereas the confusing non-Euclidean aspects of the tunnels mirror the unaccepting environment.
### **2.3 Game world fiction**
The in-game world is meant to be imagined as part of our world, entering a train station in the game should feel the same as entering one on a trip into London. Real world events such as the invasions of Ukraine will be hinted at but never explicitly stated. The non-Euclidean aspects of the tunnels are meant to be something only the player experiences and no explanation of why the player and only the player experiences them is given.
### **2.4 Platforms, Technology and Scope**
The game will be made for PC only as designing it for consoles or mobile would not only require time to make it work on those devices but the controls would have to be massively redesigned due to the accuracy that mouse and keyboard provides when compared to touchscreen or controller. It is a 3 dimensional game made in Unity, which should take around a month to create with the first playable version being around 2 weeks in. The final version will take around 10 to 15 minutes to complete but will provide challenges that allow people to play for a couple hours whilst still providing incentives.
### **3.1 Core loops**
The main loop of the game will be to:
1. Explore the level
2. Find a faster route to the exit
3. Beat your personal record
4. Repeat on the same or new level
It will engage players because there will almost always be a faster time they are able to achieve and they will be able to set target times that they want to beat.
### **3.2 Objectives and Progression**
The way the player physically moves through the level will be through a variety of basic skills such as running, wall running and sliding. They will also learn more complicated skills such as bunny hopping. The short term goal of the player will be to get a faster time either to progress to the next level or beat their personal best. Whereas the long term will be to beat all of the levels and learn all of the advanced techniques to get faster times.
Throughout the player's journey through the tunnels they will also learn what the consequences of the treatment of eastern European culture have on people from those backgrounds. This will be shown to the player through dialog with non-player characters through different levels. The more severe issues will be only hinted at through the gameplay so the game will still be appropriate for younger audiences.
### **3.3 Game systems**
Portals - to achieve the appearance of non-Euclidean Changing gravity direction - used in some of the puzzles Trains - start/end of levels as well as being travel between levels (interacted by player) Ticket barriers - act as one way barriers in levels (interacted by player)
One of the main game systems that will need to be implemented is portals. They are how non-Euclidean concepts within the game will be implemented. In order for them to have the desired effect they must be able to be travelled through without realising. Another feature that will need implementing for the appearance of non-Euclidean concepts is changing gravity directions which is not natively supported within Unity.
Throughout their journey through the stations of the London Underground the way the player will travel between stations is via a train. It will also serve as the beginning and end of levels. One way barriers are a common concept in games and they will be implemented in "The Mobius Line" through the use of ticket barriers. They will make the player only be able to travel through them one way upon their first encounter, however once travelled through the player will be able to go both ways through them.

View File

@@ -1,2 +1,13 @@
# TheMobiusLine
# The Mobius Line
This is my FMP (final major project) that I created for my first year of Level 3 Game development. Windows downloads can be found under releases but if you wish to play via your browser you can play [here](https://pashabibko.itch.io/the-mobius-line).
### About
The mobius line is a speedrunning game built around non-Euclidean concepts set in the London Underground. Your goal is to get from one platform (the starting area) to the other (green wall) as fast as possible.
![](md-res/screenshot1.png)
![](md-res/screenshot2.png)
![](md-res/screenshot3.png)
If you would like to find out more about the plans for the game you can find the game design document [here](GameDesignDoc.md)

BIN
md-res/screenshot1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 KiB

BIN
md-res/screenshot2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 KiB

BIN
md-res/screenshot3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 KiB