Be gentle with code criticism, y'all. While it is true that You Are Not Your Code™, there's no need to make anyone have to remember that. The Bard didn't have to allow access to the source (thank you!).
More descriptive names are a good idea, but they're not critical. They're the sort of thing that can be updated as we go, or worked around with comments and IDE features. Plus, what constitutes a good name varies from person to person (although DarkSinfulMage's suggestions are a good starting point).
In addition to making names more helpful, any time you find a complicated expression, it's worth writing a comment in plain English describing the intent (whether authorial or inferred), so that those who come after can verify if the current expression is fit for purpose. The explanations in the posts above are good examples of these sorts of code comments.
Just for clarity - Not insulting anyone here. I'm no saint, myself. I DO think we could use a few methods that break down and simplify obtaining information about a character's state or the state of a given thing in the game - and making it intuitive to find such a method through use of convention.
I DO think we could use a few methods that break down and simplify obtaining information about a character's state or the state of a given thing in the game - and making it intuitive to find such a method through use of convention.
That would be nice. It may be worth thinking about the gamestate as a database we issue queries against, and designing an API around that (or embedding SQLite or something), since we look at so many sets of variables in different ways.
That would be nice. It may be worth thinking about the gamestate as a database we issue queries against, and designing an API around that (or embedding SQLite or something), since we look at so many sets of variables in different ways.
Well, what I think would help first is if every relevant ADT had the same things. No need for a database as long as an amateur can reasonably hit "." and do, get, set, is, has and so on show them the way to deeper access.
m_Name - If a character, token, Addiction effect or other thing owned or created by a player and attached to another, this should be the easiest thing to find it by when searching a data structure. getm_Name() would be known and recognizable.
that way, you can do getCharacterByName(String name), getTokenByName(String token), hasTrait(String name), getRelationshipByName(String name), and even getAddictionByCause(String effectName, String causer). (Most of these at the Character level of things, ofc.)
(of course, beware of string equality comparison.)
It's not really straightforward to get a particular character from the data, or to get a specific something from a specific character in the data someplace in any given class. Being able to access and get them by a name can help us make new stuff in the future.
There is a static Global.getNPC(String name) and static Global.getNPCByType(String type), depending on whether you want to search by character name or class name (which are usually the same).
Yup! Do stuff like that in Character and you can access things all the way down from anywhere.
IN other news. I started playing with level 200 stuff for laughs and gave myself 10000 willpower. Last Stand+Carnal Virtuoso makes fighting Angel absolutely hilarious by the time she's doing millions in damage back to you several times in a row. XD
I'm a big fan of the game and all of the work done in the mod. I'm curious if there is a plan for a new stable or release candidate. I'm on a Linux box and I'm not sure how to get the latest playable version of the game. Again, I'm grateful for all of your work.
Hey there, checking back in. Glad to see the overhaul is coming along off and on. I'd like to help the project get to a more stable state and thought I'd reach out to ask how my time is best spent. I can design, write, and code, but my time is sporadic so I don't want to lay claim to any huge blockers. Ideas:
Game design
Are any systems in need of work or an overhaul (eg time)?
Work on bringing the varied skills & attributes under the same balancing philosophy. This would help us answer questions like: what new gameplay does Attribute X offer? What makes skill X unique and why does it exist? How should attributes scale?
Software engineering
I could help with Ryplinn's overhaul if we can figure out something for me to work on that wouldn't step on any toes. I would love to get this wrapped up because I think it will enable the community to work on various stuff without worrying about wasting their time.
Any misc code health issues people may have identified
More & better testing
Content creation
Lots of content assumes gender. "Genderizing" the game is a huge project but I could hack away at it slowly.
Let me know if any of these sound reasonable or if there's something else that desperately needs doing.
I would say get with Ryplinn about tasks involved with the overhaul. They have their own project sub-tasks and stuff set up on their github. I'd leave content creation to just a word document or something - it's too early to implement content without understanding what we end up with and how it should be done. We might even have the means to implement new kinds of content.
Genderizing the game should probably be centered around the classes and methods that are currently working with pronouns and different words. It's a very complex situation that isn't very usable from an "implementing content" perspective.
Of course, documenting that so people can easily accommodate different body parts/gender/etc would be helpful.
I too want this to get done, but it's one of the hardest and most trying and expansive things to do - overhauling a game. If you are up for taking on subtasks, that's great, but it'll mean constant and close communication.
@Rob Clark
I'm not even sure how we're gonna work that out. We're contributing to something a bit decentralized, at this point. I'm supposing that, considering the depth and breadth of the overhaul we may consider a brand new fork to release on?
Thanks for the response. I'll work on the overhaul for now, attempting to follow @Ryplinn's roadmap (let me know if there's something in particular that needs work). The next item is making the daytime loop explicit, and I can use previous work on the main and match loops as reference. This appears straightforward, but we immediately discover that Daytime events are broken. Currently when one triggers the game ends up kicked back to the main loop and blocked by the readyForNight latch. I'd like to use the opportunity to rewrite Daytime events- the current infrastructure is a little wonky. Since the system is fairly isolated and there's only one event it shouldn't have many side effects.
Sound good? Any features you'd like out of the rewrite?
@Rob Clark
I'm not even sure how we're gonna work that out. We're contributing to something a bit decentralized, at this point. I'm supposing that, considering the depth and breadth of the overhaul we may consider a brand new fork to release on?
Wish I could be of some help, but my programming/release management skills are about 10 years out of practice. I enjoy following the progress of the game in this thread, and it's exciting to see all the new ideas and progress. I'm grateful for all the work that has been done in this mod.
I've pushed a few fixes I had, and the start of my work on the Daytime stuff. I don't foresee myself having the brainpower to work on the rewrite any time soon, so continue with my blessing. None of my toes will be stepped on right now.
@Ryplinn In that case I want to thank you for all the work you've already done. The codebase has been much improved by your efforts, and the roadmap of future improvements is particularly helpful. Thanks.
A few things I would personally get back to doing once we get on the other side of this:
1. If traits and other things haven't been done, I'd do them.
2. All the balance stuff I've posted about, including addictions.
3. Eve and Maya stuff.
4. Depending on some things, content scenes for characters - new scenarios depending on some conditions.
Hey guys, been following this for a while. I just wanted to know, how do I give a created character the ability to cause addictions? Specifically, Zeal, and the things that are associated with it (Pray, Prostrate, etc.)
Thanks!
Hey guys, been following this for a while. I just wanted to know, how do I give a created character the ability to cause addictions? Specifically, Zeal, and the things that are associated with it (Pray, Prostrate, etc.)
Thanks!
Giving the character the 'zealinspiring' trait should do the trick. Either:
Add it to the character's .json file
Edit it into a save, or
Go to the debug screen (accessible from the credits window) and type '***.addTrait zealinspiring' where *** is the character's type (for custom characters, the type is NOT`necessarily the same as the name, it's in the .json). Then hit enter.
Giving the character the 'zealinspiring' trait should do the trick. Either:
Add it to the character's .json file
Edit it into a save, or
Go to the debug screen (accessible from the credits window) and type '***.addTrait zealinspiring' where *** is the character's type (for custom characters, the type is NOT`necessarily the same as the name, it's in the .json). Then hit enter.
Thanks! Just one more question. Would there be a way to increase the frequency of a character using a move? I've looked in the .json files, and it might be weight, but I'm not sure.
I was just curious about the rough state of the overhaul at this point. I realize there were a ton of game breaking issues in the last official release of the mod so I can understand the importance and need for a detailed overhaul. But without actually opening up those files in the github it is difficult for the casual player to actually get a feel for how close to a new stable build this is coming along. Honestly, I would just be happy to have the game working well enough that it wouldn't break all the buttons and stop moving forward during high level games. That's the main reason I quit playing it. I could play it fine in the low levels. But once you jumped up in the 100's you had to watch out because it could suddenly break at anytime during the battle and exploration part of the game.
Also, if there is a way to go about compiling the current branches into a build it would be kinda nifty if someone could at least leave directions on the github project site. I might try to do it because I've been curious about all the tweaks that I see being discussed in here. If it isn't practical to try to compile and play it in the casual player setting yet then I'll just wait until you folks decide it is ready for a new release again.
On a side note. I discovered that the one mod RC on page 79 I believe that's dated 24092017 seems to not want to launch at all. Of course it might be due to the fact that Java has recently released their new 10 series platform which is replacing platform 8. You have to go to their JAVA SE development page to get it though. The standard download pages only give the 8. Its funny though because the RC2 releases that were dated from back in april of 2017 seem to run fine with it. I dunno if it was a bad compile or if there was a tweak in it that the platform 10 doesn't want to let it launch. You double click or right click and say open. The icon flashes for like a fraction of a second and then nothing happens. I'll just try playing the RC2's which are newer versions than the last stable release at least.
I was just curious about the rough state of the overhaul at this point. I realize there were a ton of game breaking issues in the last official release of the mod so I can understand the importance and need for a detailed overhaul. But without actually opening up those files in the github it is difficult for the casual player to actually get a feel for how close to a new stable build this is coming along. Honestly, I would just be happy to have the game working well enough that it wouldn't break all the buttons and stop moving forward during high level games. That's the main reason I quit playing it. I could play it fine in the low levels. But once you jumped up in the 100's you had to watch out because it could suddenly break at anytime during the battle and exploration part of the game.
@Ryplinn 's branch is the one with overhaul tasks - I'd like to know what's up as well, since I've been hankering to play NGM again. I'd also like to get some hands-on with the current state of things and do not wish to mess around more with GIT.
Also, if there is a way to go about compiling the current branches into a build it would be kinda nifty if someone could at least leave directions on the github project site. I might try to do it because I've been curious about all the tweaks that I see being discussed in here. If it isn't practical to try to compile and play it in the casual player setting yet then I'll just wait until you folks decide it is ready for a new release again.
Requires knowing how to use GIT from Eclipse or your IDE of choice, but it's best when making your own fork to commit and pull from. Instructions are super buried in the thread, and I'm not really touching my branch because resolving conflicts is annoying and difficult when it's all spaghetti. I'm not good at GIT, but I managed to get working on things and the rest I'm trying to figure out myself.
On a side note. I discovered that the one mod RC on page 79 I believe that's dated 24092017 seems to not want to launch at all. Of course it might be due to the fact that Java has recently released their new 10 series platform which is replacing platform 8. You have to go to their JAVA SE development page to get it though. The standard download pages only give the 8. Its funny though because the RC2 releases that were dated from back in april of 2017 seem to run fine with it. I dunno if it was a bad compile or if there was a tweak in it that the platform 10 doesn't want to let it launch. You double click or right click and say open. The icon flashes for like a fraction of a second and then nothing happens. I'll just try playing the RC2's which are newer versions than the last stable release at least.
That's pretty concerning! I will update my JRE and see if I can compile it myself, and if not I will update my project and fork to use the new one and hopefully add whatever small changes I include. No overhaul or bugfixes, though, unless anyone wants to point out some fixes for me to merge in (CAREFULLY AND CLEARLY) or implement myself. If everything works, I'll make and upload a new private version JAR.
NaturalGrowth and unnaturalGrowth don't work correctly. Changing line 803 in Global.java to
final int maxLevel = maxLevelTracker;
will make it work. It's worth noting that since the girls don't get as many wins as they should since one update or another, they lag behind in levels. Since no npc actually uses the naturalgrowth trait, you could simulate everyone getting levels by adding the trait to every character and setting the filter on line 807 and while on 808 to maxLevel - 1 or something. That way, they won't lag so far behind.
Living Clothing Other doesn't work atm because the tentacleTop it creates takes up the bottom slot too for some reason. Can fix that by deleting the 'bottom' listing in data/clothing/defaults.json on line 1019
PartFucked.java breaks the game when a fight ends while a tentacle focus airi is still fucking someone with a tentacle. adding if (c != null) to the start of line 83 will fix it
public void onRemove(Combat c, Character other) {
if (c != null)
c.write(other, Global.format("{other:NAME-POSSESSIVE} slick %s slips out of {self:direct-object} with an audible pop.", affected, other, penetrator.describe(other)));
}
Collared.java doPostCompulsion has listings for PREVENT_ESCAPE, PREVENT_STRUGGLE, and PREVENT_REMOVE_BOMB, but doesn't list a cost for any of these. It's reasonable to assume these would be covered by case PUNISH_PAIN, since each is accompanied by a shock dealing damage while playing the game, but in no instance in which any of these are called is PUNISH_PAIN also called, so any of the shocks that prevent the player from taking an action are actually free for Mara, which seems unintended. Also, case PREVENT_REVERSAL does not exist amoung the listings. Suggest changing to
@Override
public void doPostCompulsion(Combat c, Situation sit) {
int cost;
switch (sit) {
case PREVENT_ESCAPE:
cost = 1;
break;
case PREVENT_STRUGGLE:
cost = 1;
break;
case PREVENT_REVERSAL:
cost = 1;
break;
case STANCE_FLIP:
cost = 2;
break;
case PREVENT_REMOVE_BOMB:
cost = 1;
break;
case PUNISH_PAIN:
cost = 1;
break;
default:
cost = 0;
}
charges = Math.max(0, charges - cost);
}
Beguiling Breasts doesn't care whether it's targets are actually looking at the breasts due to facing, or if the targets are blind-folded and can't see them at all. Bandaid fixing that with && getStance().facing(character, getOpponent(character)) && !getOpponent(character).is(Stsflag.blinded) on line 499 of combat.java does cause pets not to be tranced if the master is blinded or facing the wrong way though.
Currently updating my JDK to 10 and will try to pull my own fork and compile it. This is more environment setup than programming, but I'm on it.
@12centDime - Thanks -> when I get things up and running again I'll throw those fixes in and see what happens. I figured there was a part with Airi that was causing that one. Thanks for spotting that.
EDIT: For whatever reason I've installed the JRE and JDK and still version 10 doesn't show up in Eclipse. This may take a while to solve. It's also broken my own projects. Damn...
Okay - Finally got it!
Eclipse had to be deleted and reinstalled. I tried a bit with IDEA and found that it was a matter of configuration. Eclipse non-updates strike again.
Now...let's see if I can pump out a new Jar with a few bugfixes...
EDIT: I'm taking the time to add a few very small things, just to satisfy myself and set up some fun things while we wait to implement everything all over.
Okay, now that my own stuff is working, I can try to continue working on non-overhaul stuff.
Here's a new Jar that works for me - drop it into a 2.6.0 Private Build folder and it should function.
Make sure you have Java installed, don't run it in the zip, etc etc.
If anyone wants to do me a favor - I'd like a debug button among challenge selection that forces the Leveldrain challenge. I've looked into doing this before and lost interest.
If I understand what you want, this is what I'd do. Heavily influenced by what I viewed as the coding convention and my own inexperience, so I won't say it's the best way or anything. Should allow the user to tick the debug option, then choose w/e challenge they want when the night starts regardless of requirements.
First we go into DebugFlags.java and add DEBUG_MATCHMODIFIERS to the list
Next jump to global.java add in import nightgames.debug.MatchModifierPicker, since we'll need that. next, at around line 868, rewrite the existing code to
public static void startNight() {
if (isDebugOn(DebugFlags.DEBUG_MATCHTYPES)) {
current = new MatchTypePicker();
current.respond("Start");
} else if (isDebugOn(DebugFlags.DEBUG_MATCHMODIFIERS)) {
current = new MatchModifierPicker();
current.respond("Start");
} else {
currentMatchType = decideMatchType();
currentMatchType.runPrematch();
}
}
Next, create MatchModifierPicker.java in nightgames.debug. We're basically copying MatchTypePicker with a few changes. Could also be done by editing this into MatchTypePicker.java if we'd rather
if (response.equals("Start")) {
List<KeyableButton> buttons = Arrays.stream(modifiers)
.map(MMButton::new).collect(Collectors.toList());
Global.gui().prompt("<b>DEBUG_MATCHMODIFIERS is active. Select a match modifier below:</b>",
buttons);
}
}
private static class MMButton extends KeyableButton {
private static final long serialVersionUID = -3158804202952673759L;
private final Modifier type;
public MMButton(Modifier type) {
super(type.name());
this.type = type;
getButton().addActionListener(this::startMatch);
}
@Override
public String getText() {
return type.name();
}
finish out by adding this right before the end of MatchType.java
//exists entirely to make debugging with MatchModifierPicker.java work. runs a default event
//with the given modifier while ignoring any requirements
public void runWith(Modifier m) {
Global.unflag(Flag.victory);
DefaultPrematch selection = new DefaultPrematch();
selection.type = m;
Global.current = selection;
selection.respond("Do");
}
------------------------------------------------
Notes:
DEBUG_MATCHTYPES takes precedence over DEBUG_MATCHMODIFIERS
This pulls from Global.modifierPool, so things like MayaModifier or anything need to be added to it if it's to be seen by the code. Didn't see a more complete list to pull from anywhere. LvlDrainModifier's already there though
In the meantime. I had a few minutes so I started adding the skeleton to replace transformation placeholders on part modification screens. I have a thing for Angel and Reyka, so they're getting started, first.
New poll is up! Should Airi (continue) Mimicing the special traits of the other characters? https://strawpoll.com/zzdx2h14
Updates on my fork coming, including addition of that button I so dearly wanted (thanks @12centDime !) , expanded part sizes for cocks and pussies, and a lot of text changes and additions. https://github.com/DarkSinfulMage/nightgamesmod
New Jar will happen when I feel like I'm done for a while. I'm doing lots of small changes and additions so no sense in making new exports.
Airi is weird. On the one hand, I don't think it makes sense that she gets all the abilities she has when she mimics things or disguises herself. On the other, to go and through and pick out the ones that don't make sense and change them is such a huge task I think it's more realistic to just leave it at "not the addictions." Mostly just because if she doesn't have the specializations, it's easy to see it's airi even when disguised, and whoever she's disguised as ends up as kinda underpowered after the 2nd specialization.
--------------------------------------------------
I hope you don't mind my commenting on your new liners. You're playing with the images of the characters I have in my head and I have opinions! :0
In general, the 'subject shouts in triumph' thing seems weird. I don't know exactly how you plan to add them into the post-screen, but it seems they'd mostly read less oddly as {self}:{message}
Cassie
return "{self:SUBJECT} shouts in triumph, <i>\"Hooray! I did it! I won!\"</i>";
-Not terribly invested in Cassie, but I will say I don't think I've ever heard "hooray" said without irony in my entire life. The line sounds better in my head without it, or something like Yes!
"{self:SUBJECT} mutters, <i>\"Oh no...I didn't win at all...\"</i>";
-seems fine
Eve
return "Eve shouts in victory, <i>\"Hah! See? Your asses are all MINE!\"</i>";
-Ok. First off, LOL. Actual lol. That sounds like Eve.
Major point in my head though: Eve doesn't much care about winning. Eve doesn't particularly care about putting someone else down except insomuch as she can get herself or others off on it. She isn't particular -proud- that she won the most...she just finds it hilarious. I feel like the line should be 'Your asses are ALL mine!' Emphasis on the ridiculous amount of ass that she got 'Your asses are ALL mine!' versus emphasis that SHE got all the ass 'Your asses are all MINE!' Still. That could just be me looking into that statement way too much.
*giggles some more at the line*
return "Eve says, <i>\"Tsk...Fucking hell...\"</i>";
-I don't feel like Eve would care that much that she didn't win any matches. She'd still be high off the exhilaration of the fights and only bemoaning that she didn't get to pound more ass a little. Maybe. Something more like "Aw! No ass today I guess. Y'all better watch those cute little rears next time!'
Jewel
return "{self:SUBJECT} shouts in triumph, <i>\"YEAH! That'll show you! I'm the strongest!\"</i>";
return "{self:SUBJECT} mutters, <i>\"Son of a bitch...\"</i>";
-I really haven't paid attention to Jewel. Like, at all. All I can say is that the first line seems clunky, but that could just be the way Jewel talks for all I know. >_>
Kat + Mara
return "{self:SUBJECT} shouts in triumph, <i>\"NYAAA! I'm the strongest!\"</i>";
return "{self:SUBJECT} mutters, <i>\"Nyaaaaa...I lost? :3\"</i>";
return "{self:SUBJECT} shouts in triumph, <i>\"Ha-haaa! Science wins AGAIN!!\"</i>";
return "{self:SUBJECT} mutters, <i>\"Crap...Need to make adjustments...\"</i>";
-these all seem like reasonable interpretations of Kat and Mara that don't challenge how I view them or seem oddly worded
Maya
return "Maya shouts in triumph, <i>\"That was GREAT! I can do this ALL NIGHT!\"</i>";
-This seems too exuberant for someone as reserved as Maya act. She'd be pleased, not surprised, possibly sort of languid and relaxed with w/e it is she's there to collect. Something more like 'Hmm...that was nice. I'll have to be sure to do this again.' Or, since she's also aware that she probably just soundly destroyed everyone's scores, she'd say something motivational or comment on it being educational or something.
return "Maya mutters, <i>\"Damn...\"</i>";
-Don't like this one. It seems implied that Maya is coming here because she NEEDS to win for sone reason or another...yet never seems distressed or angry or anything if she loses. On the contrary, she only ever seems impressed. Given how soundly she defeats 3-ways, I kinda assume she's under something like the same rules as Reyka, only looser. Headcanon: Maya is vastly more powerful than any character in the games barring maybe Reyka, but has her power restricted in one-on-one fights. However, she needs to get something from her wins, so the restriction is looser than Reyka's who can just get w/e sustenance she needs outside the games. If she actually lost every match, I have the feeling she'd be pleased and moderately impressed, smiling out something like "Such promising fighters..."...and then show up at the beginning of tomorrow's fight with double her normal level modifier. xD
Reyka
return "{self:SUBJECT} shouts in triumph, <i>\"Hah! Too easy! I had fun though, didn't you all?\"</i>";
-I don't think Reyka would be that proud of or excited about winning. It's implied in most of her training that she's already more powerful than the other characters and only at about their level due to restrictions. 'Too easy' seems...I dunno. Too self-evident? Too mocking while not enough seduction? Dunno, but that bit in the middle just seems out of character to me.
return "{self:SUBJECT} mutters, <i>\"Oh well, maybe next time. I'll need to become more powerful, I think...\"</i>";
-Reyka's already more powerful, so hearing her talk about needing more seems odd. Them winning and getting stronger effectively makes her stronger too, weirdly.
I agree - I should have made it a bit more clear with a placeholder tag (notice how all of them are very similar starts). It's hard to nail down the characters and it's difficult enough playing the main game without the benefit cheating/editing/debug to see how the characters have been developed since all this stuff was originally written. I'm definitely open to suggestions and revisions, but as of now I think we have some license to make some reasonable departures.
Let's see, here...
I see Cassie as crushing on the player and as a generally nice girl until she develops later on. It's hard to reconcile her changes with her base personality. Definitely open to suggestions on new dialogue.
What you say about Eve is true - I think I'd rather emphasize her aggression, but that's probably more my own characters leaking back into NGM. I'll change it up to reflect more that she doesn't care about winning or losing, since that's core to Eve more than anything else.
Jewel is hard to nail down. She is someplace between a tomboy and a tsundere, and without having more material to work with I file her along with Cassie as a big question mark. Open to suggestions.
By the way....because these are all functions - we can create liners that adjust to the transformation status of a character. You can see with other characters that I've added some descriptions - we can do the same with spoken lines.
Kat and Mara - I don't like writing Kat - that's all I have to say about her.
Mara I like; we all like tomboys. Mara's enthusiastic. She pushes herself very hard and wants to win, but is rather weak when she loses.
Maya - This came up when I started implementing new Maya stuff, but I see Maya as someone who somewhat loses control of herself during the nights that she appears, and if she were to appear regularly in games, I take it that she taps into this power that causes it - effectively shifting her personality a bit. Toning it down makes perfect sense, but that's just the first draft, so to speak. Perhaps she quietly says that kind of line to herself?
Reyka - Again, probably my own characters leaking through - I'll cook up something more nonchalant for Reyka.
Samantha - She wasn't done because I don't really know her personality and playing Night Games is difficult enough to really research now that she's a regular character alongside Yui. I'm not entirely up for working on Yui right now.