Best Of
Re: First Impressions: Game, Community, Developers
Re: First Impressions: Game, Community, Developers
Re: First Impressions: Game, Community, Developers
First Impressions: Game, Community, Developers
It's been a few days, and I've got time on my hands, so why not give first impressions (and a few shout-outs)?
---GAME---
The game itself, while in open beta, is extremely impressive and well done, with intriguing lore and immersive roleplay experiences, with a death system that makes sense. There is much to do, and so far I have encountered few bugs, and the only one I found (The official OOC tag // isn't working in tells for me; it says I am saying nothing) isn't even crippling by far. The economy could use work as well as space mechanics (especially for a way for ships to communicate effectively, I'd personally love that), but overall the game is excellent for its development stage.
---COMMUNITY---
Special shoutouts to @Steve , @Solus , and @Woodro for their excellent roleplay skills!
The community is wonderfully kind and helpful and admittedly took me by surprise with its kindness. I didn't expect everyone to be so kind towards someone who has depression, especially online. The understanding expressed made me feel so relieved and honestly, you guys already feel like old, close friends to me.
---DEVELOPERS---
I have had few interactions with the developers if any that I'm aware of, but from what I've seen on the forums, you guys are wonderful! I like seeing attentive devs who are not only vigilant but polite and receptive to feedback. I used to hold Hello Games in the highest regard for that attitude, but the Starmourn devs surpassed them already!
Keep being amazing everyone, I platonically love you all!
Re: Playable Bushraki Race
Cover Buttons- Nexus Client
Over on the nexus-scripting thread on the discord server, Steve asked about modifying the room items tab to add additional functions to the prop items there to enable cover functions -- ie take cover, shoulderroll if you are Scoundrel, cover destruction and the like. This is in fact possible, but it's beyond my abilities for the moment. I said that it would be easier to assign cover items to the bottom buttons. And then, because I was curious, I tried it out to see if I could make it work. I'm still not done with it, but I've made a start, and I've learned a ton about how various things work. I thought I'd go through and go over it. Fair warning- this is going to go on and on, and I'll have to break it up into several posts- hence making it it's own thread rather than hijacking Nexus Miniscripts or something.
So step one. Can I get a list of cover in the room I'm in? Answer- kinda. So when you enter a room, or look around you get a GMCP message. That's Generic Mud Communication Protocol, and it's what the game uses to send data to clients in the background. You normally don't see it, but you can check a box in the Advanced Tab in the client settings to toggle them on. You can see a list of what IRE uses GMCP for here: https://nexus.ironrealms.com/GMCP
So there are three messages we want to look at to deal with cover items:
Char.Items.List
Char.Items.Add
Char.Items.Remove
The first lists all the items in the location, which can be a container, your inventory or the room.
The second two deal with items added or removed from a location. It turns out there are some problems with using these second two for our purposes, but we'll come back to that later. The first one looks like this:
That's a lot of stuff! Let's look a little closer. So the GMCP method is Char.Items.List. The pieces of that are args (short for arguments) the name used for it is args.gmcp_args Since it's a javascript object you use dot notation to get the pieces. So args.gmcp_args.location is "room". That's what we want, so that's what we are going to look for. The next piece is args.gmcp_args.items You can see it's surrounded by square brackets [] which means it's an array - essentially a list of things accessed by number: item 0, item 1, etc. Inside that each item in the list is surrounded with curly brackets {}, which means it's an object. Objects, among other things, have named properties. So each item in the list has an id, name and in some cases an attrib.
(If you are already lost because you are unsure what arrays and object are, go here: https://www.w3schools.com/js/js_arrays.asp , https://www.w3schools.com/js/js_objects.asp)
So, how do I capture that list? Nexus provides the onGMCP function which will fire anytime a GMCP message is received by the client. In fact you can make as many onGMCP functions as you want and put them in different packages, and they will all trigger. Use caution that you know what each of them is doing if you chose to operate this way. For this, because I want to share, I made a shiny new "Cover" package and gave it it's very own onGMCP function, the first part of which looks like this:
if (args.gmcp_args.location == "room"){
poetic.cover = {};
poetic.roomitems = args.gmcp_args.items;
poetic.roomkeys = Object.keys(poetic.roomitems);
poetic.roomkeys.forEach(function(item){
//client.print("Room item "+poetic.roomitems[item].id+" "+poetic.roomitems[item].name);
if (!poetic.roomitems[item].attrib){
trophy =poetic.roomitems[item].name.match(/a stuffed and preserved/);
if (!trophy && !poetic.notcover.includes(poetic.roomitems[item].name)){
roomitem = poetic.roomitems[item]
poetic.cover[roomitem.id] = {id: roomitem.id, name: roomitem.name, button: 1};
//client.print("Cover item"+Array.from(Object.values(poetic.cover[roomitem.id])));
} //end item sorting
} //end unattributed items
}) //end forEach
if(keysets.activekeyset == "cover"){
keysets.clearButtons();
send_command("coverbuttons");
} //end coverkeys
} //end location = room
} //end Char.Items.List
So lets go through
that. If the method is "Char.Items.List" do what's in the brackets.
Otherwise do nothing.
On the second line we ask if args.gmcp_args is "room". Again, do what's inside the curly brackets, or do nothing.
The third line we create an empty object to hold the cover items. Poetic is the object that I'm using for my system. So we've made another object inside of that. The reason (one of them) to use objects like this is that if you define an object in a script somewhere, it's available in any script you want to use it in.
The fourth line we set a roomitems variable equal to the item list we get from GMCP. This is to make it a little more readable, and so we can use the room item list elsewhere if we want.
The fifth line gets the keys to the items in the object, so that we can iterate over them.
If we ask for args.gmcp_args.location we get "room". What happens when we ask for args.gmcp_args.items? We get "objectObject" for each of the things in the list. Hence the bit on the 6th line where it asks "forEach" So for each item in the array, do this. (I'll be honest, even though I know why it does it the objectObject response makes me crazy).
The next line is commented out. // is a javacript comment. You can use it to clarify what you are doing (which I should have more of in there) or to keep code from running. In Nexus client.print displays text on the screen- in this case so I could see what I was getting for debugging purposes.
The following line is an if statement: if (!poetic.roomitems[item].attrib){
Remember we mentioned above that some items have attributes(attrib)? As far as I know, none of the props have attributes. The ! At the beginning is a negative statement. It says, in effect, "if the item does not have an attribute, continue".
Everybody still with me? I told you this was going to be long.
We'll gloss over the next lines a little. So we are sorting the items as they come in to see if they could potentially be cover. Things with attributes are out. Things that include "stuffed and preserved" are out. That gets us down to things that are pretty certain to be props. But not all props are cover. So I have an array of things that are "notcover". I don't have the whole list yet, cause I haven't tested every single thing. There are probably a few things that could be sorted out like the trophies. For now, when I get the "you can't cover behind that" message I grab the item name and add it to the array. After I try flipping it. Just for more fun- some things are only cover if you flip them. To make it extra confusing- some things you can flip, but they aren't cover no matter which position they are in. Some things are climbable, and I haven't done much with that at all yet, though I'm trying to build a list.
Once we have them sorted, and we are pretty sure they are cover, we add them to the cover object:
poetic.cover[roomitem.id] = {id: roomitem.id, name: roomitem.name, button: 1};
We set a variable again, to make things a little easier to read. roomitem is the entry in the array we get from the forEach statement- poetic.roomitems[item] where item is a numbered entry in the array.
For each of those we make a new entry in poetic.cover with the key set to the item ID number roomitem.id We use bracket notation there, because you cannot use a variable to access object properties via dot notation. poetic.roomitems.item will fail because it wants an entry literally named "item".
So each item that passes our test becomes poetic.cover[cover item ID#] That way we can ask for them later by item ID number and not have to search or sort. For each of those things we store an object that contains the id number, the name, and button 1. The button is just a placeholder, we'll set the button numbers in the next bit.
That's pretty much that. Now we have a mostly correct list of things that are cover. Next up- bend the buttons to our will!
Re: Quality of Life Wishlist
Expand the PATH TRACK functionality so that it can get you to any room that's connected to where you are via PTP, lift, transits, and/or voidgates. The code already handles two of these within the same area, so at the very least transfers feel like they'd be a viable addition. The big obstacle here aside from whatever is hardcoded to disallow for this in the first place, would be the tracking taking you through enemy territory and possibly getting you hit with guards, but ideally there would be a way to flag those areas (specifically capitals, main factional stations) so that if someone's enemied to that faction, they won't path track through it. Bonus points if there's an option to bypass this if someone's feeling brave.
The main reason I bring this up is that some people are seriously directionally hindered, even with maps (which aren't that helpful for some people anyway), and it can put them off of trying to navigate on their own entirely. You can ask friends, sure, but if you don't have any from the start when you're trying the game for the first time, this isn't necessarily an option. You can also ask strangers, if they're around, but feeling like you have some kind of autonomy in a big sprawling world like this can go a long way toward keeping people sticking around.