diff --git a/GDD.org b/GDD.org index a4699c8..dda786a 100644 --- a/GDD.org +++ b/GDD.org @@ -4,4 +4,149 @@ ** Historia i czas Wschód. Od początku 2027 do sierpnia. Lubelską jeżdżą namiętnie pojazdy wojskowe transportujące czołgi, haubice, i gigantyczne -anteny. +anteny. Na deptaku w Chełmie chodzą amerykańscy żołnierze w +kamuflażu. Polaka rzadko idzie spotkać; powiat chełmski w dużej mierze +wysiedlony, ludzie uciekli od wojny. Huk dział i murmur samolotów i +bezzałogowych dronów autonomicznych słychać w zabitych dechami +wiochach pow. chełmskiego. + +Amerykańcy bardzo cenią sobie lokalną twórczość bimbrowników i +kłusowników. Nielegalne wymiany broni i zasobów za magiczne wywary 96 +volt. Szpital w Chełmie przerobiony na szpital wojskowy; oddział +psychiatryczny spowrotem na koszary. Ci, co zostali, albo są polskimi +wojskowymi, albo pomagają w trudach wojennych pracując w szpitalach, +magazynach, nowo powstałych fabrykach wojennych. Telefony mają teraz +taki pipsztyk, że można do nich powiedzieć "Powiedz mi żart", i +telefon opowiada żart. + +Powiat rządzi się innymi zasadami. Policja prawie że nie istnieje, +ledwo co utrzymuje prawo, ale ludzie wcale go nie łamią. Pomoc +wzajemna powszednieje. Podziemie nielegalnego handlu rozwija +się. Spustoszałe domy nowobogackich rezydentów stoją z gnijącymi +fundamentami. Leśnictwo i nadleśnictwo przestało efektywnie +funkcjonować; wojsko poniekąd pomaga, ale dzikość wraca do powiatu. + +Buch. Epicentrum: amerykańskie koszary wojskowe w Chełmie. Rosyjskie +MPB zrzuciły kilka głowic i kilkanaście dipoli; tarcze antyrakietowe +nie pomogły. MAD na skalę światową. + +W Siedliszczu, patrząc na wschód, widać obrzydliwie duży i jasny grzyb +termojądrowy. Stary statystyk podaje, że 15 % ludności gminy, +zwłaszcza w starszych przedziałach wiekowych, jest ślepe. Poparzenia +drugiego i trzeciego stopnia na starych chłopach co akurat jechali +trzydziestką po polu. + +Drony --- skonfundowane, bez siatki komunikacyjnej i centrali --- lecą +w stronę gminy, kręcą się trochę nad polami, i spadają na +pola. Napromieniowani rolnicy zbierają je, podczepiając ich baterie do +sprzętów RTV i AGD. + +Stary statystyk szacuje, że w gminie przeżyło jedynie sto czy dwieście +mieszkańców. + +Nowa moda: tryb łowiecko-zbieracki. Kłusownictwo, zbieranie grzybów, +próby polowań. Dzika natura wraca do gminy, ilość dziczyzny na +poziomie Paleolitycznym. + +Zbiornik im. Edwarda Wojtasa centrum nowej społeczności +gminnej. Rybołówstwo, próby agrokultury. Slumsy majdańskie, +skonstruowane ze starych PGR-owskich plandek i leszczyny, wyglądają +naprawdę imponująco. + +Samo Siedliszcze jest puste jak zawsze. W centrum została jedynie +stara babka, znająca się na układzie kostnym człowieka, ziołach, i +ogólnym znachorstwie. Jest w tajemniczym kontakcie z bandami leśnymi +operującymi w lasach obok Bezku i na Janowicy. Szałasy z gałęzi +świerkowych i niebieskich plandek, łachmany, oraz niezmierna wiedza o +lokalnej florze i faunie charakteryzuje leitmotif bandy. + +** Mechanika gry +*** Ekonomia pogłoski +Rozmowy i handle z postaciami uzależnione są od tego, jaką famę ma +gracz, z kim się zna, komu podpadł, a komu się przylizał. Różne grupy +i postacie mają różne sposoby rozumienia tego, i sieć jest bardzo +skomplikowana, więc gracz musi uważać, czy jak pomoże temu, to nie +podpadnie tamtemu; jak nie zrobi tego, to podpanie temu, a pomoże +tamtemu, itp. +*** Rozmowy z NPC +Każdy NPC ma swój sposób rozumienia świata, analizowania sytuacji, +itp. Tym samym gracz musi być bardzo uważny i naprawdę zrzozumieć +przekonania jakiejś postaci, jeśli chce jej pomóc --- lub się jej +sprzeciwić. Np., stary statystyk jest stricte empriyczny, rozumie +świat jako liczby i relacje między liczbami. Stara babka jest +enigmatycznym bytem, który rozumie świat jako mieszankę ludowej +wiedzy, anarchoprymitywistycznej ideologii, itp. +*** Ciało, obrażenia, stany +Nie istnieje HP; zamiast tego, stan ciała jest opisywany +symptomatycznie: "brzydko wyglądające rany otwarte", "mdłości (3 +dni)", "słuch utracony po wybuchu". + +Stany ciała i symptomy zazwyczaj wpływają na wewnętrzny licznik +szczęścia. Jak jesteśmy głusi i mamy mdłości, jesteśmy nieszczęśliwi; +a więc, nie możemy robić różnych rzeczy bo nie mamy ochoty. + +Kontrą do tego jest statystyka woli mocy, którą zdobywamy poprzez +interakcje z NPC i decyzjami które promują samostanowienie. Taka +determinacja pozwala na działanie /mimo/ tego, że jesteśmy +nieszczęśliwi, mamy połamaną nogę, +*** Cechy i "statystki" postaci +Gracz kilka "zacznij grę", i nie może nic ze swoją postacią +zrobić. Nie ma ona płci, głosu, niczego. Jedynie losową garstkę cech +(niekoniecznie podzielonych na pozytywne i negatywne, ale mających i +pozytywy, i negatywy). + +| Cecha | Pozytywy | Negatywy | +|--------------------------+--------------------------------------+-------------------------------| +| technik informatyk | zna się na komputerach i telefonach | ludzie uważają go za dziwnego | +|--------------------------+--------------------------------------+-------------------------------| +| intuicja botaniczna | może mniej więcej stwierdzić | nie wiem | +| | czy coś jest jadalne, czy nie | | +|--------------------------+--------------------------------------+-------------------------------| +| złota rączka | potrafi dobrze naprawiać różnorakie | nieufność otoczenia | +| | przedmioty | | +|--------------------------+--------------------------------------+-------------------------------| +| nawyk palacza | dużo NPC go lubi, "swój chłop", | częściej ma zadyszkę | +| | czuje mniej lęku | | +|--------------------------+--------------------------------------+-------------------------------| +| przeszywające spojrzenie | jest bardziej spotrzegawczy | ludzie się go boją | +| | w rozmowach i stanach afektywnych | | +| | innych postaci | | +|--------------------------+--------------------------------------+-------------------------------| +| głos, co łamie ciszę | pogłoski szybciej się roznoszą | nieśmiali NPC się go boją | +|--------------------------+--------------------------------------+-------------------------------| +| pijany chirurg | niezwykle zwinne palce i precyzja | jak nie jest, to traci dużo | +| | ale tylko jak jest najebany | swojej zwinności | +|--------------------------+--------------------------------------+-------------------------------| +| schizoduch PGR-u | czasami graczowi objawia się | inni myślą, że jest obłąkany | +| | duch PGR-u, podpowiadający o różnych | | +| | rzeczach związanych z osiągnięciem | | +| | większego szczęścia | | +|--------------------------+--------------------------------------+-------------------------------| +| schizocień za plecami | czasami graczowi objawia się cień, | inni myślą, że jest obłąkany | +| | który podpowiada o różnych rzeczach | | +| | związanych z osiągnięciem większej | | +| | woli | | +|--------------------------+--------------------------------------+-------------------------------| +| oczy prababki | świetna widoczność w nocy | słabsza widoczność w dzień | +|--------------------------+--------------------------------------+-------------------------------| +| | | | + +*** Czas w grze +Nie ma godzin, minut, ani sekund. Takie dane nie są udostępniane +graczowi. Wszystko zależy od tego, co widzi i słyszy. Gra kusi gracza +zegarkami porozrzucanymi w niektórych miejscach, ale każdy z nich jest +popsuty. +*** Fizyczny świat +Nie ma żadnej mapy w grze. Gracz musi poradzić sobie znakami +drogowymi, specyficznymi drzewami, domami, wieżami, itp. W orientacji +pomaga zoptymalizowany silnik, więc dystans renderowania jest wielki. +*** Mapa afektywna +Żeby gracz nie pogubił się we wszystkich relacjach w grze, relacje +między postaciami są pokazywane na "mapie afektywnej" jako pewna sieć +z postaciami i ich połączeniami. +*** Przedmioty +**** Flora +Żadna roślina, jarzyna, warzywo, czy jagoda nie ma żadnej przypisanej +nazwy. Są tylko domyślne nazwy typu "nieznane warzywo". Gracz może +zmieniać nazwy przedmiotów na podstawie tego, jakie mają na niego +efekty, czy na podstawie tego, co dowie się od innych osób. diff --git a/TODO.org b/TODO.org index d922514..2f4be9b 100644 --- a/TODO.org +++ b/TODO.org @@ -1,11 +1,19 @@ -#+TITLE: Wschód TODO +hhhh#+TITLE: Wschód TODO * UI system +** DONE Switch from floats to ints in all UI stuff, from vec2's to ivec2's +** TODO Centering widget in parent +** TODO Inheriting width/height from parent ** TODO Flowbox proper weighing +** TODO UI system major refactoring and redesign +** TODO Context menus +** TODO Z-sorting UI children (or windows) +** DONE Loading UI from a file or script +** TODO Better GL scissoring, calculating the summed AABB crop box from ALL parents +** DONE Move layout_width and layout_spacing into the widget out of the style ** DONE Entry cursor ** DONE Reset UI state (hovered, clicked, focused) on lose UI focus ** DONE Entry UTF-8 support -** TODO UI system major refactoring and redesign ** DONE Think about the UI on_xxx_down/up handling (solved) ** DONE Revamp UI event system ** DONE Implement vtables (something else was done) @@ -15,7 +23,7 @@ ** DONE Scissoring of out-of-bounds UI elements ** DONE On mouse enter, on mouse leave, and on mouse move callbacks ** DONE Button widget -** TODO Tooltip rendering +** DONE Tooltip rendering ** DONE Borders ** DONE Padding/margin ** DONE Aspect ratios @@ -28,22 +36,26 @@ ** DONE FlowLayout widget ** DONE Multiline text widget ** DONE Text entry widget -** TODO Movable and resizable windows -** TODO Loading UI from a file or script +** DONE Movable windows +** DONE Resizable windows +** DONE Move uicursor to uidummy ** DONE Fix scrollable scrolling being a bit weird * Entity system ** TODO Entity hit testing -** TODO Entity on hover UI label, outline -** TODO Meshing together N entities for less drawcalls ** TODO Sky/sun/clouds drawing seperate from other entities +** TODO Entity on hover UI label, outline ** TODO Optimize entity rendering and ticking; it's a huge bottleneck ** TODO Ticking system revamp; ticking calculation when out of tick radius and coming back +** TODO Meshing together N entities for less drawcalls * Chunk system ** TODO Chunk queue/heap sorted by distance to player * Misc. +** TODO Move cursor changing to graphics.c ** TODO Better sky/cloud system, perhaps a hemisphere ** TODO Sun system * Overall game structure -** TODO Resource packs with shaders, textures, entity templates +** DONE Resource packs with shaders, textures, entity templates ** TODO Map pack with heightmap data, materialmap data, entities and their placements -** TODO Guile/Lua integration +** DONE Guile/Lua integration +** TODO Proper memory freeing: UI Widgets, pakman, UIContext, stateman + diff --git a/assets/1061277314.tif b/assets/1061277314.tif new file mode 100644 index 0000000..277a834 Binary files /dev/null and b/assets/1061277314.tif differ diff --git a/assets/1992230419.tif b/assets/1992230419.tif new file mode 100644 index 0000000..e7a9e14 Binary files /dev/null and b/assets/1992230419.tif differ diff --git a/assets/448758643.tif b/assets/448758643.tif new file mode 100644 index 0000000..95ee6d5 Binary files /dev/null and b/assets/448758643.tif differ diff --git a/assets/482517433.tif b/assets/482517433.tif new file mode 100644 index 0000000..b88c3a2 Binary files /dev/null and b/assets/482517433.tif differ diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000..9d07bea Binary files /dev/null and b/assets/logo.png differ diff --git a/assets/logo.svg b/assets/logo.svg new file mode 100644 index 0000000..3d059cb --- /dev/null +++ b/assets/logo.svg @@ -0,0 +1,210 @@ + + + + + + diff --git a/assets/mapa_wys.svg b/assets/mapa_wys.svg new file mode 100644 index 0000000..bc73d8b --- /dev/null +++ b/assets/mapa_wys.svg @@ -0,0 +1,46 @@ + + + + diff --git a/game/src/entity/entity.c b/game/src/entity/entity.c index 508e9a1..4d80e03 100644 --- a/game/src/entity/entity.c +++ b/game/src/entity/entity.c @@ -13,15 +13,13 @@ Entity_new () } gboolean -Entity_render (Entity *entity, vec3 camera_position, mat4 view, vec4 frustum_planes[6]) +Entity_render (Entity *entity, vec3 camera_position, mat4 view, vec4 frustum_planes[6], + int render_distance, gboolean wireframe_enabled) { if (!entity->visible) { return FALSE; } - - int render_distance = gvar_get ("render_distance"); - gboolean wireframe_enabled = gvar_get ("wireframe_enabled"); /* Why an int, why int division? It's simply much faster than floating point operations. No need to have super accurate cull diff --git a/game/src/entity/entity.h b/game/src/entity/entity.h index 5be36be..835a5de 100644 --- a/game/src/entity/entity.h +++ b/game/src/entity/entity.h @@ -29,9 +29,8 @@ typedef struct Entity vec3 position; vec3 rotation; vec3 scale; - /* Use RESPRG to get the int. */ + unsigned int program; - /* Use RESTEX to get the int. */ unsigned int texture; } Entity; @@ -60,4 +59,5 @@ entity_compute_aabb (Entity *e, vec3 out_min, vec3 out_max) } Entity *Entity_new (); -gboolean Entity_render (Entity *entity, vec3 camera_position, mat4 view, vec4 frustum_planes[6]); +gboolean Entity_render (Entity *entity, vec3 camera_position, mat4 view, vec4 frustum_planes[6], + int render_distance, gboolean wireframe_enabled); diff --git a/game/src/world.c b/game/src/world.c index 7690916..8b24615 100644 --- a/game/src/world.c +++ b/game/src/world.c @@ -100,6 +100,7 @@ World_render (World *w, vec3 position, mat4 view, vec4 planes[6]) texture_use (PMTEX ("terrain4"), 4); int render_distance = gvar_get ("render_distance"); + gboolean wireframe_enabled = gvar_get ("wireframe_enabled"); int frame_chunks = 0, frame_entities = 0; for (int z = cz - render_distance; z <= cz + render_distance; ++z) @@ -127,7 +128,7 @@ World_render (World *w, vec3 position, mat4 view, vec4 planes[6]) ChunkMesh_bind (mesh); program_set_vec3_ind (PMPRG ("chunk"), "chunk_position", x * CHUNK_DIM, 0.0, z * CHUNK_DIM); - ChunkMesh_render (mesh, FLAG_GET ("wireframe_enabled")); + ChunkMesh_render (mesh, wireframe_enabled); frame_chunks++; } } @@ -136,7 +137,7 @@ World_render (World *w, vec3 position, mat4 view, vec4 planes[6]) for (guint i = 0; i < w->entities->len; ++i) { Entity *ent = g_array_index (w->entities, Entity*, i); - frame_entities += Entity_render (ent, position, view, planes) ? 1 : 0; + frame_entities += Entity_render (ent, position, view, planes, render_distance, wireframe_enabled) ? 1 : 0; } gvar_set ("frame_chunks", frame_chunks); diff --git a/game_map.png b/game_map.png deleted file mode 100644 index 2e343d2..0000000 Binary files a/game_map.png and /dev/null differ diff --git a/mapedit/Makefile b/mapedit/Makefile deleted file mode 100644 index f87635e..0000000 --- a/mapedit/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -SRC=src/mapedit.c - -OBJ=$(SRC:.c=.o) -CFLAGS=-g -Werror -Wextra -Wall `pkg-config --cflags gtk4` -LDFLAGS=`pkg-config --libs gtk4` -TARGET=mapedit -CC=gcc -LD=gcc - -.PHONY: clean - -all: $(TARGET) - -$(TARGET): $(OBJ) - $(LD) $^ -o $@ $(LDFLAGS) - -.c.o: - $(CC) -c $^ -o $@ $(CFLAGS) - -clean: - $(RM) $(TARGET) $(OBJ) diff --git a/mapedit/game.c b/mapedit/game.c deleted file mode 100644 index 9498866..0000000 --- a/mapedit/game.c +++ /dev/null @@ -1,67 +0,0 @@ -#define SDL_MAIN_USE_CALLBACKS 1 -#include -#include - -#include - -#include "shader.h" - -static SDL_Window *window = NULL; -static SDL_GLContext context = NULL; - -SDL_AppResult -SDL_AppInit (void **appstate, int argc, char **argv) -{ - (void) appstate; (void) argc; (void) argv; - - INFO ("Running game with debugging facilities."); - SDL_SetAppMetadata ("Wschód", VERSION, "eur.chopininteractive.wschod-game"); - - if (!SDL_Init (SDL_INIT_VIDEO)) { - ERROR ("Couldn't initialize SDL: %s", SDL_GetError()); - return SDL_APP_FAILURE; - } - - window = SDL_CreateWindow ("Wschód", 640, 480, SDL_WINDOW_OPENGL); - - if (!window) { - ERROR ("Couldn't create window: %s", SDL_GetError()); - return SDL_APP_FAILURE; - } - - context = SDL_GL_CreateContext (window); - - return SDL_APP_CONTINUE; -} - -SDL_AppResult -SDL_AppEvent (void *appstate, SDL_Event *event) -{ - (void) appstate; - - if (event->type == SDL_EVENT_QUIT) { - return SDL_APP_SUCCESS; - } - - return SDL_APP_CONTINUE; -} - -SDL_AppResult -SDL_AppIterate (void *appstate) -{ - (void) appstate; - - glClearColor (0, 0, 0, 1); - glClear (GL_COLOR_BUFFER_BIT); - SDL_GL_SwapWindow (window); - - return SDL_APP_CONTINUE; -} - -void -SDL_AppQuit (void *appstate, SDL_AppResult result) -{ - (void) appstate; - (void) result; - SDL_GL_DestroyContext (context); -} diff --git a/mapedit/shell.nix b/mapedit/shell.nix deleted file mode 100644 index 8ed8896..0000000 --- a/mapedit/shell.nix +++ /dev/null @@ -1,13 +0,0 @@ -let - nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-25.05"; - pkgs = import nixpkgs { config = {}; overlays = []; }; -in - - -pkgs.mkShellNoCC { - packages = with pkgs; [ - gcc - pkg-config - gtk4 - ]; -} diff --git a/mapedit/src/mapedit.c b/mapedit/src/mapedit.c deleted file mode 100644 index 7311589..0000000 --- a/mapedit/src/mapedit.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -int -main () -{ - return 0; -}