1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
#
###############################################################################
# Macros
@macro itembox
#-------------------------------------------------------------------
# This macro helps to place N itemboxes in a row between
# 2 points with optimal height.
#-------------------------------------------------------------------
# Syntax:
# @:ITEMBOX(fall,1,pos1)
# @:ITEMBOX(fall,n,pos1,pos2)
# @:ITEMBOX(fall,n,pos1,pos2,factor)
# @:ITEMBOX(fall,n,pos1,pos2,factor,second)
# @:ITEMBOX(fall,n,pos1,pos2,factor,second,itemtype)
#-------------------------------------------------------------------
# Parameters:
# FALL : If >0: Raise the box by FALL and let it fall to
# : the road to get the optimal height.
# N : If >0: Create N itemboxes between POS1 and POS2.
# POS1 : Position of first itembox.
# POS2 : Position of last itembox.
# FACTOR : If set and >0.01: Create a line from POS1 to POS2.
# : Enlarge the line by FACTOR in both directions.
# : Then use the new points as new POS1 and POS2.
# SECOND : If set and >0: Move each second itembox into a second
# : row. The distance between both rows is SECOND units.
# ITEMTYPE: Use this value for player and enemy items.
#-------------------------------------------------------------------
# Examples:
# @:itembox( 200, 1, point )
# @:itembox( 0, 3, point1, point2, 0.9 )
# @:itembox( 500, 8, point1, point2, 1, 250, ITEM$3GREEN )
# @:itembox( 200, 4, v(2000,1000,3000), v(3000,1000,5000) )
#-------------------------------------------------------------------
@param fall n p1 p2 factor second itemtype
@pdef fall = fall > 0 ? fall : 0
@if isScalar(factor) && factor > 0.01
@pdef a = p1, b = p2, f = (1.0-factor)/2
@pdef p1 = pos(f,a,b)
@pdef p2 = pos(f,b,a)
@endif
@pdef itemtype = int(itemtype)
@if n == 1
@pdef p = fall ? kcl$fall(p1+vy(fall),200,KCL$DRIVE) : p1
0 o$itembox p 0 itemtype itemtype 0 -1 0 v3(0) 0 0 0 0 0x3f v3(1)
@else
@pdef second = isScalar(second) && second > 0
> ? hrot(vz(second),hdir(p1,p2)+90) : v3(0)
@pdef n = n - 1.0
@for i=0;n
@pdef p = pos(i/n,p1,p2)
@doif(i&1) @pdef p = p + second
@doif(fall) @pdef p = kcl$fall(p+vy(fall),200,KCL$DRIVE)
0 o$itembox p 0 itemtype itemtype 0 -1 0 v3(0) 0 0 0 0 0x3f v3(1)
@endfor
@endif
@endmacro
|