there were a lot of events recorded by gharchive.org of which 2,237,335 were push events containing 3,007,576 commit messages that amount to 169,574,206 characters filtered with words.py@e23d022007... to these 88 messages:
fix stupid "this forces us to do things the """right""" way" bullshit from python 3.11 (#79783)
This is likely not the best way to go about this, but i do not want us to capitulate to python3's nanny state, suffocating levels of propriety bullshit.
venv sucks and i fucking hate it.
The Brawlening: Unarmed fighting interactions for shoving, grabbing and nonlethal takedowns (not martial arts) (#79362)
I've tweaked some elements of unarmed fighting to give it additional interactions between the various components, bridging them into a more coherent system and focusing more strongly as tool for disabling opponents nonlethally.
Shoving guarantees that unarmed attacks will land while knocked off-balance (AKA when slowed by a shove).
Being off-balance means that you can be knocked down from a punch if you have taken enough brute and stamina damage combined (at least above 40).
Being off-balance makes you vulnerable to grabs while you have a moderate amount of stamina damage (30 damage), forcing you to have to resist even passive grabs. This pairs exceptionally well with tackling.
Grappling someone makes your unarmed attacks penetrate armor based on a
new limb value called unarmed_effectiveness
. This is something
shared by kicking.
unarmed_effectiveness
has also taken over the functionality of
unarmed_stun_threshold
, as well as accuracy calculations. Human
equivalent limbs (pretty much all of them except mushrooms and golems)
have a value of 10.
Now, unarmed_effectiveness
determines how accurately a given limb
makes unarmed attacks. Unarmed attacks have a base inaccuracy of 20%,
with effectiveness acting as a reduction to this value. (so for humans,
that's 20% - 10% before any value changes from brute and stamina
damage). It is also capped at 75% miss chance, just to avoid those weird
instances of two brawling fighters being incapable of finishing each
other off at a certain amount of damage and it being real awkward, like
it does currently.
It also determines the base probability of landing a knockdown punch. For humans, this is 10%.
For the most part, these two particular changes are roughly equivalent to the current values, just handled in a way that is more straightforward to understand from a code perspective.
In addition to the above, human equivalent limbs have higher damage floors for unarmed attacks. Arms deal 5-10 damage, while legs deal 7-15 damage. In addition, kicks also deal stamina damage, like punches do.
Golems and Mushroom People (who don't even use their limbs for their unarmed strikes because mushroom people start with a martial art) have very accurate punches, and their punches penetrate quite a bit of armor when they are entitled to that. They also have a high knockdown probability. This is partially because they previously already had these features due to the wonky math at play, but also because this is their big thing they are good at.
Carp mutation also got a big win out of this as well. If and when you actually manage to get that to work and matter.
My favorite thing in this game is the robustness of unarmed fighting. It's the part of the game that actually acknowledges the sandbox and environmental interaction in a big way. The only problem with the unarmed combat is that it is a bit disjointed, and often much weaker than using even the most pathetic weapon you can get your hands on unless you're using the stun loops available. Those loops get a bit boring, even if they're mostly all environmental (except for the lucky neckgrab finish). Giving more options generally means that even when not in an ideal position, you still have some options.
It also has some internal inconsistencies in design even in the same proc, like accuracy calculations and knockdowns, as well as weird splits in damage. So I decided to resolve that.
Now, every part of unarmed fighting has some relevance in the other parts. Predominantly, it is heavily favoured towards dealing stamina damage, making unarmed combat very favourable as a nonlethal method of taking someone down, which is something we currently lack considerably. While people may still opt to simply beat someone into actual crit rather than stop at stamina crit, the possibility is actually entirely available and supported now. No just banking on a lucky neckgrab after a shove.
Paying attention to damage dealt and thinking intelligently about how you apply combinations of effects allows even someone on the significant back foot an opportunity for a comeback if they know what they're doing against even armed opponents.
Separating accuracy and knockdown effectiveness from damage allows for more consistent design and readability, but also preventing weirdness ike tighter damage spreads increasing knockdown probabilities as well as increasing accuracy without the coder knowing why. This also lets us make unarmed attacks just that little bit stronger. Since unarmed attacks require more complicated combinations to work, I think this won't make them stronger than weapons necessarily, but it will make for more interesting swung fights.
🆑 add: With the flood of Chi within the Spinward Sector receding, various masters of The Tunnel Arts, colloquially known as 'Maint-fu Masters', have started to refine the basics of their martial techniques. New forms have started to develop within Spacestation 13's hidden maintenance dojos. add: Someone shoved off-balance makes them vulnerable to more guaranteed unarmed strikes, knockdowns from a successful punch, and more difficult to escape grabs. add: Grabbing someone (as well as kicking them while they're on the floor) makes them more vulnerable to taking unarmed attack damage, even if they have armor. balance: Unarmed strikes made with human-equivalent limbs have higher damage floors, meaning you overall do more damage on average while not increasing the overall damage potential. It's more consistent! refactor: Significantly changed how punching accuracy and knockdowns are calculated. balance: Golem and mushroom limbs are a lot more effective at punching as a result of these various changes. As they should be. /🆑
Adds Paddy, the Security Mech (#79376)
-
Adds a new combat mech, Paddy. Paddy is a modified Ripley MK-I, intended for use by the station's security force. Like the MK-I, the Paddy features an open-air cockpit design (and thus does not protect from ranged weapons), but maintains the speed of the base unit. Constructing a Paddy is similar to constructing a MK-II, though the kit requires combat-mech level research. Sprites by DrDiasyl -- The paddy has an internal cargo bay capable of holding up to four individuals (loaded with a hydraulic claw). If the pilot exits the Paddy, any loaded individuals are likewise ejected. Individuals can attempt to resist their way out of the mech, but it requires the mech to be stationary for 45 seconds. If they do this, all individuals in the holding cell are ejected.
-
Adds a new mech equipment piece, the hydraulic claw. Similar to a clamp, this Paddy-exclusive item can load mobs into the Paddy's cargo bay. Humanoid mobs are handcuffed upon loading. The hydraulic claw is unlocked on the same tech node as the Paddy.
-
Adds a round-start Paddy, carrying one peacekeeper disabler and one hydraulic claw, to each security area on all maps. Round-start Paddys are also pre-locked with security access. Security now has access to a mech charger, and a small bay for it all. Map edits were done by Maurukas.
-
Also did some minor cleanup of various mech-related code. Ripley mech cargo is no longer stored in the mech, but within the "ejector" object. This doesn't have any player-facing changes, but it is easier to organize behind the scenes. additionally, if Ripleys are destroyed now, they drop their stored objects rather than deleting them.
Playing lone security is probably one of the least fun aspects of the game. Arresting any assistant is inevitably setting yourself up against the tide as a whole; You try to stun any one person and they crawl out of the woodworks to get in your way, drag off the arrestee, and probably try to steal your gear.
The Paddy is set up to be functional against low-threat targets, but not particularly good against anything with purpose. The round-start Paddy carries the disabler equipment, as well as the law claw, to detain individuals in a somewhat safe manner. Being that you're inside an exosuit, you're immune to shovespam that plagues the halls, and you don't risk dropping important gear quite as easily.
However, The open canopy gives you no protection at all from ranged attacks, nor from atmos hazards. Being that you're in an exosuit, you cannot use other items or equipment. The AI will have trouble finding you to open a door, due to your name not jumping their camera to your location.
🆑 Zxaber, DrDiasyl, Maurukas add: A new security-focused combat mech, the Paddy, has been added, intended to be particularly helpful for lone sec officers. You will find one in the Security main office, and a replacement can be built with late-game mech research. fix: Ripley MK-I and MK-II mechs no longer qdel their stored items when destroyed. /🆑
Co-authored-by: Vire [email protected]
Codifies male goats not having an udder (#79722)
This was addressed in #78759 (1b1fde4908826ef5c54ffc0734e74028270af3fd) and reviewed (and merged even though I didn't respond to it, oh well), but I half-assed it because the whole point was to prevent male goats from having an udder, but I only added it to the subtype of Pete i made in that PR. Let's expand that to all male goats now.
It doesn't make biological nor morphological sense as to why a male goat can provide milk. Ideally this should be like this for all animals (because that's real life) but that's a later issue with further balance implication.
I think it's still an interesting idea that Nanotrasen will just send you any old goat despite it being "useless" beyond being very good at eating plants. Maybe cargo should have a way to guarantee getting a female goat in the future? It's just like real life where zoos and farms have to constantly dealw ith female animals (such as giraffes or other exotic stuff) tending to be far rarer/cost far more than their male variants due to the potential to generate offspring (there's more nuance to husbandry than this but just play along)... and in space, every animal is "exotic".
It still remains possible to biogenerate milk, which tends to be far faster than feeding/milking goats- which is something that the cook should have access to anyways.
🆑 balance: Male Goats should no longer spawn with an udder, instead of it just being Pete. /🆑
Co-authored-by: Ghom [email protected]
Adds a Syndicate Monkey Agent beacon uplink item (#79012)
Adds a Syndicate Monkey Agent beacon uplink item. It spawns a dapper monkey that must follow your orders.
Added a monkey gun case to the uplink, which contains monkey guns! Though they aren't very powerful.
Added a more modularlike subtype for antagonist spawners to reduce future hardcoding.
Gave the syndicate turtleneck a monkey sprite, from SS14!
I want to see the clown driving security insane with 2-3 monkeys and an incredible amount of pranking. Or an assistant killing everyone with his monkey friends while wearing a monkey suit. Or a geneticist sending out mutated monkeys to kill people. Or a scientist equipping his monkeys with bombs or xenobiology equipment and sending them out to wreak havoc.
6 TC is only enough for two monkeys, but you can get a third if you finish any kind of objective.
Added a monkey gun case to the uplink, which contains monkey guns! Though they aren't very powerful.
We can't have the monkey mafia without guns, come on. The guns are weak and only usable by monkeys. Additionally, they're restricted to entertainment only.
Credit to SS14 for the monky turtleneck sprite.
🆑 add: Adds a Syndicate Monkey Agent beacon uplink item. It spawns a dapper monkey that must follow your orders. add: Added a monkey gun case to the uplink, which contains monkey guns! Though they aren't very powerful. refactor: Added a more modularlike subtype for antagonist spawners to reduce future hardcoding. sprite: Gave the syndicate turtleneck a monkey sprite, from SS14! /🆑
Co-authored-by: ATH1909 [email protected] Co-authored-by: Jacquerel [email protected]
Adds pathmaps, refactors pathfinding a bit (#78684)
Implements /datum/pathfind/sssp, which generates /datum/path_map
/datum/path_maps allow us to very efficently generate paths to any turf they contain from their central point.
We're effectively running the single source shortest paths algorithm. We expand from the center turf, adding turfs as they're found, and then processing them in order of addition. As we go, we remember what turf "found" us first. Reversing this chain gives us the shortest possible path from the center turf to any turf in its range (or the inverse).
This isn't all that useful on its own, outside of a few niche cases (Like if we wanted to get the farthest reachable turf from the center) but if we could reuse the map more then once, we'd be able to swarm to/from a point very easily.
Reuse is a bit troublesome, reqiures a timeout system and a way to compare different movables trying to get paths. I've implemented it tho. I've refactored CanAStarPass to take a datum, /datum/can_pass_info. This is built from a movable and a list of access, and copies all the properties that would impact pathfinding over onto itself.
There is one case where we don't do this, pathing over openspace requires checking if we'd fall through the openspace, and the proc for that takes an atom. So instead we use the weakref to the owner that we hold onto, and hold copies of all the values that would impact the check on the datum.
When someone requests a swarmed path their pass info is compared with the pass info of all other path_maps centered on their target turf. If it matches and their requested timeout isn't too short, we just reuse the map.
Timeout is a tricky thing because the longer a map exists the more out of date it gets. I've added a few age defines that let you modulate your level of risk here. We default to only allowing maps that are currently being generated, or finished generating in our tick. Hopefully this prevents falling into trouble, but consumers will need to allow "failed" movements.
As a part of this datumized pass info, I've refactored pathfinding to use access lists, rather then id cards directly. This also avoids some dumbass harddel oppertunities, and prevents an idcard from changing mid path.
Did a few things to the zPass procs, they took args that they did NOT need, and I thought it'd be better to yeet em.
If you'd all like I could undo the caching/can_pass_info stuff if you'd all like. I think it's useful generally because it avoids stuff changing mid pathfind attempt, but if it's too clunky I could nuke it.
Oh also I added optional args to jps that constricts how it handles diagonals. I've used this to fix bot paths.
Much of this is redundant currently. I'm adding it because it could have saved hugglebippers, and because I get the feeling it'll be useful for "grouping" mobs like bees and such. We're doing more basic mob work currently and I want to provide extra tools for that work.
2023-09-29.16-58-07.mp4
🆑 add: Adds swarmed pathfinding, trading accuracy for potential optimization of used correctly fix: Bots will no longer take diagonal paths, preventing weirdo looking path visuals refactor: Refactored bits of pathfinding code, hopefully easier to add new pathfinding strategies now /🆑
Fix segfault when destroying VmaAllocator
I swear to fucking god, this is the most annoying shit possible. I'm still under the impression that manually swapping all class members in the move assignment operator is not how you're supposed to do it, but I can't find anything else online.
Human sounds now depend on body type (#78632)
So there's currently a problem where our human sounds are dependent on whether you are a male or female, however we have 4 genders in-game. This leads to scream sounds being female if you're anything but a Male, and gasp shock sounds being male if you're anything but a Female. This is very inconsistent, and I think as a better way of handling this, it should all be handled by Bodytype, since we only have 2 and is a separate choice from gender. This means regardless of gender, you can still choose what sounds your character will make.
Mostly explained in the about section, this lets people who play as they/them & it/its to decide what they should sound like. I guess as a bonus, it means men now appear more like women if they choose the female bodytype, and vice versa. Or at least I think it's a bonus? I'm not really knowledgeable in this sort of stuff.
I kinda have the same argument as why I think TTS should be accurate. You should be able to customize your character to how you want it, and I think that choosing the non-male/female ones shouldn't give you inconsistent voices.
I actually don't know what to label this.
🆑 code: Your bodytype now decides what gendered sounds you make. /🆑
Mook village and basic mook refactor (#78789)
refactors mooks into basic mooks and re-adds them to the game
this refactors mooks into basic mobs and re adds them to the game. mooks are now a part of lavaland. they come as a part of a random ruin which consist of a entire village of friendly mooks. Mooks will aid players but they will still attack ashwalkers because of some troubled history between them.
mooks are a very diseased specie. nanotrasen discovered a small tribe of mooks and cut a deal with their tribal chief to aid ss13 miners in exchange for medical supplies.
tribal chief in his decked out home
male mooks go out and mine and haul ore off back to their village. they will deposit ores into a stand which is managed by another mook. they will all return to their village to rest once a lavastorm comes.
players can use this stand to withdraw any ore they like
female mooks will stay behind in the village to guard it from ashwalkers. they will also heal male mooks when they come back from a long day of work. the tribal chief is a bum and chooses not to go out and mine. he will stay behind in the village and issue commands to his people rather than work
the village also has its own bard! he follows player visitors and plays nice music for them while they are in the village (although he is not very talented).
he is still a warrior at heart tho so he will be smashing his guitar over ashwalker skull
🆑 refactor: mooks are now basic mobs. please report any bugs feature: added mook village to lavaland ruins! /🆑
Flesh Spiders Regenerate + QoL (#78704)
Replaces the Healing Touch component on Changeling-spawned Flesh Spiders with the Regenerator component, as the comment helpfully suggests. Flesh Spiders can no longer touch themselves to heal, instead they automatically begin regenerating their health if they go four seconds without taking damage. It takes 6 seconds to fully regenerate, so 10 seconds to fully heal from the edge of death (less if you're not that injured).
Also I changed the sprite for flesh spider eggs to a different one we already had rather than regular spider eggs tinted red, just because I felt like it. Would be cool to give the spiders their own sprite some time, but that's for another PR.
Additionally the flavour text for flesh spiders was kind of messed up by being shoved into the objectives box and claiming that it was a directive from a spider queen you don't have, so I gave them their own slightly different antag datum to compensate. It also actually mentions how you heal yourself, which previously was down to trial and error or codediving.
In the course of doing this I decided to just... move flesh spiders to their own type path. It sort of made sense for them to be part of the giant spider typepath, but they keep being modified by changes targetted at "balancing the Giant Spiders antagonist" which this mob isn't related to and doesn't have any reason to follow. The fact that a mob has similar stats to another one isn't automatically a reason to share a typepath, and now that I have looked a little at this mob I'm sort of interested in branching it further away from "it's a spider mob but spawned a different way" in the future.
Finally, this spider egg cluster and the midwife one would prompt ghosts with a radial menu with a single option on it... that's a bit pointless, so we'll bypass that menu if there is only one possible outcome.
Currently Flesh Spiders heal by clicking on themselves and standing still for two seconds, restoring 50% of their HP. This means they can fully regenerate over 4 seconds unless you stun them, and with 90 HP you're not that likely to kill one during the channel time. This just feels like an odd way for the creature to operate, regenerating instead gives it a hit-and-run strategy and adds more use to their webs (maybe we should give them meatier or bloody webs at some point? Might be cool). Also clicking yourself to heal is just unintuitive and I suspect several players just didn't realise they could do it in the first place.
🆑 balance: Flesh Spiders heal automatically over time if they go a short time without taking damage, instead of healing large chunks by clicking themselves and waiting two seconds. qol: Spider egg clusters which only hatch into one kind of spider don't ask you to select that one type from a radial menu with one option on it. qol: As a Flesh Spider, the game now tells you how you can heal yourself. /🆑
Basic Pirate NPCs (#79284)
Converts hostile pirate NPCs to basic mobs - specifically, a subtype of trooper. As their behavior is not meaningfully distinct from other troopers, this conversion mostly just sticks them on the existing AI behavior while keeping the rest the same.
Pirates do have one new thing going for them, though, to differentiate them from other troopers. They use the new plundering attacks component, which means that every time they land a melee attack, they steal money from the bank account of whoever they hit. This requires the target to be wearing an ID with a linked bank account, so it's not the hardest thing in the world to hide your money from them - but it's still something to be wary of! If killed, any mob with this component will drop everything they've stolen in a convenient holochip.
Takes down 5 more simplemobs, and (I think) converts the last remaining trooper-type enemy to be a basic trooper. (It's possible there's more I've forgotten that could use the same AI, though.)
The money-stealing behavior is mostly good because I think it's funny, but it also makes the pirates something a little distinct from "yet another mob that runs at you and punches you until you die". They still do that, but now there's a little twist! This can be placed on other mobs too, if we want to make any other sorts of thieves or brigands.
🆑 refactor: Pirate NPCs now use the basic mob framework. They'll be a little smarter in combat, and if you're wearing your ID they'll siphon your bank account with every melee attack! Beware! Please report any bugs. /🆑
Revolver Heavy Ammo Effect Change (#4706)
This PR changes heavy ammo for the Revolver to knockback a mob and slow them down instead of stunning it.
Combat balance is a precarious and often difficult conversation to hold, ergo I'll lay my biases out on the table at first. I'm a marine main at heart, but I have played a lot of xeno recently to gain a better understanding of their side of the story, enough that I feel confident to make these assertions.
My belief is that the heavy ammo of the revolver is a negative concept for the game, and it needs to be removed, due to its stun factor.
The issue here is readability and prediction. When you see a RPG, you know that it can fire a devastating warhead that can stun and kill T3s. When you see a Warrior, you know it can leap to 4 tiles to stun and drag a Human, when you hear a CAS strike you know exactly what is about to drop. When you see a Queen you know she can stun screech and neuro stun you.
But the issue with the Revolver is it has no obvious tell. It is a small item, that can be fit inside backpacks, holsters, pouches, belts, armour slots. It has no obvious advance warning when you are going to fire it. There is no special uniform requirement making a revolver user standout amongst the crowd. There is no tell.
The problem with the stun revolver is simply that is is a hard counter to all T1s and most T2s. Its ability to stun allows it to perform an attack that is uncounterable to a xeno as a xeno has no way to predict who may be carrying one. A xeno can tell who a Specialist is, a xeno can tell who has a shotgun or flamer or sniper or RPG, you can tell when a mortar is being prepared, or a CAS strike or even an OB. You can see the smartgunner. Even the Scout, a literal cloaked Marine, has to uncloak to fire. You can not tell who has a revolver until they pull it out and stun you. Once you are stunned you die.
A xeno equilivant would be if any Xeno could be carrying a special tool that lets them grab a marine from 7 tiles away and pull them in plus stun them for 2 seconds. But any xenomorph could be using it, including a Lesser Drone.
Perhaps the heavy revolver could be reworked to do something else, but ultimately the only reason anyone takes this ammo is for the stun. Anything else is beating around the bush.
Those are my reasoning's, I'll leave the rest to the powers' that be.
Screenshots & Videos
Put screenshots and videos here with an empty line between the
screenshots and the <details>
tags.
🆑 balance: Revolver Heavy ammo no longer stuns targets it strikes, it will instead knock them back and slow them down for a short time. /🆑
Co-authored-by: Steelpoint [email protected]
Scatter laser shells now use the scatter laser beam, and makes them significantly easier to make. Projectiles can now have damage falloff. (#78927)
Allows for damage falloff to apply to more than just shotgun pellets. Now any projectile can have a damage falloff defined.
Scatter Laser shells no longer use the minigun beams to determine their damage. Instead they use the actually defined scatter laser beams. Those beams do 7.5 damage per pellet, times by 6 pellets.
Scatter laser beams now have damage falloff, a separately defined (positive) wounding power from normal beams, and wound falloff.
Scatter laser shells can be printed from security protolathes once you have weapon tech.
Scatter laser shells may be damaged by EMPs based on severity. The result is that it fires a practically useless volley of laser fire. They cause a honk sound when they hit, so you know when you've shot one of these.
Well, we want shotguns universally to not be defined by their damage output (especially extreme damage output) but by niche.
What does the scatter laser shell currently occupy as a niche?
The single highest damage output of any projectile weapon in direct damage. The thing we don't want of shotguns, and it is reigning champion of all guns.
Okay, that's a bit misleading, because obviously it is competing with the likes of .50 BMG which does 70 damage outright and dismembers limbs, potentially doing upwards of 90 damage if it does, and also hard stuns people. Obviously that is technically a stronger bullet.
But not for raw damage, because the scatter laser does 90 damage out the gate, barring any potential wounding that might occur which increases the damage multiplicatively. No gimmicks, no extra procs, nothing. It's just 15 force lasers (with no damage dropoff) split between 6 beams.
And the reason for this is because this shell has been nerfed once prior by making it not fire 6 normal laser shots into someone. That was 120 damage at the time, 120 to 90 was...I guess a nerf during the taser era. Depends on how you viewed it. Buckshot was doing like 80 at the time, believe me it was a wild period. But anyway, when we did the whole damage rearrangement over the course of the laser few years, every other shell got touched except this one for some reason. Even pulse slugs lost 10 damage while this was still sitting on 90 force point blank.
So what is the new niche? Well, it's laser buckshot. That's not a niche but crew don't get buckshot, so this is their buckshot. It wounds real good. Real goddamn good. And its is a laser. It fits the aesthetic, obviously.
Okay, thanks.
🆑 balance: Scatter laser shells actually utilize the real scatter laser beam. This comes with damage changes. And wounding power. feature: EMPs can potentially damage scatter laser shells. refactor: All projectiles can now have damage falloff defined. Yay. balance: Scatter laser shells can be printed when weapons technology is researched. /:cl:
Co-authored-by: Jacquerel [email protected]
Adds charges to omens and omen smiting. Reduces omen bad luck if nobody's nearby. (#78899)
refactor: Adds charges to omens and omen smiting rather than only being permanent or one-use. Mirrors now grant seven bad luckers.
qol: Reduces omen bad luck if nobody's nearby to witness the funny. (Ghosts are included in the check!)
fix: Fixed an issue where a monkey check in doorcrushing was never actually able to pass. Also they screech now.
refactor: Adds charges to omens and omen smiting rather than only being permanent or one-use. Mirrors now grant seven bad luckers.
Allows for someone to get between 1-infinity omen accidents. Seriously why wasnt this a thing before
qol: Reduces omen bad luck if nobody's nearby.
I LOVE this quirk, but trying to do antything at all except 'Suffer Miserably' is nigh impossible. To alleviate life a little, making it so that you have a lesser chance of suffering misfortune if nobody's around will be the perfect compromise. It makes life easier but doesn't compromise funny moments.
Any client in viewrange will disable the reduction. This includes ghosts.
🆑 refactor: Adds charges to omens and omen smiting rather than only being permanent or one-use. Mirrors now grant seven bad luckers. qol: Reduces omen bad luck if nobody's nearby to witness the funny. (Ghosts are included in the check!) fix: Fixed an issue where a monkey check in doorcrushing was never actually able to pass. Also they screech now. /🆑
Co-authored-by: Ghom [email protected]
Shapechange health transfer tweaks (#79009)
Fixes #78721 This PR does a handful of things behind the scenes to increase the consistency of shapechange health tracking.
First of all we adjust the order of operations taken when you restore the original body. The implementation as-was would remove the status effect midway through and null a bunch of variables we tried to continue using. This would result in several runtimes and code failing to run, with the upshot that untransforming upon death would leave the caster completely alive, with the corpse of its transformed shape at its feet. Oops.
Additionally while testing this I realised that transferring the damagew as also kind of fucked. We wouldn't bother to do it at all if you died, which is a shame, so I made it simply heal you instead of reviving you so we can always do it. Then as noted in the linked issue, we were applying all transferred damage to a single limb, which could exceed the health of the limb and remove damage. Now we spread it around the body.
Finally, applying damage to a human using the "force" flag would often
actually apply less damage to their health than expected. This is
because arms and legs contribute only 75% of their damage taken to a
mob's overall health.
Now instead of reading health
we read total damage
which ignores the
limb damage modifier.
The end result of this is that if you transform into a corgi, take 50% of your health, and transform back then you will have 50% of your health as a human. Previously the result would be that you'd have ~63%, then transforming into a corgi would leave you with ~63% of a corgi's health, then transforming back into a human would leave you at about 71%... and so on and so forth. Now it doesn't do that.
🆑 fix: Dying when using (most) shapeshift spells will now kill you rather than having you pop out of the corpse of your previous form. fix: Damage will now be accurately carried between forms rather than being slightly reduced upon each transformation. /🆑
Makes the Regal Condor realistically simulate being shot dead with a high caliber hand cannon by making it HITSCAN (#78674)
The Regal Condor come with a magazine and ammo already inside.
The recipe for the magazine now no longer needs TC, but does need donk pockets (sponsored murder gear, you see) and a hell of a lot more materials per magazine (you're looking at like 40 sheets of various materials all up). It also needs you to make the Condor first. But it comes preloaded with ammo.
The Condor is 1 whole TC more expensive. Also needs some metal. The old recipe is there in spirit.
The Regal Condor and the magazines come with 10mm Reaper bullets. They're high damage. They're high AP. They are also hitscan.
Apparently people don't like the Condor. Too much effort for not enough reward. After all, revolvers exist. 'It must be a joke' they say! 'It's joke content! I went to all that effort to make it for nothing! That slut Anne tricked us!'
Wrong, bitch.
If you want the Condor to make you shit yourself the moment someone with it appears on the screen, then fine!
🆑 balance: Despite earlier reports suggesting that the famous lethality of the Regal Condor was largely a myth, there has been rumors that the gun has once again started to display its true killing potential on any station that it 'manifests'. /🆑
Mashes several of the Whitesands Survivor Camp ruins into one extra large ruin (#1640)
Combines the whitesands surface camp adobe, farm, gunslingers, survivors, hunters and saloon into one massive, 59x59 ruin. Some various extra loot and changes have been made throughout, generally to improve the experience of digging through the trash for goodies. Changes the riot shotgun in the saloon to a double barrel shotgun. Also cleans up the various issues with the ruins, like walls under doors, or area passthroughs being used excessively over the outside of the ruins, resulting in them generating in the middle of mountains buried in the rock.
"Well, why didn't you add the drugstore?" The loot in it was too good. The stuff in there can really help a ship get on its feet, and I am not gonna deprive them of that just to shove it in an already packed massive ruin area. I'm not saying it doesn't need its own remap, just that it doesn't fit well with the other camps put into this ruin.
- I affirm that I have tested all of my proposed changes and that any issues found during tested have been addressed.
"a ruin that is tiny and sucks on purpose is still bad" and holy shit did most of the camps fit this criteria. Survivor, Gunslinger, and Hunter camp variants were the smallest ruins in the game next to the one that was just a single tumor, and constantly took up entire map generations just to be a massive dissapointment to any player that came across them. Or they would spawn in the middle of an acid lake. Either way this ruin is massive and should provide a breath of fresh air for scavengers and combat hungry miners alike.
Ingame, two pics due to view range not being large enough to get the full thing at a good quality.
🆑 add: whitesands_surface_camp_combination, a survivor village comprised of smaller revamped whitesands camps all packaged in one ruin. can be found in the map catalogue. del: whitesands_surface_camp adobe, farm, gunslingers, survivors, hunters and saloon, for being tiny ruins that suck. /🆑
Co-authored-by: Bjarl [email protected]
Nerfs the everloving almighty shit out of the jungle demonic office ruin (#2430)
Nerfs the ruin by removing most of its gamer gear, and changing the syndicate hardsuit you find into a scarlet hardsuit.
Not to mention the two goddamn deathsquad hardsuits all there, wholesale, for free.
This shit is not okay jesus fucking christ, two deathsquad hardsuits? Are you insane?
🆑 PositiveEntropy balance: The Jungle Demonic Office Ruin has now been appropriately balanced, now only having a scarlet hardsuit, decent syndicate armor, and a bulldog with no spare mags. /🆑
new space ruin, the biological research outpost (#79149)
adds this ruin to space ruin pool this is a shady (as NT always is) bioresearch outpost that got fucked up by an experiment this has like some puzzle aspect to it since you gotta find keycards and shit and press buttons to unlock shield gates this ends with you fighting a heart which if you defeat, destroys the blockade that prevents you from entering the outpost vault
also you can no longer literally just cut indestructible grilles or unanchor indestructible windows
variant of pressure plate that you cannot remove and it sends a puzzle signal cooler red puzzle doors that look very foreboding or something idk theyre for this ruin also puzzle blockades, which are indestructible dense objects that are destroyed if they receive a puzzle signal and also buttons and keycard pads for puzzles
2023-10-21.18-17-07.mp4
2023-10-21.18-19-20.mp4
stuff that throws electric shocks in a pattern, ignores insuls and only knocks down, and no you cannot just run past
2023-10-21.18-21-05.mp4
living floor, it can only attack stuff on top of it and it attacks until the victim is dead it is invincible to all but a crowbar, and it cannot move, and it remains hidden until a victim is in range
2023-10-21.18-23-15.mp4
living flesh, it can replace your limbs with itself the conditions for that are; the limb must have 20 or more brute, victim must be alive and dismemberable, the limb may not be torso or head, or the limb may not be living flesh alternatively it can replace a missing limb these are all checked with every attack they have 20 hp the limbs in question will sometimes act up, while passively draining nutrition, arms will randomly start pulling nearby stuff, legs may step randomly limbs when detached, turn into mobs and reactivate AI 2 seconds later. if the host is shocked, all living flesh limbs will detach, or if the host dies they will also do that
2023-10-21.18-29-10.mp4
ruin variety is cool i think also the other things i added should be useful for other mappers for bitrunning or whatever
also bug bad for that one fix
🆑 add: living floor, living flesh, and other stuff for the bioresearch outpost ruin add: bioresearch outpost ruin fix: you may not defeat indestructible grilles and windows with mere tools /🆑
Co-authored-by: Jacquerel [email protected]
Create README.md
Vasconvert-all Vasconvert-all Logo
A simple web application, Vasconvert-all, designed for currency conversion and astronomical calculations. This project utilizes HTML, CSS, and JavaScript to create an interactive and user-friendly experience.
Features Currency Conversion: Convert Brazilian Real (BRL) to various currencies including US Dollar (USD), British Pound (GBP), and Cryptocurrency. Astronomical Calculation: Calculate the distance in light-years based on a predefined value and display the result. Screenshots Vasconvert-all Screenshot
How to Use Open index.html in a web browser. Enter your name when prompted. Enter the amount in Brazilian Real that you want to convert. Choose the currency (Dolar, Pound, or Cripto) for conversion. View the converted amount in the selected currency. Receive information about the distance in light-years. Styling The application features a stylish and responsive design, making use of background images and custom fonts.
Dependencies No external dependencies are required. The project uses pure HTML, CSS, and JavaScript.
Contributing Feel free to contribute to the project by submitting issues or pull requests. Your feedback and suggestions are highly appreciated.
License This project is licensed under the MIT License.
Acknowledgments Alura for the inspiration and educational content. Background image source: motospace.jpeg Author Edson França Vasconcelos
Nukie Update Followup: Returns CQC to the previous price range, Core Gear kit for newbies, hat stabilizers for everyone (#79232)
Brings the CQC kit back down to the same price range of 14 TC (it's 1 more than before weapon kits). It feels like currently that CQC is overpriced, even with the stealth box coming along with it, and by comparison the energy sword and shield got a huge value increase by combining the two. They're both melee styles and also equally difficult play styles. It isn't really necessary to make one more expensive than the other. Also now comes with syndicate smokes. It's a whatever change, ops get these for free on the base.
Adds a core gear kit in the weapon category. This kit comes with a doormag, a freedom implant, stimpack and c-4 charge. All of these are items almost every nukie buys if they want to succeed, so let's inform newer players by putting it RIGHT on top of the list. This isn't at any discount, this is mostly to help inform players what items help make you successful.
Hat stabilizers are now a part of every syndicate modsuit for FREE. It comes built in, can't be removed, and has no complexity cost. Now everyone can wear their wacky hats as they operate.
CQC felt like it got shafted waaay too hard with the weapon case changes. Definitely don't believe that it is punching at the same weight as many of the other high cost weapons. So we've dropped it down a category. 14 TC is still a large upfront cost, even if it comes bundled with a lot of goods.
Melbert gave me the idea of a core bundle kit to help newer players and I was really taken with that. So I added it as part of this followup.
I want people to wear their hats goddamnit, and I didn't learn my mistake with the tool parcels. So now everyone has hat stands on their suits. WEAR THE SOMBRERO YOU FUCK.
🆑 balance: Operatives can once again read about the basics of CQC at a reasonable price of 14 TC. qol: All Syndicate MODsuits come with the potent ability to wear hats on their helmets FOR FREE. No longer does any operative need be shamed by their bald helmet's unhatted state when they spot the captain, in their MODsuit, wearing a hat on their helmet. The embarrassment has resulted in more than a few operatives prematurely detonating their implants! BUT NO LONGER! FASHION IS YOURS! qol: There is now a Core Gear Box, containing a few essential pieces of gear for success as an operative. This is right at the top of the uplink, you can't miss it! Great for those operatives just starting out, or operatives who need all their baseline equipment NOW. /🆑
[MIRROR] Watcher Nest Lavaland Ruin [MDB IGNORE] (#24286)
- Watcher Nest Lavaland Ruin (#78790)
Adds a small new lavaland ruin, the Watchers' Grave.
You will need to figure out yourself how to find a way through the walls surrounding it (it's not very hard). This is mostly just atmospheric but also serves as a delivery vehicle for a unique item; an orphaned Watcher egg. (That's kind of it in terms of loot, unless you count a handful of lavaland mob corpses and mushrooms).
You can either eat this (it's an egg), throw it at someone to spawn an angry watcher, or keep hold of it for a while and see what happens.
That's right it's your very own baby watcher. It orbits your head and shoots at lavaland creatures for unimpressive damage. It won't ever intentionally shoot a player but they might walk in front of it, as it doesn't hurt very much they will probably forgive you. If you die it will continue circling your corpse to guard it against predation.
In creating this ruin I also added a new component called "corpse description". It provides some extra examine text to a corpse which is removed permanently if the mob is revived. There's a field you can varedit on corpse spawners (or make a subtype) which will automatically apply it to spawned corpses. You can use it for environmental storytelling. Or admins can use it to make fun of how you died.
Also I fixed basic mobs runtiming when examined by ghosts.
More variety in map generation. It's cute. Adds a tool that mappers might like.
🆑 add: Adds a new lavaland ruin where you can find a unique egg. /🆑
- Watcher Nest Lavaland Ruin
Co-authored-by: Jacquerel [email protected]
Add a magic incantation to tell the Store we support Server (#16306)
I find it somewhat silly that (1) this isn't documented anywhere and (2)
installing the "desktop experience" packages for Server doesn't
automatically add support for the Windows.Desktop
platform...
Oh well.
I'm going to roll this one out via Preview first, because if the store blows up on it I would rather it not be during Stable roll-out.
Fixes rock sprites ingame [WHOOPS] (#2332)
Rocks were invisible in game due to a recently merged PR of mine. this is why we testmerge PRs! anyways this should fix them.
Adds flora and rock missing texture sprites to most flora files to prevent something like this from ever happening again.
invisible things that block movement bad yeah. i want to fix my mistakes.
🆑 fix: Most rocks are now visible again add: Most flora files now have missing texture sprites to make it easier to spot when something has gone wrong. /🆑
People listen up don't stand so close, I got somethin that you all should know. Holy matrimony is not for me, I'd rather die alone in misery.
minor tweaks - gwf, tty descendant random
tty can't random into descendant (curses already couldn't)
gwf now rerolls bottom 16%, 33%, 50% of rolls, not just 1/2/3 - so its not absolutely awful for larger weapons. I realized that like, oversized weapons have larger dice sizes, so this should probably synergize better with them. Go figure. This will maxroll d2s, fun fact, but it probably did really bad things before this, since I didn't actually ever test that and I think it was doing n*3 + d(n, -1) or something stupid. Now it won't.
previously touched sflame logic but noisy fixed it more comprehensively so i removed my own
Improves the deployable component (#79199)
The deployable component had a few random things I noticed when I tried actually using it that kinda sucked so I'm:
Making the examine message more generic, we did NOT need to make it that complicated. Letting anything with hands deploy stuff, because mobs other than humans can hold things. Giving the option to let something be deployed more than once. Letting direction setting be optional. Tweaking the check for if something can be placed somewhere to be a bit better.
I want to use the deployable component for stuff but I made it awful.
🆑 code: the deployable component has been tweaked and improved with some new options to it /🆑
Co-authored-by: Jacquerel [email protected]
Jukebox Update (#6102)
This will add plenty of more songs to the Jukebox.
Song List: Alternative: Say It Ain’t So by Weezer Buddy Holly by Weezer The Good Life by Weezer Troublemaker by Weezer Undone by Weezer Hash Pipe by Weezer (All Emagged) Wayside by Mitchel Dae Freaking Out the Neighborhood by Mac DeMarco
Arcade: Skyline and Menagerie Mix by 63hnsh3 Deputized by Locknar The Ashoka Attacks by Paul Ruskay
Electronic: How Would You Like It? By Moxifloxi Syrsa - Cythas - Magichnology Beyond Memory by NINA
Jazz and Lounge: People Equals Shit by Richard Cheese (Emagged)
Metal: Alone I Break by Korn Shoots and Ladders by Korn Blind by Korn A Different World by Korn ft. Corey Taylor Kidnap the Sandy Claws by Korn (Emagged) Before I Forget by Slipknot Psychosocial by Slipknot The Devil in I by Slipknot Dead Memories by Slipknot People Equals Shit by Slipknot Fade Away by Breaking Benjamin Give me a Sign by Breaking Benjamin I Will Not Bow by Breaking Benjamin Into the Nothing by Breaking Benjamin Without You by Breaking Benjamin Smooth Criminal by Alien Ant Farm Movies by Alien Ant Farm Happy Death Day by Alien Ant Farm Violent Pornnography by System of a Down Science by System of a Down Spiders by System of a Down Jet Pilot by System of a Down Chic ‘n’ Stu by System of a Down Chop Suey! by System of a Down B.Y.O.B. by System of a Down Last Resort by Papa Roach Scars by Papa Roach Words as Weapons by Seether Crawling by Linkin Park Leave Out All the Rest by Linkin Park Papercut by Linkin Park Lost by Linkin Park In The End by Linkin Park Bodies by Drowning Pool Tear Away by Drowning Pool I Don't Care by Apocalyptica ft. Adam Gontier One by Metallica Sad But True by Metallica Wherever I May Roam by Metallica Nothing Else Matters by Metallica Master of Puppets by Metallica Tenebre Rosso Sangue by Keygen Church (Emagged) Simple Sight by Piercing Lazer (Emagged) Order by Heaven Pierce Her (Emagged)
Classical and Orchestral: One Final Effort by Martin O’Donnell Never Forget by Martin O’Donnell
Rock: 8675309 Jenny Jenny by Tommy Tutone I Love You Like An Alcoholic by The Taxpayers Must Have Been The Wind by The Chalkeaters (Emagged)
Yes, this list is very biased.
With the recent repair of the previous songs in the Jukebox, it would seem to be a good idea to finally add more to the list, allowing for more songs for players to choose from.
🆑 add: Added more songs to the Jukebox! /🆑
Massive Ruin Fixes + Removals PR (#2334)
This PR is made so I can stop getting angry at the ruins beyond saving that are still ingame. My criteria for a ruin being removed is if another ruin already does its niche better, if the ruin is outdated and/or the ruin is excessively small or unbalanced. For ruins that dont meet this criteria but are still outdated, they will be getting balance fixes and touch ups or a total remap.
This PR is a draft for now because I will need to update the PR changelog and description as I make changes and communicate with the maptainers on what stays and what goes.
Adds departmental RND lootdrop spawners for circuit imprinters, protolathes and techfabs. Excludes omnisci and basic boards from the drops. Fixed a space tile under a door and replaced the omnilathe with a medical lathe on dangerousresearch Fixed the whitesands saloon not spawning which may have caused some sandplanets to spawn without a ruin Fixed harmfactory's nonfunctional traps to now be as lethal as intended. Also changed the loot in the vault to better reflect the ruin's theme and difficulty (cargo techfab board instead of omnilathe, adv plasma cutter instead of combat medkit, less gold more cash, kept the cyberarm implant). Fixed provinggrounds magical SMES FINALLY by adding a terminal on the back. The map should finally function as intended. Fixed a few dirs on fire extinguisher cabinets and blast door assemblies in singularity_lab Removed mechtransport.dmm for being small and bad Removed some leftover gasthelizards.dmm cruft (VILE) Removed nucleardump for being an utter mess of an oldcode ruin Removed gondolaasteroid for being large and empty besides gondolas. better suited for a jungle planet IMO. Removed Jungle_Spider. Literally just a box with spiders and cloning equipment. Small, bad, hard to find, unjustified loot. Removed Golem_Hijack. Like jungle spider but it was free rnd, an AI core, a full BSRPED and three golem corpses. With no enemies or obstacles. Removed rockplanet_clock for being a tiny lootbox that doesnt fit with the lore. Also had a quantumn pad. Removed whitesands_surface_youreinsane. Its a silly little reference to an old event that unfortunately resulted in a subpar ruin. Could return as a wasteplanet greeble ruin, but it has to go for now.
Normally I'm all for remapping instead of removing ruins, but some ruins are very much beyond saving. Clearing out space for better ruins to take the spotlight is always nice. Some older ruins are fine but are missing certain things or have loot that worked fine in the past, but doesn't reflect the balance we want for ruins in the present.
I will be PR'ing ruins to replace the ones I remove.
🆑 add: departmental RND lootdrop spawners for imprinters, protolathes and techfabs fix: dangerous_research.dmm now no longer has a space tile under a door and a medical lathe instead of an omnilathe fix: whitesands_surface_camp_saloon can now spawn again after its remap into a functional ruin fix: harmfactory.dmm's traps now work and loot has been adjusted to fit the ruin better fix: provinggrounds.dmm now has a working SMES and power fix: singularity_lab fire extinguishers and a few poddoors now have correct dirs del: mechtransport.dmm and associated code del: gasthelizards areas del: nucleardump.dmm and associated code del: gondolaasteroid.dmm and associated code del: jungle_spider.dmm and associated code del: whitesands_golem_hijack.dmm and associated code del: rockplanet_clock.dmm and associated code del: whitesands_surface_youreinsane.dmm and associated code /🆑
Signed-off-by: zevo [email protected]
fuck this stupid fucking bullshit and fuck yourself
Cait Sith Avatar:
- Cait sith has proper name prefix and named properly to be "Cait Sith" instead of "The CaitSith"
- BPs Implemented
- Regal Slash (BP:Rage): 3-hit physical
- Level ? Holy (BP:Rage): aoe magical
- Rolls a die and does dmg proportional to roll
- Only does damage if the target's level is divisible by the roll
- Mewing Lullaby (BP:Ward): AoE lullaby that resets TP
- Eerie Eye (BP:Ward): conal silence/amnesia with appropriate elemental resist check for amnesia, but retail does light check for silence
- Reraise II (BP:Ward): single-target 60-minute reraise II buff for any party member
- Raise II (BP:Ward): single-target raise II for any party member
- Altana's Favor (BP:Ward): 2-hour ability gives arise to all party members in range (Arise and reraise III with infinite duration)
Missed another thing
God damn you Javascript. Why can't you be normal?
Jk, thanks for helping me get shit done.
Extract storage manager related code from sled-agent (#4332)
This is a large PR. The changes are in many ways just moving code around, and at a cursory glance may appear to be a giant waste of time. To justify these changes and my rationale I will first present the goals I believe we should strive to meet in general sled-agent development. I'll then go into how I believe these goals can be realized via code patterns. I'll then discuss the concrete changes in this PR and how they implement the discussed patterns. Lastly, I'll list a few open questions about the implementation in the PR.
I want to emphasize that a lot of what I talk about below is already done in sled-agent, at least part way. We can pick the best patterns already in use and standardize on them to build a more coherent and yet decoupled architecture for easier testing and understanding.
This PR is an attempt to start making sled-agent easier to maintain. In order to make things easier to maintain, I believe we should attempt to realize a few key goals:
- Initial startup and control code should read linearly. You shouldn't have to jump around to follow the gist of what's going on.
- Tasks, like functions, should live at a certain abstraction level. It must be clear what state the task is managing and how it gets mutated.
- A developer must be able to come into the codebase and know where a given functionality should live and be able to clearly follow existing patterns such that their new code doesn't break or cross abstractions that make following the code harder in the future.
- Tests for individual abstractions and task driven code should be easy to write. You shouldn't need to spin up the whole sled-agent in order to test an algorithm or behavior.
- Hardware should be abstracted out, and much of the code shouldn't deal with hardware directly.
In my opinion, the most important pattern to follow for async rust
software
is what I call the "task/handle" pattern. This pattern helps code
maintenance
by explicitly managing state and making task driven code easier to test.
All
tasks that provide services to other tasks should follow this pattern.
In this
pattern, all state is contained in a type owned by the task and
inaccessible
directly to other tasks. The task has a corresponding handle which must
be
Send
and Clone
, and can be used to make requests of the task. The
handle
interacts with the task solely via message passing. Mutexes are never
used.
A few things fall directly out of this pattern:
- Code that manipulates state inside and outside the task can be synchronous
- We don't have to worry about mutex behavior with regards to cancellation, await points, etc...
- Testing becomes easier:
- We can test a bunch of the code without spawning a task in many cases. We just directly construct the state object and call functions, whether sync or async.
- When testing sequential operations that are fire and forget, we know when they have been processed by the task loop, because our next request will only run after those operations. This is a direct result of the fifo channel between handle and task. This is not possible with state shared outside the task via a mutex. We must poll that mutex protected state until it either changes to the value we expect or we get a timeout. If we expect no change, we must use a side-channel.
- We can write complex state handling algorithms, such as those in maghemite or bootstore, in a deterministic, synchronous style that allows property based testing and model checking in as straightforward a manner as possible.
- We can completely fake the task without changing any of the calling code except the constructor. The real handle can instead send messages to a fake task. Importantly, this strategy can also be used to abstract out hardware for unit tests and simulation.
Beyond all that though, the understanding of how state is mutated and
accessed
is clear. State is only mutated inside the task, and can only be
retrieved from
code that has a copy of the handle. There is no need for separate
_locked
methods, and no need to worry about order of locking for different bits
of task
state. This can make the task code itself much shorter and easier to
read as
demonstrated by the new StorageManager
code in sled_storage
. We can
also
maintain internal stats for the task, and all of this can be retrieved
from the
handle for reporting in omdb
.
There is one common question/problem with this pattern. How do you choose a bounded channel size for handle to task messages?
This can be tricky, but in general, you want the channel to act unbounded, such that sends never fail. This makes the channels reliable, such that we never drop messages inside the process, and the caller doesn't have to choose what to do when overloaded. This simplifies things drastically for developers. However, you also don't want to make the channel actually unbounded, because that can lead to run-away memory growth and pathological behaviors, such that requests get slower over time until the system crashes.
After discussions with @jgallagher and reflections from @sunshowers and @davepacheco on RFD 400, the solution is to choose a large enough bound such that we should never hit it in practice unless we are truly overloaded. If we hit the bound it means that beyond that requests will start to build up and we will eventually topple over. So when we hit this bound, we just go ahead and panic.
Picking a channel bound is hard to do empirically, but practically, if requests are mostly mutating task local state, a bound of 1024 or even 8192 should be plenty. Tasks that must perform longer running ops can spawn helper tasks as necessary or include their own handles for replies rather than synchronously waiting. Memory for the queue can be kept small with boxing of large messages.
It should also be noted that mutexes also have queues that can build up and cause pathological slowness. The difference is that these queues are implicit and hard to track.
We have a bunch of managers (HardwareManager
, StorageManager
,
ServiceManager
, InstanceManager
) that interact with each other to
provide sled-agent services. However, much of that interaction is ad-
hoc with state shared between tasks via an Inner
struct protected
by a mutex. It's hard to isolate each of these managers and test
them independently. By ensuring their API is well defined via a
Handle
,
we can fake out different managers as needed for independent testing.
However, we can go even farther, without the need for dependency
injection
by having different managers announce their updates via [broadcast or
watch
With this strategy, we can drive tests for a task by using the handle to
both
trigger operations, and then wait for the outflow of messages that
should occur
rather than mocking out the handle API of another task directly and
checking
the interaction via the fake. This is especially useful for lower level
services
that others depend upon such as StorageManager
, and we should do this
when we
can, rather than having tasks talk directly to each other. This strategy
leads
directly to the last pattern I really want to mention, the monitor
pattern.
Remember that a primary goal of these patterns is to make the sled-agent
easier
to read and discover what is happening at any given point in time. This
has to
happen with the inherent concurrency of all the separate behaviors
occurring
in the sled-agent such as monitoring for hardware and faults, or
handling user
requests from Nexus. If our low level managers announce updates via
channels
we can have high level Monitors
that wait for those updates and then
dispatch
them to other subsystems or across clients to other sleds or services.
This
helps further decouple services for easier testing, and also allows us
to
understand all the asynchrony in the system in fewer spots. We can put
RAS code
in these monitors and use them as central points to maintain stats and
track the
overall load on the system.
How do the patterns above satisfy the goals? By decoupling tasks and interacting solely via message passing we make testing easier(goal 4). By separating out managers/ services into separate tasks and maintaining state locally we satisfy goals 2 and 5. By making the tasks clear in their responsibilities, and their APIs evident via their handles, we help satisfy goal 3. Goal 3 is also satisfied to a degree by the elimination of sharing state and the decoupling via monitors. Lastly, by combining all the patterns, we can spawn all our top level tasks and monitors in one place after initializing any global state. This allows the code to flow linearly.
Importantly, it's also easy to violate goal 3 by dropping some mutexes
into the
middle of a task and oversharing handles between subsystems. I believe
we can
prevent this, and also make testing and APIs clearer, by separating
subsystems
into their own rust packages and then adding monitors for them in the
sled-agent.
I took a first cut at this with the StorageManager
, as that was the
subsystem I was
most familiar with.
Keeping in line with my stated goals and patterns, I abstracted the
storage
manager code into its own package called sled-storage
. The
StorageManager
uses the task/handle
pattern, and there is a monitor for it in
sled-agent
that takes notifications and updates nexus and the zone bundler. There
are also a
bunch of unit tests where none existed before. The bulk of the rest of
the code
changes fell out of this. In particular, now that we have a separate
sled-storage
package, all high level disk management code lives there. Construction
and
formatting of partitions still happens in sled-hardware
, but anything
above the
zpool level occurs in sled-storage
. This allows testing of real
storage code on
any illumos based system using file backed zpools. Importantly, the
key-management
code now lives at this abstraction level, rather than in
sled-hardware
, which
makes more sense since encryption only operates on datasets in ZFS.
I'd like to do similar things to the other managers, and think that's a good way to continue cleaning up sled-agent.
The other large change in this code base is simplifying the startup of
the bootstrap agent such that all tasks that run for the lifetime of
the sled-agent process are spawned in long_running_tasks
. There is a
struct called LongRunningTaskHandles
that allows interaction with all
the
"managers" spawned here. This change also has the side effect of
removing the
wait_while_handling_hardware_updates
concurrent future code, since we
have
a hardware monitor now running at the beginning of time and can never
miss
updates. This also has the effect of negating the need to start a
separate
hardware manager when the sled-agent starts up. Because we now know
which
tasks are long running, we don't have to save their tokio JoinHandle
s
to display
ownership and thus gain clonability.
- I'm not really a fan of the name
long_running_task_handles
. Is there a better name for these? - Instead of calling
spawn_all_longrunning_tasks
should we just call the individual spawn functions directly inbootstrap/pre_server
? Doing it this way would allow theServiceManager
to also live in the long running handles and remove some ordering issues. For instance, we wait for the bootdisk insidespawn_all_longrunning_tasks
and we also upsert synthetic disks. Neither of these is really part of spawning tasks.
Add Postpone API (#27238)
This adds an experimental unstable_postpone(reason)
API.
Currently we don't have a way to model effectively an Infinite Promise. I.e. something that suspends but never resolves. The reason this is useful is because you might have something else that unblocks it later. E.g. by updating in place later, or by client rendering.
On the client this works to model as an Infinite Promise (in fact, that's what this implementation does). However, in Fizz and Flight that doesn't work because the stream needs to end at some point. We don't have any way of knowing that we're suspended on infinite promises. It's not enough to tag the promises because you could await those and thus creating new promises. The only way we really have to signal this through a series of indirections like async functions, is by throwing. It's not 100% safe because these values can be caught but it's the best we can do.
Effectively postpone(reason)
behaves like a built-in Catch
Boundary. It's like
raise(Postpone, reason)
except it's built-in so it needs to be able to
be encoded and caught by Suspense boundaries.
In Flight and Fizz these behave pretty much the same as errors. Flight just forwards it to retrigger on the client. In Fizz they just trigger client rendering which itself might just postpone again or fill in the value. The difference is how they get logged.
In Flight and Fizz they log to onPostpone(reason)
instead of
onError(error)
. This log is meant to help find deopts on the server
like finding places where you fall back to client rendering. The reason
that you pass in is for that purpose to help the reason for any deopts.
I do track the stack trace in DEV but I don't currently expose it to
onPostpone
. This seems like a limitation. It might be better to expose
the Postpone object which is an Error object but that's more of an
implementation detail. I could also pass it as a second argument.
On the client after hydration they don't get passed to
onRecoverableError
. There's no global onPostpone
API to capture
postponed things on the client just like there's no onError
. At that
point it's just assumed to be intentional. It doesn't have any digest
or reason passed to the client since it's not logged.
There are some hacky solutions that currently just tries to reuse as much of the existing code as possible but should be more properly implemented.
- Fiber is currently just converting it to a fake Promise object so that it behaves like an infinite Promise.
- Fizz is encoding the magic digest string
"POSTPONE"
in the HTML so we know to ignore it but it should probably just be something neater that doesn't share namespace with digests.
Next I plan on using this in the /static
entry points for additional
features.
Why "postpone"? It's basically a synonym to "defer" but we plan on using "defer" for other purposes and it's overloaded anyway.
A test to change the behavior of the pissing status effect. We don't have to merge this if we don't like it. What has been changed (and why): Instead of teleporting the player to the same spot, the player instead loses most (but not all) of their movement speed, and almost all of their attack damage. My reasoning here is that the process of teleporting is extremely choppy, and it has the side effect of mobs not being able to knock players around, water not being able to push players, etc. If the player is instead just slowed to an extreme degree, they are still left extremely vulnerable, but can be more easily interacted with by mobs/the world. The attack damage is reduced because funny. If you read the entire commit message to the very end then you like men and want to kiss them passionately and get married and live a long happy life together.
Hey what if I made Sleeping Carp better at nonlethal takedowns and also deflect with combat mode instead of throw mode (but cost more) (#79517)
It's been a hot minute hasn't it?
When I initially reworked Sleeping Carp, we didn't have combat mode. Now that we do, and that Sleeping Carp has substantially less defensive power to justify having to make a choice between deflection and attacking, it's probably about time we updated this aspect back to what it was before my rework. Sorta.
Now, we can have all the deniability of the previous method, while also letting you reliably protect yourself from ranged attacks at all times while it matters. Because of this, I increased the price up to 17 TC because of this change just to be on the safe side. The higher uptime of projectile immunity while also being able to attack during that time makes this a lot stronger overall.
Secondly, Sleeping Carp presently just isn't as good as a good ol' baton. It takes a lot more hits to accomplish the same task that a baton can. Many people feel like they can't even reasonably fight anyone for fear of the baton, or they would rather use a baton and kill someone at their leisure. So we've updated some of the moves in order to facilitate Sleeping Carp as a substantial contender for 1v1 fighting, and lessen the need for a baton by adding a lot more Stamina damage overall to the various attacks;
Keelhaul: Now a Shove Shove combo. Does literally zero lethal damage, but now temporarily blinds and dizzies the target as well as its previous effects. The amount of lethal damage it did was...extremely small, so this isn't a particularly big loss.
Grabs and Shoves: Deal some amount of stamina damage (20). You need to be in combat mode in order to perform these special attacks (more deniability). Grabbing someone while they have 80 Stamina damage or more will cause them to fall unconscious. Yes, I really did just want to add a Vulcan Nerve Pinch, what do you want from me?
That's it actually. Oh, I guess they are heavy sleepers now too. Because its funny.
I often get told (read: thrown various insults and slurs at me while mentioning this as the justification) that Sleeping Carp is not very strong anymore since it lost all that invisible armor I added way back + I removed the stuns in my initial rework. This made some people upset (I think at least one person wished for my death).
So, having given it at least 2 years, I wanted to recapture parts of what made the older Sleeping Carp (before my rework) strong, some of the benefits of the new version, and introduce a brand new aspect; nonlethal takedowns. This makes it beneficial for pacifists, as well as for kidnapping.
This should not meaningfully make Sleeping Carp any stronger against the things that typically ruin its day. I suspect in a straight joust with a baton, Sleeping Carp will still struggle. But against what should be its strong points (lone targets and ranged weapons), it will be strong once again rather than clumsily unable to do very much at all.
🆑 balance: Harnessing Shoreline Quay (bluespace energy, probably), a mystical energy (total bullshit) that permeates the Astral Waterways (bluespace quantum dimensions, probably), Sleeping Carp users can now once against deflect projectiles with their bare hands when focused in on battle (in combat mode). balance: The Keelhaul technique is now nonlethal (a philosophical acknowledgement of the familial bond of sleep and death), but causes the target to become temporarily blind and dizzy along with its previous effects. balance: Sleeping carp users, while in combat mode, deal Stamina damage with their grabs and shoves. If the target of their grab has enough Stamina damage (80), they are knocked unconscious from a well placed nerve pinch. balance: Sleeping carp users find it very hard to wake up once they fall asleep.... /🆑
tree-wide: use /proc/thread-self for thread-local state
With the idmap work, we will have a tainted Go thread in our thread-group that has a different mount namespace to the other threads. It seems that (due to some bad luck) the Go scheduler tends to make this thread the thread-group leader in our tests, which results in very baffling failures where /proc/self/mountinfo produces gibberish results.
In order to avoid this, switch to using /proc/thread-self for everything that is thread-local. This primarily includes switching all file descriptor paths (CLONE_FS), all of the places that check the current cgroup (technically we never will run a single runc thread in a separate cgroup, but better to be safe than sorry), and the aforementioned mountinfo code. We don't need to do anything for the following because the results we need aren't thread-local:
-
Checks that certain namespaces are supported by stat(2)ing /proc/self/ns/...
-
/proc/self/exe and /proc/self/cmdline are not thread-local.
-
While threads can be in different cgroups, we do not do this for the runc binary (or libcontainer) and thus we do not need to switch to the thread-local version of /proc/self/cgroups.
-
All of the CLONE_NEWUSER files are not thread-local because you cannot set the usernamespace of a single thread (setns(CLONE_NEWUSER) is blocked for multi-threaded programs).
Note that we have to use runtime.LockOSThread when we have an open handle to a tid-specific procfs file that we are operating on multiple times. Go can reschedule us such that we are running on a different thread and then kill the original thread (causing -ENOENT or similarly confusing errors). This is not strictly necessary for most usages of /proc/thread-self (such as using /proc/thread-self/fd/$n directly) since only operating on the actual inodes associated with the tid requires this locking, but because of the pre-3.17 fallback for CentOS, we have to do this in most cases.
In addition, CentOS's kernel is too old for /proc/thread-self, which requires us to emulate it -- however in rootfs_linux.go, we are in the container pid namespace but /proc is the host's procfs. This leads to the incredibly frustrating situation where there is no way (on pre-4.1 Linux) to figure out which /proc/self/task/... entry refers to the current tid. We can just use /proc/self in this case.
Yes this is all pretty ugly. I also wish it wasn't necessary.
Signed-off-by: Aleksa Sarai [email protected]
msx2_flop.xml: Added 54 items (49 working) and replaced one item with a better dump. (#11698)
- Replaced VS Rotation (Japan) with a better dump. [file-hunter]
- Removed Ultima IV - Quest of the Avatar (Japan, alt disk 2) (disk 2 is from an English translation).
- Removed Vectron (Netherlands) and Vectron (Netherlands, alt) (extracted from a compilation).
- Removed Zoo (Netherlands, alt) and Zoo (Netherlands, alt 2) (hacked versions)
Konami Game Collection Bangai-hen (Japan, alt) [file-hunter] The Legend of Shonan (Japan) [file-hunter] Sailor-fuku Senshi Felis (Japan) [file-hunter] Tempo Typen (Netherlands) [file-hunter] Tenkyuhai Special - Tougen no Utage (Japan) [file-hunter] Tenkyuhai Special - Tougen no Utage II (Japan) [file-hunter] Thanatos (Japan) [file-hunter] Tokimeki Sports Gal (Japan) [file-hunter] Tominaga Koukou Tantei-bu (Japan) [file-hunter] Trilogy Kuki Youka Shinden (Japan) [file-hunter] The Tucs (Japan) [file-hunter] Tulip Ichigou (Japan) [file-hunter] Ultima II - The Revenge of the Enchantress (Japan) [file-hunter] Undead Line (Woomb) [file-hunter] Wizardry Scenario #3 - The Legacy of Llylgamyn (Japan) [file-hunter] Xak - The Art of Visual Stage (Japan, Woomb) [file-hunter] Yoshida Koumuten Data Library Vol. 2 (Japan) [file-hunter] Yoshida Koumuten Data Library Vol. 3 (Japan) [file-hunter] Yume Pro RPG Shaon-ban (Japan) [file-hunter] Yumeji Asakusa-Kitan (Japan) [file-hunter] Yuurei-kun (Japan) [file-hunter] Zoo (Europe) [file-hunter] GAME100 (Japan) [file-hunter] Go! Volcano [NAGI-P SOFT] Las Aventuras de Rudolphine Rur (Spanish) [Dwalin] MSX Light [MSXdev] Siege [NAGI-P SOFT] Teddy's in Action Part 2 [file-hunter] Terrahawks [file-hunter] Tetravex (Netherlands) [file-hunter] Tetris Master (Japan) [file-hunter] Tetris Master - Operation Maison Ikkoku (Japan) [file-hunter] Tetris Master - Operation Orange Road (Japan) [file-hunter] Tetris Master - Operation Ranma 1/2 (Japan) [file-hunter] Tetris Master - Series 1 Ranma 1/2 (Japan) [file-hunter] Thunderbirds are Go (Netherlands, promo) [file-hunter] Thunderbirds to the Rescue (Netherlands, promo) [file-hunter] Tile Golf [NAGI-P SOFT] Triplex (Netherlands) [file-hunter] Trivial Pursuit (Netherlands) [file-hunter] Trivial Pursuit - Aanvulling Jaareditie 1995 (Netherlands) [file-hunter] Tunez: Garfield Edition [file-hunter] The UHF Painter (Italy) [file-hunter] War World FM-PAC Demo (Netherlands) [file-hunter] Wiz Kids (Japan) [file-hunter] Yupipati (demo) [file-hunter] Zombie Night [Alberto Sgaggero] Zoo Rally (Russia) [file-hunter] Zoto (Germany?) [file-hunter]
HBI-V1 Video Digitizer (Japan) [file-hunter] Himitsu no Hanazono (Japan) [file-hunter] Veldslag (Netherlands) [file-hunter] Zeeslag (Netherlands) [file-hunter] Zeeslag (Netherlands, demo) [file-hunter]
GLM Report on Result of Internal Exam
In the realm of statistical analysis, the Generalized Linear Model (GLM) stands as a cornerstone methodology, serving as a powerful tool for modeling a wide array of data types and patterns. It is a versatile statistical framework that finds applications in a multitude of disciplines, from epidemiology to finance, and from ecology to social sciences. In this report, we delve into a comprehensive study of GLM results, focusing on their application and relevance within the context of both Applied Statistics and Pure Statistics programs.
The motivation behind this study is to bridge the gap between theory and practical application in the field of statistics, particularly within the academic setting of Applied and Pure Statistics programs. We recognize that student’s performance, represented by the variable "Marks," is influenced by various factors, such as the "Course" they are enrolled in, the "Time" allocated for studying, their "Anxiety Level," and even "Gender" differences. Understanding the relationship between these variables is crucial in designing effective educational strategies, identifying potential challenges, and ultimately enhancing the learning experience for students.
By using Generalized Linear Models, we aim to provide a comprehensive analysis of the interplay between these variables, enabling us to draw meaningful conclusions and recommendations for program improvement. This study is not only valuable to educators but also to students, administrators, and policymakers who seek to optimize the educational environment, ensure fairness, and promote better learning outcomes.
TGUI Destructive Analyzer (#79572)
I made this to help me move more towards my goals laid out here which currently doesn't have much interest.
This makes the Destructive Analyzer use a little neat TGUI menu instead of its old HTML one. I also touch a lot of science stuff and a little experimentor stuff, so let me explain a bit: Old iterations of Science had different items that you can use to boost nodes through deconstruction. This has been removed, and its only feature is the auto-unlocking of nodes (that is; making them visible to the R&D console). I thought that instead of keeping this deprecated code around, I would rework it a little to make it clear what we actually use it for (unhiding nodes). All vars and procs that mentioned this have been renamed or reworked to make more sense now.
Experimentor stuff shares a lot with the destructive analyzer, so I had to mess with that a bit to keep its decayed corpse of deprecated code, functional.
I also added context tips to the destructive analyzer, and added the ability to AltClick to remove the inserted item. Removing items now also plays a little sound because it was kinda lame. Also, balloon alerts.
Moves a shitty machine to TGUI so it is slightly less shitty, now it's more direct and compact with more player-feedback. Helps me with a personal project and yea
I show off connecting the machine to R&D Servers, but I haven't changed the behavior of that and the roundstart analyzers are connected to servers by default.
8mb.video-n8j-l5FCNyHD.mp4
🆑 refactor: Destructive Analyzers now have a TGUI menu. /🆑
Further Prevention of Disposals Qdeletion (#79714)
Fixes the consequences of #79629 - Verdict is still out on what the root issue is
This has been an issue for the last two years and everything I go
bananas trying to get a consistent reproduction case to figure out the
root issue. After three session of picking, I think it's just a
consequence of certain thing in disposals code sleeping due to
addtimer()
and whatnot so I'm just throwing in the towel and just
making it so we stop sending atoms to nullspace for no reason.
target_turf
is typically always a present arg, but regardless we are
guaranteed to get a valid turf to send people to instead of the deleted
mob room. We still stack_trace()
whenever this happens, so tracking
this issue doesn't change any more than the present status quo- we just
don't keep torturing mobs by sending them to the shadow realm.
One day we'll figure out why we keep getting null
passed into
forceMove()
like this but today is not that day. i know turfs
technically can't be deleted but it's just there as a safety since we
nullcheck anyways (which is the whole point of this fix). Let's just
stop screwing with players for the time being
also the code looks much better
🆑 fix: Safeties in the code have been added to prevent things in disposals going into nullspace whenever they get ejected from a pipe - you will just magically spawn at the turf that you were meant to be flung towards. /🆑
查战绩脚本和自定义脚本11的一些功能更新【A Function Update of Customized Programs 5 and 11】
一、程序更新综述(Program Update Summary 4.23 -> 4.24)
- 排序工作表(Worksheet sorting)
对于本程序集的老用户,特别是自定义脚本5和11的老用户来说,有的时候在召唤师文件夹里保存的工作簿的各工作表的顺序不尽如人意。这主要是因为pandas库支持的工作簿导出方式中,只有追加模式是最好用的,然而这也带来一个问题,就是后追加的工作表可能在对局创建时间上比前面的追加的工作表更早。(这么说其实有点不严谨,因为对局创建时间顺序和对局序号顺序不是完全相同的——同一个服务器上,对局序号较小的对局是有可能后创建的。)如果是每天都有导出某名召唤师的战绩的话,手动调一调也还能接受。(这里提供一个小技巧,就是当一张工作簿存在上百张工作表而导致定位到特定工作表比较费劲时,可以通过鼠标右键点击工作表栏左边的箭头处,这时Microsoft Excel会弹出“激活”窗口,显示“活动文档”。在活动文档中查看想要跳转的工作表比较方便。)但是如果工作表的顺序错乱得比较严重,那调整起来就费劲了。
For old users of this program set, especially the Customized Programs 5 and 11, sometimes the order of sheets in the workbook saved under the corresponding summoner folder aren't satisfying. This is mainly because among the export approach that
pandas
library supports, only the "append" mode works best, which brings about a problem in the meantime: the later appended sheets may be earlier than the earlier appended, in terms of the gameCreationTime. (Actually this statement isn't so rigorous, for the gameCreationTime order and the matchID order aren't the same thing - On a specific server, a match of a smaller matchID may be created later.) If a user exports summoner profile daily, then a manual adjustment of the sheet order is relatively acceptable. (Hint: When there're hundreds of sheets in an Excel workbook, so that it takes a lot of time to scroll to a specific sheet, the user may right-click the bar with two triangles at the left of the sheet bar. Then, an "Activate" window will pop up, displaying "Active documents". It should be more handy to locate to a specific sheet by this window.) However, if the sheets are largely disordered, then it won't be easy to totally order them. 比如如果一位用户在第11赛季的时候使用存档脚本查询了一名召唤师的英雄联盟对局,得到400张工作表。然后他使用本次功能更新前的脚本查询了一名召唤师的云顶之弈对局,这样在原工作簿的最后又追加了200张工作表。但问题在于,这位召唤师只有在云顶之弈刚出的时候才玩过,大概是第9赛季的时候才玩过,那这些对局的对局序号以及创建时间都先于之前查询的英雄联盟对局。但是它们被追加到了工作表的最后。这样,要把200张工作表一张一张移动到这400张工作表前面(现有的Excel不支持批量移动工作表),那工作量就相当大了。因此,便产生了这一条功能更新。 Let's look at such an example. Suppose a user searched for a summoner's LoL matches in Season 11 using the archived Customized Program 5, which generated a workbook with about 400 sheets. Then, recently he's used the programs before this functional update to search for the same summoners' TFT matches, which appended 200 sheets to the last of the sheet list of the workbook. But it appeared that this summoner only played TFT when it was just released in Season 9. Therefore, these TFT matches' matchIDs and gameCreationTimes are all earlier than those of the LoL matches previously looked up. However, they were appended to the last. In such case, it would be considerably large work to move the 200 sheets to the front of the 400 sheets one by one (for current Excel doesn't support moving sheets in batch). For this reason, this functional update is committed. - 使对局信息类文本文档的生成成为可选项(Generation OPTION of text files of game information class) 从英雄联盟自定义房间创建程序集(算上之前存档的存储库)创建到此次更新前(实际上我开始撰写代码甚至比创建存储库要早一年),程序都是默认输出文本文档的。现在,在决定是否生成文本文档方面,用户具有选择权了。这主要是有两点考虑:其一,输出文本文档的过程涉及到大量文件读写操作,而在配置不佳的条件下,这可能导致文件资源管理器占用较多资源,进而导致游戏卡顿;其二,大量文本文档会使得文件夹内容混乱度增加,如果用户想要通过滚轮来翻转查找召唤师生涯工作簿,则要翻转很长时间。如果这两点问题的确有困扰到您,那么您可以选择不生成文本文档。但是,还是建议始终生成文本文档,因为【本地重查】模式依据的是这些文本文档的文件名。换言之,这些文本文档的文件名也是含有信息价值的。 Ever since the LoL-DIY-Program repository (including the archived repository) was created and until this update (actually I'd begun to created these programs one year before), the program always generates the text files. Now, whether to generate these text files is up to the user to decide. Here're mainly two considerations: on the one hand, text file generation involves a great amount of file input/output operations, which may cause the Explorer.exe to take up much resource and results in the low game FPS; on the other hand, increase of the number of text files contributes to the folder's entropy (the degree of chaos), and if the user is looking for the summoner profile workbook, then it'll take a long time. If these two problems do make a difference to your experience, then you may choose not to generate the text files. Nevertheless, you're suggested to always generate them, for [Local Recheck] is based on these text files' names. In other words, there lies information in these text files' names.
- 单独检查玩家邂逅情况(Check of single recently played summoner) 在此次更新前,近期一起玩过的玩家只能在英雄选择阶段进行检查。这样有一个限制——往往不能检查一名对手是否曾经遇到过,因为在所有队列房间中,对手信息是不可见的。现在,当程序检测到玩家正在游戏中时,允许玩家单独查询一名玩家是否曾经遇到过。 Before this update, recently played summoners can be checked only within the champ select stage. This limits the function - the user won't be able to check whether an enemy has been encountered before, for in all queue lobbies during champ select stage, enemy information are hidden. Now, if the program detects a user in game, then the user is allowed to check whether one summoner has been played with at a time. 二、实现细节(Implementation Details)
- 添加了排序工作表的代码。排序算法是通过逐渐计算每个工作表的原来的位置与排好序后的位置的差值,来对每个工作表进行移动。(自定义脚本5第5、3026、3027、3071和3133~3172行。)
Added the code to sort the sheets. The algorithm is designed to calculate the difference between each sheet's original position and its position after being sorted. The movement offset is based on this difference. (Lines 5, 3026, 3027, 3071 and 3133~3172 in Customized Program 5.)
说明:之前尝试问gpt-3.5对工作表进行排序,gpt-3.5给出的一个答案是通过读取所有工作表,再将所有工作表按照顺序追加到新的工作簿中,从而得到顺序工作表。这是非常暴力的一个算法,在时间和空间上开销都很大。后来gpt-3.5又提出了基于openpyxl库的load_workbook函数和move_sheet属性的方法,大大降低了时空开销。
Note: The first time I tried to ask gpt-3.5 how to sort the sheets, it suggested that I read in all the sheets and append the sheets to a new workbook according to a specific order to get the workbook with ordered sheets. This is a very brute-force algorithm that takes up great time and space. Later, gpt-3.5 put forward the approach based on the
load_workbook
function inopenpyxl
library and themove_sheet
attribute, which lowered the spatiotemporal cost significantly. - 添加了export_txt变量来控制文本文档的生成,并添加了相应的提示语和调整了部分代码的缩进。(自定义脚本5第1920、1921、1986、2023、2024、2026、2027、2508、2509和2538~2562行。)
Added a variable
export_txt
to control the generation of text files. Adaptively, added the corresponding prompt statements and adjusted the indentation of some code. (Lines 1920, 1921, 1986, 2023, 2024, 2026, 2027, 2508, 2509 and 2538~2562 in Customized Program 5.) - 添加了“正在游戏”状态下检测单名玩家是否曾经遇到过的代码。其中,部分变量以check为后缀,来表明它们属于【单独检查】部分代码。(自定义脚本11第2528~2530、2541、2543、2689~2782行。其中,检查召唤师名可用性的部分沿用了自定义脚本5和自定义脚本11的【生成模式】对于召唤师名可用性的判断。) Added the code to detect whether a single player has been encountered before when the gameflow phase is "InProgress". In this part, some variables are postfixed with "check" to indicate they belong to the code that implements [Single Check]. (Lines 2528~2530, 2541, 2543, 2689~2782 in Customized Program 11. The part that checks the summoner name availability inherits from the code that implements the judgment of summoner name eligibility in Customized Program 5 and the [Generate Mode] in Customized Program 11.)
- 原代码中的session变量现更名为champ_select_session,以和gameflow_session变量区分开来。(自定义脚本11第2559~2562、2612、2613、2673和2687行。)
The variable
session
is now renamed aschamp_select_session
to distinguish from the variablegameflow_session
. (Lines 2559~2562, 2612, 2613, 2673 and 2687 in Customized Program 11.) 说明:添加gameflow_session变量的原因是为了获取对局序号。在游戏中,“/lol-champ-select/v1/session”接口将返回“无可用委派”的提示,而“/lol-gameflow/v1/session”会正确地给出游戏信息。 Note: The reason for adding thegameflow_session
variable is to get the gameId. When a game is in progress, the APIlol-champ-select/v1/session
returnsNo active delegate
, while/lol-gameflow/v1/session
returns the game information as expected. 声明:由于本脚本基于LCU通信进行开发,是通过LeagueClientUx.exe获取连接信息的,而对局内的玩家信息是需要通过League of Legends.exe进行通信的,因此本程序集不会支持直接获取对局中的敌方信息,只能由玩家手动输入敌方的召唤师名或拳头ID。 Declaration: This program is developed based on LCU communication, and the connection is built through LeagueClientUx.exe. However, in-game player information can only be captured throughLeague of Legends.exe
. Therefore, this program (set) won't support directly fetching the enemies' information. The user has to input an enemy's summoner name or Riot ID by hand. - 本次更新还包括三条代码上的优化。
This update also introduces 3 code optimization ideas.
(1)调整了一处换行符。(自定义脚本5第3131行。)
Adjusted a line break character. (Line 3131 in Customized Program 5.)
(2)修复了一处提示错误。现在,所有“回退”替换为“转”,因为实际上在程序找不到一个版本的数据资源时而执行FindPostPatch函数时,FindPostPatch返回的是更新的一个版本,而不是更旧的一个版本。(自定义脚本5第1421、1494、1757、1823、2073、2122、2168、2223、2267、2656、2699、2792、2861、2924和2962行和自定义脚本11第1214、1287、1570、1625、1669、1906、1948、2036、2103、2163和2201行。)
Fixed a mistake in prompts. Now, all "回退"s are replaced by "转"s, because when the program fails to get the data resource of a patch and triggers off
FindPostPatch
function, this function returns a later patch, instead of an older patch. (Lines 1421, 1494, 1757, 1823, 2073, 2122, 2168, 2223, 2267, 2656, 2699, 2792, 2861, 2924 and 2962 in Customized Program 5 and Lines 1214, 1287, 1570, 1625, 1669, 1906, 1948, 2036, 2103, 2163 and 2201 in Customized Program 11.) (3)现在,要输出的近期一起玩过的英雄联盟玩家工作表和近期一起玩过的云顶之弈玩家工作表的表头分别被存储为recent_LoLPlayer_fields和recent_TFTPlayer_fields变量,以缩减代码规模。(自定义脚本11第2544~2551、2586、2588、2636、2638、2743和2744行。) Now, the headers of recently played LoL and TFT summoners' sheets are assigned to two variablesrecent_LoLPlayer_fields
andrecent_TFTPlayer_fields
, respectively, to simplify the code. (Lines 2544~2551, 2586, 2588, 2636, 2638, 2743 and 2744 in Customized Program 11.) (4)需要强调,现在当用户选择不生成文本文档时,“保存进度”的提示被“加载进度”取代。(自定义脚本5第2023~2027和2558~2562行。) Note that when a user chooses not to generate text files, the prompt "Saving process" is now replaced by "Loading process". (Lines 2023~2027 and 2558~2562 in Customized Program 5.) - 相应于第3条实现细节,调整了自定义脚本11的一条说明。(说明文档第153和154行。) Corresponding to the third implementation detail, adjusted an instruction of Customized Program 11. (Lines 379 and 380.) 三、发行版(Release) 从此版本开始,完整且必要的文件将被整理成一个压缩包,置于发行版中。发行版将跟随每次提交而更新。需要注意,在发行版中,“自定义房间创建(Custom Lobby Creation)”被重命名为“双语版(zh-CN & en-US)”。 Since this version, the complete and necessary files are sorted into a zip file and released. The release will follow the update of each commit. Note that the "自定义房间创建(Custom Lobby Creation)" folder is renamed as "双语版(zh-CN & en-US)" in the release.
refactor(proxy-wasm) improve pwexec resurrection and instance lifecycle
The main goal of this overhaul is to simplify on_context_create
, make
it fully re-entrant and properly handle instance recycling at the same
time.
The way to do so, in my opinion, was to move pwexec
creation where
rexec
already was. In other words, always lookup the context id in the
instance rbtree, and if not found, create it. This means that
surrounding code also needed big overhauls. It also removes the
reference counting poor man's GC of the older implementation. The code
became really ugly by then so I took the time to also review this
module's code structure instead of making a very ugly commit.
This new ngx_proxy_wasm.c file should be much easier to read and follow now.
One change I do not fully like is moving the next_id
to a global
counter, but we do not have a "global proxy-wasm conf" object yet. I
also started thinking about pre-allocating a number of pwexecs
(like
worker_connections
) and use free/busy queue that all filter chains can
dip into to get a context id + context memory zone. Perhaps for a later
time.
SPC Rant Version 3.0
Implemented a robust JavaScript function to enable Dark Mode and Light Mode seamlessly across both 'index.php' and 'rant.php'. Users now have the flexibility to choose their preferred theme for a personalized browsing experience.
Revamped the user posts display to enhance the overall aesthetic and user experience. The new design ensures better readability and engagement, aligning with modern web design standards.
Introduced an advanced comment system with improved functionality. Users can now express their thoughts and engage in discussions effectively. The new system is designed for both simplicity and user-friendliness.
Added a modal popup to the 'Rant Now' feature, providing a more interactive and visually appealing interface. Users can now compose their rants seamlessly within the modal, enhancing the overall user journey.
Implemented a like counter feature to track user engagement with posts. Although the feature currently operates without a database integration, it lays the foundation for upcoming database implementation.
Introduced Ajax code snippets to the project, improving the overall responsiveness and interactivity of the web application. Ajax ensures smoother data retrieval and enhances the user experience without requiring a full page reload.
Conducted performance optimizations to streamline the application. This includes code refactoring and adjustments aimed at achieving better loading times and overall efficiency.
Addressed several bugs and enhanced the stability of the application. Resolved issues reported during testing to ensure a seamless and error-free user experience.
Provided a sneak peek into upcoming features and functionalities planned for future releases. Stay tuned for exciting additions to further enrich the user experience.
This update marks significant progress in enhancing the functionality and aesthetics of [Your Web Application Name]. Looking forward to the continuous evolution of the project with upcoming features and improvements.
Step 1: Access phpMyAdmin
- Open your web browser.
- Go to http://localhost/phpmyadmin/index.php?route=/.
Step 2: Navigate to Import Section
- Once logged in, find and click on the "Import" tab in the top navigation menu.
Step 3: Choose File
- In the "File to import" section, click the "Choose File" button.
- Select the ".sql" file you want to import from your local machine.
Step 4: Upload File
- After selecting the file, click the "Go" or "Open" button to upload the ".sql" file.
Step 5: Configure Import Options
- Scroll down to view additional options if needed.
- You can configure settings such as character set or collation.
Step 6: Start Import
- Once configured, scroll down further.
- Click the "Go" or "Import" button to start the import process.
Step 7: Wait for Completion
- Wait for the import process to complete. The time taken depends on the size of the SQL file.
Step 8: Confirmation
- Once completed, you should see a confirmation message indicating a successful import.
realized that I hadn't actually solved the player name bug cause I hadn't put any code about it in the mapcontroller. I hate my life.
Remove Darkdustry from the Global Server List
The time has come. It's been more than two years since we started Mindurka, which was later renamed to Darkdustry. It was an amazing time and an amazing experience to maintain the server, to create plugins and gamemodes, to discuss mindustry with all of you. But It's enough. The server is getting constantly DDoSed, the host dies all the time and I have no motivation to develop anything related to Mindustry. Goodbye. And I hope, we'll meet again.
Abandoned Domains: Adds two new psyker-oriented virtual domains (#78892)
Really? Bitrunning maps are so simple you could do them with your eyes closed? Hmmmmm...
This adds two new medium-difficulty virtual domains to the pool -- Crate Chaos and Infected Domain.
These two domains take you to neglected corners of the virtual world. These are unstable, bizarre locales that do not support the bitrunning machine's visual display, and must be traversed using echolocation. These domains have been designed around you being a psyker, and will turn your bitrunner avatar into a psyker until they leave the domain.
Crate Chaos: Low cost, medium reward.
Sneak into an abandoned virtual domain, where they store all of the loot crates. There's about 40-ish crates in this space, and one of them (RANDOM) is the encrypted cache we're looking for. The crates must be manually inspected, requiring you to drop your weapon for a few moments, but that shouldn't be a problem. There's no hostiles, just a bunch of crates... right?
This one has very few shenanigans or threats in it. It's meant to be an introductory experience to interfacing with things as a psyker, and getting the rhythm down for moving between visual pulses.
Infected Domain: Medium cost, high reward.
Enter another abandoned virtual domain. This one was sealed off from the digital world after the cyber-police failed to contain a virus that zombified its inhabitants, leaving it to grow unstable and full of holes. Fortunately, you're provided with the single best tool for arming yourself against zombies in any video game, ever -- Your very own Mystery Box. Get armed with (basically) whatever gun you want, and go put those wacky psyker abilities to use against those zombies.
This one is a lot meaner. Many chasms, landmines, and zombies. Walk slowly, stay with your fellow bitrunners, and if it's too hard, there's no shame in going back and rolling for a better gun!
The domains themselves are VERY simple, since there's little need for decor or particularly complex layouts. The idea is that you should be able to see everything you need to see in a given room/area with a single vision pulse. Here's what one of the maps looks like:
Err, uh, I mean... This is what the maps look like:
SPOILERS BEWARE
(You wanna find out if there's something cool under those red lines? Go there yourself!)
These two psyker maps come with their own psyker safehouse too -- The Bathroom. It's gross, the medical supplies are kind of just sitting there on the floor... It looks a little bit better when you're blind, I guess.
I like psykers a lot more than I'm willing to admit. Unfortunately, the jankiness of echolocation provides such a disadvantage at times, that any "real" conflict is usually over before the psyker is even aware they're taking damage.
Fortunately, the controlled environments that bitrunning maps are perfect for psykers. They give the opportunity to craft an experience around the player being blind, rather than forcing them to play blind through a seeing mans world.
These two domains should present players with a unique challenge that is designed around playing as a psyker, with slightly higher-than-usual rewards for their trouble. More importantly -- They're fun!
🆑 Rhials add: Two new psyker-oriented virtual domains -- Crate Chaos and Infected Domain. add: Map helper for cyber-police corpse spawn. add: Map helper for swapping the encrypted crate in an area with a random crate from that same area. /🆑
General code maintenance for rcd devices and their DEFINE file (#78443)
The changes made can be best summarized into points
1. Cleans up code/_DEFINES/construction.dm
Looking at the top comment of this file
One would expect stuff related to materials, rcd, and other construction related stuff. Well this file is anything but
Why is there stuff related to food & crafting over here then?
It gets worse why are global lists declared here?
https://github.com/tgstation/tgstation/blob/0fb8b8b218400b3f1805ae81e9bb0364d7a4e9c6/code/__DEFINES/construction.dm#L115
There is a dedicated folder to store global lists i.e.
code/_globalvars/lists
for lists like these. These clearly don't
belong here
On top of that a lot of construction related defines has been just dumped here making it too large for it's purposes. which is why this file has been scraped and it's
- crafting related stuff have been moved to its
code/_DEFINES/crafting.dm
- global lists for crafting moved to
code/_globalvars/lists/crafting.dm
- Finally remaining construction related defines split apart into 4
file types under the new
code/_DEFINES/construction
folder
code/_DEFINES/construction/actions.dm
-> for wrench act or other construction related actionscode/_DEFINES/construction/material.dm
-> contains your sheet defines and cable & stack related values. Also mergedcode/_DEFINES/material.dm
with this file so it belongs in one placecode/_DEFINES/construction/rcd.dm
-> dedicated file for everything rcd relatedcode/_DEFINES/construction/structures.dm
-> contains the construction states for various stuff like walls, girders, floodlight etc
By splitting this file into multiple meaningful define file names will help in reducing merge conflicts and will aid in faster navigation so this is the 1st part of this PR
2. Debloats the RCD.dm
file(Part 1)
This uses the same concepts as above. i.e. moving defines into their appropriate files for e.g.
- Global vars belong in the
code/_globalvars
folder so these vars and their related functions to initialize them are moved into thecode/_globalvars/rcd.dm
file - See this proc
https://github.com/tgstation/tgstation/blob/0fb8b8b218400b3f1805ae81e9bb0364d7a4e9c6/code/game/objects/items/rcd/RCD.dm#L200
This proc does not belong to the obj/item/construction/rcd
type it's a
global "helper function" this is an effect proc as it creates rcd
holograms so it has been moved to the code/game/objects/effects/rcd.dm
file which is a global effect that can be used by anyone
And with that we have moved these vars & procs into their correct places & reduced the size of this file . We can go even further
3. Debloats the RCD.dm
file(Part 2)
This deals with the large list which contains all the designs supported
by the RCD
This list contains a lot of local defines. We can scrape some of them and reduce the overall bulkiness & memory requirements of this list and so the following defines
#define WINDOW_TYPE "window_type"
#define COMPUTER_DIR "computer_dir"
#define WALLFRAME_TYPE "wallframe_type"
#define FURNISH_TYPE "furnish_type"
#define AIRLOCK_TYPE "airlock_type"
#define TITLE "title"
#define ICON "icon"
#define CATEGORY_ICON_STATE "category_icon_state"
#define CATEGORY_ICON_SUFFIX "category_icon_suffix"
#define TITLE_ICON "ICON=TITLE"
Have all been removed making this list a lot more cleaner. Why? because a lot of these are just semantic sugar, we can infer the value of a lot of these defines if we just know the type path of the structure the rcd is trying to build for e.g. take these 2 defines
These defines tell the rcd UI the name and the icon it should display. Rather than specifying these manually in the design we can infer them like this
var/obj/design = /obj/structure/window //let's say the rcd is trying to build an window
var/name = initial(design.name) //we have inferred the name of the design without requiring TITLE define
var/icon = initial(design.icon_state) //we have inferred the icon of the design without requiring ICON define
And so by using similar logic to the remaining defines we can eliminate a lot of these local defines and reduce the overall size of this list.
The same logic applies to the different modes of construction, the following defines
https://github.com/tgstation/tgstation/blob/0fb8b8b218400b3f1805ae81e9bb0364d7a4e9c6/code/__DEFINES/construction.dm#L186-L192
Have all been removed and replaced with a single value RCD_STRUCTURE
All these modes follow the same principle when building them
- First check the turf if the structure exists. If it does early return
- If not create a new structure there and that's it
So rather than creating a new construction mode every time you want to add a new design we can use this mode to apply this general approach every time
The design list has also now been made into a global list rather than a private static list. The big advantage to this is that the rcd asset cache can now access this list and load the correct icons from the list directly. This means you no longer have to manually specify what icons you want to load which is the case currently.
https://github.com/tgstation/tgstation/blob/0fb8b8b218400b3f1805ae81e9bb0364d7a4e9c6/code/modules/asset_cache/assets/rcd.dm#L8-L9 This has lead to the UI icons breaking twice now in the past
- #74194
- #77217
Hopefully this should never repeat itself again
4. Other RCD like device changes
- Fixed the broken silo link icon when the radial menu of the RLD was opened
- replaced a lot of vars inside RLD with defines to save memory
- Small changes to
ui_act
across RCD, Plumbing RCD and RTD - Removed unused vars in RCD and snowflaked code
- Moved a large majority of
ui_data()
toui_static_data()
making the experience much faster
Just some general clean up going on here
5. The Large majority of other code changes
These are actually small code changes spread across multiple files.
These effect the rcd_act()
& the rcd_vals()
procs across all items.
Basically it
- Removes a large majority of
to_chat()
&visible_message()
calls. This was done because we already have enough visual feedback of what's going on. When we construct a wall we don't need ato_chat()
to tell us you have a built a wall, we can clearly see that - replaces the static string
"mode"
with a predefined constantRCD_DESIGN_MODE
to bring some standard to use across all cases
Should reduce chat spam and improve readability of code.
6. Airlock & Window names The rcd asset cache relies on the design name to be unique. So i filled in the missing names for some airlocks & windows which are subjective and open to change but must have some value
7 Removes Microwave PDA upgrade The RCD should not be allowed to build this microwave considering how quickly it can spawn multiple structures and more importantly as it's a special multipurpose machine so you should spend some effort in printing it's parts and acquiring tools to complete it. This upgrade makes obsolete the need to carry an
- A RPED to install the parts
- A screwdriver to complete the frame
- The circuit board for the microwave
The most important point to note here is that whenever an RPED/circuit board is printed at an lathe it charges you "Lathe Tax". The RCD with this upgrade would essentially bypass the need to "Pay Taxes" at these lathes as you are just creating a circuit board from thin air. This causes economy imbalance(10 cr per print) which scales up the more of these machines you make so to avoid this let's end the problem here
Not to mention people would not find the need to print the circuit board for a regular microwave now if they have an RCD because they can just make this microwave type making the need for a regular microwave completely pointless.
Just build a machine frame with the RCD and complete the microwave from there
🆑 code: moved global vars, lists and helper procs for construction related stuff to their appropriate files code: reduced overall code size & memory of rcd design list and removed unused defines refactor: removed a ton of chat alerts for rcd related actions to help reduce chat spam refactor: some airlock & window default names have changed fix: broken icon in radial menu of rld silo link remove: removes microwave pda upgrade from RCD. It's a special machine so spend some time in building it rather than shitting them out for free with the RCD. Use the RCD upgrade to spawn a machine frame instead & go from there /🆑
Co-authored-by: Ghom [email protected]
tools: Move to rtx
Mostly as always due to Python issues. Pyenv was a constant pain in the ass, it was slow as fuck, there were other issues as well that my brain has wiped away for protection.
Rtx seems fast and includes all the tools I need. Hopefully it'll work consistently across tools. Tools like pyenv and jenv would copy the original rbenv way but then differ due to some fucking reasons like being pythonic. I think jenv never set JAVA_HOME or some brain dead shit like that.
This allows me to replace at least the following tools:
- rbenv
- nodenv
- tfenv
- pyenv
- jenv
Makefile.lib: Lower kernel gzip compression to fastest
You're reading this - so you're trying to understand "JUST WHY OMG". That's already a good step.
First of all, this is a downstream kernel - always keep that in mind! Now, this kernel is targeting new very powerful Qualcomm platforms like SM8250 and the Sony Edo platform - which has a very fast UFS card.
Keep in mind that the bootloader sets the CPU at a frequency that is slightly faster than the "in the middle" ones, which is anyway not veeeery fast - but that's good, really. I agree.
So.. check this out: for Image.gz-dtb..... COMP_LEVEL SIZE 9 20116171 5 20220479 2 20940223 1 21231290
Remember again that we're loading from a UFS card and that we are loading ~1.1MB more out of a 20MB file. If you're smart enough you surely know already about RAM and CPU overhead of very high compression levels.
If you still disagree with what I just did, read this commit description another 20 times, or more, until you understand it. :)))
AOTAutograd: handle set_(), detect metadata mutations that cancel out (#111554)
This should be enough to get @voznesenskym 's FSDP branch to plumb set_()
through AOTAutograd properly and have everything properly no-op out. Main changes are:
(1) graph break on aten::set_.source_Tensor_storage_offset
(we could support it but it isn't needed, seems safer to graph break)
(2) Functionalization: add a "proper" functionalization kernel for aten::set_.source_Tensor
. The previous one we had was codegen'd and it was wrong (it would just clone() and call set_(), which does not do the right thing). I also manually mark on the FunctionalTensorWrapper
when a given tensor has been mutated by a set_()
call.
(3) AOTAutograd: I added a new field, InputAliasInfo.mutates_storage_metadata
, so we can distinguish between "regular" metadata mutations, and metadata mutations due to set_()
calls. This is mainly because at runtime, one requires calling as_strided_()
to fix up metadata, while the other requires calling set_()
.
(4) Made AOTAutograd's detection for metadata mutations / set_() mutations smarter and detect no-ops (if the storage and metadata are all the same).
I also killed was_updated()
and was_metadata_updated()
, and replaced them with (existing) has_data_mutation()
and (new) has_data_mutation()
, which can more accurately distinguish between data-mutation vs. set_()
calls vs. metadata-mutation
This PR is still silently correct in one case though, which I'd like to discuss more. In particular, this example:
def f(x):
x_view = x.view(-1)
x.set_(torch.ones(2))
x_view.mul_(2)
return
If you have an input that experiences both a data-mutation and a x_old.set_(x_new)
call, there are two cases:
(a) the data mutation happened on the storage of x_new
. This case should be handled automatically: if x_new is a graph intermediate then we will functionalize the mutation. If x_new is a different graph input, then we will perform the usual copy_()
on that other graph input
(b) the data mutation happened on the storage of x_old
. This is more of a pain to handle, and doesn't currently work. At runtime, the right thing to do is probably something like:
def functionalized_f(x):
x_view = x.view(-1)
# set_() desugars into a no-op; later usages of x will use x_output
x_output = torch.ones(2)
# functionalize the mutation on x_view
x_view_updated = x.mul(2)
x_updated = x_view_updated.view(x.shape)
# x experienced TWO TYPES of mutations; a data mutation and a metatadata mutation
# We need to return both updated tensors in our graph
return x_updated, x_output
def runtime_wrapper(x):
x_data_mutation_result, x_set_mutation_result = compiled_graph(x)
# First, perform the data mutation on x's old storage
x.copy_(x_data_mutation_result)
# Then, swap out the storage of x with the new storage
x.set_(x_set_mutation_result)
There are two things that make this difficult to do though:
(1) Functionalization: the functionalization rule for set_()
will fully throw away the old FunctionalStorageImpl
on the graph input. So if there are any mutations to that FunctionalStorageImpl
later on in the graph, the current graph input won't know about it. Maybe we can have a given FunctionalTensorWrapper
remember all previous storages that it had, and track mutations on all of them - although this feels pretty complicated.
(2) AOTAutograd now needs to know that we might have two graph outputs that correspond to a single "mutated input", which is annoying.
It's worth pointing out that this issue is probably extremely unlikely for anyone to run into - can we just detect it and error? This feels slightly easier than solving it, although not significantly easier. We would still need FunctionalTensorWrapper
to keep track of mutations on any of its "previous" storages, so it can report this info back to AOTAutograd so we can raise an error.
Pull Request resolved: pytorch/pytorch#111554 Approved by: https://github.com/ezyang
Gizmo Arrows (#10550)
- Add an arrow gizmo as suggested by #9400
(excuse my Protomen music)
2023-11-13.22-30-00.mp4
Wasn't horribly hard when i remembered i can change coordinate systems whenever I want. Gave them four tips (as suggested by @alice-i-cecile in discord) instead of trying to decide what direction the tips should point.
Made the tip length default to 1/10 of the arrow's length, which looked good enough to me. Hard-coded the angle from the body to the tips to 45 degrees.
- actual doc comments
- doctests
-
ArrowBuilder.with_tip_length()
- Added
gizmos.arrow()
andgizmos.arrow_2d()
- Added arrows to
2d_gizmos
and3d_gizmos
examples
N/A
Co-authored-by: Nicola Papale [email protected]
Puts all traits in the globalvars file + CI Testing (#79642)
Fixes #76349
I didn't know that people needed to add any new traits to a global list so they can be easily read in View Variables, and was pretty shocked to find out many other people didn't know it was a thing. Let's make it a thing by testing it using a new CI Python Linter to check this. But oh no-
There were about 200+ missing traits. Alright, so let's do the following:
- Move trait defines to their own dedicated folder in the
_DEFINES
folder. - Split up the traits mega-file into different files, for better organization. One for the macros, one for the sources, and a few for the "trait declarations"
- Run the linter a load of times and add everything to the globalvars file, removing anything that's no longer used and figuring out where the best categorization of it is. also minor code improvements. also rename all of the ones that look weird. also fix list indentations
- Also alphabetize the lists because it's easy
- Move everything to a new
traits_by_type
list, while keeping the admin one the way it is for the time being while we figure out a better way to show that list to admins. - Profit
Mapping trait injectors will now work for any type of trait. You shouldn't add any trait via this injector though, but you're no longer limited to coders remembering to add it to that critical list you needed.
Lays the framework for a better view variables experience. This work is too lengthy to presently do, but hopefully we can get this done sooner rather than later. we will need a code-accessible way to view these traits for such a framework to be implemented, so let's just do that.
Future steps are to break down the mega-declarations file into a folder full of separate files by typepath, but that requires a lot of auditing. Does need to happen one day though, there's a lot of mob traits mingled with datum traits and auuugh we gotta do this later this PR is already massive.
there's probably ways to game this but this catches my mistakes so good luck to everyone else (it should work for 99% of everyone)
Nothing applicable to players. However, to mappers, the mapping trait injector should always be able to add any kind of trait (which is rather good for the times when you need it).
bpf: Add fd-based tcx multi-prog infra with link support
This work refactors and adds a lightweight extension ("tcx") to the tc BPF ingress and egress data path side for allowing BPF program management based on fds via bpf() syscall through the newly added generic multi-prog API. The main goal behind this work which we also presented at LPC [0] last year and a recent update at LSF/MM/BPF this year [3] is to support long-awaited BPF link functionality for tc BPF programs, which allows for a model of safe ownership and program detachment.
Given the rise in tc BPF users in cloud native environments, this becomes necessary to avoid hard to debug incidents either through stale leftover programs or 3rd party applications accidentally stepping on each others toes. As a recap, a BPF link represents the attachment of a BPF program to a BPF hook point. The BPF link holds a single reference to keep BPF program alive. Moreover, hook points do not reference a BPF link, only the application's fd or pinning does. A BPF link holds meta-data specific to attachment and implements operations for link creation, (atomic) BPF program update, detachment and introspection. The motivation for BPF links for tc BPF programs is multi-fold, for example:
-
From Meta: "It's especially important for applications that are deployed fleet-wide and that don't "control" hosts they are deployed to. If such application crashes and no one notices and does anything about that, BPF program will keep running draining resources or even just, say, dropping packets. We at FB had outages due to such permanent BPF attachment semantics. With fd-based BPF link we are getting a framework, which allows safe, auto-detachable behavior by default, unless application explicitly opts in by pinning the BPF link." [1]
-
From Cilium-side the tc BPF programs we attach to host-facing veth devices and phys devices build the core datapath for Kubernetes Pods, and they implement forwarding, load-balancing, policy, EDT-management, etc, within BPF. Currently there is no concept of 'safe' ownership, e.g. we've recently experienced hard-to-debug issues in a user's staging environment where another Kubernetes application using tc BPF attached to the same prio/handle of cls_bpf, accidentally wiping all Cilium-based BPF programs from underneath it. The goal is to establish a clear/safe ownership model via links which cannot accidentally be overridden. [0,2]
BPF links for tc can co-exist with non-link attachments, and the semantics are in line also with XDP links: BPF links cannot replace other BPF links, BPF links cannot replace non-BPF links, non-BPF links cannot replace BPF links and lastly only non-BPF links can replace non-BPF links. In case of Cilium, this would solve mentioned issue of safe ownership model as 3rd party applications would not be able to accidentally wipe Cilium programs, even if they are not BPF link aware.
Earlier attempts [4] have tried to integrate BPF links into core tc machinery to solve cls_bpf, which has been intrusive to the generic tc kernel API with extensions only specific to cls_bpf and suboptimal/complex since cls_bpf could be wiped from the qdisc also. Locking a tc BPF program in place this way, is getting into layering hacks given the two object models are vastly different.
We instead implemented the tcx (tc 'express') layer which is an fd-based tc BPF attach API, so that the BPF link implementation blends in naturally similar to other link types which are fd-based and without the need for changing core tc internal APIs. BPF programs for tc can then be successively migrated from classic cls_bpf to the new tc BPF link without needing to change the program's source code, just the BPF loader mechanics for attaching is sufficient.
For the current tc framework, there is no change in behavior with this change and neither does this change touch on tc core kernel APIs. The gist of this patch is that the ingress and egress hook have a lightweight, qdisc-less extension for BPF to attach its tc BPF programs, in other words, a minimal entry point for tc BPF. The name tcx has been suggested from discussion of earlier revisions of this work as a good fit, and to more easily differ between the classic cls_bpf attachment and the fd-based one.
For the ingress and egress tcx points, the device holds a cache-friendly array with program pointers which is separated from control plane (slow-path) data. Earlier versions of this work used priority to determine ordering and expression of dependencies similar as with classic tc, but it was challenged that for something more future-proof a better user experience is required. Hence this resulted in the design and development of the generic attach/detach/query API for multi-progs. See prior patch with its discussion on the API design. tcx is the first user and later we plan to integrate also others, for example, one candidate is multi-prog support for XDP which would benefit and have the same 'look and feel' from API perspective.
The goal with tcx is to have maximum compatibility to existing tc BPF programs, so they don't need to be rewritten specifically. Compatibility to call into classic tcf_classify() is also provided in order to allow successive migration or both to cleanly co-exist where needed given its all one logical tc layer and the tcx plus classic tc cls/act build one logical overall processing pipeline.
tcx supports the simplified return codes TCX_NEXT which is non-terminating (go to next program) and terminating ones with TCX_PASS, TCX_DROP, TCX_REDIRECT. The fd-based API is behind a static key, so that when unused the code is also not entered. The struct tcx_entry's program array is currently static, but could be made dynamic if necessary at a point in future. The a/b pair swap design has been chosen so that for detachment there are no allocations which otherwise could fail.
The work has been tested with tc-testing selftest suite which all passes, as well as the tc BPF tests from the BPF CI, and also with Cilium's L4LB.
Thanks also to Nikolay Aleksandrov and Martin Lau for in-depth early reviews of this work.
[0] https://lpc.events/event/16/contributions/1353/ [1] https://lore.kernel.org/bpf/CAEf4BzbokCJN33Nw_kg82sO=xppXnKWEncGTWCTB9vGCmLB6pw@mail.gmail.com [2] https://colocatedeventseu2023.sched.com/event/1Jo6O/tales-from-an-ebpf-programs-murder-mystery-hemanth-malla-guillaume-fournier-datadog [3] http://vger.kernel.org/bpfconf2023_material/tcx_meta_netdev_borkmann.pdf [4] https://lore.kernel.org/bpf/[email protected]
Signed-off-by: Daniel Borkmann [email protected] Acked-by: Jakub Kicinski [email protected] Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov [email protected]
bpf: Add generic attach/detach/query API for multi-progs
This adds a generic layer called bpf_mprog which can be reused by different attachment layers to enable multi-program attachment and dependency resolution. In-kernel users of the bpf_mprog don't need to care about the dependency resolution internals, they can just consume it with few API calls.
The initial idea of having a generic API sparked out of discussion [0] from an earlier revision of this work where tc's priority was reused and exposed via BPF uapi as a way to coordinate dependencies among tc BPF programs, similar as-is for classic tc BPF. The feedback was that priority provides a bad user experience and is hard to use [1], e.g.:
I cannot help but feel that priority logic copy-paste from old tc, netfilter and friends is done because "that's how things were done in the past". [...] Priority gets exposed everywhere in uapi all the way to bpftool when it's right there for users to understand. And that's the main problem with it.
The user don't want to and don't need to be aware of it, but uapi forces them to pick the priority. [...] Your cover letter [0] example proves that in real life different service pick the same priority. They simply don't know any better. Priority is an unnecessary magic that apps have to pick, so they just copy-paste and everyone ends up using the same.
The course of the discussion showed more and more the need for a generic, reusable API where the "same look and feel" can be applied for various other program types beyond just tc BPF, for example XDP today does not have multi- program support in kernel, but also there was interest around this API for improving management of cgroup program types. Such common multi-program management concept is useful for BPF management daemons or user space BPF applications coordinating internally about their attachments.
Both from Cilium and Meta side [2], we've collected the following requirements for a generic attach/detach/query API for multi-progs which has been implemented as part of this work:
- Support prog-based attach/detach and link API
- Dependency directives (can also be combined):
- BPF_F_{BEFORE,AFTER} with relative_{fd,id} which can be {prog,link,none}
- BPF_F_ID flag as {fd,id} toggle; the rationale for id is so that user space application does not need CAP_SYS_ADMIN to retrieve foreign fds via bpf_*_get_fd_by_id()
- BPF_F_LINK flag as {prog,link} toggle
- If relative_{fd,id} is none, then BPF_F_BEFORE will just prepend, and BPF_F_AFTER will just append for attaching
- Enforced only at attach time
- BPF_F_REPLACE with replace_bpf_fd which can be prog, links have their own infra for replacing their internal prog
- If no flags are set, then it's default append behavior for attaching
- BPF_F_{BEFORE,AFTER} with relative_{fd,id} which can be {prog,link,none}
- Internal revision counter and optionally being able to pass expected_revision
- User space application can query current state with revision, and pass it along for attachment to assert current state before doing updates
- Query also gets extension for link_ids array and link_attach_flags:
- prog_ids are always filled with program IDs
- link_ids are filled with link IDs when link was used, otherwise 0
- {prog,link}_attach_flags for holding {prog,link}-specific flags
- Must be easy to integrate/reuse for in-kernel users
The uapi-side changes needed for supporting bpf_mprog are rather minimal, consisting of the additions of the attachment flags, revision counter, and expanding existing union with relative_{fd,id} member.
The bpf_mprog framework consists of an bpf_mprog_entry object which holds an array of bpf_mprog_fp (fast-path structure). The bpf_mprog_cp (control-path structure) is part of bpf_mprog_bundle. Both have been separated, so that fast-path gets efficient packing of bpf_prog pointers for maximum cache efficiency. Also, array has been chosen instead of linked list or other structures to remove unnecessary indirections for a fast point-to-entry in tc for BPF.
The bpf_mprog_entry comes as a pair via bpf_mprog_bundle so that in case of updates the peer bpf_mprog_entry is populated and then just swapped which avoids additional allocations that could otherwise fail, for example, in detach case. bpf_mprog_{fp,cp} arrays are currently static, but they could be converted to dynamic allocation if necessary at a point in future. Locking is deferred to the in-kernel user of bpf_mprog, for example, in case of tcx which uses this API in the next patch, it piggybacks on rtnl.
An extensive test suite for checking all aspects of this API for prog-based attach/detach and link API comes as BPF selftests in this series.
Thanks also to Andrii Nakryiko for early API discussions wrt Meta's BPF prog management.
[0] https://lore.kernel.org/bpf/[email protected] [1] https://lore.kernel.org/bpf/CAADnVQ+gEY3FjCR=+DmjDR4gp5bOYZUFJQXj4agKFHT9CQPZBw@mail.gmail.com [2] http://vger.kernel.org/bpfconf2023_material/tcx_meta_netdev_borkmann.pdf
Signed-off-by: Daniel Borkmann [email protected] Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov [email protected]
Revert "if you die in a mech you are ejected" (#79768)
Reverts tgstation/tgstation#79380 this is literally what the mech removal tool is for. gameplay reasons for that tool missing do not mean that we need to remove its use - if you want a better solution then let people purchase it... or just smash the mech- you saving their life and them being sad about their mech is really funny the original pr being marked as qol when that was a specific balance change is very stupid
🆑 del: if you die in a mech you again don't automatically eject /🆑
Create Phantom : The Meaning of Lie.html
Misty@dissapointed : "but still Ms Sabrina so scornfully repellend Marc you know he's still her only relative nevertheless.." Ash@straight : "the bigger question though compeer is that first he rejected your.. appreciation for his inclinations as you.." Misty@angry : "shut up you b.. he's way better than you at handling emotions of losing something#.." Ash@happy : "this reminds me something you see in the battle i only devised a scheme where it was un ill favoured match for Ms Birch because you never win against a Lokix if you're using an Goodra you see as then you expect the Bug to find a way to get under your skin so that you can trap it in the long run but the psychic enthusiasm that needs to be present for that is only going to be darkened by the illusion..shh..of your poise..sometimes it feels better just ot good enough to be on top of self something you'd agree..shh..only upon retrospective parity.." Misty@very Angry : "shut up you b.. how dare you challenge my inclinations#.." Ash@happy : "it's almost midnight compeer why don't you come over to Sabrina's cabin along Marc giving a false alarm even if he suspects your motives he fails to overcome logic and coincidence even if not emotion..shh..so quantifiable.." Misty@frown : "you do it yourself i'm not a deceitful cheat in such an occasion so perfect for emotional blackmailing and no i'm not going to stay there either bye.." Ash@shrug : "what is this strange idea of evaluatory morality despite overseeing Mr Slatr#.." Brock@scowl : "a tribute to all pervasiveness night#.." Ash@shrug : "fair enough the least inflected..shh..yet only as me#..now the trap will test not only emotion but also security..(happy)..shh..so unmonitored unless for emotional casualties..right.. been been been been my..seem seem seem seem thy/lastly hallucinate/that imposter of thought/captures ego's bot/to surveillance self.. thus alarm bell secured your mail alas you feel i cheat/been been all just my/seemy describe/thys feels..thee.. Thus Ash means lastly Further left no Me.." Sabrina,Marc+Misty,Brock@scowl : "what created the commotion of shadowy figures and what forced the bond of souls to surpass the hype of suspense's own#.." Ash@happy : "you're only going to find clues Gyre just as them while neglecting the fact that i'm ever haunted by selfs in terms of probable identities for one and each..on the wheels of truth it's only the more manifest where trivial facts become projected as desire paramount.. thus neither the Ceruledges or Armarogues or Machamps and so on nor the motions of what actually was moving nor the desires what proved to be only self deceiving would've seemed to be..shh..self counterin'..and Team Sic failed to understand it wasn't at all them who were pulling the strings rather their mere..desire to be just as mot them their selves..the more metaphorical is reality as is the legendary forward claim.." 🐺@scowl : "for the rest than me in terms of self it's the same me a result of being left ever free by the self countering hope and hopelessness rendering theleftover me ever free cunning indeed Ash apnei you're still under the purview of evaluatory tax having come in relativity thus our endeavours rhyming.." Ash@shrug : "well i declared first up still Gyre unless only you would POPULARIZE do i have to be me..shh..through the comis of seein'..Phantom : The Meaning of Lie.." 🐺@scowl : "amen..bye#..Sabrina,Marc+Misty,Brock..Phantom : The Meaning of Lie,#,.."
Fixes sending stuff to "Old" Chat (#79819)
This functionality was removed in #79479
(e1c6cfdce89c7dbcd507d0c44803f5407a042a96), and we should still be
supporting the old chat anyways because it contains a plethora of useful
BYOND information that we still can really leverage (such as the
built-in profiler and stuff like that) and it's going to be painful to
do that if you have to keep spamming fix-chat
to see OOC/ASAY while
alternating every damn time.
It's ugly but we still need it. There's a reason why we still have it.
🆑 fix: "Old Chat" (AKA: The old-styled non-TGUI raw-HTMLesque chat that you might see when it prods you with the "Failed to load fancy chat!" issue) should now get all text messages as expected. /🆑
just commiting this shit pile, what the holy fuck is going on here assholes ...
wip: validate BaseMessage
I've decided to go with valgo after all, it being the least bad option of those considered. If I had enough time, I'd have just made a brand new parsing framework because absolutely everything I've seen is a flaming bag of carcinogenic thermonuclear waste.
Like, you can't even tell it that all fields are required. All the other languages I've used had that by default — you'd have to consciously tell them that a field can be omitted, which is a perfectly sensible behavior, except apparently in Go. I guess it's just not the Go way. The Go way is to put EVERYTHING behind a pointer indirection because heap is cheap and value semantics were invented by naive sophists who never deal with the real world and for the likes of them. Stupid me, I know. Whyever would I want to check if all fields are specified, indeed. People don't need reasonable and actionable error messages, why would they.
Oh, the error messages! That's a great one. You see, Decode() returns a
generic error
instead of something specific. Well, it's just the
common convention because Go has those interface nils that aren't
actually nil, so if you don't want to lose your sanity over such a
trivial mistake, you'll just go with error even if you only ever return
a single concrete error type. Well, you can tell people what that type
is in the docs, at least.
Therefore json.Decoder() does not. I had to browse the source code to see what errors it could return. This led me to find many unspoken horrors, such as the fact that DisallowUnknownFields() returns an *errors.errorString when that particular check is triggered, so you can't detect that at all. Moreover, custom Unmarshal implementations can just yeet whatever they want as an error.
You want to know any of the following about your particular error?
- which field triggered it
- whether it was due to invalid syntax, type mismatch, or semantic check failure Well, guess what. You can't.
These errors are just like exceptions except much worse because you can ignore them even if you don't mean to. I hate exceptions with a burning passion, but I can't bring myself to hate Go errors lest I should turn into a fuming volcano and make the whole world writhe in chemical flames, and that's illegal.
I don't even want to mention — but as you can see I will nonetheless — the fact that Decode() does not check for trailing junk at the end of the input. Whereas Unmarshal() does. But the latter also ignores unknown fields provided in the input (why? and why is it the default????). You can tell a custom Decoder you don't want that — great, but now you can't do anything about the trailing junk! Except, I guess, get the current scanner position in the input stream and compare that against the input length. I remember C's strtol working like that, and that was fine because it was C; but in Go this is a bit cringey.
...You see why I wanted to make my own parser framework yet?
And, uhm, sorry. For hijacking your commit log. Here, have a cookie: 🍪.
fixup: burn in hell clint, hope you die a painful death
change holy ziggurat floors to include more monsters (#3118)
adds sun moths, holy swine & seraphs to holy zig floors
holy swine have a decreasing chance to spawn at lower depths & seraphs have an initially very low spawn rate which increases with depth and zigs completed
[Committer's note: No holy swine. Plenty of non-branch Zig sets leave out the weakest enemies in their themes, and the current slim vaults using holy swine have at least some gesture of demonic magic, Xom, or Kirke having done something malevolent, while a ziggurat doesn't. Sun moths get half weight; they are technically holy, but they don't really fit much with the other holies, they're pretty harmless for zigs, and also their design needs shifts beyond "conjurer in the non-conjurations branch" and "rarely tell new players ghost moths exist".
Pearl dragons no longer try to spawn more often than daevas, since their breath went from 3d36 to 3d18. Seraphs are restricted from the first half of ziggurat floors until one does sufficiently many ziggurats, so that unholy players aren't any further discouraged from single-digit first zig floors in regular 15 rune games. Thanks, c0fddb9. Still will probably ruin a bunch of megaziggers to be surrounded by fire-immune cleansing flame users, but I'm sure they'll adapt.
Closes #3118.]
Makes Telekinesis + Russian Revolver Interaction more fair (#79740)
Fixes #77238
Basically, you were able to just spam kill people with the russian revolver if you had telekinesis, which isn't really fair. Now, after taking a leaflet out of the the discussion in that issue report, you can still pull off the same party trick... once...
Basically, let's just say that when you focus on firing the gun in your mind... you're also pointing it directly at your mind (your brain (your skull (you instantly die))). This occurs even if the projectile doesn't actually touch you (because that would be hellish to account for) but you're the one who's playing russian roulette man
You still get to do some collateral damage because that's still a very funny interaction but you only get to do it once per life. I don't know if people will be happy to revive you after you "shoot" them. Also, the way it's coded means that you can still leave the revolver on the table and fire it at your foot or something, or just use it normally, as a telekinesis user. This only applies to distance-based firings.
The russian revolver is specifically coded to prevent you from damaging other people, and this was a pretty silly way to sidestep that based on the checks. Instead, let's make it so that you can still do this admittedly funny interaction, but with enough reason to not do it (the reason being that you'll always get fucking blatted).
🆑 balance: After a string of unfortunate incidents, persons with telekinesis have been strongly warned against playing Russian Roulette, as they tend to hyperfixate on the gun a bit too much and end up firing it directly at their head. /🆑
Reworks stop, drop, roll into a gradual, interruptable thing, that repeats until extinguished (#79694)
Related: #78017
Stop drop and roll is no longer instant -5 fire stacks -> stun -> wait.
Now, when you stop drop and roll, every time you roll you will lose 1 firestack.
A roll is triggered every 0.8 seconds. Moving, getting up, or becoming incapacitated / stunned will stop you from rolling. (This number puts it roughly equivalent to its current rate.)
While rolling, your hands are blocked (you cannot use items, hold things, etc.) Additionally, you will roll until all firestacks are cleared.
Getting stunned for 6 seconds because you decide to stop and roll is a little silly. Reasonably you could stop rolling and get back up should the need arise, such as "oh god there's more fire I gotta relocate".
By changing it to a gradual thing, it makes it a bit more reasonable and fair.
- New players who immediately slam "STOP DROP ROLL" because the alert on their screen tells them to are no longer helpless for 6 whole seconds
- People who hit the resist key, intending to interact with something else (such as a bola) are no longer stuck rolling when they did not want to
🆑 Melbert balance: Stop, drop, and roll no longer instantly clears 5 fire stacks off of you - Instead, it will clear 1 fire stack off of you every time you roll, with a roll every 0.8 seconds. balance: Stop, drop, and roll no longer stuns you for 6 seconds. Instead, it will knock you to the floor while you are rolling. Moving around or getting up will cancel the roll, and you cannot use items while rolling around. balance: Stop, drop, and roll will now repeat until the fire is put out or you get up. /🆑
Fixes Relay Attackers Misfire (#79731)
Fixes #76079
Basically we were both not getting all of the args that we recieve from
COMSIG_ITEM_AFTERATTACK
which included the very important
proximity_flag
which tells us if the person was in range to actually
hurt us or not. This means that clicking a mob with this element with a
stack of metal from across the room would cause them to aggro, which
makes no sense whatsoever. Let's actually use that proximity check.
We listen for projectiles hitting us separately, don't worry.
It just makes no damn sense, fixes some weird ass behavior.
🆑 fix: Bar Bots (and several other mobs) will no longer aggro on you if you click on them with a "forceful" item from halfway across the room. /🆑
Update README.md
Certainly! Here's a description for your Pig Game project that you can use in your Git and GitHub repository:
🎲 Pig Game: Roll the Dice Adventure 🐷
Welcome to the "Pig Game," a thrilling two-player dice game where the stakes are high, and the dice are your destiny! This project, crafted with HTML, CSS, and JavaScript, brings the classic jeopardy of Pig to life in a digital playground.
🚀 Key Features:
Dynamic Gameplay: Immerse yourself in the excitement of a race to reach 100 points before your opponent. Two-Player Fun: Challenge a friend in head-to-head competition, each taking turns to roll the dice and make strategic decisions. Intuitive Design: The game features a user-friendly interface, making it easy for players of all levels to dive in and enjoy. 🎯 How to Play:
Roll the Dice: Click the "Roll Dice" button to unleash the power of chance. Score or Risk: Decide whether to add your dice roll to your current score or risk it all for a potentially higher reward. Watch Out for the Pig: Roll a '1,' and you lose all your points for that turn. The stakes are high; the choice is yours! Reach 100 Points: Be the first player to reach or exceed 100 points to claim victory. 👾 Why I Built This: The "Pig Game" is more than a digital recreation; it's a journey into the strategic and unpredictable world of dice gaming. This project reflects my passion for creating interactive and entertaining web experiences using fundamental web technologies.
holy fucking shit, it's actually rendering the messages correctly
Massive Ruin Fixes + Removals PR (#2334)
This PR is made so I can stop getting angry at the ruins beyond saving that are still ingame. My criteria for a ruin being removed is if another ruin already does its niche better, if the ruin is outdated and/or the ruin is excessively small or unbalanced. For ruins that dont meet this criteria but are still outdated, they will be getting balance fixes and touch ups or a total remap.
This PR is a draft for now because I will need to update the PR changelog and description as I make changes and communicate with the maptainers on what stays and what goes.
Adds departmental RND lootdrop spawners for circuit imprinters, protolathes and techfabs. Excludes omnisci and basic boards from the drops. Fixed a space tile under a door and replaced the omnilathe with a medical lathe on dangerousresearch Fixed the whitesands saloon not spawning which may have caused some sandplanets to spawn without a ruin Fixed harmfactory's nonfunctional traps to now be as lethal as intended. Also changed the loot in the vault to better reflect the ruin's theme and difficulty (cargo techfab board instead of omnilathe, adv plasma cutter instead of combat medkit, less gold more cash, kept the cyberarm implant). Fixed provinggrounds magical SMES FINALLY by adding a terminal on the back. The map should finally function as intended. Fixed a few dirs on fire extinguisher cabinets and blast door assemblies in singularity_lab Removed mechtransport.dmm for being small and bad Removed some leftover gasthelizards.dmm cruft (VILE) Removed nucleardump for being an utter mess of an oldcode ruin Removed gondolaasteroid for being large and empty besides gondolas. better suited for a jungle planet IMO. Removed Jungle_Spider. Literally just a box with spiders and cloning equipment. Small, bad, hard to find, unjustified loot. Removed Golem_Hijack. Like jungle spider but it was free rnd, an AI core, a full BSRPED and three golem corpses. With no enemies or obstacles. Removed rockplanet_clock for being a tiny lootbox that doesnt fit with the lore. Also had a quantumn pad. Removed whitesands_surface_youreinsane. Its a silly little reference to an old event that unfortunately resulted in a subpar ruin. Could return as a wasteplanet greeble ruin, but it has to go for now.
Normally I'm all for remapping instead of removing ruins, but some ruins are very much beyond saving. Clearing out space for better ruins to take the spotlight is always nice. Some older ruins are fine but are missing certain things or have loot that worked fine in the past, but doesn't reflect the balance we want for ruins in the present.
I will be PR'ing ruins to replace the ones I remove.
🆑 add: departmental RND lootdrop spawners for imprinters, protolathes and techfabs fix: dangerous_research.dmm now no longer has a space tile under a door and a medical lathe instead of an omnilathe fix: whitesands_surface_camp_saloon can now spawn again after its remap into a functional ruin fix: harmfactory.dmm's traps now work and loot has been adjusted to fit the ruin better fix: provinggrounds.dmm now has a working SMES and power fix: singularity_lab fire extinguishers and a few poddoors now have correct dirs del: mechtransport.dmm and associated code del: gasthelizards areas del: nucleardump.dmm and associated code del: gondolaasteroid.dmm and associated code del: jungle_spider.dmm and associated code del: whitesands_golem_hijack.dmm and associated code del: rockplanet_clock.dmm and associated code del: whitesands_surface_youreinsane.dmm and associated code /🆑
Signed-off-by: zevo [email protected]
Make weapon oprops able to appear on more things
- Hell vaults can now generate weapon oprops on helms as well as gloves and boots.
- Lesser/greater cult oprops (lesser acid/drool for shubbie, lesser magic/window for yog) now stack, lesser oprops can be applied to artifacts, and both can be consistently applied to helms, gloves, and boots, as well as real weapons.
- Kukeri can now apply the holy armor oprop as well as the weapon oprop. They will apply both where possible (armor oprop is applied to ARMOR_CLASS, weapon oprop is applied to is_weapon).
- There is now a somewhat misleadingly named is_weapon macro that actually means "weapon oprops can be applied to this", not "this is a weapon that should be wielded to use properly". I'm not sure what a better name would be.
- Some sflame prop bugfixes: -- Curse glaze now works (previously sflm_able would never return true for armor so it was broken). -- RWTH, RBRD, and SLIF don't work on non-silver/mithril/platinum armor.
- Also fixes a completely unrelated typo ("Cut me lose, please!" -> "Cut me loose, please!").
db connection works now, I also hate my life and have to add a new interface
Just nearly fixed this stupid fucking shit head, it's driving me fucking insane, why is a simple system linking in core but not inlauncher
Fuck this event system i swear to god if i shot myself in the legs it would be less painful
Create banned_books_01
The House of the Spirits, the unforgettable first novel that established Isabel Allende as one of the world’s most gifted storytellers, brings to life the triumphs and tragedies of three generations of the Trueba family. The patriarch Esteban is a volatile, proud man whose voracious pursuit of political power is tempered only by his love for his delicate wife Clara, a woman with a mystical connection to the spirit world. When their daughter Blanca embarks on a forbidden love affair in defiance of her implacable father, the result is an unexpected gift to Esteban: his adored granddaughter Alba, a beautiful and strong-willed child who will lead her family and her country into a revolutionary future.
New working software list items (mac - macii) 123 dumps (#11432)
-
Initial softlist for mac moof 400/800 floppy disks
-
Added mac moof software list support
mac_flop_orig:
Lode Runner (version 1.0) [4AM, Anoid] Balance of Power (version 1.03) [4AM, Anoid] Shanghai (version 1.0) [4AM, Anoid] Skyfox [4AM, Anoid] Temple of Apshai Trilogy [4AM, Anoid] The Surgeon (version 1.5) [4AM, Anoid] Uninvited [4AM, Anoid] King's Quest (version 1.10) [4AM, Anoid] Smash Hit Racquetball (version 1.01) [4AM, Anoid] The Ancient Art of War [4AM, Anoid] Hacker II [4AM, Anoid] Rambo: First Blood Part II [4AM, Anoid] One on One [4AM, Anoid] Indiana Jones and the Revenge of the Ancients [4AM, Anoid] Winter Games (version 1985-10-24) [4AM, Anoid] Winter Games (version 1985-10-31) [4AM, Anoid] Star Trek: The Kobayashi Alternative (version 1.0) [4AM, Anoid] Mac Attack [4AM, Anoid] GATO (version 1.3) [4AM, Anoid] Dark Castle (version 1.0) [4AM, Anoid] Oids (version 1.4) [4AM, Anoid] MacWars [4AM, Anoid] Shadowgate [4AM, Anoid] Seven Cities of Gold [4AM, Anoid] Enchanted Scepters [4AM, Anoid] Beyond Dark Castle [4AM, Anoid] Arkanoid (version 1.00) [4AM, Anoid] The Chessmaster 2000 (version 1.02) [4AM, Anoid] Maze Survival [4AM, Anoid] Frogger (version 1.0) [4AM, Anoid] SimCity (version 1.2, black & white) [4AM, Anoid] Falcon (version 1.0) [4AM, Anoid] Cutthroats (release 23 / 840809-C) [4AM, Anoid] The Witness (release 22 / 840924-C) [4AM, Anoid] Seastalker (release 15 / 840522-C) [4AM, Anoid] Zork III (release 17 / 840727-C) [4AM, Anoid] A Mind Forever Voyaging (release 77 / 850814-E) [4AM, Anoid] Hollywood Hijinx (release 37 / 861215-I) [4AM, Anoid] Nord and Bert Couldn't Make Head or Tail of It (release 19 / 870722-I) [4AM, Anoid] Border Zone (release 9 / 881008-3B) [4AM, Anoid] The Hitchhiker's Guide to the Galaxy (release 47 / 840914) [4AM, Anoid] Zork I: The Great Underground Empire (release 76 / 840509) [4AM, Anoid] Deadline (release 27 / 831005-C) [4AM, Anoid] Infidel (release 22 / 840522-C) [4AM, Anoid] Suspect (release 14 / 841005-C) [4AM, Anoid] Planetfall (release 29 / 840118-B) [4AM, Anoid] Ballyhoo (release 97 / 851218-G) [4AM, Anoid] Enchanter (release 24 / 851118-G) [4AM, Anoid] Spellbreaker (release 63 / 850916-F) [4AM, Anoid] Trinity (release 11 / 860509-3H) [4AM, Anoid] Stationfall (release 107 / 870430-G) [4AM, Anoid] The Lurking Horror (release 203 / 870506-G) [4AM, Anoid] Alter Ego (male version 1.0) [4AM, Anoid] Alter Ego (version 1.1 female) [4AM, Anoid] The Print Shop (version 1.2) [4AM, Anoid] Flight Simulator (version 1.02) [4AM, Anoid] Run for the Money [4AM, Anoid] Master Tracks Pro (version 4.0) [4AM, Anoid] Where in Time is Carmen Sandiego? (version 1.0) [4AM, Anoid] Deluxe Music Construction Set (version 1.0) [4AM, Anoid] Apache Strike (version 1.2) [4AM, Anoid] Wizardry VI: Bane of the Cosmic Forge [4AM, Anoid] Harrier Strike Mission [4AM, Anoid] Airborne! [4AM, Anoid] Mac Vegas (version 1.1) [4AM, Anoid] Dragonworld [4AM, Anoid] MacDraft (version 1.2) [4AM, Anoid] The Mind Prober (version 1.0) [4AM, Anoid] The Toy Shop (version 1.1) [4AM, Anoid] Strategic Conquest (version 1.2) [4AM, Anoid] The Home Accountant (version 1.01) [4AM, Anoid] Sub Battle Simulator [4AM, Anoid] Vegas Video Poker [4AM, Anoid] The Pawn (version 2.3) [4AM, Anoid] Downhill Racer [4AM, Anoid] Dollars and Sense (version 1.3) [4AM, Anoid] Alternate Reality: The City (version 3.0) [4AM, Anoid] Borrowed Time [4AM, Anoid] The Quest [4AM, Anoid] The Crimson Crown [4AM, Anoid] Mindshadow [4AM, Anoid] Pensate (version 1.1) [4AM, Anoid] Sierra Championship Boxing [4AM, Anoid] Championship Star League Baseball [4AM, Anoid] Forbidden Castle [4AM, Anoid] Defender of the Crown [4AM, Anoid] The King of Chicago [4AM, Anoid] Macintosh Pascal (version 1.0) [4AM, Anoid] Fusillade [4AM, Anoid] Orb Quest: Part I: The Search for Seven Wards (version 1.04) [4AM, Anoid] Speed Reader II (version 1.1) [4AM, Anoid] ][ in a Mac (version 2.03) [4AM, Anoid] Q-Sheet (version 1.0) [4AM, Anoid] Fontographer (version 2.4.1) [4AM, Anoid] Mouse Stampede (version 1.00) [4AM, Anoid] The Mist [4AM, Anoid] Tass Times in Tonetown [4AM, Anoid] Pinball Construction Set [4AM, Anoid] Transylvania [4AM, Anoid] Déjà Vu: A Nightmare Comes True!! [4AM, Anoid] Déjà Vu II: Lost in Las Vegas!! [4AM, Anoid] Rogue (version 1.0) [4AM, Anoid] Bridge (version 6.0) [4AM, Anoid] Harrier Strike Mission II (version 1.2) [4AM, Anoid] Patton vs. Rommel (version 1.05) [4AM, Anoid] Moebius: The Orb of Celestial Harmony (version 1.03) [4AM, Anoid] Tesserae (version 1.06) [4AM, Anoid] Where in Europe is Carmen Sandiego? (version 1.0) [4AM, Anoid] Shufflepuck Cafe (version 1.0) [4AM, Anoid] Geometry (version 1.1) [4AM, Anoid] Physics (version 1.2) [4AM, Anoid] SimCity (version 1.1) [4AM, Anoid] Murder by the Dozen [4AM, Anoid] The Duel: Test Drive II [4AM, Anoid] Master Tracks Pro (version 1.10) [4AM, Anoid] Master Tracks Pro (version 2.00h) [4AM, Anoid] Master Tracks Pro (version 3.4a) [4AM, Anoid] Squire (version 1.1) [4AM, Anoid] Millionaire (version 1.0) [4AM, Anoid] Microsoft File (version 1.04) [4AM, Anoid] Microsoft Excel (version 1.00) [4AM, Anoid] The Fool's Errand (version 2.0) [4AM, Anoid] MacGammon! (version 1.0) [4AM, Anoid]
Co-authored-by: Bob Schultz [email protected]
Fixes CDZ Medical Checkpoint windoors (#1386)
-
changes
-
fuck me
-
fuck you
strkoe
firstly, sorry you need to look at half the ugly shit i had to do
secondly i think images wasnt working before cuz we forgot to make both assets and data identical
thirdly, i have been trying to get naruto recipies to work for over 30 minutes now
im going for a cup of tea -- Door (19:06 PM)
FUCKIN GRIDSNAPPING ON PLATFORMS
I AM A GOD AND I KILLED THE OLD GOD AND ATE THEIR FLESH!!! YOU BOW TO ME NOW! PRAISE ME YOUR PROGRAMMING OVERLORD YOU SIMPLE MORTALS!!!
Eoehoma Firearms (& friends) (#2315)
Holy shit, this should not have taken a year to make
Adds the E-10, E-11, E-40, E-50, and E-60 to the game. Weapons manufactured by defunct firearms company Eoehoma Firearms.
Founded in 77 FS, Eoehoma was a early pioneer of ‘hybrid’ Solarian and Kalixcian laser weapons. The company went bankrupt due to increasingly poor and risky decision making, and all of it's patents were bought out by Nanotrasen. While Nanotrasen's Emitters bear a striking resemblance to the E-50, otherwise Nanotrasen has not produced any of Eoehoma's old weapons, instead focusing on Sharplite designed weapons.
Other changes:
- NT and Sharplite weapons have different fire sounds from each other
- Laser weapons buffed to 20 -> 25 damage
- Pulse shots don't destroy walls and are now 50 -> 40 damage
- Emitter shots now do 30 -> 60 damage
- Various grammar fixes
- Removes some non-lore compliant mentions
- Adds a manufacturer indicator to many guns
- Ports tgstation/tgstation#60353
- Resprites various laser weaponry, notably the pulse guns.
- Deathsquad and ERT/LP hardsuits have been redone
ceredits to tetrazeta for the unfinished deathsquad sprite, i simply finished it and touched it up
One of the last things i remember the old leads planned was to buff lasers to make them stand up to the various ballistics better. Also allows Pulse Rifles to be more used in events by nerfing them to not be comedically overpowered. Now they are just Overpowered.
More ruin content and such. I'm sure the maptainers will make good use of this stuff.
And sprites, i fucking love sprites
🆑 retlaw34, tetrazeta add: Eoehoma Firearms, a new guns manufacturer! add: ERT and "Asset Protection" Hardsuits have gotten a new look! add: New laser fire sounds
balance: Lasers now do slightly more damage balance: Pulse rifles don't destroy walls anymore and do slightly less damage, and have lost their stun mode. balance: Emitters do 60 damage and create turf fires on hitting a non-supermatter object. fix: Various laser weapons that had broken autofire (E-TAR and the Tesla Cannon) now work
spellcheck: Grammar on some descriptions was corrected. /:cl:
Signed-off-by: retlaw34 [email protected] Co-authored-by: Mark Suckerberg [email protected] Co-authored-by: thgvr [email protected]
ohoho
hoho
up
wtf
tf
fuck you
happy
work bitch
hoho
cleam up
happy
fun
oh
MBS-13310: Add new empty artist credits to unreferenced_row_log
When artists are merged, Data::ArtistCredit::merge_artists
is called, which
inserts new artist credits: each appearance of the old artist is replaced by
the new one. If the old AC had no references, it will have had an entry in the
unreferenced_row_log
table already; we should make sure to update that to
point to the new AC, if the new one also has no references.
Remember that because artist credits have MBIDs, we'd like to preserve them from deletion where possible: there's a 2-day delay before we cleanup empty ACs, allowing time for them to be re-used with their original MBIDs intact. This applies to redirected MBIDs too; so while inserting empty artist credits may seem silly, these empty ACs are in fact redirected to from a (now-deleted) empty AC which had't been cleaned up yet.
Implemented hopefully the solution for the subs_filter method. Anyway I'm annoyed by this problem an will now clean up and go dacing. Enjoy your evening folks! :)
why is this a fucking pain in the ass? also just recopied stuff back from BiggerLobbies
Rework the dreamshard necklace
Getting an extra life in a roguelike is an insanely, wildly strong effect. This made the dreamshard necklace a ludicrously strong item, but not one that made the game feel more exciting. Instead, one's character felt a bit weaker most of the time.
Let's try to fix both sides of this. To make the amulet a bit more fun to wear, give it Acrobat - good for running away :) To make it less preposterously strong (and thus possible that a really good unrand or randart amulet could be preferable), make it only restore the player to 1 HP when it triggers (rather than 50-100% of MHP), but guarantee that they won't die until their next turn. To simplify, make it only trigger when the player's HP drops to 0, rather than sometimes triggering on very big hits, and remove *Drain.
Finally, make it stick around as a normal amulet of the acrobat after it triggers, for running away synergy.
Let's try this out.
graphics: Switch to a new versioned path and BSP variant setting
and add soong namespacing.
Copy-paste explanation:
There are two sets of BSP sources - These new ones intended for Android 13, and older ones originally intended for Android 10. The older ones have support for some legacy things like HWC1 for older devices, and the newer ones have support for newer things like gralloc4.
To keep support for older devices going, I want to keep the older sources alongside the newer ones. But they can't co-exist as-is. Some changes are needed:
- a change of paths to the BSP sources, which are referenced directly within them
- a new BSP variant setting ('TARGET_SLSI_VARIANT' flag)
- and finally, some soong namespacing.
The BSP variant setting and paths are the biggest challenge. For the existing BSP sources, there's absolutely no versioning. It's the same old generic "linaro"/"samsung_slsi-linaro" for both sets of BSP sources. Sadly, my expressions of concern for my life to not be made more hellish were quite badly dismissed, all the while I'd think it would be best practice to version things like this to not keep using the same old generic identifiers and not run into issues (or for others to not do so) later, so I'm on my own to figure out what to do here.
My solution that touches the least I can is as follows:
For Android 13 - The older Android 10 BSP sources are typically used, and since I'd like to use 13 sources as I have a device that requires gralloc4, I need to make changes within them. To manage it, the naming is as follows: Directory for 10 sources - 'samsung_slsi-linaro' Directory for 13 sources - 'samsung_slsi-linaro_13-e850-96' Git branch name for 10 sources - '...' Git branch name for 13 sources - '..._13-e850-96' SLSI variant flag setting for 10 sources - 'linaro' SLSI variant flag setting for 13 sources - 'linaro_13-e850-96' The only changes here are for 13 sources. Naming is left untouched for 10 sources so as to not break anything for trees using them currently.
For Android 14+ - I'd want to preserve support for older devices, if running newer Android versions doesn't become an impossibility for them, so, while the newer Android 13 BSP sources are typically used, I'd have to make changes to the 10 sources to keep them alongside. To manage it, the naming will be as follows: Directory for 10 sources - 'samsung_slsi-linaro_10-e850-96' Directory for 13 sources - 'samsung_slsi-linaro' Git branch name for 10 sources - '..._10-e850-96' Git branch name for 13 sources - '..._13-e850-96' SLSI variant flag setting for 10 sources - 'linaro_10-e850-96' SLSI variant flag setting for 13 sources - 'linaro' The directory and variant flag setting will be untouched for 13 sources, so as to stay in line with everyone else, and changes would only need to be made within 10 sources. However, for consistency, git branches will all be versioned in future.
Lastly, soong namespacing is added specifically for the "exynos" and "graphics" parts of the sources. Without, there are conflicts between the two sets of sources. For all devices, BoardConfigCommon.mk in the collection of BSP configs is included, and namespaces can be added there, for a clean result where no changes are required in device trees at all.
Change-Id: I79e77f9bff0d4a1595d5cc6fe72fbd17d2734373
Refactors vendor tipping and adds 2 new malf modules: Remote vendor tipping, and the ability to roll around and crush anything in your path. (#76635)
Title.
Vendor tipping code is now on /atom/movable, and any movable can fall over like a vendor does. Things like crits have been moved to type-specific availability tables, their effects are now held in their own proc, are now random per crushed item, have probability weights, etc.
In the process of making this PR I also had to fix another issue, where a bunch of take_damage() overrides had incorrect args, so that explains the take_damage changes I made.
Tipping now also attacks any atoms on the target, given they use integrity.
Adds 2 new malf modules.
- REMOTE VENDOR TIPPING: A mid-cost and mid-supply module allows malf AIs to remotely tip a vendor in any of the 8 directions. After 0.5 seconds of delay and a visual indicator (along with other warnings), the vendor falls over. 1.1. In the process of making this I had to expand a arrow sprite to have orthogonal directions, which is why you may see the testing dmi being changed.
- CORE ROLLING: A mid-cost but low-supply ability that allows the AI to roll around and crush anything it falls on, including mobs. This has a 5% chance to have a critical hit so it isnt THAT terrible - plus it's guaranteed to never stunlock. It's real utility lies in the fact the AI now has limited movement without borgs. Also, the psychological factor.
As a bonus, vendor tipping now uses animate and transforms instead of replacing matrices.
-
Generifying vendor tipping code is just good, period. It's a very wacky and silly little piece of code that really doesn't need to be isolated to vendors exclusively. ANY big and heavy object can fall over and do a ton of damage. 1.1. Also, adding weights to critical hits is really good, because it lets things like the headgib finally be a lot less terrifying, as they're a lot less likely to happen.
-
Remote vendor tipping is a bit of a goofy ability that isn't really THAT practical but has a chance of catching someone unaware and doing some serious damage to that person alone. 2.1. Atop of this, vendor tipping isn't that loud of an action as say, blowing things up, or doing a plasma flood. Even overrides aren't this silent or a non-giveaway. A vendor falling on someone, though, is a mundane thing that happens a lot. This is a decent way to assassinate people before going loud (or at least, damage people) that isn't offered yet.
3.1. For real though, AIs rolling around is just fucking hilarious. The ability to move isn't offered right now (which isn't that much of a bad things), but with sufficiently limited charges (or limits to how many times you can buy the ability), this can be a funny little t hing that lets the AI potentially hide somewhere on the sat (or just relatively close to the sat, such as engineering [it can't go through the teleporter with this but it can go through transit tubes]) without the need for borgs. 3.2. Also, it lets the AI sacrifically execute people by blowing up their brains.
Basic Guardians/Holoparasites (#79473)
Fixes #79485 Fixes #77552
Converts Guardians (aka Holoparasites) into Basic Mobs. Changes a bunch of their behaviours into actions or components which we can reuse. Replaces some verbs it would give to you and hide in the status panel with action buttons that you may be able to find more quickly.
They should work basically like they did before but a bit smoother. It is not unlikely that I made some changes by accident or just by changing framework though.
My one creative touch was adding random name suggestions. The Wizard federation have a convention of naming their arcane spirit guardians by combining a colour and a major arcana of the tarot. The Syndicate of course won't truck with any of that mystical claptrap and for their codenames use the much more sensible construction of a colour and a gamepiece.
This lets you be randomly assigned such creative names as "Sparkling Hermit", "Bloody Queen", "Blue World", or "Purple Diamond". You can of course still ignore this entirely and type "The Brapmaster" into the box if so desired.
I made one other intentional change, which is to swap to Mothblocks' nice leash component instead of instantly teleporting guardians back to you when they are pulled out of the edge of their range. They should now be "dragged" along behind you until they can't path, at which point they will teleport. This should make the experience a bit less disorienting, you have the recall button if you want to instantly catch up.
This is unfortunately a bumper-sized PR because it did not seem plausible to not do all of it at once, but I can make a project branch for atomisation if people think this is too much of a pain in the ass to review.
Other changes:
- Some refactoring to how the charge action works so I could individually override "what you can hit" and "what happens when you hit" instead of those being the same proc
- Lightning Guardian damage chain is now a component
- Explosive Guardian explosive trap is now a component
- Added even more arguments to the Healing Touch component to allow it to heal tox/oxy damage and require a specific click modifier
- Life Link component which implements the Guardian behaviour of using another mob as your health bar
- Moved some stuff about deciding what guardians look and are described like into a theming datum
- Added a generic proc which can return whether your mob is meant to apply some kind of damage multiplier to a certain damage type. It's not perfect because I couldn't figure out how ot cram limb modifiers in there, which is where most of it is on carbons. Oh well.
- Riders of vehicles now inherit all movement traits of those vehicles, so riding a charging holoparasite will let you cross chasms. Also works if you piggyback someone with wings, probably.
🆑 refactor: Guardians/Powerminers/Holoparasites now use the basic mob framework. Please report any unexpected changes or behaviour. qol: The verbs used to communicate with, recall, or banish your Guardian are now action buttons. balance: If (as a Guardian) your host moves slightly out of range you will now be dragged back into range if possible, rather than being instantly teleported to them. balance: Protectors now have a shorter leash range rather than a longer one, in order to more easily take advantage of their ability to drag their charge out of danger. balance: Ranged Guardians can now hold down the mouse button to fire automatically. balance: People riding vehicles or other mobs now inherit all of their movement traits, so riding a flying mob (or vehicle, if we have any of those) will allow you to cross chasms and lava safely. /🆑
Co-authored-by: san7890 [email protected]
Rehaul Armageddon, again
As of v3, my Armageddon nerfs got way out of hand and it became just a worse version of Souldrinker. Inspired by a discussion with Gray Magic Expert on the forums, I'll try a more restrained approach this time.
Armageddon now mostly works like vanilla, except killed monsters award no XP (since your party did virtually nothing), instead I added a call to the code that handles fines and reputation hit for killing peasants. This in turn makes the old rep hack unnecessary, so it's removed.
Furthermore, to nerf multi-day Armageddon camping (which is the only really degenerate use of the spell), monsters on the current map heal fully every full day you spend on it (unless you're in combat, then it's delayed). It's still possible to use two days' casting limit by starting near 2 AM, but it's fine. The spell once again affects the entire map fully, and the casting limit is reduced to vanilla 3-4/day.
One quirk of the heal code is that unless you visit the moon temple during the first day, all monsters on EI will be healed at midnight, which is less than 24 hours since game start. It's probably harmless.
Pipe painting, spraycan preset colors (#79521)
Made pipe painter properly paint pipe colors, work on pipe items, and added the same functionality to regular spraycans.
Spraycans now have the color presets in UI for easier selection of the valid pipe colors.
Bug fixing is good. It was weird that spraycans couldn't paint pipes, but some other device could. Also custom spraycan color is too clunky, presets are nice for quick spraycan color selection.
🆑 fix: fixed pipe painter not applying pipe color properly qol: made spraycans work also as pipe painters qol: spraycans now have basic color presets for quick selection /🆑