Скриптовые мелочи, из тех, что сам использую.
Скрипт для создания базы данных инвентаря, который я написал для своего проекта. Требует для работы bash и
odt2txt. База заполняется в calc из состава Libre/Open Office (это второй фрагмент кода, каждая новая строка — ячейка в calc`овской строке), затем файлик скармливается скрипту и получается третий фрагмент, удобный для использования с движком love2d.
Код
#!/bin/bash
rm inv_db.lua
odt2txt inv_to_db.ods --output=inv.txt --width=-1
sed '/./!d' inv.txt > temp.txt
sed '1,13d' temp.txt > temp2.txt
sed 's/$/,/g' temp2.txt > temp3.txt
sed '1~13s/^/{/g' temp3.txt > temp4.txt
sed '13~13s/.$//' temp4.txt > temp5.txt
sed '13~13s/$/},/g' temp5.txt > temp6.txt
sed -i -e '1 s/^/inventory_ttx={\n/;' temp6.txt
sed -i -e '1 s/^/function inventory_load ()\n/;' temp6.txt
sed '$s/.$//' temp6.txt > temp7.txt
sed -i '$ a \}\' temp7.txt
sed -i '$ a \end\' temp7.txt
cp temp7.txt inventory.lua
rm inv.txt temp.txt temp2.txt temp3.txt temp4.txt temp5.txt temp6.txt temp7.txt
exit 0
Код
id=1
x=0,y=0,w=2,h=6
skill="sword"
class="sword"
subclass="longsword"
classtitle="меч"
subclasstitle="длинный меч"
title="Грубый меч"
a=1,b=4,c=3,atk=0
rt=30,range=7,clip=0
level=1,material=30,price=50,weight=1.2
quest=0,special=0,artifact=0,relic=0
story="Длинный меч, изготовленный по сварной технологии: две полоски дрянного, подверженного коррозии железа и стальная полоса между ними."
Код
function inventory_load ()
inventory_ttx={
{id=1,
x=0,y=0,w=2,h=6,
skill="sword",
class="sword",
subclass="longsword",
classtitle="меч",
subclasstitle="длинный меч",
title="Грубый меч",
a=1,b=4,c=3,atk=0,
rt=30,range=7,clip=0,
level=1,material=30,price=50,weight=1.2,
quest=0,special=0,artifact=0,relic=0,
story="Длинный меч, изготовленный по сварной технологии: две полоски дрянного, подверженного коррозии железа и стальная полоса между ними."}
}
end
Скрипты для вращения камеры в blender`е, для 6-и и 8-и направлений. Для использования необходимо создать объект с названием Rotor, привязать к нему камеру и, если надо, свет, подгрузить и выполнить скрипт. Обратите внимание на углы — они проектоспецифичны. Начальный угол вращения камеры по Z — 60°.
Код
import bpy
import mathutils
from math import radians
if "Rotor" in bpy.data.objects:
obj = bpy.data.objects["Rotor"]
obj.rotation_euler.z = obj.rotation_euler.z + radians(60.0)
bpy.data.scenes[0].render.filepath = '/tmp/1'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = obj.rotation_euler.z + radians(90.0)
bpy.data.scenes[0].render.filepath = '/tmp/2'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = obj.rotation_euler.z + radians(120.0)
bpy.data.scenes[0].render.filepath = '/tmp/3'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = obj.rotation_euler.z + radians(240.0)
bpy.data.scenes[0].render.filepath = '/tmp/4'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = obj.rotation_euler.z + radians(270.0)
bpy.data.scenes[0].render.filepath = '/tmp/5'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = obj.rotation_euler.z + radians(300.0)
bpy.data.scenes[0].render.filepath = '/tmp/6'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = 0
Код
import bpy
import mathutils
from math import radians
if "Rotor" in bpy.data.objects:
obj = bpy.data.objects["Rotor"]
obj.rotation_euler.z = obj.rotation_euler.z + radians(60.0)
bpy.data.scenes[0].render.filepath = '/tmp/1'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = obj.rotation_euler.z + radians(90.0)
bpy.data.scenes[0].render.filepath = '/tmp/2'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = obj.rotation_euler.z + radians(120.0)
bpy.data.scenes[0].render.filepath = '/tmp/3'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = obj.rotation_euler.z + radians(240.0)
bpy.data.scenes[0].render.filepath = '/tmp/4'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = obj.rotation_euler.z + radians(270.0)
bpy.data.scenes[0].render.filepath = '/tmp/5'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = obj.rotation_euler.z + radians(300.0)
bpy.data.scenes[0].render.filepath = '/tmp/6'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = obj.rotation_euler.z + radians(0.0)
bpy.data.scenes[0].render.filepath = '/tmp/7'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = obj.rotation_euler.z + radians(180.0)
bpy.data.scenes[0].render.filepath = '/tmp/8'
bpy.ops.render.render(animation=True)
obj.rotation_euler.z = 0
Скрипт для asymptote, расчерчивающий гексагональное поле.
Вроде бы работают варианты как со сплющённой, так и с обычной гексой, а также горизонтальный и вертикальный (см. закомментированные строки), но проверять лень — писалось давно, уже не помню. Если кто обнаружит неправильную работу — поправлю.
Код
import graph;
import settings;
outformat="png";
unitsize(1bp);
size(1000,1000, IgnoreAspect);
real dx=10;
real dy=40;
real w=64;
real hw=w/2;
real qw=w/4;
//real h=32;
real h=64;
real hh=h/2;
real qh=h/4;
for (int j=0; j <10; ++j){
dy =40 +j*h+j*10;
for (int i=0; i <10; ++i){
dx=10+i*w+i*10;
//vertical
//draw((dx,dy)--(dx+qw,dy+hh)--(dx+qw+hw,dy+hh)--(dx+w,dy)--(dx+qw+hw,dy-hh)--(dx+qw,dy-hh)--cycle);
//horizontal
draw((dx,dy)--(dx+hw,dy-qh)--(dx+w,dy)--(dx+w,dy+hh)--(dx+hw,dy+hh+qh)--(dx,dy+hh)--cycle);
}
}
Ещё один простенький скрипт для asymptote, генерит 2560x2560 портянку, расчерченую 32x32 клеточками.
Код
import graph;
import settings;
outformat="png";
unitsize(1bp);
size(2560,2560, IgnoreAspect);
real startx=0;
real starty=32;
real stepx=32;
real stepy=32;
for (int i=0; i <80; ++i){
draw((0,stepy*i)--(2560,stepy*i));
}
for (int h=0; h <80; ++h){
draw((stepx*h,0)--(stepx*h,2560));
}
Скрипт для ImageMagick, из кучи графических файлов вырезает квадратики 160x160, ресайзит их до 32x32 и склеивает в 6x8 портянку для анимации:
Код
sizew=0
sizeh=0
for file in $(ls)
do
convert $file -monitor -trim $file
convert $file -background none -gravity Center -extent 160x160 $file
convert $file -resize 32x32 $file
done
montage *.png -background none -tile 6x8 -geometry '32x32+0+0' result.png
echo "done"