#nuvie@irc.freenode.net logs for 31 Jul 2006 (GMT)

Archive Today Yesterday Tomorrow
Nuvie homepage

[00:03:23] --> Kirben has joined #nuvie
[00:07:03] <SB-X> hi Kirben
[00:07:28] <Kirben> Hi
[00:08:17] <SB-X> luteijn: the fix to update combat icon and solo mode prompt correctly is in cvs now
[00:10:18] <luteijn> Let me see if it compiles..
[00:12:27] <luteijn> seems to work.
[00:14:17] <Kirben> Nuvie CVS no longer compiles:
[00:14:18] <Kirben> Event.cpp: In member function `bool Event::handleSDL_KEYDOWN(const SDL_Event*)':
[00:14:18] <Kirben> Event.cpp:180: error: 'class Screen' has no member named 'toggleFullScreen'
[00:14:18] <Kirben> make: *** [Event.o] Error 1
[00:17:21] <SB-X> oops
[00:17:29] <SB-X> just comment that line out in Event.cpp
[00:17:45] <SB-X> that's in my local copy only
[00:24:43] <luteijn> still some rendering issue when e.g. big gargoyle stands next to Monolith.
[00:26:19] <luteijn> also 'Talk-Lord British Not in solo mode. Lord British You see the noble ruler of Britannia. "Good evening, Valkadesh...
[00:30:47] <SB-X> uh
[00:31:21] <SB-X> your name is valkadesh?
[00:33:12] <luteijn> no I party_all_the_timed him
[00:33:23] <SB-X> heh
[00:33:24] <SB-X> i see
[00:33:31] <SB-X> fixed
[00:34:28] <luteijn> looks like you expected it to fall through to the return false at the end.
[00:35:52] <luteijn> Valkadesh can't walk on water or fly to the altar of singularity. Pity. ;)
[00:36:09] <SB-X> yeah i changed the following if to else if
[00:36:32] <SB-X> hehe, i wonder if that should be fixed
[00:41:05] <luteijn> should sleeping gargoyles be styled 'a dead gargoyle', or is that a feature from the original?
[00:43:22] <SB-X> i hope it's not in the original
[00:48:44] <SB-X> Naxatilor has 50/30 health
[00:49:10] <luteijn> yes all winged gargoyles seem to be 50 HP /level
[00:49:25] <SB-X> he's level 1
[00:49:27] <luteijn> lord B has 255 HP instead of 240
[00:49:56] <luteijn> he's level 8, with 9999 xp, so shows 255/240 HP
[00:50:32] <luteijn> LB also has no magic.. I wonder how he's healing me all the time.
[00:53:47] <SB-X> a guard is sitting in LB's throne
[00:55:00] <luteijn> gargish language knowledge doesn't seem to save/restore properly
[00:57:02] <SB-X> oh right, you've got to save that stuff...
[00:57:41] <SB-X> fixed
[00:57:58] <SB-X> thanks for reminding me, i forgot to save those values in Player
[01:00:01] <luteijn> hmm I dropped the amulet of submission and now I can't get it anymore..
[01:00:43] <SB-X> how did you drop it?
[01:01:07] <luteijn> well it gets put in your inventory, but not around your neck when Drax gives it to you..
[01:01:14] <SB-X> i just discovered that draxinusom doesn't actually put it on you
[01:01:15] <SB-X> right
[01:01:28] <luteijn> luckily you can get another copy.
[01:02:08] <SB-X> in the original you cant drop it even if it's not readied
[01:02:54] <luteijn> I was going to give it to Lord B to wear.. Actually he was donig the talking in the first place, so not nice that I got the amulet...
[01:03:59] <SB-X> sounds like the only interesting characters your party is missing now are papa cyclops and quenton the ghost
[01:05:10] <luteijn> what about the altar of singularity or exodus?
[01:05:34] <SB-X> they aren't supposed to move
[01:05:36] <luteijn> hmm you can't solo mode to partymembers>8
[01:06:16] <luteijn> Sinjen wasn't suppose to move either, so probably joining those immobile guys will just give weird graphics..
[01:06:30] <SB-X> they won't have any graphics because they are hidden
[01:06:37] <SB-X> im not even sure they are supposed to be real actors
[01:07:43] <SB-X> there is no indication in u6 that it has hidden actors, and the shrines have funny data in their schedules
[01:08:21] <SB-X> schedules with locations not pointing to places they should ever go to
[01:08:35] <SB-X> not to mention that they aren't supposed to follow schedules in the first place
[01:08:51] <SB-X> it's more likely that you talk to the object
[01:11:38] <luteijn> hmm trying to talk to minax, but it just say 'Talk-nothing!'
[01:12:20] <SB-X> it's probably off wandering around somewhere
[01:12:54] <luteijn> bleh.
[01:13:18] <SB-X> i prevent them from moving but they still get initial position data from objlist
[01:20:41] <SB-X> got to go for a while
[01:20:41] <SB-X> cya
[01:20:43] --- SB-X is now known as sbx|afk
[07:28:09] --- sbx|afk is now known as SB-X
[08:32:13] --> Yuv422 has joined #nuvie
[09:53:16] <SB-X> yo
[09:53:20] <SB-X> Yuv422
[11:03:10] <Yuv422> hey SB-X
[11:03:26] <SB-X> hey
[11:03:34] <Yuv422> How's it going?
[11:05:00] <SB-X> oh it's going fine, what are you up to?
[11:10:09] <Yuv422> I'm just looking into my gdb issue
[11:10:40] <SB-X> ah that
[11:10:43] <SB-X> i see
[11:10:50] <SB-X> did you try using *?
[11:11:14] <-- Yuv422 has left IRC ()
[11:11:23] --> Yuv422 has joined #nuvie
[11:11:44] <Yuv422> Argh! IRC
[11:12:16] <SB-X> wb dubmzk
[11:12:32] <Yuv422> yeah it is already a pointer
[11:13:57] <Yuv422> it might be scoping
[11:19:24] <Yuv422> (gdb) p this
[11:19:24] <Yuv422> $5 = (U6Actor * const) 0x16a127e0
[11:19:24] <Yuv422> (gdb) p *this
[11:19:25] <Yuv422> $6 = {
[11:19:25] <Yuv422> <> = {<No data fields>},
[11:19:25] <Yuv422> members of U6Actor:
[11:19:27] <Yuv422> actor_type = 0x177cca0,
[11:19:29] <Yuv422> base_actor_type = 0x177cca0,
[11:19:31] <Yuv422> beg_mode = 0 '\0',
[11:19:33] <Yuv422> walk_frame_inc = -1 '\377',
[11:19:35] <Yuv422> poison_counter = 0 '\0',
[11:19:37] <Yuv422> foe = 0x0,
[11:19:39] <Yuv422> attacker = 0x0
[11:19:41] <Yuv422> }
[11:19:43] <Yuv422> (gdb)
[11:23:34] <-- servus has left IRC (Read error: 110 (Connection timed out))
[11:24:40] --> servus has joined #nuvie
[11:49:00] <Yuv422> Is that turns left?
[11:49:06] <SB-X> yep
[11:49:27] <SB-X> i know you couldn't see that in U6 but it might add a more strategic element to planning battles
[11:49:46] <Yuv422> :)
[11:50:00] <SB-X> not turns left but move order this turn
[11:50:07] <SB-X> moves left
[11:50:21] <Yuv422> how about damage inflicted above the actors head
[11:50:23] <SB-X> if turns left this minute, whatever
[11:50:30] <SB-X> yeah that would be cool too
[11:50:45] <SB-X> it should just be a 4 segmented bar however, not a continuous bar like in U6O
[11:51:16] <Yuv422> I'm not familiar with u6o :(
[11:51:20] <SB-X> because in U6 you only know the health of a target rounded to the nearest 25%
[11:51:32] <Yuv422> ah k
[11:51:32] <SB-X> oh well u6o has the damage inflicted above the actors head
[11:52:10] <SB-X> i don't want to list actual damage inflicted though, since u6 hides that
[11:52:39] <SB-X> just the estimate
[11:54:41] <Yuv422> I cast a red moongate two tiles fromthe avatar on the right
[11:54:48] <Yuv422> then I press the right arrow
[11:54:55] <Yuv422> and he jumps straight in.
[11:55:33] <Yuv422> Yay!
[11:55:45] <Yuv422> I've got my parent variables back!
[11:56:32] <Yuv422> Actor
[12:03:05] <Yuv422> I've found the sitting bug
[12:05:27] <Yuv422> oh the moongate thing is because the moongate is double width
[12:08:23] <-- Yuv422 has left IRC (Read error: 110 (Connection timed out))
[12:09:53] --> Yuv422 has joined #nuvie
[12:16:09] <SB-X> how did you get your parent variables?
[12:16:45] <Yuv422> full symbols, dwarf debugging mode, no optimisation
[12:16:56] <SB-X> oic
[12:16:57] <Yuv422> one or many of the following options helped
[12:17:02] <Yuv422> :-)
[12:17:09] <SB-X> that's great
[12:17:19] <Yuv422> we were changing the frame_n twice
[12:17:37] <SB-X> where?
[12:17:44] <Yuv422> I've reordered some code so that won't happen when changing from sleep
[12:17:53] <SB-X> ok
[12:18:31] <Yuv422> void U6Actor::set_worktype(uint8 new_worktype)
[12:18:50] <SB-X> oh!
[12:18:52] <Yuv422> moved the sleep/lute if above the set_actor_obj_n() call
[12:20:04] <SB-X> hmm, is morph() redundant with set_actor_obj_n?
[12:20:22] <SB-X> (one is in Actor the other in U6Actor)
[12:21:01] <SB-X> added morph() because i didnt see set_actor_obj_n() (and it's only in U6Actor)
[12:21:36] * Yuv422 looks
[12:22:58] <Yuv422> maybe we could make set_actor_obj_n an Actor method
[12:23:06] <Yuv422> the override it in U6Actor
[12:23:14] <Yuv422> to set the actor_type
[12:24:16] <SB-X> but init_from_obj seems to do a bit more than set_actor_obj_n
[12:24:38] <SB-X> otoh that's for using a real object
[12:24:46] <SB-X> and calling init() again
[12:24:53] <SB-X> when all you really need is the obj_n
[12:25:18] <SB-X> it will be fun testing the Slime spell
[12:25:23] <Yuv422> I guess morph needs to do more than just change the actor obj data
[12:25:29] <Yuv422> it would need to init too
[12:25:37] <SB-X> i'm not sure
[12:25:41] <Yuv422> if morphing into a multi-tile actor
[12:25:56] <SB-X> oh, yes possibly
[12:26:12] <SB-X> although in the game the only thing that can get morphed is slime
[12:26:19] <SB-X> i don't know how that works
[12:26:50] <Yuv422> yeah I'm looking forward to working out how the slime actor type works
[12:26:58] <SB-X> are all the connected slimes different actors or one with multiple objects?
[12:27:08] <SB-X> yes that's why it will be fun testing the Slime spell :)
[12:27:35] <Yuv422> hmm
[12:27:43] * Yuv422 looks at some slime in the original
[12:27:51] <SB-X> is there a function to get the base obj position of a multi-tile obj? then I could fix the moongates
[12:28:17] <Yuv422> I don't think there is
[12:28:25] <Yuv422> wait there probably would be
[12:28:38] <SB-X> there something like that for objects or actors
[12:29:30] <Yuv422> I think look handles mult-tile objects iteself
[12:34:01] <luteijn> if you look at the 'wrong' part of e.g. a sleeping gargoyle, you just see through them...
[12:34:37] <SB-X> and if you look at the 'right' part it says a dead body :)
[12:34:42] <Yuv422> all actions are like that I believe.
[12:35:23] <Yuv422> every slime tile is a separate actor
[12:35:29] <SB-X> interesting
[12:35:52] <Yuv422> that would be quite limiting in the old u6 with only 256 actor slots
[12:36:04] <Yuv422> in a busy dungeon
[12:36:17] <SB-X> we remove temp actors too far away
[12:36:21] <SB-X> sometimes
[12:36:50] <SB-X> and i think last time I checked it was removing old actors after spawning new ones when changing levels
[12:36:57] <Yuv422> but the slime seem to coordinate themselves
[12:37:01] <SB-X> yeah
[12:37:04] <SB-X> creepy
[12:37:31] <Yuv422> I wonder if it changes frame_n based on tile flags
[12:37:38] <Yuv422> like wall reshaping
[12:38:17] <SB-X> I see how look is handling multi-objects... it's only because obj_manager returns objects at positions besides their base position. So all you have to do to get the base position is check the object's coordinates.
[12:40:15] <Yuv422> nope
[12:40:20] <SB-X> slime doesn't have any tileflags
[12:40:25] <SB-X> except blocking
[12:40:27] <Yuv422> all slime has the same tileflag data. :-(
[12:40:53] <SB-X> youll just have to check by tilenum
[12:40:54] <luteijn> maybe the slime have simple rules that look at their neighbours, making it look like one entity (like a shoal of fish)?
[12:41:07] <Yuv422> yeah I just noticed. :(
[12:41:11] <SB-X> at least it will be done in u6actor
[12:41:29] <SB-X> well, the whole entity doesn't move at once
[12:41:38] <SB-X> when one slime moves it expands the group
[12:41:42] <SB-X> does it create a new actor?
[12:42:09] <SB-X> moves/replicates... it doesn't really move
[12:42:32] <Yuv422> maybe edge slimes can generate a new slime actor at random
[12:43:06] <SB-X> "Slime divides!"
[12:45:03] <luteijn> slime divides happens when you hit them, but don't they happily wobble along if you don't hit them?
[12:45:17] <SB-X> yeah
[12:45:22] <SB-X> they do
[12:46:28] <luteijn> although there might be some sort of 'game-of-life' like thingy to fill in empty cells in their matrix... Time to play the original a bit more and unlearn anything I might have picked up from U6O's workings..
[12:52:14] <luteijn> the peereffect gives funky results close to e.g. the north-west corner of the map, and crashes nuvie when you're e.g. at 0,0,0. I added something to %(z?256:1024) os it doesn't crash at the edges anymore, but it still gets the strange effects... :(
[12:52:31] <SB-X> i noticed
[12:54:11] <SB-X> ActorManager doesn't wrap yet, but Map does so Map::get_tile() should be working
[12:54:40] * SB-X looks at it.
[12:55:49] <SB-X> (Map::get_tile() and ActorManager::get_actor() are the only functions that PeerEffect uses to get world data)
[12:58:09] <luteijn> I did my % thingy in Effect.cpp:1198 uint8 tile_type = mapbuffer[((wy-area.y)%(player_loc.z?256:1204))*48 + ((wx-area.x)%(player_loc.z?256:1204))];
[12:58:09] <SB-X> oh, I create a new map buffer in PeerEffect that doesn't have wrapping
[12:58:15] <SB-X> yeah :)
[12:59:20] <-- Yuv422 has left IRC (Read error: 110 (Connection timed out))
[12:59:30] <luteijn> it somewhat works, but maybe some things go wrong becuase of signed and unsigned math. e.g. -1 % 10 is still -1.
[13:00:23] --> Yuv422 has joined #nuvie
[13:00:27] <SB-X> wb
[13:00:57] <Yuv422> ty
[13:01:07] * Yuv422 longs for a stable irc connection
[13:01:51] <luteijn> alt-213 at 7322160170735 works fine, then I go one step west, to 7322170170735, and it's messed up: there is some wrapping but also some corruption in the first few lines, and also the centring is wrong.
[13:02:59] <luteijn> it's like I've moved quite far into the sea. presumably because 18-18 is 0 and 17-18=-1 is going wrong somewhere.
[13:04:03] <SB-X> it was working at one point
[13:04:39] <SB-X> i remember using alt-213 in a dungeon and seeing the other side of the map (before leaving out unpassable areas)
[13:05:09] <SB-X> if you replace fill_buffer() with an x/y loop over the displayed area, it might work
[13:06:04] <luteijn> you mean fill_buffer is probably filling wrongly already...
[13:07:16] <SB-X> yes
[13:07:23] <SB-X> since it worked before adding that
[13:08:01] <-- Yuv422 has left #nuvie ()
[13:08:19] --> Yuv422 has joined #nuvie
[13:08:40] * Yuv422 tries the us freenode server
[13:13:09] <SB-X> ObjManager::is_passable() is crashing with obj coords 1006,1023,0
[13:13:18] <luteijn> hmm fill_buffer is full of arithmetic done on coordinates, I guess it would all have to be 'wrapped'.
[13:13:43] <SB-X> even without fill_buffer it's crashing
[13:14:45] <SB-X> the only arithmetic there is getting the map buffer pointer, and in comparisons checking that you've hit the border or not
[13:15:10] <SB-X> those should be fine
[13:15:38] <SB-X> (it wont do x-1 unless x>0)
[13:16:28] <SB-X> oh I see what objmanager is doing
[13:16:56] <luteijn> but I think the wx, wy calculation at the start is suspect..
[13:17:18] <SB-X> ObjManager:516: for(i=x;i<=x+1;i++)
[13:17:18] <SB-X> {
[13:17:18] <SB-X> for(j=y;j<=y+1;j++) { ... } }
[13:17:31] <SB-X> that assumes x and y aren't already at the map edge
[13:21:34] <SB-X> what's wrong with the wx wy?
[13:21:55] <SB-X> the datatype should wrap any arithmetic
[13:22:15] <SB-X> that's what I'm depending on before passing them to map
[13:22:31] <-- servus has left IRC (Read error: 110 (Connection timed out))
[13:22:53] --> servus has joined #nuvie
[13:24:39] <luteijn> 1213 uint16 wx = area.x+x, wy = area.y+y;
[13:24:39] <luteijn> (gdb) print area.x
[13:24:39] <luteijn> $4 = 65534
[13:24:39] <luteijn> (gdb) print x
[13:24:39] <luteijn> $5 = 65304
[13:26:20] <SB-X> when can pass that to Map it will wrap
[13:27:18] <SB-X> x/PEER_TILEW
[13:27:24] <SB-X> x/4
[13:28:02] <-- Yuv422 has left IRC ()
[13:28:20] --> Yuv422 has joined #nuvie
[13:28:21] <SB-X> (65534+16326)%65535
[13:28:32] <SB-X> 16325
[13:28:40] <SB-X> 16325%1024 = 965
[13:29:01] <Yuv422> is mod expensive?
[13:29:01] <SB-X> er %65536 :)
[13:29:13] <SB-X> relative to the other arithmetic yes
[13:29:16] <SB-X> but not really
[13:29:26] <SB-X> that's all I know about it
[13:29:41] <SB-X> it was when U6 originally came out :)
[13:29:43] <luteijn> actually the wrapper doesn't use mod. and probably we should just mask the relevant bits instead.
[13:30:06] <SB-X> but isn't the result the same?
[13:31:14] <luteijn> the result is the same, but probably all the ifs, retrieving of variables etc is just as expensive as mod; esp since the mod is using a power of two, which might be optimized..
[13:32:04] <SB-X> heh
[13:32:26] <SB-X> i dont know, if you think a bitmask works better then change it
[13:32:29] <SB-X> or tell me what to change it to
[13:34:35] <luteijn> hmm getting some weird results when stepping through wrap coords, it seems to have been called with the refrences to wx and wy being the same one.. double checking..
[13:34:49] <SB-X> ok I fixed the wrapping in the peereffect
[13:35:11] <SB-X> tell me if you see another problem there :)
[13:36:18] <SB-X> oops, trying to enter decimal coords in alt-214
[13:37:37] <luteijn> (refreshing my copy)
[13:38:04] <SB-X> sorry havnt uploaded it yet
[13:38:08] <SB-X> updated cvs yet*
[13:38:16] <SB-X> i can't teleport to 3f8,3f8
[13:38:53] <SB-X> something in MapWindow::boundaryFill
[13:39:28] <SB-X> i can teleport to 100,100,1 without a crash
[13:39:44] <SB-X> so I'm not going to worry about it for now
[13:45:19] <SB-X> i think peereffect should take coordinates of the top-left corner, not the center
[13:46:14] <luteijn> won't you get into trouble blacking out the wrong side of the wall?
[13:46:50] <SB-X> i dont see why
[13:47:20] <SB-X> it starts in the center anyway
[13:47:46] <SB-X> ...and I was mistaken, it already takes top-left corner. I think it should take the center coordinates.
[13:48:00] <SB-X> not really important
[13:48:14] <luteijn> Oh, you'd still calculate that. maybe peer shouldn't use 'unpassable' to do the blacking, but just show everything, then black-out those parts that the normal engine would too?
[13:49:11] <SB-X> i did that first but it was an extra step
[13:49:22] <SB-X> this way is one pass and then the actors are drawn
[13:49:49] <SB-X> it is blacking out the parts the normal engine would :), it should show more than that
[13:50:04] <SB-X> it needs to look through windows
[13:50:30] <-- Yuv422 has left IRC (Read error: 110 (Connection timed out))
[13:50:31] <SB-X> and there should be a 1x1 edge around the buffer that is considered passable
[13:52:16] <luteijn> the original seems to only consider 'walls' as non passable for the peer.. (Based on some preliminary tests..)
[13:52:37] <SB-X> what about the walls of gargoyle pyramids?
[13:52:38] --> Yuv422 has joined #nuvie
[13:52:58] <SB-X> we currently use any boundary
[13:54:54] <luteijn> pyramid/house walls are shown as gray, just like trees etc. there's no gargoyle houses that use blacking/doors etc.
[13:55:23] <SB-X> what if you spam a wall and drop it in the doorway
[13:56:38] <luteijn> finding a suitable spot..
[13:58:16] <SB-X> some pyramids have windows, not sure if they are considered windows
[14:00:04] <luteijn> hmm there's also solid pyramids and they show just like mountains would; compare peer at 60,60,5 in nuvie with original for instance. My wall experiment failed. gargs killed iolo and the walls I spammed were actually fireplaces (I was lazy..) I'll retry it.
[14:04:02] <luteijn> don't see how to spam real walls. alt213 seems to look through houses that have no windows, just closed, solid doors. E.g the mint.
[14:06:03] <SB-X> hehe, that's ok, since the solid pyramid wasn't blacked out
[14:06:18] <SB-X> doors don't count
[14:07:26] <luteijn> compare 14b 186 0 (southeast corner of moat of castle british.
[14:08:18] <luteijn> nuvie has the castle blacked out in peer, and the hous just in the SE part of the peer-map. U6 blacks out nothing.
[14:08:35] <SB-X> that's because it's not looking through the window
[14:08:45] <SB-X> or the arrow slit in this case
[14:11:31] <-- Yuv422 has left IRC (Read error: 110 (Connection timed out))
[14:13:02] <luteijn> 50,50,4 is another nice comparison, nuvie actually shows more (SW corner) than U6
[14:13:09] --> Yuv422 has joined #nuvie
[14:15:21] <SB-X> it looks the same to me, although my peereffect has been changed
[14:16:44] <SB-X> and in nuvie the sea serpent didn't hatch
[14:17:20] <luteijn> another nit: the location string is using uppercase for the hex digits in u6, lowercase in nuvie
[14:18:37] <SB-X> s/x/X/
[14:19:23] <luteijn> while pausing in 'peer' mode, click on the message scroll 'enters' the words you select. (esp nice to click on the gargish letters)
[14:19:42] <SB-X> what happens with the gargish letters
[14:20:27] <SB-X> im going to remove that feature once we have a seperate keyword box
[14:20:36] <SB-X> the keyword box will take over that feature
[14:20:37] <luteijn> translated to english letters (so you get 'gotu eks uai zi')
[14:20:45] <SB-X> oh, cool
[14:20:54] <SB-X> i found the alt-213 string in gamestrings.txt btw
[14:20:59] <SB-X> %02d%02d%02d%03x%03x%1x
[14:22:19] <luteijn> ah right near 'not while aboard ship'
[14:22:35] <SB-X> :)
[14:22:46] <SB-X> brb
[14:32:30] <Yuv422> I've committed my sitting bug fix
[14:32:41] <Yuv422> time for bed
[14:32:45] <Yuv422> cya
[14:33:47] <-- Yuv422 has left IRC ()
[14:35:32] --> laxdragon has joined #nuvie
[14:39:01] <SB-X> im back
[14:39:02] <SB-X> hi laxdragon
[14:39:32] <laxdragon> heya SB-X
[15:12:55] <-- Kirben has left IRC (Read error: 110 (Connection timed out))
[15:29:23] <SB-X> skara brea has a mountain on it
[17:58:08] <SB-X> there's another crash when entering ships... will take a look at it later :p
[19:08:53] <servus> There's a crash when Torwin gets executed.
[21:48:20] <-- laxdragon has left IRC (Read error: 113 (No route to host))
[21:48:46] --> laxdragon has joined #nuvie
[23:16:53] --> Kirben has joined #nuvie
[23:19:40] <luteijn> name = party->get_actor_name(party->get_member_num(uint8(0)));
[23:21:02] <luteijn> but get_member_num wants an *actor, so probably meant get_actor_name(0);