RequireSystemScript("time.js");
/**
Tile movement script
To use you have to do:
RequireScript("tile_movement.js");
SetUpdateScript("UpdateMovement()");
*/
var g_still_to_move = -1;
var g_last_command = -1;
var g_allow_movement = true;
var g_tile_movement = true;
var g_keys_pressed = new Array();
function AddKey(key)
{
g_keys_pressed.push(key);
}
function RemoveKey(key)
{
for (var i = 0; i < g_keys_pressed.length; i++)
{
if (g_keys_pressed
== key)
g_keys_pressed.splice(i, 1);
}
}
function UpdateTileMovement()
{
var person = GetInputPerson();
if(g_allow_movement)
{
if (g_keys_pressed.length > 0)
{
if(g_still_to_move <= 0 && IsCommandQueueEmpty(person))
{
var delta_x = 0;
var delta_y = 0;
var move_command = COMMAND_WAIT;
var face_command = COMMAND_WAIT;
if (g_keys_pressed[g_keys_pressed.length - 1] == KEY_UP) move_command = COMMAND_MOVE_NORTH;
if (g_keys_pressed[g_keys_pressed.length - 1] == KEY_RIGHT) move_command = COMMAND_MOVE_EAST;
if (g_keys_pressed[g_keys_pressed.length - 1] == KEY_DOWN) move_command = COMMAND_MOVE_SOUTH;
if (g_keys_pressed[g_keys_pressed.length - 1] == KEY_LEFT) move_command = COMMAND_MOVE_WEST;
switch (move_command)
{
case COMMAND_MOVE_NORTH:
face_command = COMMAND_FACE_NORTH;
delta_y = g_tile_movement ? (GetTileHeight() / GetPersonSpeedY(person)) : GetPersonSpeedY(person);
delta_y *= -1;
break;
case COMMAND_MOVE_EAST:
face_command = COMMAND_FACE_EAST;
delta_x = g_tile_movement ? (GetTileWidth() / GetPersonSpeedX(person)) : GetPersonSpeedX(person);
break;
case COMMAND_MOVE_SOUTH:
face_command = COMMAND_FACE_SOUTH;
delta_y = g_tile_movement ? (GetTileHeight() / GetPersonSpeedY(person)) : GetPersonSpeedY(person);
break;
case COMMAND_MOVE_WEST:
face_command = COMMAND_FACE_WEST;
delta_x = g_tile_movement ? (GetTileWidth() / GetPersonSpeedX(person)) : GetPersonSpeedX(person);
delta_x *= -1;
break;
}
if (move_command != g_last_command)
{
QueuePersonCommand(person, face_command, true);
g_last_command = move_command;
}
if( !IsPersonObstructed(person, GetPersonX(person) + delta_x, GetPersonY(person) + delta_y) )
{
g_still_to_move = Math.max(Math.abs(delta_x), Math.abs(delta_y));
}
}
}
}
if(g_still_to_move > 0 && IsCommandQueueEmpty(person))
{
switch(g_last_command)
{
case COMMAND_MOVE_NORTH:
QueuePersonCommand(person, COMMAND_FACE_NORTH, true);
QueuePersonCommand(person, COMMAND_MOVE_NORTH, false);
g_still_to_move -= 1;
break;
case COMMAND_MOVE_EAST:
QueuePersonCommand(person, COMMAND_FACE_EAST, true);
QueuePersonCommand(person, COMMAND_MOVE_EAST, false);
g_still_to_move -= 1;
break;
case COMMAND_MOVE_SOUTH:
QueuePersonCommand(person, COMMAND_FACE_SOUTH, true);
QueuePersonCommand(person, COMMAND_MOVE_SOUTH, false);
g_still_to_move -= 1;
break;
case COMMAND_MOVE_WEST:
QueuePersonCommand(person, COMMAND_FACE_WEST, true);
QueuePersonCommand(person, COMMAND_MOVE_WEST, false);
g_still_to_move -= 1;
break;
}
}
}
function TileWarp(x, y, layer, map)
{
var width = 0;
var height = 0;
if (IsInputAttached())
{
var person = GetInputPerson();
var base = GetPersonBase(person);
width = base.x2 - base.x1;
height = base.y2 - base.y1;
}
x = (GetTileWidth() * x) + (GetTileWidth() / 2) + Math.floor( (width/2) - (GetTileWidth() / 2));
y = (GetTileHeight() * y) + (GetTileHeight() / 2) + Math.floor( (height/2));
Warp(x, y, layer, map, x, y);
}
function Warp(x, y, layer, map, x, y)
{
var person = GetInputPerson();
ClearPersonCommands(person)
if (IsInputAttached())
{
if (typeof(map) == typeof("string")) ChangeMap(map);
if (typeof(layer) == typeof(0) && layer >= 0) SetPersonLayer(person, layer);
if(GetPersonDirection(person) == "north")
{
if (typeof(x) == typeof(0)) SetPersonX(person, x);
if (typeof == typeof(0)) SetPersonY(person, y);
}
else if(GetPersonDirection(person) == "south")
{
if (typeof(x) == typeof(0)) SetPersonX(person, x);
if (typeof == typeof(0)) SetPersonY(person, y + (GetPersonSpeedY(person)/2));
}
else if(GetPersonDirection(person) == "west")
{
if (typeof(x) == typeof(0)) SetPersonX(person, x + (GetTileWidth() / 2));
if (typeof == typeof(0)) SetPersonY(person, y - (GetTileHeight() /2));
}
else if(GetPersonDirection(person) == "east")
{
if (typeof(x) == typeof(0)) SetPersonX(person, x - (GetTileWidth() / 2) + (GetPersonSpeedX(person)/2));
if (typeof == typeof(0)) SetPersonY(person, y - (GetTileHeight() /2));
}
}
}
function Move(name, command, tiles, immediate)
{
switch (command)
{
case COMMAND_MOVE_NORTH:
QueuePersonCommand(name, COMMAND_FACE_NORTH, immediate);
for (var i = 0; i < GetTileHeight() * tiles; ++i)
QueuePersonCommand(name, command, false);
break;
case COMMAND_MOVE_SOUTH:
QueuePersonCommand(name, COMMAND_FACE_SOUTH, immediate);
for (var i = 0; i < GetTileHeight() * tiles; ++i)
QueuePersonCommand(name, command, false);
break;
case COMMAND_MOVE_EAST:
QueuePersonCommand(name, COMMAND_FACE_EAST, immediate);
for (var i = 0; i < GetTileWidth() * tiles; ++i)
QueuePersonCommand(name, command, false);
break;
case COMMAND_MOVE_WEST:
QueuePersonCommand(name, COMMAND_FACE_WEST, immediate);
for (var i = 0; i < GetTileWidth() * tiles; ++i)
QueuePersonCommand(name, command, false);
break;
}
}
function FacePlayer(person_name)
{
var directions = ["north", "northeast", "east", "southeast",
"south", "southwest", "west", "northwest"];
var opposite_directions = ["south", "southwest", "west", "northwest",
"north", "northeast", "east", "southeast"];
var direction_index = -1;
if (IsInputAttached())
{
var player_direction = GetPersonDirection(GetInputPerson());
for (var i = 0; i < directions.length; ++i)
{
if (directions == player_direction)
direction_index = i;
}
if (direction_index > -1)
{
SetPersonDirection(person_name, opposite_directions[direction_index]);
}
}
return (direction_index > -1);
}
function RandomMovement()
{
var person = GetCurrentPerson();
var random_movement = Math.floor(Math.random() * 4);
var random_tiles = Math.round(Math.random() * 5);
switch(random_movement)
{
case 0:
Move(person, COMMAND_MOVE_NORTH, random_tiles, true);
break;
case 1:
Move(person, COMMAND_MOVE_SOUTH, random_tiles, true);
break;
case 2:
Move(person, COMMAND_MOVE_EAST, random_tiles, true);
break;
case 3:
Move(person, COMMAND_MOVE_WEST, random_tiles, true);
break;
}
}
function GetPlayerTileName()
{
if (!IsInputAttached())
return "";
var player = GetInputPerson();
var pixel_x = GetPersonX(player);
var pixel_y = GetPersonY(player);
var layer = GetPersonLayer(layer);
var tile_x = pixel_x / GetTileWidth();
var tile_y = pixel_y / GetTileHeight();
if (x < 0 || y < 0) return "";
if (x >= GetLayerWidth(layer) || y >= GetLayerHeight(layer)) return "";
var tile_index = GetTile(x, y, layer);
var tile_name = GetTileName(tile_index);
return tile_name;
}