|
new file 100644
|
|
|
dofile "utils.lua";
|
|
|
dofile "battlefield.lua";
|
|
|
dofile "items.lua";
|
|
|
|
|
|
global {
|
|
|
tutorial_pen = false;
|
|
|
tutorial_paper = false;
|
|
|
|
|
|
tutorial_pen_looked = false;
|
|
|
tutorial_paper_looked = false;
|
|
|
|
|
|
tutorial_paper_written = false;
|
|
|
};
|
|
|
|
|
|
pl = player {
|
|
|
nam = 'player';
|
|
|
var {
|
|
|
hp = 10;
|
|
|
};
|
|
|
};
|
|
|
|
|
|
pencil = obj {
|
|
|
nam = 'Карандаш';
|
|
|
dsc = 'Еще в этой комнате есть карандаш. Чтобы взять его, нажмите на подсвеченную {ссылку}.';
|
|
|
tak = function(s)
|
|
|
tutorial_pen = true;
|
|
|
return 'Вы берете карандаш. Обратите внимание, что описание комнаты исчезло. Чтобы увидеть его снова -- нажмите на ее заголовок. ';
|
|
|
end;
|
|
|
inv = function(s)
|
|
|
tutorial_pen_looked = true;
|
|
|
return [[Хороший остро-заточенный карандаш. ]];
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
paper = obj {
|
|
|
nam = 'Лист бумаги';
|
|
|
dsc = 'А рядом с карандашом лежит {лист бумаги}. Его тоже можно взять. ';
|
|
|
tak = function(s)
|
|
|
tutorial_paper = true;
|
|
|
return 'Вы берете лист бумаги. Обратите внимание, что описание комнаты исчезло. Чтобы увидеть его снова -- нажмите на ее заголовок. ';
|
|
|
end;
|
|
|
inv = function(s)
|
|
|
tutorial_paper_looked = true;
|
|
|
pr [[На листе бумаги написано следующее: "Отлично, теперь вы знаете, как осматривать предметы. Теперь попробуйте дописать что-то карандашом на этом листе бумаги. Для этого нажмите на карандаш, а потом нажмите на лист бумаги". ]];
|
|
|
if tutorial_paper_written then
|
|
|
path('Налево'):enable();
|
|
|
path('Направо'):enable();
|
|
|
pn [[На листе бумаги дописано: "Также, в комнатах могут присутствовать переходы. Они используются для того, чтобы перемещаться из комнаты в комнату. Сейчас в комнате, где вы находитесь появились два перехода: "Налево" и "Направо". Используйте любой из них, чтобы продолжить. ]];
|
|
|
end;
|
|
|
end;
|
|
|
used = function(s, o)
|
|
|
if o == pencil then
|
|
|
tutorial_paper_written = true;
|
|
|
return [[Вы дописываете несколько слов. Осмотрите бумагу еще раз, чтобы их прочитать. ]];
|
|
|
end;
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
main = room {
|
|
|
nam = 'Добро пожаловать!';
|
|
|
dsc = function(s)
|
|
|
pr [[Этот раздел кратко познакомит вас с тем, как играть в Пробуждение и другие игры на движке Instead. ^Игра состоит из комнат, у каждой из которых есть название, описание и описание находящихся в ней объектов. ^Это тоже комната. Она называется "Добро пожаловать!", описание ее вы сейчас читаете. ]];
|
|
|
if tutorial_pen and not tutorial_pen_looked then
|
|
|
pr [[^Вы взяли карандаш. Он появился у вас в инвентаре. Нажмите на него дважды, чтобы рассмотреть его повнимательнее. ]];
|
|
|
end;
|
|
|
if tutorial_paper then
|
|
|
pr [[^Вы взяли лист бумаги. Он появился у вас в инвентаре. Нажмите на него дважды, чтобы узнать, что делать дальше. ]];
|
|
|
end;
|
|
|
end;
|
|
|
obj = {
|
|
|
pencil;
|
|
|
paper;
|
|
|
};
|
|
|
way = {
|
|
|
vroom('Налево', 'tutorial_2'):disable();
|
|
|
vroom('Направо', 'tutorial_2'):disable();
|
|
|
};
|
|
|
}
|
|
|
|
|
|
key = obj {
|
|
|
nam = 'Ключ';
|
|
|
dsc = 'На сундуке лежит {ключ}.';
|
|
|
inv = 'Ключ от сундука. ';
|
|
|
tak = 'Вы берете ключ. Попробуйте открыть им сундук. Щелкните сперва на ключ, затем на сундук. ';
|
|
|
};
|
|
|
|
|
|
chest = obj {
|
|
|
var {
|
|
|
open = false;
|
|
|
empty = false;
|
|
|
};
|
|
|
nam = 'Сундук';
|
|
|
dsc = 'В углу комнаты стоит старый {сундук}.';
|
|
|
act = function(s)
|
|
|
if s.open then
|
|
|
if s.empty then
|
|
|
return 'Сундук пуст. Если вы съели малиновый пирог -- вы можете покинуть комнату. Если нет -- съешьте его, нажав два раза на предмет в инвентаре. ';
|
|
|
else
|
|
|
s.empty = true;
|
|
|
take(pie);
|
|
|
return 'Вы забираете из сундука малиновый пирог. Он очень свежий и аппетитно пахнет. Съешьте его, нажав два раза на предмет в инвентаре. ';
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
return 'Сундук заперт. Чтобы открыть его -- возьмите ключ и используйте его на сундуке. Щелкните сначала на ключ в инвентаре, затем на сундук. '
|
|
|
|
|
|
end;
|
|
|
used = function(s, o)
|
|
|
if o == key then
|
|
|
s.open = true;
|
|
|
remove(key, pl);
|
|
|
return 'Вы открыли сундук. Теперь щелкните на него еще раз, чтобы взять малиновый пирог. ';
|
|
|
end;
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
pie = obj {
|
|
|
nam = 'Малиновый пирог';
|
|
|
inv = function(s)
|
|
|
path('Продолжить'):enable();
|
|
|
remove('pie', pl);
|
|
|
return 'Вы съедаете малиновый пирог. Очень вкусно. Теперь можно идти дальше. ';
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
tutorial_2 = room {
|
|
|
nam = 'Еще одна комната';
|
|
|
entered = function(s)
|
|
|
remove('pencil', pl);
|
|
|
remove('paper', pl);
|
|
|
end;
|
|
|
dsc = 'В этой комнате вы научитесь еще нескольким действиям с предметами. Вот несколько ключевых моментов: ^1. Когда вы дважды щелкаете на предмете вы используете те предметы, которые можно использовать. Другие предметы при таком же действии вы просто осмотрите. ^2. Предмет можно использовать не только на другие предметы в инвентаре, но и на предметы в комнате. ';
|
|
|
obj = {
|
|
|
'chest';
|
|
|
'key';
|
|
|
};
|
|
|
way = {
|
|
|
kh_vroom('Продолжить', 'combat_intro'):disable();
|
|
|
};
|
|
|
};
|
|
|
|
|
|
combat_intro = room {
|
|
|
nam = 'Подготовка к бою';
|
|
|
pic = 'images/battle_bg_cave.png;images/stones.png@96,96;images/player.png@96,192;images/king_crab.png@96,0';
|
|
|
dsc = [[Бой -- одна из механик, с которой вам придется столкнуться в Пробуждении. На рисунке выше вы видите, как выглядит основной экран боя. Поле боя разделено на 49 (7x7) клеток, в каждой из которых может быть персонаж(игрок, союзник или противник -- здесь игрок изображен фигуркой в скафандре), враг(здесь это краб) или препятствие(груда камней в центре). Во время вы можете использовать обычный способ взаимодействия с объектами(через инвентарь и описание) или вы можете щелкать на клетки поля боя. При первом щелчке, в клетке, куда вы нажмете появится иконка доступного действия(если вы можете что-то сделать с этой клеткой). Вот список иконок и действий, которые они означают: ^]] .. img('images/hit_cursor.png') .. [[ -- атака в ближнем бою. ^]] .. img('images/shoot_cursor.png') .. [[ -- атака в дальнем бою. ^]] .. img('images/walk_cursor.png') .. [[ -- передвижение. ^]] .. img('images/wait_cursor.png') .. [[ -- пропуск хода. ^Сейчас попробуйте отыграть пробный бой против краба. Обратите внимание, что у вас в инвентаре появился револьвер -- вы можете использовать его как оружие против краба. Не бойтесь, это учебный краб, он не нанесет вам вреда. В реальном бою всегда следите за здоровьем персонажа. ]];
|
|
|
entered = function(s)
|
|
|
take('item_colt');
|
|
|
end;
|
|
|
way = {
|
|
|
kh_vroom('В бой', 'combat');
|
|
|
};
|
|
|
};
|
|
|
|
|
|
king_crab = combatant {
|
|
|
nam = "king_crab";
|
|
|
disp = "краб";
|
|
|
disp2 = "краба";
|
|
|
disp3 = "крабу";
|
|
|
var {
|
|
|
x = 4;
|
|
|
y = 1;
|
|
|
hp = 6;
|
|
|
};
|
|
|
pic = "images/king_crab.png";
|
|
|
shootHit = "Вы стреляете в краба и попадаете в него. ";
|
|
|
shootMiss = "Вы стреляете в краба, но не попадаете в него. ";
|
|
|
shootKill = "Вы стреляете в краба и он умирает. ";
|
|
|
handHit = "Вы ударяете краба. ";
|
|
|
handKill = "Вы ударяет краба, убивая его. ";
|
|
|
handFar = "Слишком далеко. ";
|
|
|
enemy = true;
|
|
|
state = function(s)
|
|
|
if s.hp == 6 then
|
|
|
return "";
|
|
|
elseif s.hp >= 5 then
|
|
|
return "Он легко ранен. ";
|
|
|
elseif s.hp >= 3 then
|
|
|
return "Он ранен. ";
|
|
|
else
|
|
|
return "Он тяжело ранен. ";
|
|
|
end;
|
|
|
end;
|
|
|
dsc = function(s)
|
|
|
if (s.hp > 0) then
|
|
|
return "{Краб} готов к бою. ";
|
|
|
else
|
|
|
return false;
|
|
|
end;
|
|
|
end;
|
|
|
make_turn = function(s)
|
|
|
local enemies = { };
|
|
|
for item=1,#here().obj do
|
|
|
local obj = here().obj[item];
|
|
|
if (obj.ally and obj.hp > 0) then
|
|
|
local p = here():getWalkDistance(s.x, s.y, obj.x, obj.y);
|
|
|
if (p) then
|
|
|
table.insert(enemies, {
|
|
|
o = obj,
|
|
|
p = p
|
|
|
});
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
table.sort(enemies, function(a, b)
|
|
|
return (a.p.l < b.p.l);
|
|
|
end);
|
|
|
|
|
|
local enemy = enemies[1];
|
|
|
local path = here():getWalkDistance(s.x, s.y, here().plX, here().plY);
|
|
|
if (not enemy or path and enemy.p.l > path.l ) then
|
|
|
enemy = pl;
|
|
|
else
|
|
|
path = enemy.p;
|
|
|
enemy = enemy.o;
|
|
|
end;
|
|
|
|
|
|
if (not enemy or not path) then
|
|
|
pr("Краб ждет. ");
|
|
|
return;
|
|
|
end;
|
|
|
|
|
|
-- AI Order:
|
|
|
-- If has spear and enemy is close - hit with spear
|
|
|
-- walk towards nearest enemy
|
|
|
-- If enemy close - hit with claws
|
|
|
|
|
|
if (math.abs(s.x - enemy.x) == 1 and s.y == enemy.y or
|
|
|
s.x == enemy.x and math.abs(s.y - enemy.y) == 1) then
|
|
|
enemy.hp = enemy.hp - 0;
|
|
|
pr("Краб бьет вас и попадает. Но поскольку краб учебный, урона он не наносит. ");
|
|
|
return;
|
|
|
end;
|
|
|
|
|
|
s.x = path.p[2][1];
|
|
|
s.y = path.p[2][2];
|
|
|
pr("Краб идет к вам. ");
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
combat = battlefield {
|
|
|
nam = "Бой";
|
|
|
var {
|
|
|
plX = 4;
|
|
|
plY = 7;
|
|
|
};
|
|
|
map = {
|
|
|
{2,0,0,0,0,0,2};
|
|
|
{2,0,0,0,0,0,2};
|
|
|
{2,0,0,0,0,0,2};
|
|
|
{2,0,0,1,0,0,2};
|
|
|
{2,0,0,0,0,0,2};
|
|
|
{2,0,0,0,0,0,2};
|
|
|
{2,0,0,0,0,0,2};
|
|
|
};
|
|
|
bcg_pic = 'images/battle_bg_cave.png';
|
|
|
win = "win";
|
|
|
lose = "game_over";
|
|
|
obstacle = "images/stones.png";
|
|
|
obj = {
|
|
|
"king_crab";
|
|
|
};
|
|
|
};
|
|
|
|
|
|
win = room {
|
|
|
nam = 'Поздравляем!';
|
|
|
dsc = [[Теперь вы знаете как играть в Пробуждение. Удачи в прохождении игры!]];
|
|
|
obj = {
|
|
|
obj {
|
|
|
nam = 'Закончить обучение';
|
|
|
dsc = '{Закончить обучение}';
|
|
|
act = function(s)
|
|
|
gamefile('main.lua', true);
|
|
|
end;
|
|
|
};
|
|
|
};
|
|
|
};
|
|
\ No newline at end of file
|