insteadose-3/lib.lua

569 lines
13 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

require "sprites"
require "click"
require "snapshots"
require "prefs"
require "translate"
function complete_(game)
return function()
prefs[game] = true;
prefs:store();
end
end
function iscomplete(game)
prefs:load();
return prefs[game] ~= nil;
end
alphas = {
["А"] = { 0, 4}
,["Б"] = { 5, 4}
,["В"] = { 10, 4}
,["Г"] = { 15, 4}
,["Д"] = { 20, 6}
,["Е"] = { 27, 4}
,["Ж"] = { 32, 5}
,["З"] = { 38, 4}
,["И"] = { 43, 4}
,["К"] = { 48, 4}
,["Л"] = { 53, 5}
,["М"] = { 59, 5}
,["Н"] = { 65, 4}
,["О"] = { 70, 4}
,["П"] = { 75, 4}
,["Р"] = { 80, 4}
,["С"] = { 85, 4}
,["Т"] = { 90, 5}
,["У"] = { 96, 4}
,["Ф"] = { 101, 5}
,["Х"] = { 107, 4}
,["Ц"] = { 112, 5}
,["Ч"] = { 118, 4}
,["Ш"] = { 123, 5}
,["Щ"] = { 129, 6}
,["Ъ"] = { 136, 5}
,["Ы"] = { 142, 6}
,["Ь"] = { 149, 4}
,["Э"] = { 154, 4}
,["Ю"] = { 159, 5}
,["Я"] = { 165, 4}
,["0"] = { 170, 4}
,["7"] = { 175, 4}
,["2"] = { 180, 4}
,["Й"] = { 185, 5}
,[" "] = { nil, 2}
,["A"] = { 0, 4}
,["B"] = { 10, 4}
,["C"] = { 85, 4}
,["D"] = { nil, 4}
,["E"] = { 27, 4}
,["F"] = { nil, 2}
,["G"] = { nil, 2}
,["H"] = { 65, 4}
,["I"] = { nil, 2}
,["J"] = { nil, 2}
,["K"] = { 48, 4}
,["L"] = { nil, 2}
,["M"] = { 59, 5}
,["N"] = { nil, 2}
,["O"] = { 70, 4}
,["P"] = { 80, 4}
,["Q"] = { nil, 2}
,["R"] = { nil, 2}
,["S"] = { nil, 2}
,["T"] = { 90, 5}
,["U"] = { nil, 2}
,["V"] = { nil, 2}
,["W"] = { nil, 2}
,["X"] = { nil, 2}
,["Y"] = { nil, 2}
,["Z"] = { nil, 2}
}
function drawalpha(num,str)
local px = game.cache_alpha1;
if px == nil then
px = sprite.load("gfx/alpha.png");
game.cache_alpha1 = px;
end
local px2 = game.cache_alpha2;
if px2 == nil then
px2 = sprite.load("gfx/nums.png");
game.cache_alpha2 = px2;
end
local len = 0;
for i = 1, #str do
local c = string.sub(str,i,i)
if alphas[c] ~= nil then
len = len + (alphas[c][2]*5) + 5;
end
end
local spr = sprite.box(500, 200, "black");
if num ~= nil then
--28
local strnum = tostring(num);
if string.len(strnum) == 1 then
sprite.copy(px2, num*4*20, 0, 4*20, 140, spr, 210, 30);
else
local n1 = string.char(strnum:byte(1))+0;
local n2 = string.char(strnum:byte(2))+0;
sprite.copy(px2, n1*4*20, 0, 4*20, 140, spr, 165, 30);
sprite.copy(px2, n2*4*20, 0, 4*20, 140, spr, 255, 30);
end
end
local xl = (500-len)/2;
for i = 1, #str do
local c = string.sub(str,i,i)
if alphas[c] ~= nil then
local x,w = alphas[c][1],alphas[c][2];
if x ~= nil then
sprite.draw(px, x*5, 0, w*5, 35, spr, xl, 82);
end
xl = xl + (w*5) + 5;
end
end
return spr;
end
function cleancache()
if game.cache_alpha1 ~= nil then
sprite.free(game.cache_alpha1);
game.cache_alpha1 = nil;
end
if game.cache_alpha2 ~= nil then
sprite.free(game.cache_alpha2);
game.cache_alpha2 = nil;
end
if game.cache ~= nil then
sprite.free(game.cache);
game.cache = nil;
end
if game.cache2 ~= nil then
sprite.free(game.cache2);
game.cache2 = nil;
end
if game.cache_nums ~= nil then
for k,v in pairs(game.cache_nums) do
sprite.free(v);
game.cache_nums[k] = nil;
end
game.cache_nums = nil;
end
if game.cache_sprites ~= nil then
for k,v in pairs(game.cache_sprites) do
sprite.free(v);
game.cache_sprites[k] = nil;
end
game.cache_sprites = nil;
end
end
local old_snapshot = restore_snapshot;
function restore_snapshot(n)
cleancache();
return old_snapshot(n);
end
local old_title = instead.get_title;
instead.get_title = function()
local r = old_title();
return txttop(r)..img("blank:10x50");
end
function if_(cnd,x,y)
return function(s)
if apply(cnd,s) then
return x;
else
return y;
end
end
end
function restart_item(gf)
restart_obj = menu {
nam = "restart_item"
,disp = txtb("Начать сначала")
,inv = gamefile_(gf..".lua")
};
sep_obj = menu {nam=" ", inv = function() end};
take(restart_obj);
take(sep_obj);
end
local old_room = room;
function room(r)
if r.title ~= nil then
r.pic = function(s)
if s.cache_title == nil then
s.cache_title = drawalpha(s.num,s.title);
end
return s.cache_title;
end
local exit = r.exit;
r.exit = function(s,v,w)
if exit ~= nil then
local ret = exit(s,v,w);
if ret ~= nil then
return ret;
end
end
if s.cache_title ~= nil then
sprite.free(s.cache_title);
s.cache_title = nil;
end
end
end
return old_room(r);
end
function string:charat(i)
local c = 0;
for uchar in string.gfind(self, "([%z\1-\127\194-\244][\128-\191]*)") do
c = c + 1;
if c == i then
return uchar;
end
end
end
function timerpause(snum,enum,next)
local sh = 1;
if enum < snum then
sh = -1;
enum = enum - 1;
else
enum = enum + 1;
end
if game.cache_nums == nil then
game.cache_nums = {}
end
return room {
enum = enum, sh = sh, snum = snum,
_cur = snum, _fr=0,
nam = "",
enter = function()
timer:set(50);
end,
pic = function()
if game.cache2 == nil then
game.cache2 = sprite.load(_("gfx/timer1.png"));
end
return game.cache2;
end,
pad = function(s,n)
local sn = tostring(n);
if string.len(sn) < 4 then
return s:pad("0"..sn);
end
return sn;
end,
loadnum = function(s,n)
if game.cache_nums[n] == nil then
game.cache_nums[n] = sprite.load("gfx/"..n..".png");
end
return game.cache_nums[n];
end,
draw = function(s,d)
local d = tostring(d);
local n1,n2,n3,n4 = string.char(d:byte(1)),string.char(d:byte(2)),string.char(d:byte(3)),string.char(d:byte(4));
local y = 67;
if s.s1 ~= n1 then
sprite.copy(s:loadnum(n1), game.cache2, 150+(50*0), y);
s.s1 = n1;
end
if s.s2 ~= n2 then
sprite.copy(s:loadnum(n2), game.cache2, 150+(50*1), y);
s.s2 = n2;
end
if s.s3 ~= n3 then
sprite.copy(s:loadnum(n3), game.cache2, 150+(50*2), y);
s.s3 = n3;
end
if s.s4 ~= n4 then
sprite.copy(s:loadnum(n4), game.cache2, 150+(50*3), y);
s.s4 = n4;
end
if s._cur ~= s.snum then
play_sound("tick");
end
end,
timer = function(s)
s._fr = s._fr + 1;
if not s._nodraw then
local sn = s:pad(s._cur);
s:draw(sn);
if s._fr > 40 then
s._cur = s._cur + s.sh;
end
end
if s._cur == s.enum then
if s._nodraw == nil then
s._nodraw = 0;
end
s._nodraw = s._nodraw + 1;
end
if s._nodraw ~= nil and (s._nodraw == 80 or s.snum == s.enum) then
timer:stop();
s._cur = s.snum;
s._nodraw = nil;
s._fr = 0;
s.s1 = nil;
s.s2 = nil;
s.s3 = nil;
s.s4 = nil;
walk(next);
end
end,
}
end
function loadsprite(vv)
if game.cache_sprites == nil then
game.cache_sprites = {};
end
local spr = game.cache_sprites[vv];
if spr == nil then
spr = sprite.load("gfx/"..vv..".png");
game.cache_sprites[vv] = spr;
end
return spr;
end
game.pic =
function()
local s = here();
if s.pxa == nil then
return;
end
local pxa = tc(s.pxa,s);
if pxa == nil then
return;
end
if game.cache == nil then
game.cache = sprite.load("gfx/pic.png");
else
local pt = sprite.blank(500, 200);
sprite.copy(pt, game.cache, 0, 0);
sprite.free(pt);
end
if game.cache_sprites == nil then
game.cache_sprites = {};
end
for _,v in ipairs(pxa) do
local vv = tc(v[1],s);
if vv ~= nil then
local spr = loadsprite(vv);
local y = v[3];
if y == nil then
if vv == "panel" or vv == "panel_broken" then
y = 60;
elseif vv == "door1" or vv == "door1_open" then
y = 35;
elseif vv == "door2" or vv == "door3" or vv == "door4" or vv == "door2_open" or vv == "door5" or vv == "door5_open" then
y = 60;
elseif vv == "window" or vv == "window2" then
y = 62;
elseif vv == "toolbox" then
y = 171;
elseif vv == "crio" or vv == "crio_blood" then
y = 45;
elseif vv == "robot" or vv == "robot_nohand" or vv == "robot_nohand_blaster" or vv == "robot_cargo" then
y = 75;
elseif vv == "box" then
y = 145;
elseif vv == "shelf" then
y = 60;
elseif vv == "box2" then
y = 50;
elseif vv == "rat" then
y = 135;
elseif vv == "rat_dead" then
y = 100;
elseif vv == "box3" then
y = 110;
elseif vv == "blood" then
y = 107;
elseif vv == "shaft" or vv == "shaft_open" then
y = 55;
elseif vv == "mutant" then
y = 28;
elseif vv == "med" then
y = 60;
elseif vv == "zombi" then
y = 75;
elseif vv == "device" then
y = 65;
elseif vv == "bfg" then
y = 40;
elseif vv == "hole" then
y = 65;
elseif vv == "hole2" then
y = 35;
elseif vv == "washer" then
y = 55;
elseif vv == "toilet" then
y = 90;
elseif vv == "communicator" then
y = 80;
elseif vv == "table" or vv == "table3" or vv == "table3_keys" then
y = 110;
elseif vv == "extin" then
y = 145;
elseif vv == "fridge" then
y = 105;
elseif vv == "books" then
y = 100;
elseif vv == "table2" then
y = 140;
elseif vv == "window3" then
y = 70;
elseif vv == "zombi_dead" then
y = 145;
elseif vv == "blaster" or vv == "knife" then
y = 40;
elseif vv == "vase_flower" or vv == "vase" then
y = 70;
elseif vv == "repair" or vv == "repair_broken" or vv == "repair_meteor" then
y = 95;
elseif vv == "table4" then
y = 90;
elseif vv == "screen" then
y = 50;
elseif vv == "door6" then
y = 100;
elseif vv == "cheese" then
y = 160;
elseif vv == "table5" then
y = 80;
elseif vv == "chair1" or vv == "chair2" then
y = 125;
elseif vv == "foodgen" or vv=="foodgen2" then
y = 110;
elseif vv == "window4" then
y = 30;
elseif vv == "table6" then
y = 140;
elseif vv == "cleaner" then
y = 105;
elseif vv == "ballon" or vv == "ballon2" then
y = 120;
elseif vv == "monitor" or vv == "monitor2" then
y = 50;
elseif vv == "barrel" or vv == "barrel2" then
y = 155;
elseif vv == "ratsmall" then
y = 165;
elseif vv == "stick" then
y = 170;
end
end
sprite.compose(spr, game.cache, tc(v[2],s), y);
end
end
return game.cache;
end
function exec_(s)
return function(this)
return exec(s,this);
end
end
function apply(c,this)
local f = assert(loadstring("return function(s) return ("..c.."); end"))();
return f(this);
end
local oob = obj;
function tc(f,s)
if type(f) == "function" then return tc(f(s),s) else return f end
end
function obj(t)
local d = t.dsc;
if t.dsc then
t.dsc = function(s) if s.cnd == nil or s:cnd() then return tc(d,s) end end
end
return oob(t);
end
function gamefile_(fl)
return function()
cleancache();
gamefile(fl, true);
end
end
function sound_(snd)
return function()
play_sound(snd);
end
end
function music_(mus, loop, fadeout, fadein)
return function()
play_music(mus, loop, fadeout, fadein);
end
end
function mute_(fadeout,fadein)
return function()
if fadeout == nil then
fadeout = 3000;
end
play_music(nil, nil, fadeout, fadein);
end
end
function playonce_(file,loop)
return function()
local hw = here();
if hw["_"..file] == nil then
play_music(file,loop);
hw["_"..file] = true;
end
end
end
function play_music(file,loop,fadeout,fadein)
local fl = file;
local fout,fin = 2000,2000;
if file ~= nil and file ~= "" then
fl = "mus/"..file..".ogg";
end
if fadeout ~= nil then
fout = fadeout;
end
if fadein ~= nil then
fin = fadein;
end
set_music_fading(fadeout, fadein);
if loop == nil then
loop = 1;
end
if fl ~= nil then
set_music(fl, loop);
else
stop_music();
mute_sound();
_lastsound = nil;
end
end
function play_sound(file,loop,ch)
local fl = "mus/"..file..".ogg";
if ch == nil then
ch = 2;
end
set_sound(fl, ch, loop);
if loop ~= nil then
_lastsound = {file,loop,ch};
end
end
function mute_sound()
stop_sound(2);
stop_sound(3);
stop_sound(4);
end