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):
|
||||
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():
|
||||
def __init__(self, width, height = None):
|
||||
self.rooms = [] # Stores room objects
|
||||
|
@ -79,6 +79,7 @@ class Generator():
|
|||
room1 = self.rooms[i]
|
||||
room2 = self.rooms[i + 1]
|
||||
|
||||
# Horizontal/vertical connections
|
||||
if rand(0, 2) == 0:
|
||||
if room1.cx <= room2.cx:
|
||||
self.horiz_corridor(room1.cx, room2.cx, room1.cy)
|
||||
|
@ -107,7 +108,7 @@ class Generator():
|
|||
for row in range(y1, y2 + 3):
|
||||
for col in range(x - 1, x + 3):
|
||||
self.board[row][col] = 1
|
||||
|
||||
|
||||
def value_at(self, x, y):
|
||||
try:
|
||||
return self.board[y][x]
|
||||
|
@ -133,7 +134,6 @@ class Generator():
|
|||
arot = 0 # Last adjacent key
|
||||
for key in range(len(asides)):
|
||||
off = asides[key]
|
||||
# if self.board[y + off[1]][x + off[0]] == 0:
|
||||
if self.value_at(x + off[0], y + off[1]) == 0:
|
||||
adj += 1
|
||||
arot = key
|
||||
|
|
|
@ -6,7 +6,7 @@ class Fade():
|
|||
self.image = pygame.Surface(rect.size, flags=pygame.SRCALPHA)
|
||||
self.alpha = start
|
||||
self.rate = rate
|
||||
self.text = ""
|
||||
self.text = "" # Used for death message
|
||||
|
||||
def update(self, surface, dtime):
|
||||
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))
|
||||
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))
|
||||
alphasurf = pygame.Surface(text.get_size(), pygame.SRCALPHA)
|
||||
alphasurf.fill((255, 255, 255, self.alpha))
|
||||
|
|
|
@ -27,7 +27,6 @@ from .player import Player
|
|||
|
||||
# Map
|
||||
map = Map(METER)
|
||||
# map.load("map.json")
|
||||
map.generate(0)
|
||||
|
||||
# Player
|
||||
|
@ -40,6 +39,7 @@ player.set_pos(mroom.cx, mroom.cy)
|
|||
CENTER = [winsize[0] / 2, winsize[1] / 2]
|
||||
BGCOLOR = pygame.Color("#2d1003")
|
||||
|
||||
# Fade from/to black
|
||||
player.fade = fade.Fade(255, -96)
|
||||
|
||||
def get_screenpos(x, y):
|
||||
|
@ -55,7 +55,7 @@ while 1:
|
|||
|
||||
for event in pygame.event.get():
|
||||
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
|
||||
SCALE = 2 * (winsize[0] / 800)
|
||||
CENTER = [winsize[0] / 2, winsize[1] / 2]
|
||||
|
@ -72,6 +72,7 @@ while 1:
|
|||
|
||||
player_rendered = False
|
||||
|
||||
# Render loops
|
||||
for z in range(player.z - 1, player.z + 1):
|
||||
if z < len(map.map):
|
||||
for y in range(len(map.map[z])):
|
||||
|
@ -106,9 +107,11 @@ while 1:
|
|||
if z < len(map.sprites):
|
||||
for sprite in map.sprites[z]:
|
||||
if y == math.ceil(sprite.pos.y):
|
||||
# Do on_step within 10 meter radius
|
||||
if vector.distance(sprite.pos, player.pos) <= 10:
|
||||
sprite.on_step(dtime, map, player)
|
||||
|
||||
# Only render if on-screen
|
||||
scaledsize = [round(SCALE * sprite.texture.width), round(SCALE * sprite.texture.height)]
|
||||
pos = get_screenpos(sprite.pos.x, sprite.pos.y)
|
||||
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)
|
||||
|
||||
player.hud.render(screen, SCALE)
|
||||
|
||||
player.fade.update(screen, dtime)
|
||||
|
||||
pygame.display.update()
|
||||
|
|
|
@ -2,6 +2,7 @@ import pygame
|
|||
import math
|
||||
from . import assets
|
||||
|
||||
# Returns a surface that can be blitted
|
||||
def make_element(defn, scale):
|
||||
element = None
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import math
|
|||
def populate(map, generator, z):
|
||||
# Place stairways
|
||||
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)
|
||||
entery = mroom.y + rand(2, mroom.height - 3)
|
||||
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])
|
||||
placed = True
|
||||
|
||||
# Place enemy spawners
|
||||
# Place enemy spawners (level-based)
|
||||
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
|
||||
max_count = rand(3, (z * 2) + 3)
|
||||
|
|
|
@ -13,10 +13,6 @@ class Map:
|
|||
def __init__(self, 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):
|
||||
generator = dungeon.Generator(40 + 4 * math.floor(z / 2)) # +4m^2 per level
|
||||
generator.generate(self, z)
|
||||
|
|
|
@ -133,7 +133,7 @@ class Player:
|
|||
self.texture.set_animation(self.dir * 4, (self.dir * 4) + 3, self.speed * 2)
|
||||
else:
|
||||
self.texture.set_animation(self.dir * 4, self.dir * 4, 0)
|
||||
|
||||
|
||||
# Do attacking
|
||||
if controller.is_down("attack"):
|
||||
if not self.attacking and time.time() - self.last_attack >= 0.7:
|
||||
|
@ -157,7 +157,7 @@ class Player:
|
|||
if sprite.name[:6] == "enemy:":
|
||||
if vector.distance(slash.pos, sprite.pos) <= 1:
|
||||
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:
|
||||
setat = round(sprite.pos)
|
||||
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 \
|
||||
and controller.is_down("shift") and time.time() - player.last_level_change > 0.5:
|
||||
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)
|
||||
generator = map.generators[player.z - 1]
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ from .vector import Vector
|
|||
def slime_logic(self, dtime, map, player):
|
||||
self.timer += dtime
|
||||
if self.timer >= 0.3: # Let's not do raycasting every frame
|
||||
# Look for a target
|
||||
if vector.distance(self.pos, player.pos) <= 6 \
|
||||
and len(map.raycast(self.pos, player.pos, self.z)) == 0:
|
||||
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 rand(0, 15) == 0:
|
||||
player.set_hp(player.hp - 2)
|
||||
|
||||
|
||||
# Look for a new destination
|
||||
if self.target_pos == self.pos:
|
||||
if rand(0, 2) == 0:
|
||||
dest = self.pos + Vector(rand(-5, 5), rand(-5, 5))
|
||||
|
|
|
@ -31,7 +31,7 @@ class Sprite:
|
|||
|
||||
def set_rect(self, x, y, w, h):
|
||||
self.rect = pygame.Rect(x, y, w, h)
|
||||
|
||||
|
||||
def get_rect(self):
|
||||
return self.rect
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@ import pygame
|
|||
global registered_tiles
|
||||
registered_tiles = {}
|
||||
|
||||
# Content IDs are currently unused
|
||||
# They would be used for map-saving
|
||||
content_ids = []
|
||||
content_id_map = {}
|
||||
|
||||
|
@ -50,7 +52,7 @@ class Tile:
|
|||
|
||||
def is_solid(self):
|
||||
return self.get("solid") == True
|
||||
|
||||
|
||||
def on_step(self, dtime, map, player):
|
||||
if "on_step" in registered_tiles[self.name]:
|
||||
registered_tiles[self.name]["on_step"](self, dtime, map, player)
|
||||
|
|
|
@ -19,7 +19,7 @@ class Vector:
|
|||
def __eq__(self, b):
|
||||
vec = vec_or_num(b)
|
||||
return self.x == vec.x and self.y == vec.y
|
||||
|
||||
|
||||
def __ne__(self, b):
|
||||
vec = vec_or_num(b)
|
||||
return self.x != vec.x or self.y != vec.y
|
||||
|
@ -48,7 +48,7 @@ class Vector:
|
|||
|
||||
def __ceil__(self):
|
||||
return Vector(math.ceil(self.x), math.ceil(self.y))
|
||||
|
||||
|
||||
def flip(self):
|
||||
return Vector(self.y, self.x)
|
||||
|
||||
|
|
Loading…
Reference in New Issue