2,013,312 events, 1,161,701 push events, 1,626,830 commit messages, 101,011,727 characters
Merge pull request #179 from Lamasmaster/I-am-actually-stupid-oh-god-oh-fuck
3AM pr go brr
<style> img { height: 250px; width: 250px; border-image: url(images3.png); } #b { border: dashed gainsboro 5px; display: block; margin-left: auto; margin-right: auto; width: 250px; border: dashed whitesmoke 5px; } #a { border-image: url(images.png); } h { font-size: 50px; color: green; font-family: georgia; text-shadow: 18px 17px 15px red; } </style>
Distance cannot keep us apart anymore us because our hearts are bonded in a heavenly relation.
Many more months will go like this one but our love will only be stronger day by day!
Nothing can make me realize that you are not with me, that you are so far away from me.
Because, whenever I close my eyes, I can feel you right beside me. Happy Monthsary!
Time will fly, people will change and colors of life will disappear. But one thing will remain constant.
That is My Love for You! Happy monthsary Slark (A.K.A Maria Fe Juit!) Come back soon and give me a hug!
I'M FLEXIN YOUR PICTURES COZ I'M PROUD OF IT! <style> img {
height: 250px;
width: 250px;
border-image: url(images3.png);
}
#b {
border: dashed gainsboro 5px;
display: block;
margin-left: auto;
margin-right: auto;
width: 250px;
border: dashed whitesmoke 5px;
}
#a {
border-image: url(images.png);
}
h {
font-size: 50px;
color: green;
font-family: georgia;
text-shadow: 18px 17px 15px red;
}
</style>
</head>
<h1><u>HAPPY 9TH MONTHSARY OF STAYING IN MY LIFE</u></h1>
<body>
<div class="box">
<p class="font-set" id="border-img">
<del>Distance</del> cannot keep us apart anymore us because our <span class="s"> hearts are bonded in a heavenly relation.</span><br>
Many more months will go like this one but our love will only be stronger day by day!<br>
Nothing can make me realize that you are not with me, that you are so far away from me.<br>
Because, whenever I close my eyes, I can feel you right beside me. Happy Monthsary!<br>
<br>
<sup>Time will fly</sup>,<span class="a"> <em>people will change and colors of life will disappear</em></span>. But one thing will remain constant.<br>
That is <span class="r">My Love for You!</span> Happy monthsary Slark (A.K.A Maria Fe Juit!) Come back soon and give me a hug!<br>
</p>
</div>
<br><br><br><br>
<hr>
<h2>💖HERE IS OUR PICTURE TOGETHER:💖</h2>
<div id="b">
<img src="slark.jpg"/>
<img src="slark1.jpg"/>
<img src="slark2.jpg"/>
<img src="slark3.jpg"/>
<img src="slark4.jpg"/>
<img src="slark5.jpg"/>
</div>
<hr>
<h3>FACT:<strong><em>Your winning face makes my heart melt</em></strong>😊💖</h3>
<div id="a">
<img src="solo1.jpg"/>
<img src="solo2.jpg"/>
<img src="solo5.jpg"/>
<img 2 src="solo3.jpg"/>
<img src="solo4.jpg"/>
</div>
<hr><br><br>
<h><center>I'M FLEXIN YOUR PICTURES COZ I'M PROUD OF IT!</center></h>
</body>
Create submitting-content-removal-requests.md
http://open-source-parsers.github.io/jsoncpp-docs/ makes my personal account data and everything in devices go through shares setup by other organizations.Please help me figure out all of this thank you.God Bless your all
Hotfix 4 + A Greedsphere
-) (30 - 31 / 10 / 2020) +) Hidden on the game, only spawnable with summon command, but... Meet the greedsphere! // x2 Credits for 15 seconds! (30 with the Player Up. Powerup Upgrade) *) Fixed up the spawning tids for the SF maps, that should set the monsters correctly. *) Just to add a little bit of softness for the SF02 map. Archons of hell and Dark Dogs(New!) will come to cause some grief! // Not a big fan of the difficulty spike when the cyberdemons come. *) Now the damage hud, can be streched depending on the aspect ratio! *) Now, the batteries should'nt be revived by the archviles. +) Added the cvars: sfp_minrecap (Minimum monsters before recapturing) and sfp_monstercap (Max monsters)
-) (28 - 29 / 10 / 2020) *) Re-factorized the inventoy item's decorate. Less code, more read. +) Added the fp_puhud.acs, showing you the current powerups you got in your blood! *) Now, when going no-hud, the old hud will not be shown.
Fix crewmates being drawn behind other entities
This fixes the draw order by drawing all other entities first, before then drawing all humanoids[1] after, including the player afterwards.
This is actually a regression fix from #191. When I was testing this, I was thinking about where get a crewmate in front of another entity in the main game, other than the checkpoints in Intermission 1. And then I thought about the teleporters, because I remember the pre-Deep Space cutscene in Dimension Open looking funny because Vita ended up being behind the teleporter. (Actually, a lot of the cutscenes of Dimension Open look funny because of crewmates standing behind terminals.)
So then I tried to get crewmates in front of teleporters. It actually
turns out that you can't do it for most of them... except for Verdigris.
And then that's what I realized why there was an oddity in WarpClass.cpp
when I was removing the active
system from the game - for some reason,
the game put a hole in obj.entities
between the teleporter and the
player when loading the room Murdering Twinmaker. In a violation of
Chesterton's Fence (the principle that you should understand something
before removing it), I shrugged it off and decided "there's no way to
support having holes with my new system, and having holes is probably
bad anyway, so I'm going to remove this and move on". The fact that
there wasn't any comments clarifying the mysterious code didn't help
(but, this was 2.2 code after all; have you seen 2.2 code?!).
And it turns out that this maneuver was done so Verdigris would fill that hole when he got created, and Verdigris being first before the teleporter would mean he would be drawn in front of the teleporter, instead of being behind it. So ever since b1b1474b7bbc3ceddea24f689a7ddb050cfe4490 got merged, there has actually been a regression from 2.2 where Verdigris got drawn behind the teleporter in Murdering Twinmaker, instead of properly being in front of it like in 2.2 and previous.
This patch fixes that regression, but it actually properly fixes it
instead of hacking around with the active
system.
Closes #426.
[1]: I'm going to go on a rant here, so hear me out. It's not explicitly stated that the characters in VVVVVV are human. So, given this information, what do we call them? Well, the VVVVVV community (at least the custom levels one, I don't think the speedrunning community does this or is preoccupied with lore in the first place) decided to call them "villis", because of the roomname "The Villi People" - which is only one blunder in a series of awful headcanons based off of the assumption that the intent of Bennett Foddy (who named the roomnames) was to decree some sort of lore to the game. Another one being "Verdigris can't flip" because of "Green Dudes Can't Flip". Then an OC (original character) got named based off of "The Voon Show" too. And so on and so forth.
init
Use scss for customization
Some progress!
Merge multiple scss into main.scss
Generate source-maps
Add acid to index brand-search
Lint some files & update styles
Don't have space before named functions
Add acid to layout on index
Darken the acid
'Modern' buttons for language switching
Add fontawesome
Add night mode button (decorative for now
Make acid faster & use normal distribution
Add categories section to index
Common file for categories and SearchBox component
Actively match acid size to hero
Fix categories overflow & carousel RTL
Larger carousel
Replace SearchBox with b-input
Make initial demo ready
Add PCB to acid (yes, not the reverse)
Make acid a seperate component
Make demo deployment easier AF
Switch to premade palette
Space out index brand letters
Do not crash on missing element
Add blur to acid
Replace en digits with fa
Fix mistakenly commented out nuxt on demo.sh
Move categories spacing from margin to padding
Remove acid blur
Add about page
Fix indention and acid overflow
Match acid with new color palette
Add logo
Change pcb to nagative version
Add gradient to navbar
Glassy everyting
Enhance layout spacing
Put all fonts in one place
Add content image background
Remove acid; customer is stupid
Move logo to images directory
Unified root dir permissions
Cover background
Change bg image
Change index
Update footer
Login page
Comment out homepage carousel
Componentify site footer
Add input.svg
Support theme switching
Remove default favicon
Add empty videos page
Almost finalize login page
Animate login form
Ignore design directory
Change background image
Add hvr-bob to login button
Login form border glow effect
Match login checkbox style with others
Dont ruin github storage
Fix checkbox bug on firefox
GC after gh-pages update
Add more glow to login form border, style return button
Update to upsteam gh-pages before syncing
Use backdrop filter instead of stupid hacks
Prevent button rules to interfer with other pages
Move global navbar to separate component
Fix unmoved data.lightThemed during refactor
Add site-header to index page
Add prefix to index css to prevent rule clash
Use different backgrounds for different sections of index
Simple video trickery
Animate index cards
Footer bg & email sub style
Resize footer elements
Change index > header background
Add e-namad and razi img to footer
Fix categories submenu conflict with vitrine header
Add google button to login form
Add avatar image
Change login page background
Stretch index images
Fix firefox mobile login background not playing
Add green overlay to index categories background
Fix categories overflow on mobile
Add worms to footer
Add worms to index-header
Slow down worms
Change worms background
Add index background effect
Increase hunger for cpu on index
Fix digital pipes filter
Move worms logic to separate module
Move pipes logic to separate module
Use source-maps (FF fix)
Do not store a value not needed
Optimize pipes allocations
Free worms from the yoke of the evil circle
Refactor particle as Worm
Refactor Can.move to Worm.move
Dissolve Can.birth
Remove unused variables
Fix worms extinction
Be proud of the avatar you've designed
Add transparency to searchbox
Add lang-switch buttons
Use pipes for login background
Fix index hero icons
Add daily offers link to index categories
Add course image
Remove duplicate css of index page
Disable source map on production
Use embedded svg for searchbox
Reduce image size and add index card bg
Add the fucking social links
Make index vitrin items smaller
Index vitrin details
Add social sharing links to footer
Update packages
Make vitrin a saparete component
login bottun
login Btn
Complate btn login
complate all btn login
google btn complate
Fix stupid margin
Update vitrin course background
Change theme switch icons
Add archives page
Rapair Login Page
Finish Social Network
Fix navbar items on index page
Finish Edit Main Menu
change btn email sender
Remove empty style from DigitalPipes
Lint scss of components
Lint styles with stylelint
Fix linting issues on scss assets
Move social buttons to its own component
Remove unnecessary mixin in SocialButtons
Deploy to gh-pages branch
Make vitrin background larger
Fix social button circle center
Move theme-switch to its component
Add likes to vitrin
Hide navbar-end on mobile
add no-image
Fix linting errors
Incomplete background change
Add Animation To Main Logo
Start Background Header
Finish Social Network
delete background header and footer
Harchy Comment shode baraye logo hast.
Finish Edit Main Menu
unable edit for last child menu
ununable edit color border for logo menu
Add Feather to vitrin
edit vitrin and add new pic
Finish edit button lang , send , login
fix small error in btn index
Edit Last News in Footer
I am Logo...Logo...Logo
Fix a Smal Error
Edit Desighn About Page
Edit No-Picture For Vitrin
Lint all styles
edit vitrin and add new pic
Finish edit button lang , send , login
fix small error in btn index
Create Register
End Edit Desighn Register
Finish All work for Register ... But Responsive
Add Massage in to code ( Add Capcha!)
Add Background And Add Animation To Login
Support linting with autofix
Autofix SCSSes
Lint all SCSS
Add shiny effect to lang switches
Remove all webkit prefixes, automatically generated
Create 404 Page
Move honey comb to separate component
Make vitrin more mobile-friendly
Fix 404 background
Support deployment via Travis
Ignore dekstop.ini files
Fix gone logo
Fix mobile view of lang and theme switches
Fix overgeneralized rules of about page
Switch from b-navbar to custom navbar
Switch to Vuex store for theming
Fix excess faDigits used
Remove excess isIndex property of c/SiteNavbar
Hide avatar on touch devices
Update 404 Page
Working on PHASE 1 of the cyclic reference refactor (commit ): added code to the 'end of life' of the application run to:
- verify that all threads have terminated properly (okay, I just check the SafeThreadPool so there's a bunch out there which are still unguarded, but that should be fine.)
- verify that all libraries are 'unloaded' properly: we're VERY interested to know whether anyone is keeping illegal references at the end, because the libraries sticking around after this means there's still cyclic dependencies the .NET garbage collector chokes on.
- monitor the .NET heap at the end right there to observe if it is actually cleaned up the way we'ld expect of a decent application (one without nasty cyclic dependencies)
This is the sort of noise we want to hear at the very end (this example is me quitting the app by clicking the close button during a load of 30+ libraries in various corrupted states -- old backups of mine thanks to Commercial Qiqqa b0rking a giant street pizza several times and which once triggered me into doing a reverse engineer over at: https://github.com/GerHobbelt/qiqqa-revengin (God, was I upset! 20K+ libraries dropping out from under me, just like that!)
Anyway, the good noise your looking for is that 278MByte number dropping like a brick at the very end:
20201101.101627 [Q] INFO [4] [278.779M] WebLibrariesChanged: Breaking out of UI update due to application termination
20201101.101627 [Q] INFO [4] [278.787M] -Notifying everyone that web libraries have changed
The thread 0x66a4 has exited with code 0 (0x0).
20201101.101627 [Q] INFO [Main] [278.647M] UnloadAllLibraries: Heap after forced GC compacting at the end: 278646892
20201101.101627 [Q] INFO [Main] [278.647M] Making sure all threads have completed or terminated...
20201101.101627 [Q] INFO [Main] [5.932M] -static Heap after forced GC compacting at the end (in the wait-for-all-threads-to-terminate loop): 5931812 Bytes, 0 tasks active
20201101.101628 [Q] INFO [Main] [5.932M] Last machine state observation before shutting down the log at the very end of the application run: Heap after forced GC compacting: 5931812 Bytes, 0 tasks active, 14 seconds overtime unused (more than zero for this one is good!)
User benefit: Qiqqa now shuts down promptly and safely during long running multiple library loads (tested with a rig with 30+ very large and corrupted commercial Qiqqa backups, plus extras).
Update Mercator projection
The existing formulation for the Mercator projection is "satisfactory"; it is reasonably accurate. However for a core projection like Mercator, I think we should strive for full double precision accuracy.
This commit uses cleaner, more accurate, and faster methods for computing the forward and inverse projections. These use the formulation in terms of hyperbolic functions that are manifestly odd in latitude
psi = asinh(tan(phi)) - e * atanh(e * sin(phi))
(phi = latitude; psi = isometric latitude = Mercator y coordinate). Contrast this with the existing formulation
psi = log(tan(pi/4 - phi/2))
- e/2 * log((1 + e * sin(phi)) / (1 - e * sin(phi)))
where psi(-phi) isn't exactly equal to -psi(phi) and psi(0) isn't guaranteed to be 0.
There's no particular issue implementing the forward projection, just apply the formulas above. The inverse projection is tricky because there's no closed form solution for the inverse. The existing code for the inverse uses an iterative method from Snyder. This is the usual hokey function iteration, and, as usual, the convergence rate is linear (error reduced by a constant factor on each iteration). This is OK (just) for low accuracy work. But nowadays, something with quadratic convergence (e.g., Newton's method, number of correct digits doubles on each iteration) is preferred (and used here). More on this later.
The solution for phi(psi) I use is described in my TM paper and I lifted the specific formulation from GeographicLib's Math::tauf, which uses the same underlying machinery for all conformal projections. It solves for tan(phi) in terms of sinh(psi) which as a near identity mapping is ideal for Newton's method.
For comparison I also look at the approach adopted by Poder + Engsager in their TM paper and implemented in etmerc. This uses trigonometric series (accurate to n^6) to convert phi <-> chi. psi is then given by
psi = asinh(tan(chi))
I tested just the routines for transforming phi <-> psi from merc.cpp and measured the errors (converted to true nm = nanometers) for the forward and inverse mapping. I also included in my analysis the method used by etmerc. This uses a trigonometric series to convert phi <-> chi = atan(sinh(psi)), the conformal latitude.
forward inverse
max rms max rms
old merc 3.60 0.85 2189.47 264.81
etmerc 1.82 0.38 1.42 0.37
new merc 1.83 0.30 2.12 0.31
1 nm is pretty much the absolute limit for accuracy in double precision (1 nm = 10e6 m / 2^53, approximately), and 5 nm is probably the limit on what you should routinely expect. So the old merc inverse is considerably less accurate that it could be. The old merc forward is OK on accuracy -- except that if does not preserve the parity of the projection.
The accuracy of etmerc is fine (the truncation error of the 6th order series is small compared with the round-off error). However, situation reverses as the flattening is increased. E.g., at f = 1/150, the max error for the inverse projection is 8 nm. etmerc is OK for terrestrial applications, but couldn't be used for Mars.
Here's what I get with g++ -O3 on various Linux machines with recent versions of g++. As always, you should take these with a grain of salt. You might expect the relative timings to vary by 20% or so when switching between compilers/machines. Times per call in ns = nanoseconds.
forward inverse
old merc 121 360
etmerc 4e-6 1.4
new merc 20 346
The new merc method is 6 times faster at the forward projection and modestly faster at the inverse projection (despite being more accurate). The latter result is because it only take 2 iterations of Newton's method to get full accuracy compared with an average of 5 iterations for the old method to get only um accuracy.
A shocking aspect of these timings is how fast etmerc is. Another is that forward etmerc is streaks faster that inverse etmerc (it made be doubt my timing code). Evidently, asinh(tan(chi)) is a lot faster to compute than atan(sinh(psi)). The hesitation about adopting etmerc then comes down to:
-
the likelihood that Mercator may be used for non-terrestrial bodies;
-
the question of whether the timing benefits for the etmerc method would be noticeable in a realistic application;
-
need to duplicate the machinery for evaluating the coefficients for the series and for Clenshaw summation in the current code layout.
The Mercator routines used the the Snyder method, pj_tsfn and pj_phi2, are used in other projections. These relate phi to t = exp(-psi) (a rather bizarre choice in my book). I've retrofitted these to use the more accurate methods. These do the "right thing" for phi in [-pi/2, pi/2] , t in [0, inf], and e in [0, 1). NANs are properly handled.
Of course, phi = pi/2 in double precision is actually less than pi/2, so cos(pi/2) > 0. So no special handling is needed for pi/2. Even if angles were handled in such a way that 90deg were exactly represented, these routines would still "work", with, e.g., tan(pi/2) -> inf.
(A caution: with long doubles = a 64-bit fraction, we have cos(pi/2) < 0; and now we would need to be careful.)
As a consequence, there no need for error handling in pj_tsfn; the HUGE_VAL return has gone and, of course, HUGE_VAL is a perfectly legal input to tsfn's inverse, phi2, which would return -pi/2. This "error handling" was only needed for e = 1, a case which is filtered out upstream. I will note that bad argument handling is much more natural using NAN instead of HUGE_VAL. See issue #2376
I've renamed the error condition for non-convergence of the inverse projection from "non-convergent inverse phi2" to "non-convergent sinh(psi) to tan(phi)".
Now that pj_tsfn and pj_phi2 now return "better" results, there were some malfunctions in the projections that called them, specifically gstmerc, lcc, and tobmerc.
-
gstmerc invoked pj_tsfn(phi, sinphi, e) with a value of sinphi that wasn't equal to sin(phi). Disaster followed. I fixed this. I also replaced numerous occurrences of "-1.0 * x" by "-x". (Defining a function with arguments phi and sinphi is asking for trouble.)
-
lcc incorrectly thinks that the projection isn't defined for standard latitude = +/- 90d. This happens to be false (it reduces to polar stereographic in this limit). The check was whether tsfn(phi) = 0 (which only tested for the north pole not the south pole). However since tsfn(pi/2) now (correctly) returns a nonzero result, this test fails. I now just test for |phi| = pi/2. This is clearer and catches both poles (I'm assuming that the current implementation will probably fail in these cases).
-
tobmerc similarly thinks that phi close to +/- pi/2 can't be transformed even though psi(pi/2) is only 38. I'm disincline to fight this. However I did tighten up the failure condition (strict equality of |phi| == pi/2).
builtins.gei: I tightened up the tests for merc (and while I was about it etmerc and tmerc) to reflect full double precision accuracy. My test values are generated with MPFR enabled code and so should be accurate to all digits given. For the record, for GRS80 I use f = 1/298.2572221008827112431628366 in these calculations.
pj_phi2_test: many of the tests were bogus testing irrelevant input parameters, like negative values of exp(-psi), and freezing in the arbitrary behavior of phi2. I've reworked most for the tests to be semi-useful. @schwehr can you review.
I've updated merc.rst to outline the calculation of the inverse projection.
phi2.cpp includes detailed notes about applying Newton's method to find tan(phi) in terms of sinh(psi).
lcc needs some tender loving care. It can easily (and should) be modified to allow stdlat = +/- 90 (reduces to polar stereographic), stdlat = 0 and stdlat_1 + stdlat_2 = 0 (reduces to Mercator). A little more elbow grease will allow the treatment of stdlat_1 close to stdlat_2 using divided differences. (See my implementation of the LambertConformalConic class in GeographicLib.)
All the places where pj_tsfn and pj_phi2 are called need to be reworked to cut out the use of Snyder's t = exp(-psi() variable and instead use sinh(psi).
Maybe include the machinery for series conversions between all auxiliary latitudes as "support functions". Then etmerc could use this (as could mlfn for computing meridional distance). merc could offer the etmerc style projection via chi as an option when the flattening is sufficiently small.
"9:30am. Got up 15m ago, and am checking out how to remove the XP cap. I want to see what kinds of spells sorcs get. The problem with wizards is that even though they are better, I can't find many of the spells I want to cast.
10:30am. The main problem in my campaign is that I am having trouble getting my hands on all the high level spells I'd want my wizard to cast. But the sorcerer is not a solution to this problem - their selection is just so damn tiny, I'd pick a wizard over a sorc even in this situation.
Their spell selection is just so limited and some of the spells that are really good early on, like sleep for example you'd want to swap for something better. Some like identify are very situational.
10:35am. Since things went like this, I guess I'll skip the morning session. I'll get breakfast while I watch more of those spell videos by Daveorn, do the chores and then get to finishing the package manager. That is the way things should go.
10:40am. I guess you could say that I spent my morning playing, but this is not my usual playstyle.
When I was a kid, the true joy of playing a game like Baldur's Gate was exploration. Right now, I do not care about that at all. Instead I am acting like a real wizard and am playing to master it. I pretty much skipped all of trivial areas and am charging forward. The fun part is abusing your knowledge to challenge areas what would otherwise be beyond my ability. The same goes for enemies. Fighting groups alone is fun.
Yesterday I tried fighting Drizzt, but he is too tough. I want to blast him with spells, but according to the wiki his magic resistance is 98%. I wish I had Lower Resistance, I also see that many spells beside it also lower it, but as I said, I am having difficulty getting my hands on those. So I will recruit Viconia and her cast Magic Resistance which is a divine spell that will set his MR to 18%. That will make him a lot more palatable to deal with.
10:50am. Sure I could get a party of archers and drag him around the map while they kite him, another way kill him is to use the familiar exploit on the wiki, but I do not want to set up a bunch of people together just for this one encounter. Neither do I want to exploit an obvious bug. I want the satisfaction of doing it with my own hands!
12:10pm. I need to start.
1:10pm. Let me start. Wow, it is not like I am even intending to waste time today. It just went by in the blink of an eye.
I need to get some programming done.
My mind is too much in disarray. I am really so far from the ideal programmer that is only focused on the task at hand. But there are some brief times where I live up to that, so let me try to tap into that now.
Forget Baldur's Gate wizard strategies, focus on programming.
I am enjoying life a bit too much lately. I need to get back into the torment.
v.packages |> List.iter (fun (r,sub) ->
if cur = sub then // TODO: Should this check be here?
circular_nodes.Add(cur) |> ignore
errors.Add(r,sprintf "Self references are not allowed.")
Yesterday I did this and ended up wondering where should I do the check.
Well, the check for duplicates, I am going to do in the config parser.
Actually, the duplicate check for files I am going to move outside the config parser, and do it in the validator. I do not want parsing to fail for resumable errors...
| Success(a,userstate,_) ->
if userstate.Count > 0 then userstate.ToArray() |> ResumableError |> Result.Error else Result.Ok a
Actually, I am going to return a list of resumable errors along with the schema here. That is the way to improve error handling, but never mind that for now. Let me just get the package manager to work. Then I will clean it up. Once I have that, I'll be able to move to the next part of the pipeline.
1:20pm. Focus me, even now I am still thinking about wizards.
v.packages |> List.iter (fun (r,sub) ->
if cur = sub then // TODO: Should this check be here?
circular_nodes.Add(cur) |> ignore
errors.Add(r,sprintf "Self references are not allowed.")
What I am going to do here is simply this...
v.packages |> List.iter (fun (r,sub) ->
if cur = sub then
errors.Add(r,sprintf "Self references are not allowed.")
I do not feel comfortable adding it to circularity list.
1:25pm. Yeah, let me just crush this thing today. I will fix it up later. Things do end up being strewn about.
There is so much to think about and it burdens me. In times like that, I should just remember my determination and do it one thing at a time.
1:30pm. Let me get back to testing. This one change should fix the server crashing on self references.
let open' (schemas : Dictionary<_,_>) links loads errors dir text =
match schemas.TryGetValue(dir) with
| true, Ok _ -> Job.unit()
| true, Error _ | false, _ ->
load !loads text dir >>= fun m ->
let dirty_nodes, m = validate schemas links m dir
loads := m
Array.iterJob (fun dir ->
match schemas.[dir] with
| Ok x -> Src.value errors {|uri=spiproj_link dir; errors=Array.append x.schema.errors x.package_errors|}
| Error _ -> Job.unit()
) dirty_nodes
I am noticing that when I add a new project, I need to save it in order to try and have it revalidated.
let change (schemas : Dictionary<_,_>) links loads errors is_open dir text =
match schemas.TryGetValue(dir) with
| true, Ok _ when is_open -> Job.unit()
| _ ->
schemas.Remove(dir) |> ignore
load (Map.remove dir !loads) text dir >>= fun m ->
let dirty_nodes, m = validate schemas links m dir
loads := m
Array.iterJob (fun dir ->
match schemas.[dir] with
| Ok x -> Src.value errors {|uri=spiproj_link dir; errors=Array.append x.schema.errors x.package_errors|}
| Error x -> Job.unit()
) dirty_nodes
let supervisor fatal_errors errors =
let req = Src.create()
let schemas = Dictionary()
let links = create_mirrored_graph()
let loads = ref Map.empty
let change = change schemas links loads errors
Src.tap req |> consumeJob (function
| SOpen(dir,text) -> change true dir text
| SChange(dir,text) -> change false dir text
Let me do it like this.
1:55pm. Focus me. Let me give this a try.
Works perfectly. Now the errors are getting propagated as one would expect.
2pm. Focus...what is next is that I want to deal with project file deletions.
Let me take care of that.
2:10pm.
| ProjectFileDelete x -> Src.value supervisor (SChange(dir x.uri, None)) |> Hopac.start; send_back null
Focus me, focus. Let me try this out. For regular files, I won't do project revalidation as it would be too much work.
2:15pm. Just do this thing, stop thinking about throwing rocks at ogres.
Server bound to: tcp://*:13805
Unhandled exception: System.Collections.Generic.KeyNotFoundException: The given key 'c:\Users\Marko\Source\Repos\The Spiral Language\VS Code Plugin\spiral\subs\f' was not present in the dictionary.
The stupid thing crashed...
let change (schemas : Dictionary<_,_>) links loads errors is_open dir text =
match schemas.TryGetValue(dir) with
| true, Ok _ when is_open -> Job.unit()
| _ ->
schemas.Remove(dir) |> ignore
load (Map.remove dir !loads) text dir >>= fun m ->
let dirty_nodes, m = validate schemas links m dir
loads := m
Array.iterJob (fun dir ->
match schemas.[dir] with // <-- The exception happens here.
| Ok x -> Src.value errors {|uri=spiproj_link dir; errors=Array.append x.schema.errors x.package_errors|}
| Error x -> Job.unit()
) dirty_nodes
2:30pm. Taking a short breather.
I need to figure this out. Damn, how complicated this is.
2:35pm. I've gone through it with a debugger. The problem is definitely in the...
let dirty_nodes, m = validate schemas links m dir
...part.
schemas.Remove(project_dir) |> ignore
remove_links links project_dir
dirty_nodes.Add(project_dir) |> ignore
loop project_dir
Come to think of it, this does remove and reinsert it.
let order, circular_nodes = circular_nodes links dirty_nodes
order |> Array.iter (fun cur ->
match loads.[cur] with
| Ok v ->
let is_circular = circular_nodes.Contains(cur)
let links = ResizeArray()
let errors = ResizeArray()
v.packages |> List.iter (fun (r,sub) ->
if cur = sub then
errors.Add(r,sprintf "Self references are not allowed.")
elif circular_nodes.Contains(sub) then
let rest = if is_circular then " and the current package is a part of that loop." else "."
errors.Add(r,sprintf "This package is circular%s" rest)
else
match schemas.[sub] with // Note: This key index might fail if the circularity check is not done first.
| Ok x when 0 < x.schema.errors.Length || 0 < x.package_errors.Length -> errors.Add(r,"The package or the chain it is a part of has an error.")
| Ok _ -> links.Add(r,spiproj_link sub)
| Error x -> errors.Add(r,x)
)
schemas.[cur] <- Ok {schema=v; package_links=links.ToArray(); package_errors=errors.ToArray()}
| Error x ->
schemas.[cur] <- Error x
)
order, cleanup()
And there is no way it should be able to go past this without being added. So that means that cleanup
is the culprit again.
2:50pm. Yeah, it is there at the start, but for some reason when the deletion happens, the links are completely empty.
Why is this happening?
The code is so complex that I cannot easily answer this question.
3pm. I am thinking about this wrong. All this time I am wondering why the links aren't there, but at this point, the package that points to f
is not even loaded. So it makes complete sense that the graph would be empty.
3:05pm.
Array.iterJob (fun dir ->
match schemas.TryGetValue(dir) with
| true, Ok x -> Src.value errors {|uri=spiproj_link dir; errors=Array.append x.schema.errors x.package_errors|}
| _ -> Job.unit()
) dirty_nodes
This should fix it. And indeed, it is a natural fix.
I actually thought of doing this first, but making changes without understanding why the error occured is dangerous. I never do it.
Let me try running this again.
3:10pm. Things work perfectly now.
As my next trick, I really should take care of duplicate packages.
I'll move circularity checking to that place as well.
3:15pm. Had to take a tiny break. Let me do this.
Right now I am just cleaning up.
let packages =
let packages = HashSet()
let validate_package d (r,x) =
try // The validator needs the backwards links even for files that are currently missing, but might exist.
let x = DirectoryInfo(Path.Combine(d,x)).FullName
if d = x then errors.Add(r,"Self references are not allowed."); None
elif packages.Add(x) then Some(r, x)
else errors.Add(r,"Duplicates are not allowed."); None
with e -> errors.Add(r, e.Message); None
Let me do this.
Ah, no wait. Shit. I did the self reference check wrong.
if project_dir = x then errors.Add(r,"Self references are not allowed."); None
It should not be d
here.
3:30pm. Ok, now it works. My masterpiece.
Though it on a very small scale, I think I've now tested everything that I had wanted to.
3:40pm. Getting to this point too a while. I had to write a bit over 300 lines of code to get all the functionality that I'd wanted. There was a lot peeling to do.
3:45pm. Let me commit here.
At this point, I need to ask myself - what is next?"
"3:50pm. Yeah, I don't think I have anything else I want to do before starting work on the next step.
Let me step away from the screen for half an hour so I can think about it. It is time to move to the next stage. I've dreamed about this for a long time and it will finally be time to do it.
While I am doing this, I will also take the change to go back and make the nominals and prototypes have a package id as a part of their identity. I said that a flat number would not do the trick. It needs to be a package_id, tag
pair
I'll leave that for last though.
3:55pm. Since this will be so complex, I am going to stick to my principles strongly and try to not get tangled up in the details. Instead I will loosen up and just focus on what a single function should be doing and not make too many assumptions about anything else.
Ultimately, there are very real limits to how much I can understand about the code I am writing myself. I need to be careful not to cross them, and modularizing and abstracting according to those limits is what is good programming.
let change (schemas : Dictionary<_,_>) links loads errors is_open dir text =
match schemas.TryGetValue(dir) with
| true, Ok _ when is_open -> Job.unit()
| _ ->
schemas.Remove(dir) |> ignore
Don't need this last line as validate
will do that anyway. Let me get rid of it.
let load (m : LoadedSchemas) text project_dir =
let m = Map.remove project_dir m
Also let me remove the project dir in here.
This is the way to do it.
4:05pm. Let me just run it. I doubt anything will break, but I should not just assume that the changes will stick.
4:10pm. Everything works as expected. I just moved things around a little, but now things are more integruous. I do not have functions whose purpose should not be to do so removing stuff from the dictionaries and maps.
4:10pm. Let me finally step away from the screen for a bit."
deque now works although not flawlessly, fuck you mean Djevayo with your dEqUe iSnT thAT hArD...
trying my damn'dest to use Ubuntu.. fuck i hate its package repos so much!
Oh boy: It's a BIG DUMB REFACTOR
Yeah, I was thinking that it was just about time that I royally screw up the entire history of my git repo by playing a giant dumb game of musical chairs.
Believe it or not, there's actually a few reasons I wanted to rearrange the project files.
First off, it was a matter of distance. I had everything divided into two categories - assets, or scenes. While this was tidy, it meant that the assets were stored in a parallel directory structure to their corresponding scene. So to rapidly switch between the scene and the asset required a lot more movement and navigation than really made sense. That's the first adjustment we made - grouping together scenes with their assets. Now this isn't perfect, because sometimes we will be reaching across for assets, but it's a pretty good solution in general.
Secondly, the refactor allows me to better position common assets. This was something I was thinking about when I was creating the KinematicDriver script - that's a script that needs to apply to a whole class of different scenes (what I've dubbed "motion AI" because it's AI that moves). So having a motion_ai directory with a common subdirectory allows us to better group our KinematicDriver script with the the scenes that use it. Our common items are now more generally available.
Finally, as time has gone on, we have experienced a natural accrual of unecessary assets and structures. A lot of stuff was left from the Boids prototype, and a lot of the starting directories had been structured to work around the Boid directories. For example, the "formation" directory had been acting as a catch-all since we made it, when it was originally created to differentiate 3D assets from the 2D Boid assets. Refactoring allows us to remove that useless stuff.
Nofall, Godmode, Bstech changes (#10404)
'NOFALL' is now a status flag instead of being a var specific to BSTechs. It allows the mob to move between Z-levels and through empty space; even to 'fly up' against gravity. However the tech can no longer use this to 'phase into' matter if there is something above them.
...for that you want to use Ruin-Everything instead: incorporeal movement now has an additional type that's (still) just like a ninja's, but it also allows you to move between Z-levels.
Adds the anti-gravity verb to the Bluespace Robot preset and starts them with 'NOFALL' on.
When using 'GODMODE' you will no longer take damage when you fall; instead a cool message will be shown and a quiet thump will be played.
'GODMODE' now protects you from the awful effects of running - you can run indefinitely and won't take damage from it.
Thanks to the above changes the BST is now self-contained in a single file (well except for the robot preset).
To facilitate the above changes several godmode and incorporeal checks have been added (mostly to movement procs). It cuts on some extra proc overrides and type checks. Also results in a more 'natural' experience when using NOFALL, GODMODE or incorporeal movement.
Changed incorporeal values to defines.
Added a "darkvision" mode for the BST goggles.
I also updated some of the BST verbs to be more descriptive.
Merge pull request #228 from dreamland-mud/feature/vuln-holy-vs-blessed-drink
Vulnerability to holyness prevents from drinking from a holy source.