summaryrefslogtreecommitdiff
path: root/npc/functions/npcmovegraph.txt
diff options
context:
space:
mode:
Diffstat (limited to 'npc/functions/npcmovegraph.txt')
-rw-r--r--npc/functions/npcmovegraph.txt485
1 files changed, 0 insertions, 485 deletions
diff --git a/npc/functions/npcmovegraph.txt b/npc/functions/npcmovegraph.txt
deleted file mode 100644
index 54e4e783..00000000
--- a/npc/functions/npcmovegraph.txt
+++ /dev/null
@@ -1,485 +0,0 @@
-// Evol functions.
-// Author:
-// Travolta
-// Description:
-// Moving npc utility functions (graph-based)
-// Variables:
-// none
-
-function script initmovegraph {
- deletearray getvariableofnpc(.movegraphcmd$, strnpcinfo(3));
- deletearray getvariableofnpc(.movegraphlabels$, strnpcinfo(3));
- deletearray getvariableofnpc(.movegraphweight, strnpcinfo(3));
- deletearray getvariableofnpc(.movegraphflags, strnpcinfo(3));
- deletearray getvariableofnpc(.movepos_y1, strnpcinfo(3));
- deletearray getvariableofnpc(.movepos_x1, strnpcinfo(3));
- deletearray getvariableofnpc(.movepos_x2, strnpcinfo(3));
- deletearray getvariableofnpc(.movepos_y2, strnpcinfo(3));
- .@cnt = 0;
-
- for (.@f = 0; .@f < getargcount();)
- {
- set getvariableofnpc(.movegraphlabels$[.@cnt], strnpcinfo(3)), getarg(.@f++);
- set getvariableofnpc(.movepos_x1[.@cnt], strnpcinfo(3)), getarg(.@f++);
- set getvariableofnpc(.movepos_y1[.@cnt], strnpcinfo(3)), getarg(.@f++);
- if (!isstr(getarg(.@f, "label")))
- {
- set getvariableofnpc(.movepos_x2[.@cnt], strnpcinfo(3)), getarg(.@f++);
- set getvariableofnpc(.movepos_y2[.@cnt], strnpcinfo(3)), getarg(.@f++);
- }
- .@cnt ++;
- }
- return;
-}
-
-function script findmovegraphlabel {
- if (!getargcount())
- {
- consolemes(CONSOLEMES_DEBUG, "findmovegraphlabel: no argument");
- return -1;
- }
- if (!isstr(getarg(0)))
- {
- consolemes(CONSOLEMES_DEBUG, "findmovegraphlabel: need string argument");
- return -1;
- }
-
- .@arg$ = getarg(0);
- for (.@i = 0; .@i < getarraysize(getvariableofnpc(.movegraphlabels$, strnpcinfo(3))); .@i++)
- {
- if (getvariableofnpc(.movegraphlabels$[.@i], strnpcinfo(3)) == .@arg$)
- return .@i;
- }
-
- npcdebug "findmovegraphlabel: label not found: " + getarg(0);
- return -1;
-}
-
-/* setmovegraphcmd(fromPositionLabel,toPositionLabel[,moveChanceWeight[,moveFlags]],postCommand, ...);
- * This function manipulates NPC moving graph. Before calling it, make sure
- * `initmovegraph' was called. The function accepts 3-5 parameters (many times):
- * fromPositionLabel, toPositionLabel -- starting and ending position of NPC move
- * moveChanceWeight -- positive integer, represents the chance of moving in given direction. (optional)
- * moveFlags -- if .mg_flags & moveFlags != 0, move is possible. (optional)
- * postCommand -- either "moveon" (start moving to next location straight after arriving from
- * fromPositionLabel to toPositionLabel) or a semicolon-separated set of commands
- * ("wait 3", "emote 5" etc, see `execmovecmd') that will be executed after arrival.
- * The commands don't have to end with ";moveon", it's executed in the end by default.
- */
-function script setmovegraphcmd {
- .@size = getarraysize(getvariableofnpc(.movepos_x1, strnpcinfo(3)));
-
- for (.@f = 0; .@f < getargcount();)
- {
- .@from = findmovegraphlabel(getarg(.@f++));
- .@to = findmovegraphlabel(getarg(.@f++));
- .@weight = 1;
- if (!isstr(getarg(.@f)))
- .@weight = getarg(.@f++);
- .@flags = 0xffff;
- if (!isstr(getarg(.@f)))
- .@flags = getarg(.@f++);
- .@cmd$ = getarg(.@f++);
- .@index = .@from * .@size + .@to; // emulation of 2d array
- set getvariableofnpc(.movegraphcmd$[.@index], strnpcinfo(3)), .@cmd$;
- set getvariableofnpc(.movegraphweight[.@index], strnpcinfo(3)), .@weight;
- set getvariableofnpc(.movegraphflags[.@index], strnpcinfo(3)), .@flags;
- }
- return;
-}
-
-function script execmovecmd {
-
- explode(.@cmd$, getarg(0), " ");
-
- if (.@cmd$[0] == "moveon")
- {
- return 0;
- }
- else if (.@cmd$[0] == "dir")
- {
- .dir = atoi(.@cmd$[1]);
- }
- else if (.@cmd$[0] == "sit")
- {
- npcsit;
- }
- else if (.@cmd$[0] == "stand")
- {
- npcstand;
- }
- else if (.@cmd$[0] == "wait")
- {
- set getvariableofnpc(.waitticks, strnpcinfo(3)), atoi(.@cmd$[1]);
- return 1;
- }
- else if (.@cmd$[0] == "emote")
- {
- unitemote getnpcid(), atoi(.@cmd$[1]);
- }
- else if (.@cmd$[0] == "class")
- {
- .class = atoi(.@cmd$[1]);
- }
- else if (.@cmd$[0] == "warp")
- {
- .@pos = -1;
- .@map$ = "";
- .@pos_idx = 1;
- if (getarraysize(.@cmd$) == 3)
- {
- .@map$ = .@cmd$[1];
- .@pos_idx = 2;
- }
- .@pos = findmovegraphlabel(.@cmd$[.@pos_idx]);
- if (.@pos != -1)
- {
- .@x = getvariableofnpc(.movepos_x1[.@pos], strnpcinfo(3));
- .@y = getvariableofnpc(.movepos_y1[.@pos], strnpcinfo(3));
- if (getstrlen(.@map$) > 0)
- unitwarp getnpcid(), .@map$, .@x, .@y;
- else
- movenpc strnpcinfo(3), .@x, .@y;
- set getvariableofnpc(.movepos, strnpcinfo(3)), .@pos;
- }
- else
- {
- consolemes(CONSOLEMES_DEBUG, "execmovecmd: unknown WARP destination label: " + .@cmd$[1]);
- }
- }
- else if (.@cmd$[0] == "call")
- {
- switch (getarraysize(.@cmd$))
- {
- case 1:
- consolemes(CONSOLEMES_DEBUG, "execmovecmd: CALL command needs some parameters");
- return 0;
- case 2:
- return callfunc(.@cmd$[1]);
- break;
- case 3:
- return callfunc(.@cmd$[1], .@cmd$[2]);
- case 4:
- default:
- return callfunc(.@cmd$[1], .@cmd$[2], .@cmd$[3]);
- }
- }
- else if (.@cmd$[0] == "speed")
- {
- .speed = atoi(.@cmd$[1]);
- }
- else if (.@cmd$[0] == "say")
- {
- deletearray .@cmd$[0], 1;
- npctalk implode(.@cmd$, " ");
- }
- else if (.@cmd$[0] == "debugmes")
- {
- deletearray .@cmd$[0], 1;
- consolemes(CONSOLEMES_DEBUG, implode(.@cmd$, " "));
- }
- else if (.@cmd$[0] == "flags")
- {
- set getvariableofnpc(.mg_flags, strnpcinfo(3)), axtoi(.@cmd$[1]);
- }
- else if (.@cmd$[0] == "flags_0")
- {
- .@flags = getvariableofnpc(.mg_flags, strnpcinfo(3));
- .@flags &= ~axtoi(.@cmd$[1]);
- set getvariableofnpc(.mg_flags, strnpcinfo(3)), .@flags;
- }
- else if (.@cmd$[0] == "flags_1")
- {
- .@flags = getvariableofnpc(.mg_flags, strnpcinfo(3));
- .@flags |= axtoi(.@cmd$[1]);
- set getvariableofnpc(.mg_flags, strnpcinfo(3)), .@flags;
- }
- else
- {
- consolemes(CONSOLEMES_DEBUG, "Unknown move graph cmd: " + .@cmd$[0]);
- }
- return 0;
-}
-
-function script getnextmovecmd {
- .@cmds$ = getvariableofnpc(.nextcmd$, strnpcinfo(3));
- .@firstCmd$ = .@cmds$;
- .@restCmd$ = "moveon";
- .@index = strpos(.@cmds$, ";");
- if (.@index >= 0)
- {
- .@firstCmd$ = substr(.@cmds$, 0, .@index - 1);
- .@restCmd$ = substr(.@cmds$, .@index + 1, getstrlen(.@cmds$) - 1);
- }
- // npcdebug "firstCmd = " + .@firstCmd$ + " restCmd = " + .@restCmd$;
- set getvariableofnpc(.nextcmd$, strnpcinfo(3)), .@restCmd$;
- return strip(.@firstCmd$);
-}
-
-// getrandompoint(x1,y1,x2,y2)
-// -- Get a random walkable point within a map rectangle
-// x1, y1 -- top-left corner of rectangle
-// x2, y2 -- bottom-right corner of rectangle
-// Returns 0 on success and -1 on error;
-// Since we cannot return multiple values, the random
-// coordinates are stored in NPC variables .move__rand_x, .move__rand_y
-function script getrandompoint {
- if (getargcount() < 4)
- {
- consolemes(CONSOLEMES_DEBUG, "error: getrandompoint(x1, y1, x2, y2) takes 4 arguments");
- return -1;
- }
-
- .@max_pokes = 10;
- .@x1 = getarg(0);
- .@y1 = getarg(1);
- .@x2 = getarg(2);
- .@y2 = getarg(3);
- .@rx = -1; .@ry = -1;
-
- getmapxy(.@map$, .@cx, .@cy, 1); // npc location
-
- // let's try max_pokes random cells
- for (.@poke = 0; .@poke < .@max_pokes; .@poke++)
- {
- .@rx = rand(.@x1, .@x2);
- .@ry = rand(.@y1, .@y2);
- if (checknpccell(.@map$, .@rx, .@ry, cell_chkpass))
- goto L_Found;
- }
-
- // we check each cell from random middle point to the end
- for (;.@rx <= .@x2; .@rx++)
- {
- for (;.@ry <= .@y2; .@ry++)
- if (checknpccell(.@map$, .@rx, .@ry, cell_chkpass))
- goto L_Found;
- .@ry = .@y1;
- }
-
- // we check the rectangle from beginning to end
- for (.@rx = .@x1; .@rx <= .@x2; .@rx++)
- for (.@ry = .@y1; .@ry <= .@y2; .@ry++)
- if (checknpccell(.@map$, .@rx, .@ry, cell_chkpass))
- goto L_Found;
-
- // finally, if we don't find anything
- consolemes(CONSOLEMES_DEBUG, "error: getrandompoint: cannot find walkable cell in rectangle [(" + .@x1 + "," + .@y1 + ") , (" + .@x2 + "," + .@y2 + ")]");
- return -1;
-
-L_Found:
- set getvariableofnpc(.move__rand_x, strnpcinfo(3)), .@rx;
- set getvariableofnpc(.move__rand_y, strnpcinfo(3)), .@ry;
- return 0;
-}
-
-// wrapper function for npcwalkto. It can accept 4 parameters.
-// If #3 and #4 params are set, the walkto location is chosen
-// from rectangle (x1,y1,x2,y2).
-// It sets the npc variables .move_target_x, .move_target_y
-// that are used to resume NPC walking
-// Returns 1 if walking is possible, 0 otherwise;
-function script mg_npcwalkto {
- if (getargcount() < 2)
- {
- consolemes(CONSOLEMES_DEBUG, "usage: mg_npcwalkto(x1,y1[,x2,y2])");
- return -1;
- }
-
- .@x = getarg(0);
- .@y = getarg(1);
- .@x2 = getarg(2);
- .@y2 = getarg(3);
-
- if (getargcount() >= 4 && .@x2 > 0 && .@y2 > 0)
- if (!getrandompoint(.@x, .@y, .@x2, .@y2))
- {
- .@x = getvariableofnpc(.move__rand_x, strnpcinfo(3));
- .@y = getvariableofnpc(.move__rand_y, strnpcinfo(3));
- }
- else
- return 0;
-
- if (npcwalkto(.@x, .@y))
- {
- set getvariableofnpc(.move_target_x, strnpcinfo(3)), .@x;
- set getvariableofnpc(.move_target_y, strnpcinfo(3)), .@y;
- return 1;
- }
- return 0;
-}
-
-function script movetonextpoint {
- .@wait = getvariableofnpc(.waitticks, strnpcinfo(3));
- if (.@wait > 0)
- {
- .@wait--;
- set getvariableofnpc(.waitticks, strnpcinfo(3)), .@wait;
- return;
- }
-
- .@nextcmd$ = "";
- while (.@nextcmd$ != "moveon")
- {
- .@nextcmd$ = getnextmovecmd();
- npcdebug " " + .@nextcmd$;
- if (execmovecmd(.@nextcmd$))
- return;
- }
-
- // choose a random path from all possible paths
- .@size = getarraysize(getvariableofnpc(.movepos_x1, strnpcinfo(3)));
- .@pos = getvariableofnpc(.movepos, strnpcinfo(3));
- .@curr_flags = getvariableofnpc(.mg_flags, strnpcinfo(3));
- .@cur = 0;
- .@weight_sum = 0;
- // .@dbg$ = getvariableofnpc(.movegraphlabels$[.@pos], strnpcinfo(3)) + ": ";
-
- for (.@i = 0; .@i < .@size; .@i++)
- {
- .@index = .@pos * .@size + .@i;
- .@cmd$ = getvariableofnpc(.movegraphcmd$[.@index], strnpcinfo(3));
- .@flags = getvariableofnpc(.movegraphflags[.@index], strnpcinfo(3));
- if (.@cmd$ != "" &&
- .@curr_flags & .@flags)
- {
- .@nextpos[.@cur] = .@i;
- .@weights[.@cur] = getvariableofnpc(.movegraphweight[.@index], strnpcinfo(3));
- // .@dbg$ += getvariableofnpc(.movegraphlabels$[.@i], strnpcinfo(3)) + "=" + .@weights[.@cur] + " ";
- .@weight_sum += .@weights[.@cur];
- .@cur++;
- }
- }
- // npcdebug .@dbg$;
-
- if (!.@weight_sum)
- {
- npcdebug("error: cannot pick next walk point. flags=" +
- getvariableofnpc(.mg_flags, strnpcinfo(3)));
- return;
- }
-
- .@pick_tries = 0;
-L_TryPick:
- // pick a random number based on weight_sum
- .@rnd = rand(.@weight_sum);
- .@k = -1; .@weight_sum = 0;
- while (.@rnd >= .@weight_sum)
- {
- .@k++;
- .@weight_sum += .@weights[.@k];
- }
-
- .@next_idx = .@nextpos[.@k];
- .@next_x1 = getvariableofnpc(.movepos_x1[.@next_idx], strnpcinfo(3));
- .@next_y1 = getvariableofnpc(.movepos_y1[.@next_idx], strnpcinfo(3));
- .@next_x2 = getvariableofnpc(.movepos_x2[.@next_idx], strnpcinfo(3));
- .@next_y2 = getvariableofnpc(.movepos_y2[.@next_idx], strnpcinfo(3));
-
- if (!mg_npcwalkto(.@next_x1, .@next_y1, .@next_x2, .@next_y2))
- {
- if (.@pick_tries < 10)
- {
- .@pick_tries++;
- goto L_TryPick;
- }
-
- // move to a nearby position
- .@x1 = getvariableofnpc(.movepos_x1[.@pos], strnpcinfo(3));
- .@y1 = getvariableofnpc(.movepos_y1[.@pos], strnpcinfo(3));
- .@x2 = getvariableofnpc(.movepos_x2[.@pos], strnpcinfo(3));
- .@y2 = getvariableofnpc(.movepos_y2[.@pos], strnpcinfo(3));
- mg_npcwalkto(.@x1, .@y1, .@x2, .@y2);
- set getvariableofnpc(.nextcmd$, strnpcinfo(3)), "wait 1";
-
- return;
- }
-
- if (getvariableofnpc(.debug, strnpcinfo(3)))
- {
- getmapxy(.@map$, .@cx, .@cy, 1);
- .@dist = distance(.@cx, .@cy, .@next_x1, .@next_y1);
- npcdebug("moving to " + getvariableofnpc(.movegraphlabels$[.@next_idx], strnpcinfo(3)) +
- " ("+ getvariableofnpc(.move_target_x, strnpcinfo(3)) +
- "," + getvariableofnpc(.move_target_y, strnpcinfo(3)) +
- ") [distance=" + .@dist +
- "] flags=" + getvariableofnpc(.mg_flags, strnpcinfo(3)));
- }
-
- .@nextcmd$ = getvariableofnpc(.movegraphcmd$[.@pos * .@size + .@next_idx], strnpcinfo(3));
- set getvariableofnpc(.nextcmd$, strnpcinfo(3)), .@nextcmd$;
- set getvariableofnpc(.movepos, strnpcinfo(3)), .@next_idx;
- return;
-}
-
-// initial actions for npc when using move graphs.
-// function can accept 2 arguments:
-// 1: action sequence, for example "speed 200; dir 4". Default is "moveon"
-// 2: start point label. Default is #0 from move graph labels
-function script firstmove {
- .@nextcmd$ = getarg(0, "moveon");
- .@initpos = findmovegraphlabel(getarg(1, ""));
- if (.@initpos < 0) .@initpos = 0;
-
- set getvariableofnpc(.movepos, strnpcinfo(3)), .@initpos;
- movenpc strnpcinfo(3), getvariableofnpc(.movepos_x1[.@initpos], strnpcinfo(3)),
- getvariableofnpc(.movepos_y1[.@initpos], strnpcinfo(3));
- set getvariableofnpc(.nextcmd$, strnpcinfo(3)), .@nextcmd$;
- set getvariableofnpc(.waitticks, strnpcinfo(3)), -1;
- set getvariableofnpc(.mg_flags, strnpcinfo(3)), 0xffff;
- movetonextpoint;
- return;
-}
-
-function script npc_pausemove {
- stopnpctimer;
- .@move_after = 0;
-
- if (isunitwalking())
- {
- .@move_after = 1;
- npcwalkto .x, .y;
- npcstop;
- }
- set getvariableofnpc(.move_after_pause, strnpcinfo(3)), .@move_after;
-
- return 0;
-}
-
-function script npc_resumemove {
- startnpctimer;
-
- if (getvariableofnpc(.move_after_pause, strnpcinfo(3)))
- {
- .@x = getvariableofnpc(.move_target_x, strnpcinfo(3));
- .@y = getvariableofnpc(.move_target_y, strnpcinfo(3));
- npcwalkto .@x, .@y;
- }
-
- return 0;
-}
-
-// npc_turntoxy(x,y)
-// turn npc toward an object at position (x,y)
-function script npc_turntoxy {
- .@target_x = getarg(0);
- .@target_y = getarg(1);
- .@dx = abs(.@target_x - .x);
- .@dy = abs(.@target_y - .y);
-
- if (.@dx > .@dy)
- .dir = .@target_x >= .x ? 6 : 2;
- else
- .dir = .@target_y >= .y ? 0 : 4;
-
- return 0;
-}
-
-function script dographmovestep {
- if (!isunitwalking())
- {
- movetonextpoint;
- }
- initnpctimer;
- end;
-}