Brad Wardell's Blog


The Fences 2 Beta is live

Published on Thursday, September 6, 2012 By Brad Wardell In Personal Computing

Fences is possibly our most popular program. Conceived and developed by long-time Stardockian, Jeff Bargmann (who also wrote ObjectDock), the new version isn’t just a point upgrade. It really takes the Fences concept to the next level.

Let me illustrate it with 3 main points (I’m assuming you’re already familiar with it as it’s got several million users already):

  1. Now you can create a fence that points to a folder.  This is a pretty huge deal for people (like me), that have a lot of special folders on their network that they regularly access (see screenshot below as an example).
  2. You can now have “pages” of Fences. That’s where you grab the left or right side of the screen and drag it to reveal another set of fences.  So my main desktop is pretty clean. But then I have a second page that I bring on when I need to get to my myriad of tools, files files, etc.
  3. There’s a new display option for how items in a fence are displayed (see screenshot).  You can do this on a fence by fence basis.

The original Fences was a $19.95 program to buy the full version. But because we think Fences 2 is so compelling, we’ve dropped its price in half.  I should also mention it runs on Windows 8 (that’s where I’m running it) in case anyone asks.

To get it:

www.stardock.com/products/fences/beta

 

Screenshot:

image

image

How I would have done Windows 8

Published on Wednesday, September 5, 2012 By Brad Wardell In Personal Computing

It's no secret I'm not a fan of the way Microsoft is handling Windows 8.  So how could they have done it?

First, simplify/unify the underlying platform in a way that developers can feel confident that they're not going to get screwed over again (That Silverlight knowledge in my brain is going to be stored right with my OS/2 SOM storage).

That means .NET .NET .NET.  You make sure that if you write for .NET 4.5 that it'll work on any Windows 8 target.  I don't want to be limited to a subset of .NET in order to target WinRT.

Second, treat Windows as the right tool for the right job:

Windows 8 Desktop Edition

Windows 8 Phone

Windows 8 Server Edition

Windows 8 Tablet Edition

There is no reason why each of these OSes needs to have the same shell experience. It's like they didn't learn anything from the days when they tried to cram the Start button on WinCE years ago.  

The Windows 8 desktop should be...the desktop. No Start screen.  Its environment should be Explorer, not the Start screen.  It should be able to run any type of app written for the Windows ecosystem (specifically, legacy Win32, "classic" .NET, and .NET 4.5+ - for lack of a better term).

The Phone edition should have a shell that makes the most sense for its size and usage. That means the Metro experience found on Windows 7 phone (or some enhancement).

The Tablet edition should have an enhanced Metro (I hope they come up with a new name soon because I'm not calling it "modern" any time soon) experience suitable for that form factor.

But each device should be capable of running the same apps (minus the Win32 ones and .NET apps that can't be migrated to 4.5).

I feel pretty strongly that Microsoft needs to ensure that writing for .NET 4.5 will produce a WinRT capable app. I realize that this means that you would be able to create a "regular" Windows app instead of only Metro apps but I think it's a big mistake to assume that Metro apps make sense on a large, high resolution, screen -- as the Windows 8 weather app makes painfully obvious.

So that's how I'd do it anyway.

LittleTinyFrogs.com – a work in progress

Published on Wednesday, September 5, 2012 By Brad Wardell In Blogging

I’ve had JoeUser.com as my home but with two differnet IDs (draginol and frogboy) so thoroughly conflicted at this stage, I thought it would make sense to set up a site that combines them.

My articles still get posted on all the Stardock sites (you might be reading this on JoeUser or WinCustomize or Sins of a Solar Empire. Who knows.  But now you can find all my stuff together at www.littletinyfrogs.com.

All the good gaming names are taken

Published on Wednesday, September 5, 2012 By Brad Wardell In PC Gaming

Came up with a bunch of good names for future games --- so good that they were already taken, somewhere at some time.

And because we’re such a litigious society, people will sue over even partial names.

I remember getting a threatening letter because we had a technology in Galactic Civilizations II called “Space Marines” and that they had a trademark on that name. We renamed it to Stellar Marines (sounds better anyway).

In recent times, companies have had to resort with coming up with fewer main names “Call of Duty” or “Total War” and then come up with a sub-title in order to have sufficient uniqueness (and of course, even that doesn’t always keep the super-litigious from trying to find a way to cash in).

Hence, I was afraid of calling our first fantasy game “War of Magic” because god knows, there’s probably some game some where called that so we had to call it Elemental: War of Magic. Luckily, Sins of a Solar Empire: Rebellion is probably safe… Winking smile

Mac Pro Retina just came in

Published on Wednesday, September 5, 2012 By Brad Wardell In Personal Computing

Playing around with that this evening.  Trying to migrate from my 2010 Mac Pro. Taking a lot longer than I’d like.

I also have a ThinkPad X1-carbon on the way. I’ll let you know how that goes when I get it.

Modding: ChangeWorld game modifier list

Published on Saturday, September 1, 2012 By Brad Wardell In FE Modding

For those of you modding, we have added a new type of game modifier called ChangeWorld.

It requires code to be used to determine which world variable is being set.

Example:

Code: xml
  1. <GameModifier>
  2. <ModType>Map</ModType>
  3. <Attribute>ChangeWorld</Attribute>
  4. <StrVal>148</StrVal>
  5. <StrVal2>5</StrVal2>
  6. </GameModifier>

This sets variable index 148 to 5.  index 148 is the number of accessories a unit can equip (defaults to 4).

Here are others for future reference:

4. Base Unit Wages

10. Training Units consumes population (1 = true, 0 = false)

17. City Maint Cost exponent (currently 0).  If 18 is set, then you could have more cities cost more and more.

18. City Maint Base Cost (currently 0). 

42. The exponential growth on how much XP it takes to level up. It's currently around 2.90 (higher means harder to level up)

52. How much money sovereigns generate per turn (currently 0)

53. Same for mana (currently 0)

117. Global Hit Point bonus (in case you want to give everyone more HP in your quest or improvement or whatever)

145. Cost per labor to rush production

147. Max units that you can station in a city

148. Max number of accessories a unit can have.

149. Minimum turns required to train or build something (currently 3)

I'll add more.

Incidentally, all this and more can be changed in elementaldefs.xml. It's pretty self explanatory.

More fun with quests

Published on Friday, August 31, 2012 By Brad Wardell In Elemental Dev Journals

So I’m having a blast making quests. I had forgotten how powerful the system had gotten over the past couple of years of development.

I am going to make a claim here that I hope modders will back me up on: You could, with the current beta, make a Baldur’s Gate style RPG with the quest system.

You’d be insane to try though. Until there’s a real editor, working with XML is a kind of torture once the quests start to get complicated. A typo here or there can really wreck things. It’s very very tedious. Plus, you’d want to have more controls over your “campaign” to disable units and things to make it an RPG and not an empire builder. 

I just want to emphasize that what I’m doing is all being done with Notepad.  If I had some .NET developers handy, I’d ask them to make a proper editor (and in fact, if anyone wants to make some money on the side, I’d be glad to arrange something to someone interested in making a proper quest editor).

Here’s a simple one I made today:

image

I bring the little man to me.

image

I answer…a duck.

image

image

So in this case, I give units items, name those items, and their descriptions right from the same XML.

…

Ok, let’s try that again..

Guy comes to visit…yada yada yada.  Picking a different answer…

Got the location for the Gauntlets of power. But Mimbly also gave me…dancing shoes.

image

Those are some pretty…boots.

Reason #503 as to why you don’t let software developers make art requirements:

Every single unit in the game can be dressed and have it show up on the map. This requirement was added by me after Demigod (a great game btw).  In that game, the armor and weapons you equipped didn’t show up on your unit in the map. They said it would be extremely expensive and difficult to do that. The “bang for the buck” wasn’t there.

But I insisted that the Kumquat engine support it for WOM/FE. 

GPG was right and I was wrong. It was tremendously difficult to do this.  Especially when there are thousands of units running around.

But now that it’s done, it is nice to see it in action.

Anyway…Getting on with our quest…

image

The quest can supply a tactical battle map too.  Unfortunately, I don’t have any right now that look like a tomb yet. I could make one with the built in map editor but I’m a dangerously lazy guy and Paul says he’ll make me one next week.

image

So here I got to put the units in and name them whatever I’d like.

image

And again, I took a piece of equipment someone else made, renamed it and gave it its own description.

image

The description is inherited by the object (the gauntlets). It’s not just some pop up description. That initiated game object has the description tied to it now forever.

image

And there they are.

Learn more on Elemental: Fallen Enchantress at www.fallenenchantress.com.

I’ve got your precious random events right here

Published on Thursday, August 30, 2012 By Brad Wardell In Elemental Dev Journals

image

Fallen Enchantress has random events. It’s just that there aren’t many and the odds of one showing up in a given turn are in 1/10,000.

So as we get ready for Beta 5, which is all about bug fixing, polish, and balance, we are finally starting to add a lot of new random events.

image

 

image

 

This is the part I should probably mention that any monkey can make a quest. You do need the powerful tool known as notepad. That’s how I’m doing it. It’s just XML and it’s pretty straight forward to make a fairly simple quest or random event (i.e. kill fooz or fetch me a holy hand grenade or escort my goat, etc.).  But there’s nothing stopping you from making a massive, epic quest.

In this random event, I set it so that after turn 50 there is a 0.1% chance of the event being triggered each turn. So odds are, you will rarely get this event (maybe once every 4 or 5 games).  But in addition to spawning a nasty cave with these nasty monsters in it, I also had it spam the world with a bunch of escaped darklings.

What’s nice about this is that modders (and guys like me) can control the “experience” of the game through the use of the turn trigger.

I’m thinking about coding in a power based trigger. That is, if the player is just dominating (or alternatively, getting really hurt) I could have the game trigger some interesting events to whoever is winning (or losing) to mix things up. I did this with Galactic Civilizations with quite a bit of success in keeping things moving.

Of course, with GalCiv, only I could make this stuff. With Fallen Enchantress, not only can a stupid monkey like myself crank this out, but you guys could too.

Below is the complete XML for this particular quest (90% of which is copy and paste):

   1:   <QuestDef InternalName="RandomEvent_AdventureProblem_2">
   2:      <DisplayName>Troublesome Adventerers</DisplayName>
   3:      <Description>
   4:        Into the throne room comes three very sad looking adventurers. They explain, at considerable length, that they met at a local pub and decided to go on a quest together. Unfortunately, this quest brought them to the ancient dungeon of Orilinor, Curgen's jailer.
   5:   
   6:        This dungeon was thought to be lost and, frankly, it would have been better had it stayed lost because upon opening it, a couple centuries worth of monster breeding has now been unleashed into the country side.
   7:   
   8:        "And, a demon known as Anithan is still there," he says.
   9:   
  10:        What do you want to do?
  11:      </Description>
  12:      <ShortTextAccept>Sigh. Can't you people get real jobs? You'll be helping clean up this mess.</ShortTextAccept>
  13:      <AllowQuestRejection>0</AllowQuestRejection>
  14:      <RewardText>Book of Demon Summoning</RewardText>
  15:      <RewardImage>Tech_Third_Book.png</RewardImage>
  16:      <SuccessText>
  17:        Anithan is defeated and the book is yours. Using the books of your private study to translate the runes in the book, you are able to summon a demon to do your bidding. Unfortunately, the book disintegrates upon use.
  18:      </SuccessText>
  19:      <QuestClass>Minor</QuestClass>
  20:      <Repeatable>0</Repeatable>
  21:      <TriggerType>TurnNumber</TriggerType>
  22:      <TriggerData>50</TriggerData>
  23:      <TriggerChance>10</TriggerChance>
  24:      <PostTriggerChance>10</PostTriggerChance>
  25:      <SpawnRating>1</SpawnRating>
  26:      <Image>BG18_Dark.png</Image>
  27:      <Treasure>
  28:        <GameModifier InternalName="Reward1">
  29:          <ModType>Unit</ModType>
  30:          <Attribute>GiveExperience</Attribute>
  31:          <Value>30</Value>
  32:        </GameModifier>
  33:      </Treasure>
  34:      <Treasure>
  35:        <GameModifier InternalName="Reward2">
  36:          <ModType>Unit</ModType>
  37:          <Attribute>UnitJoinArmy</Attribute>
  38:          <StrVal>DeathDemon</StrVal>
  39:          <StrVal2>Pox the Demon</StrVal2>
  40:          <UnitClass>Unit</UnitClass>
  41:        </GameModifier>
  42:      </Treasure>
  43:      <QuestObjectiveDef>
  44:        <ObjectiveID>0</ObjectiveID>
  45:        <NextObjectiveID>1</NextObjectiveID>
  46:        <Description>Find and defeat Anithan.</Description>
  47:        <Treasure>
  48:          <GameModifier>
  49:            <ModType>Map</ModType>
  50:            <Attribute>CreateGoodieHut</Attribute>
  51:            <StrVal>Orilinor's Dungeon</StrVal>
  52:            <Unitclass>GH_Quest_Cave</Unitclass>
  53:            <Radius>12</Radius>
  54:          </GameModifier>
  55:          <GameModifier>
  56:            <ModType>Map</ModType>
  57:            <Attribute>SpawnMonster</Attribute>
  58:            <Value>24</Value>
  59:            <Unitclass>Darkling</Unitclass>
  60:            <StrVal>Escaped Darklings</StrVal>
  61:            <Radius>12</Radius>
  62:          </GameModifier>
  63:          <GameModifier InternalName="Join">
  64:            <ModType>Unit</ModType>
  65:            <Attribute>UnitJoinArmy</Attribute>
  66:            <StrVal>Iru</StrVal>
  67:            <StrVal2>Amanda</StrVal2>
  68:            <UnitClass>Unit</UnitClass>
  69:            <Level>6</Level>
  70:          </GameModifier>
  71:          <GameModifier InternalName="Join">
  72:            <ModType>Unit</ModType>
  73:            <Attribute>UnitJoinArmy</Attribute>
  74:            <StrVal>Syndicate_SpyMaster</StrVal>
  75:            <StrVal2>Lucila</StrVal2>
  76:            <UnitClass>Unit</UnitClass>
  77:            <Level>6</Level>
  78:          </GameModifier>
  79:          <GameModifier InternalName="Join">
  80:            <ModType>Unit</ModType>
  81:            <Attribute>UnitJoinArmy</Attribute>
  82:            <StrVal>Mercenary</StrVal>
  83:            <StrVal2>Kelen</StrVal2>
  84:            <UnitClass>Unit</UnitClass>
  85:            <Level>6</Level>
  86:          </GameModifier>
  87:        </Treasure>
  88:        <QuestConditionDef>
  89:          <Objective>
  90:            <Icon>Mana_32.png</Icon>
  91:            <Text>Find the cave that leads to the dungeon, defeat Anithan.</Text>
  92:            <IsOptional>0</IsOptional>
  93:          </Objective>
  94:          <Class>Success</Class>
  95:          <Type>ClearGoodieHut</Type>
  96:          <TextData>GH_Quest_Cave</TextData>
  97:          <Flag>RevealTarget</Flag>
  98:        </QuestConditionDef>
  99:        <ChoiceText>You manage to cause a cave in, sealing off the entrance to the vast lambrynth underneath but not before Anithan and his servants confront you.</ChoiceText>
 100:        <ChoiceMedallion>F_Domination_Full.png</ChoiceMedallion>
 101:        <ChoiceMedallionFrame>Medallion_Frame_17.png</ChoiceMedallionFrame>
 102:        <QuestChoiceDef>
 103:          <Description>Defeat Anithan</Description>
 104:          <NextObjectiveID>1</NextObjectiveID>
 105:          <Encounter>
 106:            <Liklihood>100</Liklihood>
 107:            <BattleIdentifier>Anithan</BattleIdentifier>
 108:            <WillRespawn>0</WillRespawn>
 109:            <WanderingRadius>0</WanderingRadius>
 110:            <UnitInstance>
 111:              <UnitType>DeathDemon</UnitType>
 112:              <UnitName>Anithan</UnitName>
 113:              <Level>1</Level>
 114:            </UnitInstance>
 115:            <UnitInstance>
 116:              <UnitType>Juggernaut_Escaped</UnitType>
 117:              <UnitName>Failed prototype</UnitName>
 118:              <Level>1</Level>
 119:            </UnitInstance>
 120:            <UnitInstance>
 121:              <UnitType>DarklingWarrior</UnitType>
 122:              <UnitName>Darkling Horde</UnitName>
 123:              <UnitGroupingType>UnitGroupingType_Squad</UnitGroupingType>
 124:              <Level>1</Level>
 125:            </UnitInstance>
 126:          </Encounter>
 127:        </QuestChoiceDef>
 128:        <QuestChoiceDef>
 129:          <Description>Ah. Yes...well..quite. We will just be leaving you to your cave.</Description>
 130:          <NextObjectiveID>0</NextObjectiveID>
 131:        </QuestChoiceDef>
 132:      </QuestObjectiveDef>
 133:      <QuestObjectiveDef>
 134:        <ObjectiveID>1</ObjectiveID>
 135:        <NextObjectiveID>2</NextObjectiveID>
 136:        <PopupObjectiveMsg>0</PopupObjectiveMsg>
 137:        <QuestConditionDef>
 138:          <Objective>
 139:            <Icon>Mana_32.png</Icon>
 140:            <Text>Defeat Anithan</Text>
 141:            <IsOptional>0</IsOptional>
 142:          </Objective>
 143:          <Class>Success</Class>
 144:          <Type>BattleFinished</Type>
 145:          <TextData>Anithan</TextData>
 146:          <MoreTextData>Victory</MoreTextData>
 147:        </QuestConditionDef>
 148:        <QuestConditionDef>
 149:          <Objective>
 150:            <Icon></Icon>
 151:            <Text>Battle Lost</Text>
 152:            <IsOptional>0</IsOptional>
 153:          </Objective>
 154:          <Class>Failure</Class>
 155:          <Type>BattleFinished</Type>
 156:          <TextData>Anithan</TextData>
 157:          <MoreTextData>Defeat</MoreTextData>
 158:        </QuestConditionDef>
 159:      </QuestObjectiveDef>
 160:      <QuestObjectiveDef>
 161:        <ObjectiveID>2</ObjectiveID>
 162:        <NextObjectiveID>3</NextObjectiveID>
 163:        <Description>Return to your capital with the untranslated book of demons.</Description>
 164:        <QuestConditionDef>
 165:          <Objective>
 166:            <Icon>Mana_32.png</Icon>
 167:            <Text>Return to the capital with the untranslated book of demon summoning.</Text>
 168:            <IsOptional>0</IsOptional>
 169:          </Objective>
 170:          <Class>Success</Class>
 171:          <Type>UnitEntersCapital</Type>
 172:        </QuestConditionDef>
 173:      </QuestObjectiveDef>
 174:      <QuestObjectiveDef>
 175:        <ObjectiveID>3</ObjectiveID>
 176:        <QuestEnd>1</QuestEnd>
 177:      </QuestObjectiveDef>
 178:    </QuestDef>