From 045f2707f70b257ed1e1802ae18eec525bea6b97 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 20 Mar 2026 20:22:45 -0500 Subject: [PATCH 01/19] update love-demo2 code to latest version --- game/Makefile | 5 +- game/font/bitmap/terminus_128x128_8x16.data | Bin 0 -> 16384 bytes game/font/bitmap/terminus_128x64_6x12.data | Bin 0 -> 8192 bytes game/font/bitmap/terminus_256x128_10x18.data | Bin 0 -> 32768 bytes game/font/bitmap/terminus_256x128_12x24.data | Bin 0 -> 32768 bytes game/font/bitmap/terminus_256x256_16x32.data | Bin 0 -> 65536 bytes game/font/outline/uncial_antiqua_36.data | Bin 0 -> 67484 bytes game/include/flame.h | 7 + game/include/font/bitmap.h | 67 + game/include/font/outline.h | 29 + game/include/font/outline_types.h | 49 + game/include/view.h | 2 + game/include/world/inthash.h | 1 + game/include/world/world.h | 1 + game/main.lua | 526 +- game/minecraft/flame.data | Bin 0 -> 5120 bytes game/minecraft/gen/mc.py | 6 +- game/minecraft/gen/midnightmeadow.sh | 24 + game/minecraft/grandlecturn/global.lights.vtx | Bin 2080 -> 2080 bytes .../grandlecturn/region.-1.0.lights.vtx | Bin 528 -> 528 bytes .../grandlecturn/region.0.-1.lights.vtx | Bin 32 -> 32 bytes .../grandlecturn/region.0.0.lights.vtx | Bin 1520 -> 1520 bytes game/minecraft/love2dworld/map.txt | 1032878 +++++++++++--- game/minecraft/midnightmeadow/all_regions.txt | 4 + game/minecraft/midnightmeadow/global.dump | Bin 0 -> 6481024 bytes .../midnightmeadow/global.lights.vtx | 0 game/minecraft/midnightmeadow/inthash.c | 26761 + .../midnightmeadow/region.-1.-1.dump | Bin 0 -> 1030216 bytes .../midnightmeadow/region.-1.-1.instance.cfg | Bin 0 -> 560 bytes .../midnightmeadow/region.-1.-1.instance.vtx | Bin 0 -> 2060432 bytes .../midnightmeadow/region.-1.-1.lights.vtx | 0 .../minecraft/midnightmeadow/region.-1.0.dump | Bin 0 -> 1557864 bytes .../midnightmeadow/region.-1.0.instance.cfg | Bin 0 -> 560 bytes .../midnightmeadow/region.-1.0.instance.vtx | Bin 0 -> 3115728 bytes .../midnightmeadow/region.-1.0.lights.vtx | 0 .../minecraft/midnightmeadow/region.0.-1.dump | Bin 0 -> 1551640 bytes .../midnightmeadow/region.0.-1.instance.cfg | Bin 0 -> 560 bytes .../midnightmeadow/region.0.-1.instance.vtx | Bin 0 -> 3103280 bytes .../midnightmeadow/region.0.-1.lights.vtx | 0 game/minecraft/midnightmeadow/region.0.0.dump | Bin 0 -> 2341304 bytes .../midnightmeadow/region.0.0.instance.cfg | Bin 0 -> 560 bytes .../midnightmeadow/region.0.0.instance.vtx | Bin 0 -> 4682608 bytes .../midnightmeadow/region.0.0.lights.vtx | 0 game/shader/flame.frag | 28 + game/shader/flame.vert | 42 + game/shader/font.vert | 22 +- game/shader/font_outline.frag | 17 + game/shader/lighting.frag | 31 +- game/shader/minecraft.vert | 2 +- game/src/flame.cpp | 106 + game/src/font/bitmap.cpp | 169 + game/src/font/outline.cpp | 150 + game/src/hud.cpp | 63 +- game/src/lua_api.cpp | 14 +- game/src/minecraft.cpp | 4 +- game/src/test.cpp | 35 +- game/src/view.cpp | 11 +- game/src/world/world.cpp | 14 + 58 files changed, 837936 insertions(+), 223132 deletions(-) create mode 100644 game/font/bitmap/terminus_128x128_8x16.data create mode 100644 game/font/bitmap/terminus_128x64_6x12.data create mode 100644 game/font/bitmap/terminus_256x128_10x18.data create mode 100644 game/font/bitmap/terminus_256x128_12x24.data create mode 100644 game/font/bitmap/terminus_256x256_16x32.data create mode 100644 game/font/outline/uncial_antiqua_36.data create mode 100644 game/include/flame.h create mode 100644 game/include/font/bitmap.h create mode 100644 game/include/font/outline.h create mode 100644 game/include/font/outline_types.h create mode 100644 game/minecraft/flame.data create mode 100644 game/minecraft/gen/midnightmeadow.sh create mode 100644 game/minecraft/midnightmeadow/all_regions.txt create mode 100644 game/minecraft/midnightmeadow/global.dump create mode 100644 game/minecraft/midnightmeadow/global.lights.vtx create mode 100644 game/minecraft/midnightmeadow/inthash.c create mode 100644 game/minecraft/midnightmeadow/region.-1.-1.dump create mode 100644 game/minecraft/midnightmeadow/region.-1.-1.instance.cfg create mode 100644 game/minecraft/midnightmeadow/region.-1.-1.instance.vtx create mode 100644 game/minecraft/midnightmeadow/region.-1.-1.lights.vtx create mode 100644 game/minecraft/midnightmeadow/region.-1.0.dump create mode 100644 game/minecraft/midnightmeadow/region.-1.0.instance.cfg create mode 100644 game/minecraft/midnightmeadow/region.-1.0.instance.vtx create mode 100644 game/minecraft/midnightmeadow/region.-1.0.lights.vtx create mode 100644 game/minecraft/midnightmeadow/region.0.-1.dump create mode 100644 game/minecraft/midnightmeadow/region.0.-1.instance.cfg create mode 100644 game/minecraft/midnightmeadow/region.0.-1.instance.vtx create mode 100644 game/minecraft/midnightmeadow/region.0.-1.lights.vtx create mode 100644 game/minecraft/midnightmeadow/region.0.0.dump create mode 100644 game/minecraft/midnightmeadow/region.0.0.instance.cfg create mode 100644 game/minecraft/midnightmeadow/region.0.0.instance.vtx create mode 100644 game/minecraft/midnightmeadow/region.0.0.lights.vtx create mode 100644 game/shader/flame.frag create mode 100644 game/shader/flame.vert create mode 100644 game/shader/font_outline.frag create mode 100644 game/src/flame.cpp create mode 100644 game/src/font/bitmap.cpp create mode 100644 game/src/font/outline.cpp diff --git a/game/Makefile b/game/Makefile index 0aafa8a..1c0ab1b 100644 --- a/game/Makefile +++ b/game/Makefile @@ -20,6 +20,7 @@ LDFLAGS += $(shell pkg-config --libs glfw3) MINECRAFT_OBJS = \ minecraft/love2dworld/inthash.o \ minecraft/grandlecturn/inthash.o \ + minecraft/midnightmeadow/inthash.o \ src/minecraft.o \ src/world/world.o \ src/world/entry_table.o @@ -28,7 +29,8 @@ OBJS = \ src/gl.o \ src/opengl.o \ src/test.o \ - src/font.o \ + src/font/bitmap.o \ + src/font/outline.o \ src/window.o \ src/bresenham.o \ src/file.o \ @@ -47,6 +49,7 @@ OBJS = \ src/collada/animate.o \ src/lua_api.o \ src/pixel_line_art.o \ + src/flame.o \ data/scenes/ship20/ship20.o \ data/scenes/noodle/noodle.o \ data/scenes/shadow_test/shadow_test.o \ diff --git a/game/font/bitmap/terminus_128x128_8x16.data b/game/font/bitmap/terminus_128x128_8x16.data new file mode 100644 index 0000000000000000000000000000000000000000..00b05559e7726a900d166edf430ef3ea773540f4 GIT binary patch literal 16384 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 GoWL)-)&&3n literal 0 HcmV?d00001 diff --git a/game/font/bitmap/terminus_256x128_10x18.data b/game/font/bitmap/terminus_256x128_10x18.data new file mode 100644 index 0000000000000000000000000000000000000000..246d05a44084bc585c86e02b6e630ccad2a9c515 GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/game/font/bitmap/terminus_256x256_16x32.data b/game/font/bitmap/terminus_256x256_16x32.data new file mode 100644 index 0000000000000000000000000000000000000000..2cd561d8d2b41dd780d2833f4bd5c1d94c4fa950 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/game/font/outline/uncial_antiqua_36.data b/game/font/outline/uncial_antiqua_36.data new file mode 100644 index 0000000000000000000000000000000000000000..90e468ec7191858217d774d08728957ce4cf178e GIT binary patch literal 67484 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 Njq?7lsCrD4{67;E(d7UD literal 0 HcmV?d00001 diff --git a/game/include/flame.h b/game/include/flame.h new file mode 100644 index 0000000..b4b9a70 --- /dev/null +++ b/game/include/flame.h @@ -0,0 +1,7 @@ +#pragma once + +namespace flame { + void load_program(); + void load_texture(); + void draw(unsigned int light_uniform_buffer, int light_count); +} diff --git a/game/include/font/bitmap.h b/game/include/font/bitmap.h new file mode 100644 index 0000000..c7dc9fc --- /dev/null +++ b/game/include/font/bitmap.h @@ -0,0 +1,67 @@ +#pragma once + +namespace font::bitmap { + + struct font_desc { + char const * const path; + int const texture_width; + int const texture_height; + int const glyph_width; + int const glyph_height; + }; + + font_desc const terminus[] = { + { + .path = "font/bitmap/terminus_128x64_6x12.data", + .texture_width = 128, + .texture_height = 64, + .glyph_width = 6, + .glyph_height = 12, + }, + { + .path = "font/bitmap/terminus_128x128_8x16.data", + .texture_width = 128, + .texture_height = 128, + .glyph_width = 8, + .glyph_height = 16, + }, + { + .path = "font/bitmap/terminus_256x128_10x18.data", + .texture_width = 256, + .texture_height = 128, + .glyph_width = 10, + .glyph_height = 18, + }, + { + .path = "font/bitmap/terminus_256x128_12x24.data", + .texture_width = 256, + .texture_height = 128, + .glyph_width = 12, + .glyph_height = 24, + }, + { + .path = "font/bitmap/terminus_256x256_16x32.data", + .texture_width = 256, + .texture_height = 256, + .glyph_width = 16, + .glyph_height = 32, + }, + }; + int const terminus_length = (sizeof (terminus)) / (sizeof (font_desc)); + + struct font { + font_desc const * desc; + unsigned int texture; + int stride; + struct { + float width; + float height; + } cell; + }; + + void load_shader(); + void load_fonts(font * const fonts, font_desc const * const descs, int length); + int best_font(font_desc const * const descs, int length); + void draw_start(font const& font, unsigned int vertex_array_object, unsigned int index_buffer); + int draw_string(font const& font, char const * const s, int x, int y); +} diff --git a/game/include/font/outline.h b/game/include/font/outline.h new file mode 100644 index 0000000..6036795 --- /dev/null +++ b/game/include/font/outline.h @@ -0,0 +1,29 @@ +#pragma once + +#include "outline_types.h" + +namespace font::outline { + + struct font_desc { + char const * const path; + }; + + font_desc const uncial_antiqua[] = { + { + .path = "font/outline/uncial_antiqua_36.data", + }, + }; + int const uncial_antiqua_length = (sizeof (uncial_antiqua)) / (sizeof (font_desc)); + + struct font { + unsigned int texture; + types::font const * font; + types::glyph const * glyphs; + }; + + void load_shader(); + void load_fonts(font * const fonts, font_desc const * const descs, int length); + + void draw_start(font const& font, unsigned int vertex_array_object, unsigned int index_buffer); + int draw_string(font const& font, char const * const s, int x, int y); +} diff --git a/game/include/font/outline_types.h b/game/include/font/outline_types.h new file mode 100644 index 0000000..2ef4930 --- /dev/null +++ b/game/include/font/outline_types.h @@ -0,0 +1,49 @@ +// this file is designed to be platform-agnostic +#pragma once + +#include + +namespace font::outline::types { + + // metrics are 26.6 fixed point + struct glyph_metrics { + int32_t horiBearingX; + int32_t horiBearingY; + int32_t horiAdvance; + } __attribute__ ((packed)); + + static_assert((sizeof (struct glyph_metrics)) == ((sizeof (int32_t)) * 3)); + + struct glyph_bitmap { + uint16_t x; + uint16_t y; + uint16_t width; + uint16_t height; + } __attribute__ ((packed)); + + static_assert((sizeof (struct glyph_bitmap)) == ((sizeof (uint16_t)) * 4)); + + struct glyph { + struct glyph_bitmap bitmap; + struct glyph_metrics metrics; + } __attribute__ ((packed)); + + static_assert((sizeof (struct glyph)) == ((sizeof (struct glyph_bitmap)) + (sizeof (struct glyph_metrics)))); + + struct font { + uint32_t first_char_code; + uint32_t last_char_code; + struct face_metrics { + int32_t height; // 26.6 fixed point + int32_t max_advance; // 26.6 fixed point + } face_metrics; + uint16_t glyph_count; + uint16_t _texture_stride; + uint16_t texture_width; + uint16_t texture_height; + uint32_t max_z_curve_ix; + } __attribute__ ((packed)); + + static_assert((sizeof (struct font)) == ((sizeof (uint32_t)) * 7)); + +} diff --git a/game/include/view.h b/game/include/view.h index 47c04ed..320737c 100644 --- a/game/include/view.h +++ b/game/include/view.h @@ -1,5 +1,7 @@ #pragma once +#include "directxmath/directxmath.h" + namespace view { struct view_state { // positions diff --git a/game/include/world/inthash.h b/game/include/world/inthash.h index 7766287..aa8d006 100644 --- a/game/include/world/inthash.h +++ b/game/include/world/inthash.h @@ -8,6 +8,7 @@ extern "C" { uint32_t love2dworld_hash(const int32_t key); uint32_t grandlecturn_hash(const int32_t key); + uint32_t midnightmeadow_hash(const int32_t key); #ifdef __cplusplus } diff --git a/game/include/world/world.h b/game/include/world/world.h index eb1b3fa..6425649 100644 --- a/game/include/world/world.h +++ b/game/include/world/world.h @@ -22,6 +22,7 @@ namespace world { enum { LOVE2DWORLD = 0, GRANDLECTURN = 1, + MIDNIGHTMEADOW = 2, }; }; diff --git a/game/main.lua b/game/main.lua index fbfd4e5..2b37071 100644 --- a/game/main.lua +++ b/game/main.lua @@ -1,291 +1,265 @@ --- local ffi = require 'ffi' --- local joysticks +local ffi = require 'ffi' +local joysticks --- function init() --- joysticks = love.joystick.getJoysticks() --- for i, joystick in ipairs(joysticks) do --- print(i, joystick:getName()) --- end +function init() + joysticks = love.joystick.getJoysticks() + for i, joystick in ipairs(joysticks) do + print(i, joystick:getName()) + end --- ffi.cdef[[ --- void load(const char * source_path); --- void update_window(int width, int height); --- void draw(); --- void update_keyboard(int up, int down, int left, int right, --- int w, int s, int a, int d, --- int t, int g, int f, int h, --- int i, int k, int j, int l); --- void update_mouse(int x, int y); --- void update_joystick(int joystick_index, --- float lx, float ly, float rx, float ry, float tl, float tr, --- int up, int down, int left, int right, --- int a, int b, int x, int y, --- int leftshoulder, int rightshoulder, --- int start); --- void update(float time); + ffi.cdef[[ +void load(const char * source_path); +void update_window(int width, int height); +void draw(); +void update_keyboard(int up, int down, int left, int right, + int w, int s, int a, int d, + int t, int g, int f, int h, + int i, int k, int j, int l); +void update_mouse(int x, int y); +void update_joystick(int joystick_index, + float lx, float ly, float rx, float ry, float tl, float tr, + int up, int down, int left, int right, + int a, int b, int x, int y, + int leftshoulder, int rightshoulder, + int start); +void update(float time); --- int draw_font_start(); --- int draw_font(int font_ix, char const * text, int x, int y); + int draw_font_start(); + int draw_font(int font_ix, char const * text, int x, int y); --- void draw_line_quad_start(); --- void draw_line(int x1, int y1, int x2, int y2); --- void draw_set_color(float r, float g, float b); --- void draw_quad(int x1, int y1, int x2, int y2, --- int x3, int y3, int x4, int y4); --- ]] --- local source_path = love.filesystem.getSource() --- test = ffi.load(source_path .. "/test.so") --- test.load(source_path) + void draw_line_quad_start(); + void draw_line(int x1, int y1, int x2, int y2); + void draw_set_color(float r, float g, float b); + void draw_quad(int x1, int y1, int x2, int y2, + int x3, int y3, int x4, int y4); +]] + local source_path = love.filesystem.getSource() + test = ffi.load(source_path .. "/test.so") + test.load(source_path) +end + +local update = function(time) + for joystick_index, joystick in ipairs(joysticks) do + if joystick_index > 8 then + break + end + local lx = joystick:getGamepadAxis("leftx") + local ly = joystick:getGamepadAxis("lefty") + local rx = joystick:getGamepadAxis("rightx") + local ry = joystick:getGamepadAxis("righty") + local tl = joystick:getGamepadAxis("triggerleft") + local tr = joystick:getGamepadAxis("triggerright") + local up = joystick:isGamepadDown("dpup") + local down = joystick:isGamepadDown("dpdown") + local left = joystick:isGamepadDown("dpleft") + local right = joystick:isGamepadDown("dpright") + local a = joystick:isGamepadDown("a") + local b = joystick:isGamepadDown("b") + local x = joystick:isGamepadDown("x") + local y = joystick:isGamepadDown("y") + local leftshoulder = joystick:isGamepadDown("leftshoulder") + local rightshoulder = joystick:isGamepadDown("rightshoulder") + local start = joystick:isGamepadDown("start") + --print("start", i, start) + test.update_joystick(joystick_index - 1, + lx, ly, rx, ry, tl, tr, + up, down, left, right, + a, b, x, y, + leftshoulder, rightshoulder, + start) + end + + local up = love.keyboard.isDown("up") + local down = love.keyboard.isDown("down") + local left = love.keyboard.isDown("left") + local right = love.keyboard.isDown("right") + local w = love.keyboard.isDown("w") + local s = love.keyboard.isDown("s") + local a = love.keyboard.isDown("a") + local d = love.keyboard.isDown("d") + local t = love.keyboard.isDown("t") + local g = love.keyboard.isDown("g") + local f = love.keyboard.isDown("f") + local h = love.keyboard.isDown("h") + local i = love.keyboard.isDown("i") + local k = love.keyboard.isDown("k") + local j = love.keyboard.isDown("j") + local l = love.keyboard.isDown("l") + test.update_keyboard(up, down, left, right, + w, s, a, d, + t, g, f, h, + i, k, j, l); + + test.update(time) +end + +local draw = function() + test.draw() +end + +local nico_draw = function() + ---------------------------------------------------------------------- + -- font drawing + ---------------------------------------------------------------------- + + -- call "draw_font_start()" prior each "group" of "draw_font()" calls + -- + -- a "group" of draw_font() calls are back-to-back/consecutive, + -- with no non-font drawing between them. + -- + -- For example: + + local font_ix = test.draw_font_start() + local x = 512 + local y = 50 + y = y + test.draw_font(font_ix, "lua test", x, y) + y = y + test.draw_font(font_ix, "cool", x, y) + + -- note that "font_ix" is the current "best font" as calculated + -- from the current window size, and might change next frame if the + -- window is resized. + -- + -- Any of this of course could be changed to match your precise + -- requirements. + + ---------------------------------------------------------------------- + -- line drawing + ---------------------------------------------------------------------- + + -- call "draw_line_quad_start()" prior to each "group" of + -- "draw_line()" or "draw_quad()" calls + -- + -- a "group" of draw_line()/draw_quad() calls are + -- back-to-back/consecutive, with no non-line/quad drawing between + -- them. + -- + -- For example: + + test.draw_line_quad_start() + test.draw_set_color(1.0, 0.0, 0.0) -- r, g, b (0.0 to 1.0) + test.draw_line(0, 0, 1024, 1024) -- x1, y1, x2, y2 + test.draw_line(700, 300, 400, 500) + test.draw_set_color(0.0, 1.0, 0.0) + test.draw_line(700, 300, 400, 700) + + -- x1, y1, x2, y2, + -- x3, y3, x4, y4, + -- + -- vertices must be specified In "counter clockwise" order, as in: + -- + -- 2──1 + -- │ │ valid (counter clockwise) + -- 3──4 + -- + -- these can also be rotated, as in: + -- + -- 3 + -- ╱ ╲ + -- 4 2 valid (counter clockwise) + -- ╲ ╱ + -- 1 + -- + -- however "mirroring" is not valid, as in: + -- + -- 1──2 + -- │ │ not valid (clockwise) + -- 4──3 + -- + test.draw_set_color(0.0, 0.0, 1.0) + test.draw_quad( + 600, 600, -- top right + 500, 600, -- top left + 500, 700, -- bottom left + 600, 700 -- bottom right + ) + test.draw_set_color(0.0, 0.5, 1.0) + test.draw_quad( + 900, 900, -- bottom + 950, 850, -- right + 900, 800, -- top + 850, 850 -- left + ) + + -- If you want to draw a large number of lines or quads in bulk + -- (e.g: 10,000+ lines/quads per frame), this interface might not be good + -- enough, and we should discuss this in more detail. +end + +function love.run() + init() + + return function() + love.event.pump() + for name, a,b,c,d,e,f,g,h in love.event.poll() do + if name == "quit" then + if c or not love.quit or not love.quit() then + return a or 0, b + end + end + end + + local width + local height + local flags + width, height, flags = love.window.getMode() + test.update_window(width, height) + + local time = love.timer.getTime() + update(time) + + draw() + + local mouse_down = love.mouse.isDown(1) + if mouse_down then + local x, y = love.mouse.getPosition() + test.update_mouse(x, y) + end + + --nico_draw() + + love.graphics.present() + love.timer.sleep(0.001) + end +end + +-- local wm = require("world_map") + +-- world = { +-- ["top_down_race"] = require("love_src.src.world.top_down_race")(), +-- -- ["main_menu"] = require("love_src.src.world.main_menu")(), +-- -- ["1_intro"] = require("love_src.src.world.1_intro")(), +-- -- ["2_town_square"] = require("love_src.src.world.2_town_square")(), +-- -- ["race"] = require("love_src.src.world.race")(), +-- -- ["train"] = require("love_src.src.world.train")(), +-- }; + +-- current = wm["top_down_race"] + +-- function load_world(world_to_load) +-- current = world_to_load +-- world[current]:reload() -- end --- local update = function(time) --- for joystick_index, joystick in ipairs(joysticks) do --- if joystick_index > 8 then --- break --- end --- local lx = joystick:getGamepadAxis("leftx") --- local ly = joystick:getGamepadAxis("lefty") --- local rx = joystick:getGamepadAxis("rightx") --- local ry = joystick:getGamepadAxis("righty") --- local tl = joystick:getGamepadAxis("triggerleft") --- local tr = joystick:getGamepadAxis("triggerright") --- local up = joystick:isGamepadDown("dpup") --- local down = joystick:isGamepadDown("dpdown") --- local left = joystick:isGamepadDown("dpleft") --- local right = joystick:isGamepadDown("dpright") --- local a = joystick:isGamepadDown("a") --- local b = joystick:isGamepadDown("b") --- local x = joystick:isGamepadDown("x") --- local y = joystick:isGamepadDown("y") --- local leftshoulder = joystick:isGamepadDown("leftshoulder") --- local rightshoulder = joystick:isGamepadDown("rightshoulder") --- local start = joystick:isGamepadDown("start") --- --print("start", i, start) --- test.update_joystick(joystick_index - 1, --- lx, ly, rx, ry, tl, tr, --- up, down, left, right, --- a, b, x, y, --- leftshoulder, rightshoulder, --- start) --- end - --- local up = love.keyboard.isDown("up") --- local down = love.keyboard.isDown("down") --- local left = love.keyboard.isDown("left") --- local right = love.keyboard.isDown("right") --- local w = love.keyboard.isDown("w") --- local s = love.keyboard.isDown("s") --- local a = love.keyboard.isDown("a") --- local d = love.keyboard.isDown("d") --- local t = love.keyboard.isDown("t") --- local g = love.keyboard.isDown("g") --- local f = love.keyboard.isDown("f") --- local h = love.keyboard.isDown("h") --- local i = love.keyboard.isDown("i") --- local k = love.keyboard.isDown("k") --- local j = love.keyboard.isDown("j") --- local l = love.keyboard.isDown("l") --- test.update_keyboard(up, down, left, right, --- w, s, a, d, --- t, g, f, h, --- i, k, j, l); - --- test.update(time) +-- function love.load() +-- world[current]:load() -- end --- local draw = function() --- test.draw() --- end - --- local nico_draw = function() --- ---------------------------------------------------------------------- --- -- font drawing --- ---------------------------------------------------------------------- - --- -- call "draw_font_start()" prior each "group" of "draw_font()" calls --- -- --- -- a "group" of draw_font() calls are back-to-back/consecutive, --- -- with no non-font drawing between them. --- -- --- -- For example: - --- local font_ix = test.draw_font_start() --- local x = 512 --- local y = 50 --- y = y + test.draw_font(font_ix, "lua test", x, y) --- y = y + test.draw_font(font_ix, "cool", x, y) - --- -- note that "font_ix" is the current "best font" as calculated --- -- from the current window size, and might change next frame if the --- -- window is resized. --- -- --- -- Any of this of course could be changed to match your precise --- -- requirements. - --- ---------------------------------------------------------------------- --- -- line drawing --- ---------------------------------------------------------------------- - --- -- call "draw_line_quad_start()" prior to each "group" of --- -- "draw_line()" or "draw_quad()" calls --- -- --- -- a "group" of draw_line()/draw_quad() calls are --- -- back-to-back/consecutive, with no non-line/quad drawing between --- -- them. --- -- --- -- For example: - --- test.draw_line_quad_start() --- test.draw_set_color(1.0, 0.0, 0.0) -- r, g, b (0.0 to 1.0) --- test.draw_line(0, 0, 1024, 1024) -- x1, y1, x2, y2 --- test.draw_line(700, 300, 400, 500) --- test.draw_set_color(0.0, 1.0, 0.0) --- test.draw_line(700, 300, 400, 700) - --- -- x1, y1, x2, y2, --- -- x3, y3, x4, y4, --- -- --- -- vertices must be specified In "counter clockwise" order, as in: --- -- --- -- 2──1 --- -- │ │ valid (counter clockwise) --- -- 3──4 --- -- --- -- these can also be rotated, as in: --- -- --- -- 3 --- -- ╱ ╲ --- -- 4 2 valid (counter clockwise) --- -- ╲ ╱ --- -- 1 --- -- --- -- however "mirroring" is not valid, as in: --- -- --- -- 1──2 --- -- │ │ not valid (clockwise) --- -- 4──3 --- -- --- test.draw_set_color(0.0, 0.0, 1.0) --- test.draw_quad( --- 600, 600, -- top right --- 500, 600, -- top left --- 500, 700, -- bottom left --- 600, 700 -- bottom right --- ) --- test.draw_set_color(0.0, 0.5, 1.0) --- test.draw_quad( --- 900, 900, -- bottom --- 950, 850, -- right --- 900, 800, -- top --- 850, 850 -- left --- ) - --- -- If you want to draw a large number of lines or quads in bulk --- -- (e.g: 10,000+ lines/quads per frame), this interface might not be good --- -- enough, and we should discuss this in more detail. --- end - --- function love.run() --- init() - --- return function() --- love.event.pump() --- for name, a,b,c,d,e,f,g,h in love.event.poll() do --- if name == "quit" then --- if c or not love.quit or not love.quit() then --- return a or 0, b --- end --- end --- end - --- local width --- local height --- local flags --- width, height, flags = love.window.getMode() --- test.update_window(width, height) - --- local time = love.timer.getTime() --- update(time) - --- draw() - --- local mouse_down = love.mouse.isDown(1) --- if mouse_down then --- local x, y = love.mouse.getPosition() --- test.update_mouse(x, y) --- end - --- -- nico_draw() - --- love.graphics.present() --- love.timer.sleep(0.001) --- end --- end - --- function love.load(args) --- init() --- local width, height, flags = love.window.getMode() --- test.update_window(width, height) --- end - --- function love.update(time) --- update(time) - --- if (love.mouse.isDown(1)) then --- local x, y = love.mouse.getPosition() --- test.update_mouse(x, y) --- end +-- function love.update(dt) +-- world[current]:update(dt) -- end -- function love.draw() --- draw() --- love.graphics.push() - --- love.graphics.setCanvas() --- love.graphics.setShader() --- love.graphics.line(0, 0, love.graphics.getDimensions()) --- love.graphics.pop() - +-- world[current]:draw() -- end -local wm = require("world_map") +-- function love.keyreleased(key, scancode) +-- world[current]:keyreleased(key, scancode) +-- end -world = { - ["top_down_race"] = require("love_src.src.world.top_down_race")(), - -- ["main_menu"] = require("love_src.src.world.main_menu")(), - -- ["1_intro"] = require("love_src.src.world.1_intro")(), - -- ["2_town_square"] = require("love_src.src.world.2_town_square")(), - -- ["race"] = require("love_src.src.world.race")(), - -- ["train"] = require("love_src.src.world.train")(), -}; +-- function love.keypressed(key, scancode, isrepeat) +-- world[current]:keypressed(key, scancode, isrepeat) +-- end -current = wm["top_down_race"] - -function load_world(world_to_load) - current = world_to_load - world[current]:reload() -end - -function love.load() - world[current]:load() -end - -function love.update(dt) - world[current]:update(dt) -end - -function love.draw() - world[current]:draw() -end - -function love.keyreleased(key, scancode) - world[current]:keyreleased(key, scancode) -end - -function love.keypressed(key, scancode, isrepeat) - world[current]:keypressed(key, scancode, isrepeat) -end - -function love.mousereleased(x, y, button, istouch, presses) - world[current]:mousereleased(x, y, button, istouch, presses) -end +-- function love.mousereleased(x, y, button, istouch, presses) +-- world[current]:mousereleased(x, y, button, istouch, presses) +-- end diff --git a/game/minecraft/flame.data b/game/minecraft/flame.data new file mode 100644 index 0000000000000000000000000000000000000000..11beae73e1bade35cddb780f7165a7e6a66dadb0 GIT binary patch literal 5120 zcmeHKzb^zq6yE=V;y9Pfp>g~N3eD+IXhfqxgkBUntw!_|Iy$XHBB3EVR3r)&5}j5) z?|ZxNtj*lr>}(>rxJxE8^X7f;*Y14xHj4ho@4gtwSpJ2yOtyVB7 zd)n>&{;mQ=cnOYjs9^kvQ}o%3U`5d2K0Pc!>3&4f27n4Pq28 zTwwl#@Z#U_KECOL&%Vi@f+x;$Fk7yfdaQX9PaY%>%m0|lgj-#>v`n8lxl=I8{|TOU zyyE}704^KxF#h8{^&HdwTlKdt%M^?|Z$4-RX z{-pkCyvSYpS()-4`Hw^DN8Zv|cr~l*+N&mfb)PkGzEfBEg3`F`fP`DrzG3;%rsAYGB# literal 0 HcmV?d00001 diff --git a/game/minecraft/gen/mc.py b/game/minecraft/gen/mc.py index b4bf43e..f22459c 100644 --- a/game/minecraft/gen/mc.py +++ b/game/minecraft/gen/mc.py @@ -113,8 +113,8 @@ def pack_instance_data(position, block_id, block_data, texture_id): block_id, block_data, texture_id, special) return packed -def pack_light_data(position, block_id): - packed = struct.pack(" $ALL_REGIONS +$HOME/MidnightMeadow/region/r.0.0.mcr +$HOME/MidnightMeadow/region/r.-1.-1.mcr +$HOME/MidnightMeadow/region/r.0.-1.mcr +$HOME/MidnightMeadow/region/r.-1.0.mcr +EOF +$PYTHON mc.py $HOME/MidnightMeadow/region/r.0.0.mcr ../midnightmeadow/region.0.0 $ALL_REGIONS $CROP & +$PYTHON mc.py $HOME/MidnightMeadow/region/r.-1.-1.mcr ../midnightmeadow/region.-1.-1 $ALL_REGIONS $CROP & +$PYTHON mc.py $HOME/MidnightMeadow/region/r.0.-1.mcr ../midnightmeadow/region.0.-1 $ALL_REGIONS $CROP & +$PYTHON mc.py $HOME/MidnightMeadow/region/r.-1.0.mcr ../midnightmeadow/region.-1.0 $ALL_REGIONS $CROP & + +wait + +cat ../midnightmeadow/region*.lights.vtx > ../midnightmeadow/global.lights.vtx + +cat ../midnightmeadow/region*.dump > ../midnightmeadow/global.dump +$PYTHON intkeys.py ../midnightmeadow/global.dump | $HOME/nbperf/nbperf -n midnightmeadow_hash -I -a bpz -c 1.24 -m ../love2dworld/map.txt > ../midnightmeadow/inthash.c diff --git a/game/minecraft/grandlecturn/global.lights.vtx b/game/minecraft/grandlecturn/global.lights.vtx index 90abb9a2d3c1f76e2a6631660bb42d27ee5a5310..d05f7d657079a7c5eea6c1128775ea93f712a687 100644 GIT binary patch literal 2080 zcmZ9Mp>7*N6h)tk^BMgBe}JW|(;qMhG{^@S7#0Lr0g*veYy~YU3W$P&l9m=NvI