2015-03-21

BBWs, bitches, bros, gilfs, gangstas, traps and ssbbws

I was watching a sexy woman stuffing her face with fast food and a thought came to mind. Well a few thoughts, but one was BBW. I have no idea where the term originated, could be porn or marketing women's clothes. What I do know is that that simple phrase means a lot without any explanation. I'd imagine that all the stereotypes in the blog tittle were enough to get some people to click on this blog post (apologies if you came here by mistake :p). My point is that a short acronym or phrase is all the brain needs for the imagination to kick in.

Anyway, I find myself working with randomly generated characters and there is a real problem with them. As you can see in this post from a few days ago, the characters are really just a list of facts. And if you were to take a human and assemble a list of everything about them, the list itself really wouldn't be interesting. You might be able to pick out something juicy here and there, but in reality it's just a lot of noise. I'd like to think the limited amount of facts that I'm generating lead to something interesting in the context of the game I'm trying to make, but there is still some disconnect with finding the bigger picture.

Back to the BBW thing though, everything that you need to know is very easy to imagine. I don't have to spell out that I'm talking about a big, beautiful woman. In the case of a randomly generated character, I want to be able to just say something like 'This character is a TROPE' (Where trope is any stereotype that the character fits into).

The system can generate women who are big and beautiful, so then it isn't a challenge to pick up on the gender, weight and looks of a character then assign a stereotype or trope value to them using rules.
:: fill, randomStereotype, bbw [rule($display == enum.randomStereotype && $randomWeight == enum.thick && $randomLooks == enum.veryAttractive && $randomIsMan == enum.no)]
set($randomStereotype = enum.bbw)
The exciting thing about this (to me anyway) is that I can look at all the facts about a character and create more specific rules and have the system naturally select which rules fit best.
:: fill, randomStereotype, bbw [rule($display == enum.randomStereotype && $randomWeight == enum.thick && $randomLooks == enum.veryAttractive && $randomIsMan == enum.no)]
set($randomStereotype = enum.bbw)

:: fill, randomStereotype, ssbbw [rule($display == enum.randomStereotype && $randomWeight == enum.thick && $randomLooks == enum.veryAttractive && $randomIsMan == enum.no && $randomMuscularity == enum.puny && $randomHipWidth == enum.voluptuous && $randomBreastSize == enum.massive && $randomAssShape == enum.largeMarge)]
set($randomStereotype = enum.ssbbw)
I have to say, setting these things up is a lot of fun. It almost felt like I was designing a card battle game or something.

One thing that troubles me is if people will find these stereotypes offensive. Here are a few examples that could be problematic:
:: fill, randomStereotype, bitch [rule($display == enum.randomStereotype && $randomIsMan == enum.no && $randomSubSwitchDom == enum.dominant && $randomKindness == enum.veryAggressive && $randomPlayfulness != enum.veryPlayful)]
set($randomStereotype = enum.bitch)

:: fill, randomStereotype, bro [rule($display == enum.randomStereotype && $randomIsMan == enum.yes && $randomFacialHair == enum.neckbeard)]
priority(2)
set($randomStereotype = enum.bro)

:: fill, randomStereotype, gilf [rule($display == enum.randomStereotype && $randomIsMan == enum.no && $randomKids > 0 && $randomPhysicalAge != enum.earlyTwenties && $randomPhysicalAge != enum.lateTwenties && $randomPhysicalAge != enum.thirties && $randomPhysicalAge != enum.forties && $randomLooks != enum.ugly && $randomLooks != enum.average)]
set($randomStereotype = enum.gilf)

:: fill, randomStereotype, gangsta [rule($display == enum.randomStereotype && $randomIsMan == enum.yes && $randomMasculinity == enum.veryMasculine && $randomKindness == enum.veryAggressive && $randomCrookedness == enum.veryCrooked && $randomMuscularity != enum.puny)]
set($randomStereotype = enum.gangsta)

:: fill, randomStereotype, trap [rule($display == enum.randomStereotype && $randomGender == enum.transWoman && $randomMasculinity == enum.veryFeminine && $randomHasBreasts == enum.yes && $randomGenitals == enum.penis && $randomLooks == enum.veryAttractive)]
set($randomStereotype = enum.trap)

My defense is that I'm using these stereotypes as a means of describing something sexually interesting about a character that people will immediately understand. For example, if a character is described as a gilf I think it'd be easy to decide if you'll pursue sex with them or not.

Another thing is that you could for example navigate to any porn tube site and find categories of videos based on any of those previous examples (with the exception of neckbeards probably). Popularity varies, but these ideas come from somewhere and people are into them. That's not to say that there isn't anything wrong with sexually objectifying people, but I'm making a sex game...

Enough rambling I think. Since you read this, I'm interested in your thoughts. Do you think these generalizations are a good idea?

2015-03-19

Auto-replace penis

If you know me, then you know there is nothing that I enjoy more than finding childish names to use in place of penis. Rather than having to manually find and replace penis throughout my game code and bake in variations, I can let the game decide on it's own at run time. I've scoured all of the internets and assembled a nice penis word bank. It is my privilege to share these items below:

(ps, yes there are an unlimited amount of better things I could be doing with my time)

:: fill, penis [rule($display == enum.penis)]
[any(random), "100% all-beef thermometer", "ankle spanker", "arbor vitae", "baby arm", "baby maker", "bald-headed yogurt slinger", "baloney baton", "baloney pony", "banana", "beaver basher", "beaver cleaver", "beef bayonet", "beef whistle", "bell on a pole", "best friend", "blue-vein sausage", "bologna pony", "boom stick", "braciole", "bratwurst", "cack", "candle", "chap", "chopper", "cock", "cock rocket", "corn dog", "cranny axe", "credentials", "cut", "d", "d train", "d-train", "dangler", "dick", "dicktator", "ding dong", "ding dong mcdork", "dingis", "dingus", "dipstick", "disco stick", "doder", "doinker", "domepiece", "dork", "drum stick", "dude piston", "e-peen", "easy rider", "energizer bunny", "evesdropper", "falo", "fang", "ferret", "foto", "fun stick", "generating tool", "gigi", "groin ferret", "hairy hotdog", "hog", "hotdog", "impudence", "it", "jack-in-the-box", "jackhammer", "jimber", "joystick", "junk", "jurassic pork", "kickstand", "kielbasa", "knob", "lap rocket", "lingam", "lizard", "magic stick", "main vein", "male organ", "man meat", "man muscle", "man umbrella", "man's best friend", "manhood", "master of ceremonies", "matrimonial peacemaker", "mayo shooting hotdog gun", "meat injection", "meat popsicle", "meat puppet", "meat stick", "meat thermometer", "meatsicle", "member", "microphone", "middle girth", "mutton", "mutton dagger", "netherrod", "one eyed willy", "one-eyed wonder weasel", "one-eyed yogurt slinger", "p", "package", "packer", "patz", "peen", "peeper", "penis", "penis sangbo nam rod", "ph.d", "phallus", "pickle", "piece", "pink oboe", "pink torpedo", "pink tractor beam", "pipecleaner", "plonker", "plug", "pnor", "poinswatter", "polaroid", "pop a chub", "porridge gun", "prick", "princess sophia", "private eye", "private part", "pud", "pudding", "putz", "rabo", "ramburglar", "roundhead", "salamander", "sex", "schlort", "schmuck", "schnitzel", "schwanz", "schwartz", "schwarz", "sconge", "shmuck", "shvantz", "silent flute", "single barrelled pump action bollock yogurt shotgun", "skin flute", "slit-eyed demon", "soldier", "spam javelin", "spawn hammer", "spout", "steamin' semen roadway", "steamin’ semen truck", "stick shift", "sub", "surfboard", "taco warmer", "tally whacker", "tallywacker", "tallywhacker", "tan banana", "tassle", "tent pole", "thing", "thumper", "tinker", "todger", "tonk", "tool", "tripod", "trouser meat", "trouser trout", "tube steak", "tubesteak", "tummy banana", "tuna torpedo", "unit", "vagina miner", "vein", "verga", "wanger", "wanker", "wankie", "wedding tackle", "wedding wrecker", "weiner", "whiskey dick", "who who dilly", "whoopie stick", "wiener", "wing dang doodle", "yogurt gun", "yogurt slinger", "yoo-hoo", "zubra"]

:: fill, named penis [rule($display == enum.penisName)]
[any(random), "Adolph", "Bishop", "Bob Dole", "Bobby Dangler", "Bone Ranger", "Captain", "Captain Winky", "Don Cypriano", "Dora The Explorer", "Excalibur", "Froto", "Harry Johnson", "Jimmy", "John", "John Thomas", "Johnson", "Just-in-beaver", "King Sebastian", "Krull The Warrior King", "Long Dong Silver", "Luigi", "Master John Goodfellow", "Mr. Happy", "Mr. Knish", "Mr. Peaslin", "Mr. Sniffles", "Mr. Winky", "Muff Marauder", "Ol' One Eye", "Old Boy", "Old Fellow", "Old Man", "Ole One Eye", "Pedro", "Percy", "Peter", "Pied Piper", "Pinnochio", "Popeye", "Puff The One-eyed Dragon", "Russell The Love Muscle", "Seabiscuit", "Tiny Tim", "Uncle Dick", "Uncle Reamus", "Vlad The Impaler", "Wang", "Wiener Schnitzel", "Willie", "Willy", "Woody Womb Pecker", "Gentleman Usher"]

:: fill, dirty penis [rule($display == enum.penisDirty)]
[any(random), "aids baster", "anal impaler", "butt burglar", "cervix crusader", "clam hammer", "cornholer", "crotch vomiter", "cum gun", "custard launcher", "fart hammer", "fuck rod", "fuck stick", "fudge sickle", "gash mallet", "giggle stick", "gut wrench", "ho wrecker", "kidney scraper", "piss weasel", "sludge pump", "snot rocket", "stinky pickle", "tonsil tickler", "vomit rod", "weapon of ass destruction", "womb broom", "womb ferret", "womb raider", "whore thermometer"]

:: fill, small penis [rule($display == enum.penisSmall)]
[any(random), "bud", "dick smalls", "dickie", "diddle", "ding", "ding a ling", "ding-a-ling", "dingaling", "dink", "dinky", "lincoln log", "little Alex", "little Bob", "little chubby", "little Elvis", "little solider", "maypole", "needle dick", "noodle", "pecker", "pee pee", "peepee", "peeter", "pencil dick", "schlittle", "schmeckel", "schmeckle", "shlittle", "short arm", "shrinkage", "teeny weenie", "tootsie roll", "twig", "twig (and berries)", "twig and berries", "twinkie", "wang doodle", "wee", "wee wee", "weenie", "wick", "goofy goober", "dagger", "dinker", "winkie", "winky", "worm"]

:: fill, big penis [rule($display == enum.penisBig)]
[any(random), "alabama black snake", "anaconda", "bat", "bed snake", "big italian salami", "club", "cyprian scepter", "divine rod", "dong", "electric eel", "flesh tower", "giant redwood", "horse cock", "hose", "hung", "leaky hose", "long dong", "longfellow", "magic wand", "meat constrictor", "meat scepter", "meat sword", "meter long king kong dong", "middle leg", "middle stump", "monster", "one eyed monster", "one eyed snake", "one-eyed anaconda", "one-eyed monster", "one-eyed snake", "one-eyed trouser-snake", "pole", "salami", "sausage", "schlong", "schlong dongadoodle", "sea monster", "sebastianic sword", "shaft", "shlong", "spitting cobra", "staff", "staff of life", "third leg", "third leg of the tripod", "thundersword", "trouser snake", "tube snake", "veinous maximus", "wand", "rod", "rod of pleasure", "deep-V diver", "digger", "donger", "fire hose", "hanging meat", "moisture and heat seeking venomous throbbing python of love"]

:: fill, erection [rule($display == enum.erection)]
[any(random), "artful throbber", "bone", "boner", "broner", "chub", "erection", "chubbie", "chubby", "hard on", "hard-on", "love muscle", "love rod", "love shaft", "love stick", "love whistle", "piston", "pleasure pump", "pocket rocket", "power drill", "quiver bone", "stiffie", "stiffy", "throbber", "wood", "heat-seeking love missile", "heat-seeking moisture missile"]

:: fill, package [rule($display == enum.package)]
[any(random), "big dick and the twins", "general and two colonels", "groin", "rule of three", "thunderbird 3", "package", "sex", "privates"]

2015-03-17

Everything is cumming together

(excuse the shitty pun)

When I first made Body Gen I just wanted a tool to use as a starting point for making unique characters. Once I realized I could build it using Fate, I knew it could be integrated inside of Crooked for random encounters. After a little performance optimization I have it working.

In short the system can generate random characters with a good amount of detail really fast. Right now it can generate two unique characters with roughly 50 random body/personality details in about 1 second. The biggest slowdown point is probably assigning names, professions and places of work since they come from a large pool with thousands of values. I'll probably change this since a person could have a job at a place that doesn't make any sense (examples later).

Printing randomized character data (left) and randomization rules (right)

Now that this is working (mostly) the real challenge is making interacting with these random bodies meaningful. My intention for now is for these characters to be quick fucks at best. I really can't even imagine how to write a long term relationship with a custom player character and a randomly generated partner. I guess those are tomorrows problems.

Onto some examples. These characters are raw output, so each list has all of the currently possible values for a character (even those they don't have).


2015-03-09

What an hot ass!

I've been messing around with the idea of using procedurally generated content to add variation to Crooked. After character creation the player is presented with a short bio of their character as a preview of how they will be described in game. I'm trying to get the hang of working with dynamic text but I've run into a few issues. Take this sentence as an example:
Did you see her? What a hot ass.
No problems as a static line, but what I would like to do is replace hot with various synonyms like sexy or awesome. This is pretty simple to do with display and rules:
Did you see her? What a display($display = enum.hot) ass she has.

:: fill, hot [rule($display == enum.hot)]
hot
:: fill, sexy [rule($display == enum.hot)]
sexy
:: fill, awesome [rule($display == enum.hot)]
awesome
The problem here is that 'a' needs to be an 'an' in the case of awesome.
  • Did you see her? What an awesome ass she has.
  • Did you see her? What a hot ass she has.
  • Did you see her? What a sexy ass she has.

2015-02-28

Feb, Monkeys, etc...

I was really trying to have a demo of Crooked ready by the end of the month, but it isn't quite ready yet. There just aren't enough days in the hour. Anyway I started coding again (almost made it a month) and added some good stuff.

First I added the ability to set a priority for rules. It helps in scenarios where multiple rules have matching criteria counts, but one should be selected over others. I don't see myself using it all the time, but it was easy enough put together.

Then I added pre and post rules. For a while I planned on adding the ability to "sticky" passages, making them always be evaluated before the current passage is displayed. It turns out that is much easier to just have the system do a query for pre and post rules automatically. If there are no pre or post rules defined, then the system won't display anything.

The major thing I wanted to blog about is that I've settled on a unified way of modifying a span of text. Previously if you wanted to make text bold for example, you had to wrap the text in a set of html tags like this:
 <b>my text</b>
My idea was to make this better, and I came up with this:
[b, "my text"]
Sure, in this case there is not much of a gain as far as amount of syntax to write, but check out this comparison of adding colored text:
<color=#ff0080>my text</color>
[#ff0080, "my text"]
It's an improvement. The ease is really clear when you have multiple styles for a piece of text:
<b><i><color=#ff0080>my text</color></i></b>
[b, i, #ff0080, "my text"]

2015-02-22

Short Body Gen survey

I have put together a feedback form for Body Gen. If you've downloaded a copy, consider filling out the form for feedback or something. Body Gen Feedback

2015-02-17

Text Piece Tuesday III: Beyond Cyberspace

First a quick notice that I've updated Body Gen again. v005 includes a masc/femme personality stat that affects things like sex prefs, body hair, makeup, etc. This little tool is really coming along nicely. You can grab a copy over on the Body Gen page and lemme know what you think.

Now on to the TEXT! Slight nsfw warning! (but not too nsfw)

2015-02-13

Body Gen v004

I keep tinkering with Body Gen and thought I'd post an update.  Best addition is color palettes for skin tone and hair color.

You can grab it from the Body Gen page if you want to check it out.

2015-02-10

Text Piece Tuesday II: The Secret Of The Ooze

What's that? It's Tuesday again and you are here for a text piece from your old uncle plaguey? Oh all right, I can't say no.

(Copies and pastes text)

Here you are, but don't tell your parents I gave ya this before suppertime.

2015-02-08

I might be making things too complicated


My goal for this week was to redo the intro scene to add more variation, but it has turned into a complicated mess. This is roughly half of the scene mapped in Twine. I guess it will just take another week to finish at this rate, but that puts me behind on everything else I wanted to do. I'm not really certain that adding more options necessarily makes the scene better either.

Anyway I picked up a useful script that does flow style layout groups in Unity UI. This is a nifty replacement for the SHITTY lists that I had setup to interact with the world system previously. Here is a gif.


It is always nice to add something without actually coding it myself. I also found a few bugs with the world system, but I'm still going to hold off on coding for another 20 days...... It's tough.

2015-02-06

Today I got a lot of work done on the game

Wait, not game. What's the word I'm looking for ... oh that's right, excel spreadsheet is what I meant. I got work done on the excel spreadsheet that lists characters in the game. Yeah I put these bad boys together all by myself.




I better put that NSFW warning back up before GOOGLE pulls the plug on this blog, and not in a good way. I'm here all night ... apparently.

I also scoured the INTERNET for potential images to use in the home screen and found this little gem that both describes the game and sums up my current progress.


Sigh.

I did write a bit though. Only problem is I'm jumping ahead to scenes that won't be seen until later on in the game. It's just that they are soooo good I couldn't help it.

22 days left. I gots this.

2015-02-04

Promo image for the ad campaign











Note: there will be no ad campaign


Actually, I guess I'm struggling to resist the urge to code new stuff for the game. I've already got three new ideas that I'd like to start building, but I made a pact. And for whatever reason, I won't give in ... only 25 more days in the month, I can do this!

2015-02-03

Text Piece Tuesday

Since screenshots don't make much sense with words, I guess there is this thing where you post a snippet of text for text games on Tuesdays. Without further ado, here is the opening passage for Crooked.
---


Dear Adaobi,

    What more can I say to you? You've heard it all.

    Everything significant that I've done this past decade is no news to you. There are probably Americans searching for you even as you read this, wanting any information about me you are able to give them. Some of them, I fear, may do more than ask. Even so, I am asking that you remain quiet about me and our correspondence. If there is one thing that you owe me, it is that respect, and you know it.

    Still, it is abundantly clear that an apology is in order. You wouldn't have sent all of my letters back if everything were peachy. Despite the fact that they were torn into pieces, it says something that you thought enough of me to keep them after all of these years. From where I'm sitting now I have more power than I could have ever dreamt of back when we were first introduced. Yet I'm not free from the wolves at the door, and haven't been for a long time. Adaobi, I'm taking this moment to write you because I may not have this opportunity again.

    I've hurt you. I can't take that back. I've done far worse to others who've mistakenly given me their trust, or foolishly betrayed mine. For some, I never had the chance to apologize, even if I thought to do so. My choices live with me every day. Some faces I'll never escape, and this weight alone may be my end. If by chance this letter reaches you, it will be my last.

    Adaobi my dearest friend, I am sorry.




---
Yeah I already get awkward enough writing to begin with, but add to that certain harsh reviews I've gotten in the past, and it makes posting this feel embarrassing. But I remember to tell myself that anyone reading this has probably checked out my past stuff and is still here for whatever reason so what the hell.

I might cut out this part of the game because it's really a crazy side story. Then again the whole game is planned to be a collection of crazy side stories. So yeah, if anyone needs me I'll be under a rock.

2015-01-31

January Wrap Up. Screen Shot Sat, Mission System, etc.

January

I think this was a good start to the year. I've added a bunch of things to the system and designed a lot of stuff for Crooked that should keep me busy through the rest of the year. Looking back on my posts to this blog, in January I did this:
  • put together basic documentation for Fate
  • transferred NDGA to the system (although I don't think I'll release the updated version because it is incomplete)
  • added basic horizontal lines with variable width
  • added a fancy text style and text alignment
  • added watching variables for changes and toast messages
  • added the stat display for viewing variables
  • added input and toggles to variables
  • added print() transformations using Humanizer
  • put together Body Gen and released it for peoples to try
  • added descriptive text within links
  • added an sms text style
  • and finally I added the mission system and added icons to the main game screen for prettyness.
 There are probably more things in between all of that stuff, but I can't remember any of it.


Mission System



2015-01-28

txting

I'm knee deep in coding the mission system when all of the sudden I stop and build this instead...



I just really wanted to have a nice way to represent text messages in game. The code for this is simple enough:
text("in")
Hey, what time are you going to finish the Mission system?
text("out")
dunno
text("in")
what do you mean dunno?
text("out")
I mean I'll finish it when I finish it!
The big things missing with this are emoji, which are currently impossible with the default Text component in Unity, and Images. Images are an interesting problem due to the way they would need to be loaded in code, but I don't plan on using them, so they are on the back burner.

2015-01-24

A Saturday Screenshot

How did the week go so fast? I should be working on a time machine, or better yet a cloning machine so I could make a few more of me to do things. Anyway here is a screencap of an addition I made to links to allow descriptive text within them.

  

That is done with code like this:
 [[Body Builder|desc("- this will prove your raw power -> Strength")]]
I'm also considering using passages as the descriptive text and or the link text, but I'm in no rush to implement that yet.

Anyway, the screencap also shows the talents that I've thought up for the game so far. I've spent the last week lurking around rpg.net looking for game design ideas and stuff. For the most part I left with more knowledge, but haven't made changes to my original ideas. 

I figure Crooked will have talents that are trained through various actions in game. Every in game day, talents that are trained will increase while all others decrease. I think it will be a fair way to allow the player to do interesting things in tight spots. I'm thinking there could be tiers to these talents. For example once you are good at a particular talent, it can decrease without use, but stay above a threshold. The most important thing is that there aren't any artificial barriers that become annoying rather than fun. I'm interested in any thoughts on these 'talents' or any alternative design ideas as far as skills/talents/classes etc.

2015-01-21

Just a quick post about Body Gen

I've updated it to v003. The update details and links are over on the Body Gen page. I've found and fixed a few bugs as the result of people messing with it, so I feel good about that.

I think the bodies it gives are detailed enough where I don't need to work on it anymore for my purposes. Still there are definitely things that could be done, but I've spent far too much time 'researching' boobs. Actually, that wasn't so bad.

I even found this little gem http://en.inkei.net/ just don't ask me what it is for.

2015-01-17

Screen Shot Saturday

It's Saturday again... time for crappy screenshots!


Added stat bars and did a little work towards crisper text. I'd still say everything looks bad, but it's better than nothing. When Unity redo font rendering it will be a good day.

2015-01-16

Body Gen v 001, Fate Test

Making characters is the thing I spend the most time on. It's always tricky so I keep thinking of ways to get better end results. One tool that I can't go without is Fake Name Generator. I've used it a lot because it spits out a random person that I can shape into what I need. The only downside is that they don't generate physical body information. I'm pretty sure if they did got into bodies, they wouldn't include the ~details~ that I require anyway. It dawned on me that I can create a generator for that stuff myself.



I started with a tool built in Unity, then realized I could easily do the same thing using Fate.



This has the added benefit that I can post Body Gen here in hopes of getting some feedback on Fate. But this is like version 001 of Body Gen so don't expect much. Here are download links:
WINDOWS
MAC
LINUX
These are built using Unity so they are a little sizey, but what can ya do. Please keep in mind I have no idea if these will work at all :). Also if your computer explodes it's your fault. (Legal mumbo jumbo here) Okay I think they'll work, but the whole purpose is to find problems that I can fix. This is such an early public test, that I consider it a success if the thing starts up on your computer at all.

Body Gen is very simple right now, but will include more logic and details later. One place that is lacking for example is that the system generates trans-gender characters, but assumes they are all pre-op except for breasts. There are also various skews in place based on race that could/should be modified. For example blacks are more likely to have much larger cocks, but that doesn't necessarily mean that other races aren't capable of similar sizes. In other words, there are a lot of incomplete and or bullshit subjective things that could be changed. Apologies to all the people everywhere.

Assuming the game loads, a major point of the system is that games are moddable by default. This means if you want to customize Body Gen it shouldn't be a problem, given you know how the source code is formatted. It should be familiar to those who have used Twee/Twine. The document page is included in each zip. I use sublime text 3 with a plugin with syntax highlights and code completion for .fate files. Here is a copy of the plugin.

I'm probably thinking too far ahead, but if you are interested in sharing changes to Body Gen, you can send stuff to my email so I can include it in future versions. p4p - a - t - bunkville.com
I'll eventually setup some better way of sharing things, but I'll cross that bridge when I get to it. Thanks.

2015-01-14

50th post, 2015 goals, New project... again

50th post get. I guess having a blog is nice. Here is something new with the system, toggles and toggle groups. These work something like input boxes, immediately setting keys once they are toggled on or off.

The code:
input("text", $lastName, "Last Name")
input("text", $firstName, "First Name")
toggle($gender, "Gender - <i>select one</i>", "Male", enum.male, "Female", enum.female, "Non-Binary", enum.nonBinary)
toggle($family, "Family - <i>select one</i>", "Single", enum.single, "Married", enum.married, "Separated", enum.separated, "Divorced", enum.divorced, "Widowed", enum.widowed)
input("integer", $childrenCount, "Children Count")
toggle($race, "Race - <i>select one</i>", "American Indian/Alaskan Native", enum.native, "Asian/Pacific Islander", enum.asian, "Black", enum.black, "Hispanic/Latino", enum.latino, "White", enum.white)
The Result:

So last year I did two things. I started new projects and worked on them up until I found something wrong with my game system. At that point I would tear down the system to change how it worked, then find myself starting a new project again. I think this was a good thing in the long term because the system works better because of it. Problem is I didn't finish any actual games.

This year things are better. I believe the system is stable enough to use without needing to make big destructive changes. And now I'm left with a bunch of projects at various levels of playability. I've considered asking around various forums for opinions on which of them sounds the best, but really any of them would be good. The thing is, I've been super interested in RPGs recently. I want to make a game where you create a character and do RPG kind of stuff.

The past few weeks I've been adding features to the system to support text based RPGs. At the same time I've been designing a new project currently called Crooked. 

2015-01-12

Nerdy joy using Humanizer to mutate variables in print()

I've added a super cool resource to the project, Humanizer. So far I've integrated a good slice of it's functionality directly into the print() function. Here are some code samples along with the output created.
:: Humanizer Tests
WORD TRANSFORMATION

set($txtKey = "text sample of some words")
$txtKey = 'print($txtKey)'
$txtKey -> uppercase = 'print($txtKey, "uppercase")'
$txtKey -> lowercase = 'print($txtKey, "lowercase")'
$txtKey -> titlecase = 'print($txtKey, "titlecase")'
$txtKey -> sentencecase = 'print($txtKey, "sentencecase")'
$txtKey -> underscore -> pascal = 'print($txtKey, "underscore", "pascal")'
$txtKey -> underscore -> camelcase = 'print($txtKey, "underscore", "camelcase")'
$txtKey -> underscore = 'print($txtKey, "underscore")'
$txtKey -> underscore -> hyphenate = 'print($txtKey, "underscore", "hyphenate")'

line(1)

SINGULAR/PLURAL & QUANTITIES

set($goatKey = "goat")
$goatKey = 'print($goatKey)'
$goatKey -> plural = 'print($goatKey, "plural")'
$goatKey -> toquantitynone, 0 = 'print($goatKey, "toquantitynone", 0)'
$goatKey -> toquantitynone, 1 = 'print($goatKey, "toquantitynone", 1)'
$goatKey -> toquantitynone, 11 = 'print($goatKey, "toquantitynone", 11)'
$goatKey -> toquantitynumeric, 0 = 'print($goatKey, "toquantitynumeric", 0)'
$goatKey -> toquantitynumeric, 1 = 'print($goatKey, "toquantitynumeric", 1)'
$goatKey -> toquantitynumeric, 11 = 'print($goatKey, "toquantitynumeric", 11)'
$goatKey -> toquantitywords, 0 = 'print($goatKey, "toquantitywords", 0)'
$goatKey -> toquantitywords, 1 = 'print($goatKey, "toquantitywords", 1)'
$goatKey -> toquantitywords, 11 = 'print($goatKey, "toquantitywords", 11)'

set($womenKey = "women")
$womenKey = 'print($womenKey)'
$womenKey -> singular = 'print($womenKey, "singular")'
$womenKey -> toquantitynone, 0 = 'print($womenKey, "toquantitynone", 0)'
$womenKey -> toquantitynone, 1 = 'print($womenKey, "toquantitynone", 1)'
$womenKey -> toquantitynone, 11 = 'print($womenKey, "toquantitynone", 11)'
$womenKey -> toquantitynumeric, 0 = 'print($womenKey, "toquantitynumeric", 0)'
$womenKey -> toquantitynumeric, 1 = 'print($womenKey, "toquantitynumeric", 1)'
$womenKey -> toquantitynumeric, 11 = 'print($womenKey, "toquantitynumeric", 11)'
$womenKey -> toquantitywords, 0 = 'print($womenKey, "toquantitywords", 0)'
$womenKey -> toquantitywords, 1 = 'print($womenKey, "toquantitywords", 1)'
$womenKey -> toquantitywords, 11 = 'print($womenKey, "toquantitywords", 11)'

set($disappearanceKey = "the disappearance of 'Razor'")
$disappearanceKey = 'print($disappearanceKey)'
$disappearanceKey -> truncate, 7 = 'print($disappearanceKey, "truncate", 7)'
$disappearanceKey -> truncatecharacter, 7 = 'print($disappearanceKey, "truncatecharacter", 7)'
$disappearanceKey -> truncateword, 2 = 'print($disappearanceKey, "truncateword", 2)'
$disappearanceKey -> truncateleft, 7 = 'print($disappearanceKey, "truncateleft", 7)'
$disappearanceKey -> truncatecharacterleft, 7 = 'print($disappearanceKey, "truncatecharacterleft", 7)'
$disappearanceKey -> truncatewordleft, 2 = 'print($disappearanceKey, "truncatewordleft", 2)'

line(1)

NUMBERS

set($numberKey = 0)
$numberKey = 'print($numberKey)'
$numberKey -> numbertowords = 'print($numberKey, "numbertowords")'
$numberKey -> numbertowordsordinal = 'print($numberKey, "numbertowordsordinal")'
$numberKey -> numbertoroman = 'print($numberKey, "numbertoroman")'

set($number1Key = 1)
$number1Key = 'print($number1Key)'
$number1Key -> numbertowords = 'print($number1Key, "numbertowords")'
$number1Key -> numbertowordsordinal = 'print($number1Key, "numbertowordsordinal")'
$number1Key -> numbertoroman = 'print($number1Key, "numbertoroman")'

set($number55Key = 55)
$number55Key = 'print($number55Key)'
$number55Key -> numbertowords = 'print($number55Key, "numbertowords")'
$number55Key -> numbertowordsordinal = 'print($number55Key, "numbertowordsordinal")'
$number55Key -> numbertoroman = 'print($number55Key, "numbertoroman")'

set($number1111Key = 1111)
$number1111Key = 'print($number1111Key)'
$number1111Key -> numbertowords = 'print($number1111Key, "numbertowords")'
$number1111Key -> numbertowordsordinal = 'print($number1111Key, "numbertowordsordinal")'
$number1111Key -> numbertoroman = 'print($number1111Key, "numbertoroman")'


The really nice thing is that these commands can be chained until the input variable is printed in the correct format. For example in order to make the $txtKey variable into camelcase, I had to underscore it first. There were a few issues with some of the localization stuff, but I think this is only a problem on my particular system. Even so I might wrap all the calls to Humanizer into a try catch block and print out the default variable values if things fail. Still, I can see all kinds of potential uses for these functions. I'm not entirely happy with the verbose arguments in the print call, but that is easy enough to change later. I will probably expose all of this stuff in a transformation function so that modifications are saved into the variables permanently if desired.

2015-01-11

Input

Got simple input done today. This code ...
input("text", $text, "text")
input("integer", $integer, "integer")
input("decimal", $decimal, "decimal")
input("alphanumeric", $alphaNumeric, "alphaNumeric")
input("email", $email, "Email")
... turns into this ...


Each input field gets pushed into a key for whatever is needed. I still need to add a way to put character limits on the amount of text that can be typed. I'd also like to put an optional range for acceptable number input. That isn't too critical since those limitations can be done by messing with the value stored in the key that the input makes. There is still more to do with input, like toggles, toggle groups, drop down menus. I'm more interested in adding one more large sub system... Missions!

2015-01-10

Screenshot Sat

I've been busy this week. I thought it was about time I did some optimization. The system was taking around 10 seconds to import NDGA source code. I was able to crunch things down so that it only takes a few ms now. With that done, there was one nagging issue on my mind...
Your sex appeal has increased by 10
The source is filled with those kinds of lines. It's good to tell the player how the stat is doing, but writing that out is tedious & potentially error prone. The solution is to use watch(). Basically you can call this:
control("watch", $donaldSexAppeal, 0)
and the system will put a watch for any changes to the variable above the sent in number. This is super useful and I plan on using it a lot.

Another thing that I put in every passage was the main Sex Appeal stat line. It looks like this now
Sex appeal: print($donaldSexAppeal)
line(1)
I can think of two solutions to this. First is sticky passages. Basically any passage could be stickied, forcing it to appear at the top all the time. This is a good enough solution, but the other idea is to add an entire menu for stats. I decided to take the tough route and build the stat menu.



You can see how watch() works, pushing sex appeal changes to a toast message. Saves work the same way, presenting a little toast. And stats are toggle-able from the stat item at the top right. Eventually I will use the players name in that area in place of stats. I have to work on the sizing and stuff, but for what it does it's pretty nice. Stats aren't baked into the system either, you basically call what you want in the menu like this
stat("heading", 1, "Donald")
stat("number", 2, "Sex Appeal", $donaldSexAppeal)
The stat system isn't 100% implemented yet (text variables, percentage bars, etc), but I'm super happy about it so far.

2015-01-04

Fancy text

Added text align functions. Now text like this...

:: Begin Yard Work
Sex appeal: print($donaldSexAppeal)
line(1)
When you step outside, you close your eyes and take a deep breath of warm summer air. You stand still for a moment and experience a rush of memories of your family that cause the familiar sting of nostalgia and wistfulness.
text("fancyCenter")
<i>You hear kids playing hide and seek in the yard while you are cooking steaks on the grill. Your wife's beautiful sun dress flaps in the wind while she drinks a sweet tea and chats with the next-door neighbors. Your son yells out 'Gotcha!' as he finds the neighbor's daughter hidden behind one of the shrubs.</i>
text("left")
Returning from the past, you open your eyes to view the beautiful sky, and as you look down, you see the work ahead of you.
...will render like this:

The next thing I want to do is add in a text messaging kind of style with txts written like this
text("in")
wazzup bro
text("out")
nm
text("in")
what did u call me?
text("out")
...
The big thing I'm waiting for is Unity to update their text rendering with the UI system. I don't really want to put the effort into making a workaround for embedded links. I has many features on my todo list. Not to mention games...


Screenshot Saturday?

I added the ability to print lines!





Not super impressive, but it brings me one step closer to matching what I was doing with Twine. Also the code changes I made will make it easier to change text alignment and add other stuff within a passage body like images, toggles, input fields etc.

2015-01-01

Screw 2014

Well, I missed that deadline I set for getting Ever Forward playable by new year. I underestimated the levels to which I would be chillaxin over the holidays. Ahh well.

Anywho I did work on getting some basic docs setup for Fate. Up until now I've just tried to remember everything about how to use it, and looked up anything I forgot in the code. There aren't a whole lot of things to remember, but having a reference helps. If you're curious I posted a copy of the reference HERE.

For now I decided to dig up NDGA and convert it to Fate. For the most part the game works. The things that don't work are important (images, special formatting, embedded links), so I've put them on my todo list. Still, I'm pretty happy to just have the thing work. I can pretty much just write without frustration. Less frustration means more time to just write. Sure there are a few issues here and there but bug fixin is the name of the game.

Speaking of that I guess I could post a build of it here to get feedback, but I'd rather wait until I test it out more on my own. The game is the same as the last version I released way back when, except with a few loose ends that I left hanging. If you'd like to try it out and offer feedback on the system send me an email at moc.ellivknuB@p4p (reversed). Yup, domain name get... sorry whoever owned it before! (not really sorry) (also there is no website ... yet)