mirror of
				https://github.com/LDDestroier/CC/
				synced 2025-10-31 15:32:59 +00:00 
			
		
		
		
	Delete game.lua
This commit is contained in:
		| @@ -1,513 +0,0 @@ | ||||
| local game = {} | ||||
| game.path = fs.combine(fs.getDir(shell.getRunningProgram()),".game") | ||||
| game.apiPath = fs.combine(game.path, "api") | ||||
| game.spritePath = fs.combine(game.path, "sprites") | ||||
| game.mapPath = fs.combine(game.path, "maps") | ||||
| game.imagePath = fs.combine(game.path, "image") | ||||
| game.configPath = fs.combine(game.path, "config.cfg") | ||||
|  | ||||
| local scr_x, scr_y = term.getSize() | ||||
| local mapname = "testmap" | ||||
|  | ||||
| local scrollX = 0 | ||||
| local scrollY = 0 | ||||
|  | ||||
| local keysDown = {} | ||||
|  | ||||
| local tsv = function(visible) | ||||
| 	if term.current().setVisible then | ||||
| 		term.current().setVisible(visible) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local getAPI = function(apiName, apiPath, apiURL, doDoFile) | ||||
| 	if not fs.exists(apiPath) then | ||||
| 		write("Getting " .. apiName .. "...") | ||||
| 		local prog = http.get(apiURL) | ||||
| 		if prog then | ||||
| 			print("success!") | ||||
| 			local file = fs.open(apiPath, "w") | ||||
| 			file.write(prog.readAll()) | ||||
| 			file.close() | ||||
| 		else | ||||
| 			error("fail!") | ||||
| 		end | ||||
| 	end | ||||
| 	if doDoFile then | ||||
| 		_ENV[fs.getName(apiPath)] = dofile(apiPath) | ||||
| 	else | ||||
| 		os.loadAPI(apiPath) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| getAPI("NFT Extra", "nfte", "https://github.com/LDDestroier/NFT-Extra/raw/master/nfte", false) | ||||
|  | ||||
| -- load sprites from sprite folder | ||||
| -- sprites are separated into "sets", but the only one here is "megaman" so whatever | ||||
|  | ||||
| local sprites, maps = {}, {} | ||||
| for k, set in pairs(fs.list(game.spritePath)) do | ||||
| 	sprites[set] = {} | ||||
| 	for num, name in pairs(fs.list(fs.combine(game.spritePath, set))) do | ||||
| 		sprites[set][name:gsub(".nft", "")] = nfte.loadImage(fs.combine(game.spritePath, set .. "/" .. name)) | ||||
| 		print("Loaded sprite " .. name:gsub(".nft","")) | ||||
| 	end | ||||
| end | ||||
| for num, name in pairs(fs.list(game.mapPath)) do | ||||
| 	maps[name:gsub(".nft", "")] = nfte.loadImage(fs.combine(game.mapPath, name)) | ||||
| 	print("Loaded map " .. name:gsub(".nft","")) | ||||
| end | ||||
|  | ||||
| local projectiles = {} | ||||
| local players = {} | ||||
|  | ||||
| local newPlayer = function(name, spriteset, x, y) | ||||
| 	return { | ||||
| 		name = name,			-- player name | ||||
| 		spriteset = spriteset,	-- set of sprites to use | ||||
| 		sprite = "stand",		-- current sprite | ||||
| 		direction = 1,			-- 1 is right, -1 is left | ||||
| 		xsize = 10,				-- hitbox x size | ||||
| 		ysize = 8,				-- hitbox y size | ||||
| 		x = x,					-- x position | ||||
| 		y = y,					-- y position | ||||
| 		xadj = 0,				-- adjust x for good looks | ||||
| 		yadj = 0,				-- adjust y for good looks | ||||
| 		xvel = 0,				-- x velocity | ||||
| 		yvel = 0,				-- y velocity | ||||
| 		jumpHeight = 3,		-- height of jump | ||||
| 		jumpAssist = 0.5,		-- assists jump while in air | ||||
| 		moveSpeed = 1.5,			-- speed of walking | ||||
| 		gravity = 0.75,			-- force of gravity | ||||
| 		slideSpeed = 4,			-- speed of sliding | ||||
| 		grounded = false,		-- is on solid ground | ||||
| 		shots = 0,				-- how many shots onscreen | ||||
| 		maxShots = 3,			-- maximum shots onscreen | ||||
| 		lemonSpeed = 3,			-- speed of megabuster shots | ||||
| 		chargeLevel = 0,		-- current charged buster level | ||||
| 		cycle = {				-- used for animation cycles | ||||
| 			run = 0,				-- used for run sprite | ||||
| 			shoot = 0,				-- determines duration of shoot sprite | ||||
| 			shootHold = 0,			-- forces user to release then push shoot | ||||
| 			stand = 0,				-- used for high-octane eye blinking action | ||||
| 			slide = 0,				-- used to limit slide length | ||||
| 			jump = 0,				-- used to prevent auto-bunnyhopping | ||||
| 			shootCharge = 0,		-- records how charged your megabuster is | ||||
| 			ouch = 0,				-- records hitstun | ||||
| 			iddqd = 0				-- records invincibility frames | ||||
| 		}, | ||||
| 		chargeDiscolor = {		-- swaps colors during buster charging | ||||
| 			[0] = {{}}, | ||||
| 			[1] = {					-- charge level one | ||||
| 				{ | ||||
| 					["b"] = "a" | ||||
| 				}, | ||||
| 				{ | ||||
| 					["b"] = "b" | ||||
| 				} | ||||
| 			}, | ||||
| 			[2] = {					-- woAH charge level two | ||||
| 				{ | ||||
| 					--["f"] = "b", | ||||
| 					["b"] = "3", | ||||
| 					["3"] = "f" | ||||
| 				}, | ||||
| 				{ | ||||
| 					--["f"] = "3", | ||||
| 					["3"] = "b", | ||||
| 					["b"] = "f" | ||||
| 				}, | ||||
| 				{ | ||||
| 					--["f"] = "3", | ||||
| 					["3"] = "b", | ||||
| 					["b"] = "8" | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		control = {				-- inputs | ||||
| 			up = false,				-- move up ladders | ||||
| 			down = false,			-- move down ladders, or slide | ||||
| 			left = false,			-- point and walk left | ||||
| 			right = false,			-- point and walk right | ||||
| 			jump = false,			-- jump, or slide | ||||
| 			shoot = false			-- fire your weapon | ||||
| 		} | ||||
| 	} | ||||
| end | ||||
|  | ||||
| local deriveControls = function(keyList) | ||||
| 	return { | ||||
| 		up = keyList[keys.up], | ||||
| 		down = keyList[keys.down], | ||||
| 		left = keyList[keys.left], | ||||
| 		right = keyList[keys.right], | ||||
| 		jump = keyList[keys.x], | ||||
| 		shoot = keyList[keys.z] | ||||
| 	} | ||||
| end | ||||
|  | ||||
| -- main colision function | ||||
| local isSolid = function(x, y) | ||||
| 	x = math.floor(x) | ||||
| 	y = math.floor(y) | ||||
| 	if (not maps[mapname][1][y]) or (x < 1) then | ||||
| 		return false | ||||
| 	else | ||||
| 		if (maps[mapname][1][y]:sub(x,x) == " " or | ||||
| 		maps[mapname][1][y]:sub(x,x) == "") and | ||||
| 		(maps[mapname][3][y]:sub(x,x) == " " or | ||||
| 		maps[mapname][3][y]:sub(x,x) == "") then | ||||
| 			return false | ||||
| 		else | ||||
| 			return true | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local isPlayerTouchingSolid = function(player, xmod, ymod, ycutoff) | ||||
| 	for y = player.y + (ycutoff or 0), player.ysize + player.y - 1 do | ||||
| 		for x = player.x, player.xsize + player.x - 1 do | ||||
| 			if isSolid(x + (xmod or 0), y + (ymod or 0)) then | ||||
| 				return "map" | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	return false | ||||
| end | ||||
|  | ||||
| you = 1 | ||||
| players[you] = newPlayer("LDD", "megaman", 40, 8) | ||||
|  | ||||
| local movePlayer = function(player, x, y) | ||||
| 	i = player.yvel / math.abs(player.yvel) | ||||
| 	for y = 1, math.abs(player.yvel) do | ||||
| 		if isPlayerTouchingSolid(player, 0, -i, (player.cycle.slide > 0 and 2 or 0)) then | ||||
| 			if player.yvel < 0 then | ||||
| 				player.grounded = true | ||||
| 			end | ||||
| 			player.yvel = 0 | ||||
| 			break | ||||
| 		else | ||||
| 			player.y = player.y - i | ||||
| 			player.grounded = false | ||||
| 		end | ||||
| 	end | ||||
| 	i = player.xvel / math.abs(player.xvel) | ||||
| 	for x = 1, math.abs(player.xvel) do | ||||
| 		if isPlayerTouchingSolid(player, i, 0, (player.cycle.slide > 0 and 2 or 0)) then | ||||
| 			if player.grounded and not isPlayerTouchingSolid(player, i, -1) then -- upward slope detection | ||||
| 				player.y = player.y - 1 | ||||
| 				player.x = player.x + i | ||||
| 				grounded = true | ||||
| 			else | ||||
| 				player.xvel = 0 | ||||
| 				break | ||||
| 			end | ||||
| 		else | ||||
| 			player.x = player.x + i | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- types of projectiles | ||||
|  | ||||
| local bullet = { | ||||
| 	lemon = { | ||||
| 		damage = 1, | ||||
| 		element = "neutral", | ||||
| 		sprites = { | ||||
| 			sprites["megaman"]["buster1"] | ||||
| 		}, | ||||
| 	}, | ||||
| 	lemon2 = { | ||||
| 		damage = 1, | ||||
| 		element = "neutral", | ||||
| 		sprites = { | ||||
| 			sprites["megaman"]["buster2-1"], | ||||
| 			sprites["megaman"]["buster2-2"] | ||||
| 		} | ||||
| 	}, | ||||
| 	lemon3 = { | ||||
| 		damage = 4, | ||||
| 		element = "neutral", | ||||
| 		sprites = { | ||||
| 			sprites["megaman"]["buster3-1"], | ||||
| 			sprites["megaman"]["buster3-2"], | ||||
| 			sprites["megaman"]["buster3-3"], | ||||
| 			sprites["megaman"]["buster3-4"], | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| local spawnProjectile = function(boolit, owner, x, y, xvel, yvel) | ||||
| 	projectiles[#projectiles+1] = { | ||||
| 		owner = owner, | ||||
| 		bullet = boolit, | ||||
| 		x = x, | ||||
| 		y = y, | ||||
| 		xvel = xvel, | ||||
| 		yvel = yvel, | ||||
| 		direction = xvel / math.abs(xvel), | ||||
| 		life = 32, | ||||
| 		cycle = 0, | ||||
| 		phaze = false, | ||||
| 	} | ||||
| end | ||||
|  | ||||
| local moveTick = function() | ||||
| 	local i | ||||
| 	for num, player in pairs(players) do | ||||
|  | ||||
| 		-- falling | ||||
|  | ||||
| 		player.yvel = player.yvel - player.gravity | ||||
|  | ||||
| 		-- jumping | ||||
|  | ||||
| 		if player.control.jump then | ||||
| 			if player.grounded then | ||||
| 				if player.cycle.jump == 0 then | ||||
| 					if player.control.down and player.cycle.slide == 0 then | ||||
| 						player.cycle.slide = 6 | ||||
| 					elseif not isPlayerTouchingSolid(player, 0, 0, 0) then | ||||
| 						player.yvel = player.yvel + player.jumpHeight | ||||
| 						player.cycle.slide = 0 | ||||
| 						player.grounded = false | ||||
| 					end | ||||
| 				end | ||||
| 				player.cycle.jump = 1 | ||||
| 			end | ||||
| 			if player.yvel > 0 and not player.grounded then | ||||
| 				player.yvel = player.yvel + player.jumpAssist | ||||
| 			end | ||||
| 		else | ||||
| 			player.cycle.jump = 0 | ||||
| 		end | ||||
|  | ||||
| 		-- walking | ||||
|  | ||||
| 		if player.control.right then | ||||
| 			player.direction = 1 | ||||
| 			player.xvel = player.moveSpeed | ||||
| 		elseif player.control.left then | ||||
| 			player.direction = -1 | ||||
| 			player.xvel = -player.moveSpeed | ||||
| 		else | ||||
| 			player.xvel = 0 | ||||
| 		end | ||||
| 		if player.cycle.slide > 0 then | ||||
| 			player.xvel = player.direction * player.slideSpeed | ||||
| 		end | ||||
|  | ||||
| 		-- shooting | ||||
|  | ||||
| 		if player.control.shoot then | ||||
| 			if player.cycle.shootHold == 0 then | ||||
| 				if player.shots < player.maxShots then | ||||
| 					spawnProjectile( | ||||
| 						bullet.lemon, | ||||
| 						player, | ||||
| 						player.x + player.xsize * player.direction, | ||||
| 						player.y + 2, | ||||
| 						player.lemonSpeed * player.direction, | ||||
| 						0 | ||||
| 					) | ||||
| 					player.cycle.shoot = 5 | ||||
| 					player.shots = player.shots + 1 | ||||
| 				end | ||||
| 				player.cycle.shootHold = 1 | ||||
| 			end | ||||
| 			if player.cycle.shootHold == 1 then | ||||
| 				player.cycle.shootCharge = player.cycle.shootCharge + 1 | ||||
| 				if player.cycle.shootCharge < 16 then | ||||
| 					player.chargeLevel = 0 | ||||
| 				elseif player.cycle.shootCharge < 32 then | ||||
| 					player.chargeLevel = 1 | ||||
| 				else | ||||
| 					player.chargeLevel = 2 | ||||
| 				end | ||||
| 			end | ||||
| 		else | ||||
| 			player.cycle.shootHold = 0 | ||||
| 			if player.shots < player.maxShots then | ||||
| 				if player.cycle.shootCharge > 16 then | ||||
| 					if player.cycle.shootCharge >= 32 then | ||||
| 						spawnProjectile( | ||||
| 							bullet.lemon3, | ||||
| 							player, | ||||
| 							player.x + math.max(0, player.direction * player.xsize), | ||||
| 							player.y, | ||||
| 							player.lemonSpeed * player.direction, | ||||
| 							0 | ||||
| 						) | ||||
| 					else | ||||
| 						spawnProjectile( | ||||
| 							bullet.lemon2, | ||||
| 							player, | ||||
| 							player.x + math.max(0, player.direction * player.xsize), | ||||
| 							player.y + 1, | ||||
| 							player.lemonSpeed * player.direction, | ||||
| 							0 | ||||
| 						) | ||||
| 					end | ||||
| 					player.shots = player.shots + 1 | ||||
| 					player.cycle.shoot = 5 | ||||
| 				end | ||||
| 			end | ||||
| 			player.cycle.shootCharge = 0 | ||||
| 			player.chargeLevel = 0 | ||||
| 		end | ||||
|  | ||||
| 		-- movement | ||||
|  | ||||
| 		movePlayer(player, xvel, yvel) | ||||
|  | ||||
| 		scrollX = player.x - math.floor(scr_x / 2) + math.floor(player.xsize / 2) | ||||
| 		scrollY = player.y - math.floor(scr_y / 2) + math.floor(player.ysize / 2) | ||||
|  | ||||
| 		-- projectile management | ||||
|  | ||||
| 		for i = #projectiles, 1, -1 do | ||||
| 			projectiles[i].x = projectiles[i].x + projectiles[i].xvel | ||||
| 			projectiles[i].y = projectiles[i].y + projectiles[i].yvel | ||||
| 			projectiles[i].cycle = projectiles[i].cycle + 1 | ||||
| 			projectiles[i].life = projectiles[i].life - 1 | ||||
| 			if projectiles[i].life <= 0 then | ||||
| 				table.remove(projectiles, i) | ||||
| 				player.shots = player.shots - 1 | ||||
| 			end | ||||
| 		end | ||||
|  | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local render = function() | ||||
| 	tsv(false) | ||||
| 	term.clear() | ||||
| 	nfte.drawImage(maps[mapname], -scrollX + 1, -scrollY + 1) | ||||
| 	for num,player in pairs(players) do | ||||
| 		term.setCursorPos(1,num) | ||||
| 		print("(" .. player.x .. ", " .. player.y .. ", " .. tostring(player.shots) .. ")") | ||||
| 		if player.direction == -1 then | ||||
| 			nfte.drawImageTransparent( | ||||
| 				nfte.colorSwap( | ||||
| 					nfte.flipX( | ||||
| 						sprites[player.spriteset][player.sprite] | ||||
| 					), | ||||
| 					player.chargeDiscolor[player.chargeLevel][ | ||||
| 						(math.floor(player.cycle.shootCharge / 2) % #player.chargeDiscolor[player.chargeLevel]) + 1 | ||||
| 					] | ||||
| 				), | ||||
| 				player.x - scrollX + player.xadj, | ||||
| 				player.y - scrollY + player.yadj | ||||
| 			) | ||||
| 		else | ||||
| 			nfte.drawImageTransparent( | ||||
| 				nfte.colorSwap( | ||||
| 					sprites[player.spriteset][player.sprite], | ||||
| 					player.chargeDiscolor[player.chargeLevel][ | ||||
| 						(math.floor(player.cycle.shootCharge / 2) % #player.chargeDiscolor[player.chargeLevel]) + 1 | ||||
| 					] | ||||
| 				), | ||||
| 				player.x - scrollX, | ||||
| 				player.y - scrollY | ||||
| 			) | ||||
| 		end | ||||
| 	end | ||||
| 	for num,p in pairs(projectiles) do | ||||
| 		if p.direction == -1 then | ||||
| 			nfte.drawImageTransparent( | ||||
| 				nfte.flipX(p.bullet.sprites[(p.cycle % #p.bullet.sprites) + 1]), | ||||
| 				p.x - scrollX, | ||||
| 				p.y - scrollY | ||||
| 			) | ||||
| 		else | ||||
| 			nfte.drawImageTransparent( | ||||
| 				p.bullet.sprites[(p.cycle % #p.bullet.sprites) + 1], | ||||
| 				p.x - scrollX, | ||||
| 				p.y - scrollY | ||||
| 			) | ||||
| 		end | ||||
| 	end | ||||
| 	tsv(true) | ||||
| end | ||||
|  | ||||
| -- determines what sprite a player uses | ||||
| local determineSprite = function(player) | ||||
| 	local output | ||||
| 	player.xadj = 0 | ||||
| 	player.yadj = 0 | ||||
| 	if player.grounded then | ||||
| 		if player.cycle.slide > 0 then | ||||
| 			player.cycle.slide = math.max(player.cycle.slide - 1, isPlayerTouchingSolid(player, 0, 0, 0) and 1 or 0) | ||||
| 			output = "slide" | ||||
| 		else | ||||
| 			if player.xvel == 0 then | ||||
| 				player.cycle.run = -1 | ||||
| 				player.cycle.stand = (player.cycle.stand + 1) % 40 | ||||
| 				if player.cycle.shoot > 0 then | ||||
| 					player.cycle.shoot = player.cycle.shoot - 1 | ||||
| 					output = "shoot" | ||||
| 					if player.direction == -1 then | ||||
| 						player.xadj = -5 | ||||
| 					end | ||||
| 				else | ||||
| 					output = player.cycle.stand == 39 and "stand2" or "stand1" | ||||
| 				end | ||||
| 			else | ||||
| 				if player.cycle.run == -1 and player.cycle.shoot == 0 then | ||||
| 					player.cycle.run = 0 | ||||
| 					output = "walk0" | ||||
| 				else | ||||
| 					player.cycle.run = (player.cycle.run + 0.35) % 4 | ||||
| 					if player.cycle.shoot > 0 then | ||||
| 						output = "walkshoot" .. (math.floor(player.cycle.run) + 1) | ||||
| 					else | ||||
| 						output = "walk" .. (math.floor(player.cycle.run) + 1) | ||||
| 					end | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	else | ||||
| 		player.cycle.slide = isPlayerTouchingSolid(player, 0, 0, 0) and 1 or 0 | ||||
| 		if player.cycle.shoot > 0 then | ||||
| 			output = "jumpshoot" | ||||
| 			if player.direction == -1 then | ||||
| 				player.xadj = -1 | ||||
| 			end | ||||
| 		else | ||||
| 			output = "jump" | ||||
| 		end | ||||
| 	end | ||||
| 	return output | ||||
| end | ||||
|  | ||||
| local getInput = function() | ||||
| 	local evt | ||||
| 	while true do | ||||
| 		evt = {os.pullEvent()} | ||||
| 		if evt[1] == "key" then | ||||
| 			keysDown[evt[2]] = true | ||||
| 		elseif evt[1] == "key_up" then | ||||
| 			keysDown[evt[2]] = false | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local main = function() | ||||
| 	while true do | ||||
| 		players[you].control = deriveControls(keysDown) | ||||
| 		moveTick() | ||||
| 		players[you].sprite = determineSprite(players[you]) | ||||
| 		render() | ||||
| 		if keysDown[keys.q] then | ||||
| 			return | ||||
| 		end | ||||
| 		sleep(0.05) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| parallel.waitForAny(getInput, main) | ||||
|  | ||||
| term.setCursorPos(1, scr_y) | ||||
| term.clearLine() | ||||
		Reference in New Issue
	
	Block a user
	 LDDestroier
					LDDestroier