--object_drop --simulated testing environment --define keys constant DROP = 32, DOWN = 66, LEFT = 68, RIGHT = 67, ROTATE = 65, QUIT = 113 --define objects constant objects = {"O","L","J","S","Z","T","I"} constant object_colors = {14,4,9,10,12,13,11} --yellow,orange,blue,green,red,purple,cyan constant object_graphics = { { {{"xx"}, {"xx"}}, {{"xx"}, {"xx"}}, {{"xx"}, {"xx"}}, {{"xx"}, {"xx"}} }, { {{"x "}, {"x "}, {"xx"}}, {{"xxx"}, {"x "}}, {{"xx"}, {" x"}, {" x"}}, {{" x"}, {"xxx"}} }, { {{" x"}, {" x"}, {"xx"}}, {{"x "}, {"xxx"}}, {{"xx"}, {"x "}, {"x "}}, {{"xxx"}, {" x"}} }, { {{" xx"}, {"xx "}}, {{"x "}, {"xx"}, {" x"}}, {{" xx"}, {"xx "}}, {{"x "}, {"xx"}, {" x"}} }, { {{"xx "}, {" xx"}}, {{" x"}, {"xx"}, {"x "}}, {{"xx "}, {" xx"}}, {{" x"}, {"xx"}, {"x "}} }, { {{" x "}, {"xxx"}}, {{"x "}, {"xx"}, {"x "}}, {{"xxx"}, {" x "}}, {{" x"}, {"xx"}, {" x"}} }, { {{"xxxx"}}, {{"x"}, {"x"}, {"x"}, {"x"}}, {{"xxxx"}}, {{"x"}, {"x"}, {"x"}, {"x"}} } } constant XMIN = 1, XMAX = 2, YMIN = 3, YMAX = 4 --variables atom t, idle sequence ck integer blockstodo integer holding_object integer next_object integer object_position integer f,f_max integer key integer at,atx,aty integer lines integer quit sequence pos_limit sequence leaderboard include graphics.e include get.e --GAME VARIABLES. CHANGING THESE WILL CAUSE SIGNIFICANT CHANGES IN GAME-----------------+ --Don't say I didn't warn you! f_max = 50 --frames per game iteration idle = 0.005 --length per frame at beginning of game. pos_limit = {5,20,35,45} --limits for out of bounds (screen) xmin,xmax,ymin,ymax --pos_limit = {10,35,30,50} --END USER DEFINABLE VARIABLES----------------------------------------------------------+ leaderboard = {} quit = 0 lines = 0 atx = pos_limit[XMIN] aty = floor((pos_limit[YMAX]-pos_limit[YMIN])/2) + pos_limit[YMIN] next_object = rand(length(objects)) text_color(15) bk_color(0) clear_screen() position(1,35) puts(1,"object_drop") position(2,70) puts(1,"BTD=") position(3,70) puts(1,"f=") position(4,70) puts(1,"key=n/a") position(5,70) puts(1,"pos=") position(pos_limit[XMIN]+1,pos_limit[YMAX]+5) puts(1,"next") position(pos_limit[XMIN]+6,pos_limit[YMAX]+5) puts(1,"lines") position(pos_limit[XMIN]+7,pos_limit[YMAX]+7) text_color(12) ? lines text_color(15) --create the leaderboard array, which is our virtual screen with all block data. for i = 1 to (pos_limit[XMAX]-pos_limit[XMIN]) do leaderboard = append(leaderboard, {}) for j = 1 to (pos_limit[YMAX]-pos_limit[YMIN]+1) do leaderboard[i] = append(leaderboard[i], 0) end for end for --draw a reference "floor" which should never be touched. for i = pos_limit[YMIN] to pos_limit[YMAX] do position(pos_limit[XMAX]+1,i) text_color(12) puts(1,"%") end for --draw a reference "ceiling" which should never be touched. for i = pos_limit[YMIN] to pos_limit[YMAX] do position(pos_limit[XMIN]-1,i) text_color(12) puts(1,"%") end for -- draw reference "walls" which should never be touched. for i = pos_limit[XMIN]-1 to pos_limit[XMAX]+1 do position(i,pos_limit[YMIN]-1) text_color(12) puts(1,"%") position(i,pos_limit[YMAX]+1) puts(1,"%") end for ------------------------------------------------------------------------------------st --text_color(15) --for i = pos_limit[XMIN] to pos_limit[XMAX] do --for j = pos_limit[YMIN] to pos_limit[YMAX] do --position(i,j) --puts(1,"+") --end for --end for --for i = 1 to 100 do --position(2,1) --puts(1,"Doing ") --printf(1, "%d", i) --puts(1," test frames...") --t = time() + idle --while time() < t do --end while --end for --position(3,1) --puts(1,"Done.") --t = time() + 1 --while time() < t do --end while --position(2,1) --text_color(0) --puts(1,"Doing $$$ test frames...\nDone.") --text_color(15) -----------------------------------------------------------------------------------fn procedure debug() clear_screen() puts(1, "debug-leaderboard dump\n") ? leaderboard if getc(0) then end if abort(0) end procedure procedure place_object(integer posx, integer posy, integer object, integer axis) text_color(object_colors[object]) for i = 1 to length(object_graphics[object][axis]) do for j = 1 to length(object_graphics[object][axis][i][1]) do if equal(object_graphics[object][axis][i][1][j],'x') then position(posx+i-1,posy+j-1) printf(1, "%s", object_graphics[object][axis][i][1][j]) end if end for end for text_color(15) end procedure procedure remove_object(integer posx, integer posy, integer object, integer axis) text_color(0) for i = 1 to length(object_graphics[object][axis]) do for j = 1 to length(object_graphics[object][axis][i][1]) do if equal(object_graphics[object][axis][i][1][j],'x') then position(posx+i-1,posy+j-1) printf(1, "%s", object_graphics[object][axis][i][1][j]) end if end for end for text_color(15) end procedure procedure preview_object(integer object) position(pos_limit[XMIN]+2,pos_limit[YMAX]+5) puts(1," ") position(pos_limit[XMIN]+3,pos_limit[YMAX]+5) puts(1," ") position(pos_limit[XMIN]+4,pos_limit[YMAX]+5) puts(1," ") text_color(object_colors[object]) for i = 1 to length(object_graphics[object][1]) do position(pos_limit[XMIN]+1+i,pos_limit[YMAX]+5) printf(1, "%s", object_graphics[object][1][i]) end for text_color(15) end procedure procedure save_object(integer posx, integer posy, integer object, integer axis) for i = 1 to length(object_graphics[object][axis]) do for j = 1 to length(object_graphics[object][axis][i][1]) do if equal(object_graphics[object][axis][i][1][j],'x') then leaderboard[posx-pos_limit[XMIN]+i-1][posy-pos_limit[YMIN]+j] = object end if end for end for end procedure procedure update_board() for i = 1 to length(leaderboard) do for j = 1 to length(leaderboard[i]) do if leaderboard[i][j] = 0 then text_color(0) position(pos_limit[XMIN]+i,pos_limit[YMIN]+j-1) puts(1," ") else text_color(object_colors[leaderboard[i][j]]) position(pos_limit[XMIN]+i,pos_limit[YMIN]+j-1) puts(1,"x") end if end for end for end procedure procedure check_lines() integer verify sequence lines_made lines_made = {} for i = 1 to length(leaderboard) do verify = 1 for j = 1 to length(leaderboard[i]) do if leaderboard[i][j] = 0 then verify = 0 --failed line verification end if end for if verify = 1 then lines_made = append(lines_made,i) end if end for if length(lines_made) > 0 then --we scored for h = 1 to 3 do --blink 3 times for i = 1 to length(lines_made) do text_color(11) bk_color(2) for j = pos_limit[YMIN] to pos_limit[YMAX] do position(pos_limit[XMIN]+lines_made[i],j) puts(1," ") end for end for t = time() + 0.1 while time() < t do end while bk_color(0) for i = 1 to length(lines_made) do for j = 1 to length(leaderboard[lines_made[i]]) do position(pos_limit[XMIN]+lines_made[i],j+pos_limit[YMIN]-1) text_color(object_colors[leaderboard[lines_made[i]][j]]) puts(1,"x") end for end for t = time() + 0.25 while time() < t do end while end for lines += length(lines_made) position(pos_limit[XMIN]+7,pos_limit[YMAX]+7) text_color(12) ? lines text_color(15) for i = 1 to length(lines_made) do leaderboard = leaderboard[1..lines_made[i]-1] & leaderboard[lines_made[i]+1..length(leaderboard)] leaderboard = prepend(leaderboard, {}) for j = 1 to (pos_limit[YMAX]-pos_limit[YMIN]+1) do leaderboard[1] = append(leaderboard[1], 0) end for end for update_board() end if end procedure procedure calculate_blocks() ck = {99,99,99,99} --we find the height of already existing rows for as many rows as the holding object is going to take, up to 4 for an "I" block and then subtract if there isn't a pixel on the lowest level of the block on that row at = 1 blockstodo = pos_limit[XMAX] - pos_limit[XMIN] - length(object_graphics[holding_object][object_position]) + 1 - (atx - pos_limit[XMIN]) for i = aty-pos_limit[YMIN]+1 to aty-pos_limit[YMIN]+length(object_graphics[holding_object][object_position][1][1]) do at = i - aty + pos_limit[YMIN] for j = length(leaderboard) to 1 by -1 do if leaderboard[j][i] != 0 then if j < ck[at] then ck[at] = j end if end if end for end for for i = 1 to at do if equal(object_graphics[holding_object][object_position][length(object_graphics[holding_object][object_position])][1][i],' ') then ck[i] += 1 if equal(object_graphics[holding_object][object_position][length(object_graphics[holding_object][object_position])-1][1][i],' ') then ck[i] += 1 end if end if end for at = ck[1] for i = 1 to 4 do if ck[i] < 97 then if ck[i] < at then at = ck[i] end if end if end for if at < 97 then at = length(leaderboard) - at + 1 blockstodo -= at end if if at >= length(leaderboard) - length(object_graphics[holding_object][object_position]) and at < 97 then quit = 1 end if end procedure while 1 do while quit = 0 do holding_object = next_object next_object = rand(length(objects)) preview_object(next_object) object_position = 1 f = 1 atx = pos_limit[XMIN] aty = floor((pos_limit[YMAX]-pos_limit[YMIN])/2) + pos_limit[YMIN] calculate_blocks() place_object(atx,aty,holding_object,object_position) position(5,74) ? object_position while blockstodo > 0 do while f < f_max do t = time() + idle while time() < t do end while key = get_key() if key != -1 then position(4,74) puts(1, " ") position(4,74) ? key end if if key = LEFT and aty > pos_limit[YMIN] then remove_object(atx,aty,holding_object,object_position) aty -= 1 place_object(atx,aty,holding_object,object_position) calculate_blocks() end if if key = RIGHT and aty + length(object_graphics[holding_object][object_position][1][1]) - 1 < pos_limit[YMAX] then remove_object(atx,aty,holding_object,object_position) aty += 1 place_object(atx,aty,holding_object,object_position) calculate_blocks() end if if key = DOWN then f = f_max-1 end if if key = ROTATE then remove_object(atx,aty,holding_object,object_position) object_position += 1 if object_position > 4 then object_position = 1 end if if aty + length(object_graphics[holding_object][object_position][1][1])-1 <= pos_limit[YMAX] then calculate_blocks() position(5,74) ? object_position place_object(atx,aty,holding_object,object_position) else object_position -= 1 --rotate unsuccesfull if object_position < 1 then object_position = 4 end if place_object(atx,aty,holding_object,object_position) end if end if if key = DROP then f = f_max remove_object(atx,aty,holding_object,object_position) atx = atx + blockstodo - 1 blockstodo = 0 end if if key = QUIT then f = f_max blockstodo = 0 quit = 1 end if if key = 100 then debug() end if f += 1 position(3,72) puts(1, " ") position(3,72) ? f end while remove_object(atx,aty,holding_object,object_position) atx += 1 place_object(atx,aty,holding_object,object_position) blockstodo -= 1 position(2,74) puts(1, " ") position(2,74) ? blockstodo f = 1 end while if quit = 0 then save_object(atx,aty,holding_object,object_position) check_lines() end if end while text_color(9) bk_color(15) clear_screen() position(12,30) puts(1,"You lost the game!") position(13,35) puts(1,"Score: ") ? lines position(16,31) puts(1,"Play again? (y/n)") key = wait_key() if key = 121 then leaderboard = {} for i = 1 to (pos_limit[XMAX]-pos_limit[XMIN]) do leaderboard = append(leaderboard, {}) for j = 1 to (pos_limit[YMAX]-pos_limit[YMIN]+1) do leaderboard[i] = append(leaderboard[i], 0) end for end for quit = 0 lines = 0 atx = pos_limit[XMIN] aty = floor((pos_limit[YMAX]-pos_limit[YMIN])/2) + pos_limit[YMIN] next_object = rand(length(objects)) text_color(15) bk_color(0) clear_screen() position(1,35) puts(1,"object_drop") position(2,70) puts(1,"BTD=") position(3,70) puts(1,"f=") position(4,70) puts(1,"key=n/a") position(5,70) puts(1,"pos=") position(pos_limit[XMIN]+1,pos_limit[YMAX]+5) puts(1,"next") position(pos_limit[XMIN]+6,pos_limit[YMAX]+5) puts(1,"lines") position(pos_limit[XMIN]+7,pos_limit[YMAX]+7) text_color(12) ? lines text_color(15) for i = pos_limit[YMIN] to pos_limit[YMAX] do position(pos_limit[XMAX]+1,i) text_color(12) puts(1,"%") end for for i = pos_limit[YMIN] to pos_limit[YMAX] do position(pos_limit[XMIN]-1,i) text_color(12) puts(1,"%") end for for i = pos_limit[XMIN]-1 to pos_limit[XMAX]+1 do position(i,pos_limit[YMIN]-1) text_color(12) puts(1,"%") position(i,pos_limit[YMAX]+1) puts(1,"%") end for else clear_screen() exit end if end while