Wednesday, October 31, 2007
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
Tuesday, October 23, 2007
Monday, October 22, 2007
Sunday, October 21, 2007
Kecik! 45
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! 43
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
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
Friday, October 12, 2007
Wednesday, October 10, 2007
Kecik! 38
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
Thursday, October 04, 2007
Kecik! 36
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
Monday, October 01, 2007
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