Ted's RPG Rant

A place to rant about RPG games, particularly the Temple of Elemental Evil. Co8 members get a free cookie for stopping by. Thats ONE cookie each, no seconds.

Wednesday, October 31, 2007

Kecik! 49

Image Hosted by ImageShack.us

Yvy actually refrains from drinking much coffee so it won't affect Kecik. Won't drink much grog either. Very sensible :-)

In other news, I have a cold. :-(

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Tuesday, October 30, 2007

Comic status

48? I could have sworn I was up to 49...

Anyways, I got a LOT of ideas for the comic but they need

- Yvy to pose for some photos

- me to have time to do them.

I got home from work tonight to find that the agency (fuck them) had rung to leave messages to say that my 9am start had been changed to a 6am start. I got home from work at 10:30pm, and still had to pack and post the CMF for the KotB beta. So not surprisingly I am rather tired, and not happy. They could have contacted me at work - my work uses that agency and they know where to find me. They knew I didn't want to work tomorrow but had agreed to do the 9am thing as a favour. I have a lot of IMPORTANT shit to do tomorrow, including a phonecall to stave off some creditors and also my tax return (due 31/10 here in Oz) so I don't appreciate any of this. But they still screwed me.

So unfortunately the comic has to take a back seat. But it WILL be back soon, and in force.

Wednesday, October 24, 2007

Kecik! 48

Image Hosted by ImageShack.us

Why, indeed...

Once again, this is not posed - although it looks like I am forcing her to look toward the TV, I am merely supporting her head and neck in the time-honoured parental manner. She likes the TV, purely for the light I suspect.

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Tuesday, October 23, 2007

Kecik! 47

Image Hosted by ImageShack.us

Heh... my first genuine 'dad joke'. My whole life has been leading to this...

The pic of me in the last comic was just a warm-up, but the camera batteries chose that moment to give out, so we had to go with it. Could have been so much better.

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Monday, October 22, 2007

Kecik! 46

Image Hosted by ImageShack.us

Ok, that's been at the bottom of the bucket for a while... but tomorrow Yvy and I should have a chance to take some more pix :-)

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Sunday, October 21, 2007

Kecik! 45

Image Hosted by ImageShack.us

Its worth mentioning that while I took these pix, Yvy actually takes most of the photos I use in the comic. She is rather talented ;-)

Interesting aside - since human hair grows at a rate of 1/3 mm per day, in 11 weeks Kecik's hair should have grown exactly an inch. And by 'exactly', I mean give or take a mm or 2.

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Kecik! 44

Image Hosted by ImageShack.us

Heh... comix on consecutive days. Haven't done that for a while.

Yvy took nearly a dozen photos of me trying to affect a 'looking innocent' face, but none of them worked. Some looked so laughably ridiculous they will doubtless show up in future comix.

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Kecik! 43

Image Hosted by ImageShack.us

Again, this was not staged (the pic of Arianna, I mean). I'd just left a beer can there and we only noticed it when going through the photos.

The pix of me and the faces I am affecting are influenced by Irregular Webcomic, of course.

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Friday, October 19, 2007

Kecik! 42

Image Hosted by ImageShack.us

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Thursday, October 18, 2007

KotB Scripts

Since I can't update KECIK! from work, I may as well write a tutorial.

The following is a list of some of the new scripts being used in KotB. These may be updated in the future.

First and foremost, there is the npc flags. Folks who read Flags Tutorial 2 will remember it dealt with object flags - not OF_OFF and such, but individual flags for individual objects. The one we particularly played with was

attachee.obj_get_int( obj_f_npc_pad_i_5 ) &

attachee.obj_set_int( obj_f_npc_pad_i_5, 1 )

which was a simple way of storing a variable attached to the object. Cerulean used it for keeping track of recruitable shopkeepers as part of his fix that if you let them go, they returned to being shopkeepers (by having two - one to adventure, the other to remain attached to the shop inventory).

Anyways, in KotB I have written a very simple script to allow you to easily use these integers: it is in Scripts.py. It simply uses them as on-off flags (like game.global_flags[]) and is accessed in the following manner:

Firstly, put

from scripts import *

in the py file of the character that is going to use it, much the same way you use 'from utilities import *'.

Secondly, to set one of the flags, just use

npc_1(npc) or npc_1(attachee) depending on whether it is used from a dlg or py file.

There are 3 of these flags, called (funnily enough) npc_1, npc_2 and npc_3. Now, if you set them with npc_1(npc) (or npc_2(npc)...) you read them with

get_1(npc), get_2(npc) and get_3(npc)

Want to set one back to 0? Use

npc_1_undo(npc)

I wonder why I did it that way and not just undo_1(npc)? Heh... must have had a reason.

Anyways, here is an example of it in action from of one of the Watchmen in the Outer Bailey, who makes sure you have your weapons sheathed:

{750}{Citizen! Sheathe those weapons - it is an offense to show naked blades in the Keep.}{Citizen! Sheathe those weapons - it is an offense to show naked blades in the Keep.}{}{}{}{npc_1(npc); npc.reaction_adj( pc, -5 )}

{760}{Citizen! I have told you before, the carrying of naked blades is an offense in the Keep. If this happens again I will have to take further measures.}{Citizen! I have told you before, the carrying of naked blades is an offense in the Keep. If this happens again I will have to take further measures.}{}{}{}{npc_2(npc); npc.reaction_adj( pc, -5 )}

{770}{Citizen! Once again I find you walking the Keep with weapons in hand. This cannot continue. The standard fine is 10 gold: perhaps this will help you to remember to obey the laws.}{Citizen! Once again I find you walking the Keep with weapons in hand. This cannot continue. The standard fine is 10 gold: perhaps this will help you to remember to obey the laws.}{}{}{}{npc_3(npc); npc.reaction_adj( pc, -5 )}

{790}{Citizen! I am at a loss... once again you stand here with weapons drawn. Do you wish the whole garrison to fight you? Enough is enough. You are under arrest.}{Citizen! I am at a loss... once again you stand here with weapons drawn. Do you wish the whole garrison to fight you? Enough is enough. You are under arrest.}{}{}{}{}


So in 750, 760 and 770 we see each of the 3 flags being set. And what subsequent effect does setting these flags have? Well, if we check the heartbeat file we see that depending on which of the flags are set, the Watchman will automatically escalate his response:

if sheathed(attachee, obj):
________if get_3(attachee):
________________obj.begin_dialog( attachee, 790 )
________elif get_2(attachee):
________________obj.begin_dialog( attachee, 770 )
________elif get_1(attachee):
________________obj.begin_dialog( attachee, 760 )
________else:
________________obj.begin_dialog( attachee, 750 )

Obj is defined as any PC in range. This is a fragment of the heartbeat file, of course.

By doing it this way, it means Watchmen can react as individuals: if that particular guard has busted you before, he will remember it and be suitably unimpressed. If it is someone new who doesn't know you, they will treat it as a first offence. All this without tying up a bunch of global flags.

By now you are wondering precisely what 'sheathed' is: this is a script written for me by Darmagon, for memory. This one is in guards.py, so you put 'from guards import *' in your .py file if you want to use it.

def sheathed(attachee, triggerer):
________for pc in game.party:
________________if pc.type == obj_t_npc:
________________________return 0
________________else:
________________________weap = pc.item_worn_at(3)
________________________if weap != OBJ_HANDLE_NULL:
________________________________if (weap.obj_get_int(obj_f_material) != mat_wood):
________________________________________return 1
________return

Obviously the point of this is to check if you have your weapons sheathed. So we see firstly it only deals with folks in the party (not mercenaries, who can't be unequipped). Secondly it checks if the party member is a PC or an NPC follower, and if it is an NPC it just ignores it (I forget why, but again I had a reason). If it is a PC, it checks if the PC has something equipped at their primary weapon slot: slot 3, as detailed by Darmagon in the Well Whaddya Know? thread:

Item slot as per item_worn_at

0-hat/eyeglasses
1 necklace
2 gloves
3 primary weapon
4 secondary weapon / big shield
5 armor
6 primary ring
7 secondary ring
8 boots
9 ammo
10 cloak
11 2nd shield spot/ buckler spot
12 robe
13 bracers
14 bard's instrument
15 thieves tools


If there is something there in the slot (ie it does NOT return a null finding - gotta love those double negatives) then it checks if it is made of wood. If not, (finally) it returns a 1, so our initial query from the guard:

if sheathed(attachee, obj)

having returned a 1, goes ahead and fires: otherwise it doesn't. (The 'wood' thing, btw: most wooden weapons - crossbows, heavy flails, spears, staves, longbows etc - cannot be 'sheathed' in the convetional sense, so are exempt. I thought it was a distinction worth making).

Now, what happens if the guard finds you have got something equipped? Other than the dialogue, an unequip script will run (since asking the player to go around and do it manually is pretty ordinary). That is also in the guards script, and calling it looks like this:

{755}{Make sure it does not happen again.}{Make sure it does not happen again.}{}{}{}{unequip( 3, pc); unequip( 4, pc)}

The script being called looks like this (again it is a Darmagon):

def unequip( slot, npc):
________for npc in game.party:
________________item = npc.item_worn_at(slot)
________________if item != OBJ_HANDLE_NULL:
________________________if (item.obj_get_int(obj_f_material) != mat_wood):
________________________________holder = game.obj_create(1004, npc.location)
________________________________holder.item_get(item)
________________________________npc.item_get(item)
________________________________holder.destroy()
________return

This little script unequips the party members by creating a spare container ('holder'), moving the weapon in the slot over to the container, moving it back to the party member (where-in it will simply reappear in their inventory and not be equipped) then the holder is destroyed. Funky.

Note that by calling this twice for slot 3 then slot 4, it unequips both the primary and secondary slots. Also note that that it doesn't distinguish between NPCs and PCs - it unequips everyone in the party for thoroughness. So your NPCs are set up to behave like everyone else, but if they re-equip through some heartbeat moment (if they are kicked out then rejoined for soem internal reason, or some such thing) the party are not penalised by having this show up as a weapon-bearing moment to the guards.

That'll do for now :-)

Saturday, October 13, 2007

Kecik! 41

Image Hosted by ImageShack.us

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Friday, October 12, 2007

Kecik! 40

Image Hosted by ImageShack.us

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Wednesday, October 10, 2007

Kecik! 39

Image Hosted by ImageShack.us

This is the first comic using an outside panel. Its not the first comic using an outside pic (that was the one with wings).

For anyone who missed my rant about iPrimus' crappy service, please scroll down.

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Kecik! 38

Image Hosted by ImageShack.us

Based on a true story. Note how I have put my lines in italics to distinguish them from Kecik's lines - I am going to do that consistently in future.

In other news - this was late, and the patch was late, because of bloody iPrimus. Useless pricks that they are. We regularly - frequently, daily, constantly - have to reboot the PC, or the modem, or both, to get our ADSL working, and some days you just give up before the process works. Last night was one of those days (if you'll forgive that mangled turn of phrase). I spent over an hour trying to get onlinew to post both this and the patch, and then gave up. Another half-hour wasted this morning before I finally got online.

If you are in Australis, DON'T USE iPRIMUS! DON'T DO IT! Bad connections are just the tip of the iceberg of the problems we have had with these jokers, their service is crap, DON'T USE THEM!

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Saturday, October 06, 2007

Kecik! 37

Image Hosted by ImageShack.us

'Ke ke ke' is the Korean equivalent of 'ha ha ha'. Or so a nice young Korean lass I used to chat to told me.

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Thursday, October 04, 2007

Kecik! 36

Image Hosted by ImageShack.us

She had two jabs, and it nearly broke my heart. But my grandfather lost 4 brothers to polio - nuff said. She was fine by the time we got out of the surgery, but has done a lot of screaming since.

On an unrelated topic, I am working nights atm, and with a screaming baby at home (not to mention running around to doctors appointments and such), I have not really slept the last couple days. So if some of my posts on Co8 get a little funky, thats probably why.

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Wednesday, October 03, 2007

Kecik! 35

Image Hosted by ImageShack.us

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Monday, October 01, 2007

Kecik! 34

Image Hosted by ImageShack.us

Yeah, I know - jokes about the 4th wall are even lower than puns. But I got a few better ones coming up :-)

FIRST _ _ _ PREVIOUS _ _ _ NEXT

Comic Late

Well, serves me right for boasting about how my daily comic was up to date. I no sooner did this (at the OotS forum) than I spilt beer all over my keyboard and broke the damn thing: none of the bottom row work any more, plus some others, so I can't write KECIK! because I have no 'c' (can't even write "I spilt my beer" because 's' and 'l' were among the others what got broke. 'M' survived somehow).

I DID get a new keyboard from my folks house, so I will give that a go when I get home tonight. (This is being written from work).

Unrelated personal comment: I got screwed at work today. Its a public holiday, so we get double time, or double time and a half, or something, and I was meant to be doing a 12 hour shift (since the guys don't go to their placements on a holiday and there has to be extra staff hanging around the house). Well, I was meant to work from 10 to 10. But the woman who was doing the overnight shift got herself swapped onto the morning shift (8-4) so she could get the penalty rates, then when one of the guys went home with his dad, she rings me up to tell me not to come in til after her shift at 4, since there were several staff and only 2 clients. So I miss out on 6 hours work, which at double time is around $200, because she scammed her shifts around. I mean I don't mind people getting in early when there are hi-paying shifts on offer, but the boss had already booked me for this when she was still trying to get someone to cover her overnight shift - you shouldn't ditch your regular shifts just to pick up others that happen to pay more. Damn annoying.

I'll get her though - she is on overnight tomorrow, so I will wash everything in the house and leave her 8 hours of ironing to do :-P