--Gen city by LeCom --Nooby code, feel free to fix things and optimize the code for lua --TODO: make noise and colour values more appropriate function ROAD_COLOR() d=math.random(0, 1) return {d, d, d} end function CONCRETE_GROUND_COLOR() d=math.random(-4, 4) return {128+d, 128+d, 128+d} end function GRASS_COLOR() return {0, 128+math.random(-8, 8), 0} end function BUILDING_WALL_COLOR() d=math.random(-4, 4) return {100+d, 100+d, 100+d} end function BUILDING_FLOOR_COLOR() d=math.random(-4, 4) return {100+d, 100+d, 100+d} end function BUILDING_STAIR_COLUMN_COLOR() return {32, 32, 32} end function BUILDING_STAIR_COLOR() return {128, 128, 128} end function BUILDING_BASEMENT_COLOR() return {16, 16, 16} end function BUILDING_TABLE_COLOR() return {128, 64, 0} end TABLE_W=2 TABLE_L=5 function BUILDING_CHAIR_COLOR() return {128, 64, 0} end function FENCE_COLOR() d=math.random(-32, 32) return {80+d, 80+d, 80+d} end FENCE_HEIGHT=6 function RUBBISH_BIN_COLOR() d=math.random(-32, 32) return {55+d, 64+d, 64+d} end function RUBBISH_BIN_TOP_COLOR() d=math.random(-16, 16) return {25+d, 32+d, 32+d} end function BUSH_COLOR() return {0, 128+math.random(-16, 16), 0} end function LANTERN_COLOR() return {64, 64, 64} end function LANTERN_LAMP_COLOR() return {255, 255, 0} end LANTERN_H=8 LANTERN_INTERVAL=8 xcells=32 zcells=32 cells={} celldata={} cellheights={} MIN_BUILDING_H=2 MAX_BUILDING_H=4 BUILDING_FLOOR_HEIGHT=6 WINDOW_WIDTH=3 WINDOW_HEIGHT=2 WINDOW_FRAME_WIDTH=4 WINDOW_OFFSET=3 ROAD_W=10 HROAD_W=math.floor(ROAD_W/2) FLOOR_Y=0 function ternary(c, t, f) if c then return t else return f end end function gen_bush(x1, y1, z1, x2, y2, z2) r=3 midy=(y2-y1)/2+y1 midz=(z2-z1)/2+z1 for x=x1, x2-1 do pow_r=r*r/4 for z=z1, z2-1 do pow_z=(z-midz)*(z-midz) for y=y1, y2-1 do pow_y=(y-midy)*(y-midy) if pow_z+pow_yh or xrh>h or zlh>h or xrh>h neighbour=xnl or xnr or znl or znr do_stairs=neighbour_higher==false or math.random(0, 3)==0 midx=xsize/2+x1 midz=zsize/2+z1 for f=0, h-1 do y1=lower_y-(f+1)*BUILDING_FLOOR_HEIGHT+1 y2=lower_y-f*BUILDING_FLOOR_HEIGHT-1 fy=y1-1 --The floor (+ hole at stair positions) for x=x1, x2 do stairx=((x>=midx-1) and (x=midz-1 and z=lower_window_y or y=WINDOW_FRAME_WIDTH then window=1 window_c=0 end else if window_c>=WINDOW_WIDTH then window=0 window_c=0 end end window_c=window_c+1 end end --WALLS (z direction) if do_xlhw or do_xrhw then window_c=-1+WINDOW_OFFSET window=0 for z=z1, z2 do for y=y1, y2 do build_block=y>=lower_window_y or y=WINDOW_FRAME_WIDTH then window=1 window_c=0 end else if window_c>=WINDOW_WIDTH then window=0 window_c=0 end end window_c=window_c+1 end end --Stairs if do_stairs then for y=lower_y-(f+1)*BUILDING_FLOOR_HEIGHT, lower_y-f*BUILDING_FLOOR_HEIGHT do x=midx z=midz map_block_set(x, y, z, 1, unpack(BUILDING_STAIR_COLUMN_COLOR())) ymod=(y-lower_y+1)%8 if ymod>=1 and ymod<4 then x=x+1 else if ymod>4 then x=x-1 end end ymod=(y-lower_y-1)%8 if ymod>=1 and ymod<4 then z=z+1 else if ymod>4 then z=z-1 end end map_block_set(x, y, z, 1, unpack(BUILDING_STAIR_COLOR())) end end end --Roof do_xlr=xnl~=false and xlh=xcells or z<0 or z>=zcells then break end if math.random(0, 3)==0 then zd=math.random(-1, 1) end --Avoid parallel roads (90° crossings are allowed!) if z0 then if zd~=1 and cells[x][z-1]==gen_road then zd=zd+1 end end if x>0 and z+zd>0 and z+zd0 and z+zd0 then rc=rc+math.random(-rnd, rnd) end for i=0, rc do road_snake(math.random(1, zcells-2)) end for x=0, xcells-1 do for z=0, zcells-1 do xnl=0 xnr=0 znl=0 znr=0 if x>0 then xnl=cells[x-1][z] end if x<=xcells-2 then xnr=cells[x+1][z] end if z>0 then znl=cells[x][z-1] end if z<=zcells-2 then znr=cells[x][z+1] end cells[x][z](x*xcsize, z*zcsize, cellheights[x][z], xcsize, zcsize, xnl, xnr, znl, znr) end print(x*100/(xcells-1).."% generated") end map_cache_end() return ret, "lecom_gencity("..mx..","..mz..","..my..")" end