OverviewFunctionsWorkspacesCustom Functions OverviewCustom Functions FeaturesNoodle Extensions/Chroma Properties SyntaxMath & FunctionsVariablesInternal VariablesHeaders
Prerequisites
- Have .NET6 Core installed
- Have prior experience with mapping
- Have a map with SW configured
Everything in this section of the docs is referenced in the _ScuffedWalls.sw file. You can edit this file with the IDE of your choice.
Functions in ScuffedWalls are always called by stating a time value and the name of the function. Some functions do not use their time values, for those you can set the value to 0. In the lines beneath the function call, you can add parameters. Every parameter beneath a function call will apply only to that function.
Workspace <- workspace
0:Wall <- function call
color:[0,1,1,1] <- parameter ^ Wall
scale:[1,1,1] <- parameter ^ Wall
var:Variable <- variable instance
data:2 <- parameter ^ VariableAll the available functions are listed below
AppendWallsAppendNotesAppendEventsTextToWallModelEnvironmentBlackoutImportRunWallNoteAnimateTrackAssignPathAnimationAssignPlayerToTrackParentTrackPointDefinitionImageToWallis still supported, however there are better things out there. Why would you use it?
Generally, a function will only add or affect map objects (walls, notes, lights, ect) in its own workspace.
Every workspace is combined when writing to the map file
Workspaces are useful for organization, cloning and appending
Workspace: Workspace 1
1:Note
Workspace: A Different Workspace
2:Note
0:AppendNotes
#Affects Note 2 but not Note 1Workspace: Workspace 1
1:Note
Workspace: A Different Workspace
2:Note
Workspace: Clone Workspace 1
0:CloneWorkspace
Name: Workspace 1
#This workspace has a clone of Note 1 in itWorkspace: Workspace 1
var:Three
data:3
1:Note
NJS:Three
#This works because the variable is declared in this workspace
Workspace: A Different Workspace
2:Note
NJS:Three
#This will not work
A custom function is a workspace that can be instantiated multiple times.
You can define a custom function by using the keyword function in place of workspace
Function: SpinWall
0:Wall
duration:5
animateLocalRotation:[0,0,0,0],[0,0,180,1]
Defines a custom function which adds one wall with some properties. Note: this does nothing on its own.
To use this custom function you can reference it like a regular function.
Workspace
0:SpinWall
CFs have the ability to set variabels as public. Meaning you can change the variables data from outside the CF.
Function: OhWow
Var: AmazingVariableName
data: hi retrx!
public:true
0:Log
Log:AmazingVariableName
Workspace
0: OhWow
AmazingVariableName: bye retrx :(
This example prints to the console: bye retrx :(
CFs also have the ability to set a function call to the time that the CF was called from.
Function: NeatO
XXX:Wall
Workspace
7.2: NeatO
This example adds a wall at beat 7.2
Practical use example:
cleaning up text to wall
function:Subtitle
var:line
data:????
public:true
var:duration
data:1
public:true
xxx:texttowall
definitedurationbeats:duration
Path:font.dae
line:line
letting:2
leading:-1
thicc:12
spreadspawntime:1
size:0.1
position:[0,2]
animatedefiniteposition:[0,0,0,0]
workspace:text
5.25:Subtitle
line:You know you gotta...
duration:1.25
6.5:Subtitle
line:TRY
duration:8
Custom Functions can be repeated like any other function while allowing repeats of functions inside of your Custom Function to operate as normal.
Function:ExampleCustomFunction
var:VarRepeat
data:0
public:true
X:Wall
repeat:VarRepeat
Workspace:FunctionCalling
10:ExampleCustomFunction
repeat:10
repeataddtime:1
VarRepeat:{20*repeat}
In the example above, the Custom Function will be repeated 10 times with an addtime of 1. Inside of the Custom Function, the repeat used when calling the wall is defined in the variable VarRepeat. This logic can be used to recall functions that utilize repeats in a much cleaner manner.
Another functionality repeating with Custom Functions is randomization:
Function:ExampleCustomFunction
var:PosX
data:0
public:true
X:Wall
animatedefiniteposition:[PosX,0,0,0],[PosX,10,0,1]
Workspace:ExampleWorkspace
var:RandomXCoord
data:Random(-10,10)
recompute:0
10:ExampleCustomFunction
repeat:10
PosX:RandomXCoord
The Custom Function above calls for a wall with a random X position, however since the random number is created outside of the custom function, the random number will only change once per call (or repeat) of the Custom Function. For example if the random number generated is 2, the X position of animatedefiniteposition for the first repeat of ExampleCustomFunction will be 2. Randomizing inside of the function would result in two different random positions, not a single consistent coordinate. Note:This can also be done by simply defining PosX as a random number when calling the Custom Function. Doing it through variables is my default - iswimfly
Custom Functions can additionally be nested inside of each other. Infinite loops will result in a stack overflow and your map will never compile.
function:ExampleChildFunction
var:ChildVariable
data:0
public:true
X:Wall
repeat:ChildVariable
function:ExampleParentFunction
var:ParentVariable
data:0
public:true
X:ExampleChildFunction
ChildVariable:ParentVariable
Workspace:ExampleWorkspace
0:ExampleParentFunction
ParentVariable:10
This setup calls ExampleChildFunction at the calltime of ExampleParentFunction. When attempting to modify variables, it is important to keep in mind that public variables can only be redefined when calling the Custom Function. To fix this when nesting Custom Functions, defining a "Child" Variable as a "Parent" variable as shown in the example above will bring the value "10" of "ParentVariable" to the nested variable "ChildVariable".
Feel free to dm iswimfly#0556 on Discord with any questions/problems/help needed regarding Custom Functions.
Noodle Extensions/Chroma/Other properties that can be used on most functions
Most of these properties are directly connected to their corresponding Noodle/Chroma property written in JSON.
("" = put in quotes, ? = optional)
NJSOffset: number (decimal)NJS: number (decimal)Interactable: true/falseFake: true/falsePosition: [x,y]Rotation: [x,y,z] or number (decimal)LocalRotation: [x,y,z]
CutDirection: number (decimal)DisableNoteGravity: true/falseDisableNoteLook: true/false
Scale: [x,y?,z?]
Track: string, or ["t1","t2"...] for multiple tracksAnimateDefinitePosition: [x,y,z,t,"e"?]AnimatePosition: [x,y,z,t,"e"?]AnimateDissolve: [d,t,"e"?]AnimateDissolveArrow: [d,t,"e"?]AnimateColor: [r,g,b,a,t,"e"?]AnimateRotation: [x,y,z,t,"e"?]AnimateLocalRotation: [x,y,z,t,"e"?]AnimateScale: [x,y,z,t,"e"?]AnimateInteractable:[i,t]AnimateTime:[t,t,"e"?]AnimateHeight: [v,t,"e"?]AnimateAttenuation: [v,t,"e"?]AnimateStartY: [v,t,"e"?]AnimateOffset: [v,t,"e"?]
Color: [r,g,b,a] (0-1)DisableSpawnEffect: true/falseCPropID: number (integer)CLightID: number (integer)CGradientDuration: number (decimal)CgradientStartColor: [r,g,b,a?]CgradientEndColor: [r,g,b,a?]CgradientEasing: stringCLockPosition: true/falseCPreciseSpeed: number (decimal)CDirection: number (integer)CNameFilter: stringCReset: true/falseCStep: number (decimal)CProp: number (decimal)CSpeed: number (decimal)CCounterSpin: true/false
Other
Log: prints things to the console. useful for checking the value of internal variables. ex:Log:hi retrx!`- # is used at the start of a blank line for a comment
Useful links
Position
- x = left-right
- y = up-down
- z = forward-backward
- 0,0,0 Is on the ground in the center of the lanes
Scale (Walls)
- x = width extending from the right
- y = hight extending from the top
- z = length extending from the back
Time (Notes)
- t = time of any given animation event
- relative to the object duration (0.0 - 1.0)
- t 0.5 = halfway through the objects lifetime,
For any questions about these values that havent been listed, check the Heck Documentation
Math expressions are computed inside of { } symbols. A random number (decimal)ing point number is yielded from the function Random(val1,val2). A random integer is yielded from the line function RandomInt(val1,val2).
0:Wall
position:[{ 5+6 }, Random(1,5), { 5+6+Random(2,10) }]
scale:[RandomInt(5,0),RandomInt(5,0),RandomInt(5,0)]0:Wall
repeat:100
position:[{repeat/10},0,0]
scale:[0.1,1,1]
color:HSLtoRGB({repeat/100},1,0.5)The example above uses the HSLtoRGB function to create a rainbow. supermemer is a furry
The available functions are:
Random(Val1,Val2)=> returns a numberRandomInt(Val1,Val2)=> returns a numberHSLtoRGB(Hue,Saturation?,Lightness?,Alpha?,Any extra values like easings or whatever?)=> returns a point definitionMultPointDefinition(PointDefinition,value to multiply)=> returns a point definitionRepeatPointDefinition(PointDefinition,amount of times to repeat)=> returns point definitionsOrderPointDefinitions(PointDefinitions)=> returns point definitions
An inline function that returns a random number ranging from Val1 to Val2. RandomInt will return a random whole number.
0:wall
njs:Random(0,10)An inline function that returns a point definition representing a color.
HSLtoRGB(Hue, Saturation, Value, Alpha?, Extra values to be added to the point defintion?)
0:Wall
color:HSLtoRGB(0.2,1,0.5,1)0:Wall
animatecolor:HSLtoRGB(0.2,1,0.5,1,0),HSLtoRGB(0.4,1,0.5,1,1,"easeInOutSine")
# ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
# hue,sat,val,alfa,time hue,sat,val,alfa,time,easingAn inline function that returns a controllable amount of point definitions based on one or more point definitions.
This function has an internal variable reppd (short for repeatpointdefinition) which ticks up every repeat.
0:Note
animateposition:RepeatPointDefinition([Random(0,1),Random(0,1),Random(0,1),{reppd/9}],10)An inline function that returns point definitions ordered by their time value.
0:Wall
animatedissolve:OrderPointDefinitions([1,1],[1,0],[1,0.2],[1,0.8])An inline function that multiplies all numbers in a point definition by another number.
0:AppendWalls
color:MultPointDefinition([_color(0),_color(1),_color(2),_color(3)],2)Variables are containers for string/numerical data.
Workspace
var:SomeVariableName
data:5
recompute:0
0:Wall
NJS:SomeVariableNameWorkspace
var:Grey
data:Random(0,1)
recompute:1
#Creates walls with random shades of grey
0:Wall
color:[Grey,Grey,Grey,1]
repeat:15Variables are only accessable from the workspace/function they are defined in.
Workspace
/#Makes 5 variables
"NumbersOneThroughFive(0)": 1
"NumbersOneThroughFive(1)": 2
"NumbersOneThroughFive(2)": 3
"NumbersOneThroughFive(3)": 4
"NumbersOneThroughFive(4)": 5
#/
var:NumbersOneThroughFive
data:1,2,3,4,5
recompute:1
type:array
/#Makes 3 variables
"Position(x)": 5
"Position(y)": 2
"Position(z)": 1
#/
var:Position
data:[5,2,1]
recompute:1
type:vectorSetting type to either array or vector will split the data given (by commas) into seperate variables. The names of the seperate variables will be printed to the console.
recompute:
- 0 = recompute math, variables and random() for all references of the variable,
- 1 = recompute every repeat/function,
- 2 = compute once on creation defaults to 2
Variables that are auto created and changed internally. All repeatable functions will have at least 2 internal variables called "repeat" and "time". The append function populates all the properties of each wall/note/event as a variable.
0:Wall
repeat:60
repeataddtime:0.05
scale:[0.25,0.25,0.25]
position:[{repeat/8},{Sin(repeat/2)}]Headers are lines of code that occur in the _ScuffedWall.sw file BEFORE the first workspace or function.
Available headers are:
- `include``:string, put the relative path of any other _ScuffedWall.sw file to import all the code and have it run alongside this code. (can be repeated)
- `hidemapinrpc``: true/false, if TRUE - doesnt show the name of the map you're working on in the Discord rich presence.
- `debug``: idk
- `prettyprintjson``: true/false, if TRUE - prints the map JSON file with indentation.
include:cooleffects.sw
include:SwimFunction.sw
hidemapinrpc:true
Workspace:Default
...
..Appending means to add on or to merge two sets of data. The append function will loop through a set of map objects and merge all properties as specified.
- Function Time => starting beat of selection (only append notes after...)
toBeat: number (decimal) => ending beat of selection (only append notes before...)appendTechnique: int(0-2)select: true/false, only applies the affect if the value is true. exampleselect:{_lineLayer = 0}` will only append to walls with linelayer 0call: string, put the name of a custom function. It will call this function and pass in every variable from this function into the custom function.- any of
these properties
5:AppendToAllWallsBetween
toBeat:10
track: FurryTrack
appendTechnique:10:AppendWalls
time:{_time * 2}
appendtechnique:1^ multiplies all the wall times by 2
0:AppendWalls
animateDefinitePosition:[{_animation._definitePosition(0)(0) * 3},{_animation._definitePosition(0)(1) * 3},{_animation._definitePosition(0)(2) * 3},_animation._definitePosition(0)(3)]
appendtechnique:1^ multiplies all the definitepositions by 3 except for the time value
^ a very scuffed way to make a rainbow
a less scuffed way to make a rainbow
#random dot converter
#auto import map then paste code
var:PercentageToConvertToDotNotes
data:30
0:AppendNotes
select:{RandomInt(0,100)<PercentageToConvertToDotNotes} #IF a random number btw 100-0 is less than a defined percentage, continue...
delete:true #delete this note
call:AddDotNote #call the function to add a dot note
function:AddDotNote
0:Note #make a new note
type:_type #get the original _type of the note (passed in be the append function)
linelayer:_lineLayer #get the original _lineLayer of the note (passed in be the append function)
lineIndex:_lineIndex #get the original _lineIndex of the note (passed in be the append function)
notecutdirection:8 #set the cutdirection to 8 (bomb)^ converts a random percentage of notes in the map to dot notes. Utlilizes the call keyword by giving it the exact name of the defined custom function.
Appends data to notes between the function time and endtime (toBeat)
- Function Time => starting beat of selection (only append notes after...)
toBeat: number (decimal) => ending beat of selection (only append notes before...)appendTechnique: int(0-2)select:true/false WHERE iftrueobject will be modified and iffalseobject will be skipped. EXAMPLE:select:{_lineLayer = 0}` will only append to notes with linelayer 0call: string, put the name of a custom function. It will call this function and pass in every variable from this function into the custom function.- any of
these properties
5:AppendToAllNotesBetween
toBeat:10
track: FurryTrack
appendTechnique:2
60:AppendToAllNotesBetween
tobeat:63
Njsoffset:Random(1,3)
AnimatePosition:[Random(-7,6),Random(-6,6),0,0],[0,0,0,0.35,"easeOutCubic"],[0,0,0,1]
AnimateDissolve:[0,0],[1,0.1],[1,1]
DisableSpawnEffect:true
66:AppendToAllNotesBetween
tobeat:99
NJS:10
DisableSpawnEffect:true
AnimateDissolveArrow: [0,0],[0,1]
track:CameraMoveNotes0:AppendNotes
time:{_time * 2}
appendtechnique:1^ multiplies all the note times by 2
0:AppendNotes
animateDefinitePosition:[{_animation._definitePosition(0)(0) * 3},{_animation._definitePosition(0)(1) * 3},{_animation._definitePosition(0)(2) * 3},_animation._definitePosition(0)(3)]
appendtechnique:1^ multiplies all the definitepositions by 3 except for the time value
Appends data to events between the function time and endtime (toBeat)
toBeat: number (decimal)appendTechnique: int(0-1)- any of
these properties select:true/false WHERE iftrueobject will be modified and iffalseobject will be skippedcall: string, put the name of a custom function. It will call this function and pass in every variable from this function into the custom function.
5:AppendToAllEventsBetween
toBeat:10
appendTechnique:2
selectType:1,3,0
color:HSLtoRGB(time, 1, 0.5, 1)The merge priority of the values being appended
- 0 = Low Priority, Add data if there isnt already data (default)
- 1 = High Priority, Add data even if there is already data
What does this mean?
We know that objects in our map file have properties.
"_notes": [
{
"_time": 0,
"_lineIndex": 0,
"_lineLayer": 0,
"_type": 1,
"_cutDirection": 1,
"_customData": {
"_noteJumpMovementSpeed": 12, <<<< property
"_track": "ExampleTrack" <<<< property
}
}
],
"_obstacles": [
{
"_time": 0,
"_lineIndex": 0,
"_type": 0,
"_duration": 0,
"_width": 0,
"_customData": {
"_noteJumpMovementSpeed": 12, <<<< property
"_track": "ExampleTrack" <<<< property
}
}Append priorities deal with how we reassign properties of objects. High priority simply means that our properties that we are currently assigning are more important than the properties that were already on the object. Low priority is the opposite, the properties that were already on the object are more important than the properties that we are currently assigning.
The append function runs through each object in a workspace and changes its data.
In the example, animateDefinitePosition:[{_animation._definitePosition(0)(0) * 3}...]`
_animation._definitePosition(0)(0) is a reference to an "internal" variable created by the append function. in the case of SW, indexers are represented with parenthesis.
this example takes the value from the already existing _definitePosition array, indexes in to the first array of the point definition, then indexes in again into the first value of the array, multiplies the resulting floating point number by 3, and then sets that.
granted this only works if every object has a _definitePosition with a value at the specified index
confusing right?
Constructs text out of walls
Rizthesnuggies Intro to TextToWall tutorial
see here for how the program reads font images/models.
path: string- fullpath string
refreshonsave: true/false, refreshes scuffedwalls when the file at the specified path is modifiedline: string, the text you want to convert to walls. this can be repeated to add more lines of text.letting: number (decimal), the relative space between letters. default: 1leading: number (decimal), the relative space between lines. default: 1size: number (decimal), scales the text. default: 1 (gigantic)thicc: number (decimal), makes the edges of the walls fill more of the centerduration: number (decimal)definitedurationbeats: number (decimal), makes the walls stay around for exactly this long in beatsdefinitedurationseconds: number (decimal), makes the walls stay around for exactly this long in secondsdefinitetime: beats/seconds, makes the walls jump in at exactly the function time in seconds or beatsPosition=> moves the text by this amount, defaults to [0,0]- all the other imagetowall params if your really interested
- all the other modeltowall params if your really interested
- any of
these properties
5:TextToWall
Path:font.dae
line:a line of text!
line:another line of text?
letting:2
leading:-1
thicc:12
spreadspawntime:1
size:0.1
position:[0,2]
animatedefiniteposition:[0,0,0,0]
#makes the text jump in at beat 5 and exist for 7 beats exactly
definitedurationbeats:7
definitetime:beats(repeatable) constructs a model out of walls/notes/bombs/playertracks. see here for more info
Rizthesnuggies Intro to ModelToWall tutorial
path: stringfullpath: stringrefreshonsave: true/false, refreshes scuffedwalls when the file at the specified path is modifiedhasAnimation: true/false, tells the model parser to read animation. definite onlyduration: number (decimal), controls the duration of the model. this affects the length of time it takes to play the model animation.definitedurationbeats: number (decimal), makes the walls stay around for exactly this long in beatsdefinitedurationseconds: number (decimal), makes the walls stay around for exactly this long in secondsdefinitetime: beats/seconds, makes the walls jump in at exactly the function time in seconds or beatsspreadspawntime: number (decimal)Normal: true/false, makes the walls jump in and fly out as normal. essentially 1.0 model to wall when set to true. default: falsecreatetracks: true/falsecolormult: number (decimal), multiplies all the model color values by this amountpreservetime: true/falsecameratoplayer: true/falsecreatenotes: true/falsespline: true/falsespreadspawntime: number (decimal)alpha: number (decimal)thicc: number (decimal)deltaposition: [x,y,z] offsets the model in 3d by this position vectordeltarotation: [x,y,z] rotates the model around the center of its bounding boxdeltascale: number (decimal), scales the model around the center of its bounding boxsetdeltaposition: true/falsesetdeltascale: true/false- any of
these properties repeat: number (integer)repeataddtime: number (decimal)type: 0, 1, 2 or 3 WHERE 0 = The model defines which object should be walls or notes, 1 = every object will be a wall, 2 = every object will be a bomb, 3 = every object will be a note
5:ModelToWall
Path:model.dae
hasAnimation:false
spreadspawntime:1
normal:true
track:FurryTrack
#makes the model jump in at beat 5 and last for 5.1276 seconds exactly
definitetime:beats
definitedurationseconds:5.1276(Only works on versions less than v2.0.0)
Constructs an image out of walls as pixels
Rizthesnuggies Intro to ImageToWall tutorial
path: string- fullpath string
refreshonsave: true/false, refreshes scuffedwalls when the file at the specified path is modifiedisBlackEmpty: true/false, doesn't add pixel if the pixel color is black. default: falsesize: number (decimal), scales the image. default: 1thicc: number (decimal), makes the edges of the walls fill more of the centercentered: true/false, centers the x position. default: falseduration: number (decimal)definitedurationbeats: number (decimal), makes the walls stay around for exactly this long in beatsdefinitedurationseconds: number (decimal), makes the walls stay around for exactly this long in secondsdefinitetime: beats/seconds, makes the walls jump in at exactly the function time in seconds or beatsspreadspawntime: number (decimal). default: 0maxlinelength: number (integer), the max line length. default: +infinityshift: number (decimal), the difference in compression priorities between the inverted compression. default: 1compression: number (decimal), how much to compress the wall image, Not linear in the slightest. recommended value(0-0.1) default: 0- Position => moves each pixel by this amount, defaults to [0,0]
Alpha: the alpha value- any of
these properties
5:ImageToWall
Path:image.png
thicc:12
size:0.5
isBlackEmpty: true
centered: true
maxlinelength:8
compression:0.1
spreadspawntime:1
position:[0,2]
duration:12
animatedefiniteposition:[0,0,0,0]makes a chroma environment enhancement, idk what this does but i heard its pretty cool
(Airscrach) This Took Me An Entire Day To Figure Out So Heres A Quickstart Guide
id: stringtrack: stringlookupmethod: stringduplicate: number (integer)active: true/falsescale: [x,y,z]localposition: [x,y,z]localrotation: [x,y,z]position: [x,y,z]rotation: [x,y,z]
1:Environment
id:^BigMirrorEnvironment\.\[0]Environment\.\[18]DoubleColorLaser$
lookupMethod:Regex
position:[8,1.667,39]
track:DoubleColorLaser
active:true
#takes the double color laser and changes position and adds it to a trackadds a single light off event at the beat number. why? because why not.
Example
5:Blackout"Run", "cmd", "Terminal", "Execute"
calls the terminal/command prompt and runs the specified args after or before the programs runtime.
also can run javascript/typescript files
args: string, this is what will be put into the terminalrunbefore: true/false, (if true) will execute this function before SW begins to parse the .sw file, when false this function runs after SW finishes writing to the map filescript: string, path to the.jsor.tsfile, will execute this file using the node command. If the file ends with.ts, this will invoke usingts-nodewhich is required separately.refreshonsave: true/false, refreshes scuffedwalls when the javascript file is modified
0:Run
script:CoolMapScript.js
RunBefore: falsenote that in the above example, CoolMapScript.js is in the map folder
0:Run
Args:Start Notepad.exe
RunBefore: falseExample js script for mapping -> here
adds in map objects from other map.dat files
path: string- fullpath string
refreshonsave: true/false, refreshes scuffedwalls when the file at the specified path is modifiedtype:int,int,int (defaults to 0,1,2,3) what to import where 0 = walls, 1 = notes, 2 = lights, 3 = customevents & point definitionsaddtime: number (decimal)toBeat: number (decimal)
adds lights from EasyStandard.dat from beat 15 to beat 180
15:Import
fullpath:E:\New folder\steamapps\common\Beat Saber\Beat Saber_Data\CustomWIPLevels\scuffed walls test\EasyStandard.dat
type:2
toBeat:180(repeatable) makes a wall
Rizthesnuggies Intro to Wall & Note tutorial
duration: number (decimal)definitedurationbeats: number (decimal), makes the walls stay around for exactly this long in beatsdefinitedurationseconds: number (decimal), makes the walls stay around for exactly this long in secondsdefinitetime: beats/seconds, makes the walls jump in at exactly the function time in seconds or beatsrepeat: number (integer), amount of times to repeatrepeatAddTime: number (decimal)- any of
these properties
#blue fire
5:Wall
repeat:160
repeataddtime:0.2
NJSOffset:-10
animatedefiniteposition:[Random(0,2),Random(8,12),Random(28,31),0],[Random(-7,-4),Random(10,14),Random(28,31),1,"easeInSine"]
animatescale:[1,1,1,0],[0.01,0.01,0.01,1,"easeInSine"]
scale:[0.8,0.8,0.8]
color:[0,Random(1.6,1.7),Random(1.9,2),2]
localrotation:[Random(0,360),Random(0,360),Random(0,360)]
rotation:[0,0,-5]
track:flowerfloat
animatedissolve:[0,0],[1,0],[1,0.9],[0,1]
#shooting star
164:Wall
repeat:50
repeataddtime:0.4
scale:[0.2,0.2,18]
Njs:10
NjsOffset:20
position:[Random(0,80),Random(-100,100)]
color:HSLtoRGB(Random(0,1),1,0.5,1)
rotation:[Random(0,360),90,0](repeatable) makes a note
While it is possible, ScuffedWalls does not serve as a usable alternative to note mapping. The Note function is recommended for creating procedural effects only.
Rizthesnuggies Intro to Wall & Note tutorial
repeat: number (integer), amount of times to repeatrepeatAddTime: number (decimal)- any of
these properties type:intcutDirection:int
these properties use _noteJumpStartBeatOffset to adjust the notes duration
definitedurationbeats: number (decimal), makes the note stay around for exactly this long in beatsdefinitedurationseconds: number (decimal), makes the note stay around for exactly this long in secondsdefinitetime: beats/seconds, makes the note jump in at exactly the function time in seconds or beats
#Note fire
100:Note
repeat:66
repeatAddTime:0.3
localRotation:[Random(0,360),Random(0,360),Random(0,360)]
Rotation:[90,0,0]
Position:[Random(-12,-6),Random(8,18)]
AnimatePosition:[0,0,-10,0],[0,0,-10,1]
AnimateDissolve:[0,0],[1,0.1],[1,1]
AnimateScale:[2,2,2,0],[2,2,2,1]
AnimateColor:[1, 0, 0, 1,0], [0, 1, 0, 0.5, 0.0832], [0, 0, 1, 1, 0.15], [1, 0, 0, 1, 0.23], [0, 1, 0, 1, 0.30], [0, 0, 1, 1, 0.38], [1, 0, 0, 1, 0.45], [0, 1, 0, 1, 0.52], [0, 0, 1, 1, 0.60], [1, 0, 0, 1, 0.68], [0, 1, 0, 1, 0.75], [0, 0, 1, 1, 0.84],[1,1,1,1,1]
NJS:10
NJSOffset:4
fake:true
Interactable: false
track: RandomShit(repeatable)
makes an AnimateTrack custom event
- any of
these properties easing: stringrepeat: number (integer), amount of times to repeatrepeatAddTime: number (decimal)
70:AnimateTrack
track:RandomShit
duration:1
animatedissolve:[0,0],[0,1]
animatedissolvearrow:[0,0],[0,1]
100:AnimateTrack
track:RandomShit
duration:1
animatedissolve:[0,0],[1,1]
animatedissolvearrow:[0,0],[1,1](repeatable)
makes an AssignPathAnimation custom event
- any of [
these properties](## Noodle Extensions/Chroma Properties Syntax) track: stringeasing: stringrepeat: number (integer), amount of times to repeatrepeatAddTime: number (decimal)
42:AssignPathAnimation
track:BeginningStretch
duration:8
AnimateRotation:[0,0,0,0],[0,0,0,0.5,"easeOutQuad"],[0,0,0,1]
easing:easeInOutSinemakes an AssignPlayerToTrack custom event
- any of
these properties track: string
3:AssignPlayerToTrack
track:BigMovementmakes an AssignTrackParent custom event
childTracks:["str","str"...]parentTrack: stringworldpositionstays: true/false
3:ParentTrack
ParentTrack:BigMovement
ChildTracks:["rightnotes","leftnotes"]makes a point definition for use with custom events
name: stringpoints: point definitions
5:PointDefinition
name:UpDownPoints
points:[0,0,0,0],[0,15,0,0.5,"easeInOutSine"],[0,0,0,1,"easeInOutSine"]
15:Wall
DefineAnimateDefinitePosition:UpDownPointsuse this function by downloading the repo and navigating to ScuffedWalls>Program>Functions>Script.cs
is this stupid? yes.
don't ever call this
:)







