Monday, December 31, 2012

Hellcore MOO On Demand Room System Tutorial, Part 1

On Demand Room System

Problem:  You have an ASCII/ANSI based MOO that represents many rooms graphically, often.  Storing an object for each room consumes database space.  Database space is loaded into RAM at a cost of approx. (object's size in bytes) * 2.  On Wayfar, with 9 planets at 100x100, this would be nearly 10,000 objects per planet, almost 100,000 objects just to store blank space.

Solution:  Only store the rooms that players or other objects are using.  Procedurally generate other rooms as required.  The savings are huge!  This is a rough guide to implementing such a system in MOO.  There will be a lot of variation based on your specific gameworld.

Step 1:  Track spawned rooms and delete unused space.

On Wayfar, an object named $ods (on demand spawn) is used to track the status of spawned rooms.  The active rooms are stored in a hash property called spawned_rooms.

Each room must have a unique identifier for easy tracking.  I did this by creating a verb to concatenate a string together from the room's planet/location, and x, y, z co-ordinates.  Example:

$ods:key_string(OBJ room)
room = args[1];
key = tostr(room.location, "-", room.x, "-", room.y,"-", room.z);
return key;

This would return a string along these lines: #4444-1-3--1 for a room located in object #4444 at 1, 3, -1.  This key will let you refer to the active rooms in $ods.spawned_rooms easily.

Next we create a spawning verb for getting the rooms.  This part varies heavily according to how your rooms are setup, and how they are generated.  On Wayfar, we use a simple biome grid generated at planetary creation.  We always know the terrain type for a given X, Y location on a planet, and from that we can generate the appropriate resources and creatures.  This could be improved by proceduralizing all aspects of the room, so that even a despawned room would be re-created exactly from spawn to spawn.  Rough example:

$ods:spawn_3d_room(OBJ location, INT x, INT y, INT z)
{planet, x, y, z} = args;

room_key = $ods:key_string(planet,x,y,z);
"if the room already exists, we can just return it";
if(room_key in keys($ods.spawned_rooms))
  room = $ods.spawned_rooms[room_key];
  if(gamevalid(room) && is_a(room,$room))
    return room;
"otherwise, we should create a new room and return that";
room = $room:populate();
"on hellcore, that might be: room = $rpg:spawn($room)";
room:set_point(x, y, z);
$ods.spawned_rooms[room_key] = room;

Now we need to clean up unused rooms.  Example:

rooms = $ou:leaves_suspended($room);
for r in (rooms)
if(length(r.contents) < 1)
"you could also add, as we have on Wayfar, a timer check to keep rooms persistent for some period of time";

Important note:  Once the elements above are implemented for your system, you still need to hook them into the actual movement actions for the player.  I setup some vector based verbs to figure out the rooms I need to be spawning based on the direction the player is moving (on a planet a player can move in any cardinal direction).

This guide will hopefully be expanded as time goes on and I am able to write more examples.

Monday, December 24, 2012

Fun Changes 12/24/12

Whilst things have been quiet on the home front, things have been busy elsewhere-
We've been doing a lot of detailed changes in order to both balance the game more and expand content available to players, notably that of 'superior' weapons which come with a (!) suffix. These weapons are assigned a number of 'points' during generation and these are randomly spent on various stats on the weapon to improve it over a non-superior weapon of the same type. Note that these 'superior' suffixes are not mutually exclusive with existing weapon prefixes so you could find a 'sawn-off m78a1 plasma rifle (!)' or an 'artillery judge-brand pistol (!)' with crazy-high stats and mad damage output.
Here's a list of a portion of the things that have been done:

- Superior weapons now come in six delicious flavors (levels), ranging through cyan, green, blue, purple, yellow and red. Each of these levels have different improvement levels and higher level superiority is exponentially more difficult to acquire in comparison to a lower level.
- Superior weapons now appear in your inventory and on the ground with their suffix correctly shown.
- Superior weapons now generate with more 'points' to spend depending on how high the quality of the weapon is (higher quality means better stats).
- Attacks will now hit bodyparts rather than ambiguously hitting a target somewhere on their body, if they have a body.
- Hackable treasure containers such as those found in pirate bases will now spawn items within a quality range rather than quality 0 which sucked.
- Respawn matrices such as the Kerkove organic regeneration matrix will now display a fun message whenever you respawn at the matrix, thanking you for your patronage/telling you not to die again/etc.
- Civilians bearing a paramedic AI package will now use any medical supplies they are carrying (such as bandages and medicare health injectors) before they use their standard equipment, so they will use any health injectors and top-tier bandages you give them in order to improve their healing abilities.
- The ammo capacity modification of weapons during superior weapon generation has been changed in order to scale with the weapon's standard ammo capacity (weapons with high ammo capacity will gain more, whereas weapons with small ammo capacity will gain less) and weapons with an ammo capacity of 1 will have their superiority 'points' spent in other stats.
- Civilian building construction now works, if you enable civilian building rights then construction sites will appear in the 3x3 section around your sector center (including the center tile) and these construction sites will slowly be completed and then finish regularly.
- Diseases such as spore cough now pay attention to if you're wearing a gas mask or headgear bearing a rebreather module and do not affect people wearing such things.
- Explosives set off inside vehicles will now damage the containing vehicle (frag grenades and such will do little to harm the vehicle, but a pile of proximity charges will make a royal mess of things).
- Sector centers now bear sensors to warn civilians during attacks from vehicles, warning them to take shelter inside the sector center or to man turrets in order to repel the vehicle threat. The civilians manning turrets may also be able to identify the individual controlling the attacking vehicle and attack them if they leave their vehicle.
- Various new consumables are available to players.
- You can now construct tractor beam modules, which can be installed in solar carriers to drag ships inside the integral hangar.
- You can now use drug injectors on both yourself and other people.
- Bandages and injectors now employ a medical skill roll to reduce the duration of their use (the more medical skills you have, the shorter the average time it takes for you to use a bandage or injector on someone).
- NPC factions have received various updates which allow players to operate under them, allow them to perform ground assaults on locations, man turrets and use them to attack, reload vehicle weapons and perform planet travel to inside-a-building/vehicle travel without fault.

There's a bunch of other stuff I'd like to share, but some of it's secret and the rest I'm just too lazy to report B).

Wednesday, December 19, 2012

Updates 12/19/12

* Enabled web access to the random movie poster generator:
* Fixed a long standing bug with password resets
* ASecretiveMan added tractor beam modules for starships
* In game changelog added to website
* Server status added to website
* A new issue of drillbit, thanks to Aphteroid:

Tuesday, November 27, 2012

Updates 11/27/12

* bug fixes, ideas implemented, and general cleanup:

* main weapon room for large ships:
Intruders can hack this room to halt or dissipate the main weapon charge.  The main weapon can be recharged by crew or players with the starship engineering skill.  The more engineers present the faster the main gun will recharge.
 * More guides added to the website
 * Cleaned up indoor map display and spruced up the dreadnought interior:

 * ranger background's hunting skill is now useful:

Monday, November 26, 2012

We're not dead (yet)

Progress has been sort of slow, mostly because of life getting in the way, a couple of folks being burnt out and everyone forgetting to post updates here.
So I'll compile the last month's changes in a list:

- One of (hopefully) many guide holodocuments.
- Support for multiple attack/strike/miss messages on weapons, and many weapons getting multiple of each message.
- Trading cards and trading card albums for you to hoard even more text with.
- New comedynet taunt messages for various forms of death including bleeding, lightning, vacuum-induced explosive decompression, etc.
- Wildlife spawning with a randomised size ranging from 'tiny' to 'gigantic' with a health/dice multiplier respective for their size.
- Robots now gain a health bonus (1/2 of quality added to their health) and dice bonus (1/20 of quality added to each dice) for their craft quality.
- Barren and planets lacking atmosphere are now victim to asteroid showers of varying intensity, these may or may not turn you into a human pancake instantly.
- The paramedic AI module randomly given to some civilians is now actually functional and the chance of a paramedic civilian actually bandaging an injured person is influenced by their intelligence and reliability stats which are in turn influenced by the civilian's randomised personality traits.
- The 'gear' command now shows what kind of, and the quantity of ammo expended by an attack, if the attack consumes ammo and now has funky colors for each kind of dice. Neat.
- There is a (currently) 4% chance of weapons being looted from dead things/loot containers as a 'superior' version of that weapon, this gives the weapon a randomised set of stats which makes it generally better than it's mundane counterparts. This isn't mutually exclusive with existing weapon prefixes, so a fastfire dalix laser pistol (!) is going to be crazy fast (up to a certain degree, duration bonuses are capped up to a point so any increase in duration bonus is shunted onto another stat instead) and likely hilariously powerful.
- The Better Materials skill now gives a passive 1-3 quality boost to any materials you harvest.
- Two load carrying-related skills in the survival tree, Strong Back and Packrat. The former allows you to carry 40% more weight, and the latter allows you to carry 25% more items. Useful if you enjoy carrying ridiculous amounts of stuff around.
- A new tv station 'SENSI', the SensiVision channel which features a news reporter and a bunch of terrible adverts and stuff. The reporter will also report any interesting happenings (if anything interesting ever happens, that is), notably faction chapters getting exterminated because they decided to colonise the middle of an ocean or a volcano or something.
- A prototype of a waypoint-based cave generation thing.
- A prototype crew organisation/assembly system.

Ok that was a lot of text, so here's some pictures:

We're still chugging along, just dead quietly. More to come.

Hawgpadre note:
[chatzone] Drin says, "i am up to my tits in triplicaster rouch frogs and they are sitting in their ivory palaces drinking gravy and smoking prostitutes"

Thursday, October 25, 2012

Confusing statistics and numbers

So after a minor break playing GriefMOO non-stop, I've got my nose back to the grindstone and done a whole bunch of stuff to improve wayfar. One thing that was lacking was any clear details as to how much damage your weapon will actually do so I added some stats to the gear command for each attack your weapon is capeable of.

Damage is shown per dice type, and has the fixed attack multiplier multiplier, the minimum and maximum dice that can be used in that attack and the range of the dice as well as a static damage bonus from the weapon. (+0 damage won't be shown, the +10 is from the 'balanced' weapon prefix).
As you can see, armor now shows bonuses as well in the gear screen.

On an unrelated note I made a couple more vehicles, a hovercraft which can travel over land and water and a large patrol boat. I also made a few changes to an existing gatling gun turret to make it easier to build and feed with ammunition and made a new gatling gun turret after reading up on the GSh-6-30 russian 30mm gatling gun as used in the Kashtan CIWS mounted on russian aircraft carriers. There's something about gatling guns that can 4000-6000 projectiles, each weighing 390 grams that is distinctly unnerving.

Oh yeah, and I made those random material armor pieces spawn with stat bonuses according to their quality.

Wednesday, October 10, 2012

Belated Aphteroid Updates (again)

Whilst I could explain everything I've done in the past couple of weeks in a massive wall of text, pictures would say a lot more in a lot less space.

Randomised material-based armor!

Customisable starships with movement duration based on engine thrust to ship mass ratio!

There's a whole bunch of other neat things which I haven't taken pictures of, such as working automated transport but there's too much to cover.

Tuesday, October 9, 2012

Updates 10/9/12

* web integration fixed!
* regen chamber for vehicles and starships, allowing players to register for their next respawn at the chamber's location:

* Snap shot as biomes continue to develop:

The Advanced Hellcore $action tutorial, Part 2

This article covers the following in the first section: pro-tips for action use, common problems, and suggested trouble shooting.  This tutorial is third in the series: Part 1, Part 2.

$action Pro Tips

Extra utility verbs on $creatures and $players:
* is_doing(OBJ action, [ ?OBJ callback ]) - this requires the first argument, and the second is optional.  It checks a player or creature to see if they are executing the action sent as the first argument.  If the callback argument is also present, that is checked against the player's executing action.  If the creature or player matches the criteria, is_doing returns 1, otherwise 0.

" pretend this is a sanity check in an eat command";
if( player:is_doing($actions.mock_attack) )
     player:tell("You can't eat right now, because you are attacking!");

"and this one checks to see if the player is attacking with a sword";
"$weapons.sword would be a valid weapon object, and we're assuming the first callback in $actions.mock_attack is the weapon being used.";
if( player:is_doing($actions.mock_attack, $weapons.sword) )
    player:tell("You use your sword to chop your food before eating it.  Oh boy!");

Changing call back arguments in an $action
Scenario: You want to loop through an action exactly 5 times.

"you queue it like this";
player:queue_action($actions.mock_loop, {1, 5});

"in your _finish code you check the stage status and increment stage (in this examples, args[2][1])";
who = args[1];
stage = args[2][1];
max_stage = args[2][2];

if(stage < max_stage)
  stage = stage + 1;
  "keep looping, by returning an action object from _finish. _continue will be called on the action you return.";
  "Usually you return the action you're executing!";
  return {this, {stage, max_stage}};
  who:tell("Looping complete!");
  "we can return E_NONE to finish the action, or fall through to more codes dealing with the specifics";
  return E_NONE;

Broadcasting events from within an $action

Events and callbacks should be familiar topics for anyone who has done any event driven programming.  The idea is simple: code 'broadcasts' an 'event', and other code 'listens' and then reacts to the event.  You broadcast with this verb, which is defined on #1 or $room depending on your hellcore version:
broadcast_event(INT is_start, OBJ action, OBJ who, LIST callbacks)

is_start is 0 for a completing action, and 1 for a beginning action.  action is the action object (or really whatever object) being broadcast, who is the action executor, and callbacks is a list of the callbacks from the action (exactly the same as args[2] within the $action itself).


"let's announce we're going to walk around - pretend this is in a _start verb";
who = args[1];
direction = args[2][1];
"we broadcast a 'hey i'm going to be walking here' event";
who.location:broadcast_event(1, this, who, {direction});

"now pretend this is in _finish, we announce the completion of the move";
who = args[1];
direction = args[2][1];
who.location:broadcast_event(0, this, who, {direction});

These events can then be received by other objects in the same location as who from our example above.  The two main ways to receive these are:
forbid_action_* - this should be specific to the action you want to forbid.  For our example, the verb would be named forbid_action_mock_walk.  If forbid_action returns 1, the action is halted and the actor cannot execute it.
hear_event_* - For our example the verb would be hear_event_mock_walk.

Example on a player or creature, to receive walking messages:

{starting, action, who, callbacks} = args;
direction = callbacks[1];
" as you can see we receive the args just like they are sent to broadcast_event";
  "if the walk is actually occuring, let's tell ourselves about it";
  this:tell(who:name(), " walks off to the ", direction, ".");

Calling an impromptu action from any object

You have an object, lets call it MEDICAL TERMINAL.  You have a verb allowing the player to INVESTIGATE MEDICAL TERMINAL, and you want a short action (not require start, continue, finish, but you'd like the delay and action messaging).  Here's how you do that.

@verb terminal:investigate
player:queue_action($actions.verb, {this, "_search_terminal", {player}, 3.0, 1}, "searching the terminal for valuable information");

@verb terminal:_search_terminal
{is_start, object, actor, callbacks} = args;
"object" will be equal to the medical terminal's object number
actor will be equal to the player who queued the action
and callbacks will be array containing the player who queued the action

This will display the player as "searching the terminal for valuable information, and within this _search_terminal verb you can do whatever simple operations you like without having to write a full action.  It will take 3 seconds for the action to begin (specified by the 3.0).

Monday, October 8, 2012

Updates 10/8/12

* Water world with ice poles:
* Elephant planet:
* Improvements to starship detail (power consumption, thrust vs mass, and engineering consoles):
* Hunger and thirst now reset every 3 hours instead of 24 hours

Thursday, September 27, 2012

Monday, September 24, 2012

The Advanced Hellcore $action Tutorial

This post is a continuation of the Hellcore $action tutorial.  It is broken up into three parts: a complete listing of the default $action properties, a complete breakdown of the extended $action verbs that can be overridden by your custom actions, and special usage of action on non $action objects.

$action properties

These properties can be set on your action objects to control messages and behavior:

  • .duration (FLOAT) - number of seconds the action takes (from _start to _finish or _continue to _finish)
  • .preemptible (INT) - can this action be pre-empted by another action?  [unused]
  • .unstoppable (INT) - can this action be stopped by the player?
  • .doing_msg (STR, default "%ting") - the doing message (eg the action play would become "playing")
  • .doing_to_msg (STR, default "%ting %il") - the message printed when doing an action to something (eg the action play, on space bagpipes, would print "playing the space bagpipes")
  • .oabort_msg (STR) - the message displayed to other players when the player executing the action types STOP.
$action verbs

These verbs can be overridden with your own versions for customized behavior.
  • _forbidden(OBJ source, LIST callbacks) - do any clean up when the action is forbidden by the room or area.
  • is_being_done_by(OBJ who)  - returns 1 if who is executing this action.
  • unstoppable(OBJ who) - by default, returns this.unstoppable.  Can be overridden to allow stopping of an action in certain circumstances.
  • _abort(OBJ who) - by default tells who that the action has been stopped.  If this.oabort_msg is valid, prints it to the room.
  • duration() - by default returns this.duration.  Customize and pass arguments to vary duration based on circumstances.
  • doing_msg(OBJ who, LIST callbacks) - by default prints doing_msg or doing_to_msg based on the length of callbacks.
Special $action usage

* Executing non $action objects as an $action

Aside from using $action objects, you can use any object, providing it has appropriately defined _start and _finish verbs.  An example might be creating a throwing spear item with a THROW verb on it:
player:queue_action(this, {});

The above example would queue the spear itself as an action (first calling _start, which would then return duration as normal) and passing as the first callback argument.

* $actions.verb

A default action called verb is available in hellcore.  Similiar to executing a non action, this allows you to call any verb as an action (instead of requiring _start or _finish).  Example:
player:queue_action($actions.verb, {some_object, "_start_action", {callback1, callback2}, 5.0, 1}, "custom action message");

Where some_object is an object number or variable of type OBJ, "_start_action" is the actual name of the verb you want to call, callbacks are the callback arguments, 5.0 is any float representing the duration, and custom action message is a string to display as the doing_msg.

The Hellcore $action Tutorial

Hellcore provides a 'game loop' in the form of the $heart object.  This object accepts registrations (for example of creatures and players) and every 30 seconds does a 'heartbeat' on every registered object.  When an object beats, the heartbeat verb is called.  NPCs, when doing nothing, can select an action via the verb suggest_next_action.  If the creature or player is already executing an action, the action is checked for duration and moves to the next step or resolves.

When to create an $action:
- a looping or multi step process
- a process where you'd like a delay between starting and finishing
- when you would like players and creatures to share the same code for executing a process

To initiate an action on a creature or player, you call :queue_action, like so:
player:queue_action($actions.some_action, {callback1, callback2, callback3});

Callbacks can be anything that the action is setup to handle.  For instance, here is a mock attack action being queued:
player:queue_action($actions.mock_attack, {player.weapon,});

This would send the player's weapon and target properties to the action.  The player or creature executing the action is always available inside the action.

Actions begin at the _start verb.  Using the mock attack action as an example again, here is what one might look like, with commentary:

"The player or creature executing the action is always the first argument.";
who = args[1];
"Next we retrieve the callback arguments provided when the action was queued.";
{weapon, target} = args[2];
"Print a message to the room or something, usually.";
who:aat( $su:ps( "%DN attacks %it!", who, target ) );
"At the end of start, after the duration has passed, _finish will be called with the same arguments.";
return {this:duration(), {weapon, target}};

After _start finishes and the duration has passed, the action's _finish verb is called.  We'll use the mock attack as an example again:


"The player or creature executing the action is always the first argument.";
who = args[1];
"Next we retrieve the callback arguments provided when the action was queued.";
{weapon, target} = args[2];
"Let's roll some dice and call it a hit on an arbitrary number.";
if(random(100) <= 25)
  who:aat( $su:ps( "%DN lands a hit with %p %t!", who, weapon ) );
  "For this example, we'll assume weapon has two properties indicating the damage type and amount.";
  target:take_damage(weapon.damage_type, weapon.hit_damage);
  "Returning E_NONE from any stage of an action ends the action.";
  return E_NONE;
"If we got this far, we missed.";
who:aat( $su:ps( "%DN misses %it!", who, target ) );
"Now we could just print a miss message and end the action, but for example purposes, let's try hitting again until we succeed.";
"When an action object is returned from _finish, the action is not ended and instead calls _continue.  This allows for repeating or looping actions.";
return {this, {weapon, target}};

You do not have to use a _continue verb.  The attack could simply terminate one way or another in _finish and be resolved.  But for this example, we'll use a _continue verb to loop the action until a hit is made.

"The player or creature executing the action is always the first argument.";
who = args[1];
"Next we retrieve the callback arguments provided when the action was queued.";
{weapon, target} = args[2];
"Print a message before passing back to _finish and rolling our attack dice again.";
who:aat( $su:ps( "%DN attempts another attack with %p %t.", who, weapon ) );
"From continue, we return a duration and our callbacks just like in _start.";
return {this:duration(), {weapon, target}};

Now we can use our mock attack action, either through a verb the player can access, or by returning it from an NPC's suggest_next_action verb.  If written correctly, you can use the same $action for players and creatures without modification, and using an $action allows for great control of the timing and interaction of the executing game codes.

For more information, see the HELP $action command as an admin on Hellcore.  I have also written an Advanced $action Tutorial which contains a full breakdown of the $action properties, verbs, and special uses.

Tuesday, September 18, 2012

Changelog 9/18/12

* Starship hulks!
* Respawn terminals for returning to starships, moons, etc
* Supply Expert skill command - REQ (allows the player to requisition items in the field):

* Quality control skill command - INSPECT (allows the player to view blueprints a material or component is used in):

Monday, September 17, 2012

Belated updates 17/09/12

Whilst it may seem that nothing's going on as far as updates go, nothing could be further from the truth-

This is VN-1229. It's horrid and blocky but it's a test bed for a world generation layer which makes the equator hotter and the poles colder, whilst manipulating the biomes near the poles to give some semi-realistic replication of polar terrain. Currently this makes the entire planet look like a bizzare giant cylinder but with a little work and a perlin injection it should look a lot nicer.

What you see here is a bleak, no-frills map of temperature values which for some strange reason has been turned on it's side. The far left and right of the image show polar temperature values, and the center of the image shows equatorial temperature values. Since the majority of the planet is desert the temperature values are affected little by polar fluctuation, making some areas of the image redundant. It still gets the point across though, it works, sort of.

On top of this, moon dungeons now have a hibernation system in which they'll hibernate, then junk any npcs inside them if there's nobody in them.

On the mundane side however many unannounced updates have been made, such as advanced materials from exotic asteroids and gas clouds in distant systems finding use as materials for advanced armor and weapons, as well as various improvisable items, new materials, new weather types, new biome types, etc.

Not far to go, beta gets closer by the day.

Wednesday, September 5, 2012

Alpha Roundup & Last Objectives

Let's go over the alpha roadmap and see what the status is:

Objective: NPC factions must be working (invading, colonizing, and building)
Status: COMPLETE! (Aphteroid)

Objective: NPC AI must be "working" (travelling to destination, all basic actions available, driving/flying enabled)

Status: Almost complete.  NPC flight and space travel still to do.  (Aphteroid again)

Objective: Factories must be working
Status: COMPLETE! (Aptheroid)

Objective: It must be possible to build and launch a solar spacecraft and travel between planets in the same solar system
Status: COMPLETE!  In addition, travel between systems is working and four solar systems are currently active.

Objective: Player & wildlife attacks must be complete
Status: Incomplete.  This and biomes still need multiple man hours of work.

Objective: Skill rolls integrated and related actions complete.
Status: Partial, maybe 75%.

Objective: the biomes must be complete (wildlife, resources, artifacts, scavenger objectives, biohazards, weather)
Status: Partial - maybe 30%.  The more extreme biomes especially are lacking in detail.

Objective: major weather objects must be complete
Status: COMPLETE!  The weather system itself was also drastically improved.

Objective: backgrounds and reroll mechanics must be complete
Status: Incomplete.  This still needs a fair amount of work.  Some reroll improvements were made.

So, not terrible, given the hobbyist level of effort.  In addition to these goals a lot of other stuff was added, including a fair amount of content, improvements to the underlying systems, etc.  At this point there is one more set of goals and then Wayfar can be 'beta' instead of alpha.  Here are those goals:

* Complete the sector defense minigame
* Complete the robot/civilian management terminal
* Complete law enforcement mechanic
* Complete the vital crew terminals for starships: engineering, communications
* NPC pilots and spacefarers
* Complete the background scripting and reroll mechanics (again!)
* Complete the data entry for all 30 odd biomes, including wildlife, artifacts, objectives, biohazards, weather, and underground elements

In addition to these main goals, there are dozens of ideas and bugs that must be addressed, several minigames not mentioned, and loads of content.  But completing the above would satisfy the basic core of the game and let us move into 'beta'.

Thursday, August 30, 2012

Updates 8/30/12

* moved to a new server for half the cost with double the RAM
* added airlock doors to some starship interiors, allowing you to vent anything in the airlock into space
* added ship intercoms
* a multitude of spawner improvements, mainly to support & implement a full 3d on demand spawning for digging and climbing.  Which does work at last:

* a variety of other random fixes
* digging in it's most basic form:

* new job for linking solar systems with a warp gate
* added two new solar systems
* security cameras are now available on the electronics processor tool:

* new starship for constructing space deployables:

Sunday, August 26, 2012

Belated Aphteroid Updates

I went on vacation for a week and got a bit behind on stuff. One thing I'm pushing towards is getting civilians to do stuff on their own, notably making their own stuff and gearing themselves and their buddies up with gear that's better than the terrible civilian clothing they start with.

This hasn't been going too badly so far, I've got the gathering AI module functioning.

The AI module is supposed to 'guide' the civilian, what it's actually doing is grabbing them and forcing them to do all these things. In short, the civilian decides what resource they are going to gather, see if they've got a backpack and relevant tool (and automagically spawn them if they don't) then attempt to harvest ten units of that resource. They will then stuff all that into their backpack and continue harvesting until their backpack is carrying 20 units of resources, where they will then attempt to find a storehouse (and construct one if one isn't present) and get all the resources from their backpack and put it inside the container inside the storehouse.
They then repeat the whole thing until the storehouse container is full, after which they'll go out of their mind and walk in and out of the storehouse and freak out, or maybe drop their backpacks in there and stop harvesting like they're supposed to.

I have done some other stuff too:
I made some demolition weapons, the 25mm grenade rifle and 40mm grenade launcher and their respective ammunition. The grenade rifle holds five 25mm grenades (convenient, as a box of 25mm grenades contains 25 grenades) and is supposed to be some crazy semi-auto launcher or whatever. The grenade launcher is supposed to be a break-action double-barrelled affair and thus holds two 40mm grenades, (also convenient, the box of 40mm grenades contains 16 grenades).
Both of these weapons deal solely explosive damage, making them useful for fighting against buildings and pretty much everything else. I also made a vehicle weapon that uses the 25mm grenades as ammunition, the Assault-class Rat Gatler which is a pretty nasty piece of kit to be on the receiving end of.

As well as this, a few weather types are now a fair bit more hazardous, moderate thunderstorms now come with a chance of lightning (mostly just resulting in messages, unless you're unlucky), sleet comes with a chance of dealing cold damage to you, ice and hail storms come with a chance of dealing a mixture of cold and blunt damage to you, mostly blunt and ice storms being worse.

More to come folks.

Friday, August 24, 2012

Updates 8/24/12

  • New robot voice command:
  • You can now give orders directly to robots when you are in the same location:

  • Bug hunt/housekeeping/idea implementing:

  • Added pinch command to clear out offline players from the central complex
  • Tools now display any unlocked blueprints from look_self
  • Mobile painting rig for styling up houses and vehicles:
  • Decal etching for vehicles, flyers, and starships - works in tandem with painting:
  • Quick list for qualities and status of your container items:
  • Desert life snapshot:
  • Ice planet snapshot:

Wednesday, August 15, 2012

Changelog 8/15/12

* Ignore command added
* Demolition charges are available on the engineering tool.  These explosives are capable of destroying enemy buildings.  They must be claimed and armed first, then remain armed for a 12 hour (real time) period before exploding.
* WHO revamp
* implemented the second medigun, which heals the assist target, as well as nearby party members
* @play now has access to combat and the kill, scan, examine, and tactical commands
* new reactive healing gadgets:

* robot guard command implemented - robots, when on guard duty, will defend their controller and their controller's stuff (including the robot itself of course)

Friday, August 10, 2012

Aphteroid changes 10/08/12

Another truckload of changes in the past few days, mostly revolving around civilians and their role in the colony. Whilst we had planned to make them work at the civic buildings you construct this never actually came to fruition.

Instead, I made them available for the controller of the sector center to use as personal bodyguards, if you control their home sector center then you may ask them to follow you or to stay put as you command, if you give them weapons they will gladly wield them (and automagically reload ranged weapons with ammo produced from their magick pockets) and if given a piece of armor they will either put it on, take off an existing piece of armor in the same slot and replace it with that given to them, or reject the new armor if it's value is lesser than their existing piece.
All this, and you can now construct a militia barracks which will encourage the civilians to perform training exercises to improve their maximum health and maximum dice pools, making them more effective bodyguards and defenders of their colony. I also payed some attention to the sector center itself, changing the description of the governor's office to account for statistics including, but not limited to bonuses from surrounding civic buildings and the maximum population the colony's total civic bonus can support. (Generally five, plus the total civ bonus divided by two).

In short:
- Civilians are available to colony owners as bodyguards
-Civilians now accept equipment from people
- Civilians are able to improve their terrible default health and dice pools (with some help)
- Sector centers now update their maximum civilian allowance every three hours dependant on civic building counts
- Civilian housing buildings are now un-hidden by default, now bear lootables of mediocre value and now have default damage resists
- Civilians sometimes spawn with default equipment such as colonial rifles and machetes
- Civilians sometimes spawn with an AI package to allow them to bandage wounds of them and nearby friendlies

Of course I did do other stuff aside from this things, but I'll keep it short:
- Changed food to actually make it beneficial, making it nearly always give you a status effect which provides a dice/max hp bonus and periodic dice regeneration
- More buildings, and more buildings for NPC factions
- More AI and improvements to existing AI packages to make them do less stupid things and cause fewer potentially hilarious accidents (like a complex two ranger being mysteriously dragged around the circumfrence of WY-1444 after a typo in NPC vehicle support)
- Various bug fixes, including the notorious 'oh my god I just typed get all and now I can't stop picking up things please someone kill me oh goooooood' bug and it's variants.
- please help i'm dissolving in text

Tuesday, August 7, 2012

Aphteroid Changes 07/08/12

Aphteroid again, a few more noteworthy things I've made amongst the ocean of property setting and verb/action tweaks I've done to push progress on the underground.

Random weapon bonuses/modifiers, weapons looted off NPCs such as pirates may now have a random modifier such as 'light', 'heavy', 'serrated' and 'balanced', amongst others.

These modifiers affect the properties of the weapon, at the moment include:
- A fixed reduction or increment to the damage done by the weapon.
- A fixed reduction or increment in the time taken to perform attacks with the weapon.
- A fixed reduction or increment to the deterioration chance of the weapon.
- A fixed reduction or increment to the weight of the weapon.
- A fixed reduction or increment (usually an increment) to the value of the weapon.
- A fixed reduction or increment to the tohit/accuracy bonus of the weapon.

It was all fairly simple to do, but that's the joy of procedural generation- even a few simple rules can diversify gameplay to a great extent.
I used this new support for bonuses to make a tier 1.5 version of the Colonial Machete named the Bolo Machete, which requires 1 Plastiform Brick, 2 Solid-phase Alloy and 1 Responsive Metal, most of which require some effort and existing infrastructure to acquire.

On top of this, a few new drugs/injectors have been implemented:
- Those who have respawned will be given a bonus to all dice max and max hp for two minutes (approximately)
- Liquid food injectors for those who don't like eating.
- Two new drugs (blast-zone and jerkback) which immediately recover a large amount of dice and give some buffs/debuffs (and will harm you if you go over 5 doses).
- All of this involves the chemistry tool and medical workstation, which are somewhat unloved at the moment.

In other news, I scoured a whole bunch of items which didn't have credit values or correct components and gave them appropriate values respectively, and did a bunch of other things which I forget.
Oh, and I fixed bugs too.

Friday, August 3, 2012

Changes 03/08/12

Aphteroid here. I got my nose to the grindstone for the whole of yesterday and early today and got a pile of stuff done.

- NPC factions now have a great deal more support, and in the nearby future will be populated on-the-fly with the birth of planets or when an existing faction is destroyed. Here is a funky image of the factions database's readout.

- Various bugfixes, tweaks and additions have been made, notably the ability to stop a hacking attempt and the ability to enter 'all' when crafting, this immediately transfers the required number of components from the highest quality components available to the tool.

- Scanning things, it actually gives you details about things in space now! (If you didn't already notice).

- Planets which are not hospitable, for example FA-1116. This little number is small, boring, and every inch of it's flatland-and-desert surface is covered in strong mineral acids and vents that jet the aforementioned acids everywhere. Luckily it didn't quite have the right conditions to generate oceans of mineral acids, but it's still horrid.

-  Claimable machine gun nests with MG-128 heavy machine guns (formerly scout-class 'rat' gatling guns, when mounted on vehicles).

- Vehicle weapons which require ammo.

- Automated crafting workstations, which will pull components from their input hopper, assemble the product specified and put the finished product in the output hopper. This degree of automation should make lengthy processes such as starship construction or the mass-production of processed materials a lot easier.

- Non-sentient wildlife now age a lot faster, dying of old age within (approximately) one or two real life hours. This helps remove wildlife from rooms which should be purged, helping reduce database size and memory footprint further.

- Innate skills and bonus items given by background, the ranger background provides you with a Ranger Duster, an alright piece starter of torso armor for soaking physical damage and the Keen Eye innate skill which provides a +2 ToHit bonus and +5 to your maximum Clarity dice pool.
The Serial Killer background provides you with the Insane in the Membrane innate skill which provides a +1 ToHit bonus, a +1 Dodge bonus and +5 to your maximum Aggression dice pool.
The Lab Tech background provides the Lab Coat, an alright piece of starter torso armor for soaking energy, chemical and toxic damages.

- Moon phases, as 17-EGRET and 7-BLUEJAY both have two moons orbitting them, I decided to have the two moons have phase differences, adding a little flavor to existing moon phase messages displayed by the 'time' command (which I fixed, at some point in the last 2/3 months).

- Intelligent NPCs can now use weapons or armor. Whilst they will not wield weapons given to them, any NPC faction units or pirates will now spawn with weapons or armor with either 100% certainty or a chance of the item spawning. This is due to a spawn equipment support, and attack suggestion update I made a month ago which allows intelligent NPCs to spawn with weapons, armor and gadgets and hook into existing support for wielding the objects they spawn with, they will select weapons they are wielding before they use their standard attacks and will reload any ranged weapons that require ammo.

All in all, a productive month and a half, we're making strides towards our Alpha Stage-2 goals now, having nearly completely finished Stage-1 goals, expect good things in future.

Monday, July 30, 2012

Changelog 7/30/12

* new shot of the on demand status, which has been running quite nicely for the last month or so.  Next up is making it three-D to handle the underground.  Altitude simulation is in as well!

* added vehicle painting customization:

* added the first pvp claimable - a fusion bomb (yes i did get this idea from the dark knight rises).  After a 12 hour delay it scours the land nearby.  A good way to get rid of buildings:

* Aphtonites implemented air support for npc invaders and buffed up SCUDs, among other internal changes.
* Death taunts - now on laffnet!