From 4d87b2a489c0784bbb77c6e7c6849edb859a5a81 Mon Sep 17 00:00:00 2001 From: GeneralGuy4872 Date: Fri, 29 Nov 2019 12:47:16 -0600 Subject: [PATCH] push commit from localhost --- .gitignore | 1 + filestmp | 4 + filestmptmp | 0 src/.iwannaflycurses.messy.swn | Bin 0 -> 110592 bytes src/.iwannaflycurses.messy.swo | Bin 0 -> 40960 bytes src/.macro.h.swo | Bin 0 -> 20480 bytes src/.objects.messy.swm | Bin 0 -> 20480 bytes src/.objects.messy.swn | Bin 0 -> 32768 bytes src/.objects.messy.swo | Bin 0 -> 16384 bytes src/flexlookbehind.pseudo | 7 - src/greedy/follower | 10 + src/iwannaflycurses.messy | 429 +++++++++++-------- src/macro.h | 9 +- src/objects.messy | 231 ++++++---- src/questdialogs/endofthebeginning.asc.rot13 | 20 + src/questdialogs/goaway.asc | 11 + src/roomgen.messy | 65 +-- src/roominit.c | 28 ++ src/squoze.c | 77 ++++ src/structs.messy | 1 + src/structs.messymessy | 1 + 21 files changed, 554 insertions(+), 340 deletions(-) create mode 100644 filestmp create mode 100644 filestmptmp create mode 100644 src/.iwannaflycurses.messy.swn create mode 100644 src/.iwannaflycurses.messy.swo create mode 100644 src/.macro.h.swo create mode 100644 src/.objects.messy.swm create mode 100644 src/.objects.messy.swn create mode 100644 src/.objects.messy.swo delete mode 100644 src/flexlookbehind.pseudo create mode 100644 src/greedy/follower create mode 100644 src/questdialogs/endofthebeginning.asc.rot13 create mode 100644 src/questdialogs/goaway.asc create mode 100644 src/roominit.c create mode 100644 src/squoze.c create mode 100644 src/structs.messy create mode 100644 src/structs.messymessy diff --git a/.gitignore b/.gitignore index 5e9a9d3..0f1a8aa 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ #exclude temporary files **/*.tmp **/*.swp +**/.*.sw* diff --git a/filestmp b/filestmp new file mode 100644 index 0000000..64047af --- /dev/null +++ b/filestmp @@ -0,0 +1,4 @@ +./src/modules/IWannaFly/CommandLine.pseudo +./src/modules/IWannaFly/RoomGen.pseudo +./src/events/lawful_plane_guardian_battle.pseudo +./src/flexlookbehind.pseudo diff --git a/filestmptmp b/filestmptmp new file mode 100644 index 0000000..e69de29 diff --git a/src/.iwannaflycurses.messy.swn b/src/.iwannaflycurses.messy.swn new file mode 100644 index 0000000000000000000000000000000000000000..de9209b4e912231c443a1d1e7bd7f50cd39c8473 GIT binary patch literal 110592 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

?%Xmm%J!3jQVaTU%~^O_oyS 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 bTv9s@5efwkoxt&-Xv^XYhnvx(uw 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 literal 0 HcmV?d00001 diff --git a/src/flexlookbehind.pseudo b/src/flexlookbehind.pseudo deleted file mode 100644 index 55129d8..0000000 --- a/src/flexlookbehind.pseudo +++ /dev/null @@ -1,7 +0,0 @@ -int stringlen(char* buffer) { -int n = 0; -while (buffer[n]) {n++}; -return n; -} - -lookbehind = yytext[stringlen(yytext)] \ No newline at end of file diff --git a/src/greedy/follower b/src/greedy/follower new file mode 100644 index 0000000..6d73d33 --- /dev/null +++ b/src/greedy/follower @@ -0,0 +1,10 @@ +persuer AI: +queue from nearest to furthest +store distance from player when they leave room for each persuer +divide by move distance +give twice that many turns head start +as soon as square that player entered into opens, spawn + +follower AI: +queue from nearest to furthest +as soon as square that player entered into opens, spawn next \ No newline at end of file diff --git a/src/iwannaflycurses.messy b/src/iwannaflycurses.messy index b2d666d..80495cf 100644 --- a/src/iwannaflycurses.messy +++ b/src/iwannaflycurses.messy @@ -6,6 +6,8 @@ * * the bulk of it's contents, however, will be moved. * + * comments may be deleted, may be moved into documentation, or may stay with what they describe + * * workflow: * outline blackboxes top-down (-ish) * outline pseudocode top-down (-ish) @@ -15,6 +17,35 @@ * * optimized for memory footprint. speed is not a concern at the moment. * C++ was considered and partialy implemented, but mangling made it unsuitable + * + * the programming paradigm I am using throughout the project is based on the way my mind works + * rather than a specific programming paradigm; it contains elements from several, including some + * nonstructured paradigmes. + * + * the program also uses various memory management paradigms, + * including linked lists, stacks, queues, and page swapping. + * + * example: loading a room's file is swapping it into memory. + * once it is loaded, the pointer is placed on the top of + * the stack of loaded rooms, and the stack's depth counter + * is increased. when the counter reaches the limit, the + * stalest room is dropped. when warping, the room stack + * is checked before an attempt is made to load another + * room; when a room is recalled, it is moved to the top + * of the stack, therefore less stale rooms are able to be + * fetched faster than more stale rooms. + * + * additional indirection layers are used in an attempt to + * prevent larger data structures from being duplicated + * + * most function calls provide an (obfuscation|abstraction) layer, + * and before attempting to understand a function you should trace + * down all the functions it calls. many functions use dynamic memory + * operations, such as malloc and free; these side effects are what + * causes the program state to change as the game unfolds. The + * datastructures that are being manipulated are the same ones that + * are serialized and saved in the savefiles; listed in the GLOBALS + * section */ /****************************** @@ -44,7 +75,6 @@ * - .hex or .hex## for packed unsigned byte arrays, where ## is a power of 8 * - .bin or .bin## for packed signed byte arrays, where ## is a power of 8 * - .r8 for a room's tilemap - * - .dat for the custom data format * - .json for a JSON file * - .dumper for a Data::Dumper file * - .tsv or .tab for tab seperated values @@ -81,7 +111,7 @@ * - number keys move in xy * - + or - followed by a number move in xyz * - < > strafe - * - backspace retreats + * - backspace retreats (winged creatures also take flight) * - spacebar advances * - ? turns around * - tab lunges @@ -176,8 +206,7 @@ * and free, to facilitate this. A side effect of this memory organization * choice is that YOU MUST COLLECT (most of) YOUR OWN GARBAGE with free(). * in Perl, free may or may not be eventually implemented as a method as - * well as a first-class sub. if C++ is ever involved, this will - * certainly be the case. + * well as a first-class sub. * * a nonstructured language will be provided for defining midi streams * in a human readable format. @@ -187,6 +216,8 @@ * the X Toolkit, XPixMap, and the Athena Widgets, while retaining the * mostly the same API. * + * A version targeting the upcoming Atari VCS may be contemplated + * * GPLv2 or later unless noted. * Perl code dual-liscensed with the Artistic Liscense unless noted. */ @@ -448,30 +479,38 @@ return lines; * swapping places with the other option. otherwise, the quit-abort-option3 order will be kept. */ -union unitype { -void* pointer; -const char* string; -intptr_t value; -} - -/**GLOBALS**/ +struct blitimgcolor { + int attr[6]; + char ** img[16]; + } + /* | 0 [0] [1] [2] attr + * 0 [0] [1] [2] [3] img + * [3] [4] [5] [6] [7] + * [4] [8] [9] [10] [11] + * [5] [12] [13] [14] [15] + * + * the first row and column never have any attributes + * NULL img pointers are skipped, rather than acting as sentries + */ -/* globals also include various stacks and queues used by the engine. - * such organization is infeasable using lexically-scoped garbage - * collection, hence the elements are placed in heap - * (dynamically allocated). - */ +struct drawvector { + ucoord3 a; + ucoord3 b; + char16_t ch; // if set to \0, then assume that attr also holds an ascii symbol and switch accordingly. + int attr; + ushort uslp; /* how long to delay between each character; calls usleep. + * there is already a miniscule delay for the stepwise pathfinder calculation + */ + } +/**GLOBALS**/ playertyp PLAYER -latlontyp WORLDSWP_HI[2][11] -latlontyp WORLDSWP_LO[8] -latlontyp WORLDSWP_EXTRA -latlontyp* WORLDSWPIN -#define WORLD (*WORLDSWPIN) -#define CEILING ROOM->ceiling roomstackholder ROOMSTACK +#define ROOM ROOMSTACK.swapin +#define ROOM_NOT_NULL(X,Y) ((ROOM != NULL) ? X : Y) +#define WORLD ROOM_NOT_NULL( ROOM->latlon , (latlontyp){0,0,0,0,0,0} ) +#define CEILING ROOM_NOT_NULL( ROOM->ceiling , MAX_Z ) planestackholder PLANESTACK -#define ROOM ROOMSTACK.top shadowmask SHADOWKNOWS shadowmask LIGHTINGMASK uint64_t TURN @@ -550,23 +589,10 @@ NIGHT = ((DATE.hour < 6) || (18 ≤ DATE.hour)) //projection, →x ↓y ↑z -struct coord3: -uchar x -uchar y -uchar z - -struct coord2: -uchar x -uchar y - -struct scoord3: -char x -char y -char z - -struct scoord2: -char x -char y +typedef uchar ucoord3[3] +typedef uchar ucoord2[2] +typedef char scoord3[3] +typedef char scoord2[2] struct mapcoord3: uchar x : 6 @@ -585,14 +611,8 @@ uchar table : 4 uchar meta : 4 } -struct vector2: -float x -float y - -struct vector3: -float x -float y -float z +typedef float vector2[2] +typedef float vector3[3] /* used for velocity, a parameter that holds * motion that carries accross turns. this motion * is not always cleared after being done; horizontal @@ -645,9 +665,7 @@ bool behind : 1 //EQUATOR/2 degrees are added to azimuth struct setcoord3: (self) *prev (self) *next -uchar x -uchar y -uchar z +ucoord3 coord //some specific use cases require spheres. these are simply numeric types. @@ -657,7 +675,7 @@ uchar side : 5 uchar tobeat : 8 struct planetyp { -uchar shift : 2 +uchar rho : 2 uchar az : 3 char el : 2 char : 0 @@ -667,16 +685,16 @@ struct latlontyp { uchar dep : 8 uchar lat : 8 ushort lon : 9 -uchar shift : 2 //are you plane shifted? +uchar rho : 2 //are you plane shifted? uchar az : 3 char el : 2 } /* in-game altitude is given as the distance from layer 100 * - * shift 0 is the prime plane - * shift 1 are the elemental planes - * shift 2 are afterlives - * shift 3 can be used for areas that are meant to not show up on a map. + * rho 0 is the prime plane + * rho 1 are the elemental planes + * rho 2 are afterlives + * rho 3 can be used for areas that are meant to not show up on a map. * (said map is WIP) * * az elemental afterlife corrilation @@ -714,10 +732,6 @@ char el : 2 * * a swap array keeps track of gating between the 23 major planes, * saving the player's position, but not keeping the room loaded. - * - * connectivity of rooms is in 7 directions: the 6 euclidian directions - * and a room which can be accessed by a 180° phase shift. if NULL, - * scrolling in that direction is blocked. */ struct placetyp { @@ -726,7 +740,7 @@ struct placetyp { eventdata eventident //7FFF is removeable char* name latlontyp latlon -coord3 pos +ucoord3 pos } struct moneytyp { @@ -734,6 +748,14 @@ ushort gp : 17 uchar cp : 7 } +typedef short trackaligntyp[2] +/* neutral is the area between -10,000 and 10,000 + * alignments can be between -30,000 and 30,000 + * actions, quests, and being polymorphed into + * certain monsters can alter your alignment + * [0] is good/evil, [1] is lawful/chaotic + */ + struct aligntyp: good : b1 evil : b1 @@ -774,10 +796,10 @@ basearmortyp* armtable[256] baseshldtyp* shldtable[256] baubtyp* baubtable[256] -char* legendstabs[20] = {"truthseeker","sword of justice","excalibur","thunderbolt"/*torch of smiting*/,"sickle of chaos"/*+drain*/,"stormbringer"/*+drain*/,"devilfork"/*+fire*/,"partisen of tyrants","deathscyth"/*+drain*/,"sunray"/*spear + solar flare*/,"nightedge"/*sword + moonbeam*/,"staff of merlin"/*staff of magic missile*/,"firebrand"/*sword + fireball*/,"tesla's mace"/*+spark*/,"stormgale"/*bow*/,"frostpike"/*+frostbite*/,"trident of the seas"/*+tsunami*/,"staff of the forest"/*staff of animante kudzu*/,"groundshaker"/*+earthquake*/,"imperial baton"/*staff of antagonizing*/}; -legendtyp* legendtable[20]; +char* legendstabs[24] = {"truthseeker"/*bow*/,"sword of justice","excalibur","thunderbolt","sickle of chaos"/*+drain*/,"stormbringer"/*+drain*/,"devilfork"/*+fire*/,"partisen of tyrants"/*+coin stealing*/,"deathscyth"/*+vampiric drain*/,"sunray"/*spear + solar flare*/,"nightedge"/*sword + moonbeam*/,"staff of merlin"/*staff of magic missile*/,"firebrand"/*burn*/,"tesla's mace"/*+spark*/,"stormgale"/*bow*/,"frostpike"/*+frostbite*/,"trident of the seas"/*+tsunami*/,"staff of the forest"/*staff of animante kudzu*/,"quake hammer","bow of fire","bow of ice","bow of darkness","bow of void","bow of dawn"}; +legendtyp* legendtable[24]; -char* psystabs[8] = {"detect alignment","charm","hold","sleep","mind blast","passify","unhinge","terrify"} +char* psystabs[8] = {"detect alignment","charm","psychic lock","sleep","mind blast","passify","unhinge","terrorize"} /*blackbox*/psionic(id) uchar id @@ -787,6 +809,7 @@ struct multiclasstyp: (self) *prev (self) *next classtyp class +magictyp element struct classobjtyp: classtyp class @@ -824,7 +847,6 @@ montable__init() __attribute__((constructor)) { char* mon1stabs[256] = {"human", "elf", "dwarf", "gnome", "hobbit", "half elf", "drow", "siren", "half orc", "half dragon", /*half celestial*/, "tiefling", "half air elemental", "half water elemental", "half earth elemental", "half fire elemental", "merfolk", "seaelf", "satyr", "fairy", "pixie", "naiad", "naga", "dryad", "orc", "kobald", "centaur", "sphinx", "half electric elemental", "half ice elemental", "half nature elemental", "half metal elemental", -...}; basentyp* mon1table[256] /* contains all polymorphable monsters, of type BASENTYPE. @@ -836,78 +858,86 @@ basentyp* mon1table[256] * commands can change your base race without negative side effects */ -char *mon2stabs[256] = {"grue", +char *mon2stabs[256] = {"grue", "newt", basentyp* mon2table[256] -char *mon3stabs[256] = {"rook", "raven", "jackdaw", ...} +char *mon3stabs[256] = {"rook", "raven", "jackdaw", basentyp* mon3table[256] /* MONSTERS BY LETTER - * &: horned devil, balrog, pit feind, imp, homunculus, jubilix, drider - * @: human, elf, half elf, drow, seaelf - * A: astral, ætherial, celestial, archon - * a: newt, salamander, frog, - * B: bear, polar bear, bugbear, owlbear, - * b: mockingbird, parkeet, parrot, macaw, cockatoo, songbird, sparrow, starling - * C: satyr, centaur, - * c: raven, rook, jackdaw, crow, jay, magpie, - * D: wyrm, great wyrm, (△red,↯copper,◬white,*cyan,▽blue,♠green,⍫brown,$gold,☽black,☼silver,∅purple) dragon, hydra, - * d: hellhound, wolf, dire wolf, dog, fox, cyote, - * E: , stalker, - * e: floating eye, - * F: turkey, rooster, chicken, peacock, duck, goose, swan, albatross, gull, dodo, auk - * f: panther, lion, tiger, manticore, cat, lynx, bobcat, - * G: ghost, banshee, revenent, barrow wight, - * g: gremlin, gargoyle, winged gargoyle, - * H: giant, cyclops, - * h: dwarf, gnome, hobbit, - * I: giant ant, giant roach, giant scarab, giant wasp, giant scorpion, giant spider, - * i: ant, roach, scarab, wasp, scorpion, spider, firefly - * J: djinn, - * j: lichen, yellow mold, green mold, black mold, gelatinous cube, green slime, brown pudding, black pudding, ocher jelly, spotted jelly, blue jelly, - * K: chickatrice, cockatrice, pyrolisk, - * k: kobold, - * L: skeleton, lich, - * l: leprachaun, - * M: gorgon, - * m: - * N: naga, - * n: merfolk, naiad, dryad, sea siren - * O: orc, half orc, uruk-hai, ogre, - * o: ostrich, emu, moa, penguin - * P: fairy, pixie, - * p: dolphin, narwhal, orca, beluga, - * Q: elephant, mammoth, rhino, - * q: cow, pig, buffalo, - * R: eagle, falcon, owl, kite, vulture, phoenix, - * r: rat, dire rat, raccoon, platypus, - * S: cracken, shark, octopus, giant squid, - * s: copperhead, cobra, rattlesnake, python, - * T: lurker above, trapper, wallmaster, rust monster, - * t: troll, - * U: umber hulk, - * u: unicorn, pegasus, griphon, hippogriph, - * V: vampire, wolfman, - * v: bat, - * W: half dragon, half celestial, tiefling, avian, erinys, kerr, harpy, siren, tengu, - * w: purple worm, nightcrawler, - * X: velociraptor, tyrannasaurus, - * x: monitor, alligator, crocodile, skink, - * Y: yeti, bigfoot, - * y: ape, monkey, gorilla, - * Z: mind flayer, - * z: - * {: (flesh, straw, clay, stone, glass, paper, leather) golem, (gold, copper) automaton, hungry chest, chest monster, - * «: bass, trout, salmon, tuna, carp, swordfish, pike, eel, - * ÷: cracken, lobster, crab, shrimp, - * £: justice. (lawful neutral) - * ¶: da fuzz. (lawful neutral) - * ⑄: retribution. (chaotic neutral) - * ∈: - * ∞: grue. - * ☠: death. (true neutral) - * ♞: quarterhorse, draft horse, miniature horse, zebra, nightmare, - * ⏍: hungry chest, chest monster, + * & : horned devil, balrog, jubilix, + * @ : human, elf, half elf, drow, seaelf + * A : angel, astral, ætherial, celestial, archon + * a : newt, salamander, frog, + * B : bear, polar bear, bugbear, owlbear, + * b : mockingbird, parkeet, parrot, macaw, cockatoo, songbird, sparrow, starling + * C : satyr, centaur, + * c : chickatrice, cockatrice, pyrolisk, + * D : wyrm, great wyrm, /(△red|↯copper|◬white|*cyan|▽blue|♠green|⍫brown|$gold|☽black|☼silver|∅grey) dragon/, hydra, + * d : hellhound, wolf, dire wolf, dog, fox, cyote, + * E : , stalker, + * e : floating eye, + * F : panther, lion, tiger, manticore, cat, lynx, bobcat, + * f : turkey, rooster, chicken, peacock, duck, goose, swan, gull, dodo + * G : ghost, banshee, revenent, barrow wight, + * g : gremlin, gargoyle, winged gargoyle, + * H : giant, cyclops, + * h : dwarf, gnome, hobbit, + * I : /giant (ant|roach|scarab|wasp|scorpion|spider)/ + * i : ant, roach, scarab, wasp, scorpion, spider, firefly + * J : djinn, + * j : lichen, yellow mold, green mold, black mold, gelatinous cube, green slime, brown pudding, black pudding, ocher jelly, spotted jelly, blue jelly, + * K : kracken, giant squid, octopus, + * k : kobold, + * L : skeleton, lich, + * l : leprachaun, + * M : elephant, mammoth, rhino, + * m : + * N : naga, + * n : merfolk, naiad, dryad, sea siren + * O : orc, half orc, uruk-hai, ogre, + * o : ostrich, emu, moa + * P : dolphin, narwhal, orca, beluga, + * p : penguin, puffin, auk, albatross + * Q : fiend, drider + * q : quasit, imp, homunculus, + * R : eagle, falcon, owl, kite, vulture, phoenix, + * r : mouse, rat, dire rat, raccoon, badger, opossum, platypus, groundhog, + * S : shark, stingray, swordfish, barracuda, eel, + * s : copperhead, cobra, rattlesnake, python, boa, viper, coral snake, king snake, anaconda, + * T : lurker above, trapper, wallmaster, rust monster, + * t : troll, + * U : umber hulk, + * u : unicorn, pegasus, griphon, hippogriph, + * V : vampire, + * v : bat, + * W : half dragon, half celestial, tiefling, siren, erinys, kerr, harpy, tengu, + * w : purple worm, nightcrawler, + * X : velociraptor, tyrannasaurus, + * x : monitor, alligator, crocodile, + * Y : yeti, bigfoot, + * y : ape, monkey, gorilla, chimp, leamur + * Z : mind flayer, medusa + * z : + * = : [spoiler] + * {}: /(flesh|straw|clay|stone|glass|paper|leather) golem/, /(gold|copper|finite state) automaton/, chest monster, + * ? : mystery person + * «»: bass, trout, salmon, tuna, carp, pike, + * × : lizard, geko, skink, + * ÷ : lobster, crab, shrimp, + * £ : justice. (hard lawful neutral) + * ¶ : da fuzz. (lawful neutral) + * Ω : [spoiler] + * ⑄ : retribution. (chaotic neutral) + * ∀ : ox, cow, pig, buffalo, goat, sheep, + * ∄ : fear itself. (soft neutral evil) + * ⊞ : lichen, moss, green mold, slime mold, black mold + * ∈ : + * ∞ : grue. + * ☠ : death. (true neutral) + * ♞ : quarterhorse, draft horse, miniature horse, zebra, nightmare, + * ♖ : raven, rook, jackdaw, crow, jay, magpie, + * ⏍ : hungry chest, chest monster, */ struct the8stats: //8* 5D6 @@ -935,7 +965,7 @@ multiclasstyp *MULTICLASS struct racetyp baserace struct racetyp polyrace shiftertyp polycounter -coord3 loc +ucoord3 loc polar facing vector3 velo float carryover //leftover moves; never exceeds 2 @@ -995,29 +1025,36 @@ ENUM_WRIST_RIGHT} /*blackbox*/force_global /* forces some queued globals to be loaded. takes a very long time, but can * sometimes be necissary if the global buffer is starving the system. + */ + + struct basentyp: aligntyp alignmask aggrotyp aggro //here, shiftable denotes a monster's aggro state is locked. also gives the value that patience is set to when a monster calms down, the value that cooldown is set to when it is angered, and the default AI. paffectyp base venomtyp venom -uchar spd //distance calculations use M_SQRT2 for diagonals +uchar spd //distance calculations use M_SQRT2 and local SQRT3 for diagonals uchar hplvl uchar mplvl uchar xplvl uchar airmax //how long you can hold your breath -_8bitPtr lang0 : 6 -_8bitPtr lang1 : 6 +struct conlangtyp lang0 +struct conlangtyp lang1 uchar vocal[4] _8bitPtr spell[4] bitfield psyattack -char16_t unichar -bool unaligned : 1 -bool keepindark : 1 +char16_t sprite +int attrs +char16_t altsprite +int altattrs bool mindless : 1 +bool shadow : 1 bool incoporeal : 1 +bool unaligned : 1 +uchar natural_element : 8 char size : 2 -uchar color : 6 +uchar weight : 2 /* entitys of size 1 or -2 cannot use armor. * entitys of larger size automaticly win grapples. * entitys of 2 sizes smaller can be picked up and thrown. @@ -1038,7 +1075,7 @@ char* name classobjtyp class aggrotyp aggro struct racetyp race -coord3 loc +ucoord3 loc polar facing vector3 velo float carryover @@ -1075,7 +1112,7 @@ eventdata eventident classobjtyp class setcoord3* path struct racetyp race -coord3 loc +ucoord3 loc polar facing conlangtyp lang char* lines @@ -1091,7 +1128,7 @@ aggrotyp aggro struct racetyp baserace struct racetyp polyrace shiftertyp polycounter -coord3 loc +ucoord3 loc polar facing vector3 velo float carryover @@ -1204,7 +1241,7 @@ struct basespelltyp: bool poly : 1 bool self : 1 uchar lvl : 6 -magictyp type : 8 +magictyp type char cost_typ : 2 //0 = at will, 1 = gold, -1 = mp, -2 = hp uchar cost_amnt : 6 potiontyp effect @@ -1330,14 +1367,14 @@ blind : u8 eaten : u8 struct elixtyp: -dizzy : b -psn : b -prlz : b -frz : b -brn : b -stone : b -slp : b -invis : b +dizzy : 1 +psn : 1 +prlz : 1 +frz : 1 +brn : 1 +stone : 1 +slp : 1 +invis : 1 struct cursetyp: stattyp type @@ -1371,7 +1408,6 @@ stattyp stat resistyp resist senstyp sense skilltyp skill -magictyp asp char atk char spatk char def @@ -1385,7 +1421,6 @@ elixtyp curse resistyp resist senstyp sense skilltyp skill -magictyp asp char atk char spatk char def @@ -1471,7 +1506,6 @@ latlontyp east latlontyp west latlontyp up latlontyp down -latlontyp mirror } struct roomtyp: //top-down display of a 3d space @@ -1488,9 +1522,9 @@ npctyp *npc_ptr mapobjtyp *obj_ptr lightyp *lamp_ptr setcoord3 *path_ptr -coord2 downstair -coord2 upstair -coord3 home +ucoord2 downstair +ucoord2 upstair +ucoord3 home struct roomneighbors neighborhood /* if invalid coords are given for a warp (typically {$FF,$FF}), * then the player is dumped at the location indicated by home. @@ -1513,7 +1547,7 @@ struct roomneighbors neighborhood struct subroomtyp: //used by mapgen char tiledata[MAX_Z][MAX_Z][MAX_Z] //cube of MAX_Z -coord3 dim +ucoord3 dim enttype *ent_ptr mapobjtyp *obj_ptr lightyp *lamp_ptr @@ -1527,15 +1561,16 @@ lightyp *lamp_ptr * *.tsv : UTF-8 text record deliminated with tabs and line breaks * *.tab : same as tsv * *.so : a shared object. a game may use as many of these as it wants. Placing single-use functions in LD_LOAD_PATH is DISCOURAGED; they should be placed in the game's private files. - * *.dat : internal data from inside a savefile - * *.json : a less compact container format that does not allow linking - * *.pl.dump : a self-reassembling perl datastructure + * *.ini : data from inside a savefile + * *.json : produced when a dump is requested + * *.dumper : a self-reassembling perl datastructure * *.asc : UTF-8 text record delimenated by newline. * *.txt : UTF-8 text document. usually stored in the program's static files, which is CAT-ed to provide dialouge; also used in dumps of primatives * *.ans : UTF-8 text record containing SGR sequences deleminated by newline. * *.nfo : UTF-8 text document (not CP437) containing SGR sequences. otherwise identical to asc. - * *.tar.gz : each room is saved as a tar.gz file, as are linked lists and the player. rooms are divided into compressed files for each plane. the extra planes are tar.gz files named shift_az_el - * *.tar.bz2 : a savefile is a tar.bz2 file. it is named %H_%M_%S__%d_%m_%Y. the 23 main planes are tar.bz files named shift_az_el + * **.rot13 : an encrypted text file, containing major spoilers. + * *.tar.gz : each room is saved as a tar.gz file, as are linked lists and the player. rooms are divided into compressed files for each plane. the extra planes are tar.gz files named rho_az_el + * *.tar.bz2 : a savefile is a tar.bz2 file. it is named %H_%M_%S__%d_%m_%Y. the 23 main planes are tar.bz files named rho_az_el * *.man.# : a linux manpage * *.mdoc.# : a bsd manpage * * : documentation @@ -1546,7 +1581,7 @@ lightyp *lamp_ptr * *.PL : a build-related perl script * *.pod : perl documentation * *.d : everything relating to a struct is stored in the same directory, and pointers to structs are stored as subdirectories with the name of that field. the tail element in a linked list has no subdirectory named "next"; "prev" pointers are "../" implicitly. - * *.conf : a configuration file, parsed with perl. + * *.conf : a configuration file. * *.*rc : a user's configuration file. * *.dumper : a debugger data dump, with a format somwhere between JSON, INI, and C-like pseudocode. essentialy a dat file in readable (and non-raw) format. * @@ -1708,7 +1743,7 @@ struct mapobjtyp: (self) *prev (self) *next eventdata eventident -coord3 pos +ucoord3 pos objid type void* data mapobjflags flags @@ -1716,7 +1751,7 @@ mapobjflags flags struct lamptyp: (self) *prev (self) *next -coord3 pos +ucoord3 pos uchar lum struct signtyp { @@ -1827,15 +1862,15 @@ struct qglobobj: //queued global object eventdata eventident qglobflags flags latlontyp latlon -coord3 pos +ucoord3 pos objid type void* data struct qglobflags { struct racetyp race : 16 race-specific : 1 -role : 2 -class : 3 +role : u2 +class : u3 lawfulgood : 1 neutralgood : 1 chaoticgood : 1 @@ -1853,7 +1888,7 @@ struct traptyp: (self) *next eventdata eventident char16_t unichar -coord3 loc +ucoord3 loc ushort duration magictyp element stattyp stat @@ -1883,7 +1918,7 @@ eventdata eventident bool perm : 1 bool blink : 1 uchar color : 6 -coord3 loc +ucoord3 loc setcoord3 *dest short duration //negative are uses, positive are turns } @@ -1894,7 +1929,7 @@ bool perm : 1 bool blink : 1 uchar color : 6 latlontyp glob_loc -coord3 loc +ucoord3 loc latlontyp glob_dest setcoord3 *dest short duration @@ -1973,36 +2008,41 @@ drawing is stopped and the player is drawn if they have not been already fluid tiles are transparent. to avoid confusion, by default the player always uses a unique character: ☻ +if so, then ☺ is used for your dopplganger. +whether or not these symbols are used must be decided at library compile time + +symbols that are white or black based on being filled or unfilled might be +switchable at startup in the same way as tilde vs tilde operator + +depening on difficulty of implementing such, characters might be stored in a lookup table +that stores indexes between an anything and a unicode codepoint. this would require a byte +encoding scheme for peeking anythings between runtimes, which is problematic considering +the existing 2 ways require either names or pointers an UNDERLINE is a shadow note: unicode symbols are (mostly) used be their appearence, not by their meaning ) is a sword or dagger. ⍏ are polearms. \ is a staff. ¦ is a club. : is a mace. ℓ is a whip. ( is a bow. ⇤ is an arrow. ⍖ is a writing instrument. -⟦ is armor. [ is clothing. ] is a shield. ⟧ are cannons or greeves. ☜☝☞☟ is a gauntlet. % is meat. ⊞ is food (don't shoot it). $ is gold. ¢ is copper. -⌘ is a misc item. ↧ is a digging tool. ⌥ is a key or lockpick. ♫ is a lyre. ƒ is a violin. ♪ is a different music instrument. +⟦ is armor. [ is clothing. ] is a shield. ⟧ are cannons or greeves. ☜☝☞☟ is a gauntlet. % is meat. ± is food (don't shoot it). $ is gold. ¢ is copper. +⌘ is a misc item. ↧ is a digging tool. ⌥ is a key or lockpick. ♫ is a lyre. ƒ is a violin. ♪ is a lute. ¿ are potions (fragile). ∫ is a scroll. ⊒ is a book. ∩ is a tablet. ° is a ring. º is a bracelet. ª is an amulet. ^ is a crown. / is a wand. ♮ is a ladder. ⋎ is a fountain or gyser. ⍾ is a bell. ⎋ is a clockface. ♠ ♣ ‡ are trees. ⋏ is fire. ♜ is a pedestal. ≋ is deep liquid's surface. ∬ is a waterfall. ≈ is a shallow liquid's surface, or a deep liquid below surface. ~ (centered) is a puddle. ≣ is a staircase. ⌁ is electricity. * is ice. ⎈ spider web. ⌬ beehive. ↥ are spikes. ⎙ ⍝ ⎍ ∎ ⎅ are tombstones or signs. ␥ is glass. -! is trouble. ☀ is a light source. ⌸ is a door. ⍯ is a locked door. ⎕ is an open door. = is a gate. ≠ is a locked gate. ⑆ is an open gate. +! is trouble. ☀ is a light source. ⌸ is a door or gate. ⍯ is a locked door. ⎕ is an open door. • is a boulder. . is a rock. ⁂ is a rockslide. ◇ is a gemstone. ◊ is a giant magic crystal. ? is somone wearing a cowled cloak. ∪ is a sink. ⏍ is a chest. ↯ is the thunderbolt. ∅ is a spacetime anomaly (do not touch). ↸ ⇲ are level stairs. ← ↑ → ↓ ↖ ↗ ↘ ↙ are flying projectiles, or facing direction. ⇐ ⇑ ⇒ ⇓ ⇖ ⇗ ⇘ ⇙ are ballistae. ✪ is a rune. ː ⍽ are traps. -# █ ▓ ▒ ░ ▞ ▚ (etc) are thick walls or floor. ≎ ☈ are clouds (do not walk on them; keep your head out of them). +# █ ▓ ▒ ░ ▞ ▚ ⑆ (etc) are thick walls or floor. ☁ ≎ are clouds (do not walk on them; keep your head out of them). ☈ is a thundercloud (hurts). ˜ ␣ are holes. ' is a stalagtite or icicle. , is a plant. ; is a grain or sunflower (impassable). box drawings are low walls or columns. ⋯⋰⋱⋮ are iron bars. · is an ember or star. ` ´ are flower petals. -¬ is carbon monoxide. ∽ is mud. ≉ is stagnent water (unbreathable). -" deliminates text. > < is the cursor (selected tile is inbetween) +¬ is mud. ≃ ≊ is stagnent water (unbreathable). ☿ is a pool of mercury. ♃ is a mirror. ♄ is an antimagic field. +" deliminates text. ⍰ is a missingno (invalid tile id). -the symbol for gemstone and giant crystal has been the source of much headache, -but any truly monospace font should render their relative sizes correctly; -if the font is only pretending to be monospace (like the default github font), -you'll have bigger issues of non-uniform characters warping and tearing -the world's projection grid. it is for this reason that the recommended font -is a raster one, as raster fonts tend to be more uniform. - a prompt at launch uses user responce to choose between using ~ or ∼ for centered tilde. +handling of solid vs outlined symbols will use the solid symbol for a forground different from the background, +and outlined to represent same color on color. box drawings: ╒╤╕ ╔╦╗ @@ -2023,7 +2063,7 @@ and will use the full range of ANSI SGR escape codes rune symbols ◬ air, ⍫ earth, △ fire, ▽ water, ⍰ missingno ⋇ ice, ☇ electricity, ♤ metal, ♻ nature -❖ status effect, ☣ poison, ¤ stoning, ∅ entropy +¤ status effect, ❖ stoning, ☣ poison, ∅ entropy ☼ light, ☽ dark, § polymorph, ↹ planer ♥ healing @@ -2369,6 +2409,7 @@ sleep(4); } main() { + termcheck(); enginesplash("Default Game","Prealpha","Rough Draft"); printf(RESET);printf(BLINKY); @@ -2389,3 +2430,15 @@ sleep(4); FIXCURSES do_intro_movie(); promptload(); +engineloop(); +if (!(TRUENDING)) { + notatruending() + } +} + +notatruending() { + BREAKCURSES + printf("\033[1;3;33mTHIS IS NOT A TRUE ENDING...\n"); + puts(RESET); + quit(0); + } diff --git a/src/macro.h b/src/macro.h index e4aee38..63fdc07 100644 --- a/src/macro.h +++ b/src/macro.h @@ -10,8 +10,11 @@ #define ≤ <= #define forever for (;;) #define END return 0;} -#define :: __ -#define :/: __ + +#define ARRY_X 0 +#define ARRY_Y 1 +#define ARRY_Z 2 +#define ARRY_W 3 /* syntactic sugar for macros that are actually tailcalls * such macros contain a return or this macro @@ -63,7 +66,7 @@ #define BACKGROUND 010 #define MAX(A,B) (A ≥ B ? A : B) #define MIN(A,B) (A ≤ B ? A : B) -#define SGN(N) (N < 0 ? 1 : (N > 0 ? -1 : (N == 0 ? 0 : NAN))) +#define SGN(N) ( #define CLAMP(A,N,B) MIN(MAX(A,N),B) #define COORDSUB(Z,Y,X) ((MAX_Y * Z) + (MAX_X * Y) + X) #define SWAP(X,Y) {if (X != Y) {intptr_t sWaPtEmPoRaRy = X;Y = X;X = sWaPtEmPoRaRy}}\ diff --git a/src/objects.messy b/src/objects.messy index 9df759c..37d533a 100644 --- a/src/objects.messy +++ b/src/objects.messy @@ -1,54 +1,126 @@ -/**ROOMSTACK global object - **ROOM global object acessor - * roomstackele* ROOMSTACK::push(roomtyp) - * void ROOMSTACK::shift() - * roomstackele* ROOMSTACK::roomp(latlontyp) - * implicit ROOMSTACK::pull(roomstackele*) - * implicit ROOMSTACK::makecurrent(latlontyp) +/* roomstackele* roomstackobj__push(roomstackobj*,roomtyp*) ...add a room to the roomstack; NULL on error + * roomstackele* roomstackobj__pushover(roomstackobj*,roomtyp*) ...add a room to the roomstack; NULL on error. no length checking. + * roomtyp * roomstackobj__shift(roomstackobj*) ...drop the most stale node. pointer must be immediately used or a memory leak occurs + * roomtyp * roomstackobj__drop(roomstackobj*,roomstackele*) ...drop a node from the roomstack. pointer must be immediately used or a memory leak occurs + * void roomstackobj__shift_free(roomstackobj*) ...drop and free the most stale node from the stack + * void roomstackobj__drop_free(roomstackobj,roomstackele*) ...drop and free the most stale node from the stack + * void roomstackobj__trim(roomstackobj*) ...drop and free the most stale nodes until the size of the stack is acceptable + * roomstackele* roomstackobj__nth(roomstackobj*,int) ...get the nth element; NULL on sentry + * roomstackele* roomstackobj__roomp(roomstackobj*,latlontyp) ...if an element exists, return it; else NULL + * implicit roomstackobj__roompull(roomstackobj*,latlontyp) ...if an element exists, move it to the front. OK or ERR + * implicit roomstackobj__pull(roomstackobj*,roomstackele*) ...move the element to the front. OK or ERR + * implicit roomstackobj__setswap(roomstackobj*,roomtyp*) ...create a room and push it to swap + * roomtyp * roomstackobj__getswap(roomstackobj*,planetyp) ...get the room in a given swap. + * roomtyp * roomstackobj__resetswap(roomstackobj*,planetyp) ...recall the room in the given swap. invalid plane will call topswap; this may not be what you want. + * roomtyp * roomstackobj__topswap(roomstackobj*) ...recall the top of the stack to swap. + * implicit roomstackobj__setswap_ele(roomstackobj*,roomstackele*) ...push the room contained in an element to swap. + * implicit roomstackobj__makecurrent(roomstackobj*,latlontyp) ...smart swap function. if an element doesn't exist, it is created. if it does, it is moved. + * note: because of the way the implementation works, duplicate entries are HIGHLY DANGEROUS and must be avoided. */ struct roomstackele { -struct roomstackele* prev; -struct roomstackele* next; -roomtyp* room; +struct roomstackele * prev; +struct roomstackele * next; +roomtyp * room; } -struct roomstackholder { -struct roomstackele* bottom; -struct roomstackele* top; +struct roomstackobj { +roomtyp ** swapin; //column-major +roomtyp *bank[3][11]; +struct roomstackele * top; +struct roomstackele * bottom; ushort depth; } -ROOMSTACK::push(new) -roomtyp* new -{ -struct roomstack* newnode = malloc(sizeof(struct roomstackele)); -newnode->room = new; -newnode->prev = ROOM; -newnode->next = NULL; -ROOMSTACK.top->next = newnode; -ROOMSTACK.top = ROOM->next; -ROOMSTACK.depth++; -if (ROOMSTACK.depth > ROOM_STACK_MAX) { - ROOMSTACK::shift(); - ROOMSTACK--; +roomstackele * roomstackobj__pushover(roomstackobj * this,roomtyp * room) { + struct roomstackele * new = malloc(sizeof(struct roomstackele)); + new->room = room; + new->prev = this->top; + new->next = NULL; + this->top->next = new; + this->top = new; + this->depth++; + return new; +} + +void roomstackobj__trim(roomstackobj * this) { +while (this->depth > ROOM_STACK_MAX) { + freeroom(roomstackobj__shift(this)); } } -roomtyp* ROOMSTACK::makecurrent(query) -latlontyp query -{ -if (ROOMSTACK::makecurrent(query) > 0) { - continue; +roomstackele * roomstackobj__push(roomstackobj * this,roomtyp * room) { + roomstackele * tmp = roomstackobj__pushover(this,room); + roomstackobj__trim(this); + return tmp; } -else if (roomp(query)) { - ROOMSTACK::push(query,loadroom(query)); + +#define roomstackobj__roompull(X,Y) roomstackobj__pull(X,roomstackobj__roomp(X,Y)) + +roomstackobj__pull (roomstackobj * this, roomstackele * that) { + if (!(this->top != that)) { + that->prev->next = that->next; + if (that->next == NULL) { + that->next->prev = that->prev; + } + that->prev = NULL; + that->next = this->top; + this->top->prev = that; + this->top = that; + } + return that; } -else { - ROOMSTACK::push(query,roomgen(query)); + +roomstackobj__setswap (roomstackobj * this, roomtyp * that) { + struct planetyp plane = getplanetyp(that->latlon); + roomstackobj__push(this,roomstackobj__getswap(plane)) + if (plane.rho < 3) { + if (!(plane.el)) { + this->bank[plane.rho][plane.az] = that; + } + else if (!(plane.az)) { + switch plane.az : + case 1 : this->bank[plane.rho][8] = that;break; + case -1 : this->bank[plane.rho][9] = that;break; + case -2 : this->bank[plane.rho][10] = that;break; + default : fprintf(stderr,"struct bitfield overflow\n");raise(SIGSEGV); + } + else { + roomstackobj__push(this,that); + } + } + else { + roomstackobj__push(this,that); + } + this->swapin = that; + END + +#define roomstackobj__setswap_ele(X,Y) roomstackobj__setswap(X,roomstackobj__drop(X,Y)) + +roomstackobj__makecurrent(roomstackobj * this,latlontyp query) { + if ( + (query == roomstackobj__getswap( this , getplanetyp(query) )->latlon) + || + (roomstackobj__roompull(this,query) != NULL) + ) { + /*conditional must short circuit in this order*/ + return 0; + } + else { + if (roomp(query)) { + roomstackobj__setswap(this,loadroom(query)); + } + else { + setswaproom(roomgen(query)); + } + } } -return ROOMSTACK.top.value; -} +END + +/*^DONE^ + * From Rough Pseudocode to Pseudo C + * TODO + */ /**PLANESTACK global object** * planestackele* PLANESTACK::push(planetyp) @@ -154,57 +226,38 @@ if (roomptr == NULL) {roomptr = ROOM} return free(roomptr) } -/**WORLDSWP global object - **WORLDSWPIN global object index flag - **WORLD global object acessor** - * implicit WORLD::gate(latlontyp) - * implicit WORLD::swap(planetyp) - * planetyp getplanetyp(latlontyp) +/*^TODO^ + * From Rough Pseudocode to Pseudo C + * DONE */ -swaproom(dest) -struct latlontyp dest; -{ -if (!(dest.shift || dest.az || dest.el)) {WORLDSWPIN = 0} -else {switch dest.shift : { - case 0 : return ERR; - case 1 : if (!(dest.el)) { - switch dest.az : { - case 0 : ROOMSWPIN = 1; return OK; - case 01 : ROOMSWPIN = 2; return OK; - case 02 : ROOMSWPIN = 3; return OK; - case 03 : ROOMSWPIN = 4; return OK; - case 04 : ROOMSWPIN = 5; return OK; - case 05 : ROOMSWPIN = 6; return OK; - case 06 : ROOMSWPIN = 7; return OK; - case 07 : ROOMSWPIN = 8; return OK; - default : ERROR_GRAPHIC("Struct Field Overflow",'X',dest.az,'s',"too big for expected three bit field",true); - } - else if (dest.el && !(dest.az)) { - case 1 : ROOMSWPIN = 9; return OK; - case -1 : ROOMSWPIN = 10; return OK; - case -2 : ROOMSWPIN = 11; return OK; - default : ERROR_GRAPHIC("Struct Field Overflow",'X',dest.el,'s',"too big for expected three bit field",true); - } - break; - case 2 : if (dest.az && !(dest.el)) { - switch dest.az : { - case 0 : ROOMSWPIN = 12; return OK; - case 01 : ROOMSWPIN = 13; return OK; - case 02 : ROOMSWPIN = 14; return OK; - case 03 : ROOMSWPIN = 15; return OK; - case 04 : ROOMSWPIN = 16; return OK; - case 05 : ROOMSWPIN = 17; return OK; - case 06 : ROOMSWPIN = 18; return OK; - case 07 : ROOMSWPIN = 19; return OK; - default : ERROR_GRAPHIC("Struct Field Overflow",'X',dest.az,'s',"too big for expected three bit field",true); - } - else if (dest.el && !(dest.az)) { - case 1 : ROOMSWPIN = 20; return OK; - case -1 : ROOMSWPIN = 21; return OK; - case -2 : ROOMSWPIN = 22; return OK; - default : ERROR_GRAPHIC("Struct Field Overflow",'X',dest.el,'s',"too big for expected three bit field",true); - } - break; - default : return ERR; - }} +/* planetyp getplanetyp(latlontyp) + */ + +/* blitlineobj__load_room(blit_lineobj*,char,char*) ...load a bank of lines from a room + * blitlineobj__load_plane(blit_lineobj*,char,char*) ...load a bank of lines from a plane + * blitlineobj__load(blit_lineobj*,char,char*) ...load a bank of lines from the global library + * blitobj__pallette_load_room(blitobj*,char,char*) ...load a pallette from a room + * blitobj__pallette_load_plane(blitobj*,char,char*) ...load a pallette from a plane + * blitobj__pallette_load(blitobj*,char,char*) ...load a pallette from the global library + * blitobj__img_load_room(blitobj*,char*) ...load an imageset from a room + * blitobj__img_load_plane(blitobj*,char*) ...load an imageset from a plane + * blitobj__img_load(blitobj*,char*) ...load an imageset from the global library + * blitobj__sprite_load_room(blitobj*,char*) ...load a spriteset from a room + * blitobj__sprite_load_plane(blitobj*,char*) ...load a spriteset from a plane + * blitobj__sprite_load(blitobj*,char*) ...load a spriteset from the global library + */ + +struct blitobj { + char *lines[8][32]; // ans file + _8bitPtr *img[4][8][8]; // hex file + struct blitele * head; + struct blitele * tail; + } + +blitele { + blitele * prev; + blitele * next; + int p[6]; + uchar s[16]; + } diff --git a/src/questdialogs/endofthebeginning.asc.rot13 b/src/questdialogs/endofthebeginning.asc.rot13 new file mode 100644 index 0000000..4c34dd3 --- /dev/null +++ b/src/questdialogs/endofthebeginning.asc.rot13 @@ -0,0 +1,20 @@ +Jrypbzr...V unir orra rkcrpgvat lbh. +V nz Sngr, gur xrrcre bs onynapr. +Naq V arrq lbhe uryc. + +Ynj, Punbf, Tbbq, naq Rivy...rnpu nybar pnaabg shapgvba jvgubhg vg'f bccbfvgr. +Ynj jvgubhg Punbf vf vaqvssrerg naq pehyr. +Punbf jvgubhg ynj vf nanepul. +Tbbq pnaabg fheivir jvgubhg fbzr nzbhag bs Rivy. +Rivy qrfgeblf vgfrys va gur nofrapr bs Tbbq. +Fheryl, lbh unir frra guvf va lbhe ybat geniryf... + +Na napvrag orvat bs Rivy evfrf va gur bhgre cynarf. +vg vf lbhe qrfgval gb rafher gung onynapr erznvaf va gur zhygvirefr... + +V pnaabg vagresrne va gur nssnvef bs gur pbfzbf nal zber guna V unir nyernql qbar; +vg vf sbeovqqra gb qb nf zhpu nf V unir nyernql. Lbh zhfg svaq lbhe bja cngu sebz urer. +V tenag lbh bar ynfg tvsg orsber lbh zhfg yrnir... + +(*Ryrzragny jrncba vf tenagrq urer. +Ebbz orpbzrf vanpprffvoyr nsgre rirag cynlf.*) \ No newline at end of file diff --git a/src/questdialogs/goaway.asc b/src/questdialogs/goaway.asc new file mode 100644 index 0000000..bbe19f0 --- /dev/null +++ b/src/questdialogs/goaway.asc @@ -0,0 +1,11 @@ +∿{HALT!}∿ +∿{Leave this place. You are not welcome here.} + +(*if an evil player tries to enter a Siren village, +they recieve this warning. if they ignore it, they +are smitten. this applies to lawful-* or +chaotic-neutral orcs and humans as well. +the sirens are constantly at war with both +over their precious metal mines, and thus +consider them to be more inclined to evil +than other races.*) \ No newline at end of file diff --git a/src/roomgen.messy b/src/roomgen.messy index c774474..4ec66b7 100644 --- a/src/roomgen.messy +++ b/src/roomgen.messy @@ -1,55 +1,14 @@ -typedef void* mapgendispatchtyp[256][256][512][2]; +typedef void* mapgendispatchtyp[256][256][512]; typedef struct roomneighbors mapgeneighborstyp[256][256][512]; -typedef void (*mapgencall)(struct latlontyp,struct roomneighbors); -typedef void (*mapgenconstructor)(mapgendispatchtyp,mapgeneighbortyp); - -mapgentoplevel (latlon) -struct latlontyp latlon; -{ -struct planetyp plane = getplanetyp(latlon); -if (PLANESTACK::planep(plane)) { - PLANESTACK::inc(plane); - } -else if (planep(plane)) { - PLANESTACK::push(plane); - } -else { - return ERR; - } - -char symbol[15] = sprintf("r%02u_az%03u_el%02u",latlon.shift,latlon.el,((latlon.el < 0) ? latlon.el : (abs(latlon.el) + 1)) ) -void* handle = dlopen(LIB_GAMES_PATH GAME_NAME_PATH "/mapgen.so",RTLD_NOW); -mapgendispatchtyp mapgendispatch; -mapgeneighborstyp mapgeneighbors; -mapgenconstructor constructor = dlsym(handle,symbol); -*constructor(mapgendispatch,mapgeneighbors); - -if ((mapgendispatch[latlon.dep][latlon.lat][latlon.lon][0] == NULL) -|| ( *((char*) mapgendispatch[latlon.dep][latlon.lat][latlon.lon][0] )[0] == '\0') - ) { - if ((mapgendispatch[latlon.dep][latlon.lat][latlon.lon][1] == NULL) - || ( *((char*) mapgendispatch[latlon.dep][latlon.lat][latlon.lon][1] )[0] == '\0') - ) { - deathcall(SHARE_LIB_GAMES_PATH "death/icarus.ans"); - } - else { - /*call perl against file*/; - } - } -else { - if ((mapgendispatch[latlon.dep][latlon.lat][latlon.lon][1] == NULL) - || ( *((char*) mapgendispatch[latlon.dep][latlon.lat][latlon.lon][1] )[0] == '\0') - ) { - return deathcall(mapgendispatch[latlon.dep][latlon.lat][latlon.lon][0]) ); - } - else { - void* handle2 = dlopen(mapgendispatch[latlon.dep][latlon.lat][latlon.lon][0],RTLD_NOW); - roomgencall tmp = dlsym(handle2,mapgendispatch[latlon.dep][latlon.lat][latlon.lon][1]); - return *tmp(latlon,mapgeneighbors[latlon.dep][latlon.lat][latlon.lon]); - dlclose(handle2); - } - } -dlclose(handle); -PLANESTACK::dec(plane); -END +/* each game may have 65535 unique room generation commands, which + * take 16 arguments of type char. each plane may index an 8 bit table of + * pre-configured commands to make a 256*256*512 cube of room generation + * commands. Complex rooms may be pre-generated by the newgame maker. + * + * table index 0x00 an empty room + * table index 0xFF is always the Forbidden Forest deathcall + * table index 0xFE is always the Icarus deathcall + * table index 0xFD is always the Drowning deathcall + * table index 0xFC is always the Bottomless Pit deathcall + */ diff --git a/src/roominit.c b/src/roominit.c new file mode 100644 index 0000000..7b7cc98 --- /dev/null +++ b/src/roominit.c @@ -0,0 +1,28 @@ +#define ROOMSTACKMAX 48 + +ROOMSTACK__init(latlontyp pages[3][11],ucoord2 start) { + for (int rho = 2;rho ≤ 0;rho--) { + for (int n = 10;n ≤ 0;n--) { + ROOMSTACK.bank[rho][n] = roomgen(pages[rho][n]); + } + } + ROOM = ROOMSTACK.bank[start[0]][start[1]]; + ROOMSTACK.top = malloc(sizeof(struct roomstackele)) + ROOMSTACK.bottom = malloc(sizeof(struct roomstackele)) + ROOMSTACK.top->prev = NULL + ROOMSTACK.top->next = ROOMSTACK.bottom + ROOMSTACK.top->room = roomgen(ROOMSTACK.swapin->neighbors.up) + ROOMSTACK.bottom->prev = ROOMSTACK.top + ROOMSTACK.bottom->next = NULL + ROOMSTACK.bottom->room = roomgen(ROOMSTACK.swapin->neighbors.down) + roomstackobj__push(ROOMSTACK,roomgen(ROOM->neighbors.west)) + roomstackobj__push(ROOMSTACK,roomgen(ROOM->neighbors.south)) + roomstackobj__push(ROOMSTACK,roomgen(ROOM->neighbors.east)) + roomstackobj__push(ROOMSTACK,roomgen(ROOM->neighbors.north)) + // uncomment and let leak when tracing pointers in a core dump to get a refrence struct prototype + /* struct roomstackobj * tmp = malloc(sizeof(struct roomstackobj)); + * tmp->next = 0xaaaaaaaa + * tmp->prev = 0xffffffff + * tmp->room = 0xbaadf00d + */ + } \ No newline at end of file diff --git a/src/squoze.c b/src/squoze.c new file mode 100644 index 0000000..d9b896c --- /dev/null +++ b/src/squoze.c @@ -0,0 +1,77 @@ +ushort squoze(char[3] ascii) { + return squozebit(ascii[0]) + (40 * squozebit(ascii[1])) + (1600 * squozebit(ascii[2])); + } + +uchar squozebit(char ascii) { + if (ascii <= ' ') {return 0} + else { + switch ascii : + case 'A' : + case 'a' : return 1; + case 'B' : + case 'b' : return 2; + case 'C' : + case 'c' : return 3; + case 'D' : + case 'd' : return 4; + case 'E' : + case 'e' : return 5; + case 'F' : + case 'f' : return 6; + case 'G' : + case 'g' : return 7; + case 'H' : + case 'h' : return 010; + case 'I' : + case 'i' : return 011; + case 'J' : + case 'j' : return 012; + case 'K' : + case 'k' : return 013; + case 'L' : + case 'l' : return 014; + case 'M' : + case 'm' : return 015; + case 'N' : + case 'n' : return 016; + case 'O' : + case 'o' : return 017; + case 'P' : + case 'p' : return 020; + case 'Q' : + case 'q' : return 021; + case 'R' : + case 'r' : return 022; + case 'S' : + case 's' : return 023; + case 'T' : + case 't' : return 024; + case 'U' : + case 'u' : return 025; + case 'V' : + case 'v' : return 026; + case 'W' : + case 'w' : return 027; + case 'X' : + case 'x' : return 030; + case 'Y' : + case 'y' : return 031; + case 'Z' : + case 'z' : return 032; + case '$' : return 033; + case '_' : + case '.' : return 034; + case '0' : return 036; + case '1' : return 037; + case '2' : return 040; + case '3' : return 041; + case '4' : return 042; + case '5' : return 043; + case '6' : return 044; + case '7' : return 045; + case '8' : return 046; + case '9' : return 047; + default : return 035; + } + } + } \ No newline at end of file diff --git a/src/structs.messy b/src/structs.messy new file mode 100644 index 0000000..760b7c9 --- /dev/null +++ b/src/structs.messy @@ -0,0 +1 @@ +/*empty*/ diff --git a/src/structs.messymessy b/src/structs.messymessy new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/structs.messymessy @@ -0,0 +1 @@ +