-
Content Count
1,555 -
Joined
-
Last visited
-
Days Won
133
Posts posted by JCarter426
-
-
File Name: JC's Battle Undergarments for K1
File Submitter: JCarter426
File Submitted: 25 Apr 2018
File Category: Mods
K1R Compatible: NoBy popular* demand!
This mod will add a new item that has the appearance of underwear but grants a defense bonus when equipped (+4).
The mod does not integrate the item in the game at all; you will have to cheat it into the game in some manner. The item is "jc_under01".
*For populaces totaling one or more individuals on Deadly Stream.
-
1
-
-
Sure, why not. I'm sending it into the upload queue now. I've added nothing fancy, just a +4 defense bonus, but you (or someone else) will be able to edit the UTI further however you wish.
-
No, that's not possible. The UTI doesn't contain that information. The model is determined by baseitems.2da and appearance.2da.
You could make a new item type that has the stats of armor but the appearance of underwear (model A) but it would require a new line in baseitems.2da. And to make yourself look like a Twi'lek would necessitate editing appearance.2da regardless of what else you want to do.
-
I believe the mipmap semantic forces the game to always render the stated mip level. So you can force the game to always show the highest mip, even when it is far away, for example.
Ah, that makes sense.
Also, I made a typo before. bumpshinytexture replaces envmap, not bumpmaptexture.
-
I am your padawan, instill within me your knowledge. Thanks so much for all the info!! I tried to paraphrase to keep everything a short read, so I hope you don't mind. Thanks again.
No problem. It's good to have a resource like this.
When using blending additive, can I have only certain parts of the texture be translucent? Or must the whole thing be? Ideally I'd have a texture that's mostly opaque, with a small area being translucent.
Use an alpha channel as normal. Black will be translucent, white will be opaque. However, all the dark parts of the texture will still be translucent due to the blending mode, since it is additive and black is adding 0. There's no way to get around that unless you use punchthrough or two different textures.
By the way, here's what happens when the game is missing the TXI:
-
blending
- Various blending options using the alpha channels of the .tga. (Think Photoshop blending options.)
- blending additive, blending punchthrough (not sure of the difference though)
Additive is equivalent to "add" or "linear dodge" mode - the color is added to whatever is underneath it.
Punchthrough is equivalent to "normal" mode, I think.
In the game, punchthrough is generally used when only transparency is needed, when there really is supposed to be nothing there (grass, leaves, grates, hair, etc) while additive is used for any translucent texture (such as windows) because it brightens the background and makes it easier to see.
You might be wondering why punchthrough is even there when we have alpha channels that can handle transparency. That's because the game is crazy and won't render anything behind another object even if its texture is transparent from the alpha channel, unless a blending mode is applied.
bumpmapscaling
- ??? (I can only assume it scales the bump map, e.g. 1=100%, 2=200%, etc.)
- bumpmapscaling 1
This increases the intensity of the bump map. If you have part of the bump map that is higher than the base texture, bumpmapscaling 2 will double the height, bumpmapscaling 3 will triple it, and so on. At least, that's my guess. I noticed a subtle but possibly not imaginary difference when I tried it.
bumpyshinytexture
- ??? (Defines which areas of the bump map should also be shiny?)
- bumpyshinytexture
This is for use with a bump map on a texture that uses an environment map. If you're using cm_baremetal on a metal texture, for example, you'll want to use bumpshinytexture instead of bumpmaptexture.
decal
- Black areas of texture will be translucent.
- decal 1
I believe there's more to it than that. This is an assumption based on how I've seen it work in other games, but I believe decal will make the texture render on top of anything that it's flush with. A burn decal on a wall, for example, will always render on top of the wall texture, rather than the Z-fighting nonsense you'd usually get.
isbumpmap
- ???
- isbumpmap 1
This just tells the game the texture is a bump map.
mipmap- ???
- mipmap 1
This is an optimization thing. A mipmap has multiple copies of the texture in different sizes and the game renders the smaller ones from far away, only rendering the real size when you're close up. I'm not entirely sure how it works with KOTOR since KOTOR also has different texture packs, and I've only seen the mipmap parameter on certain textures. But it's not really a concern to us, thanks to modern hardware.
-
1
-
Static cameras have Quaternion orientations just like everything except for doors and IIRC placeables.
Doors, placeables, creatures, waypoints, and anything else that's spawned. Static cameras are the only game objects that do use them.
don't know about Animated, but I assume no
That would be a no.
the tools do the conversion for you so you don't have to bother with them
That's all that matters, right? You don't have to mess with that stuff in 3ds Max or even AniCam. You do have to if you want to place any camera in a GIT file.
Manually adding a counter-clockwise rotation of 90° to compensate rotates the camera by 180° so it's still facing the wrong direction.Okay. Doing a counter-clockwise rotation of 45° from my original orientation resulted in the needed 90° rotation. I guess I solved the issue, but something seems to be seriously wrong with the camera orientation in this module.
Sounds like it's doubling everything you enter? That doesn't make sense... at all...
-
Well, in my case there actually is a reason for that. The cameras are used in the Xor cutscene that's present across three different modules and each of them uses static cameras with the same IDs. I only edited that one instance and I'd rather not make it a special case by using animated cameras and thus requiring a unique dlg and thus requiring a unique trigger script.
Oh, that does make sense. That's a strange way to go about it, but I can see why they would do that.
You could still do it all in the same dialogue without requiring a new trigger, but it might end up being more work so it might not be worth it.
But you say that in a way that leads me to believe that it's always better to use animated cameras. Would you mind clarifying why that is? I always though that they'd be much more work.
Static cameras:
a ) are required to be placed in a module's GIT file, which means they can't be placed after you've entered the module and make for a compatibility nightmare
b ) use the obscure quaternion rotation system
c ) are restricted to a single module
d ) can't be animated
Animated cameras:
a ) can be animated but don't have to be animated
b ) use intuitive XYZ values for rotation
c ) are contained in a model file that can be named whatever and used wherever (though difference in module layout is obviously still an issue)
There is one and only one thing static cameras can do that animated cameras can't: You can change cameras in the middle of a dialogue node with SetDialogPlaceableCamera. Unless I had to do that, I wouldn't ever use them. I hadn't ever considered a circumstance like the Xor encounter, though. That's a unique case because it can pop up in different areas, as you said.
-
1
-
-
Yeah, it's a static camera in the .git.
There are approximately zero reasons to use those, but ok.
And the problem is not where 0° is facing. As I said, I got the rotation from the orientation armband, so I know that I want 180°. The problem is that for some reason 90° and 180° face in opposite directions and that makes no sense at all.
The module is tat_m17ab, the Tatooine docking area.
[...]The cameras in question are the first two cameras in that scene with the ID 444 and 445. In the provided .git they should face Xor and his lackeys (direction of 180°), but instead they face the underside of the Ebon Hawk. I also added a file called m17ab_90.git where I changed the orientation of the 444 camera to 90°. That one works fine and faces straight away from the Ebon Hawk.
Well, you're right - it does look like you want 180°. I've attached an animated camera that confirms this, though it's not going to tell you anything you don't already know.
I don't know what to say other than that BioWare wasn't at all consistent with orientation. 90° being south is typical of some other modules, such as m01aa. It's probably just a quirk of that area. Though it is weird that only the static cameras would be incorrect, that wouldn't be the most shocking oddity with this game.
-
First, what sort of cameras? Static ones in the GIT file?
Second, the orientation in the game isn't consistent. Some modules have 0° as north, some don't. So you might just be in one of those modules.
-
I wonder how the placement/activation for it works? I can't see anything obvious. Hardcoded maybe? Scripted?
I'm guessing the game renders it and attaches it to the camera if the flags in the ARE are set... otherwise it doesn't. I don't recall any script functions that would turn it on or off, and I also don't recall needing any specific OnEnter script for it to work. I've known weather to work in 231, 301, 506, 601, and 605. So it would be hard coded if anything.
I know The Witcher has randomly-generated weather, and I believe this already supported by the engine and not anything they specifically cooked up for The Witcher. So whatever it is, it does seem to be something that can be triggered on and off... although I don't know if it works in KOTOR.
You'd surely want to be able to toggle the effect off and on to account for indoor/under cover areas.
Each room in the ARE has a flag to allow weather, though I don't know how this works. I remember assisting someone in editing this before without any luck - rain would show up everywhere or nowhere.
The game definitely doesn't have this problem for modules that are already set up for rain, however.
-
I want to change the spawn rate and possibly vary the dispersal of rain droplet effects in TSL.
Rain is probably a shader, not a particle effect.
The rain does use particles, but I'm not sure if you can edit them. As far as I can tell, the weather system is generated from an emitter that follows the camera, a 10 meter cube or something like that. Presumably the game uses some sort of model for this, but you'd have to figure out what it is.
It's easy enough to create rain with the fountain emitter, though, and it's even possible to have rain (or snow or whatever) in the first game.
-
Well, no, there's no such file. That's just an instance of the waypoint template sw_waypoint001.utw with a custom tag.
As for the script that spawns the party members, that's k_pebn_pophawk.ncs.
-
-
Oh, my mistake. I assumed it was using an event fired from heartbeat but it's actually his perception event (1002) which... should not be failing. Unless you went into stealth or something. It might be something wrong with the general AI.
The other one being used here is the damage event (1006) which makes him surrender. But you said that's working.
Still, you could bypass the problem with heartbeat like I was saying before. If you copy the whole 1002 tree to 1001 and put in a condition that the henchmen are dead, then it should fire that when his heartbeat event fires in the event that the other one doesn't.
-
Are you sure the global is being properly set to 1? I've heard of that being a problem before. I'm assuming that's meant to happen when all the henchmen die and Xor's health is below a certain amount.
If it's not that, then I would guess the problem is in his heartbeat script rather than anything there, since the user defined script only ever fires from that. You could probably ignore the problem entirely and simply fire the dialogue from his heartbeat script, too.
-
I started translating some of my ideas into code.
This script is essentially a copy of the script for the dark side taint in the Tomb of Freedon Nadd:
//////////////////////////////////////////////////////////////////////////////// /* holo_a_dspower Rewards either the player or the Disciple with a dark power, depending on what they already have, or Force points if they already have all the powers. The power progression is based on that of the dark side taint in the Tomb of Freedon Nadd. Run "Disciple" as the string parameter for the Disciple; otherwise, leave it blank for the player. */ // JC 2018-04-14 //////////////////////////////////////////////////////////////////////////////// void main() { int nSpell; object oUser; if( GetScriptStringParameter() == "Disciple" ) oUser = GetObjectByTag("Disciple"); else oUser = GetFirstPC(); /* DARK POWERS SLOW = 45 FEAR = 16 WOUND = 50 SHOCK = 43 AFFLICTION = 7 HORROR = 30 CHOKE = 9 LIGHTNING = 35 PLAGUE = 38 INSANITY = 31 KILL = 32 STORM = 25 */ // SLOW if( !GetHasSpell(45, oUser) ) nSpell = 45; else { // FEAR if( !GetHasSpell(16, oUser) ) nSpell = 16; else { // WOUND if( !GetHasSpell(50, oUser) ) nSpell = 50; else { // SHOCK if( !GetHasSpell(43, oUser) ) nSpell = 43; else { // AFFLICTION if( !GetHasSpell(7, oUser) ) nSpell = 7; else { // HORROR if( !GetHasSpell(30, oUser) ) nSpell = 30; else { // CHOKE if( !GetHasSpell(9, oUser) ) nSpell = 9; else { // LIGHTNING if( !GetHasSpell(35, oUser) ) nSpell = 35; else { // PLAGUE if( !GetHasSpell(38, oUser) ) nSpell = 38; else { // INSANITY if( !GetHasSpell(31, oUser) ) nSpell = 31; else { // KILL if( !GetHasSpell(32, oUser) ) nSpell = 32; else { // STORM if( !GetHasSpell(25, oUser) ) nSpell = 25; else { // FORCE POINTS AddBonusForcePoints(oUser, 10); } } } } } } } } } } } } GrantSpell(nSpell, oUser); }
I've set it up so it can be applied to the player or the Disciple, or both. It grants a Force power based on a certain progression tree. If by any chance the character has all the powers it'll give them 10 bonus Force points instead.
I've also drawn up a light side version:
//////////////////////////////////////////////////////////////////////////////// /* holo_a_lspower Rewards either the player or the Disciple with a light power, depending on what they already have, or Force points if they already have all the powers. The power progression is based on that of the dark side taint in the Tomb of Freedon Nadd, but with light side powers instead. Run "Disciple" as the string parameter for the Disciple; otherwise, leave it blank for the player. */ // JC 2018-04-14 //////////////////////////////////////////////////////////////////////////////// void main() { int nSpell; object oUser; if( GetScriptStringParameter() == "Disciple" ) oUser = GetObjectByTag("Disciple"); else oUser = GetFirstPC(); /* LIGHT POWERS SPEED = 8 STUN = 46 PUSH = 23 CURE = 10 KNIGHT SPEED = 34 STASIS = 29 WHIRLWIND = 27 HEAL = 28 MASTER SPEED = 37 STASIS FIELD = 44 WAVE = 26 MASTER HEAL = 134 */ // SPEED if( !GetHasSpell(8, oUser) ) nSpell = 8; else { // STUN if( !GetHasSpell(46, oUser) ) nSpell = 46; else { // PUSH if( !GetHasSpell(23, oUser) ) nSpell = 23; else { // CURE if( !GetHasSpell(10, oUser) ) nSpell = 10; else { // KNIGHT SPEED if( !GetHasSpell(34, oUser) ) nSpell = 34; else { // STASIS if( !GetHasSpell(29, oUser) ) nSpell = 29; else { // WHIRLWIND if( !GetHasSpell(27, oUser) ) nSpell = 27; else { // HEAL if( !GetHasSpell(28, oUser) ) nSpell = 28; else { // MASTER SPEED if( !GetHasSpell(37, oUser) ) nSpell = 37; else { // STASIS FIELD if( !GetHasSpell(44, oUser) ) nSpell = 44; else { // WAVE if( !GetHasSpell(26, oUser) ) nSpell = 26; else { // MASTER HEAL if( !GetHasSpell(134, oUser) ) nSpell = 134; else { // FORCE POINTS AddBonusForcePoints(oUser, 10); } } } } } } } } } } } } GrantSpell(nSpell, oUser); }
I've picked light side powers that I think correspond to the dark ones in the original script.
Finally, these two scripts will check what power is supposed to be given without actually giving it:
//////////////////////////////////////////////////////////////////////////////// /* holo_c_dspower Checks which dark side power should be granted by holo_a_dspower. This conditional script can be attached to dialogue nodes so the player will know what they're getting. This script does NOT give the reward. The script holo_a_dspower must be fired afterwards. Run "Disciple" as the string parameter for the Disciple; otherwise, leave it blank for the player. Parameter 1 is the spell to be checked. */ //////////////////////////////////////////////////////////////////////////////// int StartingConditional() { int nSpell; object oUser; if( GetScriptStringParameter() == "Disciple" ) oUser = GetObjectByTag("Disciple"); else oUser = GetFirstPC(); /* DARK POWERS SLOW = 45 FEAR = 16 WOUND = 50 SHOCK = 43 AFFLICTION = 7 HORROR = 30 CHOKE = 9 LIGHTNING = 35 PLAGUE = 38 INSANITY = 31 KILL = 32 STORM = 25 */ // SLOW if( !GetHasSpell(45, oUser) ) nSpell = 45; else { // FEAR if( !GetHasSpell(16, oUser) ) nSpell = 16; else { // WOUND if( !GetHasSpell(50, oUser) ) nSpell = 50; else { // SHOCK if( !GetHasSpell(43, oUser) ) nSpell = 43; else { // AFFLICTION if( !GetHasSpell(7, oUser) ) nSpell = 7; else { // HORROR if( !GetHasSpell(30, oUser) ) nSpell = 30; else { // CHOKE if( !GetHasSpell(9, oUser) ) nSpell = 9; else { // LIGHTNING if( !GetHasSpell(35, oUser) ) nSpell = 35; else { // PLAGUE if( !GetHasSpell(38, oUser) ) nSpell = 38; else { // INSANITY if( !GetHasSpell(31, oUser) ) nSpell = 31; else { // KILL if( !GetHasSpell(32, oUser) ) nSpell = 32; else { // STORM if( !GetHasSpell(25, oUser) ) nSpell = 25; } } } } } } } } } } } if( nSpell == GetScriptParameter(1) ) return TRUE; return FALSE; }
//////////////////////////////////////////////////////////////////////////////// /* holo_c_lspower Checks which light side power should be granted by holo_a_lspower. This conditional script can be attached to dialogue nodes so the player will know what they're getting. This script does NOT give the reward. The script holo_a_lspower must be fired afterwards. Run "Disciple" as the string parameter for the Disciple; otherwise, leave it blank for the player. Parameter 1 is the spell to be checked. */ //////////////////////////////////////////////////////////////////////////////// int StartingConditional() { int nSpell; object oUser; if( GetScriptStringParameter() == "Disciple" ) oUser = GetObjectByTag("Disciple"); else oUser = GetFirstPC(); /* LIGHT POWERS SPEED = 8 STUN = 46 PUSH = 23 CURE = 10 KNIGHT SPEED = 34 STASIS = 29 WHIRLWIND = 27 HEAL = 28 MASTER SPEED = 37 STASIS FIELD = 44 WAVE = 26 MASTER HEAL = 134 */ // SPEED if( !GetHasSpell(8, oUser) ) nSpell = 8; else { // STUN if( !GetHasSpell(46, oUser) ) nSpell = 46; else { // PUSH if( !GetHasSpell(23, oUser) ) nSpell = 23; else { // CURE if( !GetHasSpell(10, oUser) ) nSpell = 10; else { // KNIGHT SPEED if( !GetHasSpell(34, oUser) ) nSpell = 34; else { // STASIS if( !GetHasSpell(29, oUser) ) nSpell = 29; else { // WHIRLWIND if( !GetHasSpell(27, oUser) ) nSpell = 27; else { // HEAL if( !GetHasSpell(28, oUser) ) nSpell = 28; else { // MASTER SPEED if( !GetHasSpell(37, oUser) ) nSpell = 37; else { // STASIS FIELD if( !GetHasSpell(44, oUser) ) nSpell = 44; else { // WAVE if( !GetHasSpell(26, oUser) ) nSpell = 26; else { // MASTER HEAL if( !GetHasSpell(134, oUser) ) nSpell = 134; } } } } } } } } } } } if( nSpell == GetScriptParameter(1) ) return TRUE; return FALSE; }
These will let the game say "here's what power you're going to get" in the dialogue file before it gives it to you.
I think that should cover the rewards for generic holocrons the Disciple doesn't have anything to say about. I've yet to look at the ones he does say about in detail, though I imagine the player would find at least one generic one before getting any of the special ones.
-
2
-
-
I haven't been satisfied with screens for the Swoops tracks on Citadel Station, Nar Shaddaa, and Onderon. I need to get HUD-free, wide screenshots of each of the Swoop tracks in KOTOR2. They all have different swoops and tracks so I'd screenshots for each one.
It's possible to get rid of swoop minigame altogether and convert the tracks to regular modules. This would let you run around in them and take whatever pictures you want, though you would lose the swoop bike (which could be composited back on) and possibly all the other minigame items like the mines and accelerator pads.
I believe I already have done that for each swoop track, though I'll have to dig through my files to make sure I can package it into something that can be installed easily. So let me know if you want to try that method.
-
The 205TEL mod has the cutscene where the Exile meets Admiral Onasi. However, in the game it reuses a standard Telos loading screen. (It doesn't have it's own loading screen.) So this won't be included but I thought I'd show it to you all anyway.
Oh, so you're not doing any 2DA editing. Huh, this is... strange. I would think 154, 853, 907, and 950 might be in trouble too, but they actually do have custom loadscreens. Just not 205. There's a line for it, but it has 204's data. Maybe it was a typo.
Progress looks good, in any case.
-
1
-
-
Yeah, I'd say the back for the reasons you mentioned. It also makes it seem more like the ship is going somewhere if we can see out the window.
-
1
-
-
154HAR - That's when Sion breaks out of the kolto tube, right?
Nah, 154 is the cutscene of him meditating on the bridge when the Harbinger arrives at Peragus.
205TEL - Is that the cutscene where Admiral Onasi speaks with Grenn when the Ebon Hawk leaves the station for the first time?
That is correct.
EDIT: Whoops, I did... not read that properly. It's the cutscene with Admiral Onasi speaking to the player. After the battle.
853NIH - Showing Nihilus on the bridge behind his back would work for both.
I suppose that would work.
907MAL - There are two ways I think I could go with "Kreia's Fall"
Hmm, I'd go for the overhead shot. It's the first time we see evil Kreia, so I'd avoid revealing her in the loadscreen.
-
1
-
-
There are modules that are missing loadscreens, or don't have unique ones, like 001EBO and 004EBO, which you've done. Some others that come to mind are 205TEL and 950COR. As far as mods, go, it would also be nice to have custom loadscreens for modules that replace prerendered cutscenes, like Sion's introduction, Visas' introduction, the Nihilus and Tobin scene, and Kreia's fall... but that depends on whether they were given unique modules and I don't recall if they all are. Sion's is 154HAR and I believe Kreia's is 907MAL, but I think the others are both 853NIH. There's also the Telos shuttle, if that was given its own module.
-
1
-
-
File Name: JC's Toolbox for K1
File Submitter: JCarter426
File Submitted: 01 Apr 2018
File Category: Mods
K1R Compatible: NoJC's Toolbox is a collection of items I created to perform various tasks while working in the game. Some I created out of necessity, others were by request, and a few were just for fun.
If you're a fellow modder, think of these as developer tools. They can do handy things like add or remove party members, let you change party members whenever you want, open and close doors, play animations, delete objects, clone objects, adjust your alignment, warp, teleport through broken walkmeshes, and much, much more.
And for the rest of you, if you were paying attention you might have noticed many of those functions are of a cheating nature. If you just want to mess around with the game, do stuff you can't normally do, you can find something useful here. Like make everyone in the game dance.
-
I've thought about this before and I think it's a mod that's possible and worth doing, but it comes with some complications.
First, the holocrons referenced in the Disciple's dialogue would be difficult to implement. Many of them would grant Force powers that are already learned through some other means, very late in the game, including Force Enlightenment and some prestige class abilities. Do you get something else if you already learned an ability with a holocron? Or does the holocron merely give you early access? What you already have the ability before finding the holocron? Do you get a different holocron? And would a version of the quest be available without the Disciple, either for male player characters or before you recruit him? There's a lot to decide here.
Second, it's not really clear how the final holocron mission would play out. Some dialogue suggests the Disciple didn't know the Exile was meant to be his master so many years ago, while the other dialogue has him give the Exile's holocron to her because he knew, and he knew all along in the original release of the game as well, of course. Likewise, some dialogue seems to have him find the holocron by happenstance during the quest, while other dialogue has him take the Exile to the final holocron after all the others have been found. Perhaps both were possible, depending on things such as the order in which the holocrons were found, how much influence the player has with the Disciple, and when the Disciple is trained as a Jedi. Some coherent series of events would need to be realized.
Third, any attempt at this mod would require editing the Disciple's global dialogue file, placing holocron items in numerous different locations throughout the game, and adding new journal entries and/or global variables. Naturally, compatibility with other mods would be a concern.
Finally, it would be nice if it were possible for new planet mods to add holocrons to the quest. That would be another compatibility challenge, but it's something I would appreciate. If, for example, someone wanted to add a Sith holocron to M4-78, that should be possible. Or if a new Coruscant mod were to be made, as has been discussed, it would make sense for it to come with a holocron or two. I wouldn't make a holocron mod that didn't allow for that, and that's the main reason I've yet to attempt one.
I think rather than a standalone mod, the holocron quest should be made as a sort of mod resource. I would include a system that could be edited to include any number of additional holocrons. Of course, the Disciple only has a few lines of dialogue, and therefore could not elaborate on the specifics of each one, but perhaps he could have something generic to say for the others. For the holocrons beyond the scope of the original plan, the items could randomly give you light or dark side points, or an ability you don't have, or some similar bonus, like what you when you access the dark side mist in the Tomb of Freedon Nadd. To account for a variable number of possible holocrons, the mod would have a sort of "next holocron" script to determine which one you find, much like learning the lightsaber forms. That would generate either the next holocron that has specific dialogue attached to it or one of the generic holocrons, depending on circumstances.
Those are just some rough ideas for it, anyway. It's not like I've written code for it or anything. I'm busy with a few other projects at the moment, but I might lay out the core structure of what I've mentioned if I get some free time. I'm willing to offer assistance if anyone else wants to attempt it, also. But I wouldn't undertake such an endeavor lightly. This is almost as complicated as a planet mod.
-
3
-
JC's Battle Undergarments for K2
in Mod Releases
Posted
File Name: JC's Battle Undergarments for K2
File Submitter: JCarter426
File Submitted: 25 Apr 2018
File Category: Mods
TSLRCM Compatible: YesBy popular* demand!
This mod will add a new item that has the appearance of underwear but grants a defense bonus when equipped (+4).
The mod does not integrate the item in the game at all; you will have to cheat it into the game in some manner. The item is "jc_under01".
*For populaces totaling one or more individuals on Deadly Stream.
Click here to download this file