master
GreenXenith 2020-05-02 14:33:32 -07:00
parent 95b86c5d4b
commit 32666d4e2d
13 changed files with 25 additions and 70 deletions

View File

@ -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]
]
}

View File

@ -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

View File

@ -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))

View File

@ -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()

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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")

View File

@ -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]

View File

@ -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))

View File

@ -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

View File

@ -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)

View File

@ -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)