Deltarune (Chapter 4) script viewer

← back to main script listing

gml_Object_obj_climb_setpathenemy_Step_0

(view raw script w/o annotations or w/e)
1
if (init == 0)
2
{
3
    if (r_movetype != -1)
4
        movetype = r_movetype;
5
    if (r_dir != -1)
6
        dir = r_dir;
7
    if (r_waittime != -1)
8
        waittime = r_waittime;
9
    if (r_waittimer != -1)
10
        waittimer = r_waittimer;
11
    if (r_movetime != -1)
12
        movetime = r_movetime;
13
    if (r_movetimer != -1)
14
        movetimer = r_movetimer;
15
    if (r_influenceable != -1)
16
        influenceable = r_influenceable;
17
    if (r_homedistance != -1)
18
        homedistance = r_homedistance;
19
    if (r_movevistype != -1)
20
        movevistype = r_movevistype;
21
    if (r_prefdir != "none")
22
        prefdir = r_prefdir;
23
    init = 1;
24
}
25
if (global.interact != 0)
26
    exit;
27
if (movetype == 9)
28
    exit;
29
var tower = instance_exists(obj_rotating_tower_controller_new);
30
if (((tower && enabled) || (!tower && (cameray() + 480 + 100) < y)) && !ignoreblocked)
31
    exit;
32
event_inherited();
33
if (neutralcon == 0)
34
{
35
    waittimer++;
36
    if (waittimer >= waittime)
37
    {
38
        waittimer = 0;
39
        movetimer = 0;
40
        if (updmove != -1)
41
        {
42
            movetime = updmove;
43
            updmove = -1;
44
        }
45
        if (updwait != -1)
46
        {
47
            waittime = updwait;
48
            updwait = -1;
49
        }
50
        var domove = false;
51
        var normalpath = false;
52
        var seek = false;
53
        var kris = 27;
54
        if (movetype == 0)
55
            normalpath = true;
56
        if (movetype == 1)
57
        {
58
            if (i_ex(kris))
59
            {
60
                if (distance_to_point(kris.x, kris.y) <= homedistance)
61
                    seek = true;
62
            }
63
            if (seek == false)
64
                normalpath = true;
65
        }
66
        if (movetype == 2)
67
        {
68
            seek = true;
69
            if (!i_ex(kris))
70
                seek = false;
71
        }
72
        if (influenceable)
73
        {
74
            var turn = instance_place(x, y, obj_climb_pathturner);
75
            if (i_ex(turn) && random_range(0, 1) <= turn.chance)
76
            {
77
                seek = false;
78
                normalpath = false;
79
                dir = turn.image_index;
80
                domove = true;
81
            }
82
        }
83
        if (seek)
84
        {
85
            normalpath = false;
86
            var krisdir = point_direction(x + 20, y + 20, kris.x, kris.y);
87
            var card = round(krisdir / 90) + 1;
88
            if (card > 3)
89
                card = 0;
90
            good[0] = true;
91
            good[1] = true;
92
            good[2] = true;
93
            good[3] = true;
94
            if (failmovecount < failmovethresh)
95
            {
96
                if (lastdir == 0)
97
                    good[2] = false;
98
                if (lastdir == 2)
99
                    good[0] = false;
100
                if (lastdir == 1)
101
                    good[3] = false;
102
                if (lastdir == 3)
103
                    good[1] = false;
104
            }
105
            for (i = 0; i < 4; i++)
106
            {
107
                var px = 0;
108
                var py = 0;
109
                var potcard = card + i;
110
                if (potcard > 3)
111
                    potcard = 0;
112
                if (potcard == 0)
113
                    py = 40;
114
                if (potcard == 1)
115
                    px = 40;
116
                if (potcard == 2)
117
                    py = -40;
118
                if (potcard == 3)
119
                    px = -40;
120
                if (good[potcard])
121
                {
122
                    if (!place_meeting(x + px, y + py, obj_climb_climbable))
123
                        good[potcard] = false;
124
                    if (!good[potcard] && place_meeting(x + px, y + py, obj_climb_pathturner))
125
                        good[potcard] = true;
126
                }
127
            }
128
            var i = 0;
129
            while (i < 4)
130
                i++;
131
            if (good[card])
132
            {
133
                dir = card;
134
                domove = true;
135
            }
136
            if (!domove)
137
            {
138
                var turnleft = 
scr_wrap
scr_wrap

function
scr_wrap()
{ var _val = argument[0]; var _max = argument[2]; var _min = argument[1]; if ((_val % 1) == 0) { while (_val > _max || _val < _min) { if (_val > _max) { _val = (_min + _val) - _max - 1; } else if (_val < _min) { _val = ((_max + _val) - _min) + 1; } else { } } return _val; } else { var _old = argument[0] + 1; while (_val != _old) { _old = _val; if (_val < _min) { _val = _max - (_min - _val); } else if (_val > _max) { _val = _min + (_val - _max); } else { } } return _val; } }
(card - 1, 0, 3);
139
                var turnright = 
scr_wrap
scr_wrap

function
scr_wrap()
{ var _val = argument[0]; var _max = argument[2]; var _min = argument[1]; if ((_val % 1) == 0) { while (_val > _max || _val < _min) { if (_val > _max) { _val = (_min + _val) - _max - 1; } else if (_val < _min) { _val = ((_max + _val) - _min) + 1; } else { } } return _val; } else { var _old = argument[0] + 1; while (_val != _old) { _old = _val; if (_val < _min) { _val = _max - (_min - _val); } else if (_val > _max) { _val = _min + (_val - _max); } else { } } return _val; } }
(card + 1, 0, 3);
140
                switch (card)
141
                {
142
                    case 0:
143
                        turnleft = 3;
144
                        turnright = 1;
145
                        break;
146
                    case 1:
147
                        turnleft = 2;
148
                        turnright = 0;
149
                        break;
150
                    case 2:
151
                        turnleft = 3;
152
                        turnright = 1;
153
                        break;
154
                    case 3:
155
                        turnleft = 0;
156
                        turnright = 2;
157
                        break;
158
                }
159
                var px = 0;
160
                var py = 0;
161
                if (good[turnleft] && !good[turnright])
162
                {
163
                    dir = turnleft;
164
                    domove = true;
165
                }
166
                if (good[turnright] && !good[turnleft])
167
                {
168
                    dir = turnright;
169
                    domove = true;
170
                }
171
                if (good[turnleft] && good[turnright])
172
                {
173
                    var leftdist = 0;
174
                    var rightdist = 0;
175
                    var potcard = turnleft;
176
                    if (potcard == 0)
177
                        py = 40;
178
                    if (potcard == 1)
179
                        px = 40;
180
                    if (potcard == 2)
181
                        py = -40;
182
                    if (potcard == 3)
183
                        px = -40;
184
                    leftdist = point_distance(x + px, y + py, kris.x, kris.y);
185
                    potcard = turnright;
186
                    if (potcard == 0)
187
                        py = 40;
188
                    if (potcard == 1)
189
                        px = 40;
190
                    if (potcard == 2)
191
                        py = -40;
192
                    if (potcard == 3)
193
                        px = -40;
194
                    rightdist = point_distance(x + px, y + py, kris.x, kris.y);
195
                    if (leftdist > rightdist)
196
                    {
197
                        dir = turnright;
198
                        domove = true;
199
                    }
200
                    else
201
                    {
202
                        dir = turnleft;
203
                        domove = true;
204
                    }
205
                }
206
            }
207
            if (!domove)
208
                failmovecount++;
209
        }
210
        if (normalpath)
211
        {
212
            for (var i = 0; i < 4; i++)
213
            {
214
                if (domove)
215
                    continue;
216
                var px = 0;
217
                var py = 0;
218
                if (dir == 0)
219
                    py = 40;
220
                if (dir == 1)
221
                    px = 40;
222
                if (dir == 2)
223
                    py = -40;
224
                if (dir == 3)
225
                    px = -40;
226
                if (place_meeting(x + px, y + py, obj_climb_pathturner))
227
                    domove = true;
228
                else if (place_meeting(x + px, y + py, obj_climb_climbable))
229
                    domove = true;
230
                if (!domove)
231
                {
232
                    if (prefdir == "left")
233
                        dir++;
234
                    if (prefdir == "right")
235
                        dir--;
236
                    if (dir > 3)
237
                        dir = 0;
238
                    if (dir < 0)
239
                        dir = 3;
240
                }
241
            }
242
        }
243
        if (domove)
244
        {
245
            neutralcon = 1;
246
            safex = x;
247
            safey = y;
248
        }
249
    }
250
}
251
if (neutralcon == 1)
252
{
253
    var px = 0;
254
    var py = 0;
255
    if (dir == 0)
256
    {
257
        py = 40;
258
        angle = 0;
259
    }
260
    if (dir == 1)
261
    {
262
        px = 40;
263
        angle = 270;
264
    }
265
    if (dir == 2)
266
    {
267
        py = -40;
268
        angle = 180;
269
    }
270
    if (dir == 3)
271
    {
272
        px = -40;
273
        angle = 90;
274
    }
275
    movetimer++;
276
    var prog = clamp(movetimer, 0, movetime) / movetime;
277
    var pointAx = safex;
278
    var pointBx = safex + px;
279
    var pointAy = safey;
280
    var pointBy = safey + py;
281
    if (movevistype == 0)
282
    {
283
        x = lerp(pointAx, pointBx, prog);
284
        y = lerp(pointAy, pointBy, prog);
285
    }
286
    if (movevistype == 1)
287
    {
288
        x = lerp_ease_inout(pointAx, pointBx, prog, 2);
289
        y = lerp_ease_inout(pointAy, pointBy, prog, 2);
290
    }
291
    if (movetimer >= movetime)
292
    {
293
        failmovecount = 0;
294
        lastdir = dir;
295
        x = safex + px;
296
        y = safey + py;
297
        waittimer = 0;
298
        movetimer = 0;
299
        neutralcon = 0;
300
        if (updmove != -1)
301
        {
302
            movetime = updmove;
303
            updmove = -1;
304
        }
305
        if (updwait != -1)
306
        {
307
            waittime = updwait;
308
            updwait = -1;
309
        }
310
    }
311
}