This commit is contained in:
2025-07-24 07:49:24 +02:00
parent a50c101742
commit 99e5fcec80
17 changed files with 431 additions and 127 deletions
+146 -1
View File
@@ -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.
+21 -9
View File
@@ -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
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

+210
View File
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 1.6 MiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 510 KiB

+2 -4
View File
@@ -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
+3 -3
View File
@@ -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);
+3 -2
View File
@@ -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);
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 306 KiB

-21
View File
@@ -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)
-67
View File
@@ -1,67 +0,0 @@
#define SDL_MAIN_USE_CALLBACKS 1
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include <stdio.h>
#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);
}
-13
View File
@@ -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
];
}
-7
View File
@@ -1,7 +0,0 @@
#include <stdio.h>
int
main ()
{
return 0;
}