Prev: 36275 Up: Map Next: 36472
36327: Assign a slot in room C to character B
Used by the routines at 26906, 30540, 33312 and 55233.
Input
B Index of a character
C Room number
Output
A Number of slot assigned (4 if room is full)
B y-coordinate (characters) of slot
C x-coordinate (characters) of slot
36327 LD A,C Load room number into A
36328 LD HL,25440 Point HL at start of table of current characters' locations (i.e. Gimbal, Thor etc.)
36331 LD DE,25307 Point DE at table of characters' slots in their current rooms
36334 LD IX,36472 Point IX at 36472 list of occupied slots...
36338 LD (IX+0),0 ...and set three bytes there to zeroes...
36342 LD (IX+1),0 ...
36346 LD (IX+2),0 ...
36350 PUSH BC Store BC
36351 LD B,8 Load B with 8
36353 CP (HL) Compare a character's current screen number with room number passed to this routine (in A)...
36354 JR NZ,36364 ...and if they're not the same then skip ahead to 36364 (move onto next character, if applicable)
36356 EX AF,AF' Swap registers
36357 LD A,(DE) Load character's slot (i.e. order of arrival in the room) into A
36358 LD (IX+0),A Copy slot into table at 36472
36361 INC IX Advance IX to next entry in this table
36363 EX AF,AF' Exchange registers
36364 INC HL Advance HL by three bytes (i.e. skip over x- and y-coordinates to get to screen number of next character)...
36365 INC HL ...
36366 INC HL ...
36367 INC DE Advance DE by one byte to get slot of next character
36368 DJNZ 36353 Loop back if previous character was not the last
36370 POP BC Restore BC
36371 LD IX,36472 Point IX at list of occupied slots
36375 LD A,1 If one of the characters in room C has a slot of 1...
36377 CP (IX+0) ...then jump ahead to 36394...
36380 JR Z,36394 ...
36382 CP (IX+1) ...
36385 JR Z,36394 ...
36387 CP (IX+2) ...
36390 JR Z,36394 ...
36392 JR 36435 ...else jump to 36435
36394 LD A,2 If one of the characters in room C has a slot of 2...
36396 CP (IX+0) ...then jump ahead to 36413...
36399 JR Z,36413 ...
36401 CP (IX+1) ...
36404 JR Z,36413 ...
36406 CP (IX+2) ...
36409 JR Z,36413 ...
36411 JR 36435 ...else jump to 36435
36413 LD A,3 If one of the characters in room C has a slot of 3...
36415 CP (IX+0) ...then jump ahead to 36432...
36418 JR Z,36432 ...
36420 CP (IX+1) ...
36423 JR Z,36432 ...
36425 CP (IX+2) ...
36428 JR Z,36432 ...
36430 JR 36435 ...else jump to 36435
36432 LD A,4 Return with A=4...
36434 RET ...
36435 LD E,A Load highest slot among characters plus one in room into E
36436 PUSH DE Store DE (E=lowest empty slot)
36437 PUSH BC Store BC (B=character index, C=room number)
36438 DEC A Decrease A to get index of lowest empty slot...
36439 ADD A,A ...double it...
36440 LD E,A ...and load into DE...
36441 LD D,0 ...
36443 LD B,0 Set B to zero
36445 PUSH BC Copy BC into HL...
36446 POP HL ...so that HL contains room number passed to this routine initially
36447 ADD HL,HL Double room number...
36448 ADD HL,BC ...add room number again (now three times)...
36449 ADD HL,HL ...and double again to get six times original room number in HL
36450 LD BC,53938 Point BC at table of coordinates of character positions in rooms
36453 ADD HL,BC Add to six times room number into HL
36454 ADD HL,DE Add to this double (slot - 1) from DE
36455 LD C,(HL) Load x- and y-coordinates into BC
36456 INC HL ...
36457 LD B,(HL) ...
36458 EXX Exchange all registers
36459 POP BC Restore BC (B=character index, C=room number)
36460 LD HL,25307 Point HL at table of characters' slots in their current rooms
36463 LD D,0 Load input character index into DE...
36465 LD E,B ...
36466 ADD HL,DE Add as offset to HL
36467 POP DE Restore DE (E=lowest empty slot)
36468 LD (HL),E Set this character's slot to be lowest empty slot in this room
36469 LD A,E Set A to slot number just filled
36470 EXX Exchange all registers
36471 RET Return
Prev: 36275 Up: Map Next: 36472