RetroAvatarsをHSPに移植する

大会も終わったことだし、アルゴリズムばっかりやるのからは少し離れて何かプログラムを作ることにした。


そこで、いまRetro Avatars - Radium Softwareで以前紹介されていたRetro AvatarsHSPで書こうとしている。
Retro Avatarsは文字列からレトロなキャラクターを生成するソフトで、C++のソースも公開されている。



ソースを読みつつ作っていたけれど、キャラクターの顔を整える"enhanceFace"のところがよくわからない。
これがないと生成されるキャラクターがちゃらんぽらんになっちゃうから、大事なところなんだけれど……。



↑TANINIで生成してみたところ。

途中経過(149行)

#define W 12
#define H 12
#define EMPTY_COL 0
#define SOLID_COL 255
#define EYES_COL 1

screen 0, 250, 250

titleStr = "TANINI"
size = length(titleStr)

dim g, 14, 14

code = 0
randomize(0)
repeat 32
	code = code + (peek(titleStr,cnt\size)*rnd(3071)\1024)
loop

randomize(code)
R = rnd(3263)\192 + 64
G = rnd(3263)\192 + 64
B = rnd(3263)\192 + 64

color 0, 0, 0 : boxf


*initGraph
repeat 14
	i = cnt
	repeat 14
		g.i.cnt = EMPTY_COL
	loop
loop


*createGraph
repeat H, 1
	y = cnt
	repeat W, 1
		x = cnt
		c = 158
		if( rnd(3203)\356 > c ){
			g.y.x = EMPTY_COL
		} else {
			g.y.x = SOLID_COL
		}
	loop
loop


*removeNoise
dim xt1, 8 : dim yt1, 8
xt1 = -1, 0, 1, -1, 1, -1, 0, 1
yt1 = -1, -1, -1, 0, 0, 1, 1, 1
dim xt2, 4 : dim yt2, 4
xt2 = 0, 1, 0, -1
yt2 = -1, 0, 1, 0

repeat 4
	for y, 1, H+1, 1
		for x, 1, W+1, 1
			if( g.y.x == EMPTY_COL ){
				p = 0
				for i, 0, 8, 1
					y0 = y+yt1.i : x0 = x+xt1.i
					p = p + g.y0.x0
				next
				if p >= SOLID_COL*8 {
					g.y.x = SOLID_COL
				}

				if( g.(y-1).x==SOLID_COL && g.(y+1).x==SOLID_COL ){
					if( g.(x-1).x!=SOLID_COL && g.(x+1).x!=SOLID_COL ){
							if ( rnd(3274)\5>2 ){
								g.y.x = SOLID_COL
							}
					}
				}
				if( g.(y-1).x==SOLID_COL && g.(y+1).x==SOLID_COL ){
					if( g.(x-1).x==SOLID_COL && g.(x+1).x==SOLID_COL ){
						if( rnd(3274)\5>2 ){
							g.y.x = SOLID_COL
						}
					}
				}
	}
		next
	next

	for y, 1, H+1, 1
		for x, 1, W+1, 1
			if( g.y.x == SOLID_COL ){
				p = 0
				for i, 0, 8, 1
					y0 = y+yt1.i : x0 = x+xt1.i
					p = p + g.y0.x0
				next
				if p <= 0 {
					g.y.x = EMPTY_COL
				}
			}
		next
	next
loop





*enhanceFace
hx = W/2-1
for y, 1, H/2,1
	tmp = hx-1
	if( g.y.tmp == EMPTY_COL ){
		g.y.tmp = EYES_COL
	}
	tmp = hx-2
	if( g.y.tmp == EMPTY_COL ){
		g.y.tmp = EYES_COL
	}
next


*mirror
x_sym = 1 : y_sym = 0
for y, 1, H+1, 1
	for x, 1, W/2+1, 1
		p = g.y.x
		x0 = W-x+1
		if x_sym == 1 : g.y.x0 = p
	next
next


*draw
repeat H, 1
	y = cnt
	repeat W, 1
		x = cnt
		if( g.y.x == SOLID_COL || g.y.x == EYES_COL ){
			color R, G, B
		} else {
			color 0, 0, 0
		}
		boxf 10+x*10, 10+y*10, 10+x*10+10, 10+y*10+10
	loop
loop