Kerlin
Email me [here]
My site: [Kerlin Softworks]
Projects
All standalone apps. Non-UT projects.
[Eleblend] texture blending for terrains
[Ripple Rain] animated rain billboards
[Gradient Thief] steals colors from existing images
[UT2003 Screenshot Assistant] batch image processing/resizing/gamma correction
[UT2003 PGAMA (pretty good attempt at map analysis)] online map analyzer; beta
[Gradient Thief (Unreal Script Enhanced)] This patch for UIU generates ColorScale() data for those pesky emitters
UT2003 Projects
Journal
June 17, 2003
Working on the basics of a mutator. Against recommendations, I've kept EACTFGame which extends CTFGame. I want to see concrete results of why I shouldn't extend CTFGame instead of "you just shouldn't do that." At this stage, the preceding is a little ambiguous because, to put it bluntly, I don't know what the hell I'm doing.
Some good news: I was able to successfully view the actor with editactor class=EACTFGame so that was nice. I simply used spawn() to create the new class in the PostBeginPlay of my mutator. My new class is there based upon the log entries firing off in PreBeginPlay.
Some bad news: The ScoreFlag never ever happens, though. Next up is the fact that, at game start, I get "plaaay!" and then a second later or so "plaaay!". Looks like I'm starting to get my concrete reasons for "you just shouldn't do that" which is fine. I'm dealing with people who have been where I'm at and they're trying to help but knowing that I shouldn't do something versus knowing the details of why as well as the effects is where I'll learn. Besides, if someone asks me someday, I don't want to say that they shouldn't do something without being able to back up what I say.
Anyway, to top things off I'm getting loads of AccessedNones, various AI errors, NothingToDo's for bots, and a whole lot more in my log. I made sure I have None checking before working with various objects but that sure as hell isn't cleaning up anything else. Now I'm not saying these guys aren't right. I'm sure they are, but I have to get burnt to learn it.
I do want to try one more thing, though, (optimistic aren't I?) and that's instead of spawning the class, just declaring it from within my mutator. That likely won't work either and although I could be +3 days ahead of where I'm at, I want to educate myself about UnrealScript not just make a mutator.
Conclusion: Mychaeel is right. I am wrong. I never thought otherwise but I wanted to see the meltdown myself...besides I'm too wet behind the ears to understand everything the guy is saying at this point.
June 18, 2003
At the suggestion of Foxpaw and Sir Brizz, I'm using GameRules for my mutator and it's working oh so smoooth. Man I wish I was +3 days ahead.
June 19, 2003
Man am I having a hard time figuring out what I can and can not safely subclass. I just saw mention on the help desk from Foxpaw that you can subclass GameInfo but to do so successfully you need to subclass a bunch of other stuff.
I'm trying to get access to ScoreObjective just so I can see what kinds of stuff go in and out of it and if it's a viable alternative to subclassing CTFGame to figure out when a flag has been captured. As well, hopefully it can tell me when someone scores in Bombing Run.
Added it to the GameInfo page in hopes that someone might fill in the details so at least I know I'm dealing with the correct function.
The wiki here is one beautiful resource but as I start to dig in on my mutator, there's a lot that isn't there.
Long term, I'll probably have to go with a Timer based polling approach to check the game state since I'm having so many issues with subclassing. It seems lazy, though, and I'm stubborn about learning the proper way to subclass some of the more complicated classes because I know I'll need to do it if I want to get into the really cool stuff. I'm not even really working on the real stuff yet.
June 20, 2003
Took a break from UnrealScript and am putting the finishing touches on a simple game balance tool. Don't know if it will work or not. The server and database are complete. It's tracking 88 different tags in a ut2 file as well as their frequency. Unfortunately, I can't go beyond xWeaponBase and figure out the actual weapon on the base so I'm kludging it a bit and saying that if there's ammo available for a weapon, then the weapon exists. The client is nearly complete; just needs some more robust error handling.
I've got it so people can put their own maps into the system for comparison. I figure that's the best way to handle it since the reporting will be in flux for...well, ever. They enter the info on the website, local client downloads and does the counts, raw counts are uploaded to the server. Queueing and basic reporting are all there.
I'm hoping to find interesting details about some of the better maps by running them through the utility. It's all online but isn't ready for primetime yet. So far, it's just some of the simple stuff and I need to bounce off some formulas with someone to really make it useful.
So far, in my initial testing I'm finding that 4 of the 6 Deathmatch maps have a "Damage Health Index" of between 10 and 15. That is, for every one point of health on a level there are 15 points of damage waiting for you in the form of ammo and so on.
Still a lot of work to do, though:
- make sure when I'm seeing x FlakAmmo that in UED there really are x flakammos.
- filter out tags that have no valuable information.
- get the compare two maps feature written; that's on hold until I get a solid version of the mapinfo page
- run all of the epic/de/ownage maps through it and look for interesting info
- use epic as a baseline for "rating" a map (in the loosest sense of the word)
- need to add "segments" for ownage, beyondunreal 7+ rating, unrealplayground 70+ rating, and epic; won't be hard...just needs to be done
Then again, I might just be making junk. Only the end result will show for certain.
June 21, 2003
Ohhhh yeeeaah! Some of the reporting is coming together. Here's Epic:
http://www.kerlinsoftworks.com/ut2k3/epic.html
June 25, 2003
Beta is up! [UT2003 PGAMA (pretty good attempt at map analysis)]
Comments and critical analysis are more than welcome. Fire away.
July 8, 2003
Having a lot more luck with creating the False Prophet Deathmatch game type than trying to create a mutator that knows about all games. It's been one hell of a learning experience. Still trying to get the false prophet to have an ambient light attached and get some emitter fx floating out of him so that he's an obvious target. Word on the wiki is that attaching to bones may not always work so I'm gonna follow Foxpaw's rec and see if I can attach it to the feet as is done in ComboSpeed. File that under "Why didn't I think of that?"
I playtested it a bit and was surprised to learn that it wasn't fun because it's too hard to find the enemy prophet. I decided to rip out the HUD from the Mutant game type and use it. The directional radar approach works much better and helps in defending your own prophet and finding the enemy. I think I'll leave the top and bottom messages in, though. Top message=enemy, Bottom message=friend. Top message might say "God wants you to kill BotoxBot" (since Botox is the enemy prophet) while the bottom message might say "Defend Malcolm" (your team's prophet).
I'm anxious to get home and test out some of the SquadAI I've been working on. In AssignSquadResponsibility, I'm telling a bot what to do based upon whether or not he's the prophet.
B.bJumpy = true; B.BaseAgressiveness = 0.0; B.CombatStyle = 1.0;
If he's not, there's a 50/50 chance he'll try to defend the prophet or go after the other prophet via B.FindBestPathToward.
I'm totally unsure as to whether:
- a TeamAI component is needed
- I need to "attach" an Objective to the enemy prophet somehow
- B.FindBestPathToward will be a good solution/work at all
Fun factor has definitely improved but what I really need is that feeling of bot intelligence. AI is going to be very important. I want the adrenaline pumping when you see a swarm of bots coming at you, you're totally unarmed, and your team is duking it out while you're evading plasma fire.
July 11, 2003
As it turns out my bots weren't doing what I thought they were. It was an anomaly.
In fact, after I added AI for my bots, the whole thing went to hell with a quickness. Major disappointment.
I find myself spinning in circles trying to determine how I should go about fixing the issue. A GameObjective object is needed but it's a hack. What, I set the Location of the Objective passed upon the location of the prophet? Naah..too kludgy and that will definitely cause problems, I think.
How about GameObject and make the prophet hold it via SetHolder? That seems like the best solution but I'm not sure how I go about implementing it. When a player dies, I must move the game object to someone else or I'm afraid the bots will just stand around.
I've got some important information for the HUD radar in a ProphetGameReplicationInfo class and the current prophet is kept track of based upon PRI. Maybe I can just make sure the object gets a SetHolder call every n seconds. Hope that doesn't screw up the AI.
Of course, when someone's a prophet I'm concerned about them not acting defensive/evasive. I most likely don't want them to Hunt.
A lot of UnrealScript you can feel your way through but this AI stuff is REALLY in need of a good write up. Pieces of it are here on the wiki but some sample code would sure make a difference.
July 13, 2003
Well, looks like I might have started on a solution as far as AI.
In ProphetTeamAI I have a timer fire off every second. If there's an enemy or friendly prophet, the swaud's information about prophets is updated.
Now: Things are working really good...if you're not paying too much attention.
My problem now is that...hehe...the enemy is TOO aggressive. They'll run for weapons at the start but once they know about a prophet, it's blood lust aggressive rather than using distance weapons. I think my propblem is in ProphetSquadAI's CheckSquadObjectives:
return ( TryToIntercept(B, EnemyProphet.Pawn, EnemyProphet.Region.Zone) );
I want them to find and kill the prophet but if they happen to spawn near a prophet, they don't go for weapons. Instead they just make a b line for the prophet. Once they arrive, they will stand right on top of him and unload...not very smart.
Defenders will sit on top of you and eventually back you into a corner if you are the prophet, as well.
I've temporarily abandoned putting the emitter on my prophet. I copied some mutant code and can get some stuff going there but I'm more focused on game play right now. Game play, game play, game play.
Things are looking up, though!
Once completed, I think I'll post the source code on the wiki. I'm waaaay too green to write a tutorial but I think if I put it up there with "and this line is doing this" some of the wiser folks here will correct me. An everybody wins sort of contribution: new folks learn from an example line by line and I can learn where I could have done something better.
July 15th, 2003
I gave it my best. I have to walk away, now. If I don't, I'll never finish. I'm 80% proud of it and 20% frustrated by what I can't figure out. [False Prophets v100] has shipped.
July 18th, 2003
So I've ripped out all of the AI so I can step through it piece by piece. It's easier to debug a few lines in a function rather than trying to debug an entire "code complete" Team and SquadAI all at once.
Guess what? Found a bug in my AI. Not a little spider, more like a Flying Madagascar Hissing Cockroach. In my ProphetTeamAI I was looping through all squads and setting the Enemy and FriendlyProphet. I wrongly assumed that a particular instance of ProphetTeamAI would only see SquadAIs that it had created. Not the case: that loop would see all squads regardless of team. The effects of this bug are astronomical. Just massive. The fix was simple.
if ( Team.TeamIndex = S.Team.TeamIndex ) { // Now it's safe to set the enemy and friendly prpohet }
Now I just have to figure out why teams do not fight until a first kill. There isn't anything other than logging of params in my AI code, right now. And they all end with an appropriate call to Super.
July 22nd, 2003
Oh how far False Prophets has come in the past few days. After getting poked in the eye with a sharp stick by the guys over at ModSquad, I realized I desperately needed polish for this to look good and play well.
From above? Team's weren't fighting because I forgot to return Super if there wasn't a prophet. Amatuer.
Polish and options. Neophosis said something about a longer shelf life for mods with a decent set of configs. Why it never occurred to me is still a mystery.
New options and a new config screen to go with it. Just need to figure out how to get my mod to actually use the configs set by the user. Shouldn't be hard. I'm sure it's here in the wiki. Anyways, here's some of the new stuff:
- Prophet gets periodic UDamage (10 secs), checkbox
- Prophet gets periodic health (10 health every 7 seconds), checkbox
- Prophet gets invisibility after being prophet for a very long time (after 3 mins), checkbox
- Use domination scoring (longevity = more points), checkbox
- Longevity bonus (10 sec udamage, 15 sec udamage, 20 sec udamage for various longevity "levels"), checkbox
- Prophet lights, checkbox
- Screen messages ("You are chosen!", "Your God Is Dead!", "Destroy the False Prophet!", etc), checkbox
- Audio voiceovers ("You are chosen!", "Your God Is Dead!", "Destroy the False Prophet!", etc), checkbox
To do:
- Prophet spawns redeemer explosion on death (looking in RedeemerWarhead but not having much luck)
- Curse combo (enemy team gradual health/speed decrease for 15 seconds; only the prophet can do this combo)
- Blessing combo (friendly team health/speed increase for 15 seconds; only the prophet can do this combo)
- Eye of God combo (pipedream at this point)
I don't think I want to over do it on configs. Letting users set too much (eg, ## health per ## seconds) sounds like a recipe for disaster. Just a la carte style rules.
July 24th, 2003
Big project at work. Won't have time to check the wiki for a few weeks. Development of False Prophets continues, however.
Guestbook
Thanks for the welcome, guys!
Wormbo: Hi and welcome to the Wiki. You can add yourself to the Project Contributors list if you like.
EntropicLqd: Hello and welcome. I hope you enjoy your stay at the Wiki.
Trystan: He comes bearing gifts. Welcome home.
Trystan: What would I have to pay to get a copy of that "Access Restricted, Lethal Force is Authorized" graphic on a size suitable for printing on 8.5" x 11" and in greyscale? Ah, hell, screw grayscale, we've got a color printer up front. That sign would be awesome to put on our IT office door here.
Kerlin: I gotta 1200x1200 alternate version (same basic look but dirt is a bit different) I'll put up.
Trystan: I had the same problem with the links downloading. Do something like this http://kerlinsoftworks.com/accessrestricted.jpg?a
Balu: me 2, me 2 - but a white background would be nice (WTF am I still guest?!?)
Tarquin: Hi there. Belated welcome!
Kerlin: Heya, Tarquin.
Foxpaw: Hey Kerlin, I didn't notice you were writing down the problems you were having with false prophets down here but I had a couple of ideas. For the prophet FX, you may be able to attach it to a better bone than the feet. I don't know about the head, but I know that the bone "spine" works for me, and it's pretty central. That might make it easier to see the prophet FX. When I recommended the feet, I mostly just meant to test it on a location that you knew worked to see if it was the bones or the code that sets it up to the bone. I don't know what the bone reference for the head is, but, like I said, "spine" seems to work and is centrally located. Depending on what the emitter looks like that might work well.
As for the AI, you may be able to control the AIs using AIScripts. AIScripts are meant to be placed in maps to tell bots about a certain "trick" they can do on the map, you may be able to exploit them to have your prophet run away and have other people cover the prophet. I haven't played with AIScripts yet, I just wrote my own pawn and controller classes from scratch because I didn't like the built in ones. Since you will almost definately want to retain the existing pawns, you could try the AIScripts. Unfortunately I don't know much about them so I couldn't really explain how to use them.
Foxpaw: I put up a list on Bone Names of known bone names that you can reference through unrealscript. I haven't had much luck with the head bone, but you might be able to get it to work.
Kerlin: Thanks Fox. Sorry been lazy about updating the wiki. Been trying to hack through this code. See above journal. I will be certain to try your suggestion. Thanks again.
MythOpus: Hey Kerlin. I downloaded your Team False Prophet mod and I haven't been able to get it to work. It runs just like a normal deathmatch time game.
Foxpaw: I left a note about this issue on the Mod Ideas/False Prophets page. This is caused by a typo in the .int file that was apparently left in accidentally.
Kerlin: Sorry to hear you had problems, MythOpus. Unless you've got a sick sense of humor, wait until the next version. It's really just that ugly of a mod. Seriously. Major problems. Barely fun. Just bad, bad news...