Cleanup
parent
95b86c5d4b
commit
32666d4e2d
49
map.json
49
map.json
|
@ -1,49 +0,0 @@
|
||||||
{
|
|
||||||
"tiles": [
|
|
||||||
"floor_cobble.png",
|
|
||||||
"wall_cobble_down.png",
|
|
||||||
"wall_cobble_right.png",
|
|
||||||
"wall_cobble_up.png",
|
|
||||||
"wall_cobble_left.png",
|
|
||||||
"wall_cobble_corner_nw_inner.png",
|
|
||||||
"wall_cobble_corner_ne_inner.png",
|
|
||||||
"wall_cobble_corner_se_inner.png",
|
|
||||||
"wall_cobble_corner_sw_inner.png",
|
|
||||||
"wall_cobble_corner_nw_outer.png",
|
|
||||||
"wall_cobble_corner_ne_outer.png",
|
|
||||||
"wall_cobble_corner_se_outer.png",
|
|
||||||
"wall_cobble_corner_sw_outer.png"
|
|
||||||
],
|
|
||||||
"renderLayers": [
|
|
||||||
[
|
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0],
|
|
||||||
[0, 1, 1, 1, 1, 1, 1, 0],
|
|
||||||
[0, 1, 1, 1, 1, 1, 1, 0],
|
|
||||||
[0, 1, 1, 1, 1, 1, 1, 0],
|
|
||||||
[0, 1, 1, 1, 1, 0, 0, 0],
|
|
||||||
[0, 1, 1, 1, 0, 0, 0, 0],
|
|
||||||
[0, 1, 1, 1, 0, 0, 0, 0],
|
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0]
|
|
||||||
],
|
|
||||||
[
|
|
||||||
[6, 2, 2, 2, 2, 2, 2, 7],
|
|
||||||
[3, 0, 0, 0, 0, 0, 0, 5],
|
|
||||||
[3, 0, 0, 0, 0, 0, 0, 5],
|
|
||||||
[3, 0, 0, 0, 0, 0, 0, 5],
|
|
||||||
[3, 0, 0, 0, 10, 4, 4, 8],
|
|
||||||
[3, 0, 0, 0, 5, 0, 0, 0],
|
|
||||||
[3, 0, 0, 0, 5, 0, 0, 0],
|
|
||||||
[9, 4, 4, 4, 8, 0, 0, 0]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"boundaries": [
|
|
||||||
[1, 1, 1, 1, 1, 1, 1, 1],
|
|
||||||
[1, 0, 0, 0, 0, 0, 0, 1],
|
|
||||||
[1, 0, 0, 0, 0, 0, 0, 1],
|
|
||||||
[1, 0, 0, 0, 0, 0, 0, 1],
|
|
||||||
[1, 0, 0, 0, 1, 1, 1, 1],
|
|
||||||
[1, 0, 0, 0, 1, 0, 0, 0],
|
|
||||||
[1, 0, 0, 0, 1, 0, 0, 0],
|
|
||||||
[1, 1, 1, 1, 1, 0, 0, 0]
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -26,7 +26,7 @@ class Room():
|
||||||
def intersects(self, other):
|
def intersects(self, other):
|
||||||
return self.left <= other.right and self.right >= other.left and self.top <= other.bottom and self.bottom >= other.top
|
return self.left <= other.right and self.right >= other.left and self.top <= other.bottom and self.bottom >= other.top
|
||||||
|
|
||||||
# Generator as class in case its used multiple times
|
# Generator as class (for multiple levels)
|
||||||
class Generator():
|
class Generator():
|
||||||
def __init__(self, width, height = None):
|
def __init__(self, width, height = None):
|
||||||
self.rooms = [] # Stores room objects
|
self.rooms = [] # Stores room objects
|
||||||
|
@ -79,6 +79,7 @@ class Generator():
|
||||||
room1 = self.rooms[i]
|
room1 = self.rooms[i]
|
||||||
room2 = self.rooms[i + 1]
|
room2 = self.rooms[i + 1]
|
||||||
|
|
||||||
|
# Horizontal/vertical connections
|
||||||
if rand(0, 2) == 0:
|
if rand(0, 2) == 0:
|
||||||
if room1.cx <= room2.cx:
|
if room1.cx <= room2.cx:
|
||||||
self.horiz_corridor(room1.cx, room2.cx, room1.cy)
|
self.horiz_corridor(room1.cx, room2.cx, room1.cy)
|
||||||
|
@ -107,7 +108,7 @@ class Generator():
|
||||||
for row in range(y1, y2 + 3):
|
for row in range(y1, y2 + 3):
|
||||||
for col in range(x - 1, x + 3):
|
for col in range(x - 1, x + 3):
|
||||||
self.board[row][col] = 1
|
self.board[row][col] = 1
|
||||||
|
|
||||||
def value_at(self, x, y):
|
def value_at(self, x, y):
|
||||||
try:
|
try:
|
||||||
return self.board[y][x]
|
return self.board[y][x]
|
||||||
|
@ -133,7 +134,6 @@ class Generator():
|
||||||
arot = 0 # Last adjacent key
|
arot = 0 # Last adjacent key
|
||||||
for key in range(len(asides)):
|
for key in range(len(asides)):
|
||||||
off = asides[key]
|
off = asides[key]
|
||||||
# if self.board[y + off[1]][x + off[0]] == 0:
|
|
||||||
if self.value_at(x + off[0], y + off[1]) == 0:
|
if self.value_at(x + off[0], y + off[1]) == 0:
|
||||||
adj += 1
|
adj += 1
|
||||||
arot = key
|
arot = key
|
||||||
|
|
|
@ -6,7 +6,7 @@ class Fade():
|
||||||
self.image = pygame.Surface(rect.size, flags=pygame.SRCALPHA)
|
self.image = pygame.Surface(rect.size, flags=pygame.SRCALPHA)
|
||||||
self.alpha = start
|
self.alpha = start
|
||||||
self.rate = rate
|
self.rate = rate
|
||||||
self.text = ""
|
self.text = "" # Used for death message
|
||||||
|
|
||||||
def update(self, surface, dtime):
|
def update(self, surface, dtime):
|
||||||
self.alpha = max(0, min(self.alpha + int(self.rate * dtime), 255))
|
self.alpha = max(0, min(self.alpha + int(self.rate * dtime), 255))
|
||||||
|
@ -16,6 +16,7 @@ class Fade():
|
||||||
self.image.fill((0, 0, 0, self.alpha))
|
self.image.fill((0, 0, 0, self.alpha))
|
||||||
surface.blit(self.image, (0, 0))
|
surface.blit(self.image, (0, 0))
|
||||||
|
|
||||||
|
# Alpha surface blitting for translucent text
|
||||||
text = pygame.font.SysFont("Times New Roman", round(rect.width / 16)).render(self.text, True, (255, 255, 255))
|
text = pygame.font.SysFont("Times New Roman", round(rect.width / 16)).render(self.text, True, (255, 255, 255))
|
||||||
alphasurf = pygame.Surface(text.get_size(), pygame.SRCALPHA)
|
alphasurf = pygame.Surface(text.get_size(), pygame.SRCALPHA)
|
||||||
alphasurf.fill((255, 255, 255, self.alpha))
|
alphasurf.fill((255, 255, 255, self.alpha))
|
||||||
|
|
|
@ -27,7 +27,6 @@ from .player import Player
|
||||||
|
|
||||||
# Map
|
# Map
|
||||||
map = Map(METER)
|
map = Map(METER)
|
||||||
# map.load("map.json")
|
|
||||||
map.generate(0)
|
map.generate(0)
|
||||||
|
|
||||||
# Player
|
# Player
|
||||||
|
@ -40,6 +39,7 @@ player.set_pos(mroom.cx, mroom.cy)
|
||||||
CENTER = [winsize[0] / 2, winsize[1] / 2]
|
CENTER = [winsize[0] / 2, winsize[1] / 2]
|
||||||
BGCOLOR = pygame.Color("#2d1003")
|
BGCOLOR = pygame.Color("#2d1003")
|
||||||
|
|
||||||
|
# Fade from/to black
|
||||||
player.fade = fade.Fade(255, -96)
|
player.fade = fade.Fade(255, -96)
|
||||||
|
|
||||||
def get_screenpos(x, y):
|
def get_screenpos(x, y):
|
||||||
|
@ -55,7 +55,7 @@ while 1:
|
||||||
|
|
||||||
for event in pygame.event.get():
|
for event in pygame.event.get():
|
||||||
if event.type == pygame.QUIT: sys.exit()
|
if event.type == pygame.QUIT: sys.exit()
|
||||||
elif event.type == pygame.VIDEORESIZE:
|
elif event.type == pygame.VIDEORESIZE: # This is currently broken on Linux (SDL2)
|
||||||
winsize = event.size
|
winsize = event.size
|
||||||
SCALE = 2 * (winsize[0] / 800)
|
SCALE = 2 * (winsize[0] / 800)
|
||||||
CENTER = [winsize[0] / 2, winsize[1] / 2]
|
CENTER = [winsize[0] / 2, winsize[1] / 2]
|
||||||
|
@ -72,6 +72,7 @@ while 1:
|
||||||
|
|
||||||
player_rendered = False
|
player_rendered = False
|
||||||
|
|
||||||
|
# Render loops
|
||||||
for z in range(player.z - 1, player.z + 1):
|
for z in range(player.z - 1, player.z + 1):
|
||||||
if z < len(map.map):
|
if z < len(map.map):
|
||||||
for y in range(len(map.map[z])):
|
for y in range(len(map.map[z])):
|
||||||
|
@ -106,9 +107,11 @@ while 1:
|
||||||
if z < len(map.sprites):
|
if z < len(map.sprites):
|
||||||
for sprite in map.sprites[z]:
|
for sprite in map.sprites[z]:
|
||||||
if y == math.ceil(sprite.pos.y):
|
if y == math.ceil(sprite.pos.y):
|
||||||
|
# Do on_step within 10 meter radius
|
||||||
if vector.distance(sprite.pos, player.pos) <= 10:
|
if vector.distance(sprite.pos, player.pos) <= 10:
|
||||||
sprite.on_step(dtime, map, player)
|
sprite.on_step(dtime, map, player)
|
||||||
|
|
||||||
|
# Only render if on-screen
|
||||||
scaledsize = [round(SCALE * sprite.texture.width), round(SCALE * sprite.texture.height)]
|
scaledsize = [round(SCALE * sprite.texture.width), round(SCALE * sprite.texture.height)]
|
||||||
pos = get_screenpos(sprite.pos.x, sprite.pos.y)
|
pos = get_screenpos(sprite.pos.x, sprite.pos.y)
|
||||||
if pos[0] + scaledsize[0] >= 0 and pos[0] <= winsize[0] and \
|
if pos[0] + scaledsize[0] >= 0 and pos[0] <= winsize[0] and \
|
||||||
|
@ -116,7 +119,6 @@ while 1:
|
||||||
screen.blit(pygame.transform.rotate(pygame.transform.scale(sprite.texture.frame, scaledsize), sprite.rot), pos)
|
screen.blit(pygame.transform.rotate(pygame.transform.scale(sprite.texture.frame, scaledsize), sprite.rot), pos)
|
||||||
|
|
||||||
player.hud.render(screen, SCALE)
|
player.hud.render(screen, SCALE)
|
||||||
|
|
||||||
player.fade.update(screen, dtime)
|
player.fade.update(screen, dtime)
|
||||||
|
|
||||||
pygame.display.update()
|
pygame.display.update()
|
||||||
|
|
|
@ -2,6 +2,7 @@ import pygame
|
||||||
import math
|
import math
|
||||||
from . import assets
|
from . import assets
|
||||||
|
|
||||||
|
# Returns a surface that can be blitted
|
||||||
def make_element(defn, scale):
|
def make_element(defn, scale):
|
||||||
element = None
|
element = None
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import math
|
||||||
def populate(map, generator, z):
|
def populate(map, generator, z):
|
||||||
# Place stairways
|
# Place stairways
|
||||||
mroom = generator.rooms[int(math.ceil(len(generator.rooms) / 2))] # Middle room
|
mroom = generator.rooms[int(math.ceil(len(generator.rooms) / 2))] # Middle room
|
||||||
if z != 0:
|
if z != 0: # Don't put a stair up on the first level
|
||||||
enterx = mroom.x + rand(2, mroom.width - 2)
|
enterx = mroom.x + rand(2, mroom.width - 2)
|
||||||
entery = mroom.y + rand(2, mroom.height - 3)
|
entery = mroom.y + rand(2, mroom.height - 3)
|
||||||
map.set_tile(enterx, entery, z + 1, "map:stair_up")
|
map.set_tile(enterx, entery, z + 1, "map:stair_up")
|
||||||
|
@ -37,7 +37,7 @@ def populate(map, generator, z):
|
||||||
map.set_tile(room.x + x, room.y + y, z + 1, l[0])
|
map.set_tile(room.x + x, room.y + y, z + 1, l[0])
|
||||||
placed = True
|
placed = True
|
||||||
|
|
||||||
# Place enemy spawners
|
# Place enemy spawners (level-based)
|
||||||
for room in generator.rooms:
|
for room in generator.rooms:
|
||||||
if room == froom or room == lroom or (room != mroom and rand(0, 1) == 0): # 1 in 2 chance of enemies
|
if room == froom or room == lroom or (room != mroom and rand(0, 1) == 0): # 1 in 2 chance of enemies
|
||||||
max_count = rand(3, (z * 2) + 3)
|
max_count = rand(3, (z * 2) + 3)
|
||||||
|
|
|
@ -13,10 +13,6 @@ class Map:
|
||||||
def __init__(self, meter):
|
def __init__(self, meter):
|
||||||
self.METER = meter # Pixels per 1 meter
|
self.METER = meter # Pixels per 1 meter
|
||||||
|
|
||||||
# def load(self, filename):
|
|
||||||
# with open(filename) as file:
|
|
||||||
# self.map = json.load(file)
|
|
||||||
|
|
||||||
def generate(self, z):
|
def generate(self, z):
|
||||||
generator = dungeon.Generator(40 + 4 * math.floor(z / 2)) # +4m^2 per level
|
generator = dungeon.Generator(40 + 4 * math.floor(z / 2)) # +4m^2 per level
|
||||||
generator.generate(self, z)
|
generator.generate(self, z)
|
||||||
|
|
|
@ -133,7 +133,7 @@ class Player:
|
||||||
self.texture.set_animation(self.dir * 4, (self.dir * 4) + 3, self.speed * 2)
|
self.texture.set_animation(self.dir * 4, (self.dir * 4) + 3, self.speed * 2)
|
||||||
else:
|
else:
|
||||||
self.texture.set_animation(self.dir * 4, self.dir * 4, 0)
|
self.texture.set_animation(self.dir * 4, self.dir * 4, 0)
|
||||||
|
|
||||||
# Do attacking
|
# Do attacking
|
||||||
if controller.is_down("attack"):
|
if controller.is_down("attack"):
|
||||||
if not self.attacking and time.time() - self.last_attack >= 0.7:
|
if not self.attacking and time.time() - self.last_attack >= 0.7:
|
||||||
|
@ -157,7 +157,7 @@ class Player:
|
||||||
if sprite.name[:6] == "enemy:":
|
if sprite.name[:6] == "enemy:":
|
||||||
if vector.distance(slash.pos, sprite.pos) <= 1:
|
if vector.distance(slash.pos, sprite.pos) <= 1:
|
||||||
sprite.hp -= 3 + (self.xp // 15)
|
sprite.hp -= 3 + (self.xp // 15)
|
||||||
sprite.vel = (sprite.vel * -2) + self.vel + (self.look * 2)
|
sprite.vel = (sprite.vel * -2) + self.vel + (self.look * 2) # Knockback
|
||||||
if sprite.hp <= 0:
|
if sprite.hp <= 0:
|
||||||
setat = round(sprite.pos)
|
setat = round(sprite.pos)
|
||||||
map.set_tile(int(setat.x), int(setat.y), int(sprite.z), sprite.name + "_dead")
|
map.set_tile(int(setat.x), int(setat.y), int(sprite.z), sprite.name + "_dead")
|
||||||
|
|
|
@ -84,7 +84,7 @@ def next_level(self, _, map, player):
|
||||||
if math.hypot(player.pos.x - self.pos[0], player.pos.y + 1 - self.pos[1]) <= 1 \
|
if math.hypot(player.pos.x - self.pos[0], player.pos.y + 1 - self.pos[1]) <= 1 \
|
||||||
and controller.is_down("shift") and time.time() - player.last_level_change > 0.5:
|
and controller.is_down("shift") and time.time() - player.last_level_change > 0.5:
|
||||||
player.z += 2
|
player.z += 2
|
||||||
if not player.z - 1 in map.generators:
|
if not player.z - 1 in map.generators: # Generate level if new
|
||||||
map.generate(player.z - 1)
|
map.generate(player.z - 1)
|
||||||
generator = map.generators[player.z - 1]
|
generator = map.generators[player.z - 1]
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ from .vector import Vector
|
||||||
def slime_logic(self, dtime, map, player):
|
def slime_logic(self, dtime, map, player):
|
||||||
self.timer += dtime
|
self.timer += dtime
|
||||||
if self.timer >= 0.3: # Let's not do raycasting every frame
|
if self.timer >= 0.3: # Let's not do raycasting every frame
|
||||||
|
# Look for a target
|
||||||
if vector.distance(self.pos, player.pos) <= 6 \
|
if vector.distance(self.pos, player.pos) <= 6 \
|
||||||
and len(map.raycast(self.pos, player.pos, self.z)) == 0:
|
and len(map.raycast(self.pos, player.pos, self.z)) == 0:
|
||||||
self.target_pos = player.pos
|
self.target_pos = player.pos
|
||||||
|
@ -19,7 +20,8 @@ def slime_logic(self, dtime, map, player):
|
||||||
if vector.distance(self.pos, player.pos) <= 1:
|
if vector.distance(self.pos, player.pos) <= 1:
|
||||||
if rand(0, 15) == 0:
|
if rand(0, 15) == 0:
|
||||||
player.set_hp(player.hp - 2)
|
player.set_hp(player.hp - 2)
|
||||||
|
|
||||||
|
# Look for a new destination
|
||||||
if self.target_pos == self.pos:
|
if self.target_pos == self.pos:
|
||||||
if rand(0, 2) == 0:
|
if rand(0, 2) == 0:
|
||||||
dest = self.pos + Vector(rand(-5, 5), rand(-5, 5))
|
dest = self.pos + Vector(rand(-5, 5), rand(-5, 5))
|
||||||
|
|
|
@ -31,7 +31,7 @@ class Sprite:
|
||||||
|
|
||||||
def set_rect(self, x, y, w, h):
|
def set_rect(self, x, y, w, h):
|
||||||
self.rect = pygame.Rect(x, y, w, h)
|
self.rect = pygame.Rect(x, y, w, h)
|
||||||
|
|
||||||
def get_rect(self):
|
def get_rect(self):
|
||||||
return self.rect
|
return self.rect
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@ import pygame
|
||||||
global registered_tiles
|
global registered_tiles
|
||||||
registered_tiles = {}
|
registered_tiles = {}
|
||||||
|
|
||||||
|
# Content IDs are currently unused
|
||||||
|
# They would be used for map-saving
|
||||||
content_ids = []
|
content_ids = []
|
||||||
content_id_map = {}
|
content_id_map = {}
|
||||||
|
|
||||||
|
@ -50,7 +52,7 @@ class Tile:
|
||||||
|
|
||||||
def is_solid(self):
|
def is_solid(self):
|
||||||
return self.get("solid") == True
|
return self.get("solid") == True
|
||||||
|
|
||||||
def on_step(self, dtime, map, player):
|
def on_step(self, dtime, map, player):
|
||||||
if "on_step" in registered_tiles[self.name]:
|
if "on_step" in registered_tiles[self.name]:
|
||||||
registered_tiles[self.name]["on_step"](self, dtime, map, player)
|
registered_tiles[self.name]["on_step"](self, dtime, map, player)
|
||||||
|
|
|
@ -19,7 +19,7 @@ class Vector:
|
||||||
def __eq__(self, b):
|
def __eq__(self, b):
|
||||||
vec = vec_or_num(b)
|
vec = vec_or_num(b)
|
||||||
return self.x == vec.x and self.y == vec.y
|
return self.x == vec.x and self.y == vec.y
|
||||||
|
|
||||||
def __ne__(self, b):
|
def __ne__(self, b):
|
||||||
vec = vec_or_num(b)
|
vec = vec_or_num(b)
|
||||||
return self.x != vec.x or self.y != vec.y
|
return self.x != vec.x or self.y != vec.y
|
||||||
|
@ -48,7 +48,7 @@ class Vector:
|
||||||
|
|
||||||
def __ceil__(self):
|
def __ceil__(self):
|
||||||
return Vector(math.ceil(self.x), math.ceil(self.y))
|
return Vector(math.ceil(self.x), math.ceil(self.y))
|
||||||
|
|
||||||
def flip(self):
|
def flip(self):
|
||||||
return Vector(self.y, self.x)
|
return Vector(self.y, self.x)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue