#[no_std, cache_output]
constants = import "constants.spwn"
extract constants.obj_props
extract constants.comparisons
wait = #[desc("Adds a delay before the next triggers") example("
BG.set(255, 0, 0) // turn background red
wait(2) // wait 2 seconds
BG.set(0, 255, 0) // turn background green
")] (
#[desc("Delay time in seconds (leave empty for minimum delay)")]
time: @number | @epsilon = @epsilon::{}
){
if time.type == @epsilon || time > 0 {
$.add( trigger{
OBJ_ID: 1268,
SPAWN_DURATION: time,
TARGET: !{
-> return
},
})
} else {
-> return
}
}
call_with_delay = #[desc("Call a function after a delay") example("
BG.set(255, 0, 0) // turn background red
call_with_delay(2, !{
BG.set(0, 255, 0) // turn background green 2 seconds later
})
")] (
#[desc("Delay time in seconds (leave empty for minimum delay)")] time: @number | @epsilon = @epsilon::{},
#[desc("Function to call after the delay")] function: @trigger_function
) {
$.add(trigger{
OBJ_ID: 1268,
SPAWN_DURATION: time,
TARGET: function,
})
}
-> return {
wait: wait,
call_with_delay: call_with_delay,
supress_signal: #[desc("Stops signal from coming past for some time") example("
f = !{
supress_signal(1)
10g.move(10, 0)
}
f! // moves
wait(0.4)
f! // does nothing
wait(0.4)
f! // does nothing
wait(0.4)
f! // moves
")] (
#[desc("Time to supress signal")] delay: @number
){
//if checker is 0, a signal can come through
//if checker is 1, it will be supressed
checker = @counter::new(0)
-> (){
wait(delay)
checker.item.if_is(EQUAL_TO, 1, !{
checker.item.add(-1)
})
}()
checker.item.if_is(EQUAL_TO, 0, !{
checker.item.add(1)
-> return
})
},
supress_signal_forever: #[desc("Stops signal from coming past after call") example("
f = !{
supress_signal_forever()
10g.move(10, 0)
}
f! // moves
wait(0.4)
f! // does nothing
wait(1000)
f! // does nothing
")] (){
checker = @counter::new(0)
checker.item.if_is(EQUAL_TO, 0, !{
checker.item.add(1)
-> return
})
},
// supress_signal_quick: #[desc("Stops signal from coming past for some time (better for quick/glitchy signals)")] (
// #[desc("Time to supress signal")] delay: @number,
// ){
// //if checker is 0, a signal can come through
// //if checker is 1, it will be supressed
// checker = @counter::new(0)
// -> (){
// checker.item.add(1)
// wait(delay)
// checker.item.if_is(EQUAL_TO, 1, !{
// -> return
// })
// wait()
// checker.item.if_is(LARGER_THAN, 1, !{
// checker -= 1
// })
// }()
// },
for_loop: #[desc("Implementation of a spawn loop with a counter") example("
for_loop(0..10, (i) {
if i < 5 {
10g.move(-10, 0)
} else {
10g.move(10, 0)
}
})
")]
(
#[desc("Range of values (for example 0..10)")] range: @range,
#[desc("Macro of the code that gets looped, should take the iterator (a counter) as the first argument.")] code: @macro,
#[desc("Delay between loops (less than 0.05 may be unstable)")] delay: @number | @epsilon = @epsilon::{},
#[desc("Weather to reset the iterator after looping (only disable if the loop is only triggered once)")] reset: @bool = true,
#[desc("Operation speed of the reset of the iterator, if enabled")] reset_speed: @number = 1,
) {
i = @counter::new(range.start)
func = !{
code(i)
i.add(range.step_size)
wait()
i.item.if_is(SMALLER_THAN, range.end, !{
call_with_delay(delay, func)
})
i.item.if_is(LARGER_THAN, range.end - 1, !{
if reset {
wait()
i.reset(reset_speed)
}
-> return
})
}
func!
},
while_loop: #[desc("Implementation of a conditional spawn loop") example("
c = counter(11)
while_loop(() => c > 4, () {
c -= 2
})
// c is now 3
")]
(
#[desc("While loop condition, should -> return a boolean")] expr: @macro,
#[desc("Macro of the code that gets looped")] code: @macro,
#[desc("Delay between loops (less than 0.05 may be unstable)")] delay: @number | @epsilon = @epsilon::{},
) {
func = !{
if expr() {
code()
call_with_delay(delay, func)
} else {
-> return
}
}
call_with_delay(delay, func)
},
do_while_loop: #[desc("Implementation of a conditional spawn loop") example("
c = counter(4)
do_while_loop(() => c > 10, () {
c -= 2
})
// c is now 2
")]
(
#[desc("While loop condition, should -> return a boolean")] expr: @macro,
#[desc("Macro of the code that gets looped")] code: @macro,
#[desc("Delay between loops (less than 0.05 may be unstable)")] delay: @number | @epsilon = @epsilon::{},
) {
func = !{
code()
wait(delay)
if expr() {
func!
} else {
-> return
}
}
call_with_delay(delay, func)
},
}